From 019167f235f41a0534d88045596ce0f2a439aa79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0brahim=20G=C3=BCng=C3=B6r?= Date: Wed, 29 Apr 2020 11:46:34 +0300 Subject: [PATCH] all: use go modules --- .gitignore | 1 + Gopkg.lock | 138 - Gopkg.toml | 27 - command/chart.go | 208 - command/currency.go | 86 +- go.mod | 19 + go.sum | 26 + vendor/github.com/aaron-lebo/ocd/.gitignore | 1 - vendor/github.com/aaron-lebo/ocd/README.md | 8 - .../aaron-lebo/ocd/feeds/atom/atom_test.go | 26 - vendor/github.com/aaron-lebo/ocd/main.go | 63 - vendor/github.com/beorn7/perks/.gitignore | 2 - vendor/github.com/beorn7/perks/README.md | 31 - .../beorn7/perks/quantile/bench_test.go | 63 - .../beorn7/perks/quantile/example_test.go | 121 - .../beorn7/perks/quantile/stream_test.go | 215 - .../blendlabs/go-exception/.travis.yml | 19 - .../github.com/blendlabs/go-exception/LICENSE | 21 - .../blendlabs/go-exception/README.md | 59 - .../blendlabs/go-exception/exception.go | 213 - .../blendlabs/go-exception/exception_test.go | 171 - .../blendlabs/go-exception/stack.go | 201 - .../blendlabs/go-exception/stack_test.go | 13 - .../github.com/burntsushi/toml/decode_test.go | 1447 ---- .../github.com/burntsushi/toml/encode_test.go | 615 -- vendor/github.com/golang/freetype/AUTHORS | 20 - .../github.com/golang/freetype/CONTRIBUTORS | 38 - vendor/github.com/golang/freetype/LICENSE | 12 - vendor/github.com/golang/freetype/README | 21 - vendor/github.com/golang/freetype/freetype.go | 341 - .../golang/freetype/freetype_test.go | 59 - .../github.com/golang/freetype/raster/geom.go | 245 - .../golang/freetype/raster/paint.go | 287 - .../golang/freetype/raster/raster.go | 601 -- .../golang/freetype/raster/stroke.go | 483 -- .../golang/freetype/truetype/face.go | 507 -- .../golang/freetype/truetype/face_test.go | 48 - .../golang/freetype/truetype/glyph.go | 522 -- .../golang/freetype/truetype/hint.go | 1770 ----- .../golang/freetype/truetype/hint_test.go | 675 -- .../golang/freetype/truetype/opcodes.go | 289 - .../golang/freetype/truetype/truetype.go | 653 -- .../golang/freetype/truetype/truetype_test.go | 400 - vendor/github.com/golang/protobuf/.gitignore | 16 - vendor/github.com/golang/protobuf/.travis.yml | 18 - .../github.com/golang/protobuf/Make.protobuf | 40 - vendor/github.com/golang/protobuf/Makefile | 55 - vendor/github.com/golang/protobuf/README.md | 244 - .../golang/protobuf/proto/all_test.go | 2278 ------ .../golang/protobuf/proto/any_test.go | 300 - .../golang/protobuf/proto/clone_test.go | 300 - .../golang/protobuf/proto/decode_test.go | 258 - .../golang/protobuf/proto/encode_test.go | 85 - .../golang/protobuf/proto/equal_test.go | 224 - .../golang/protobuf/proto/extensions_test.go | 536 -- .../golang/protobuf/proto/map_test.go | 46 - .../golang/protobuf/proto/message_set_test.go | 66 - .../golang/protobuf/proto/proto3_test.go | 135 - .../golang/protobuf/proto/size2_test.go | 63 - .../golang/protobuf/proto/size_test.go | 164 - .../golang/protobuf/proto/text_parser_test.go | 673 -- .../golang/protobuf/proto/text_test.go | 474 -- .../golang_protobuf_extensions/.travis.yml | 2 - .../golang_protobuf_extensions/README.md | 20 - .../pbutil/all_test.go | 177 - .../pbutil/decode_test.go | 99 - .../pbutil/encode_test.go | 67 - .../pbutil/fixtures_test.go | 103 - .../prometheus/client_golang/.gitignore | 26 - .../prometheus/client_golang/.travis.yml | 9 - .../prometheus/client_golang/CHANGELOG.md | 109 - .../prometheus/client_golang/CONTRIBUTING.md | 18 - .../prometheus/client_golang/README.md | 45 - .../prometheus/client_golang/VERSION | 1 - .../prometheus/benchmark_test.go | 183 - .../client_golang/prometheus/counter_test.go | 58 - .../prometheus/example_clustermanager_test.go | 118 - .../client_golang/prometheus/examples_test.go | 751 -- .../prometheus/expvar_collector_test.go | 97 - .../client_golang/prometheus/gauge_test.go | 182 - .../prometheus/go_collector_test.go | 123 - .../prometheus/histogram_test.go | 326 - .../client_golang/prometheus/http_test.go | 121 - .../client_golang/prometheus/metric_test.go | 35 - .../prometheus/process_collector_test.go | 58 - .../prometheus/promhttp/http_test.go | 137 - .../client_golang/prometheus/registry_test.go | 545 -- .../client_golang/prometheus/summary_test.go | 347 - .../client_golang/prometheus/vec_test.go | 312 - .../prometheus/client_model/.gitignore | 1 - .../prometheus/client_model/CONTRIBUTING.md | 18 - .../prometheus/client_model/MAINTAINERS.md | 1 - .../prometheus/client_model/Makefile | 62 - .../prometheus/client_model/README.md | 26 - .../prometheus/client_model/metrics.proto | 81 - .../prometheus/client_model/pom.xml | 130 - .../prometheus/client_model/setup.py | 23 - .../github.com/prometheus/common/.travis.yml | 6 - .../prometheus/common/CONTRIBUTING.md | 18 - .../prometheus/common/MAINTAINERS.md | 1 - vendor/github.com/prometheus/common/README.md | 12 - .../prometheus/common/expfmt/bench_test.go | 167 - .../prometheus/common/expfmt/decode_test.go | 435 -- .../common/expfmt/text_create_test.go | 443 -- .../common/expfmt/text_parse_test.go | 593 -- .../ww/goautoneg/autoneg_test.go | 33 - .../prometheus/common/model/alert_test.go | 118 - .../prometheus/common/model/labels_test.go | 140 - .../prometheus/common/model/metric_test.go | 132 - .../prometheus/common/model/signature_test.go | 314 - .../prometheus/common/model/silence_test.go | 228 - .../prometheus/common/model/time_test.go | 132 - .../prometheus/common/model/value_test.go | 468 -- .../prometheus/procfs/buddyinfo_test.go | 64 - .../github.com/prometheus/procfs/fs_test.go | 39 - .../github.com/prometheus/procfs/ipvs_test.go | 250 - .../prometheus/procfs/mdstat_test.go | 44 - .../prometheus/procfs/mountstats_test.go | 286 - .../prometheus/procfs/net_dev_test.go | 86 - .../prometheus/procfs/nfs/parse_nfs_test.go | 305 - .../prometheus/procfs/nfs/parse_nfsd_test.go | 196 - .../prometheus/procfs/proc_io_test.go | 46 - .../prometheus/procfs/proc_limits_test.go | 44 - .../prometheus/procfs/proc_ns_test.go | 44 - .../prometheus/procfs/proc_stat_test.go | 123 - .../github.com/prometheus/procfs/proc_test.go | 174 - .../github.com/prometheus/procfs/stat_test.go | 74 - vendor/github.com/prometheus/procfs/ttar | 0 .../github.com/prometheus/procfs/xfrm_test.go | 66 - .../prometheus/procfs/xfs/parse_test.go | 442 -- .../github.com/wcharczuk/go-chart/.gitignore | 1 - .../github.com/wcharczuk/go-chart/.travis.yml | 13 - vendor/github.com/wcharczuk/go-chart/LICENSE | 21 - vendor/github.com/wcharczuk/go-chart/Makefile | 9 - .../github.com/wcharczuk/go-chart/README.md | 99 - .../wcharczuk/go-chart/annotation_series.go | 75 - .../go-chart/annotation_series_test.go | 119 - vendor/github.com/wcharczuk/go-chart/axis.go | 42 - .../wcharczuk/go-chart/bar_chart.go | 461 -- .../wcharczuk/go-chart/bar_chart_test.go | 298 - .../go-chart/bollinger_band_series.go | 149 - .../go-chart/bollinger_band_series_test.go | 51 - vendor/github.com/wcharczuk/go-chart/box.go | 330 - .../github.com/wcharczuk/go-chart/box_test.go | 188 - vendor/github.com/wcharczuk/go-chart/chart.go | 502 -- .../wcharczuk/go-chart/chart_test.go | 400 - .../wcharczuk/go-chart/concat_series.go | 32 - .../wcharczuk/go-chart/concat_series_test.go | 41 - .../wcharczuk/go-chart/continuous_range.go | 67 - .../go-chart/continuous_range_test.go | 22 - .../wcharczuk/go-chart/continuous_series.go | 55 - .../go-chart/continuous_series_test.go | 31 - vendor/github.com/wcharczuk/go-chart/date.go | 402 - .../wcharczuk/go-chart/date_test.go | 238 - .../github.com/wcharczuk/go-chart/defaults.go | 214 - vendor/github.com/wcharczuk/go-chart/draw.go | 294 - .../wcharczuk/go-chart/drawing/README.md | 5 - .../wcharczuk/go-chart/drawing/color.go | 95 - .../wcharczuk/go-chart/drawing/color_test.go | 41 - .../wcharczuk/go-chart/drawing/constants.go | 6 - .../wcharczuk/go-chart/drawing/curve.go | 158 - .../wcharczuk/go-chart/drawing/dasher.go | 89 - .../go-chart/drawing/demux_flattener.go | 41 - .../wcharczuk/go-chart/drawing/drawing.go | 148 - .../wcharczuk/go-chart/drawing/flattener.go | 96 - .../go-chart/drawing/free_type_path.go | 30 - .../go-chart/drawing/graphic_context.go | 82 - .../go-chart/drawing/image_filter.go | 13 - .../wcharczuk/go-chart/drawing/line.go | 48 - .../wcharczuk/go-chart/drawing/matrix.go | 220 - .../wcharczuk/go-chart/drawing/painter.go | 31 - .../wcharczuk/go-chart/drawing/path.go | 186 - .../drawing/raster_graphic_context.go | 283 - .../go-chart/drawing/stack_graphic_context.go | 211 - .../wcharczuk/go-chart/drawing/stroker.go | 85 - .../wcharczuk/go-chart/drawing/text.go | 67 - .../wcharczuk/go-chart/drawing/transformer.go | 39 - .../wcharczuk/go-chart/drawing/util.go | 68 - .../wcharczuk/go-chart/ema_series.go | 101 - .../wcharczuk/go-chart/ema_series_test.go | 105 - .../wcharczuk/go-chart/file_util.go | 52 - .../wcharczuk/go-chart/grid_line.go | 72 - .../wcharczuk/go-chart/grid_line_test.go | 24 - .../wcharczuk/go-chart/histogram_series.go | 57 - .../go-chart/histogram_series_test.go | 31 - .../wcharczuk/go-chart/image_writer.go | 42 - .../go-chart/last_value_annotation_series.go | 37 - .../github.com/wcharczuk/go-chart/legend.go | 215 - .../wcharczuk/go-chart/legend_test.go | 31 - .../go-chart/linear_regression_series.go | 132 - .../go-chart/linear_regression_series_test.go | 77 - .../wcharczuk/go-chart/macd_series.go | 289 - .../wcharczuk/go-chart/macd_series_test.go | 88 - .../wcharczuk/go-chart/market_hours_range.go | 181 - .../go-chart/market_hours_range_test.go | 72 - .../wcharczuk/go-chart/math_util.go | 231 - .../wcharczuk/go-chart/math_util_test.go | 184 - .../wcharczuk/go-chart/min_max_series.go | 119 - .../wcharczuk/go-chart/pie_chart.go | 279 - .../wcharczuk/go-chart/pie_chart_test.go | 31 - vendor/github.com/wcharczuk/go-chart/range.go | 41 - .../wcharczuk/go-chart/raster_renderer.go | 228 - .../wcharczuk/go-chart/renderable.go | 4 - .../github.com/wcharczuk/go-chart/renderer.go | 86 - .../wcharczuk/go-chart/renderer_provider.go | 4 - .../wcharczuk/go-chart/ring_buffer.go | 252 - .../wcharczuk/go-chart/ring_buffer_test.go | 162 - .../github.com/wcharczuk/go-chart/roboto.go | 5 - .../github.com/wcharczuk/go-chart/sequence.go | 157 - .../wcharczuk/go-chart/sequence_test.go | 45 - .../github.com/wcharczuk/go-chart/series.go | 9 - .../wcharczuk/go-chart/sma_series.go | 90 - .../wcharczuk/go-chart/sma_series_test.go | 111 - .../wcharczuk/go-chart/stacked_bar_chart.go | 335 - vendor/github.com/wcharczuk/go-chart/style.go | 342 - .../wcharczuk/go-chart/style_test.go | 214 - vendor/github.com/wcharczuk/go-chart/text.go | 164 - .../wcharczuk/go-chart/text_test.go | 60 - vendor/github.com/wcharczuk/go-chart/tick.go | 82 - .../wcharczuk/go-chart/tick_test.go | 12 - .../wcharczuk/go-chart/time_series.go | 61 - .../wcharczuk/go-chart/time_series_test.go | 30 - .../wcharczuk/go-chart/time_util.go | 20 - vendor/github.com/wcharczuk/go-chart/value.go | 46 - .../wcharczuk/go-chart/value_formatter.go | 69 - .../go-chart/value_formatter_provider.go | 6 - .../go-chart/value_formatter_test.go | 58 - .../wcharczuk/go-chart/value_provider.go | 35 - .../wcharczuk/go-chart/value_test.go | 69 - .../wcharczuk/go-chart/vector_renderer.go | 303 - .../go-chart/vector_renderer_test.go | 77 - vendor/github.com/wcharczuk/go-chart/xaxis.go | 197 - .../wcharczuk/go-chart/xaxis_test.go | 67 - vendor/github.com/wcharczuk/go-chart/yaxis.go | 223 - .../wcharczuk/go-chart/yaxis_test.go | 85 - vendor/golang.org/x/image/.gitattributes | 10 - vendor/golang.org/x/image/.gitignore | 2 - vendor/golang.org/x/image/AUTHORS | 3 - vendor/golang.org/x/image/CONTRIBUTING.md | 26 - vendor/golang.org/x/image/CONTRIBUTORS | 3 - vendor/golang.org/x/image/LICENSE | 27 - vendor/golang.org/x/image/PATENTS | 22 - vendor/golang.org/x/image/README.md | 17 - vendor/golang.org/x/image/codereview.cfg | 1 - vendor/golang.org/x/image/draw/draw.go | 43 - .../golang.org/x/image/draw/example_test.go | 118 - vendor/golang.org/x/image/draw/gen.go | 1404 ---- vendor/golang.org/x/image/draw/go1_8.go | 49 - vendor/golang.org/x/image/draw/go1_9.go | 57 - vendor/golang.org/x/image/draw/impl.go | 6670 ----------------- vendor/golang.org/x/image/draw/scale.go | 527 -- vendor/golang.org/x/image/draw/scale_test.go | 742 -- vendor/golang.org/x/image/draw/stdlib_test.go | 96 - vendor/golang.org/x/image/font/font.go | 359 - vendor/golang.org/x/image/font/font_test.go | 65 - vendor/golang.org/x/image/math/f64/f64.go | 37 - vendor/golang.org/x/image/math/fixed/fixed.go | 410 - .../x/image/math/fixed/fixed_test.go | 439 -- vendor/golang.org/x/net/.gitattributes | 10 - vendor/golang.org/x/net/.gitignore | 2 - vendor/golang.org/x/net/CONTRIBUTING.md | 26 - vendor/golang.org/x/net/README.md | 16 - vendor/golang.org/x/net/codereview.cfg | 1 - .../golang.org/x/net/context/context_test.go | 583 -- .../x/net/context/ctxhttp/ctxhttp_17_test.go | 29 - .../net/context/ctxhttp/ctxhttp_pre17_test.go | 79 - .../x/net/context/ctxhttp/ctxhttp_test.go | 105 - .../x/net/context/withtimeout_test.go | 31 - vendor/google.golang.org/api/.gitignore | 12 - vendor/google.golang.org/api/.hgtags | 1 - vendor/google.golang.org/api/.travis.yml | 18 - vendor/google.golang.org/api/CONTRIBUTING.md | 484 -- .../google.golang.org/api/GettingStarted.md | 130 - vendor/google.golang.org/api/NOTES | 13 - vendor/google.golang.org/api/README.md | 108 - vendor/google.golang.org/api/TODO | 2 - vendor/google.golang.org/api/api-list.json | 3119 -------- .../api/gensupport/backoff_test.go | 46 - .../api/gensupport/buffer_test.go | 296 - .../api/gensupport/header_test.go | 28 - .../api/gensupport/json_test.go | 516 -- .../api/gensupport/jsonfloat_test.go | 53 - .../api/gensupport/media_test.go | 407 - .../api/gensupport/resumable_test.go | 281 - .../api/gensupport/retry_test.go | 176 - .../api/gensupport/send_test.go | 20 - .../api/gensupport/util_test.go | 57 - .../api/googleapi/googleapi_test.go | 291 - .../uritemplates/uritemplates_test.go | 280 - .../api/googleapi/types_test.go | 68 - vendor/google.golang.org/api/key.json.enc | Bin 2432 -> 0 bytes vendor/modules.txt | 36 + 292 files changed, 86 insertions(+), 57434 deletions(-) delete mode 100644 Gopkg.lock delete mode 100644 Gopkg.toml delete mode 100644 command/chart.go create mode 100644 go.mod create mode 100644 go.sum delete mode 100644 vendor/github.com/aaron-lebo/ocd/.gitignore delete mode 100644 vendor/github.com/aaron-lebo/ocd/README.md delete mode 100644 vendor/github.com/aaron-lebo/ocd/feeds/atom/atom_test.go delete mode 100644 vendor/github.com/aaron-lebo/ocd/main.go delete mode 100644 vendor/github.com/beorn7/perks/.gitignore delete mode 100644 vendor/github.com/beorn7/perks/README.md delete mode 100644 vendor/github.com/beorn7/perks/quantile/bench_test.go delete mode 100644 vendor/github.com/beorn7/perks/quantile/example_test.go delete mode 100644 vendor/github.com/beorn7/perks/quantile/stream_test.go delete mode 100644 vendor/github.com/blendlabs/go-exception/.travis.yml delete mode 100644 vendor/github.com/blendlabs/go-exception/LICENSE delete mode 100644 vendor/github.com/blendlabs/go-exception/README.md delete mode 100644 vendor/github.com/blendlabs/go-exception/exception.go delete mode 100644 vendor/github.com/blendlabs/go-exception/exception_test.go delete mode 100644 vendor/github.com/blendlabs/go-exception/stack.go delete mode 100644 vendor/github.com/blendlabs/go-exception/stack_test.go delete mode 100644 vendor/github.com/burntsushi/toml/decode_test.go delete mode 100644 vendor/github.com/burntsushi/toml/encode_test.go delete mode 100644 vendor/github.com/golang/freetype/AUTHORS delete mode 100644 vendor/github.com/golang/freetype/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/freetype/LICENSE delete mode 100644 vendor/github.com/golang/freetype/README delete mode 100644 vendor/github.com/golang/freetype/freetype.go delete mode 100644 vendor/github.com/golang/freetype/freetype_test.go delete mode 100644 vendor/github.com/golang/freetype/raster/geom.go delete mode 100644 vendor/github.com/golang/freetype/raster/paint.go delete mode 100644 vendor/github.com/golang/freetype/raster/raster.go delete mode 100644 vendor/github.com/golang/freetype/raster/stroke.go delete mode 100644 vendor/github.com/golang/freetype/truetype/face.go delete mode 100644 vendor/github.com/golang/freetype/truetype/face_test.go delete mode 100644 vendor/github.com/golang/freetype/truetype/glyph.go delete mode 100644 vendor/github.com/golang/freetype/truetype/hint.go delete mode 100644 vendor/github.com/golang/freetype/truetype/hint_test.go delete mode 100644 vendor/github.com/golang/freetype/truetype/opcodes.go delete mode 100644 vendor/github.com/golang/freetype/truetype/truetype.go delete mode 100644 vendor/github.com/golang/freetype/truetype/truetype_test.go delete mode 100644 vendor/github.com/golang/protobuf/.gitignore delete mode 100644 vendor/github.com/golang/protobuf/.travis.yml delete mode 100644 vendor/github.com/golang/protobuf/Make.protobuf delete mode 100644 vendor/github.com/golang/protobuf/Makefile delete mode 100644 vendor/github.com/golang/protobuf/README.md delete mode 100644 vendor/github.com/golang/protobuf/proto/all_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/any_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/clone_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/decode_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/encode_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/equal_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/extensions_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/map_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/message_set_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/proto3_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/size2_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/size_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_parser_test.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_test.go delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/README.md delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/.gitignore delete mode 100644 vendor/github.com/prometheus/client_golang/.travis.yml delete mode 100644 vendor/github.com/prometheus/client_golang/CHANGELOG.md delete mode 100644 vendor/github.com/prometheus/client_golang/CONTRIBUTING.md delete mode 100644 vendor/github.com/prometheus/client_golang/README.md delete mode 100644 vendor/github.com/prometheus/client_golang/VERSION delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/counter_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/examples_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/http_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/metric_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/registry_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/summary_test.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/vec_test.go delete mode 100644 vendor/github.com/prometheus/client_model/.gitignore delete mode 100644 vendor/github.com/prometheus/client_model/CONTRIBUTING.md delete mode 100644 vendor/github.com/prometheus/client_model/MAINTAINERS.md delete mode 100644 vendor/github.com/prometheus/client_model/Makefile delete mode 100644 vendor/github.com/prometheus/client_model/README.md delete mode 100644 vendor/github.com/prometheus/client_model/metrics.proto delete mode 100644 vendor/github.com/prometheus/client_model/pom.xml delete mode 100644 vendor/github.com/prometheus/client_model/setup.py delete mode 100644 vendor/github.com/prometheus/common/.travis.yml delete mode 100644 vendor/github.com/prometheus/common/CONTRIBUTING.md delete mode 100644 vendor/github.com/prometheus/common/MAINTAINERS.md delete mode 100644 vendor/github.com/prometheus/common/README.md delete mode 100644 vendor/github.com/prometheus/common/expfmt/bench_test.go delete mode 100644 vendor/github.com/prometheus/common/expfmt/decode_test.go delete mode 100644 vendor/github.com/prometheus/common/expfmt/text_create_test.go delete mode 100644 vendor/github.com/prometheus/common/expfmt/text_parse_test.go delete mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go delete mode 100644 vendor/github.com/prometheus/common/model/alert_test.go delete mode 100644 vendor/github.com/prometheus/common/model/labels_test.go delete mode 100644 vendor/github.com/prometheus/common/model/metric_test.go delete mode 100644 vendor/github.com/prometheus/common/model/signature_test.go delete mode 100644 vendor/github.com/prometheus/common/model/silence_test.go delete mode 100644 vendor/github.com/prometheus/common/model/time_test.go delete mode 100644 vendor/github.com/prometheus/common/model/value_test.go delete mode 100644 vendor/github.com/prometheus/procfs/buddyinfo_test.go delete mode 100644 vendor/github.com/prometheus/procfs/fs_test.go delete mode 100644 vendor/github.com/prometheus/procfs/ipvs_test.go delete mode 100644 vendor/github.com/prometheus/procfs/mdstat_test.go delete mode 100644 vendor/github.com/prometheus/procfs/mountstats_test.go delete mode 100644 vendor/github.com/prometheus/procfs/net_dev_test.go delete mode 100644 vendor/github.com/prometheus/procfs/nfs/parse_nfs_test.go delete mode 100644 vendor/github.com/prometheus/procfs/nfs/parse_nfsd_test.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_io_test.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_limits_test.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_ns_test.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_stat_test.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_test.go delete mode 100644 vendor/github.com/prometheus/procfs/stat_test.go mode change 100755 => 100644 vendor/github.com/prometheus/procfs/ttar delete mode 100644 vendor/github.com/prometheus/procfs/xfrm_test.go delete mode 100644 vendor/github.com/prometheus/procfs/xfs/parse_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/.gitignore delete mode 100644 vendor/github.com/wcharczuk/go-chart/.travis.yml delete mode 100644 vendor/github.com/wcharczuk/go-chart/LICENSE delete mode 100644 vendor/github.com/wcharczuk/go-chart/Makefile delete mode 100644 vendor/github.com/wcharczuk/go-chart/README.md delete mode 100644 vendor/github.com/wcharczuk/go-chart/annotation_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/annotation_series_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/axis.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/bar_chart.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/bar_chart_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/bollinger_band_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/bollinger_band_series_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/box.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/box_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/chart.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/chart_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/concat_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/concat_series_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/continuous_range.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/continuous_range_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/continuous_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/continuous_series_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/date.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/date_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/defaults.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/draw.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/README.md delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/color.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/color_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/constants.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/curve.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/dasher.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/demux_flattener.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/drawing.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/flattener.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/free_type_path.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/graphic_context.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/image_filter.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/line.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/matrix.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/painter.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/path.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/raster_graphic_context.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/stack_graphic_context.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/stroker.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/text.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/transformer.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/drawing/util.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/ema_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/ema_series_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/file_util.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/grid_line.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/grid_line_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/histogram_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/histogram_series_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/image_writer.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/last_value_annotation_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/legend.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/legend_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/linear_regression_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/linear_regression_series_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/macd_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/macd_series_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/market_hours_range.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/market_hours_range_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/math_util.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/math_util_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/min_max_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/pie_chart.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/pie_chart_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/range.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/raster_renderer.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/renderable.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/renderer.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/renderer_provider.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/ring_buffer.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/ring_buffer_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/roboto.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/sequence.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/sequence_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/sma_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/sma_series_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/stacked_bar_chart.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/style.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/style_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/text.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/text_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/tick.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/tick_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/time_series.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/time_series_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/time_util.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/value.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/value_formatter.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/value_formatter_provider.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/value_formatter_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/value_provider.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/value_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/vector_renderer.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/vector_renderer_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/xaxis.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/xaxis_test.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/yaxis.go delete mode 100644 vendor/github.com/wcharczuk/go-chart/yaxis_test.go delete mode 100644 vendor/golang.org/x/image/.gitattributes delete mode 100644 vendor/golang.org/x/image/.gitignore delete mode 100644 vendor/golang.org/x/image/AUTHORS delete mode 100644 vendor/golang.org/x/image/CONTRIBUTING.md delete mode 100644 vendor/golang.org/x/image/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/image/LICENSE delete mode 100644 vendor/golang.org/x/image/PATENTS delete mode 100644 vendor/golang.org/x/image/README.md delete mode 100644 vendor/golang.org/x/image/codereview.cfg delete mode 100644 vendor/golang.org/x/image/draw/draw.go delete mode 100644 vendor/golang.org/x/image/draw/example_test.go delete mode 100644 vendor/golang.org/x/image/draw/gen.go delete mode 100644 vendor/golang.org/x/image/draw/go1_8.go delete mode 100644 vendor/golang.org/x/image/draw/go1_9.go delete mode 100644 vendor/golang.org/x/image/draw/impl.go delete mode 100644 vendor/golang.org/x/image/draw/scale.go delete mode 100644 vendor/golang.org/x/image/draw/scale_test.go delete mode 100644 vendor/golang.org/x/image/draw/stdlib_test.go delete mode 100644 vendor/golang.org/x/image/font/font.go delete mode 100644 vendor/golang.org/x/image/font/font_test.go delete mode 100644 vendor/golang.org/x/image/math/f64/f64.go delete mode 100644 vendor/golang.org/x/image/math/fixed/fixed.go delete mode 100644 vendor/golang.org/x/image/math/fixed/fixed_test.go delete mode 100644 vendor/golang.org/x/net/.gitattributes delete mode 100644 vendor/golang.org/x/net/.gitignore delete mode 100644 vendor/golang.org/x/net/CONTRIBUTING.md delete mode 100644 vendor/golang.org/x/net/README.md delete mode 100644 vendor/golang.org/x/net/codereview.cfg delete mode 100644 vendor/golang.org/x/net/context/context_test.go delete mode 100644 vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go delete mode 100644 vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go delete mode 100644 vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go delete mode 100644 vendor/golang.org/x/net/context/withtimeout_test.go delete mode 100644 vendor/google.golang.org/api/.gitignore delete mode 100644 vendor/google.golang.org/api/.hgtags delete mode 100644 vendor/google.golang.org/api/.travis.yml delete mode 100644 vendor/google.golang.org/api/CONTRIBUTING.md delete mode 100644 vendor/google.golang.org/api/GettingStarted.md delete mode 100644 vendor/google.golang.org/api/NOTES delete mode 100644 vendor/google.golang.org/api/README.md delete mode 100644 vendor/google.golang.org/api/TODO delete mode 100644 vendor/google.golang.org/api/api-list.json delete mode 100644 vendor/google.golang.org/api/gensupport/backoff_test.go delete mode 100644 vendor/google.golang.org/api/gensupport/buffer_test.go delete mode 100644 vendor/google.golang.org/api/gensupport/header_test.go delete mode 100644 vendor/google.golang.org/api/gensupport/json_test.go delete mode 100644 vendor/google.golang.org/api/gensupport/jsonfloat_test.go delete mode 100644 vendor/google.golang.org/api/gensupport/media_test.go delete mode 100644 vendor/google.golang.org/api/gensupport/resumable_test.go delete mode 100644 vendor/google.golang.org/api/gensupport/retry_test.go delete mode 100644 vendor/google.golang.org/api/gensupport/send_test.go delete mode 100644 vendor/google.golang.org/api/gensupport/util_test.go delete mode 100644 vendor/google.golang.org/api/googleapi/googleapi_test.go delete mode 100644 vendor/google.golang.org/api/googleapi/internal/uritemplates/uritemplates_test.go delete mode 100644 vendor/google.golang.org/api/googleapi/types_test.go delete mode 100644 vendor/google.golang.org/api/key.json.enc create mode 100644 vendor/modules.txt diff --git a/.gitignore b/.gitignore index f68e575..e5e1a9c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ debian/ cmd/ilber/ilber ilber.conf deploy.retry +ilber.local.toml diff --git a/Gopkg.lock b/Gopkg.lock deleted file mode 100644 index 26f1ee0..0000000 --- a/Gopkg.lock +++ /dev/null @@ -1,138 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - branch = "master" - name = "github.com/aaron-lebo/ocd" - packages = ["feeds/atom"] - revision = "ee9a3f6eca21b814155ab93e55f893c438e8f060" - -[[projects]] - branch = "master" - name = "github.com/beorn7/perks" - packages = ["quantile"] - revision = "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9" - -[[projects]] - name = "github.com/blendlabs/go-exception" - packages = ["."] - revision = "1eb19b172d7ccae9d5ec8cb4b02529cf3c69ccbd" - version = "v1.0.0" - -[[projects]] - name = "github.com/burntsushi/toml" - packages = ["."] - revision = "b26d9c308763d68093482582cea63d69be07a0f0" - version = "v0.3.0" - -[[projects]] - branch = "master" - name = "github.com/golang/freetype" - packages = [ - "raster", - "truetype" - ] - revision = "e2365dfdc4a05e4b8299a783240d4a7d5a65d4e4" - -[[projects]] - name = "github.com/golang/protobuf" - packages = ["proto"] - revision = "925541529c1fa6821df4e44ce2723319eb2be768" - version = "v1.0.0" - -[[projects]] - branch = "master" - name = "github.com/igungor/telegram" - packages = ["."] - revision = "1b4b075241091ef68314cb8da36d65e66726e004" - -[[projects]] - name = "github.com/matttproud/golang_protobuf_extensions" - packages = ["pbutil"] - revision = "3247c84500bff8d9fb6d579d800f20b3e091582c" - version = "v1.0.0" - -[[projects]] - name = "github.com/prometheus/client_golang" - packages = [ - "prometheus", - "prometheus/promhttp" - ] - revision = "c5b7fccd204277076155f10851dad72b76a49317" - version = "v0.8.0" - -[[projects]] - branch = "master" - name = "github.com/prometheus/client_model" - packages = ["go"] - revision = "99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c" - -[[projects]] - branch = "master" - name = "github.com/prometheus/common" - packages = [ - "expfmt", - "internal/bitbucket.org/ww/goautoneg", - "model" - ] - revision = "e4aa40a9169a88835b849a6efb71e05dc04b88f0" - -[[projects]] - branch = "master" - name = "github.com/prometheus/procfs" - packages = [ - ".", - "internal/util", - "nfs", - "xfs" - ] - revision = "54d17b57dd7d4a3aa092476596b3f8a933bde349" - -[[projects]] - name = "github.com/wcharczuk/go-chart" - packages = [ - ".", - "drawing" - ] - revision = "fc2973067ce43455507ea5f9aa9814aabbf8f2ca" - version = "v2.0" - -[[projects]] - branch = "master" - name = "golang.org/x/image" - packages = [ - "draw", - "font", - "math/f64", - "math/fixed" - ] - revision = "f3a9b89b59def9194717c1d0bd4c0d08fa1afa7b" - -[[projects]] - branch = "master" - name = "golang.org/x/net" - packages = [ - "context", - "context/ctxhttp" - ] - revision = "24dd3780ca4f75fed9f321890729414a4b5d3f13" - -[[projects]] - branch = "master" - name = "google.golang.org/api" - packages = [ - "customsearch/v1", - "gensupport", - "googleapi", - "googleapi/internal/uritemplates", - "googleapi/transport", - "youtube/v3" - ] - revision = "55e9fb4044f4757138d4273ace23060d022d18f9" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "4b3faba53644c3ff14ec9930fa2c06af4f03437582431f270d6dc90692315b01" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml deleted file mode 100644 index d63eb69..0000000 --- a/Gopkg.toml +++ /dev/null @@ -1,27 +0,0 @@ -[[constraint]] - branch = "master" - name = "github.com/aaron-lebo/ocd" - -[[constraint]] - name = "github.com/burntsushi/toml" - version = "0.3.0" - -[[constraint]] - branch = "master" - name = "github.com/igungor/telegram" - -[[constraint]] - name = "github.com/prometheus/client_golang" - version = "0.8.0" - -[[constraint]] - name = "github.com/wcharczuk/go-chart" - version = "2.0.0" - -[[constraint]] - branch = "master" - name = "google.golang.org/api" - -[prune] - go-tests = true - unused-packages = true diff --git a/command/chart.go b/command/chart.go deleted file mode 100644 index a563c54..0000000 --- a/command/chart.go +++ /dev/null @@ -1,208 +0,0 @@ -package command - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" - "strings" - "time" - - "github.com/igungor/ilber/bot" - "github.com/igungor/telegram" - chart "github.com/wcharczuk/go-chart" -) - -func init() { - register(cmdChart) -} - -const ( - defaultDataRange = "5d" -) - -var cmdChart = &Command{ - Name: "chart", - ShortLine: "chart kaba kaat", - Run: runChart, - Hidden: true, -} - -func runChart(ctx context.Context, b *bot.Bot, msg *telegram.Message) { - args := msg.Args() - - var ( - fromCurrency string - toCurrency string - ) - switch len(args) { - case 0: - fromCurrency = "USD" - toCurrency = "TRY" - case 1: - fromCurrency = normalize(args[0]) - toCurrency = "TRY" - case 2: - fromCurrency = normalize(args[0]) - toCurrency = normalize(args[1]) - default: - _, _ = b.SendMessage(msg.Chat.ID, "anlamadim") - return - } - - u, _ := url.Parse(yahooFinanceURL) - u.Path += fmt.Sprintf("%v%v=%v", fromCurrency, toCurrency, "X") - params := u.Query() - params.Set("range", defaultDataRange) - u.RawQuery = params.Encode() - - resp, err := httpclient.Get(u.String()) - if err != nil { - b.Logger.Printf("chart: could not fetch response: %v", err) - b.SendMessage(msg.Chat.ID, "bir takim hatalar sozkonusu") - return - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - b.Logger.Printf("chart: status not OK: %v", resp.StatusCode) - b.SendMessage(msg.Chat.ID, "bir takim hatalar sozkonusu") - return - } - - var response yahooFinanceResponse - err = json.NewDecoder(resp.Body).Decode(&response) - if err != nil { - b.Logger.Printf("chart: could not parse json: %v", err) - b.SendMessage(msg.Chat.ID, "bir takim hatalar sozkonusu") - return - } - - result := response.Chart.Result - quote := result[len(result)-1].Indicators.Quote - if len(quote) == 0 { - b.Logger.Printf("chart: no value found for query %v", strings.Join(args, " ")) - b.SendMessage(msg.Chat.ID, "no value found") - return - } - close := quote[len(quote)-1].Close - close = close[:len(close)-1] // last value is always nil - timestamps := result[0].Timestamp - timestamps = timestamps[:len(timestamps)-1] // last value of the rate is nil, so remove the last timestamp as well - var rates []float64 - ignoredidx := make([]bool, len(close)) - for i, v := range close { - rate, ok := v.(float64) - // skip unrecognized values to a list for later use - if !ok { - ignoredidx[i] = true - continue - } - rates = append(rates, rate) - } - - var times []time.Time - for i, ts := range timestamps { - // if the rate value is nil for this timestamp, skip it so that the - // data will be consistent - if ignoredidx[i] { - continue - } - times = append(times, time.Unix(ts, 0)) - } - - floatformatter := func(v interface{}) string { - return fmt.Sprintf("%4.4f", v) - } - - dateformatter := func(v interface{}) string { - duration := toDuration(defaultDataRange) - if duration <= 2*24*time.Hour { - return chart.TimeHourValueFormatter(v) - } - return chart.TimeValueFormatterWithFormat(v, "01-02 03:04PM") - } - - priceSeries := chart.TimeSeries{ - Name: "Currency", - Style: chart.Style{ - Show: true, - StrokeColor: chart.ColorBlue, - }, - XValues: times, - YValues: rates, - } - - chartname := fmt.Sprintf("%v in %v for 5 days", fromCurrency, toCurrency) - graph := chart.Chart{ - Title: chartname, - TitleStyle: chart.StyleShow(), - XAxis: chart.XAxis{ - Style: chart.StyleShow(), - ValueFormatter: dateformatter, - TickStyle: chart.StyleShow(), - GridMajorStyle: chart.Style{ - Show: true, - StrokeColor: chart.ColorAlternateGray, - StrokeDashArray: []float64{3, 2, 1}, - StrokeWidth: 1.0, - }, - }, - YAxis: chart.YAxis{ - Name: "Currency", - NameStyle: chart.StyleShow(), - Style: chart.StyleShow(), - ValueFormatter: floatformatter, - }, - Series: []chart.Series{ - priceSeries, - chart.LastValueAnnotation(priceSeries, floatformatter), - }, - } - - var buf bytes.Buffer - graph.Elements = []chart.Renderable{chart.Legend(&graph)} - if err := graph.Render(chart.PNG, &buf); err != nil { - b.Logger.Printf("chart: could not render the chart: %v", err) - _, _ = b.SendMessage(msg.Chat.ID, "hersey tamamdi aslinda ama grafigi render edemedim") - return - } - - photo := telegram.Photo{File: telegram.File{ - Name: chartname, - Body: &buf, - }} - - _, err = b.SendPhoto(msg.Chat.ID, photo, nil) - if err != nil { - b.Logger.Printf("chart: could not send photo: %v", err) - return - } -} - -func toDuration(s string) time.Duration { - var ( - day = 24 * time.Hour - month = 30 * day - year = 12 * month - - defaultDuration = 5 * day - ) - validRanges := map[string]time.Duration{ - "1d": day, - "5d": 5 * day, - "1mo": month, - "3mo": 3 * month, - "6mo": 6 * month, - "1y": year, - "2y": 2 * year, - "5y": 5 * year, - "10y": 10 * year, - } - if dur, ok := validRanges[s]; ok { - return dur - } - return defaultDuration -} diff --git a/command/currency.go b/command/currency.go index 4c310d3..320dd10 100644 --- a/command/currency.go +++ b/command/currency.go @@ -26,7 +26,6 @@ var cmdCurrency = &Command{ const ( yahooFinanceURL = "https://query1.finance.yahoo.com/v8/finance/chart/" - alphavantageURL = "https://www.alphavantage.co/query" ) func defaultCurrencies() []query { @@ -46,9 +45,8 @@ func runCurrency(ctx context.Context, b *bot.Bot, msg *telegram.Message) { queries := parseMessage(msg.Args()) var errs []error - // FIXME(ig): enable yahoo later - for _, fn := range []queryfunc{queryYahooFinance, queryAlphaVantage} { - s, err := fn(queries, b.Config.AlphaVantageToken) + for _, fn := range []queryfunc{queryYahooFinance} { + s, err := fn(queries) if err != nil { errs = append(errs, err) continue @@ -119,9 +117,9 @@ type query struct { isCalc bool } -type queryfunc func([]query, string) (string, error) +type queryfunc func([]query) (string, error) -func queryYahooFinance(queries []query, token string) (string, error) { +func queryYahooFinance(queries []query) (string, error) { if len(queries) == 0 { return "", fmt.Errorf("yahoo: no query found") } @@ -210,82 +208,6 @@ func queryYahooFinance(queries []query, token string) (string, error) { return buf.String(), nil } -func queryAlphaVantage(queries []query, token string) (string, error) { - if len(queries) == 0 { - return "", fmt.Errorf("av: no query found") - } - - request := func(q query) (float64, error) { - u, _ := url.Parse(alphavantageURL) - params := u.Query() - params.Set("function", "CURRENCY_EXCHANGE_RATE") - params.Set("from_currency", q.from) - params.Set("to_currency", q.to) - params.Set("apikey", token) - u.RawQuery = params.Encode() - - resp, err := httpclient.Get(u.String()) - if err != nil { - return 0, fmt.Errorf("av: could not fetch response: %v", err) - } - defer resp.Body.Close() - - var response alphavantageResponse - err = json.NewDecoder(resp.Body).Decode(&response) - if err != nil { - return 0, fmt.Errorf("av: could not parse json: %v", err) - } - - return strconv.ParseFloat(response.Realtime_Currency_Exchange_Rate.Rate, 64) - } - - if len(queries) == 1 && queries[0].isCalc { - q := queries[0] - rate, err := request(q) - if err != nil { - return "", err - } - return fmt.Sprintf( - "%4.2f %v = %4.4f %v", - q.amount, - normalize(q.from), - q.amount*rate, - normalize(q.to), - ), nil - } - - var rates []float64 - for _, q := range queries { - rate, err := request(q) - if err != nil { - return "", err - } - rates = append(rates, rate) - } - - var buf bytes.Buffer - for i, rate := range rates { - fmt.Fprintf(&buf, "%v = %4.4f %v\n", - normalize(queries[i].from), - rate, - normalize(queries[i].to), - ) - } - return buf.String(), nil -} - -type alphavantageResponse struct { - Realtime_Currency_Exchange_Rate struct { - From string `json:"1. From_Currency Code"` - _ string `json:"2. From_Currency Name"` - To string `json:"3. To_Currency Code"` - _ string `json:"4. To_Currency Name"` - Rate string `json:"5. Exchange Rate"` - _ string `json:"6. Last Refreshed"` - _ string `json:"7. Time Zone"` - } `json:"Realtime Currency Exchange Rate"` -} - type yahooFinanceResponse struct { Chart struct { Error interface{} `json:"error"` diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e822fc3 --- /dev/null +++ b/go.mod @@ -0,0 +1,19 @@ +module github.com/igungor/ilber + +go 1.12 + +require ( + github.com/aaron-lebo/ocd v0.0.0-20140809093605-ee9a3f6eca21 + github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a // indirect + github.com/burntsushi/toml v0.3.0 + github.com/golang/protobuf v1.0.0 // indirect + github.com/igungor/telegram v0.0.0-20170723120259-1b4b07524109 + github.com/matttproud/golang_protobuf_extensions v1.0.0 // indirect + github.com/prometheus/client_golang v0.8.0 + github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5 // indirect + github.com/prometheus/common v0.0.0-20180312112859-e4aa40a9169a // indirect + github.com/prometheus/procfs v0.0.0-20180310141954-54d17b57dd7d // indirect + golang.org/x/net v0.0.0-20180317175401-24dd3780ca4f // indirect + golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a // indirect + google.golang.org/api v0.0.0-20180319000549-55e9fb4044f4 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..659631c --- /dev/null +++ b/go.sum @@ -0,0 +1,26 @@ +github.com/aaron-lebo/ocd v0.0.0-20140809093605-ee9a3f6eca21 h1:bGmKZVRtq0HGehDgBg3HkEfSqLP2YXyoq0+j0HtLoOE= +github.com/aaron-lebo/ocd v0.0.0-20140809093605-ee9a3f6eca21/go.mod h1:Fcv1e5y8FvM73lK5IP2nNWWV2dIw8Oa6G98tCC3ka3Y= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a h1:BtpsbiV638WQZwhA98cEZw2BsbnQJrbd0BI7tsy0W1c= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/burntsushi/toml v0.3.0 h1:7xSK9KkjYhUFUrcGkb57k/zXyeo8yshRmbFS2P1mQT0= +github.com/burntsushi/toml v0.3.0/go.mod h1:tCq67G3LEDB9hykA6+KWl2FPEy0nPcvE8TTBhtOtdGs= +github.com/golang/protobuf v1.0.0 h1:lsek0oXi8iFE9L+EXARyHIjU5rlWIhhTkjDz3vHhWWQ= +github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/igungor/telegram v0.0.0-20170723120259-1b4b07524109 h1:RBd8Tv73VFUBehkW12uZ9WsenSRl4GEniQ3GBL78IO8= +github.com/igungor/telegram v0.0.0-20170723120259-1b4b07524109/go.mod h1:iXQDrkBihQDrhL4kexDy9ZbORZK8pYfvu4EEMfrvDW8= +github.com/matttproud/golang_protobuf_extensions v1.0.0 h1:YNOwxxSJzSUARoD9KRZLzM9Y858MNGCOACTvCW9TSAc= +github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/prometheus/client_golang v0.8.0 h1:1921Yw9Gc3iSc4VQh3PIoOqgPCZS7G/4xQNVUp8Mda8= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5 h1:cLL6NowurKLMfCeQy4tIeph12XNQWgANCNvdyrOYKV4= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.0.0-20180312112859-e4aa40a9169a h1:JLXgXKi9RCmLk8DMn8+PCvN++iwpD3KptUbVvHBsKtU= +github.com/prometheus/common v0.0.0-20180312112859-e4aa40a9169a/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/procfs v0.0.0-20180310141954-54d17b57dd7d h1:iF+U2tTdys559fmqt0MNaC8QLIJh1twxIIOylDGhswM= +github.com/prometheus/procfs v0.0.0-20180310141954-54d17b57dd7d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +golang.org/x/net v0.0.0-20180317175401-24dd3780ca4f h1:0boFcGnduzgIGptcBMbxdHgHx5GEfTZcuzbve08cTLQ= +golang.org/x/net v0.0.0-20180317175401-24dd3780ca4f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +google.golang.org/api v0.0.0-20180319000549-55e9fb4044f4 h1:/ziuL7M9bZieARGwWP6edB2Ep9xi+z8QckuyRyzi7O8= +google.golang.org/api v0.0.0-20180319000549-55e9fb4044f4/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= diff --git a/vendor/github.com/aaron-lebo/ocd/.gitignore b/vendor/github.com/aaron-lebo/ocd/.gitignore deleted file mode 100644 index 726a694..0000000 --- a/vendor/github.com/aaron-lebo/ocd/.gitignore +++ /dev/null @@ -1 +0,0 @@ -ocd diff --git a/vendor/github.com/aaron-lebo/ocd/README.md b/vendor/github.com/aaron-lebo/ocd/README.md deleted file mode 100644 index ec68f07..0000000 --- a/vendor/github.com/aaron-lebo/ocd/README.md +++ /dev/null @@ -1,8 +0,0 @@ -ocd -=== - -This project contains parsers for RSS (0.9 through 2) and Atom feeds using the xml package in the standard library. main.go exists mainly for testing, once it is built, a single URL can be passed to it and it will print out all of the items/entries in the feed. - - ./ocd https://news.ycombinator.com/rss - -The current setup should allow new modules to be easily added without conflict. If you would like to add a module, please send a pull request with a working implementation. See the modules directory for examples. All modules should be properly namespaced. diff --git a/vendor/github.com/aaron-lebo/ocd/feeds/atom/atom_test.go b/vendor/github.com/aaron-lebo/ocd/feeds/atom/atom_test.go deleted file mode 100644 index 79d8054..0000000 --- a/vendor/github.com/aaron-lebo/ocd/feeds/atom/atom_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package atom - -import ( - "encoding/xml" - "io/ioutil" - "net/http" - "testing" -) - -func TestFeed(t *testing.T) { - resp, err := http.Get("http://github.com/aaron-lebo.atom") - if err != nil { - t.Error("Error opening url:", err) - } - defer resp.Body.Close() - - body, _ := ioutil.ReadAll(resp.Body) - - var feed Feed - err = xml.Unmarshal(body, &feed) - if err != nil { - t.Error("Error parsing response:", err) - } else if feed.Links[0].Href != "https://github.com/aaron-lebo" { - t.Error("bad Feed.Links[0].Href") - } -} diff --git a/vendor/github.com/aaron-lebo/ocd/main.go b/vendor/github.com/aaron-lebo/ocd/main.go deleted file mode 100644 index 6bf47d1..0000000 --- a/vendor/github.com/aaron-lebo/ocd/main.go +++ /dev/null @@ -1,63 +0,0 @@ -package main - -import ( - "bytes" - "encoding/xml" - "fmt" - "github.com/aaron-lebo/ocd/feeds/atom" - "github.com/aaron-lebo/ocd/feeds/rss" - "github.com/aaron-lebo/ocd/feeds/rss1" - "io/ioutil" - "net/http" - "os" -) - -func main() { - resp, err := http.Get(os.Args[1]) - if err != nil { - fmt.Println("Error opening url:", err) - return - } - defer resp.Body.Close() - - body, _ := ioutil.ReadAll(resp.Body) - - var rss_ rss.Rss - decoder := xml.NewDecoder(bytes.NewBuffer(body)) - decoder.DefaultSpace = "rss" - err = decoder.Decode(&rss_) - if err != nil { - fmt.Println("Error parsing response:", err) - } else { - fmt.Println(rss_.Channel.Link) - fmt.Printf("%+v\n", rss_.Channel.Atom.Link) - for _, item := range rss_.Channel.Items { - fmt.Println(item) - } - return - } - - var feed atom.Feed - err = xml.Unmarshal(body, &feed) - if err != nil { - fmt.Println("Error parsing response:", err) - } else { - for _, entry := range feed.Entries { - fmt.Println(entry.Title) - } - return - } - - var rdf rss1.RDF - err = xml.Unmarshal(body, &rdf) - if err != nil { - fmt.Println("Error parsing response:", err) - } else { - for _, item := range rdf.Items { - fmt.Printf("%+v\n", item) - for _, topic := range item.Topics.Lis { - fmt.Println(topic) - } - } - } -} diff --git a/vendor/github.com/beorn7/perks/.gitignore b/vendor/github.com/beorn7/perks/.gitignore deleted file mode 100644 index 1bd9209..0000000 --- a/vendor/github.com/beorn7/perks/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.test -*.prof diff --git a/vendor/github.com/beorn7/perks/README.md b/vendor/github.com/beorn7/perks/README.md deleted file mode 100644 index fc05777..0000000 --- a/vendor/github.com/beorn7/perks/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Perks for Go (golang.org) - -Perks contains the Go package quantile that computes approximate quantiles over -an unbounded data stream within low memory and CPU bounds. - -For more information and examples, see: -http://godoc.org/github.com/bmizerany/perks - -A very special thank you and shout out to Graham Cormode (Rutgers University), -Flip Korn (AT&T Labs–Research), S. Muthukrishnan (Rutgers University), and -Divesh Srivastava (AT&T Labs–Research) for their research and publication of -[Effective Computation of Biased Quantiles over Data Streams](http://www.cs.rutgers.edu/~muthu/bquant.pdf) - -Thank you, also: -* Armon Dadgar (@armon) -* Andrew Gerrand (@nf) -* Brad Fitzpatrick (@bradfitz) -* Keith Rarick (@kr) - -FAQ: - -Q: Why not move the quantile package into the project root? -A: I want to add more packages to perks later. - -Copyright (C) 2013 Blake Mizerany - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/beorn7/perks/quantile/bench_test.go b/vendor/github.com/beorn7/perks/quantile/bench_test.go deleted file mode 100644 index 0bd0e4e..0000000 --- a/vendor/github.com/beorn7/perks/quantile/bench_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package quantile - -import ( - "testing" -) - -func BenchmarkInsertTargeted(b *testing.B) { - b.ReportAllocs() - - s := NewTargeted(Targets) - b.ResetTimer() - for i := float64(0); i < float64(b.N); i++ { - s.Insert(i) - } -} - -func BenchmarkInsertTargetedSmallEpsilon(b *testing.B) { - s := NewTargeted(TargetsSmallEpsilon) - b.ResetTimer() - for i := float64(0); i < float64(b.N); i++ { - s.Insert(i) - } -} - -func BenchmarkInsertBiased(b *testing.B) { - s := NewLowBiased(0.01) - b.ResetTimer() - for i := float64(0); i < float64(b.N); i++ { - s.Insert(i) - } -} - -func BenchmarkInsertBiasedSmallEpsilon(b *testing.B) { - s := NewLowBiased(0.0001) - b.ResetTimer() - for i := float64(0); i < float64(b.N); i++ { - s.Insert(i) - } -} - -func BenchmarkQuery(b *testing.B) { - s := NewTargeted(Targets) - for i := float64(0); i < 1e6; i++ { - s.Insert(i) - } - b.ResetTimer() - n := float64(b.N) - for i := float64(0); i < n; i++ { - s.Query(i / n) - } -} - -func BenchmarkQuerySmallEpsilon(b *testing.B) { - s := NewTargeted(TargetsSmallEpsilon) - for i := float64(0); i < 1e6; i++ { - s.Insert(i) - } - b.ResetTimer() - n := float64(b.N) - for i := float64(0); i < n; i++ { - s.Query(i / n) - } -} diff --git a/vendor/github.com/beorn7/perks/quantile/example_test.go b/vendor/github.com/beorn7/perks/quantile/example_test.go deleted file mode 100644 index ab3293a..0000000 --- a/vendor/github.com/beorn7/perks/quantile/example_test.go +++ /dev/null @@ -1,121 +0,0 @@ -// +build go1.1 - -package quantile_test - -import ( - "bufio" - "fmt" - "log" - "os" - "strconv" - "time" - - "github.com/beorn7/perks/quantile" -) - -func Example_simple() { - ch := make(chan float64) - go sendFloats(ch) - - // Compute the 50th, 90th, and 99th percentile. - q := quantile.NewTargeted(map[float64]float64{ - 0.50: 0.005, - 0.90: 0.001, - 0.99: 0.0001, - }) - for v := range ch { - q.Insert(v) - } - - fmt.Println("perc50:", q.Query(0.50)) - fmt.Println("perc90:", q.Query(0.90)) - fmt.Println("perc99:", q.Query(0.99)) - fmt.Println("count:", q.Count()) - // Output: - // perc50: 5 - // perc90: 16 - // perc99: 223 - // count: 2388 -} - -func Example_mergeMultipleStreams() { - // Scenario: - // We have multiple database shards. On each shard, there is a process - // collecting query response times from the database logs and inserting - // them into a Stream (created via NewTargeted(0.90)), much like the - // Simple example. These processes expose a network interface for us to - // ask them to serialize and send us the results of their - // Stream.Samples so we may Merge and Query them. - // - // NOTES: - // * These sample sets are small, allowing us to get them - // across the network much faster than sending the entire list of data - // points. - // - // * For this to work correctly, we must supply the same quantiles - // a priori the process collecting the samples supplied to NewTargeted, - // even if we do not plan to query them all here. - ch := make(chan quantile.Samples) - getDBQuerySamples(ch) - q := quantile.NewTargeted(map[float64]float64{0.90: 0.001}) - for samples := range ch { - q.Merge(samples) - } - fmt.Println("perc90:", q.Query(0.90)) -} - -func Example_window() { - // Scenario: We want the 90th, 95th, and 99th percentiles for each - // minute. - - ch := make(chan float64) - go sendStreamValues(ch) - - tick := time.NewTicker(1 * time.Minute) - q := quantile.NewTargeted(map[float64]float64{ - 0.90: 0.001, - 0.95: 0.0005, - 0.99: 0.0001, - }) - for { - select { - case t := <-tick.C: - flushToDB(t, q.Samples()) - q.Reset() - case v := <-ch: - q.Insert(v) - } - } -} - -func sendStreamValues(ch chan float64) { - // Use your imagination -} - -func flushToDB(t time.Time, samples quantile.Samples) { - // Use your imagination -} - -// This is a stub for the above example. In reality this would hit the remote -// servers via http or something like it. -func getDBQuerySamples(ch chan quantile.Samples) {} - -func sendFloats(ch chan<- float64) { - f, err := os.Open("exampledata.txt") - if err != nil { - log.Fatal(err) - } - sc := bufio.NewScanner(f) - for sc.Scan() { - b := sc.Bytes() - v, err := strconv.ParseFloat(string(b), 64) - if err != nil { - log.Fatal(err) - } - ch <- v - } - if sc.Err() != nil { - log.Fatal(sc.Err()) - } - close(ch) -} diff --git a/vendor/github.com/beorn7/perks/quantile/stream_test.go b/vendor/github.com/beorn7/perks/quantile/stream_test.go deleted file mode 100644 index 8551950..0000000 --- a/vendor/github.com/beorn7/perks/quantile/stream_test.go +++ /dev/null @@ -1,215 +0,0 @@ -package quantile - -import ( - "math" - "math/rand" - "sort" - "testing" -) - -var ( - Targets = map[float64]float64{ - 0.01: 0.001, - 0.10: 0.01, - 0.50: 0.05, - 0.90: 0.01, - 0.99: 0.001, - } - TargetsSmallEpsilon = map[float64]float64{ - 0.01: 0.0001, - 0.10: 0.001, - 0.50: 0.005, - 0.90: 0.001, - 0.99: 0.0001, - } - LowQuantiles = []float64{0.01, 0.1, 0.5} - HighQuantiles = []float64{0.99, 0.9, 0.5} -) - -const RelativeEpsilon = 0.01 - -func verifyPercsWithAbsoluteEpsilon(t *testing.T, a []float64, s *Stream) { - sort.Float64s(a) - for quantile, epsilon := range Targets { - n := float64(len(a)) - k := int(quantile * n) - if k < 1 { - k = 1 - } - lower := int((quantile - epsilon) * n) - if lower < 1 { - lower = 1 - } - upper := int(math.Ceil((quantile + epsilon) * n)) - if upper > len(a) { - upper = len(a) - } - w, min, max := a[k-1], a[lower-1], a[upper-1] - if g := s.Query(quantile); g < min || g > max { - t.Errorf("q=%f: want %v [%f,%f], got %v", quantile, w, min, max, g) - } - } -} - -func verifyLowPercsWithRelativeEpsilon(t *testing.T, a []float64, s *Stream) { - sort.Float64s(a) - for _, qu := range LowQuantiles { - n := float64(len(a)) - k := int(qu * n) - - lowerRank := int((1 - RelativeEpsilon) * qu * n) - upperRank := int(math.Ceil((1 + RelativeEpsilon) * qu * n)) - w, min, max := a[k-1], a[lowerRank-1], a[upperRank-1] - if g := s.Query(qu); g < min || g > max { - t.Errorf("q=%f: want %v [%f,%f], got %v", qu, w, min, max, g) - } - } -} - -func verifyHighPercsWithRelativeEpsilon(t *testing.T, a []float64, s *Stream) { - sort.Float64s(a) - for _, qu := range HighQuantiles { - n := float64(len(a)) - k := int(qu * n) - - lowerRank := int((1 - (1+RelativeEpsilon)*(1-qu)) * n) - upperRank := int(math.Ceil((1 - (1-RelativeEpsilon)*(1-qu)) * n)) - w, min, max := a[k-1], a[lowerRank-1], a[upperRank-1] - if g := s.Query(qu); g < min || g > max { - t.Errorf("q=%f: want %v [%f,%f], got %v", qu, w, min, max, g) - } - } -} - -func populateStream(s *Stream) []float64 { - a := make([]float64, 0, 1e5+100) - for i := 0; i < cap(a); i++ { - v := rand.NormFloat64() - // Add 5% asymmetric outliers. - if i%20 == 0 { - v = v*v + 1 - } - s.Insert(v) - a = append(a, v) - } - return a -} - -func TestTargetedQuery(t *testing.T) { - rand.Seed(42) - s := NewTargeted(Targets) - a := populateStream(s) - verifyPercsWithAbsoluteEpsilon(t, a, s) -} - -func TestTargetedQuerySmallSampleSize(t *testing.T) { - rand.Seed(42) - s := NewTargeted(TargetsSmallEpsilon) - a := []float64{1, 2, 3, 4, 5} - for _, v := range a { - s.Insert(v) - } - verifyPercsWithAbsoluteEpsilon(t, a, s) - // If not yet flushed, results should be precise: - if !s.flushed() { - for φ, want := range map[float64]float64{ - 0.01: 1, - 0.10: 1, - 0.50: 3, - 0.90: 5, - 0.99: 5, - } { - if got := s.Query(φ); got != want { - t.Errorf("want %f for φ=%f, got %f", want, φ, got) - } - } - } -} - -func TestLowBiasedQuery(t *testing.T) { - rand.Seed(42) - s := NewLowBiased(RelativeEpsilon) - a := populateStream(s) - verifyLowPercsWithRelativeEpsilon(t, a, s) -} - -func TestHighBiasedQuery(t *testing.T) { - rand.Seed(42) - s := NewHighBiased(RelativeEpsilon) - a := populateStream(s) - verifyHighPercsWithRelativeEpsilon(t, a, s) -} - -// BrokenTestTargetedMerge is broken, see Merge doc comment. -func BrokenTestTargetedMerge(t *testing.T) { - rand.Seed(42) - s1 := NewTargeted(Targets) - s2 := NewTargeted(Targets) - a := populateStream(s1) - a = append(a, populateStream(s2)...) - s1.Merge(s2.Samples()) - verifyPercsWithAbsoluteEpsilon(t, a, s1) -} - -// BrokenTestLowBiasedMerge is broken, see Merge doc comment. -func BrokenTestLowBiasedMerge(t *testing.T) { - rand.Seed(42) - s1 := NewLowBiased(RelativeEpsilon) - s2 := NewLowBiased(RelativeEpsilon) - a := populateStream(s1) - a = append(a, populateStream(s2)...) - s1.Merge(s2.Samples()) - verifyLowPercsWithRelativeEpsilon(t, a, s2) -} - -// BrokenTestHighBiasedMerge is broken, see Merge doc comment. -func BrokenTestHighBiasedMerge(t *testing.T) { - rand.Seed(42) - s1 := NewHighBiased(RelativeEpsilon) - s2 := NewHighBiased(RelativeEpsilon) - a := populateStream(s1) - a = append(a, populateStream(s2)...) - s1.Merge(s2.Samples()) - verifyHighPercsWithRelativeEpsilon(t, a, s2) -} - -func TestUncompressed(t *testing.T) { - q := NewTargeted(Targets) - for i := 100; i > 0; i-- { - q.Insert(float64(i)) - } - if g := q.Count(); g != 100 { - t.Errorf("want count 100, got %d", g) - } - // Before compression, Query should have 100% accuracy. - for quantile := range Targets { - w := quantile * 100 - if g := q.Query(quantile); g != w { - t.Errorf("want %f, got %f", w, g) - } - } -} - -func TestUncompressedSamples(t *testing.T) { - q := NewTargeted(map[float64]float64{0.99: 0.001}) - for i := 1; i <= 100; i++ { - q.Insert(float64(i)) - } - if g := q.Samples().Len(); g != 100 { - t.Errorf("want count 100, got %d", g) - } -} - -func TestUncompressedOne(t *testing.T) { - q := NewTargeted(map[float64]float64{0.99: 0.01}) - q.Insert(3.14) - if g := q.Query(0.90); g != 3.14 { - t.Error("want PI, got", g) - } -} - -func TestDefaults(t *testing.T) { - if g := NewTargeted(map[float64]float64{0.99: 0.001}).Query(0.99); g != 0 { - t.Errorf("want 0, got %f", g) - } -} diff --git a/vendor/github.com/blendlabs/go-exception/.travis.yml b/vendor/github.com/blendlabs/go-exception/.travis.yml deleted file mode 100644 index f257584..0000000 --- a/vendor/github.com/blendlabs/go-exception/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: go -sudo: false - -notifications: - slack: - rooms: - - secure: "FToGpbISqzxKUYrx5ajodhMB+Yz/DqFS5/BrUKgifNup8shikRPXM+/KAnRPc2PFCKErzZQEdrqbdPageWOosY77qMLMlyaPY5ZdA8kV5n+Ro2WmFicj6XqUngMe5FAxdX8aYcp9EGWOOyha28tIMK8ExQzF06/aLXpqq/xlm7HKXrWTSrQ9RKsaM9EGODQyzZj0VrP2Drs1rNkNj2Vi/6jX5l7/Cw8c3cMosXaMcjFRtbdmkz+9oKBa9J/PhcZQ5J+odAG5F6YPBcQBXJLB+6chBu4n+gpEAb2er2n+RP1oGtiJoQYv2gOejrwPkyvlUyx4bKLyYrigFOJJCewWKCobHe6TcHWP9yPbyTRelywN6whw+zlNLQ0duASEEPGcl0yXSs/g6QlYBbz6k9ArRSY+9NWRhmDzY6oDYH+oyw/pfvSAQA9obliMfcIu/v27xnNDMSP7H3vfi5UTmuiYmGlKc8BfyC5/EoRY1W4XPtETn9pAsX49mrOVyFdWcezqbvtyIOXzKeI/WJpL8INLH6rTIIQizbPTCuGN/lo5PT+aUesKTgE3/O2MI/Wh06mvJD/usKcV5BKm45x3/ml42NvmQMUHBiRzgg5/Dx7f3Zokr1x45cGQFSie66yXr9N6sID5kom6ZEIpG3wZzvJbXqiWPD5ioepklia4IMzddiY=" - on_success: change - on_failure: change - template: - - "%{repository_slug} %{message} %{duration}" - - "%{author} : (<%{compare_url}|%{commit}>) %{commit_message}" - - "Build Details: %{build_url}" - -before_script: - - go get -u github.com/blendlabs/go-assert - -script: - - go test diff --git a/vendor/github.com/blendlabs/go-exception/LICENSE b/vendor/github.com/blendlabs/go-exception/LICENSE deleted file mode 100644 index 10359df..0000000 --- a/vendor/github.com/blendlabs/go-exception/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Blend Labs, inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/blendlabs/go-exception/README.md b/vendor/github.com/blendlabs/go-exception/README.md deleted file mode 100644 index e6b19d8..0000000 --- a/vendor/github.com/blendlabs/go-exception/README.md +++ /dev/null @@ -1,59 +0,0 @@ -go-exception -============ - -[![Build Status](https://travis-ci.org/blendlabs/go-exception.svg?branch=master)](https://travis-ci.org/blendlabs/go-exception) - -This is a simple library for wrapping errors.Error with a stack trace. - -##Sample Output - -If we run `ex.Error()` on an Exception we will get a more detailed output than a normal `errorString` - -```text -Exception: this is a sample error - At: foo_controller.go:20 testExceptions() - http.go:198 func1() - http.go:213 func1() - http.go:117 func1() - router.go:299 ServeHTTP() - server.go:1862 ServeHTTP() - server.go:1361 serve() - asm_amd64.s:1696 goexit() -``` - -##Usage - -If we want to create a new exception we can use `New` - -```go - return exception.New("this is a test exception") -``` - -`New` will create a stack trace at the given line. It ignores stack frames within the `exception` package itself. -There is also a convenience method `Newf` that will mimic Printf like functions. - -If we want to wrap an existing golang `error` all we have to do is call `Wrap` - -```go - file, fileErr := os.ReadFile("my_file.txt") - if fileErr != nil { - return exception.Wrap(fileErr) - } -``` - -A couple properties of wrap: -* It will return nil if the input error is nil -* It will not modify an error that is actually an exception, it will simply return (propagate) it. -* It will create a stack trace for the error if it is not nil, and assign the message from the existing error. - -If we want to merge a couple exceptions together, i.e. we can use `WrapMany` - -```go -if q.Rows != nil { - if closeErr := q.Rows.Close(); closeErr != nil { - return exception.WrapMany(q.Error, closeErr) - } -} -``` - -`WrapMany` will "nest" the exceptions, and this will be reflected in the output. diff --git a/vendor/github.com/blendlabs/go-exception/exception.go b/vendor/github.com/blendlabs/go-exception/exception.go deleted file mode 100644 index d2f3f9e..0000000 --- a/vendor/github.com/blendlabs/go-exception/exception.go +++ /dev/null @@ -1,213 +0,0 @@ -package exception - -import ( - "encoding/json" - "fmt" - "io" -) - -// New returns a new exception with a call stack. -func New(classArgs ...interface{}) *Ex { - return &Ex{class: fmt.Sprint(classArgs...), stack: callers()} -} - -// Newf returns a new exception by `Sprintf`ing the format and the args. -func Newf(classFormat string, args ...interface{}) *Ex { - return &Ex{class: fmt.Sprintf(classFormat, args...), stack: callers()} -} - -// NewFromErr returns a new exception from an error. -func NewFromErr(err error) *Ex { - return &Ex{ - inner: err, - class: err.Error(), - stack: callers(), - } -} - -// Wrap wraps an exception, will return error-typed `nil` if the exception is nil. -func Wrap(err error) error { - if err == nil { - return nil - } - - if typedEx, isException := err.(*Ex); isException { - return typedEx - } - return NewFromErr(err) -} - -// Ex is an error with a stack trace. -type Ex struct { - // Class disambiguates between errors, it can be used to identify the type of the error. - class string - // Message adds further detail to the error, and shouldn't be used for disambiguation. - message string - // Inner holds the original error in cases where we're wrapping an error with a stack trace. - inner error - // Stack is the call stack frames used to create the stack output. - *stack -} - -// Format allows for conditional expansion in printf statements -// based on the token and flags used. -// %+v : class + message + stack -// %v, %c : class -// %m : message -// %t : stack -func (e *Ex) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - if s.Flag('+') { - if len(e.class) > 0 { - fmt.Fprintf(s, "%s", e.class) - if len(e.message) > 0 { - fmt.Fprintf(s, "\nmessage: %s", e.message) - } - } else if len(e.message) > 0 { - io.WriteString(s, e.message) - } - - e.stack.Format(s, verb) - return - } else if s.Flag('-') { - e.stack.Format(s, verb) - return - } - - if len(e.class) > 0 { - io.WriteString(s, e.class) - if len(e.message) > 0 { - fmt.Fprintf(s, "\nmessage: %s", e.message) - } - } else if len(e.message) > 0 { - io.WriteString(s, e.message) - } - return - case 'c': - io.WriteString(s, e.class) - case 'm': - io.WriteString(s, e.message) - case 'q': - fmt.Fprintf(s, "%q", e.message) - } -} - -// MarshalJSON is a custom json marshaler. -func (e *Ex) MarshalJSON() ([]byte, error) { - values := map[string]interface{}{} - values["Class"] = e.class - values["Message"] = e.message - if e.stack != nil { - values["Stack"] = e.StackTrace().AsStringSlice() - } - if e.inner != nil { - innerJSON, err := json.Marshal(e.inner) - if err != nil { - return nil, err - } - values["Inner"] = string(innerJSON) - } - - return json.Marshal(values) -} - -// Class returns the exception class. -func (e *Ex) Class() string { - return e.class -} - -// WithClass sets the exception class and returns the exepction. -func (e *Ex) WithClass(class string) *Ex { - e.class = class - return e -} - -// Inner returns the nested exception. -func (e *Ex) Inner() error { - return e.inner -} - -// WithInner sets the inner and returns the exception. -func (e *Ex) WithInner(err error) *Ex { - e.inner = err - return e -} - -// Error implements the `error` interface -func (e *Ex) Error() string { return e.class } - -// Message returns just the message, it is effectively -// an alias to .Error() -func (e *Ex) Message() string { return e.message } - -// WithMessagef sets the message based on a format and args, and returns the exception. -func (e *Ex) WithMessagef(format string, args ...interface{}) *Ex { - e.message = fmt.Sprintf(format, args...) - return e -} - -// Stack returns the raw stack pointer array. -func (e *Ex) Stack() []uintptr { - if e.stack == nil { - return nil - } - return []uintptr(*e.stack) -} - -// StackString returns the stack trace as a string. -func (e *Ex) StackString() string { - return fmt.Sprintf("%v", e.stack) -} - -// Nest nests an arbitrary number of exceptions. -func Nest(err ...error) error { - var ex *Ex - var last *Ex - var didSet bool - - for _, e := range err { - if e != nil { - var wrappedEx *Ex - if typedEx, isTyped := e.(*Ex); !isTyped { - wrappedEx = &Ex{ - class: e.Error(), - stack: callers(), - } - } else { - wrappedEx = typedEx - } - - if wrappedEx != ex { - if ex == nil { - ex = wrappedEx - last = wrappedEx - } else { - last.inner = wrappedEx - last = wrappedEx - } - didSet = true - } - } - } - if didSet { - return ex - } - return nil -} - -// Is is a helper function that returns if an error is an exception. -func Is(err error) bool { - if _, typedOk := err.(*Ex); typedOk { - return true - } - return false -} - -// As is a helper method that returns an error as an exception. -func As(err error) *Ex { - if typed, typedOk := err.(*Ex); typedOk { - return typed - } - return nil -} diff --git a/vendor/github.com/blendlabs/go-exception/exception_test.go b/vendor/github.com/blendlabs/go-exception/exception_test.go deleted file mode 100644 index a0c4c18..0000000 --- a/vendor/github.com/blendlabs/go-exception/exception_test.go +++ /dev/null @@ -1,171 +0,0 @@ -package exception - -import ( - "encoding/json" - "errors" - "fmt" - "testing" - - "strings" - - "github.com/blendlabs/go-assert" -) - -func TestNew(t *testing.T) { - a := assert.New(t) - ex := New("this is a test") - a.Equal("this is a test", fmt.Sprintf("%v", ex)) - a.NotNil(ex.StackTrace()) - a.Nil(ex.Inner()) -} - -func TestError(t *testing.T) { - a := assert.New(t) - - ex := As(New("this is a test")) - message := ex.Error() - a.NotEmpty(message) -} - -func TestNewf(t *testing.T) { - a := assert.New(t) - ex := Newf("default_class").WithMessagef("%s", "this is a test") - a.Equal("default_class\nmessage: this is a test", fmt.Sprintf("%v", ex)) - a.Equal("this is a test", fmt.Sprintf("%m", ex)) - a.NotEmpty(ex.StackTrace()) - a.Nil(ex.Inner()) -} - -func TestWrapWithError(t *testing.T) { - a := assert.New(t) - - err := errors.New("This is an error") - - wrappedErr := Wrap(err) - a.NotNil(wrappedErr) - typedWrapped := As(wrappedErr) - a.NotNil(typedWrapped) - a.Equal("This is an error", fmt.Sprintf("%v", typedWrapped)) -} - -func TestWrapWithException(t *testing.T) { - a := assert.New(t) - ex := New("This is an exception") - wrappedEx := Wrap(ex) - a.NotNil(wrappedEx) - typedWrappedEx := As(wrappedEx) - a.Equal("This is an exception", fmt.Sprintf("%v", typedWrappedEx)) - a.Equal(ex, typedWrappedEx) -} - -func TestWrapWithNil(t *testing.T) { - a := assert.New(t) - - shouldBeNil := Wrap(nil) - a.Nil(shouldBeNil) - a.Equal(nil, shouldBeNil) -} - -func TestWrapWithTypedNil(t *testing.T) { - a := assert.New(t) - - var nilError error - a.Nil(nilError) - a.Equal(nil, nilError) - - shouldBeNil := Wrap(nilError) - a.Nil(shouldBeNil) - a.True(shouldBeNil == nil) -} - -func TestWrapWithReturnedNil(t *testing.T) { - a := assert.New(t) - - returnsNil := func() error { - return nil - } - - shouldBeNil := Wrap(returnsNil()) - a.Nil(shouldBeNil) - a.True(shouldBeNil == nil) - - returnsTypedNil := func() error { - return Wrap(nil) - } - - shouldAlsoBeNil := returnsTypedNil() - a.Nil(shouldAlsoBeNil) - a.True(shouldAlsoBeNil == nil) -} - -func TestCallers(t *testing.T) { - a := assert.New(t) - - callStack := func() *stack { return callers() }() - - a.NotNil(callStack) - callstackStr := fmt.Sprintf("%+v", callStack) - a.True(strings.Contains(callstackStr, "testing.tRunner"), callstackStr) -} - -func TestExceptionFormatters(t *testing.T) { - assert := assert.New(t) - - // test the "%v" formatter with just the exception class. - class := &Ex{class: "this is a test"} - assert.Equal("this is a test", fmt.Sprintf("%v", class)) - - classAndMessage := &Ex{class: "foo", message: "bar"} - assert.Equal("foo\nmessage: bar", fmt.Sprintf("%v", classAndMessage)) - - message := &Ex{message: "bar"} - assert.Equal("bar", fmt.Sprintf("%v", message)) -} - -func TestNestWithCycle(t *testing.T) { - a := assert.New(t) - - ex1 := New("This is an error") - err := Nest(ex1, ex1) - - a.NotNil(err) - a.NotEmpty(err.Error()) - - typedException := As(err) - a.Equal(ex1, typedException) -} - -func TestNestNil(t *testing.T) { - a := assert.New(t) - - var ex1 error - var ex2 error - var ex3 error - - err := Nest(ex1, ex2, ex3) - a.Nil(err) - a.Equal(nil, err) -} - -func TestMarshalJSON(t *testing.T) { - type ReadableStackTrace struct { - Class string `json:"Class"` - Message string `json:"Message"` - Stack []string `json:"Stack"` - } - - a := assert.New(t) - ex := New("new test error") - a.NotNil(ex) - stackTrace := ex.StackTrace() - stackDepth := len(stackTrace) - - jsonErr, err := json.Marshal(ex) - a.Nil(err) - a.NotNil(jsonErr) - - ex2 := &ReadableStackTrace{} - err = json.Unmarshal(jsonErr, ex2) - a.Nil(err) - a.Len(ex2.Stack, stackDepth) -} diff --git a/vendor/github.com/blendlabs/go-exception/stack.go b/vendor/github.com/blendlabs/go-exception/stack.go deleted file mode 100644 index 785c852..0000000 --- a/vendor/github.com/blendlabs/go-exception/stack.go +++ /dev/null @@ -1,201 +0,0 @@ -package exception - -import ( - "encoding/json" - "fmt" - "io" - "path" - "runtime" - "strings" -) - -// GetStackTrace is a utility method to get the current stack trace at call time. -func GetStackTrace() string { - return fmt.Sprintf("%+v", callers()) -} - -// Frame represents a program counter inside a stack frame. -type Frame uintptr - -// pc returns the program counter for this frame; -// multiple frames may have the same PC value. -func (f Frame) pc() uintptr { return uintptr(f) - 1 } - -// file returns the full path to the file that contains the -// function for this Frame's pc. -func (f Frame) file() string { - fn := runtime.FuncForPC(f.pc()) - if fn == nil { - return "unknown" - } - file, _ := fn.FileLine(f.pc()) - return file -} - -// line returns the line number of source code of the -// function for this Frame's pc. -func (f Frame) line() int { - fn := runtime.FuncForPC(f.pc()) - if fn == nil { - return 0 - } - _, line := fn.FileLine(f.pc()) - return line -} - -// Format formats the frame according to the fmt.Formatter interface. -// -// %s source file -// %d source line -// %n function name -// %v equivalent to %s:%d -// -// Format accepts flags that alter the printing of some verbs, as follows: -// -// %+s path of source file relative to the compile time GOPATH -// %+v equivalent to %+s:%d -func (f Frame) Format(s fmt.State, verb rune) { - switch verb { - case 's': - switch { - case s.Flag('+'): - pc := f.pc() - fn := runtime.FuncForPC(pc) - if fn == nil { - io.WriteString(s, "unknown") - } else { - file, _ := fn.FileLine(pc) - fname := fn.Name() - fmt.Fprintf(s, "%s\n\t%s", fname, trimGOPATH(fname, file)) - } - default: - io.WriteString(s, path.Base(f.file())) - } - case 'd': - fmt.Fprintf(s, "%d", f.line()) - case 'n': - name := runtime.FuncForPC(f.pc()).Name() - io.WriteString(s, funcname(name)) - case 'v': - f.Format(s, 's') - io.WriteString(s, ":") - f.Format(s, 'd') - } -} - -// StackTrace is stack of Frames from innermost (newest) to outermost (oldest). -type StackTrace []Frame - -// Format formats the stack trace. -func (st StackTrace) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - switch { - case s.Flag('+'): - for _, f := range st { - fmt.Fprintf(s, "\n%+v", f) - } - case s.Flag('#'): - fmt.Fprintf(s, "%#v", []Frame(st)) - default: - fmt.Fprintf(s, "%v", []Frame(st)) - } - case 's': - fmt.Fprintf(s, "%s", []Frame(st)) - } -} - -// AsStringSlice dereferences the StackTrace as a string slice -func (st StackTrace) AsStringSlice() []string { - res := make([]string, len(st)) - for i, frame := range st { - res[i] = fmt.Sprintf("%+v", frame) - } - return res -} - -//MarshalJSON is a custom json marshaler. -func (st StackTrace) MarshalJSON() ([]byte, error) { - return json.Marshal(st.AsStringSlice()) -} - -// stack represents a stack of program counters. -type stack []uintptr - -// Format returns the format for a given stack of program counters. -func (s *stack) Format(st fmt.State, verb rune) { - switch verb { - case 'v': - switch { - case st.Flag('-'), st.Flag('+'): - for _, pc := range *s { - f := Frame(pc) - fmt.Fprintf(st, "\n%+v", f) - } - } - } -} - -func (s *stack) StackTrace() StackTrace { - f := make([]Frame, len(*s)) - for i := 0; i < len(f); i++ { - f[i] = Frame((*s)[i]) - } - return f -} - -func callers() *stack { - const depth = 32 - var pcs [depth]uintptr - n := runtime.Callers(4, pcs[:]) - var st stack = pcs[0:n] - return &st -} - -// funcname removes the path prefix component of a function's name reported by func.Name(). -func funcname(name string) string { - i := strings.LastIndex(name, "/") - name = name[i+1:] - i = strings.Index(name, ".") - return name[i+1:] -} - -func trimGOPATH(name, file string) string { - // Here we want to get the source file path relative to the compile time - // GOPATH. As of Go 1.6.x there is no direct way to know the compiled - // GOPATH at runtime, but we can infer the number of path segments in the - // GOPATH. We note that fn.Name() returns the function name qualified by - // the import path, which does not include the GOPATH. Thus we can trim - // segments from the beginning of the file path until the number of path - // separators remaining is one more than the number of path separators in - // the function name. For example, given: - // - // GOPATH /home/user - // file /home/user/src/pkg/sub/file.go - // fn.Name() pkg/sub.Type.Method - // - // We want to produce: - // - // pkg/sub/file.go - // - // From this we can easily see that fn.Name() has one less path separator - // than our desired output. We count separators from the end of the file - // path until it finds two more than in the function name and then move - // one character forward to preserve the initial path segment without a - // leading separator. - const sep = "/" - goal := strings.Count(name, sep) + 2 - i := len(file) - for n := 0; n < goal; n++ { - i = strings.LastIndex(file[:i], sep) - if i == -1 { - // not enough separators found, set i so that the slice expression - // below leaves file unmodified - i = -len(sep) - break - } - } - // get back to 0 or trim the leading separator - file = file[i+len(sep):] - return file -} diff --git a/vendor/github.com/blendlabs/go-exception/stack_test.go b/vendor/github.com/blendlabs/go-exception/stack_test.go deleted file mode 100644 index bb22649..0000000 --- a/vendor/github.com/blendlabs/go-exception/stack_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package exception - -import ( - "testing" - - assert "github.com/blendlabs/go-assert" -) - -func TestGetStackTrace(t *testing.T) { - assert := assert.New(t) - - assert.NotEmpty(GetStackTrace()) -} diff --git a/vendor/github.com/burntsushi/toml/decode_test.go b/vendor/github.com/burntsushi/toml/decode_test.go deleted file mode 100644 index 0c36b33..0000000 --- a/vendor/github.com/burntsushi/toml/decode_test.go +++ /dev/null @@ -1,1447 +0,0 @@ -package toml - -import ( - "fmt" - "log" - "math" - "reflect" - "strings" - "testing" - "time" -) - -func TestDecodeSimple(t *testing.T) { - var testSimple = ` -age = 250 -andrew = "gallant" -kait = "brady" -now = 1987-07-05T05:45:00Z -yesOrNo = true -pi = 3.14 -colors = [ - ["red", "green", "blue"], - ["cyan", "magenta", "yellow", "black"], -] - -[My.Cats] -plato = "cat 1" -cauchy = "cat 2" -` - - type cats struct { - Plato string - Cauchy string - } - type simple struct { - Age int - Colors [][]string - Pi float64 - YesOrNo bool - Now time.Time - Andrew string - Kait string - My map[string]cats - } - - var val simple - _, err := Decode(testSimple, &val) - if err != nil { - t.Fatal(err) - } - - now, err := time.Parse("2006-01-02T15:04:05", "1987-07-05T05:45:00") - if err != nil { - panic(err) - } - var answer = simple{ - Age: 250, - Andrew: "gallant", - Kait: "brady", - Now: now, - YesOrNo: true, - Pi: 3.14, - Colors: [][]string{ - {"red", "green", "blue"}, - {"cyan", "magenta", "yellow", "black"}, - }, - My: map[string]cats{ - "Cats": {Plato: "cat 1", Cauchy: "cat 2"}, - }, - } - if !reflect.DeepEqual(val, answer) { - t.Fatalf("Expected\n-----\n%#v\n-----\nbut got\n-----\n%#v\n", - answer, val) - } -} - -func TestDecodeEmbedded(t *testing.T) { - type Dog struct{ Name string } - type Age int - type cat struct{ Name string } - - for _, test := range []struct { - label string - input string - decodeInto interface{} - wantDecoded interface{} - }{ - { - label: "embedded struct", - input: `Name = "milton"`, - decodeInto: &struct{ Dog }{}, - wantDecoded: &struct{ Dog }{Dog{"milton"}}, - }, - { - label: "embedded non-nil pointer to struct", - input: `Name = "milton"`, - decodeInto: &struct{ *Dog }{}, - wantDecoded: &struct{ *Dog }{&Dog{"milton"}}, - }, - { - label: "embedded nil pointer to struct", - input: ``, - decodeInto: &struct{ *Dog }{}, - wantDecoded: &struct{ *Dog }{nil}, - }, - { - label: "unexported embedded struct", - input: `Name = "socks"`, - decodeInto: &struct{ cat }{}, - wantDecoded: &struct{ cat }{cat{"socks"}}, - }, - { - label: "embedded int", - input: `Age = -5`, - decodeInto: &struct{ Age }{}, - wantDecoded: &struct{ Age }{-5}, - }, - } { - _, err := Decode(test.input, test.decodeInto) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(test.wantDecoded, test.decodeInto) { - t.Errorf("%s: want decoded == %+v, got %+v", - test.label, test.wantDecoded, test.decodeInto) - } - } -} - -func TestDecodeIgnoredFields(t *testing.T) { - type simple struct { - Number int `toml:"-"` - } - const input = ` -Number = 123 -- = 234 -` - var s simple - if _, err := Decode(input, &s); err != nil { - t.Fatal(err) - } - if s.Number != 0 { - t.Errorf("got: %d; want 0", s.Number) - } -} - -func TestTableArrays(t *testing.T) { - var tomlTableArrays = ` -[[albums]] -name = "Born to Run" - - [[albums.songs]] - name = "Jungleland" - - [[albums.songs]] - name = "Meeting Across the River" - -[[albums]] -name = "Born in the USA" - - [[albums.songs]] - name = "Glory Days" - - [[albums.songs]] - name = "Dancing in the Dark" -` - - type Song struct { - Name string - } - - type Album struct { - Name string - Songs []Song - } - - type Music struct { - Albums []Album - } - - expected := Music{[]Album{ - {"Born to Run", []Song{{"Jungleland"}, {"Meeting Across the River"}}}, - {"Born in the USA", []Song{{"Glory Days"}, {"Dancing in the Dark"}}}, - }} - var got Music - if _, err := Decode(tomlTableArrays, &got); err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(expected, got) { - t.Fatalf("\n%#v\n!=\n%#v\n", expected, got) - } -} - -func TestTableNesting(t *testing.T) { - for _, tt := range []struct { - t string - want []string - }{ - {"[a.b.c]", []string{"a", "b", "c"}}, - {`[a."b.c"]`, []string{"a", "b.c"}}, - {`[a.'b.c']`, []string{"a", "b.c"}}, - {`[a.' b ']`, []string{"a", " b "}}, - {"[ d.e.f ]", []string{"d", "e", "f"}}, - {"[ g . h . i ]", []string{"g", "h", "i"}}, - {`[ j . "ʞ" . 'l' ]`, []string{"j", "ʞ", "l"}}, - } { - var m map[string]interface{} - if _, err := Decode(tt.t, &m); err != nil { - t.Errorf("Decode(%q): got error: %s", tt.t, err) - continue - } - if keys := extractNestedKeys(m); !reflect.DeepEqual(keys, tt.want) { - t.Errorf("Decode(%q): got nested keys %#v; want %#v", - tt.t, keys, tt.want) - } - } -} - -func extractNestedKeys(v map[string]interface{}) []string { - var result []string - for { - if len(v) != 1 { - return result - } - for k, m := range v { - result = append(result, k) - var ok bool - v, ok = m.(map[string]interface{}) - if !ok { - return result - } - } - - } -} - -// Case insensitive matching tests. -// A bit more comprehensive than needed given the current implementation, -// but implementations change. -// Probably still missing demonstrations of some ugly corner cases regarding -// case insensitive matching and multiple fields. -func TestCase(t *testing.T) { - var caseToml = ` -tOpString = "string" -tOpInt = 1 -tOpFloat = 1.1 -tOpBool = true -tOpdate = 2006-01-02T15:04:05Z -tOparray = [ "array" ] -Match = "i should be in Match only" -MatcH = "i should be in MatcH only" -once = "just once" -[nEst.eD] -nEstedString = "another string" -` - - type InsensitiveEd struct { - NestedString string - } - - type InsensitiveNest struct { - Ed InsensitiveEd - } - - type Insensitive struct { - TopString string - TopInt int - TopFloat float64 - TopBool bool - TopDate time.Time - TopArray []string - Match string - MatcH string - Once string - OncE string - Nest InsensitiveNest - } - - tme, err := time.Parse(time.RFC3339, time.RFC3339[:len(time.RFC3339)-5]) - if err != nil { - panic(err) - } - expected := Insensitive{ - TopString: "string", - TopInt: 1, - TopFloat: 1.1, - TopBool: true, - TopDate: tme, - TopArray: []string{"array"}, - MatcH: "i should be in MatcH only", - Match: "i should be in Match only", - Once: "just once", - OncE: "", - Nest: InsensitiveNest{ - Ed: InsensitiveEd{NestedString: "another string"}, - }, - } - var got Insensitive - if _, err := Decode(caseToml, &got); err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(expected, got) { - t.Fatalf("\n%#v\n!=\n%#v\n", expected, got) - } -} - -func TestPointers(t *testing.T) { - type Object struct { - Type string - Description string - } - - type Dict struct { - NamedObject map[string]*Object - BaseObject *Object - Strptr *string - Strptrs []*string - } - s1, s2, s3 := "blah", "abc", "def" - expected := &Dict{ - Strptr: &s1, - Strptrs: []*string{&s2, &s3}, - NamedObject: map[string]*Object{ - "foo": {"FOO", "fooooo!!!"}, - "bar": {"BAR", "ba-ba-ba-ba-barrrr!!!"}, - }, - BaseObject: &Object{"BASE", "da base"}, - } - - ex1 := ` -Strptr = "blah" -Strptrs = ["abc", "def"] - -[NamedObject.foo] -Type = "FOO" -Description = "fooooo!!!" - -[NamedObject.bar] -Type = "BAR" -Description = "ba-ba-ba-ba-barrrr!!!" - -[BaseObject] -Type = "BASE" -Description = "da base" -` - dict := new(Dict) - _, err := Decode(ex1, dict) - if err != nil { - t.Errorf("Decode error: %v", err) - } - if !reflect.DeepEqual(expected, dict) { - t.Fatalf("\n%#v\n!=\n%#v\n", expected, dict) - } -} - -func TestDecodeDatetime(t *testing.T) { - const noTimestamp = "2006-01-02T15:04:05" - for _, tt := range []struct { - s string - t string - format string - }{ - {"1979-05-27T07:32:00Z", "1979-05-27T07:32:00Z", time.RFC3339}, - {"1979-05-27T00:32:00-07:00", "1979-05-27T00:32:00-07:00", time.RFC3339}, - { - "1979-05-27T00:32:00.999999-07:00", - "1979-05-27T00:32:00.999999-07:00", - time.RFC3339, - }, - {"1979-05-27T07:32:00", "1979-05-27T07:32:00", noTimestamp}, - { - "1979-05-27T00:32:00.999999", - "1979-05-27T00:32:00.999999", - noTimestamp, - }, - {"1979-05-27", "1979-05-27T00:00:00", noTimestamp}, - } { - var x struct{ D time.Time } - input := "d = " + tt.s - if _, err := Decode(input, &x); err != nil { - t.Errorf("Decode(%q): got error: %s", input, err) - continue - } - want, err := time.ParseInLocation(tt.format, tt.t, time.Local) - if err != nil { - panic(err) - } - if !x.D.Equal(want) { - t.Errorf("Decode(%q): got %s; want %s", input, x.D, want) - } - } -} - -func TestDecodeBadDatetime(t *testing.T) { - var x struct{ T time.Time } - for _, s := range []string{ - "123", - "2006-01-50T00:00:00Z", - "2006-01-30T00:00", - "2006-01-30T", - } { - input := "T = " + s - if _, err := Decode(input, &x); err == nil { - t.Errorf("Expected invalid DateTime error for %q", s) - } - } -} - -func TestDecodeMultilineStrings(t *testing.T) { - var x struct { - S string - } - const s0 = `s = """ -a b \n c -d e f -"""` - if _, err := Decode(s0, &x); err != nil { - t.Fatal(err) - } - if want := "a b \n c\nd e f\n"; x.S != want { - t.Errorf("got: %q; want: %q", x.S, want) - } - const s1 = `s = """a b c\ -"""` - if _, err := Decode(s1, &x); err != nil { - t.Fatal(err) - } - if want := "a b c"; x.S != want { - t.Errorf("got: %q; want: %q", x.S, want) - } -} - -type sphere struct { - Center [3]float64 - Radius float64 -} - -func TestDecodeSimpleArray(t *testing.T) { - var s1 sphere - if _, err := Decode(`center = [0.0, 1.5, 0.0]`, &s1); err != nil { - t.Fatal(err) - } -} - -func TestDecodeArrayWrongSize(t *testing.T) { - var s1 sphere - if _, err := Decode(`center = [0.1, 2.3]`, &s1); err == nil { - t.Fatal("Expected array type mismatch error") - } -} - -func TestDecodeLargeIntoSmallInt(t *testing.T) { - type table struct { - Value int8 - } - var tab table - if _, err := Decode(`value = 500`, &tab); err == nil { - t.Fatal("Expected integer out-of-bounds error.") - } -} - -func TestDecodeSizedInts(t *testing.T) { - type table struct { - U8 uint8 - U16 uint16 - U32 uint32 - U64 uint64 - U uint - I8 int8 - I16 int16 - I32 int32 - I64 int64 - I int - } - answer := table{1, 1, 1, 1, 1, -1, -1, -1, -1, -1} - toml := ` - u8 = 1 - u16 = 1 - u32 = 1 - u64 = 1 - u = 1 - i8 = -1 - i16 = -1 - i32 = -1 - i64 = -1 - i = -1 - ` - var tab table - if _, err := Decode(toml, &tab); err != nil { - t.Fatal(err.Error()) - } - if answer != tab { - t.Fatalf("Expected %#v but got %#v", answer, tab) - } -} - -func TestDecodeInts(t *testing.T) { - for _, tt := range []struct { - s string - want int64 - }{ - {"0", 0}, - {"+99", 99}, - {"-10", -10}, - {"1_234_567", 1234567}, - {"1_2_3_4", 1234}, - {"-9_223_372_036_854_775_808", math.MinInt64}, - {"9_223_372_036_854_775_807", math.MaxInt64}, - } { - var x struct{ N int64 } - input := "n = " + tt.s - if _, err := Decode(input, &x); err != nil { - t.Errorf("Decode(%q): got error: %s", input, err) - continue - } - if x.N != tt.want { - t.Errorf("Decode(%q): got %d; want %d", input, x.N, tt.want) - } - } -} - -func TestDecodeFloats(t *testing.T) { - for _, tt := range []struct { - s string - want float64 - }{ - {"+1.0", 1}, - {"3.1415", 3.1415}, - {"-0.01", -0.01}, - {"5e+22", 5e22}, - {"1e6", 1e6}, - {"-2E-2", -2e-2}, - {"6.626e-34", 6.626e-34}, - {"9_224_617.445_991_228_313", 9224617.445991228313}, - {"9_876.54_32e1_0", 9876.5432e10}, - } { - var x struct{ N float64 } - input := "n = " + tt.s - if _, err := Decode(input, &x); err != nil { - t.Errorf("Decode(%q): got error: %s", input, err) - continue - } - if x.N != tt.want { - t.Errorf("Decode(%q): got %f; want %f", input, x.N, tt.want) - } - } -} - -func TestDecodeMalformedNumbers(t *testing.T) { - for _, tt := range []struct { - s string - want string - }{ - {"++99", "expected a digit"}, - {"0..1", "must be followed by one or more digits"}, - {"0.1.2", "Invalid float value"}, - {"1e2.3", "Invalid float value"}, - {"1e2e3", "Invalid float value"}, - {"_123", "expected value"}, - {"123_", "surrounded by digits"}, - {"1._23", "surrounded by digits"}, - {"1e__23", "surrounded by digits"}, - {"123.", "must be followed by one or more digits"}, - {"1.e2", "must be followed by one or more digits"}, - } { - var x struct{ N interface{} } - input := "n = " + tt.s - _, err := Decode(input, &x) - if err == nil { - t.Errorf("Decode(%q): got nil, want error containing %q", - input, tt.want) - continue - } - if !strings.Contains(err.Error(), tt.want) { - t.Errorf("Decode(%q): got %q, want error containing %q", - input, err, tt.want) - } - } -} - -func TestDecodeBadValues(t *testing.T) { - for _, tt := range []struct { - v interface{} - want string - }{ - {3, "non-pointer int"}, - {(*int)(nil), "nil"}, - } { - _, err := Decode(`x = 3`, tt.v) - if err == nil { - t.Errorf("Decode(%v): got nil; want error containing %q", - tt.v, tt.want) - continue - } - if !strings.Contains(err.Error(), tt.want) { - t.Errorf("Decode(%v): got %q; want error containing %q", - tt.v, err, tt.want) - } - } -} - -func TestUnmarshaler(t *testing.T) { - - var tomlBlob = ` -[dishes.hamboogie] -name = "Hamboogie with fries" -price = 10.99 - -[[dishes.hamboogie.ingredients]] -name = "Bread Bun" - -[[dishes.hamboogie.ingredients]] -name = "Lettuce" - -[[dishes.hamboogie.ingredients]] -name = "Real Beef Patty" - -[[dishes.hamboogie.ingredients]] -name = "Tomato" - -[dishes.eggsalad] -name = "Egg Salad with rice" -price = 3.99 - -[[dishes.eggsalad.ingredients]] -name = "Egg" - -[[dishes.eggsalad.ingredients]] -name = "Mayo" - -[[dishes.eggsalad.ingredients]] -name = "Rice" -` - m := &menu{} - if _, err := Decode(tomlBlob, m); err != nil { - t.Fatal(err) - } - - if len(m.Dishes) != 2 { - t.Log("two dishes should be loaded with UnmarshalTOML()") - t.Errorf("expected %d but got %d", 2, len(m.Dishes)) - } - - eggSalad := m.Dishes["eggsalad"] - if _, ok := interface{}(eggSalad).(dish); !ok { - t.Errorf("expected a dish") - } - - if eggSalad.Name != "Egg Salad with rice" { - t.Errorf("expected the dish to be named 'Egg Salad with rice'") - } - - if len(eggSalad.Ingredients) != 3 { - t.Log("dish should be loaded with UnmarshalTOML()") - t.Errorf("expected %d but got %d", 3, len(eggSalad.Ingredients)) - } - - found := false - for _, i := range eggSalad.Ingredients { - if i.Name == "Rice" { - found = true - break - } - } - if !found { - t.Error("Rice was not loaded in UnmarshalTOML()") - } - - // test on a value - must be passed as * - o := menu{} - if _, err := Decode(tomlBlob, &o); err != nil { - t.Fatal(err) - } - -} - -func TestDecodeInlineTable(t *testing.T) { - input := ` -[CookieJar] -Types = {Chocolate = "yummy", Oatmeal = "best ever"} - -[Seasons] -Locations = {NY = {Temp = "not cold", Rating = 4}, MI = {Temp = "freezing", Rating = 9}} -` - type cookieJar struct { - Types map[string]string - } - type properties struct { - Temp string - Rating int - } - type seasons struct { - Locations map[string]properties - } - type wrapper struct { - CookieJar cookieJar - Seasons seasons - } - var got wrapper - - meta, err := Decode(input, &got) - if err != nil { - t.Fatal(err) - } - want := wrapper{ - CookieJar: cookieJar{ - Types: map[string]string{ - "Chocolate": "yummy", - "Oatmeal": "best ever", - }, - }, - Seasons: seasons{ - Locations: map[string]properties{ - "NY": { - Temp: "not cold", - Rating: 4, - }, - "MI": { - Temp: "freezing", - Rating: 9, - }, - }, - }, - } - if !reflect.DeepEqual(got, want) { - t.Fatalf("after decode, got:\n\n%#v\n\nwant:\n\n%#v", got, want) - } - if len(meta.keys) != 12 { - t.Errorf("after decode, got %d meta keys; want 12", len(meta.keys)) - } - if len(meta.types) != 12 { - t.Errorf("after decode, got %d meta types; want 12", len(meta.types)) - } -} - -func TestDecodeInlineTableArray(t *testing.T) { - type point struct { - X, Y, Z int - } - var got struct { - Points []point - } - // Example inline table array from the spec. - const in = ` -points = [ { x = 1, y = 2, z = 3 }, - { x = 7, y = 8, z = 9 }, - { x = 2, y = 4, z = 8 } ] - -` - if _, err := Decode(in, &got); err != nil { - t.Fatal(err) - } - want := []point{ - {X: 1, Y: 2, Z: 3}, - {X: 7, Y: 8, Z: 9}, - {X: 2, Y: 4, Z: 8}, - } - if !reflect.DeepEqual(got.Points, want) { - t.Errorf("got %#v; want %#v", got.Points, want) - } -} - -func TestDecodeMalformedInlineTable(t *testing.T) { - for _, tt := range []struct { - s string - want string - }{ - {"{,}", "unexpected comma"}, - {"{x = 3 y = 4}", "expected a comma or an inline table terminator"}, - {"{x=3,,y=4}", "unexpected comma"}, - {"{x=3,\ny=4}", "newlines not allowed"}, - {"{x=3\n,y=4}", "newlines not allowed"}, - } { - var x struct{ A map[string]int } - input := "a = " + tt.s - _, err := Decode(input, &x) - if err == nil { - t.Errorf("Decode(%q): got nil, want error containing %q", - input, tt.want) - continue - } - if !strings.Contains(err.Error(), tt.want) { - t.Errorf("Decode(%q): got %q, want error containing %q", - input, err, tt.want) - } - } -} - -type menu struct { - Dishes map[string]dish -} - -func (m *menu) UnmarshalTOML(p interface{}) error { - m.Dishes = make(map[string]dish) - data, _ := p.(map[string]interface{}) - dishes := data["dishes"].(map[string]interface{}) - for n, v := range dishes { - if d, ok := v.(map[string]interface{}); ok { - nd := dish{} - nd.UnmarshalTOML(d) - m.Dishes[n] = nd - } else { - return fmt.Errorf("not a dish") - } - } - return nil -} - -type dish struct { - Name string - Price float32 - Ingredients []ingredient -} - -func (d *dish) UnmarshalTOML(p interface{}) error { - data, _ := p.(map[string]interface{}) - d.Name, _ = data["name"].(string) - d.Price, _ = data["price"].(float32) - ingredients, _ := data["ingredients"].([]map[string]interface{}) - for _, e := range ingredients { - n, _ := interface{}(e).(map[string]interface{}) - name, _ := n["name"].(string) - i := ingredient{name} - d.Ingredients = append(d.Ingredients, i) - } - return nil -} - -type ingredient struct { - Name string -} - -func TestDecodeSlices(t *testing.T) { - type T struct { - S []string - } - for i, tt := range []struct { - v T - input string - want T - }{ - {T{}, "", T{}}, - {T{[]string{}}, "", T{[]string{}}}, - {T{[]string{"a", "b"}}, "", T{[]string{"a", "b"}}}, - {T{}, "S = []", T{[]string{}}}, - {T{[]string{}}, "S = []", T{[]string{}}}, - {T{[]string{"a", "b"}}, "S = []", T{[]string{}}}, - {T{}, `S = ["x"]`, T{[]string{"x"}}}, - {T{[]string{}}, `S = ["x"]`, T{[]string{"x"}}}, - {T{[]string{"a", "b"}}, `S = ["x"]`, T{[]string{"x"}}}, - } { - if _, err := Decode(tt.input, &tt.v); err != nil { - t.Errorf("[%d] %s", i, err) - continue - } - if !reflect.DeepEqual(tt.v, tt.want) { - t.Errorf("[%d] got %#v; want %#v", i, tt.v, tt.want) - } - } -} - -func TestDecodePrimitive(t *testing.T) { - type S struct { - P Primitive - } - type T struct { - S []int - } - slicep := func(s []int) *[]int { return &s } - arrayp := func(a [2]int) *[2]int { return &a } - mapp := func(m map[string]int) *map[string]int { return &m } - for i, tt := range []struct { - v interface{} - input string - want interface{} - }{ - // slices - {slicep(nil), "", slicep(nil)}, - {slicep([]int{}), "", slicep([]int{})}, - {slicep([]int{1, 2, 3}), "", slicep([]int{1, 2, 3})}, - {slicep(nil), "P = [1,2]", slicep([]int{1, 2})}, - {slicep([]int{}), "P = [1,2]", slicep([]int{1, 2})}, - {slicep([]int{1, 2, 3}), "P = [1,2]", slicep([]int{1, 2})}, - - // arrays - {arrayp([2]int{2, 3}), "", arrayp([2]int{2, 3})}, - {arrayp([2]int{2, 3}), "P = [3,4]", arrayp([2]int{3, 4})}, - - // maps - {mapp(nil), "", mapp(nil)}, - {mapp(map[string]int{}), "", mapp(map[string]int{})}, - {mapp(map[string]int{"a": 1}), "", mapp(map[string]int{"a": 1})}, - {mapp(nil), "[P]\na = 2", mapp(map[string]int{"a": 2})}, - {mapp(map[string]int{}), "[P]\na = 2", mapp(map[string]int{"a": 2})}, - {mapp(map[string]int{"a": 1, "b": 3}), "[P]\na = 2", mapp(map[string]int{"a": 2, "b": 3})}, - - // structs - {&T{nil}, "[P]", &T{nil}}, - {&T{[]int{}}, "[P]", &T{[]int{}}}, - {&T{[]int{1, 2, 3}}, "[P]", &T{[]int{1, 2, 3}}}, - {&T{nil}, "[P]\nS = [1,2]", &T{[]int{1, 2}}}, - {&T{[]int{}}, "[P]\nS = [1,2]", &T{[]int{1, 2}}}, - {&T{[]int{1, 2, 3}}, "[P]\nS = [1,2]", &T{[]int{1, 2}}}, - } { - var s S - md, err := Decode(tt.input, &s) - if err != nil { - t.Errorf("[%d] Decode error: %s", i, err) - continue - } - if err := md.PrimitiveDecode(s.P, tt.v); err != nil { - t.Errorf("[%d] PrimitiveDecode error: %s", i, err) - continue - } - if !reflect.DeepEqual(tt.v, tt.want) { - t.Errorf("[%d] got %#v; want %#v", i, tt.v, tt.want) - } - } -} - -func TestDecodeErrors(t *testing.T) { - for _, s := range []string{ - `x="`, - `x='`, - `x='''`, - - // Cases found by fuzzing in - // https://github.com/BurntSushi/toml/issues/155. - `""�`, // used to panic with index out of range - `e="""`, // used to hang - } { - var x struct{} - _, err := Decode(s, &x) - if err == nil { - t.Errorf("Decode(%q): got nil error", s) - } - } -} - -// Test for https://github.com/BurntSushi/toml/pull/166. -func TestDecodeBoolArray(t *testing.T) { - for _, tt := range []struct { - s string - got interface{} - want interface{} - }{ - { - "a = [true, false]", - &struct{ A []bool }{}, - &struct{ A []bool }{[]bool{true, false}}, - }, - { - "a = {a = true, b = false}", - &struct{ A map[string]bool }{}, - &struct{ A map[string]bool }{map[string]bool{"a": true, "b": false}}, - }, - } { - if _, err := Decode(tt.s, tt.got); err != nil { - t.Errorf("Decode(%q): %s", tt.s, err) - continue - } - if !reflect.DeepEqual(tt.got, tt.want) { - t.Errorf("Decode(%q): got %#v; want %#v", tt.s, tt.got, tt.want) - } - } -} - -func ExampleMetaData_PrimitiveDecode() { - var md MetaData - var err error - - var tomlBlob = ` -ranking = ["Springsteen", "J Geils"] - -[bands.Springsteen] -started = 1973 -albums = ["Greetings", "WIESS", "Born to Run", "Darkness"] - -[bands."J Geils"] -started = 1970 -albums = ["The J. Geils Band", "Full House", "Blow Your Face Out"] -` - - type band struct { - Started int - Albums []string - } - type classics struct { - Ranking []string - Bands map[string]Primitive - } - - // Do the initial decode. Reflection is delayed on Primitive values. - var music classics - if md, err = Decode(tomlBlob, &music); err != nil { - log.Fatal(err) - } - - // MetaData still includes information on Primitive values. - fmt.Printf("Is `bands.Springsteen` defined? %v\n", - md.IsDefined("bands", "Springsteen")) - - // Decode primitive data into Go values. - for _, artist := range music.Ranking { - // A band is a primitive value, so we need to decode it to get a - // real `band` value. - primValue := music.Bands[artist] - - var aBand band - if err = md.PrimitiveDecode(primValue, &aBand); err != nil { - log.Fatal(err) - } - fmt.Printf("%s started in %d.\n", artist, aBand.Started) - } - // Check to see if there were any fields left undecoded. - // Note that this won't be empty before decoding the Primitive value! - fmt.Printf("Undecoded: %q\n", md.Undecoded()) - - // Output: - // Is `bands.Springsteen` defined? true - // Springsteen started in 1973. - // J Geils started in 1970. - // Undecoded: [] -} - -func ExampleDecode() { - var tomlBlob = ` -# Some comments. -[alpha] -ip = "10.0.0.1" - - [alpha.config] - Ports = [ 8001, 8002 ] - Location = "Toronto" - Created = 1987-07-05T05:45:00Z - -[beta] -ip = "10.0.0.2" - - [beta.config] - Ports = [ 9001, 9002 ] - Location = "New Jersey" - Created = 1887-01-05T05:55:00Z -` - - type serverConfig struct { - Ports []int - Location string - Created time.Time - } - - type server struct { - IP string `toml:"ip,omitempty"` - Config serverConfig `toml:"config"` - } - - type servers map[string]server - - var config servers - if _, err := Decode(tomlBlob, &config); err != nil { - log.Fatal(err) - } - - for _, name := range []string{"alpha", "beta"} { - s := config[name] - fmt.Printf("Server: %s (ip: %s) in %s created on %s\n", - name, s.IP, s.Config.Location, - s.Config.Created.Format("2006-01-02")) - fmt.Printf("Ports: %v\n", s.Config.Ports) - } - - // Output: - // Server: alpha (ip: 10.0.0.1) in Toronto created on 1987-07-05 - // Ports: [8001 8002] - // Server: beta (ip: 10.0.0.2) in New Jersey created on 1887-01-05 - // Ports: [9001 9002] -} - -type duration struct { - time.Duration -} - -func (d *duration) UnmarshalText(text []byte) error { - var err error - d.Duration, err = time.ParseDuration(string(text)) - return err -} - -// Example Unmarshaler shows how to decode TOML strings into your own -// custom data type. -func Example_unmarshaler() { - blob := ` -[[song]] -name = "Thunder Road" -duration = "4m49s" - -[[song]] -name = "Stairway to Heaven" -duration = "8m03s" -` - type song struct { - Name string - Duration duration - } - type songs struct { - Song []song - } - var favorites songs - if _, err := Decode(blob, &favorites); err != nil { - log.Fatal(err) - } - - // Code to implement the TextUnmarshaler interface for `duration`: - // - // type duration struct { - // time.Duration - // } - // - // func (d *duration) UnmarshalText(text []byte) error { - // var err error - // d.Duration, err = time.ParseDuration(string(text)) - // return err - // } - - for _, s := range favorites.Song { - fmt.Printf("%s (%s)\n", s.Name, s.Duration) - } - // Output: - // Thunder Road (4m49s) - // Stairway to Heaven (8m3s) -} - -// Example StrictDecoding shows how to detect whether there are keys in the -// TOML document that weren't decoded into the value given. This is useful -// for returning an error to the user if they've included extraneous fields -// in their configuration. -func Example_strictDecoding() { - var blob = ` -key1 = "value1" -key2 = "value2" -key3 = "value3" -` - type config struct { - Key1 string - Key3 string - } - - var conf config - md, err := Decode(blob, &conf) - if err != nil { - log.Fatal(err) - } - fmt.Printf("Undecoded keys: %q\n", md.Undecoded()) - // Output: - // Undecoded keys: ["key2"] -} - -// Example UnmarshalTOML shows how to implement a struct type that knows how to -// unmarshal itself. The struct must take full responsibility for mapping the -// values passed into the struct. The method may be used with interfaces in a -// struct in cases where the actual type is not known until the data is -// examined. -func Example_unmarshalTOML() { - - var blob = ` -[[parts]] -type = "valve" -id = "valve-1" -size = 1.2 -rating = 4 - -[[parts]] -type = "valve" -id = "valve-2" -size = 2.1 -rating = 5 - -[[parts]] -type = "pipe" -id = "pipe-1" -length = 2.1 -diameter = 12 - -[[parts]] -type = "cable" -id = "cable-1" -length = 12 -rating = 3.1 -` - o := &order{} - err := Unmarshal([]byte(blob), o) - if err != nil { - log.Fatal(err) - } - - fmt.Println(len(o.parts)) - - for _, part := range o.parts { - fmt.Println(part.Name()) - } - - // Code to implement UmarshalJSON. - - // type order struct { - // // NOTE `order.parts` is a private slice of type `part` which is an - // // interface and may only be loaded from toml using the - // // UnmarshalTOML() method of the Umarshaler interface. - // parts parts - // } - - // func (o *order) UnmarshalTOML(data interface{}) error { - - // // NOTE the example below contains detailed type casting to show how - // // the 'data' is retrieved. In operational use, a type cast wrapper - // // may be preferred e.g. - // // - // // func AsMap(v interface{}) (map[string]interface{}, error) { - // // return v.(map[string]interface{}) - // // } - // // - // // resulting in: - // // d, _ := AsMap(data) - // // - - // d, _ := data.(map[string]interface{}) - // parts, _ := d["parts"].([]map[string]interface{}) - - // for _, p := range parts { - - // typ, _ := p["type"].(string) - // id, _ := p["id"].(string) - - // // detect the type of part and handle each case - // switch p["type"] { - // case "valve": - - // size := float32(p["size"].(float64)) - // rating := int(p["rating"].(int64)) - - // valve := &valve{ - // Type: typ, - // ID: id, - // Size: size, - // Rating: rating, - // } - - // o.parts = append(o.parts, valve) - - // case "pipe": - - // length := float32(p["length"].(float64)) - // diameter := int(p["diameter"].(int64)) - - // pipe := &pipe{ - // Type: typ, - // ID: id, - // Length: length, - // Diameter: diameter, - // } - - // o.parts = append(o.parts, pipe) - - // case "cable": - - // length := int(p["length"].(int64)) - // rating := float32(p["rating"].(float64)) - - // cable := &cable{ - // Type: typ, - // ID: id, - // Length: length, - // Rating: rating, - // } - - // o.parts = append(o.parts, cable) - - // } - // } - - // return nil - // } - - // type parts []part - - // type part interface { - // Name() string - // } - - // type valve struct { - // Type string - // ID string - // Size float32 - // Rating int - // } - - // func (v *valve) Name() string { - // return fmt.Sprintf("VALVE: %s", v.ID) - // } - - // type pipe struct { - // Type string - // ID string - // Length float32 - // Diameter int - // } - - // func (p *pipe) Name() string { - // return fmt.Sprintf("PIPE: %s", p.ID) - // } - - // type cable struct { - // Type string - // ID string - // Length int - // Rating float32 - // } - - // func (c *cable) Name() string { - // return fmt.Sprintf("CABLE: %s", c.ID) - // } - - // Output: - // 4 - // VALVE: valve-1 - // VALVE: valve-2 - // PIPE: pipe-1 - // CABLE: cable-1 - -} - -type order struct { - // NOTE `order.parts` is a private slice of type `part` which is an - // interface and may only be loaded from toml using the UnmarshalTOML() - // method of the Umarshaler interface. - parts parts -} - -func (o *order) UnmarshalTOML(data interface{}) error { - - // NOTE the example below contains detailed type casting to show how - // the 'data' is retrieved. In operational use, a type cast wrapper - // may be preferred e.g. - // - // func AsMap(v interface{}) (map[string]interface{}, error) { - // return v.(map[string]interface{}) - // } - // - // resulting in: - // d, _ := AsMap(data) - // - - d, _ := data.(map[string]interface{}) - parts, _ := d["parts"].([]map[string]interface{}) - - for _, p := range parts { - - typ, _ := p["type"].(string) - id, _ := p["id"].(string) - - // detect the type of part and handle each case - switch p["type"] { - case "valve": - - size := float32(p["size"].(float64)) - rating := int(p["rating"].(int64)) - - valve := &valve{ - Type: typ, - ID: id, - Size: size, - Rating: rating, - } - - o.parts = append(o.parts, valve) - - case "pipe": - - length := float32(p["length"].(float64)) - diameter := int(p["diameter"].(int64)) - - pipe := &pipe{ - Type: typ, - ID: id, - Length: length, - Diameter: diameter, - } - - o.parts = append(o.parts, pipe) - - case "cable": - - length := int(p["length"].(int64)) - rating := float32(p["rating"].(float64)) - - cable := &cable{ - Type: typ, - ID: id, - Length: length, - Rating: rating, - } - - o.parts = append(o.parts, cable) - - } - } - - return nil -} - -type parts []part - -type part interface { - Name() string -} - -type valve struct { - Type string - ID string - Size float32 - Rating int -} - -func (v *valve) Name() string { - return fmt.Sprintf("VALVE: %s", v.ID) -} - -type pipe struct { - Type string - ID string - Length float32 - Diameter int -} - -func (p *pipe) Name() string { - return fmt.Sprintf("PIPE: %s", p.ID) -} - -type cable struct { - Type string - ID string - Length int - Rating float32 -} - -func (c *cable) Name() string { - return fmt.Sprintf("CABLE: %s", c.ID) -} diff --git a/vendor/github.com/burntsushi/toml/encode_test.go b/vendor/github.com/burntsushi/toml/encode_test.go deleted file mode 100644 index 673b7b0..0000000 --- a/vendor/github.com/burntsushi/toml/encode_test.go +++ /dev/null @@ -1,615 +0,0 @@ -package toml - -import ( - "bytes" - "fmt" - "log" - "net" - "testing" - "time" -) - -func TestEncodeRoundTrip(t *testing.T) { - type Config struct { - Age int - Cats []string - Pi float64 - Perfection []int - DOB time.Time - Ipaddress net.IP - } - - var inputs = Config{ - 13, - []string{"one", "two", "three"}, - 3.145, - []int{11, 2, 3, 4}, - time.Now(), - net.ParseIP("192.168.59.254"), - } - - var firstBuffer bytes.Buffer - e := NewEncoder(&firstBuffer) - err := e.Encode(inputs) - if err != nil { - t.Fatal(err) - } - var outputs Config - if _, err := Decode(firstBuffer.String(), &outputs); err != nil { - t.Logf("Could not decode:\n-----\n%s\n-----\n", - firstBuffer.String()) - t.Fatal(err) - } - - // could test each value individually, but I'm lazy - var secondBuffer bytes.Buffer - e2 := NewEncoder(&secondBuffer) - err = e2.Encode(outputs) - if err != nil { - t.Fatal(err) - } - if firstBuffer.String() != secondBuffer.String() { - t.Error( - firstBuffer.String(), - "\n\n is not identical to\n\n", - secondBuffer.String()) - } -} - -// XXX(burntsushi) -// I think these tests probably should be removed. They are good, but they -// ought to be obsolete by toml-test. -func TestEncode(t *testing.T) { - type Embedded struct { - Int int `toml:"_int"` - } - type NonStruct int - - date := time.Date(2014, 5, 11, 20, 30, 40, 0, time.FixedZone("IST", 3600)) - dateStr := "2014-05-11T19:30:40Z" - - tests := map[string]struct { - input interface{} - wantOutput string - wantError error - }{ - "bool field": { - input: struct { - BoolTrue bool - BoolFalse bool - }{true, false}, - wantOutput: "BoolTrue = true\nBoolFalse = false\n", - }, - "int fields": { - input: struct { - Int int - Int8 int8 - Int16 int16 - Int32 int32 - Int64 int64 - }{1, 2, 3, 4, 5}, - wantOutput: "Int = 1\nInt8 = 2\nInt16 = 3\nInt32 = 4\nInt64 = 5\n", - }, - "uint fields": { - input: struct { - Uint uint - Uint8 uint8 - Uint16 uint16 - Uint32 uint32 - Uint64 uint64 - }{1, 2, 3, 4, 5}, - wantOutput: "Uint = 1\nUint8 = 2\nUint16 = 3\nUint32 = 4" + - "\nUint64 = 5\n", - }, - "float fields": { - input: struct { - Float32 float32 - Float64 float64 - }{1.5, 2.5}, - wantOutput: "Float32 = 1.5\nFloat64 = 2.5\n", - }, - "string field": { - input: struct{ String string }{"foo"}, - wantOutput: "String = \"foo\"\n", - }, - "string field and unexported field": { - input: struct { - String string - unexported int - }{"foo", 0}, - wantOutput: "String = \"foo\"\n", - }, - "datetime field in UTC": { - input: struct{ Date time.Time }{date}, - wantOutput: fmt.Sprintf("Date = %s\n", dateStr), - }, - "datetime field as primitive": { - // Using a map here to fail if isStructOrMap() returns true for - // time.Time. - input: map[string]interface{}{ - "Date": date, - "Int": 1, - }, - wantOutput: fmt.Sprintf("Date = %s\nInt = 1\n", dateStr), - }, - "array fields": { - input: struct { - IntArray0 [0]int - IntArray3 [3]int - }{[0]int{}, [3]int{1, 2, 3}}, - wantOutput: "IntArray0 = []\nIntArray3 = [1, 2, 3]\n", - }, - "slice fields": { - input: struct{ IntSliceNil, IntSlice0, IntSlice3 []int }{ - nil, []int{}, []int{1, 2, 3}, - }, - wantOutput: "IntSlice0 = []\nIntSlice3 = [1, 2, 3]\n", - }, - "datetime slices": { - input: struct{ DatetimeSlice []time.Time }{ - []time.Time{date, date}, - }, - wantOutput: fmt.Sprintf("DatetimeSlice = [%s, %s]\n", - dateStr, dateStr), - }, - "nested arrays and slices": { - input: struct { - SliceOfArrays [][2]int - ArrayOfSlices [2][]int - SliceOfArraysOfSlices [][2][]int - ArrayOfSlicesOfArrays [2][][2]int - SliceOfMixedArrays [][2]interface{} - ArrayOfMixedSlices [2][]interface{} - }{ - [][2]int{{1, 2}, {3, 4}}, - [2][]int{{1, 2}, {3, 4}}, - [][2][]int{ - { - {1, 2}, {3, 4}, - }, - { - {5, 6}, {7, 8}, - }, - }, - [2][][2]int{ - { - {1, 2}, {3, 4}, - }, - { - {5, 6}, {7, 8}, - }, - }, - [][2]interface{}{ - {1, 2}, {"a", "b"}, - }, - [2][]interface{}{ - {1, 2}, {"a", "b"}, - }, - }, - wantOutput: `SliceOfArrays = [[1, 2], [3, 4]] -ArrayOfSlices = [[1, 2], [3, 4]] -SliceOfArraysOfSlices = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] -ArrayOfSlicesOfArrays = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] -SliceOfMixedArrays = [[1, 2], ["a", "b"]] -ArrayOfMixedSlices = [[1, 2], ["a", "b"]] -`, - }, - "empty slice": { - input: struct{ Empty []interface{} }{[]interface{}{}}, - wantOutput: "Empty = []\n", - }, - "(error) slice with element type mismatch (string and integer)": { - input: struct{ Mixed []interface{} }{[]interface{}{1, "a"}}, - wantError: errArrayMixedElementTypes, - }, - "(error) slice with element type mismatch (integer and float)": { - input: struct{ Mixed []interface{} }{[]interface{}{1, 2.5}}, - wantError: errArrayMixedElementTypes, - }, - "slice with elems of differing Go types, same TOML types": { - input: struct { - MixedInts []interface{} - MixedFloats []interface{} - }{ - []interface{}{ - int(1), int8(2), int16(3), int32(4), int64(5), - uint(1), uint8(2), uint16(3), uint32(4), uint64(5), - }, - []interface{}{float32(1.5), float64(2.5)}, - }, - wantOutput: "MixedInts = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]\n" + - "MixedFloats = [1.5, 2.5]\n", - }, - "(error) slice w/ element type mismatch (one is nested array)": { - input: struct{ Mixed []interface{} }{ - []interface{}{1, []interface{}{2}}, - }, - wantError: errArrayMixedElementTypes, - }, - "(error) slice with 1 nil element": { - input: struct{ NilElement1 []interface{} }{[]interface{}{nil}}, - wantError: errArrayNilElement, - }, - "(error) slice with 1 nil element (and other non-nil elements)": { - input: struct{ NilElement []interface{} }{ - []interface{}{1, nil}, - }, - wantError: errArrayNilElement, - }, - "simple map": { - input: map[string]int{"a": 1, "b": 2}, - wantOutput: "a = 1\nb = 2\n", - }, - "map with interface{} value type": { - input: map[string]interface{}{"a": 1, "b": "c"}, - wantOutput: "a = 1\nb = \"c\"\n", - }, - "map with interface{} value type, some of which are structs": { - input: map[string]interface{}{ - "a": struct{ Int int }{2}, - "b": 1, - }, - wantOutput: "b = 1\n\n[a]\n Int = 2\n", - }, - "nested map": { - input: map[string]map[string]int{ - "a": {"b": 1}, - "c": {"d": 2}, - }, - wantOutput: "[a]\n b = 1\n\n[c]\n d = 2\n", - }, - "nested struct": { - input: struct{ Struct struct{ Int int } }{ - struct{ Int int }{1}, - }, - wantOutput: "[Struct]\n Int = 1\n", - }, - "nested struct and non-struct field": { - input: struct { - Struct struct{ Int int } - Bool bool - }{struct{ Int int }{1}, true}, - wantOutput: "Bool = true\n\n[Struct]\n Int = 1\n", - }, - "2 nested structs": { - input: struct{ Struct1, Struct2 struct{ Int int } }{ - struct{ Int int }{1}, struct{ Int int }{2}, - }, - wantOutput: "[Struct1]\n Int = 1\n\n[Struct2]\n Int = 2\n", - }, - "deeply nested structs": { - input: struct { - Struct1, Struct2 struct{ Struct3 *struct{ Int int } } - }{ - struct{ Struct3 *struct{ Int int } }{&struct{ Int int }{1}}, - struct{ Struct3 *struct{ Int int } }{nil}, - }, - wantOutput: "[Struct1]\n [Struct1.Struct3]\n Int = 1" + - "\n\n[Struct2]\n", - }, - "nested struct with nil struct elem": { - input: struct { - Struct struct{ Inner *struct{ Int int } } - }{ - struct{ Inner *struct{ Int int } }{nil}, - }, - wantOutput: "[Struct]\n", - }, - "nested struct with no fields": { - input: struct { - Struct struct{ Inner struct{} } - }{ - struct{ Inner struct{} }{struct{}{}}, - }, - wantOutput: "[Struct]\n [Struct.Inner]\n", - }, - "struct with tags": { - input: struct { - Struct struct { - Int int `toml:"_int"` - } `toml:"_struct"` - Bool bool `toml:"_bool"` - }{ - struct { - Int int `toml:"_int"` - }{1}, true, - }, - wantOutput: "_bool = true\n\n[_struct]\n _int = 1\n", - }, - "embedded struct": { - input: struct{ Embedded }{Embedded{1}}, - wantOutput: "_int = 1\n", - }, - "embedded *struct": { - input: struct{ *Embedded }{&Embedded{1}}, - wantOutput: "_int = 1\n", - }, - "nested embedded struct": { - input: struct { - Struct struct{ Embedded } `toml:"_struct"` - }{struct{ Embedded }{Embedded{1}}}, - wantOutput: "[_struct]\n _int = 1\n", - }, - "nested embedded *struct": { - input: struct { - Struct struct{ *Embedded } `toml:"_struct"` - }{struct{ *Embedded }{&Embedded{1}}}, - wantOutput: "[_struct]\n _int = 1\n", - }, - "embedded non-struct": { - input: struct{ NonStruct }{5}, - wantOutput: "NonStruct = 5\n", - }, - "array of tables": { - input: struct { - Structs []*struct{ Int int } `toml:"struct"` - }{ - []*struct{ Int int }{{1}, {3}}, - }, - wantOutput: "[[struct]]\n Int = 1\n\n[[struct]]\n Int = 3\n", - }, - "array of tables order": { - input: map[string]interface{}{ - "map": map[string]interface{}{ - "zero": 5, - "arr": []map[string]int{ - { - "friend": 5, - }, - }, - }, - }, - wantOutput: "[map]\n zero = 5\n\n [[map.arr]]\n friend = 5\n", - }, - "(error) top-level slice": { - input: []struct{ Int int }{{1}, {2}, {3}}, - wantError: errNoKey, - }, - "(error) slice of slice": { - input: struct { - Slices [][]struct{ Int int } - }{ - [][]struct{ Int int }{{{1}}, {{2}}, {{3}}}, - }, - wantError: errArrayNoTable, - }, - "(error) map no string key": { - input: map[int]string{1: ""}, - wantError: errNonString, - }, - "(error) empty key name": { - input: map[string]int{"": 1}, - wantError: errAnything, - }, - "(error) empty map name": { - input: map[string]interface{}{ - "": map[string]int{"v": 1}, - }, - wantError: errAnything, - }, - } - for label, test := range tests { - encodeExpected(t, label, test.input, test.wantOutput, test.wantError) - } -} - -func TestEncodeNestedTableArrays(t *testing.T) { - type song struct { - Name string `toml:"name"` - } - type album struct { - Name string `toml:"name"` - Songs []song `toml:"songs"` - } - type springsteen struct { - Albums []album `toml:"albums"` - } - value := springsteen{ - []album{ - {"Born to Run", - []song{{"Jungleland"}, {"Meeting Across the River"}}}, - {"Born in the USA", - []song{{"Glory Days"}, {"Dancing in the Dark"}}}, - }, - } - expected := `[[albums]] - name = "Born to Run" - - [[albums.songs]] - name = "Jungleland" - - [[albums.songs]] - name = "Meeting Across the River" - -[[albums]] - name = "Born in the USA" - - [[albums.songs]] - name = "Glory Days" - - [[albums.songs]] - name = "Dancing in the Dark" -` - encodeExpected(t, "nested table arrays", value, expected, nil) -} - -func TestEncodeArrayHashWithNormalHashOrder(t *testing.T) { - type Alpha struct { - V int - } - type Beta struct { - V int - } - type Conf struct { - V int - A Alpha - B []Beta - } - - val := Conf{ - V: 1, - A: Alpha{2}, - B: []Beta{{3}}, - } - expected := "V = 1\n\n[A]\n V = 2\n\n[[B]]\n V = 3\n" - encodeExpected(t, "array hash with normal hash order", val, expected, nil) -} - -func TestEncodeWithOmitEmpty(t *testing.T) { - type simple struct { - Bool bool `toml:"bool,omitempty"` - String string `toml:"string,omitempty"` - Array [0]byte `toml:"array,omitempty"` - Slice []int `toml:"slice,omitempty"` - Map map[string]string `toml:"map,omitempty"` - } - - var v simple - encodeExpected(t, "fields with omitempty are omitted when empty", v, "", nil) - v = simple{ - Bool: true, - String: " ", - Slice: []int{2, 3, 4}, - Map: map[string]string{"foo": "bar"}, - } - expected := `bool = true -string = " " -slice = [2, 3, 4] - -[map] - foo = "bar" -` - encodeExpected(t, "fields with omitempty are not omitted when non-empty", - v, expected, nil) -} - -func TestEncodeWithOmitZero(t *testing.T) { - type simple struct { - Number int `toml:"number,omitzero"` - Real float64 `toml:"real,omitzero"` - Unsigned uint `toml:"unsigned,omitzero"` - } - - value := simple{0, 0.0, uint(0)} - expected := "" - - encodeExpected(t, "simple with omitzero, all zero", value, expected, nil) - - value.Number = 10 - value.Real = 20 - value.Unsigned = 5 - expected = `number = 10 -real = 20.0 -unsigned = 5 -` - encodeExpected(t, "simple with omitzero, non-zero", value, expected, nil) -} - -func TestEncodeOmitemptyWithEmptyName(t *testing.T) { - type simple struct { - S []int `toml:",omitempty"` - } - v := simple{[]int{1, 2, 3}} - expected := "S = [1, 2, 3]\n" - encodeExpected(t, "simple with omitempty, no name, non-empty field", - v, expected, nil) -} - -func TestEncodeAnonymousStruct(t *testing.T) { - type Inner struct{ N int } - type Outer0 struct{ Inner } - type Outer1 struct { - Inner `toml:"inner"` - } - - v0 := Outer0{Inner{3}} - expected := "N = 3\n" - encodeExpected(t, "embedded anonymous untagged struct", v0, expected, nil) - - v1 := Outer1{Inner{3}} - expected = "[inner]\n N = 3\n" - encodeExpected(t, "embedded anonymous tagged struct", v1, expected, nil) -} - -func TestEncodeAnonymousStructPointerField(t *testing.T) { - type Inner struct{ N int } - type Outer0 struct{ *Inner } - type Outer1 struct { - *Inner `toml:"inner"` - } - - v0 := Outer0{} - expected := "" - encodeExpected(t, "nil anonymous untagged struct pointer field", v0, expected, nil) - - v0 = Outer0{&Inner{3}} - expected = "N = 3\n" - encodeExpected(t, "non-nil anonymous untagged struct pointer field", v0, expected, nil) - - v1 := Outer1{} - expected = "" - encodeExpected(t, "nil anonymous tagged struct pointer field", v1, expected, nil) - - v1 = Outer1{&Inner{3}} - expected = "[inner]\n N = 3\n" - encodeExpected(t, "non-nil anonymous tagged struct pointer field", v1, expected, nil) -} - -func TestEncodeIgnoredFields(t *testing.T) { - type simple struct { - Number int `toml:"-"` - } - value := simple{} - expected := "" - encodeExpected(t, "ignored field", value, expected, nil) -} - -func encodeExpected( - t *testing.T, label string, val interface{}, wantStr string, wantErr error, -) { - var buf bytes.Buffer - enc := NewEncoder(&buf) - err := enc.Encode(val) - if err != wantErr { - if wantErr != nil { - if wantErr == errAnything && err != nil { - return - } - t.Errorf("%s: want Encode error %v, got %v", label, wantErr, err) - } else { - t.Errorf("%s: Encode failed: %s", label, err) - } - } - if err != nil { - return - } - if got := buf.String(); wantStr != got { - t.Errorf("%s: want\n-----\n%q\n-----\nbut got\n-----\n%q\n-----\n", - label, wantStr, got) - } -} - -func ExampleEncoder_Encode() { - date, _ := time.Parse(time.RFC822, "14 Mar 10 18:00 UTC") - var config = map[string]interface{}{ - "date": date, - "counts": []int{1, 1, 2, 3, 5, 8}, - "hash": map[string]string{ - "key1": "val1", - "key2": "val2", - }, - } - buf := new(bytes.Buffer) - if err := NewEncoder(buf).Encode(config); err != nil { - log.Fatal(err) - } - fmt.Println(buf.String()) - - // Output: - // counts = [1, 1, 2, 3, 5, 8] - // date = 2010-03-14T18:00:00Z - // - // [hash] - // key1 = "val1" - // key2 = "val2" -} diff --git a/vendor/github.com/golang/freetype/AUTHORS b/vendor/github.com/golang/freetype/AUTHORS deleted file mode 100644 index 5773ac7..0000000 --- a/vendor/github.com/golang/freetype/AUTHORS +++ /dev/null @@ -1,20 +0,0 @@ -# This is the official list of Freetype-Go authors for copyright purposes. -# This file is distinct from the CONTRIBUTORS files. -# See the latter for an explanation. -# -# Freetype-Go is derived from Freetype, which is written in C. The latter -# is copyright 1996-2010 David Turner, Robert Wilhelm, and Werner Lemberg. - -# Names should be added to this file as -# Name or Organization -# The email address is not required for organizations. - -# Please keep the list sorted. - -Google Inc. -Jeff R. Allen -Maksim Kochkin -Michael Fogleman -Rémy Oudompheng -Roger Peppe -Steven Edwards diff --git a/vendor/github.com/golang/freetype/CONTRIBUTORS b/vendor/github.com/golang/freetype/CONTRIBUTORS deleted file mode 100644 index 7a1b0a2..0000000 --- a/vendor/github.com/golang/freetype/CONTRIBUTORS +++ /dev/null @@ -1,38 +0,0 @@ -# This is the official list of people who can contribute -# (and typically have contributed) code to the Freetype-Go repository. -# The AUTHORS file lists the copyright holders; this file -# lists people. For example, Google employees are listed here -# but not in AUTHORS, because Google holds the copyright. -# -# The submission process automatically checks to make sure -# that people submitting code are listed in this file (by email address). -# -# Names should be added to this file only after verifying that -# the individual or the individual's organization has agreed to -# the appropriate Contributor License Agreement, found here: -# -# http://code.google.com/legal/individual-cla-v1.0.html -# http://code.google.com/legal/corporate-cla-v1.0.html -# -# The agreement for individuals can be filled out on the web. -# -# When adding J Random Contributor's name to this file, -# either J's name or J's organization's name should be -# added to the AUTHORS file, depending on whether the -# individual or corporate CLA was used. - -# Names should be added to this file like so: -# Name - -# Please keep the list sorted. - -Andrew Gerrand -Jeff R. Allen -Maksim Kochkin -Michael Fogleman -Nigel Tao -Rémy Oudompheng -Rob Pike -Roger Peppe -Russ Cox -Steven Edwards diff --git a/vendor/github.com/golang/freetype/LICENSE b/vendor/github.com/golang/freetype/LICENSE deleted file mode 100644 index e854ba5..0000000 --- a/vendor/github.com/golang/freetype/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Use of the Freetype-Go software is subject to your choice of exactly one of -the following two licenses: - * The FreeType License, which is similar to the original BSD license with - an advertising clause, or - * The GNU General Public License (GPL), version 2 or later. - -The text of these licenses are available in the licenses/ftl.txt and the -licenses/gpl.txt files respectively. They are also available at -http://freetype.sourceforge.net/license.html - -The Luxi fonts in the testdata directory are licensed separately. See the -testdata/COPYING file for details. diff --git a/vendor/github.com/golang/freetype/README b/vendor/github.com/golang/freetype/README deleted file mode 100644 index 39b3d82..0000000 --- a/vendor/github.com/golang/freetype/README +++ /dev/null @@ -1,21 +0,0 @@ -The Freetype font rasterizer in the Go programming language. - -To download and install from source: -$ go get github.com/golang/freetype - -It is an incomplete port: - * It only supports TrueType fonts, and not Type 1 fonts nor bitmap fonts. - * It only supports the Unicode encoding. - -There are also some implementation differences: - * It uses a 26.6 fixed point co-ordinate system everywhere internally, - as opposed to the original Freetype's mix of 26.6 (or 10.6 for 16-bit - systems) in some places, and 24.8 in the "smooth" rasterizer. - -Freetype-Go is derived from Freetype, which is written in C. Freetype is -copyright 1996-2010 David Turner, Robert Wilhelm, and Werner Lemberg. -Freetype-Go is copyright The Freetype-Go Authors, who are listed in the -AUTHORS file. - -Unless otherwise noted, the Freetype-Go source files are distributed -under the BSD-style license found in the LICENSE file. diff --git a/vendor/github.com/golang/freetype/freetype.go b/vendor/github.com/golang/freetype/freetype.go deleted file mode 100644 index 9603586..0000000 --- a/vendor/github.com/golang/freetype/freetype.go +++ /dev/null @@ -1,341 +0,0 @@ -// Copyright 2010 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -// The freetype package provides a convenient API to draw text onto an image. -// Use the freetype/raster and freetype/truetype packages for lower level -// control over rasterization and TrueType parsing. -package freetype // import "github.com/golang/freetype" - -import ( - "errors" - "image" - "image/draw" - - "github.com/golang/freetype/raster" - "github.com/golang/freetype/truetype" - "golang.org/x/image/font" - "golang.org/x/image/math/fixed" -) - -// These constants determine the size of the glyph cache. The cache is keyed -// primarily by the glyph index modulo nGlyphs, and secondarily by sub-pixel -// position for the mask image. Sub-pixel positions are quantized to -// nXFractions possible values in both the x and y directions. -const ( - nGlyphs = 256 - nXFractions = 4 - nYFractions = 1 -) - -// An entry in the glyph cache is keyed explicitly by the glyph index and -// implicitly by the quantized x and y fractional offset. It maps to a mask -// image and an offset. -type cacheEntry struct { - valid bool - glyph truetype.Index - advanceWidth fixed.Int26_6 - mask *image.Alpha - offset image.Point -} - -// ParseFont just calls the Parse function from the freetype/truetype package. -// It is provided here so that code that imports this package doesn't need -// to also include the freetype/truetype package. -func ParseFont(b []byte) (*truetype.Font, error) { - return truetype.Parse(b) -} - -// Pt converts from a co-ordinate pair measured in pixels to a fixed.Point26_6 -// co-ordinate pair measured in fixed.Int26_6 units. -func Pt(x, y int) fixed.Point26_6 { - return fixed.Point26_6{ - X: fixed.Int26_6(x << 6), - Y: fixed.Int26_6(y << 6), - } -} - -// A Context holds the state for drawing text in a given font and size. -type Context struct { - r *raster.Rasterizer - f *truetype.Font - glyphBuf truetype.GlyphBuf - // clip is the clip rectangle for drawing. - clip image.Rectangle - // dst and src are the destination and source images for drawing. - dst draw.Image - src image.Image - // fontSize and dpi are used to calculate scale. scale is the number of - // 26.6 fixed point units in 1 em. hinting is the hinting policy. - fontSize, dpi float64 - scale fixed.Int26_6 - hinting font.Hinting - // cache is the glyph cache. - cache [nGlyphs * nXFractions * nYFractions]cacheEntry -} - -// PointToFixed converts the given number of points (as in "a 12 point font") -// into a 26.6 fixed point number of pixels. -func (c *Context) PointToFixed(x float64) fixed.Int26_6 { - return fixed.Int26_6(x * float64(c.dpi) * (64.0 / 72.0)) -} - -// drawContour draws the given closed contour with the given offset. -func (c *Context) drawContour(ps []truetype.Point, dx, dy fixed.Int26_6) { - if len(ps) == 0 { - return - } - - // The low bit of each point's Flags value is whether the point is on the - // curve. Truetype fonts only have quadratic Bézier curves, not cubics. - // Thus, two consecutive off-curve points imply an on-curve point in the - // middle of those two. - // - // See http://chanae.walon.org/pub/ttf/ttf_glyphs.htm for more details. - - // ps[0] is a truetype.Point measured in FUnits and positive Y going - // upwards. start is the same thing measured in fixed point units and - // positive Y going downwards, and offset by (dx, dy). - start := fixed.Point26_6{ - X: dx + ps[0].X, - Y: dy - ps[0].Y, - } - others := []truetype.Point(nil) - if ps[0].Flags&0x01 != 0 { - others = ps[1:] - } else { - last := fixed.Point26_6{ - X: dx + ps[len(ps)-1].X, - Y: dy - ps[len(ps)-1].Y, - } - if ps[len(ps)-1].Flags&0x01 != 0 { - start = last - others = ps[:len(ps)-1] - } else { - start = fixed.Point26_6{ - X: (start.X + last.X) / 2, - Y: (start.Y + last.Y) / 2, - } - others = ps - } - } - c.r.Start(start) - q0, on0 := start, true - for _, p := range others { - q := fixed.Point26_6{ - X: dx + p.X, - Y: dy - p.Y, - } - on := p.Flags&0x01 != 0 - if on { - if on0 { - c.r.Add1(q) - } else { - c.r.Add2(q0, q) - } - } else { - if on0 { - // No-op. - } else { - mid := fixed.Point26_6{ - X: (q0.X + q.X) / 2, - Y: (q0.Y + q.Y) / 2, - } - c.r.Add2(q0, mid) - } - } - q0, on0 = q, on - } - // Close the curve. - if on0 { - c.r.Add1(start) - } else { - c.r.Add2(q0, start) - } -} - -// rasterize returns the advance width, glyph mask and integer-pixel offset -// to render the given glyph at the given sub-pixel offsets. -// The 26.6 fixed point arguments fx and fy must be in the range [0, 1). -func (c *Context) rasterize(glyph truetype.Index, fx, fy fixed.Int26_6) ( - fixed.Int26_6, *image.Alpha, image.Point, error) { - - if err := c.glyphBuf.Load(c.f, c.scale, glyph, c.hinting); err != nil { - return 0, nil, image.Point{}, err - } - // Calculate the integer-pixel bounds for the glyph. - xmin := int(fx+c.glyphBuf.Bounds.Min.X) >> 6 - ymin := int(fy-c.glyphBuf.Bounds.Max.Y) >> 6 - xmax := int(fx+c.glyphBuf.Bounds.Max.X+0x3f) >> 6 - ymax := int(fy-c.glyphBuf.Bounds.Min.Y+0x3f) >> 6 - if xmin > xmax || ymin > ymax { - return 0, nil, image.Point{}, errors.New("freetype: negative sized glyph") - } - // A TrueType's glyph's nodes can have negative co-ordinates, but the - // rasterizer clips anything left of x=0 or above y=0. xmin and ymin are - // the pixel offsets, based on the font's FUnit metrics, that let a - // negative co-ordinate in TrueType space be non-negative in rasterizer - // space. xmin and ymin are typically <= 0. - fx -= fixed.Int26_6(xmin << 6) - fy -= fixed.Int26_6(ymin << 6) - // Rasterize the glyph's vectors. - c.r.Clear() - e0 := 0 - for _, e1 := range c.glyphBuf.Ends { - c.drawContour(c.glyphBuf.Points[e0:e1], fx, fy) - e0 = e1 - } - a := image.NewAlpha(image.Rect(0, 0, xmax-xmin, ymax-ymin)) - c.r.Rasterize(raster.NewAlphaSrcPainter(a)) - return c.glyphBuf.AdvanceWidth, a, image.Point{xmin, ymin}, nil -} - -// glyph returns the advance width, glyph mask and integer-pixel offset to -// render the given glyph at the given sub-pixel point. It is a cache for the -// rasterize method. Unlike rasterize, p's co-ordinates do not have to be in -// the range [0, 1). -func (c *Context) glyph(glyph truetype.Index, p fixed.Point26_6) ( - fixed.Int26_6, *image.Alpha, image.Point, error) { - - // Split p.X and p.Y into their integer and fractional parts. - ix, fx := int(p.X>>6), p.X&0x3f - iy, fy := int(p.Y>>6), p.Y&0x3f - // Calculate the index t into the cache array. - tg := int(glyph) % nGlyphs - tx := int(fx) / (64 / nXFractions) - ty := int(fy) / (64 / nYFractions) - t := ((tg*nXFractions)+tx)*nYFractions + ty - // Check for a cache hit. - if e := c.cache[t]; e.valid && e.glyph == glyph { - return e.advanceWidth, e.mask, e.offset.Add(image.Point{ix, iy}), nil - } - // Rasterize the glyph and put the result into the cache. - advanceWidth, mask, offset, err := c.rasterize(glyph, fx, fy) - if err != nil { - return 0, nil, image.Point{}, err - } - c.cache[t] = cacheEntry{true, glyph, advanceWidth, mask, offset} - return advanceWidth, mask, offset.Add(image.Point{ix, iy}), nil -} - -// DrawString draws s at p and returns p advanced by the text extent. The text -// is placed so that the left edge of the em square of the first character of s -// and the baseline intersect at p. The majority of the affected pixels will be -// above and to the right of the point, but some may be below or to the left. -// For example, drawing a string that starts with a 'J' in an italic font may -// affect pixels below and left of the point. -// -// p is a fixed.Point26_6 and can therefore represent sub-pixel positions. -func (c *Context) DrawString(s string, p fixed.Point26_6) (fixed.Point26_6, error) { - if c.f == nil { - return fixed.Point26_6{}, errors.New("freetype: DrawText called with a nil font") - } - prev, hasPrev := truetype.Index(0), false - for _, rune := range s { - index := c.f.Index(rune) - if hasPrev { - kern := c.f.Kern(c.scale, prev, index) - if c.hinting != font.HintingNone { - kern = (kern + 32) &^ 63 - } - p.X += kern - } - advanceWidth, mask, offset, err := c.glyph(index, p) - if err != nil { - return fixed.Point26_6{}, err - } - p.X += advanceWidth - glyphRect := mask.Bounds().Add(offset) - dr := c.clip.Intersect(glyphRect) - if !dr.Empty() { - mp := image.Point{0, dr.Min.Y - glyphRect.Min.Y} - draw.DrawMask(c.dst, dr, c.src, image.ZP, mask, mp, draw.Over) - } - prev, hasPrev = index, true - } - return p, nil -} - -// recalc recalculates scale and bounds values from the font size, screen -// resolution and font metrics, and invalidates the glyph cache. -func (c *Context) recalc() { - c.scale = fixed.Int26_6(c.fontSize * c.dpi * (64.0 / 72.0)) - if c.f == nil { - c.r.SetBounds(0, 0) - } else { - // Set the rasterizer's bounds to be big enough to handle the largest glyph. - b := c.f.Bounds(c.scale) - xmin := +int(b.Min.X) >> 6 - ymin := -int(b.Max.Y) >> 6 - xmax := +int(b.Max.X+63) >> 6 - ymax := -int(b.Min.Y-63) >> 6 - c.r.SetBounds(xmax-xmin, ymax-ymin) - } - for i := range c.cache { - c.cache[i] = cacheEntry{} - } -} - -// SetDPI sets the screen resolution in dots per inch. -func (c *Context) SetDPI(dpi float64) { - if c.dpi == dpi { - return - } - c.dpi = dpi - c.recalc() -} - -// SetFont sets the font used to draw text. -func (c *Context) SetFont(f *truetype.Font) { - if c.f == f { - return - } - c.f = f - c.recalc() -} - -// SetFontSize sets the font size in points (as in "a 12 point font"). -func (c *Context) SetFontSize(fontSize float64) { - if c.fontSize == fontSize { - return - } - c.fontSize = fontSize - c.recalc() -} - -// SetHinting sets the hinting policy. -func (c *Context) SetHinting(hinting font.Hinting) { - c.hinting = hinting - for i := range c.cache { - c.cache[i] = cacheEntry{} - } -} - -// SetDst sets the destination image for draw operations. -func (c *Context) SetDst(dst draw.Image) { - c.dst = dst -} - -// SetSrc sets the source image for draw operations. This is typically an -// image.Uniform. -func (c *Context) SetSrc(src image.Image) { - c.src = src -} - -// SetClip sets the clip rectangle for drawing. -func (c *Context) SetClip(clip image.Rectangle) { - c.clip = clip -} - -// TODO(nigeltao): implement Context.SetGamma. - -// NewContext creates a new Context. -func NewContext() *Context { - return &Context{ - r: raster.NewRasterizer(0, 0), - fontSize: 12, - dpi: 72, - scale: 12 << 6, - } -} diff --git a/vendor/github.com/golang/freetype/freetype_test.go b/vendor/github.com/golang/freetype/freetype_test.go deleted file mode 100644 index 348c411..0000000 --- a/vendor/github.com/golang/freetype/freetype_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2012 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package freetype - -import ( - "image" - "image/draw" - "io/ioutil" - "runtime" - "strings" - "testing" -) - -func BenchmarkDrawString(b *testing.B) { - data, err := ioutil.ReadFile("licenses/gpl.txt") - if err != nil { - b.Fatal(err) - } - lines := strings.Split(string(data), "\n") - - data, err = ioutil.ReadFile("testdata/luxisr.ttf") - if err != nil { - b.Fatal(err) - } - f, err := ParseFont(data) - if err != nil { - b.Fatal(err) - } - - dst := image.NewRGBA(image.Rect(0, 0, 800, 600)) - draw.Draw(dst, dst.Bounds(), image.White, image.ZP, draw.Src) - - c := NewContext() - c.SetDst(dst) - c.SetClip(dst.Bounds()) - c.SetSrc(image.Black) - c.SetFont(f) - - var ms runtime.MemStats - runtime.ReadMemStats(&ms) - mallocs := ms.Mallocs - - b.ResetTimer() - for i := 0; i < b.N; i++ { - for j, line := range lines { - _, err := c.DrawString(line, Pt(0, (j*16)%600)) - if err != nil { - b.Fatal(err) - } - } - } - b.StopTimer() - runtime.ReadMemStats(&ms) - mallocs = ms.Mallocs - mallocs - b.Logf("%d iterations, %d mallocs per iteration\n", b.N, int(mallocs)/b.N) -} diff --git a/vendor/github.com/golang/freetype/raster/geom.go b/vendor/github.com/golang/freetype/raster/geom.go deleted file mode 100644 index f3696ea..0000000 --- a/vendor/github.com/golang/freetype/raster/geom.go +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright 2010 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package raster - -import ( - "fmt" - "math" - - "golang.org/x/image/math/fixed" -) - -// maxAbs returns the maximum of abs(a) and abs(b). -func maxAbs(a, b fixed.Int26_6) fixed.Int26_6 { - if a < 0 { - a = -a - } - if b < 0 { - b = -b - } - if a < b { - return b - } - return a -} - -// pNeg returns the vector -p, or equivalently p rotated by 180 degrees. -func pNeg(p fixed.Point26_6) fixed.Point26_6 { - return fixed.Point26_6{-p.X, -p.Y} -} - -// pDot returns the dot product p·q. -func pDot(p fixed.Point26_6, q fixed.Point26_6) fixed.Int52_12 { - px, py := int64(p.X), int64(p.Y) - qx, qy := int64(q.X), int64(q.Y) - return fixed.Int52_12(px*qx + py*qy) -} - -// pLen returns the length of the vector p. -func pLen(p fixed.Point26_6) fixed.Int26_6 { - // TODO(nigeltao): use fixed point math. - x := float64(p.X) - y := float64(p.Y) - return fixed.Int26_6(math.Sqrt(x*x + y*y)) -} - -// pNorm returns the vector p normalized to the given length, or zero if p is -// degenerate. -func pNorm(p fixed.Point26_6, length fixed.Int26_6) fixed.Point26_6 { - d := pLen(p) - if d == 0 { - return fixed.Point26_6{} - } - s, t := int64(length), int64(d) - x := int64(p.X) * s / t - y := int64(p.Y) * s / t - return fixed.Point26_6{fixed.Int26_6(x), fixed.Int26_6(y)} -} - -// pRot45CW returns the vector p rotated clockwise by 45 degrees. -// -// Note that the Y-axis grows downwards, so {1, 0}.Rot45CW is {1/√2, 1/√2}. -func pRot45CW(p fixed.Point26_6) fixed.Point26_6 { - // 181/256 is approximately 1/√2, or sin(π/4). - px, py := int64(p.X), int64(p.Y) - qx := (+px - py) * 181 / 256 - qy := (+px + py) * 181 / 256 - return fixed.Point26_6{fixed.Int26_6(qx), fixed.Int26_6(qy)} -} - -// pRot90CW returns the vector p rotated clockwise by 90 degrees. -// -// Note that the Y-axis grows downwards, so {1, 0}.Rot90CW is {0, 1}. -func pRot90CW(p fixed.Point26_6) fixed.Point26_6 { - return fixed.Point26_6{-p.Y, p.X} -} - -// pRot135CW returns the vector p rotated clockwise by 135 degrees. -// -// Note that the Y-axis grows downwards, so {1, 0}.Rot135CW is {-1/√2, 1/√2}. -func pRot135CW(p fixed.Point26_6) fixed.Point26_6 { - // 181/256 is approximately 1/√2, or sin(π/4). - px, py := int64(p.X), int64(p.Y) - qx := (-px - py) * 181 / 256 - qy := (+px - py) * 181 / 256 - return fixed.Point26_6{fixed.Int26_6(qx), fixed.Int26_6(qy)} -} - -// pRot45CCW returns the vector p rotated counter-clockwise by 45 degrees. -// -// Note that the Y-axis grows downwards, so {1, 0}.Rot45CCW is {1/√2, -1/√2}. -func pRot45CCW(p fixed.Point26_6) fixed.Point26_6 { - // 181/256 is approximately 1/√2, or sin(π/4). - px, py := int64(p.X), int64(p.Y) - qx := (+px + py) * 181 / 256 - qy := (-px + py) * 181 / 256 - return fixed.Point26_6{fixed.Int26_6(qx), fixed.Int26_6(qy)} -} - -// pRot90CCW returns the vector p rotated counter-clockwise by 90 degrees. -// -// Note that the Y-axis grows downwards, so {1, 0}.Rot90CCW is {0, -1}. -func pRot90CCW(p fixed.Point26_6) fixed.Point26_6 { - return fixed.Point26_6{p.Y, -p.X} -} - -// pRot135CCW returns the vector p rotated counter-clockwise by 135 degrees. -// -// Note that the Y-axis grows downwards, so {1, 0}.Rot135CCW is {-1/√2, -1/√2}. -func pRot135CCW(p fixed.Point26_6) fixed.Point26_6 { - // 181/256 is approximately 1/√2, or sin(π/4). - px, py := int64(p.X), int64(p.Y) - qx := (-px + py) * 181 / 256 - qy := (-px - py) * 181 / 256 - return fixed.Point26_6{fixed.Int26_6(qx), fixed.Int26_6(qy)} -} - -// An Adder accumulates points on a curve. -type Adder interface { - // Start starts a new curve at the given point. - Start(a fixed.Point26_6) - // Add1 adds a linear segment to the current curve. - Add1(b fixed.Point26_6) - // Add2 adds a quadratic segment to the current curve. - Add2(b, c fixed.Point26_6) - // Add3 adds a cubic segment to the current curve. - Add3(b, c, d fixed.Point26_6) -} - -// A Path is a sequence of curves, and a curve is a start point followed by a -// sequence of linear, quadratic or cubic segments. -type Path []fixed.Int26_6 - -// String returns a human-readable representation of a Path. -func (p Path) String() string { - s := "" - for i := 0; i < len(p); { - if i != 0 { - s += " " - } - switch p[i] { - case 0: - s += "S0" + fmt.Sprint([]fixed.Int26_6(p[i+1:i+3])) - i += 4 - case 1: - s += "A1" + fmt.Sprint([]fixed.Int26_6(p[i+1:i+3])) - i += 4 - case 2: - s += "A2" + fmt.Sprint([]fixed.Int26_6(p[i+1:i+5])) - i += 6 - case 3: - s += "A3" + fmt.Sprint([]fixed.Int26_6(p[i+1:i+7])) - i += 8 - default: - panic("freetype/raster: bad path") - } - } - return s -} - -// Clear cancels any previous calls to p.Start or p.AddXxx. -func (p *Path) Clear() { - *p = (*p)[:0] -} - -// Start starts a new curve at the given point. -func (p *Path) Start(a fixed.Point26_6) { - *p = append(*p, 0, a.X, a.Y, 0) -} - -// Add1 adds a linear segment to the current curve. -func (p *Path) Add1(b fixed.Point26_6) { - *p = append(*p, 1, b.X, b.Y, 1) -} - -// Add2 adds a quadratic segment to the current curve. -func (p *Path) Add2(b, c fixed.Point26_6) { - *p = append(*p, 2, b.X, b.Y, c.X, c.Y, 2) -} - -// Add3 adds a cubic segment to the current curve. -func (p *Path) Add3(b, c, d fixed.Point26_6) { - *p = append(*p, 3, b.X, b.Y, c.X, c.Y, d.X, d.Y, 3) -} - -// AddPath adds the Path q to p. -func (p *Path) AddPath(q Path) { - *p = append(*p, q...) -} - -// AddStroke adds a stroked Path. -func (p *Path) AddStroke(q Path, width fixed.Int26_6, cr Capper, jr Joiner) { - Stroke(p, q, width, cr, jr) -} - -// firstPoint returns the first point in a non-empty Path. -func (p Path) firstPoint() fixed.Point26_6 { - return fixed.Point26_6{p[1], p[2]} -} - -// lastPoint returns the last point in a non-empty Path. -func (p Path) lastPoint() fixed.Point26_6 { - return fixed.Point26_6{p[len(p)-3], p[len(p)-2]} -} - -// addPathReversed adds q reversed to p. -// For example, if q consists of a linear segment from A to B followed by a -// quadratic segment from B to C to D, then the values of q looks like: -// index: 01234567890123 -// value: 0AA01BB12CCDD2 -// So, when adding q backwards to p, we want to Add2(C, B) followed by Add1(A). -func addPathReversed(p Adder, q Path) { - if len(q) == 0 { - return - } - i := len(q) - 1 - for { - switch q[i] { - case 0: - return - case 1: - i -= 4 - p.Add1( - fixed.Point26_6{q[i-2], q[i-1]}, - ) - case 2: - i -= 6 - p.Add2( - fixed.Point26_6{q[i+2], q[i+3]}, - fixed.Point26_6{q[i-2], q[i-1]}, - ) - case 3: - i -= 8 - p.Add3( - fixed.Point26_6{q[i+4], q[i+5]}, - fixed.Point26_6{q[i+2], q[i+3]}, - fixed.Point26_6{q[i-2], q[i-1]}, - ) - default: - panic("freetype/raster: bad path") - } - } -} diff --git a/vendor/github.com/golang/freetype/raster/paint.go b/vendor/github.com/golang/freetype/raster/paint.go deleted file mode 100644 index 652256c..0000000 --- a/vendor/github.com/golang/freetype/raster/paint.go +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright 2010 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package raster - -import ( - "image" - "image/color" - "image/draw" - "math" -) - -// A Span is a horizontal segment of pixels with constant alpha. X0 is an -// inclusive bound and X1 is exclusive, the same as for slices. A fully opaque -// Span has Alpha == 0xffff. -type Span struct { - Y, X0, X1 int - Alpha uint32 -} - -// A Painter knows how to paint a batch of Spans. Rasterization may involve -// Painting multiple batches, and done will be true for the final batch. The -// Spans' Y values are monotonically increasing during a rasterization. Paint -// may use all of ss as scratch space during the call. -type Painter interface { - Paint(ss []Span, done bool) -} - -// The PainterFunc type adapts an ordinary function to the Painter interface. -type PainterFunc func(ss []Span, done bool) - -// Paint just delegates the call to f. -func (f PainterFunc) Paint(ss []Span, done bool) { f(ss, done) } - -// An AlphaOverPainter is a Painter that paints Spans onto a *image.Alpha using -// the Over Porter-Duff composition operator. -type AlphaOverPainter struct { - Image *image.Alpha -} - -// Paint satisfies the Painter interface. -func (r AlphaOverPainter) Paint(ss []Span, done bool) { - b := r.Image.Bounds() - for _, s := range ss { - if s.Y < b.Min.Y { - continue - } - if s.Y >= b.Max.Y { - return - } - if s.X0 < b.Min.X { - s.X0 = b.Min.X - } - if s.X1 > b.Max.X { - s.X1 = b.Max.X - } - if s.X0 >= s.X1 { - continue - } - base := (s.Y-r.Image.Rect.Min.Y)*r.Image.Stride - r.Image.Rect.Min.X - p := r.Image.Pix[base+s.X0 : base+s.X1] - a := int(s.Alpha >> 8) - for i, c := range p { - v := int(c) - p[i] = uint8((v*255 + (255-v)*a) / 255) - } - } -} - -// NewAlphaOverPainter creates a new AlphaOverPainter for the given image. -func NewAlphaOverPainter(m *image.Alpha) AlphaOverPainter { - return AlphaOverPainter{m} -} - -// An AlphaSrcPainter is a Painter that paints Spans onto a *image.Alpha using -// the Src Porter-Duff composition operator. -type AlphaSrcPainter struct { - Image *image.Alpha -} - -// Paint satisfies the Painter interface. -func (r AlphaSrcPainter) Paint(ss []Span, done bool) { - b := r.Image.Bounds() - for _, s := range ss { - if s.Y < b.Min.Y { - continue - } - if s.Y >= b.Max.Y { - return - } - if s.X0 < b.Min.X { - s.X0 = b.Min.X - } - if s.X1 > b.Max.X { - s.X1 = b.Max.X - } - if s.X0 >= s.X1 { - continue - } - base := (s.Y-r.Image.Rect.Min.Y)*r.Image.Stride - r.Image.Rect.Min.X - p := r.Image.Pix[base+s.X0 : base+s.X1] - color := uint8(s.Alpha >> 8) - for i := range p { - p[i] = color - } - } -} - -// NewAlphaSrcPainter creates a new AlphaSrcPainter for the given image. -func NewAlphaSrcPainter(m *image.Alpha) AlphaSrcPainter { - return AlphaSrcPainter{m} -} - -// An RGBAPainter is a Painter that paints Spans onto a *image.RGBA. -type RGBAPainter struct { - // Image is the image to compose onto. - Image *image.RGBA - // Op is the Porter-Duff composition operator. - Op draw.Op - // cr, cg, cb and ca are the 16-bit color to paint the spans. - cr, cg, cb, ca uint32 -} - -// Paint satisfies the Painter interface. -func (r *RGBAPainter) Paint(ss []Span, done bool) { - b := r.Image.Bounds() - for _, s := range ss { - if s.Y < b.Min.Y { - continue - } - if s.Y >= b.Max.Y { - return - } - if s.X0 < b.Min.X { - s.X0 = b.Min.X - } - if s.X1 > b.Max.X { - s.X1 = b.Max.X - } - if s.X0 >= s.X1 { - continue - } - // This code mimics drawGlyphOver in $GOROOT/src/image/draw/draw.go. - ma := s.Alpha - const m = 1<<16 - 1 - i0 := (s.Y-r.Image.Rect.Min.Y)*r.Image.Stride + (s.X0-r.Image.Rect.Min.X)*4 - i1 := i0 + (s.X1-s.X0)*4 - if r.Op == draw.Over { - for i := i0; i < i1; i += 4 { - dr := uint32(r.Image.Pix[i+0]) - dg := uint32(r.Image.Pix[i+1]) - db := uint32(r.Image.Pix[i+2]) - da := uint32(r.Image.Pix[i+3]) - a := (m - (r.ca * ma / m)) * 0x101 - r.Image.Pix[i+0] = uint8((dr*a + r.cr*ma) / m >> 8) - r.Image.Pix[i+1] = uint8((dg*a + r.cg*ma) / m >> 8) - r.Image.Pix[i+2] = uint8((db*a + r.cb*ma) / m >> 8) - r.Image.Pix[i+3] = uint8((da*a + r.ca*ma) / m >> 8) - } - } else { - for i := i0; i < i1; i += 4 { - r.Image.Pix[i+0] = uint8(r.cr * ma / m >> 8) - r.Image.Pix[i+1] = uint8(r.cg * ma / m >> 8) - r.Image.Pix[i+2] = uint8(r.cb * ma / m >> 8) - r.Image.Pix[i+3] = uint8(r.ca * ma / m >> 8) - } - } - } -} - -// SetColor sets the color to paint the spans. -func (r *RGBAPainter) SetColor(c color.Color) { - r.cr, r.cg, r.cb, r.ca = c.RGBA() -} - -// NewRGBAPainter creates a new RGBAPainter for the given image. -func NewRGBAPainter(m *image.RGBA) *RGBAPainter { - return &RGBAPainter{Image: m} -} - -// A MonochromePainter wraps another Painter, quantizing each Span's alpha to -// be either fully opaque or fully transparent. -type MonochromePainter struct { - Painter Painter - y, x0, x1 int -} - -// Paint delegates to the wrapped Painter after quantizing each Span's alpha -// value and merging adjacent fully opaque Spans. -func (m *MonochromePainter) Paint(ss []Span, done bool) { - // We compact the ss slice, discarding any Spans whose alpha quantizes to zero. - j := 0 - for _, s := range ss { - if s.Alpha >= 0x8000 { - if m.y == s.Y && m.x1 == s.X0 { - m.x1 = s.X1 - } else { - ss[j] = Span{m.y, m.x0, m.x1, 1<<16 - 1} - j++ - m.y, m.x0, m.x1 = s.Y, s.X0, s.X1 - } - } - } - if done { - // Flush the accumulated Span. - finalSpan := Span{m.y, m.x0, m.x1, 1<<16 - 1} - if j < len(ss) { - ss[j] = finalSpan - j++ - m.Painter.Paint(ss[:j], true) - } else if j == len(ss) { - m.Painter.Paint(ss, false) - if cap(ss) > 0 { - ss = ss[:1] - } else { - ss = make([]Span, 1) - } - ss[0] = finalSpan - m.Painter.Paint(ss, true) - } else { - panic("unreachable") - } - // Reset the accumulator, so that this Painter can be re-used. - m.y, m.x0, m.x1 = 0, 0, 0 - } else { - m.Painter.Paint(ss[:j], false) - } -} - -// NewMonochromePainter creates a new MonochromePainter that wraps the given -// Painter. -func NewMonochromePainter(p Painter) *MonochromePainter { - return &MonochromePainter{Painter: p} -} - -// A GammaCorrectionPainter wraps another Painter, performing gamma-correction -// on each Span's alpha value. -type GammaCorrectionPainter struct { - // Painter is the wrapped Painter. - Painter Painter - // a is the precomputed alpha values for linear interpolation, with fully - // opaque == 0xffff. - a [256]uint16 - // gammaIsOne is whether gamma correction is a no-op. - gammaIsOne bool -} - -// Paint delegates to the wrapped Painter after performing gamma-correction on -// each Span. -func (g *GammaCorrectionPainter) Paint(ss []Span, done bool) { - if !g.gammaIsOne { - const n = 0x101 - for i, s := range ss { - if s.Alpha == 0 || s.Alpha == 0xffff { - continue - } - p, q := s.Alpha/n, s.Alpha%n - // The resultant alpha is a linear interpolation of g.a[p] and g.a[p+1]. - a := uint32(g.a[p])*(n-q) + uint32(g.a[p+1])*q - ss[i].Alpha = (a + n/2) / n - } - } - g.Painter.Paint(ss, done) -} - -// SetGamma sets the gamma value. -func (g *GammaCorrectionPainter) SetGamma(gamma float64) { - g.gammaIsOne = gamma == 1 - if g.gammaIsOne { - return - } - for i := 0; i < 256; i++ { - a := float64(i) / 0xff - a = math.Pow(a, gamma) - g.a[i] = uint16(0xffff * a) - } -} - -// NewGammaCorrectionPainter creates a new GammaCorrectionPainter that wraps -// the given Painter. -func NewGammaCorrectionPainter(p Painter, gamma float64) *GammaCorrectionPainter { - g := &GammaCorrectionPainter{Painter: p} - g.SetGamma(gamma) - return g -} diff --git a/vendor/github.com/golang/freetype/raster/raster.go b/vendor/github.com/golang/freetype/raster/raster.go deleted file mode 100644 index 7e6cd4e..0000000 --- a/vendor/github.com/golang/freetype/raster/raster.go +++ /dev/null @@ -1,601 +0,0 @@ -// Copyright 2010 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -// Package raster provides an anti-aliasing 2-D rasterizer. -// -// It is part of the larger Freetype suite of font-related packages, but the -// raster package is not specific to font rasterization, and can be used -// standalone without any other Freetype package. -// -// Rasterization is done by the same area/coverage accumulation algorithm as -// the Freetype "smooth" module, and the Anti-Grain Geometry library. A -// description of the area/coverage algorithm is at -// http://projects.tuxee.net/cl-vectors/section-the-cl-aa-algorithm -package raster // import "github.com/golang/freetype/raster" - -import ( - "strconv" - - "golang.org/x/image/math/fixed" -) - -// A cell is part of a linked list (for a given yi co-ordinate) of accumulated -// area/coverage for the pixel at (xi, yi). -type cell struct { - xi int - area, cover int - next int -} - -type Rasterizer struct { - // If false, the default behavior is to use the even-odd winding fill - // rule during Rasterize. - UseNonZeroWinding bool - // An offset (in pixels) to the painted spans. - Dx, Dy int - - // The width of the Rasterizer. The height is implicit in len(cellIndex). - width int - // splitScaleN is the scaling factor used to determine how many times - // to decompose a quadratic or cubic segment into a linear approximation. - splitScale2, splitScale3 int - - // The current pen position. - a fixed.Point26_6 - // The current cell and its area/coverage being accumulated. - xi, yi int - area, cover int - - // Saved cells. - cell []cell - // Linked list of cells, one per row. - cellIndex []int - // Buffers. - cellBuf [256]cell - cellIndexBuf [64]int - spanBuf [64]Span -} - -// findCell returns the index in r.cell for the cell corresponding to -// (r.xi, r.yi). The cell is created if necessary. -func (r *Rasterizer) findCell() int { - if r.yi < 0 || r.yi >= len(r.cellIndex) { - return -1 - } - xi := r.xi - if xi < 0 { - xi = -1 - } else if xi > r.width { - xi = r.width - } - i, prev := r.cellIndex[r.yi], -1 - for i != -1 && r.cell[i].xi <= xi { - if r.cell[i].xi == xi { - return i - } - i, prev = r.cell[i].next, i - } - c := len(r.cell) - if c == cap(r.cell) { - buf := make([]cell, c, 4*c) - copy(buf, r.cell) - r.cell = buf[0 : c+1] - } else { - r.cell = r.cell[0 : c+1] - } - r.cell[c] = cell{xi, 0, 0, i} - if prev == -1 { - r.cellIndex[r.yi] = c - } else { - r.cell[prev].next = c - } - return c -} - -// saveCell saves any accumulated r.area/r.cover for (r.xi, r.yi). -func (r *Rasterizer) saveCell() { - if r.area != 0 || r.cover != 0 { - i := r.findCell() - if i != -1 { - r.cell[i].area += r.area - r.cell[i].cover += r.cover - } - r.area = 0 - r.cover = 0 - } -} - -// setCell sets the (xi, yi) cell that r is accumulating area/coverage for. -func (r *Rasterizer) setCell(xi, yi int) { - if r.xi != xi || r.yi != yi { - r.saveCell() - r.xi, r.yi = xi, yi - } -} - -// scan accumulates area/coverage for the yi'th scanline, going from -// x0 to x1 in the horizontal direction (in 26.6 fixed point co-ordinates) -// and from y0f to y1f fractional vertical units within that scanline. -func (r *Rasterizer) scan(yi int, x0, y0f, x1, y1f fixed.Int26_6) { - // Break the 26.6 fixed point X co-ordinates into integral and fractional parts. - x0i := int(x0) / 64 - x0f := x0 - fixed.Int26_6(64*x0i) - x1i := int(x1) / 64 - x1f := x1 - fixed.Int26_6(64*x1i) - - // A perfectly horizontal scan. - if y0f == y1f { - r.setCell(x1i, yi) - return - } - dx, dy := x1-x0, y1f-y0f - // A single cell scan. - if x0i == x1i { - r.area += int((x0f + x1f) * dy) - r.cover += int(dy) - return - } - // There are at least two cells. Apart from the first and last cells, - // all intermediate cells go through the full width of the cell, - // or 64 units in 26.6 fixed point format. - var ( - p, q, edge0, edge1 fixed.Int26_6 - xiDelta int - ) - if dx > 0 { - p, q = (64-x0f)*dy, dx - edge0, edge1, xiDelta = 0, 64, 1 - } else { - p, q = x0f*dy, -dx - edge0, edge1, xiDelta = 64, 0, -1 - } - yDelta, yRem := p/q, p%q - if yRem < 0 { - yDelta -= 1 - yRem += q - } - // Do the first cell. - xi, y := x0i, y0f - r.area += int((x0f + edge1) * yDelta) - r.cover += int(yDelta) - xi, y = xi+xiDelta, y+yDelta - r.setCell(xi, yi) - if xi != x1i { - // Do all the intermediate cells. - p = 64 * (y1f - y + yDelta) - fullDelta, fullRem := p/q, p%q - if fullRem < 0 { - fullDelta -= 1 - fullRem += q - } - yRem -= q - for xi != x1i { - yDelta = fullDelta - yRem += fullRem - if yRem >= 0 { - yDelta += 1 - yRem -= q - } - r.area += int(64 * yDelta) - r.cover += int(yDelta) - xi, y = xi+xiDelta, y+yDelta - r.setCell(xi, yi) - } - } - // Do the last cell. - yDelta = y1f - y - r.area += int((edge0 + x1f) * yDelta) - r.cover += int(yDelta) -} - -// Start starts a new curve at the given point. -func (r *Rasterizer) Start(a fixed.Point26_6) { - r.setCell(int(a.X/64), int(a.Y/64)) - r.a = a -} - -// Add1 adds a linear segment to the current curve. -func (r *Rasterizer) Add1(b fixed.Point26_6) { - x0, y0 := r.a.X, r.a.Y - x1, y1 := b.X, b.Y - dx, dy := x1-x0, y1-y0 - // Break the 26.6 fixed point Y co-ordinates into integral and fractional - // parts. - y0i := int(y0) / 64 - y0f := y0 - fixed.Int26_6(64*y0i) - y1i := int(y1) / 64 - y1f := y1 - fixed.Int26_6(64*y1i) - - if y0i == y1i { - // There is only one scanline. - r.scan(y0i, x0, y0f, x1, y1f) - - } else if dx == 0 { - // This is a vertical line segment. We avoid calling r.scan and instead - // manipulate r.area and r.cover directly. - var ( - edge0, edge1 fixed.Int26_6 - yiDelta int - ) - if dy > 0 { - edge0, edge1, yiDelta = 0, 64, 1 - } else { - edge0, edge1, yiDelta = 64, 0, -1 - } - x0i, yi := int(x0)/64, y0i - x0fTimes2 := (int(x0) - (64 * x0i)) * 2 - // Do the first pixel. - dcover := int(edge1 - y0f) - darea := int(x0fTimes2 * dcover) - r.area += darea - r.cover += dcover - yi += yiDelta - r.setCell(x0i, yi) - // Do all the intermediate pixels. - dcover = int(edge1 - edge0) - darea = int(x0fTimes2 * dcover) - for yi != y1i { - r.area += darea - r.cover += dcover - yi += yiDelta - r.setCell(x0i, yi) - } - // Do the last pixel. - dcover = int(y1f - edge0) - darea = int(x0fTimes2 * dcover) - r.area += darea - r.cover += dcover - - } else { - // There are at least two scanlines. Apart from the first and last - // scanlines, all intermediate scanlines go through the full height of - // the row, or 64 units in 26.6 fixed point format. - var ( - p, q, edge0, edge1 fixed.Int26_6 - yiDelta int - ) - if dy > 0 { - p, q = (64-y0f)*dx, dy - edge0, edge1, yiDelta = 0, 64, 1 - } else { - p, q = y0f*dx, -dy - edge0, edge1, yiDelta = 64, 0, -1 - } - xDelta, xRem := p/q, p%q - if xRem < 0 { - xDelta -= 1 - xRem += q - } - // Do the first scanline. - x, yi := x0, y0i - r.scan(yi, x, y0f, x+xDelta, edge1) - x, yi = x+xDelta, yi+yiDelta - r.setCell(int(x)/64, yi) - if yi != y1i { - // Do all the intermediate scanlines. - p = 64 * dx - fullDelta, fullRem := p/q, p%q - if fullRem < 0 { - fullDelta -= 1 - fullRem += q - } - xRem -= q - for yi != y1i { - xDelta = fullDelta - xRem += fullRem - if xRem >= 0 { - xDelta += 1 - xRem -= q - } - r.scan(yi, x, edge0, x+xDelta, edge1) - x, yi = x+xDelta, yi+yiDelta - r.setCell(int(x)/64, yi) - } - } - // Do the last scanline. - r.scan(yi, x, edge0, x1, y1f) - } - // The next lineTo starts from b. - r.a = b -} - -// Add2 adds a quadratic segment to the current curve. -func (r *Rasterizer) Add2(b, c fixed.Point26_6) { - // Calculate nSplit (the number of recursive decompositions) based on how - // 'curvy' it is. Specifically, how much the middle point b deviates from - // (a+c)/2. - dev := maxAbs(r.a.X-2*b.X+c.X, r.a.Y-2*b.Y+c.Y) / fixed.Int26_6(r.splitScale2) - nsplit := 0 - for dev > 0 { - dev /= 4 - nsplit++ - } - // dev is 32-bit, and nsplit++ every time we shift off 2 bits, so maxNsplit - // is 16. - const maxNsplit = 16 - if nsplit > maxNsplit { - panic("freetype/raster: Add2 nsplit too large: " + strconv.Itoa(nsplit)) - } - // Recursively decompose the curve nSplit levels deep. - var ( - pStack [2*maxNsplit + 3]fixed.Point26_6 - sStack [maxNsplit + 1]int - i int - ) - sStack[0] = nsplit - pStack[0] = c - pStack[1] = b - pStack[2] = r.a - for i >= 0 { - s := sStack[i] - p := pStack[2*i:] - if s > 0 { - // Split the quadratic curve p[:3] into an equivalent set of two - // shorter curves: p[:3] and p[2:5]. The new p[4] is the old p[2], - // and p[0] is unchanged. - mx := p[1].X - p[4].X = p[2].X - p[3].X = (p[4].X + mx) / 2 - p[1].X = (p[0].X + mx) / 2 - p[2].X = (p[1].X + p[3].X) / 2 - my := p[1].Y - p[4].Y = p[2].Y - p[3].Y = (p[4].Y + my) / 2 - p[1].Y = (p[0].Y + my) / 2 - p[2].Y = (p[1].Y + p[3].Y) / 2 - // The two shorter curves have one less split to do. - sStack[i] = s - 1 - sStack[i+1] = s - 1 - i++ - } else { - // Replace the level-0 quadratic with a two-linear-piece - // approximation. - midx := (p[0].X + 2*p[1].X + p[2].X) / 4 - midy := (p[0].Y + 2*p[1].Y + p[2].Y) / 4 - r.Add1(fixed.Point26_6{midx, midy}) - r.Add1(p[0]) - i-- - } - } -} - -// Add3 adds a cubic segment to the current curve. -func (r *Rasterizer) Add3(b, c, d fixed.Point26_6) { - // Calculate nSplit (the number of recursive decompositions) based on how - // 'curvy' it is. - dev2 := maxAbs(r.a.X-3*(b.X+c.X)+d.X, r.a.Y-3*(b.Y+c.Y)+d.Y) / fixed.Int26_6(r.splitScale2) - dev3 := maxAbs(r.a.X-2*b.X+d.X, r.a.Y-2*b.Y+d.Y) / fixed.Int26_6(r.splitScale3) - nsplit := 0 - for dev2 > 0 || dev3 > 0 { - dev2 /= 8 - dev3 /= 4 - nsplit++ - } - // devN is 32-bit, and nsplit++ every time we shift off 2 bits, so - // maxNsplit is 16. - const maxNsplit = 16 - if nsplit > maxNsplit { - panic("freetype/raster: Add3 nsplit too large: " + strconv.Itoa(nsplit)) - } - // Recursively decompose the curve nSplit levels deep. - var ( - pStack [3*maxNsplit + 4]fixed.Point26_6 - sStack [maxNsplit + 1]int - i int - ) - sStack[0] = nsplit - pStack[0] = d - pStack[1] = c - pStack[2] = b - pStack[3] = r.a - for i >= 0 { - s := sStack[i] - p := pStack[3*i:] - if s > 0 { - // Split the cubic curve p[:4] into an equivalent set of two - // shorter curves: p[:4] and p[3:7]. The new p[6] is the old p[3], - // and p[0] is unchanged. - m01x := (p[0].X + p[1].X) / 2 - m12x := (p[1].X + p[2].X) / 2 - m23x := (p[2].X + p[3].X) / 2 - p[6].X = p[3].X - p[5].X = m23x - p[1].X = m01x - p[2].X = (m01x + m12x) / 2 - p[4].X = (m12x + m23x) / 2 - p[3].X = (p[2].X + p[4].X) / 2 - m01y := (p[0].Y + p[1].Y) / 2 - m12y := (p[1].Y + p[2].Y) / 2 - m23y := (p[2].Y + p[3].Y) / 2 - p[6].Y = p[3].Y - p[5].Y = m23y - p[1].Y = m01y - p[2].Y = (m01y + m12y) / 2 - p[4].Y = (m12y + m23y) / 2 - p[3].Y = (p[2].Y + p[4].Y) / 2 - // The two shorter curves have one less split to do. - sStack[i] = s - 1 - sStack[i+1] = s - 1 - i++ - } else { - // Replace the level-0 cubic with a two-linear-piece approximation. - midx := (p[0].X + 3*(p[1].X+p[2].X) + p[3].X) / 8 - midy := (p[0].Y + 3*(p[1].Y+p[2].Y) + p[3].Y) / 8 - r.Add1(fixed.Point26_6{midx, midy}) - r.Add1(p[0]) - i-- - } - } -} - -// AddPath adds the given Path. -func (r *Rasterizer) AddPath(p Path) { - for i := 0; i < len(p); { - switch p[i] { - case 0: - r.Start( - fixed.Point26_6{p[i+1], p[i+2]}, - ) - i += 4 - case 1: - r.Add1( - fixed.Point26_6{p[i+1], p[i+2]}, - ) - i += 4 - case 2: - r.Add2( - fixed.Point26_6{p[i+1], p[i+2]}, - fixed.Point26_6{p[i+3], p[i+4]}, - ) - i += 6 - case 3: - r.Add3( - fixed.Point26_6{p[i+1], p[i+2]}, - fixed.Point26_6{p[i+3], p[i+4]}, - fixed.Point26_6{p[i+5], p[i+6]}, - ) - i += 8 - default: - panic("freetype/raster: bad path") - } - } -} - -// AddStroke adds a stroked Path. -func (r *Rasterizer) AddStroke(q Path, width fixed.Int26_6, cr Capper, jr Joiner) { - Stroke(r, q, width, cr, jr) -} - -// areaToAlpha converts an area value to a uint32 alpha value. A completely -// filled pixel corresponds to an area of 64*64*2, and an alpha of 0xffff. The -// conversion of area values greater than this depends on the winding rule: -// even-odd or non-zero. -func (r *Rasterizer) areaToAlpha(area int) uint32 { - // The C Freetype implementation (version 2.3.12) does "alpha := area>>1" - // without the +1. Round-to-nearest gives a more symmetric result than - // round-down. The C implementation also returns 8-bit alpha, not 16-bit - // alpha. - a := (area + 1) >> 1 - if a < 0 { - a = -a - } - alpha := uint32(a) - if r.UseNonZeroWinding { - if alpha > 0x0fff { - alpha = 0x0fff - } - } else { - alpha &= 0x1fff - if alpha > 0x1000 { - alpha = 0x2000 - alpha - } else if alpha == 0x1000 { - alpha = 0x0fff - } - } - // alpha is now in the range [0x0000, 0x0fff]. Convert that 12-bit alpha to - // 16-bit alpha. - return alpha<<4 | alpha>>8 -} - -// Rasterize converts r's accumulated curves into Spans for p. The Spans passed -// to p are non-overlapping, and sorted by Y and then X. They all have non-zero -// width (and 0 <= X0 < X1 <= r.width) and non-zero A, except for the final -// Span, which has Y, X0, X1 and A all equal to zero. -func (r *Rasterizer) Rasterize(p Painter) { - r.saveCell() - s := 0 - for yi := 0; yi < len(r.cellIndex); yi++ { - xi, cover := 0, 0 - for c := r.cellIndex[yi]; c != -1; c = r.cell[c].next { - if cover != 0 && r.cell[c].xi > xi { - alpha := r.areaToAlpha(cover * 64 * 2) - if alpha != 0 { - xi0, xi1 := xi, r.cell[c].xi - if xi0 < 0 { - xi0 = 0 - } - if xi1 >= r.width { - xi1 = r.width - } - if xi0 < xi1 { - r.spanBuf[s] = Span{yi + r.Dy, xi0 + r.Dx, xi1 + r.Dx, alpha} - s++ - } - } - } - cover += r.cell[c].cover - alpha := r.areaToAlpha(cover*64*2 - r.cell[c].area) - xi = r.cell[c].xi + 1 - if alpha != 0 { - xi0, xi1 := r.cell[c].xi, xi - if xi0 < 0 { - xi0 = 0 - } - if xi1 >= r.width { - xi1 = r.width - } - if xi0 < xi1 { - r.spanBuf[s] = Span{yi + r.Dy, xi0 + r.Dx, xi1 + r.Dx, alpha} - s++ - } - } - if s > len(r.spanBuf)-2 { - p.Paint(r.spanBuf[:s], false) - s = 0 - } - } - } - p.Paint(r.spanBuf[:s], true) -} - -// Clear cancels any previous calls to r.Start or r.AddXxx. -func (r *Rasterizer) Clear() { - r.a = fixed.Point26_6{} - r.xi = 0 - r.yi = 0 - r.area = 0 - r.cover = 0 - r.cell = r.cell[:0] - for i := 0; i < len(r.cellIndex); i++ { - r.cellIndex[i] = -1 - } -} - -// SetBounds sets the maximum width and height of the rasterized image and -// calls Clear. The width and height are in pixels, not fixed.Int26_6 units. -func (r *Rasterizer) SetBounds(width, height int) { - if width < 0 { - width = 0 - } - if height < 0 { - height = 0 - } - // Use the same ssN heuristic as the C Freetype (version 2.4.0) - // implementation. - ss2, ss3 := 32, 16 - if width > 24 || height > 24 { - ss2, ss3 = 2*ss2, 2*ss3 - if width > 120 || height > 120 { - ss2, ss3 = 2*ss2, 2*ss3 - } - } - r.width = width - r.splitScale2 = ss2 - r.splitScale3 = ss3 - r.cell = r.cellBuf[:0] - if height > len(r.cellIndexBuf) { - r.cellIndex = make([]int, height) - } else { - r.cellIndex = r.cellIndexBuf[:height] - } - r.Clear() -} - -// NewRasterizer creates a new Rasterizer with the given bounds. -func NewRasterizer(width, height int) *Rasterizer { - r := new(Rasterizer) - r.SetBounds(width, height) - return r -} diff --git a/vendor/github.com/golang/freetype/raster/stroke.go b/vendor/github.com/golang/freetype/raster/stroke.go deleted file mode 100644 index bcc66b2..0000000 --- a/vendor/github.com/golang/freetype/raster/stroke.go +++ /dev/null @@ -1,483 +0,0 @@ -// Copyright 2010 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package raster - -import ( - "golang.org/x/image/math/fixed" -) - -// Two points are considered practically equal if the square of the distance -// between them is less than one quarter (i.e. 1024 / 4096). -const epsilon = fixed.Int52_12(1024) - -// A Capper signifies how to begin or end a stroked path. -type Capper interface { - // Cap adds a cap to p given a pivot point and the normal vector of a - // terminal segment. The normal's length is half of the stroke width. - Cap(p Adder, halfWidth fixed.Int26_6, pivot, n1 fixed.Point26_6) -} - -// The CapperFunc type adapts an ordinary function to be a Capper. -type CapperFunc func(Adder, fixed.Int26_6, fixed.Point26_6, fixed.Point26_6) - -func (f CapperFunc) Cap(p Adder, halfWidth fixed.Int26_6, pivot, n1 fixed.Point26_6) { - f(p, halfWidth, pivot, n1) -} - -// A Joiner signifies how to join interior nodes of a stroked path. -type Joiner interface { - // Join adds a join to the two sides of a stroked path given a pivot - // point and the normal vectors of the trailing and leading segments. - // Both normals have length equal to half of the stroke width. - Join(lhs, rhs Adder, halfWidth fixed.Int26_6, pivot, n0, n1 fixed.Point26_6) -} - -// The JoinerFunc type adapts an ordinary function to be a Joiner. -type JoinerFunc func(lhs, rhs Adder, halfWidth fixed.Int26_6, pivot, n0, n1 fixed.Point26_6) - -func (f JoinerFunc) Join(lhs, rhs Adder, halfWidth fixed.Int26_6, pivot, n0, n1 fixed.Point26_6) { - f(lhs, rhs, halfWidth, pivot, n0, n1) -} - -// RoundCapper adds round caps to a stroked path. -var RoundCapper Capper = CapperFunc(roundCapper) - -func roundCapper(p Adder, halfWidth fixed.Int26_6, pivot, n1 fixed.Point26_6) { - // The cubic Bézier approximation to a circle involves the magic number - // (√2 - 1) * 4/3, which is approximately 35/64. - const k = 35 - e := pRot90CCW(n1) - side := pivot.Add(e) - start, end := pivot.Sub(n1), pivot.Add(n1) - d, e := n1.Mul(k), e.Mul(k) - p.Add3(start.Add(e), side.Sub(d), side) - p.Add3(side.Add(d), end.Add(e), end) -} - -// ButtCapper adds butt caps to a stroked path. -var ButtCapper Capper = CapperFunc(buttCapper) - -func buttCapper(p Adder, halfWidth fixed.Int26_6, pivot, n1 fixed.Point26_6) { - p.Add1(pivot.Add(n1)) -} - -// SquareCapper adds square caps to a stroked path. -var SquareCapper Capper = CapperFunc(squareCapper) - -func squareCapper(p Adder, halfWidth fixed.Int26_6, pivot, n1 fixed.Point26_6) { - e := pRot90CCW(n1) - side := pivot.Add(e) - p.Add1(side.Sub(n1)) - p.Add1(side.Add(n1)) - p.Add1(pivot.Add(n1)) -} - -// RoundJoiner adds round joins to a stroked path. -var RoundJoiner Joiner = JoinerFunc(roundJoiner) - -func roundJoiner(lhs, rhs Adder, haflWidth fixed.Int26_6, pivot, n0, n1 fixed.Point26_6) { - dot := pDot(pRot90CW(n0), n1) - if dot >= 0 { - addArc(lhs, pivot, n0, n1) - rhs.Add1(pivot.Sub(n1)) - } else { - lhs.Add1(pivot.Add(n1)) - addArc(rhs, pivot, pNeg(n0), pNeg(n1)) - } -} - -// BevelJoiner adds bevel joins to a stroked path. -var BevelJoiner Joiner = JoinerFunc(bevelJoiner) - -func bevelJoiner(lhs, rhs Adder, haflWidth fixed.Int26_6, pivot, n0, n1 fixed.Point26_6) { - lhs.Add1(pivot.Add(n1)) - rhs.Add1(pivot.Sub(n1)) -} - -// addArc adds a circular arc from pivot+n0 to pivot+n1 to p. The shorter of -// the two possible arcs is taken, i.e. the one spanning <= 180 degrees. The -// two vectors n0 and n1 must be of equal length. -func addArc(p Adder, pivot, n0, n1 fixed.Point26_6) { - // r2 is the square of the length of n0. - r2 := pDot(n0, n0) - if r2 < epsilon { - // The arc radius is so small that we collapse to a straight line. - p.Add1(pivot.Add(n1)) - return - } - // We approximate the arc by 0, 1, 2 or 3 45-degree quadratic segments plus - // a final quadratic segment from s to n1. Each 45-degree segment has - // control points {1, 0}, {1, tan(π/8)} and {1/√2, 1/√2} suitably scaled, - // rotated and translated. tan(π/8) is approximately 27/64. - const tpo8 = 27 - var s fixed.Point26_6 - // We determine which octant the angle between n0 and n1 is in via three - // dot products. m0, m1 and m2 are n0 rotated clockwise by 45, 90 and 135 - // degrees. - m0 := pRot45CW(n0) - m1 := pRot90CW(n0) - m2 := pRot90CW(m0) - if pDot(m1, n1) >= 0 { - if pDot(n0, n1) >= 0 { - if pDot(m2, n1) <= 0 { - // n1 is between 0 and 45 degrees clockwise of n0. - s = n0 - } else { - // n1 is between 45 and 90 degrees clockwise of n0. - p.Add2(pivot.Add(n0).Add(m1.Mul(tpo8)), pivot.Add(m0)) - s = m0 - } - } else { - pm1, n0t := pivot.Add(m1), n0.Mul(tpo8) - p.Add2(pivot.Add(n0).Add(m1.Mul(tpo8)), pivot.Add(m0)) - p.Add2(pm1.Add(n0t), pm1) - if pDot(m0, n1) >= 0 { - // n1 is between 90 and 135 degrees clockwise of n0. - s = m1 - } else { - // n1 is between 135 and 180 degrees clockwise of n0. - p.Add2(pm1.Sub(n0t), pivot.Add(m2)) - s = m2 - } - } - } else { - if pDot(n0, n1) >= 0 { - if pDot(m0, n1) >= 0 { - // n1 is between 0 and 45 degrees counter-clockwise of n0. - s = n0 - } else { - // n1 is between 45 and 90 degrees counter-clockwise of n0. - p.Add2(pivot.Add(n0).Sub(m1.Mul(tpo8)), pivot.Sub(m2)) - s = pNeg(m2) - } - } else { - pm1, n0t := pivot.Sub(m1), n0.Mul(tpo8) - p.Add2(pivot.Add(n0).Sub(m1.Mul(tpo8)), pivot.Sub(m2)) - p.Add2(pm1.Add(n0t), pm1) - if pDot(m2, n1) <= 0 { - // n1 is between 90 and 135 degrees counter-clockwise of n0. - s = pNeg(m1) - } else { - // n1 is between 135 and 180 degrees counter-clockwise of n0. - p.Add2(pm1.Sub(n0t), pivot.Sub(m0)) - s = pNeg(m0) - } - } - } - // The final quadratic segment has two endpoints s and n1 and the middle - // control point is a multiple of s.Add(n1), i.e. it is on the angle - // bisector of those two points. The multiple ranges between 128/256 and - // 150/256 as the angle between s and n1 ranges between 0 and 45 degrees. - // - // When the angle is 0 degrees (i.e. s and n1 are coincident) then - // s.Add(n1) is twice s and so the middle control point of the degenerate - // quadratic segment should be half s.Add(n1), and half = 128/256. - // - // When the angle is 45 degrees then 150/256 is the ratio of the lengths of - // the two vectors {1, tan(π/8)} and {1 + 1/√2, 1/√2}. - // - // d is the normalized dot product between s and n1. Since the angle ranges - // between 0 and 45 degrees then d ranges between 256/256 and 181/256. - d := 256 * pDot(s, n1) / r2 - multiple := fixed.Int26_6(150-(150-128)*(d-181)/(256-181)) >> 2 - p.Add2(pivot.Add(s.Add(n1).Mul(multiple)), pivot.Add(n1)) -} - -// midpoint returns the midpoint of two Points. -func midpoint(a, b fixed.Point26_6) fixed.Point26_6 { - return fixed.Point26_6{(a.X + b.X) / 2, (a.Y + b.Y) / 2} -} - -// angleGreaterThan45 returns whether the angle between two vectors is more -// than 45 degrees. -func angleGreaterThan45(v0, v1 fixed.Point26_6) bool { - v := pRot45CCW(v0) - return pDot(v, v1) < 0 || pDot(pRot90CW(v), v1) < 0 -} - -// interpolate returns the point (1-t)*a + t*b. -func interpolate(a, b fixed.Point26_6, t fixed.Int52_12) fixed.Point26_6 { - s := 1<<12 - t - x := s*fixed.Int52_12(a.X) + t*fixed.Int52_12(b.X) - y := s*fixed.Int52_12(a.Y) + t*fixed.Int52_12(b.Y) - return fixed.Point26_6{fixed.Int26_6(x >> 12), fixed.Int26_6(y >> 12)} -} - -// curviest2 returns the value of t for which the quadratic parametric curve -// (1-t)²*a + 2*t*(1-t).b + t²*c has maximum curvature. -// -// The curvature of the parametric curve f(t) = (x(t), y(t)) is -// |x′y″-y′x″| / (x′²+y′²)^(3/2). -// -// Let d = b-a and e = c-2*b+a, so that f′(t) = 2*d+2*e*t and f″(t) = 2*e. -// The curvature's numerator is (2*dx+2*ex*t)*(2*ey)-(2*dy+2*ey*t)*(2*ex), -// which simplifies to 4*dx*ey-4*dy*ex, which is constant with respect to t. -// -// Thus, curvature is extreme where the denominator is extreme, i.e. where -// (x′²+y′²) is extreme. The first order condition is that -// 2*x′*x″+2*y′*y″ = 0, or (dx+ex*t)*ex + (dy+ey*t)*ey = 0. -// Solving for t gives t = -(dx*ex+dy*ey) / (ex*ex+ey*ey). -func curviest2(a, b, c fixed.Point26_6) fixed.Int52_12 { - dx := int64(b.X - a.X) - dy := int64(b.Y - a.Y) - ex := int64(c.X - 2*b.X + a.X) - ey := int64(c.Y - 2*b.Y + a.Y) - if ex == 0 && ey == 0 { - return 2048 - } - return fixed.Int52_12(-4096 * (dx*ex + dy*ey) / (ex*ex + ey*ey)) -} - -// A stroker holds state for stroking a path. -type stroker struct { - // p is the destination that records the stroked path. - p Adder - // u is the half-width of the stroke. - u fixed.Int26_6 - // cr and jr specify how to end and connect path segments. - cr Capper - jr Joiner - // r is the reverse path. Stroking a path involves constructing two - // parallel paths 2*u apart. The first path is added immediately to p, - // the second path is accumulated in r and eventually added in reverse. - r Path - // a is the most recent segment point. anorm is the segment normal of - // length u at that point. - a, anorm fixed.Point26_6 -} - -// addNonCurvy2 adds a quadratic segment to the stroker, where the segment -// defined by (k.a, b, c) achieves maximum curvature at either k.a or c. -func (k *stroker) addNonCurvy2(b, c fixed.Point26_6) { - // We repeatedly divide the segment at its middle until it is straight - // enough to approximate the stroke by just translating the control points. - // ds and ps are stacks of depths and points. t is the top of the stack. - const maxDepth = 5 - var ( - ds [maxDepth + 1]int - ps [2*maxDepth + 3]fixed.Point26_6 - t int - ) - // Initially the ps stack has one quadratic segment of depth zero. - ds[0] = 0 - ps[2] = k.a - ps[1] = b - ps[0] = c - anorm := k.anorm - var cnorm fixed.Point26_6 - - for { - depth := ds[t] - a := ps[2*t+2] - b := ps[2*t+1] - c := ps[2*t+0] - ab := b.Sub(a) - bc := c.Sub(b) - abIsSmall := pDot(ab, ab) < fixed.Int52_12(1<<12) - bcIsSmall := pDot(bc, bc) < fixed.Int52_12(1<<12) - if abIsSmall && bcIsSmall { - // Approximate the segment by a circular arc. - cnorm = pRot90CCW(pNorm(bc, k.u)) - mac := midpoint(a, c) - addArc(k.p, mac, anorm, cnorm) - addArc(&k.r, mac, pNeg(anorm), pNeg(cnorm)) - } else if depth < maxDepth && angleGreaterThan45(ab, bc) { - // Divide the segment in two and push both halves on the stack. - mab := midpoint(a, b) - mbc := midpoint(b, c) - t++ - ds[t+0] = depth + 1 - ds[t-1] = depth + 1 - ps[2*t+2] = a - ps[2*t+1] = mab - ps[2*t+0] = midpoint(mab, mbc) - ps[2*t-1] = mbc - continue - } else { - // Translate the control points. - bnorm := pRot90CCW(pNorm(c.Sub(a), k.u)) - cnorm = pRot90CCW(pNorm(bc, k.u)) - k.p.Add2(b.Add(bnorm), c.Add(cnorm)) - k.r.Add2(b.Sub(bnorm), c.Sub(cnorm)) - } - if t == 0 { - k.a, k.anorm = c, cnorm - return - } - t-- - anorm = cnorm - } - panic("unreachable") -} - -// Add1 adds a linear segment to the stroker. -func (k *stroker) Add1(b fixed.Point26_6) { - bnorm := pRot90CCW(pNorm(b.Sub(k.a), k.u)) - if len(k.r) == 0 { - k.p.Start(k.a.Add(bnorm)) - k.r.Start(k.a.Sub(bnorm)) - } else { - k.jr.Join(k.p, &k.r, k.u, k.a, k.anorm, bnorm) - } - k.p.Add1(b.Add(bnorm)) - k.r.Add1(b.Sub(bnorm)) - k.a, k.anorm = b, bnorm -} - -// Add2 adds a quadratic segment to the stroker. -func (k *stroker) Add2(b, c fixed.Point26_6) { - ab := b.Sub(k.a) - bc := c.Sub(b) - abnorm := pRot90CCW(pNorm(ab, k.u)) - if len(k.r) == 0 { - k.p.Start(k.a.Add(abnorm)) - k.r.Start(k.a.Sub(abnorm)) - } else { - k.jr.Join(k.p, &k.r, k.u, k.a, k.anorm, abnorm) - } - - // Approximate nearly-degenerate quadratics by linear segments. - abIsSmall := pDot(ab, ab) < epsilon - bcIsSmall := pDot(bc, bc) < epsilon - if abIsSmall || bcIsSmall { - acnorm := pRot90CCW(pNorm(c.Sub(k.a), k.u)) - k.p.Add1(c.Add(acnorm)) - k.r.Add1(c.Sub(acnorm)) - k.a, k.anorm = c, acnorm - return - } - - // The quadratic segment (k.a, b, c) has a point of maximum curvature. - // If this occurs at an end point, we process the segment as a whole. - t := curviest2(k.a, b, c) - if t <= 0 || 4096 <= t { - k.addNonCurvy2(b, c) - return - } - - // Otherwise, we perform a de Casteljau decomposition at the point of - // maximum curvature and process the two straighter parts. - mab := interpolate(k.a, b, t) - mbc := interpolate(b, c, t) - mabc := interpolate(mab, mbc, t) - - // If the vectors ab and bc are close to being in opposite directions, - // then the decomposition can become unstable, so we approximate the - // quadratic segment by two linear segments joined by an arc. - bcnorm := pRot90CCW(pNorm(bc, k.u)) - if pDot(abnorm, bcnorm) < -fixed.Int52_12(k.u)*fixed.Int52_12(k.u)*2047/2048 { - pArc := pDot(abnorm, bc) < 0 - - k.p.Add1(mabc.Add(abnorm)) - if pArc { - z := pRot90CW(abnorm) - addArc(k.p, mabc, abnorm, z) - addArc(k.p, mabc, z, bcnorm) - } - k.p.Add1(mabc.Add(bcnorm)) - k.p.Add1(c.Add(bcnorm)) - - k.r.Add1(mabc.Sub(abnorm)) - if !pArc { - z := pRot90CW(abnorm) - addArc(&k.r, mabc, pNeg(abnorm), z) - addArc(&k.r, mabc, z, pNeg(bcnorm)) - } - k.r.Add1(mabc.Sub(bcnorm)) - k.r.Add1(c.Sub(bcnorm)) - - k.a, k.anorm = c, bcnorm - return - } - - // Process the decomposed parts. - k.addNonCurvy2(mab, mabc) - k.addNonCurvy2(mbc, c) -} - -// Add3 adds a cubic segment to the stroker. -func (k *stroker) Add3(b, c, d fixed.Point26_6) { - panic("freetype/raster: stroke unimplemented for cubic segments") -} - -// stroke adds the stroked Path q to p, where q consists of exactly one curve. -func (k *stroker) stroke(q Path) { - // Stroking is implemented by deriving two paths each k.u apart from q. - // The left-hand-side path is added immediately to k.p; the right-hand-side - // path is accumulated in k.r. Once we've finished adding the LHS to k.p, - // we add the RHS in reverse order. - k.r = make(Path, 0, len(q)) - k.a = fixed.Point26_6{q[1], q[2]} - for i := 4; i < len(q); { - switch q[i] { - case 1: - k.Add1( - fixed.Point26_6{q[i+1], q[i+2]}, - ) - i += 4 - case 2: - k.Add2( - fixed.Point26_6{q[i+1], q[i+2]}, - fixed.Point26_6{q[i+3], q[i+4]}, - ) - i += 6 - case 3: - k.Add3( - fixed.Point26_6{q[i+1], q[i+2]}, - fixed.Point26_6{q[i+3], q[i+4]}, - fixed.Point26_6{q[i+5], q[i+6]}, - ) - i += 8 - default: - panic("freetype/raster: bad path") - } - } - if len(k.r) == 0 { - return - } - // TODO(nigeltao): if q is a closed curve then we should join the first and - // last segments instead of capping them. - k.cr.Cap(k.p, k.u, q.lastPoint(), pNeg(k.anorm)) - addPathReversed(k.p, k.r) - pivot := q.firstPoint() - k.cr.Cap(k.p, k.u, pivot, pivot.Sub(fixed.Point26_6{k.r[1], k.r[2]})) -} - -// Stroke adds q stroked with the given width to p. The result is typically -// self-intersecting and should be rasterized with UseNonZeroWinding. -// cr and jr may be nil, which defaults to a RoundCapper or RoundJoiner. -func Stroke(p Adder, q Path, width fixed.Int26_6, cr Capper, jr Joiner) { - if len(q) == 0 { - return - } - if cr == nil { - cr = RoundCapper - } - if jr == nil { - jr = RoundJoiner - } - if q[0] != 0 { - panic("freetype/raster: bad path") - } - s := stroker{p: p, u: width / 2, cr: cr, jr: jr} - i := 0 - for j := 4; j < len(q); { - switch q[j] { - case 0: - s.stroke(q[i:j]) - i, j = j, j+4 - case 1: - j += 4 - case 2: - j += 6 - case 3: - j += 8 - default: - panic("freetype/raster: bad path") - } - } - s.stroke(q[i:]) -} diff --git a/vendor/github.com/golang/freetype/truetype/face.go b/vendor/github.com/golang/freetype/truetype/face.go deleted file mode 100644 index 099006f..0000000 --- a/vendor/github.com/golang/freetype/truetype/face.go +++ /dev/null @@ -1,507 +0,0 @@ -// Copyright 2015 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package truetype - -import ( - "image" - "math" - - "github.com/golang/freetype/raster" - "golang.org/x/image/font" - "golang.org/x/image/math/fixed" -) - -func powerOf2(i int) bool { - return i != 0 && (i&(i-1)) == 0 -} - -// Options are optional arguments to NewFace. -type Options struct { - // Size is the font size in points, as in "a 10 point font size". - // - // A zero value means to use a 12 point font size. - Size float64 - - // DPI is the dots-per-inch resolution. - // - // A zero value means to use 72 DPI. - DPI float64 - - // Hinting is how to quantize the glyph nodes. - // - // A zero value means to use no hinting. - Hinting font.Hinting - - // GlyphCacheEntries is the number of entries in the glyph mask image - // cache. - // - // If non-zero, it must be a power of 2. - // - // A zero value means to use 512 entries. - GlyphCacheEntries int - - // SubPixelsX is the number of sub-pixel locations a glyph's dot is - // quantized to, in the horizontal direction. For example, a value of 8 - // means that the dot is quantized to 1/8th of a pixel. This quantization - // only affects the glyph mask image, not its bounding box or advance - // width. A higher value gives a more faithful glyph image, but reduces the - // effectiveness of the glyph cache. - // - // If non-zero, it must be a power of 2, and be between 1 and 64 inclusive. - // - // A zero value means to use 4 sub-pixel locations. - SubPixelsX int - - // SubPixelsY is the number of sub-pixel locations a glyph's dot is - // quantized to, in the vertical direction. For example, a value of 8 - // means that the dot is quantized to 1/8th of a pixel. This quantization - // only affects the glyph mask image, not its bounding box or advance - // width. A higher value gives a more faithful glyph image, but reduces the - // effectiveness of the glyph cache. - // - // If non-zero, it must be a power of 2, and be between 1 and 64 inclusive. - // - // A zero value means to use 1 sub-pixel location. - SubPixelsY int -} - -func (o *Options) size() float64 { - if o != nil && o.Size > 0 { - return o.Size - } - return 12 -} - -func (o *Options) dpi() float64 { - if o != nil && o.DPI > 0 { - return o.DPI - } - return 72 -} - -func (o *Options) hinting() font.Hinting { - if o != nil { - switch o.Hinting { - case font.HintingVertical, font.HintingFull: - // TODO: support vertical hinting. - return font.HintingFull - } - } - return font.HintingNone -} - -func (o *Options) glyphCacheEntries() int { - if o != nil && powerOf2(o.GlyphCacheEntries) { - return o.GlyphCacheEntries - } - // 512 is 128 * 4 * 1, which lets us cache 128 glyphs at 4 * 1 subpixel - // locations in the X and Y direction. - return 512 -} - -func (o *Options) subPixelsX() (value uint32, halfQuantum, mask fixed.Int26_6) { - if o != nil { - switch o.SubPixelsX { - case 1, 2, 4, 8, 16, 32, 64: - return subPixels(o.SubPixelsX) - } - } - // This default value of 4 isn't based on anything scientific, merely as - // small a number as possible that looks almost as good as no quantization, - // or returning subPixels(64). - return subPixels(4) -} - -func (o *Options) subPixelsY() (value uint32, halfQuantum, mask fixed.Int26_6) { - if o != nil { - switch o.SubPixelsX { - case 1, 2, 4, 8, 16, 32, 64: - return subPixels(o.SubPixelsX) - } - } - // This default value of 1 isn't based on anything scientific, merely that - // vertical sub-pixel glyph rendering is pretty rare. Baseline locations - // can usually afford to snap to the pixel grid, so the vertical direction - // doesn't have the deal with the horizontal's fractional advance widths. - return subPixels(1) -} - -// subPixels returns q and the bias and mask that leads to q quantized -// sub-pixel locations per full pixel. -// -// For example, q == 4 leads to a bias of 8 and a mask of 0xfffffff0, or -16, -// because we want to round fractions of fixed.Int26_6 as: -// - 0 to 7 rounds to 0. -// - 8 to 23 rounds to 16. -// - 24 to 39 rounds to 32. -// - 40 to 55 rounds to 48. -// - 56 to 63 rounds to 64. -// which means to add 8 and then bitwise-and with -16, in two's complement -// representation. -// -// When q == 1, we want bias == 32 and mask == -64. -// When q == 2, we want bias == 16 and mask == -32. -// When q == 4, we want bias == 8 and mask == -16. -// ... -// When q == 64, we want bias == 0 and mask == -1. (The no-op case). -// The pattern is clear. -func subPixels(q int) (value uint32, bias, mask fixed.Int26_6) { - return uint32(q), 32 / fixed.Int26_6(q), -64 / fixed.Int26_6(q) -} - -// glyphCacheEntry caches the arguments and return values of rasterize. -type glyphCacheEntry struct { - key glyphCacheKey - val glyphCacheVal -} - -type glyphCacheKey struct { - index Index - fx, fy uint8 -} - -type glyphCacheVal struct { - advanceWidth fixed.Int26_6 - offset image.Point - gw int - gh int -} - -type indexCacheEntry struct { - rune rune - index Index -} - -// NewFace returns a new font.Face for the given Font. -func NewFace(f *Font, opts *Options) font.Face { - a := &face{ - f: f, - hinting: opts.hinting(), - scale: fixed.Int26_6(0.5 + (opts.size() * opts.dpi() * 64 / 72)), - glyphCache: make([]glyphCacheEntry, opts.glyphCacheEntries()), - } - a.subPixelX, a.subPixelBiasX, a.subPixelMaskX = opts.subPixelsX() - a.subPixelY, a.subPixelBiasY, a.subPixelMaskY = opts.subPixelsY() - - // Fill the cache with invalid entries. Valid glyph cache entries have fx - // and fy in the range [0, 64). Valid index cache entries have rune >= 0. - for i := range a.glyphCache { - a.glyphCache[i].key.fy = 0xff - } - for i := range a.indexCache { - a.indexCache[i].rune = -1 - } - - // Set the rasterizer's bounds to be big enough to handle the largest glyph. - b := f.Bounds(a.scale) - xmin := +int(b.Min.X) >> 6 - ymin := -int(b.Max.Y) >> 6 - xmax := +int(b.Max.X+63) >> 6 - ymax := -int(b.Min.Y-63) >> 6 - a.maxw = xmax - xmin - a.maxh = ymax - ymin - a.masks = image.NewAlpha(image.Rect(0, 0, a.maxw, a.maxh*len(a.glyphCache))) - a.r.SetBounds(a.maxw, a.maxh) - a.p = facePainter{a} - - return a -} - -type face struct { - f *Font - hinting font.Hinting - scale fixed.Int26_6 - subPixelX uint32 - subPixelBiasX fixed.Int26_6 - subPixelMaskX fixed.Int26_6 - subPixelY uint32 - subPixelBiasY fixed.Int26_6 - subPixelMaskY fixed.Int26_6 - masks *image.Alpha - glyphCache []glyphCacheEntry - r raster.Rasterizer - p raster.Painter - paintOffset int - maxw int - maxh int - glyphBuf GlyphBuf - indexCache [indexCacheLen]indexCacheEntry - - // TODO: clip rectangle? -} - -const indexCacheLen = 256 - -func (a *face) index(r rune) Index { - const mask = indexCacheLen - 1 - c := &a.indexCache[r&mask] - if c.rune == r { - return c.index - } - i := a.f.Index(r) - c.rune = r - c.index = i - return i -} - -// Close satisfies the font.Face interface. -func (a *face) Close() error { return nil } - -// Metrics satisfies the font.Face interface. -func (a *face) Metrics() font.Metrics { - scale := float64(a.scale) - fupe := float64(a.f.FUnitsPerEm()) - return font.Metrics{ - Height: a.scale, - Ascent: fixed.Int26_6(math.Ceil(scale * float64(+a.f.ascent) / fupe)), - Descent: fixed.Int26_6(math.Ceil(scale * float64(-a.f.descent) / fupe)), - } -} - -// Kern satisfies the font.Face interface. -func (a *face) Kern(r0, r1 rune) fixed.Int26_6 { - i0 := a.index(r0) - i1 := a.index(r1) - kern := a.f.Kern(a.scale, i0, i1) - if a.hinting != font.HintingNone { - kern = (kern + 32) &^ 63 - } - return kern -} - -// Glyph satisfies the font.Face interface. -func (a *face) Glyph(dot fixed.Point26_6, r rune) ( - dr image.Rectangle, mask image.Image, maskp image.Point, advance fixed.Int26_6, ok bool) { - - // Quantize to the sub-pixel granularity. - dotX := (dot.X + a.subPixelBiasX) & a.subPixelMaskX - dotY := (dot.Y + a.subPixelBiasY) & a.subPixelMaskY - - // Split the coordinates into their integer and fractional parts. - ix, fx := int(dotX>>6), dotX&0x3f - iy, fy := int(dotY>>6), dotY&0x3f - - index := a.index(r) - cIndex := uint32(index) - cIndex = cIndex*a.subPixelX - uint32(fx/a.subPixelMaskX) - cIndex = cIndex*a.subPixelY - uint32(fy/a.subPixelMaskY) - cIndex &= uint32(len(a.glyphCache) - 1) - a.paintOffset = a.maxh * int(cIndex) - k := glyphCacheKey{ - index: index, - fx: uint8(fx), - fy: uint8(fy), - } - var v glyphCacheVal - if a.glyphCache[cIndex].key != k { - var ok bool - v, ok = a.rasterize(index, fx, fy) - if !ok { - return image.Rectangle{}, nil, image.Point{}, 0, false - } - a.glyphCache[cIndex] = glyphCacheEntry{k, v} - } else { - v = a.glyphCache[cIndex].val - } - - dr.Min = image.Point{ - X: ix + v.offset.X, - Y: iy + v.offset.Y, - } - dr.Max = image.Point{ - X: dr.Min.X + v.gw, - Y: dr.Min.Y + v.gh, - } - return dr, a.masks, image.Point{Y: a.paintOffset}, v.advanceWidth, true -} - -func (a *face) GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance fixed.Int26_6, ok bool) { - if err := a.glyphBuf.Load(a.f, a.scale, a.index(r), a.hinting); err != nil { - return fixed.Rectangle26_6{}, 0, false - } - xmin := +a.glyphBuf.Bounds.Min.X - ymin := -a.glyphBuf.Bounds.Max.Y - xmax := +a.glyphBuf.Bounds.Max.X - ymax := -a.glyphBuf.Bounds.Min.Y - if xmin > xmax || ymin > ymax { - return fixed.Rectangle26_6{}, 0, false - } - return fixed.Rectangle26_6{ - Min: fixed.Point26_6{ - X: xmin, - Y: ymin, - }, - Max: fixed.Point26_6{ - X: xmax, - Y: ymax, - }, - }, a.glyphBuf.AdvanceWidth, true -} - -func (a *face) GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool) { - if err := a.glyphBuf.Load(a.f, a.scale, a.index(r), a.hinting); err != nil { - return 0, false - } - return a.glyphBuf.AdvanceWidth, true -} - -// rasterize returns the advance width, integer-pixel offset to render at, and -// the width and height of the given glyph at the given sub-pixel offsets. -// -// The 26.6 fixed point arguments fx and fy must be in the range [0, 1). -func (a *face) rasterize(index Index, fx, fy fixed.Int26_6) (v glyphCacheVal, ok bool) { - if err := a.glyphBuf.Load(a.f, a.scale, index, a.hinting); err != nil { - return glyphCacheVal{}, false - } - // Calculate the integer-pixel bounds for the glyph. - xmin := int(fx+a.glyphBuf.Bounds.Min.X) >> 6 - ymin := int(fy-a.glyphBuf.Bounds.Max.Y) >> 6 - xmax := int(fx+a.glyphBuf.Bounds.Max.X+0x3f) >> 6 - ymax := int(fy-a.glyphBuf.Bounds.Min.Y+0x3f) >> 6 - if xmin > xmax || ymin > ymax { - return glyphCacheVal{}, false - } - // A TrueType's glyph's nodes can have negative co-ordinates, but the - // rasterizer clips anything left of x=0 or above y=0. xmin and ymin are - // the pixel offsets, based on the font's FUnit metrics, that let a - // negative co-ordinate in TrueType space be non-negative in rasterizer - // space. xmin and ymin are typically <= 0. - fx -= fixed.Int26_6(xmin << 6) - fy -= fixed.Int26_6(ymin << 6) - // Rasterize the glyph's vectors. - a.r.Clear() - pixOffset := a.paintOffset * a.maxw - clear(a.masks.Pix[pixOffset : pixOffset+a.maxw*a.maxh]) - e0 := 0 - for _, e1 := range a.glyphBuf.Ends { - a.drawContour(a.glyphBuf.Points[e0:e1], fx, fy) - e0 = e1 - } - a.r.Rasterize(a.p) - return glyphCacheVal{ - a.glyphBuf.AdvanceWidth, - image.Point{xmin, ymin}, - xmax - xmin, - ymax - ymin, - }, true -} - -func clear(pix []byte) { - for i := range pix { - pix[i] = 0 - } -} - -// drawContour draws the given closed contour with the given offset. -func (a *face) drawContour(ps []Point, dx, dy fixed.Int26_6) { - if len(ps) == 0 { - return - } - - // The low bit of each point's Flags value is whether the point is on the - // curve. Truetype fonts only have quadratic Bézier curves, not cubics. - // Thus, two consecutive off-curve points imply an on-curve point in the - // middle of those two. - // - // See http://chanae.walon.org/pub/ttf/ttf_glyphs.htm for more details. - - // ps[0] is a truetype.Point measured in FUnits and positive Y going - // upwards. start is the same thing measured in fixed point units and - // positive Y going downwards, and offset by (dx, dy). - start := fixed.Point26_6{ - X: dx + ps[0].X, - Y: dy - ps[0].Y, - } - var others []Point - if ps[0].Flags&0x01 != 0 { - others = ps[1:] - } else { - last := fixed.Point26_6{ - X: dx + ps[len(ps)-1].X, - Y: dy - ps[len(ps)-1].Y, - } - if ps[len(ps)-1].Flags&0x01 != 0 { - start = last - others = ps[:len(ps)-1] - } else { - start = fixed.Point26_6{ - X: (start.X + last.X) / 2, - Y: (start.Y + last.Y) / 2, - } - others = ps - } - } - a.r.Start(start) - q0, on0 := start, true - for _, p := range others { - q := fixed.Point26_6{ - X: dx + p.X, - Y: dy - p.Y, - } - on := p.Flags&0x01 != 0 - if on { - if on0 { - a.r.Add1(q) - } else { - a.r.Add2(q0, q) - } - } else { - if on0 { - // No-op. - } else { - mid := fixed.Point26_6{ - X: (q0.X + q.X) / 2, - Y: (q0.Y + q.Y) / 2, - } - a.r.Add2(q0, mid) - } - } - q0, on0 = q, on - } - // Close the curve. - if on0 { - a.r.Add1(start) - } else { - a.r.Add2(q0, start) - } -} - -// facePainter is like a raster.AlphaSrcPainter, with an additional Y offset -// (face.paintOffset) to the painted spans. -type facePainter struct { - a *face -} - -func (p facePainter) Paint(ss []raster.Span, done bool) { - m := p.a.masks - b := m.Bounds() - b.Min.Y = p.a.paintOffset - b.Max.Y = p.a.paintOffset + p.a.maxh - for _, s := range ss { - s.Y += p.a.paintOffset - if s.Y < b.Min.Y { - continue - } - if s.Y >= b.Max.Y { - return - } - if s.X0 < b.Min.X { - s.X0 = b.Min.X - } - if s.X1 > b.Max.X { - s.X1 = b.Max.X - } - if s.X0 >= s.X1 { - continue - } - base := (s.Y-m.Rect.Min.Y)*m.Stride - m.Rect.Min.X - p := m.Pix[base+s.X0 : base+s.X1] - color := uint8(s.Alpha >> 8) - for i := range p { - p[i] = color - } - } -} diff --git a/vendor/github.com/golang/freetype/truetype/face_test.go b/vendor/github.com/golang/freetype/truetype/face_test.go deleted file mode 100644 index 856581d..0000000 --- a/vendor/github.com/golang/freetype/truetype/face_test.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2015 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package truetype - -import ( - "image" - "image/draw" - "io/ioutil" - "strings" - "testing" - - "golang.org/x/image/font" - "golang.org/x/image/math/fixed" -) - -func BenchmarkDrawString(b *testing.B) { - data, err := ioutil.ReadFile("../licenses/gpl.txt") - if err != nil { - b.Fatal(err) - } - lines := strings.Split(string(data), "\n") - data, err = ioutil.ReadFile("../testdata/luxisr.ttf") - if err != nil { - b.Fatal(err) - } - f, err := Parse(data) - if err != nil { - b.Fatal(err) - } - dst := image.NewRGBA(image.Rect(0, 0, 800, 600)) - draw.Draw(dst, dst.Bounds(), image.White, image.ZP, draw.Src) - d := &font.Drawer{ - Dst: dst, - Src: image.Black, - Face: NewFace(f, nil), - } - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - for j, line := range lines { - d.Dot = fixed.P(0, (j*16)%600) - d.DrawString(line) - } - } -} diff --git a/vendor/github.com/golang/freetype/truetype/glyph.go b/vendor/github.com/golang/freetype/truetype/glyph.go deleted file mode 100644 index 6157ad8..0000000 --- a/vendor/github.com/golang/freetype/truetype/glyph.go +++ /dev/null @@ -1,522 +0,0 @@ -// Copyright 2010 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package truetype - -import ( - "golang.org/x/image/font" - "golang.org/x/image/math/fixed" -) - -// TODO: implement VerticalHinting. - -// A Point is a co-ordinate pair plus whether it is 'on' a contour or an 'off' -// control point. -type Point struct { - X, Y fixed.Int26_6 - // The Flags' LSB means whether or not this Point is 'on' the contour. - // Other bits are reserved for internal use. - Flags uint32 -} - -// A GlyphBuf holds a glyph's contours. A GlyphBuf can be re-used to load a -// series of glyphs from a Font. -type GlyphBuf struct { - // AdvanceWidth is the glyph's advance width. - AdvanceWidth fixed.Int26_6 - // Bounds is the glyph's bounding box. - Bounds fixed.Rectangle26_6 - // Points contains all Points from all contours of the glyph. If hinting - // was used to load a glyph then Unhinted contains those Points before they - // were hinted, and InFontUnits contains those Points before they were - // hinted and scaled. - Points, Unhinted, InFontUnits []Point - // Ends is the point indexes of the end point of each contour. The length - // of Ends is the number of contours in the glyph. The i'th contour - // consists of points Points[Ends[i-1]:Ends[i]], where Ends[-1] is - // interpreted to mean zero. - Ends []int - - font *Font - scale fixed.Int26_6 - hinting font.Hinting - hinter hinter - // phantomPoints are the co-ordinates of the synthetic phantom points - // used for hinting and bounding box calculations. - phantomPoints [4]Point - // pp1x is the X co-ordinate of the first phantom point. The '1' is - // using 1-based indexing; pp1x is almost always phantomPoints[0].X. - // TODO: eliminate this and consistently use phantomPoints[0].X. - pp1x fixed.Int26_6 - // metricsSet is whether the glyph's metrics have been set yet. For a - // compound glyph, a sub-glyph may override the outer glyph's metrics. - metricsSet bool - // tmp is a scratch buffer. - tmp []Point -} - -// Flags for decoding a glyph's contours. These flags are documented at -// http://developer.apple.com/fonts/TTRefMan/RM06/Chap6glyf.html. -const ( - flagOnCurve = 1 << iota - flagXShortVector - flagYShortVector - flagRepeat - flagPositiveXShortVector - flagPositiveYShortVector - - // The remaining flags are for internal use. - flagTouchedX - flagTouchedY -) - -// The same flag bits (0x10 and 0x20) are overloaded to have two meanings, -// dependent on the value of the flag{X,Y}ShortVector bits. -const ( - flagThisXIsSame = flagPositiveXShortVector - flagThisYIsSame = flagPositiveYShortVector -) - -// Load loads a glyph's contours from a Font, overwriting any previously loaded -// contours for this GlyphBuf. scale is the number of 26.6 fixed point units in -// 1 em, i is the glyph index, and h is the hinting policy. -func (g *GlyphBuf) Load(f *Font, scale fixed.Int26_6, i Index, h font.Hinting) error { - g.Points = g.Points[:0] - g.Unhinted = g.Unhinted[:0] - g.InFontUnits = g.InFontUnits[:0] - g.Ends = g.Ends[:0] - g.font = f - g.hinting = h - g.scale = scale - g.pp1x = 0 - g.phantomPoints = [4]Point{} - g.metricsSet = false - - if h != font.HintingNone { - if err := g.hinter.init(f, scale); err != nil { - return err - } - } - if err := g.load(0, i, true); err != nil { - return err - } - // TODO: this selection of either g.pp1x or g.phantomPoints[0].X isn't ideal, - // and should be cleaned up once we have all the testScaling tests passing, - // plus additional tests for Freetype-Go's bounding boxes matching C Freetype's. - pp1x := g.pp1x - if h != font.HintingNone { - pp1x = g.phantomPoints[0].X - } - if pp1x != 0 { - for i := range g.Points { - g.Points[i].X -= pp1x - } - } - - advanceWidth := g.phantomPoints[1].X - g.phantomPoints[0].X - if h != font.HintingNone { - if len(f.hdmx) >= 8 { - if n := u32(f.hdmx, 4); n > 3+uint32(i) { - for hdmx := f.hdmx[8:]; uint32(len(hdmx)) >= n; hdmx = hdmx[n:] { - if fixed.Int26_6(hdmx[0]) == scale>>6 { - advanceWidth = fixed.Int26_6(hdmx[2+i]) << 6 - break - } - } - } - } - advanceWidth = (advanceWidth + 32) &^ 63 - } - g.AdvanceWidth = advanceWidth - - // Set g.Bounds to the 'control box', which is the bounding box of the - // Bézier curves' control points. This is easier to calculate, no smaller - // than and often equal to the tightest possible bounding box of the curves - // themselves. This approach is what C Freetype does. We can't just scale - // the nominal bounding box in the glyf data as the hinting process and - // phantom point adjustment may move points outside of that box. - if len(g.Points) == 0 { - g.Bounds = fixed.Rectangle26_6{} - } else { - p := g.Points[0] - g.Bounds.Min.X = p.X - g.Bounds.Max.X = p.X - g.Bounds.Min.Y = p.Y - g.Bounds.Max.Y = p.Y - for _, p := range g.Points[1:] { - if g.Bounds.Min.X > p.X { - g.Bounds.Min.X = p.X - } else if g.Bounds.Max.X < p.X { - g.Bounds.Max.X = p.X - } - if g.Bounds.Min.Y > p.Y { - g.Bounds.Min.Y = p.Y - } else if g.Bounds.Max.Y < p.Y { - g.Bounds.Max.Y = p.Y - } - } - // Snap the box to the grid, if hinting is on. - if h != font.HintingNone { - g.Bounds.Min.X &^= 63 - g.Bounds.Min.Y &^= 63 - g.Bounds.Max.X += 63 - g.Bounds.Max.X &^= 63 - g.Bounds.Max.Y += 63 - g.Bounds.Max.Y &^= 63 - } - } - return nil -} - -func (g *GlyphBuf) load(recursion uint32, i Index, useMyMetrics bool) (err error) { - // The recursion limit here is arbitrary, but defends against malformed glyphs. - if recursion >= 32 { - return UnsupportedError("excessive compound glyph recursion") - } - // Find the relevant slice of g.font.glyf. - var g0, g1 uint32 - if g.font.locaOffsetFormat == locaOffsetFormatShort { - g0 = 2 * uint32(u16(g.font.loca, 2*int(i))) - g1 = 2 * uint32(u16(g.font.loca, 2*int(i)+2)) - } else { - g0 = u32(g.font.loca, 4*int(i)) - g1 = u32(g.font.loca, 4*int(i)+4) - } - - // Decode the contour count and nominal bounding box, from the first - // 10 bytes of the glyf data. boundsYMin and boundsXMax, at offsets 4 - // and 6, are unused. - glyf, ne, boundsXMin, boundsYMax := []byte(nil), 0, fixed.Int26_6(0), fixed.Int26_6(0) - if g0+10 <= g1 { - glyf = g.font.glyf[g0:g1] - ne = int(int16(u16(glyf, 0))) - boundsXMin = fixed.Int26_6(int16(u16(glyf, 2))) - boundsYMax = fixed.Int26_6(int16(u16(glyf, 8))) - } - - // Create the phantom points. - uhm, pp1x := g.font.unscaledHMetric(i), fixed.Int26_6(0) - uvm := g.font.unscaledVMetric(i, boundsYMax) - g.phantomPoints = [4]Point{ - {X: boundsXMin - uhm.LeftSideBearing}, - {X: boundsXMin - uhm.LeftSideBearing + uhm.AdvanceWidth}, - {X: uhm.AdvanceWidth / 2, Y: boundsYMax + uvm.TopSideBearing}, - {X: uhm.AdvanceWidth / 2, Y: boundsYMax + uvm.TopSideBearing - uvm.AdvanceHeight}, - } - if len(glyf) == 0 { - g.addPhantomsAndScale(len(g.Points), len(g.Points), true, true) - copy(g.phantomPoints[:], g.Points[len(g.Points)-4:]) - g.Points = g.Points[:len(g.Points)-4] - // TODO: also trim g.InFontUnits and g.Unhinted? - return nil - } - - // Load and hint the contours. - if ne < 0 { - if ne != -1 { - // http://developer.apple.com/fonts/TTRefMan/RM06/Chap6glyf.html says that - // "the values -2, -3, and so forth, are reserved for future use." - return UnsupportedError("negative number of contours") - } - pp1x = g.font.scale(g.scale * (boundsXMin - uhm.LeftSideBearing)) - if err := g.loadCompound(recursion, uhm, i, glyf, useMyMetrics); err != nil { - return err - } - } else { - np0, ne0 := len(g.Points), len(g.Ends) - program := g.loadSimple(glyf, ne) - g.addPhantomsAndScale(np0, np0, true, true) - pp1x = g.Points[len(g.Points)-4].X - if g.hinting != font.HintingNone { - if len(program) != 0 { - err := g.hinter.run( - program, - g.Points[np0:], - g.Unhinted[np0:], - g.InFontUnits[np0:], - g.Ends[ne0:], - ) - if err != nil { - return err - } - } - // Drop the four phantom points. - g.InFontUnits = g.InFontUnits[:len(g.InFontUnits)-4] - g.Unhinted = g.Unhinted[:len(g.Unhinted)-4] - } - if useMyMetrics { - copy(g.phantomPoints[:], g.Points[len(g.Points)-4:]) - } - g.Points = g.Points[:len(g.Points)-4] - if np0 != 0 { - // The hinting program expects the []Ends values to be indexed - // relative to the inner glyph, not the outer glyph, so we delay - // adding np0 until after the hinting program (if any) has run. - for i := ne0; i < len(g.Ends); i++ { - g.Ends[i] += np0 - } - } - } - if useMyMetrics && !g.metricsSet { - g.metricsSet = true - g.pp1x = pp1x - } - return nil -} - -// loadOffset is the initial offset for loadSimple and loadCompound. The first -// 10 bytes are the number of contours and the bounding box. -const loadOffset = 10 - -func (g *GlyphBuf) loadSimple(glyf []byte, ne int) (program []byte) { - offset := loadOffset - for i := 0; i < ne; i++ { - g.Ends = append(g.Ends, 1+int(u16(glyf, offset))) - offset += 2 - } - - // Note the TrueType hinting instructions. - instrLen := int(u16(glyf, offset)) - offset += 2 - program = glyf[offset : offset+instrLen] - offset += instrLen - - if ne == 0 { - return program - } - - np0 := len(g.Points) - np1 := np0 + int(g.Ends[len(g.Ends)-1]) - - // Decode the flags. - for i := np0; i < np1; { - c := uint32(glyf[offset]) - offset++ - g.Points = append(g.Points, Point{Flags: c}) - i++ - if c&flagRepeat != 0 { - count := glyf[offset] - offset++ - for ; count > 0; count-- { - g.Points = append(g.Points, Point{Flags: c}) - i++ - } - } - } - - // Decode the co-ordinates. - var x int16 - for i := np0; i < np1; i++ { - f := g.Points[i].Flags - if f&flagXShortVector != 0 { - dx := int16(glyf[offset]) - offset++ - if f&flagPositiveXShortVector == 0 { - x -= dx - } else { - x += dx - } - } else if f&flagThisXIsSame == 0 { - x += int16(u16(glyf, offset)) - offset += 2 - } - g.Points[i].X = fixed.Int26_6(x) - } - var y int16 - for i := np0; i < np1; i++ { - f := g.Points[i].Flags - if f&flagYShortVector != 0 { - dy := int16(glyf[offset]) - offset++ - if f&flagPositiveYShortVector == 0 { - y -= dy - } else { - y += dy - } - } else if f&flagThisYIsSame == 0 { - y += int16(u16(glyf, offset)) - offset += 2 - } - g.Points[i].Y = fixed.Int26_6(y) - } - - return program -} - -func (g *GlyphBuf) loadCompound(recursion uint32, uhm HMetric, i Index, - glyf []byte, useMyMetrics bool) error { - - // Flags for decoding a compound glyph. These flags are documented at - // http://developer.apple.com/fonts/TTRefMan/RM06/Chap6glyf.html. - const ( - flagArg1And2AreWords = 1 << iota - flagArgsAreXYValues - flagRoundXYToGrid - flagWeHaveAScale - flagUnused - flagMoreComponents - flagWeHaveAnXAndYScale - flagWeHaveATwoByTwo - flagWeHaveInstructions - flagUseMyMetrics - flagOverlapCompound - ) - np0, ne0 := len(g.Points), len(g.Ends) - offset := loadOffset - for { - flags := u16(glyf, offset) - component := Index(u16(glyf, offset+2)) - dx, dy, transform, hasTransform := fixed.Int26_6(0), fixed.Int26_6(0), [4]int16{}, false - if flags&flagArg1And2AreWords != 0 { - dx = fixed.Int26_6(int16(u16(glyf, offset+4))) - dy = fixed.Int26_6(int16(u16(glyf, offset+6))) - offset += 8 - } else { - dx = fixed.Int26_6(int16(int8(glyf[offset+4]))) - dy = fixed.Int26_6(int16(int8(glyf[offset+5]))) - offset += 6 - } - if flags&flagArgsAreXYValues == 0 { - return UnsupportedError("compound glyph transform vector") - } - if flags&(flagWeHaveAScale|flagWeHaveAnXAndYScale|flagWeHaveATwoByTwo) != 0 { - hasTransform = true - switch { - case flags&flagWeHaveAScale != 0: - transform[0] = int16(u16(glyf, offset+0)) - transform[3] = transform[0] - offset += 2 - case flags&flagWeHaveAnXAndYScale != 0: - transform[0] = int16(u16(glyf, offset+0)) - transform[3] = int16(u16(glyf, offset+2)) - offset += 4 - case flags&flagWeHaveATwoByTwo != 0: - transform[0] = int16(u16(glyf, offset+0)) - transform[1] = int16(u16(glyf, offset+2)) - transform[2] = int16(u16(glyf, offset+4)) - transform[3] = int16(u16(glyf, offset+6)) - offset += 8 - } - } - savedPP := g.phantomPoints - np0 := len(g.Points) - componentUMM := useMyMetrics && (flags&flagUseMyMetrics != 0) - if err := g.load(recursion+1, component, componentUMM); err != nil { - return err - } - if flags&flagUseMyMetrics == 0 { - g.phantomPoints = savedPP - } - if hasTransform { - for j := np0; j < len(g.Points); j++ { - p := &g.Points[j] - newX := 0 + - fixed.Int26_6((int64(p.X)*int64(transform[0])+1<<13)>>14) + - fixed.Int26_6((int64(p.Y)*int64(transform[2])+1<<13)>>14) - newY := 0 + - fixed.Int26_6((int64(p.X)*int64(transform[1])+1<<13)>>14) + - fixed.Int26_6((int64(p.Y)*int64(transform[3])+1<<13)>>14) - p.X, p.Y = newX, newY - } - } - dx = g.font.scale(g.scale * dx) - dy = g.font.scale(g.scale * dy) - if flags&flagRoundXYToGrid != 0 { - dx = (dx + 32) &^ 63 - dy = (dy + 32) &^ 63 - } - for j := np0; j < len(g.Points); j++ { - p := &g.Points[j] - p.X += dx - p.Y += dy - } - // TODO: also adjust g.InFontUnits and g.Unhinted? - if flags&flagMoreComponents == 0 { - break - } - } - - instrLen := 0 - if g.hinting != font.HintingNone && offset+2 <= len(glyf) { - instrLen = int(u16(glyf, offset)) - offset += 2 - } - - g.addPhantomsAndScale(np0, len(g.Points), false, instrLen > 0) - points, ends := g.Points[np0:], g.Ends[ne0:] - g.Points = g.Points[:len(g.Points)-4] - for j := range points { - points[j].Flags &^= flagTouchedX | flagTouchedY - } - - if instrLen == 0 { - if !g.metricsSet { - copy(g.phantomPoints[:], points[len(points)-4:]) - } - return nil - } - - // Hint the compound glyph. - program := glyf[offset : offset+instrLen] - // Temporarily adjust the ends to be relative to this compound glyph. - if np0 != 0 { - for i := range ends { - ends[i] -= np0 - } - } - // Hinting instructions of a composite glyph completely refer to the - // (already) hinted subglyphs. - g.tmp = append(g.tmp[:0], points...) - if err := g.hinter.run(program, points, g.tmp, g.tmp, ends); err != nil { - return err - } - if np0 != 0 { - for i := range ends { - ends[i] += np0 - } - } - if !g.metricsSet { - copy(g.phantomPoints[:], points[len(points)-4:]) - } - return nil -} - -func (g *GlyphBuf) addPhantomsAndScale(np0, np1 int, simple, adjust bool) { - // Add the four phantom points. - g.Points = append(g.Points, g.phantomPoints[:]...) - // Scale the points. - if simple && g.hinting != font.HintingNone { - g.InFontUnits = append(g.InFontUnits, g.Points[np1:]...) - } - for i := np1; i < len(g.Points); i++ { - p := &g.Points[i] - p.X = g.font.scale(g.scale * p.X) - p.Y = g.font.scale(g.scale * p.Y) - } - if g.hinting == font.HintingNone { - return - } - // Round the 1st phantom point to the grid, shifting all other points equally. - // Note that "all other points" starts from np0, not np1. - // TODO: delete this adjustment and the np0/np1 distinction, when - // we update the compatibility tests to C Freetype 2.5.3. - // See http://git.savannah.gnu.org/cgit/freetype/freetype2.git/commit/?id=05c786d990390a7ca18e62962641dac740bacb06 - if adjust { - pp1x := g.Points[len(g.Points)-4].X - if dx := ((pp1x + 32) &^ 63) - pp1x; dx != 0 { - for i := np0; i < len(g.Points); i++ { - g.Points[i].X += dx - } - } - } - if simple { - g.Unhinted = append(g.Unhinted, g.Points[np1:]...) - } - // Round the 2nd and 4th phantom point to the grid. - p := &g.Points[len(g.Points)-3] - p.X = (p.X + 32) &^ 63 - p = &g.Points[len(g.Points)-1] - p.Y = (p.Y + 32) &^ 63 -} diff --git a/vendor/github.com/golang/freetype/truetype/hint.go b/vendor/github.com/golang/freetype/truetype/hint.go deleted file mode 100644 index 13f785b..0000000 --- a/vendor/github.com/golang/freetype/truetype/hint.go +++ /dev/null @@ -1,1770 +0,0 @@ -// Copyright 2012 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package truetype - -// This file implements a Truetype bytecode interpreter. -// The opcodes are described at https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html - -import ( - "errors" - "math" - - "golang.org/x/image/math/fixed" -) - -const ( - twilightZone = 0 - glyphZone = 1 - numZone = 2 -) - -type pointType uint32 - -const ( - current pointType = 0 - unhinted pointType = 1 - inFontUnits pointType = 2 - numPointType = 3 -) - -// callStackEntry is a bytecode call stack entry. -type callStackEntry struct { - program []byte - pc int - loopCount int32 -} - -// hinter implements bytecode hinting. A hinter can be re-used to hint a series -// of glyphs from a Font. -type hinter struct { - stack, store []int32 - - // functions is a map from function number to bytecode. - functions map[int32][]byte - - // font and scale are the font and scale last used for this hinter. - // Changing the font will require running the new font's fpgm bytecode. - // Changing either will require running the font's prep bytecode. - font *Font - scale fixed.Int26_6 - - // gs and defaultGS are the current and default graphics state. The - // default graphics state is the global default graphics state after - // the font's fpgm and prep programs have been run. - gs, defaultGS graphicsState - - // points and ends are the twilight zone's points, glyph's points - // and glyph's contour boundaries. - points [numZone][numPointType][]Point - ends []int - - // scaledCVT is the lazily initialized scaled Control Value Table. - scaledCVTInitialized bool - scaledCVT []fixed.Int26_6 -} - -// graphicsState is described at https://developer.apple.com/fonts/TTRefMan/RM04/Chap4.html -type graphicsState struct { - // Projection vector, freedom vector and dual projection vector. - pv, fv, dv [2]f2dot14 - // Reference points and zone pointers. - rp, zp [3]int32 - // Control Value / Single Width Cut-In. - controlValueCutIn, singleWidthCutIn, singleWidth fixed.Int26_6 - // Delta base / shift. - deltaBase, deltaShift int32 - // Minimum distance. - minDist fixed.Int26_6 - // Loop count. - loop int32 - // Rounding policy. - roundPeriod, roundPhase, roundThreshold fixed.Int26_6 - roundSuper45 bool - // Auto-flip. - autoFlip bool -} - -var globalDefaultGS = graphicsState{ - pv: [2]f2dot14{0x4000, 0}, // Unit vector along the X axis. - fv: [2]f2dot14{0x4000, 0}, - dv: [2]f2dot14{0x4000, 0}, - zp: [3]int32{1, 1, 1}, - controlValueCutIn: (17 << 6) / 16, // 17/16 as a fixed.Int26_6. - deltaBase: 9, - deltaShift: 3, - minDist: 1 << 6, // 1 as a fixed.Int26_6. - loop: 1, - roundPeriod: 1 << 6, // 1 as a fixed.Int26_6. - roundThreshold: 1 << 5, // 1/2 as a fixed.Int26_6. - roundSuper45: false, - autoFlip: true, -} - -func resetTwilightPoints(f *Font, p []Point) []Point { - if n := int(f.maxTwilightPoints) + 4; n <= cap(p) { - p = p[:n] - for i := range p { - p[i] = Point{} - } - } else { - p = make([]Point, n) - } - return p -} - -func (h *hinter) init(f *Font, scale fixed.Int26_6) error { - h.points[twilightZone][0] = resetTwilightPoints(f, h.points[twilightZone][0]) - h.points[twilightZone][1] = resetTwilightPoints(f, h.points[twilightZone][1]) - h.points[twilightZone][2] = resetTwilightPoints(f, h.points[twilightZone][2]) - - rescale := h.scale != scale - if h.font != f { - h.font, rescale = f, true - if h.functions == nil { - h.functions = make(map[int32][]byte) - } else { - for k := range h.functions { - delete(h.functions, k) - } - } - - if x := int(f.maxStackElements); x > len(h.stack) { - x += 255 - x &^= 255 - h.stack = make([]int32, x) - } - if x := int(f.maxStorage); x > len(h.store) { - x += 15 - x &^= 15 - h.store = make([]int32, x) - } - if len(f.fpgm) != 0 { - if err := h.run(f.fpgm, nil, nil, nil, nil); err != nil { - return err - } - } - } - - if rescale { - h.scale = scale - h.scaledCVTInitialized = false - - h.defaultGS = globalDefaultGS - - if len(f.prep) != 0 { - if err := h.run(f.prep, nil, nil, nil, nil); err != nil { - return err - } - h.defaultGS = h.gs - // The MS rasterizer doesn't allow the following graphics state - // variables to be modified by the CVT program. - h.defaultGS.pv = globalDefaultGS.pv - h.defaultGS.fv = globalDefaultGS.fv - h.defaultGS.dv = globalDefaultGS.dv - h.defaultGS.rp = globalDefaultGS.rp - h.defaultGS.zp = globalDefaultGS.zp - h.defaultGS.loop = globalDefaultGS.loop - } - } - return nil -} - -func (h *hinter) run(program []byte, pCurrent, pUnhinted, pInFontUnits []Point, ends []int) error { - h.gs = h.defaultGS - h.points[glyphZone][current] = pCurrent - h.points[glyphZone][unhinted] = pUnhinted - h.points[glyphZone][inFontUnits] = pInFontUnits - h.ends = ends - - if len(program) > 50000 { - return errors.New("truetype: hinting: too many instructions") - } - var ( - steps, pc, top int - opcode uint8 - - callStack [32]callStackEntry - callStackTop int - ) - - for 0 <= pc && pc < len(program) { - steps++ - if steps == 100000 { - return errors.New("truetype: hinting: too many steps") - } - opcode = program[pc] - if top < int(popCount[opcode]) { - return errors.New("truetype: hinting: stack underflow") - } - switch opcode { - - case opSVTCA0: - h.gs.pv = [2]f2dot14{0, 0x4000} - h.gs.fv = [2]f2dot14{0, 0x4000} - h.gs.dv = [2]f2dot14{0, 0x4000} - - case opSVTCA1: - h.gs.pv = [2]f2dot14{0x4000, 0} - h.gs.fv = [2]f2dot14{0x4000, 0} - h.gs.dv = [2]f2dot14{0x4000, 0} - - case opSPVTCA0: - h.gs.pv = [2]f2dot14{0, 0x4000} - h.gs.dv = [2]f2dot14{0, 0x4000} - - case opSPVTCA1: - h.gs.pv = [2]f2dot14{0x4000, 0} - h.gs.dv = [2]f2dot14{0x4000, 0} - - case opSFVTCA0: - h.gs.fv = [2]f2dot14{0, 0x4000} - - case opSFVTCA1: - h.gs.fv = [2]f2dot14{0x4000, 0} - - case opSPVTL0, opSPVTL1, opSFVTL0, opSFVTL1: - top -= 2 - p1 := h.point(0, current, h.stack[top+0]) - p2 := h.point(0, current, h.stack[top+1]) - if p1 == nil || p2 == nil { - return errors.New("truetype: hinting: point out of range") - } - dx := f2dot14(p1.X - p2.X) - dy := f2dot14(p1.Y - p2.Y) - if dx == 0 && dy == 0 { - dx = 0x4000 - } else if opcode&1 != 0 { - // Counter-clockwise rotation. - dx, dy = -dy, dx - } - v := normalize(dx, dy) - if opcode < opSFVTL0 { - h.gs.pv = v - h.gs.dv = v - } else { - h.gs.fv = v - } - - case opSPVFS: - top -= 2 - h.gs.pv = normalize(f2dot14(h.stack[top]), f2dot14(h.stack[top+1])) - h.gs.dv = h.gs.pv - - case opSFVFS: - top -= 2 - h.gs.fv = normalize(f2dot14(h.stack[top]), f2dot14(h.stack[top+1])) - - case opGPV: - if top+1 >= len(h.stack) { - return errors.New("truetype: hinting: stack overflow") - } - h.stack[top+0] = int32(h.gs.pv[0]) - h.stack[top+1] = int32(h.gs.pv[1]) - top += 2 - - case opGFV: - if top+1 >= len(h.stack) { - return errors.New("truetype: hinting: stack overflow") - } - h.stack[top+0] = int32(h.gs.fv[0]) - h.stack[top+1] = int32(h.gs.fv[1]) - top += 2 - - case opSFVTPV: - h.gs.fv = h.gs.pv - - case opISECT: - top -= 5 - p := h.point(2, current, h.stack[top+0]) - a0 := h.point(1, current, h.stack[top+1]) - a1 := h.point(1, current, h.stack[top+2]) - b0 := h.point(0, current, h.stack[top+3]) - b1 := h.point(0, current, h.stack[top+4]) - if p == nil || a0 == nil || a1 == nil || b0 == nil || b1 == nil { - return errors.New("truetype: hinting: point out of range") - } - - dbx := b1.X - b0.X - dby := b1.Y - b0.Y - dax := a1.X - a0.X - day := a1.Y - a0.Y - dx := b0.X - a0.X - dy := b0.Y - a0.Y - discriminant := mulDiv(int64(dax), int64(-dby), 0x40) + - mulDiv(int64(day), int64(dbx), 0x40) - dotProduct := mulDiv(int64(dax), int64(dbx), 0x40) + - mulDiv(int64(day), int64(dby), 0x40) - // The discriminant above is actually a cross product of vectors - // da and db. Together with the dot product, they can be used as - // surrogates for sine and cosine of the angle between the vectors. - // Indeed, - // dotproduct = |da||db|cos(angle) - // discriminant = |da||db|sin(angle) - // We use these equations to reject grazing intersections by - // thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. - absDisc, absDotP := discriminant, dotProduct - if absDisc < 0 { - absDisc = -absDisc - } - if absDotP < 0 { - absDotP = -absDotP - } - if 19*absDisc > absDotP { - val := mulDiv(int64(dx), int64(-dby), 0x40) + - mulDiv(int64(dy), int64(dbx), 0x40) - rx := mulDiv(val, int64(dax), discriminant) - ry := mulDiv(val, int64(day), discriminant) - p.X = a0.X + fixed.Int26_6(rx) - p.Y = a0.Y + fixed.Int26_6(ry) - } else { - p.X = (a0.X + a1.X + b0.X + b1.X) / 4 - p.Y = (a0.Y + a1.Y + b0.Y + b1.Y) / 4 - } - p.Flags |= flagTouchedX | flagTouchedY - - case opSRP0, opSRP1, opSRP2: - top-- - h.gs.rp[opcode-opSRP0] = h.stack[top] - - case opSZP0, opSZP1, opSZP2: - top-- - h.gs.zp[opcode-opSZP0] = h.stack[top] - - case opSZPS: - top-- - h.gs.zp[0] = h.stack[top] - h.gs.zp[1] = h.stack[top] - h.gs.zp[2] = h.stack[top] - - case opSLOOP: - top-- - // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM05/Chap5.html#SLOOP - // says that "Setting the loop variable to zero is an error". In - // theory, the inequality on the next line should be "<=" instead - // of "<". In practice, some font files' bytecode, such as the '2' - // glyph in the DejaVuSansMono.ttf that comes with Ubuntu 14.04, - // issue SLOOP with a zero on top of the stack. Just like the C - // Freetype code, we allow the zero. - if h.stack[top] < 0 { - return errors.New("truetype: hinting: invalid data") - } - h.gs.loop = h.stack[top] - - case opRTG: - h.gs.roundPeriod = 1 << 6 - h.gs.roundPhase = 0 - h.gs.roundThreshold = 1 << 5 - h.gs.roundSuper45 = false - - case opRTHG: - h.gs.roundPeriod = 1 << 6 - h.gs.roundPhase = 1 << 5 - h.gs.roundThreshold = 1 << 5 - h.gs.roundSuper45 = false - - case opSMD: - top-- - h.gs.minDist = fixed.Int26_6(h.stack[top]) - - case opELSE: - opcode = 1 - goto ifelse - - case opJMPR: - top-- - pc += int(h.stack[top]) - continue - - case opSCVTCI: - top-- - h.gs.controlValueCutIn = fixed.Int26_6(h.stack[top]) - - case opSSWCI: - top-- - h.gs.singleWidthCutIn = fixed.Int26_6(h.stack[top]) - - case opSSW: - top-- - h.gs.singleWidth = h.font.scale(h.scale * fixed.Int26_6(h.stack[top])) - - case opDUP: - if top >= len(h.stack) { - return errors.New("truetype: hinting: stack overflow") - } - h.stack[top] = h.stack[top-1] - top++ - - case opPOP: - top-- - - case opCLEAR: - top = 0 - - case opSWAP: - h.stack[top-1], h.stack[top-2] = h.stack[top-2], h.stack[top-1] - - case opDEPTH: - if top >= len(h.stack) { - return errors.New("truetype: hinting: stack overflow") - } - h.stack[top] = int32(top) - top++ - - case opCINDEX, opMINDEX: - x := int(h.stack[top-1]) - if x <= 0 || x >= top { - return errors.New("truetype: hinting: invalid data") - } - h.stack[top-1] = h.stack[top-1-x] - if opcode == opMINDEX { - copy(h.stack[top-1-x:top-1], h.stack[top-x:top]) - top-- - } - - case opALIGNPTS: - top -= 2 - p := h.point(1, current, h.stack[top]) - q := h.point(0, current, h.stack[top+1]) - if p == nil || q == nil { - return errors.New("truetype: hinting: point out of range") - } - d := dotProduct(fixed.Int26_6(q.X-p.X), fixed.Int26_6(q.Y-p.Y), h.gs.pv) / 2 - h.move(p, +d, true) - h.move(q, -d, true) - - case opUTP: - top-- - p := h.point(0, current, h.stack[top]) - if p == nil { - return errors.New("truetype: hinting: point out of range") - } - p.Flags &^= flagTouchedX | flagTouchedY - - case opLOOPCALL, opCALL: - if callStackTop >= len(callStack) { - return errors.New("truetype: hinting: call stack overflow") - } - top-- - f, ok := h.functions[h.stack[top]] - if !ok { - return errors.New("truetype: hinting: undefined function") - } - callStack[callStackTop] = callStackEntry{program, pc, 1} - if opcode == opLOOPCALL { - top-- - if h.stack[top] == 0 { - break - } - callStack[callStackTop].loopCount = h.stack[top] - } - callStackTop++ - program, pc = f, 0 - continue - - case opFDEF: - // Save all bytecode up until the next ENDF. - startPC := pc + 1 - fdefloop: - for { - pc++ - if pc >= len(program) { - return errors.New("truetype: hinting: unbalanced FDEF") - } - switch program[pc] { - case opFDEF: - return errors.New("truetype: hinting: nested FDEF") - case opENDF: - top-- - h.functions[h.stack[top]] = program[startPC : pc+1] - break fdefloop - default: - var ok bool - pc, ok = skipInstructionPayload(program, pc) - if !ok { - return errors.New("truetype: hinting: unbalanced FDEF") - } - } - } - - case opENDF: - if callStackTop == 0 { - return errors.New("truetype: hinting: call stack underflow") - } - callStackTop-- - callStack[callStackTop].loopCount-- - if callStack[callStackTop].loopCount != 0 { - callStackTop++ - pc = 0 - continue - } - program, pc = callStack[callStackTop].program, callStack[callStackTop].pc - - case opMDAP0, opMDAP1: - top-- - i := h.stack[top] - p := h.point(0, current, i) - if p == nil { - return errors.New("truetype: hinting: point out of range") - } - distance := fixed.Int26_6(0) - if opcode == opMDAP1 { - distance = dotProduct(p.X, p.Y, h.gs.pv) - // TODO: metrics compensation. - distance = h.round(distance) - distance - } - h.move(p, distance, true) - h.gs.rp[0] = i - h.gs.rp[1] = i - - case opIUP0, opIUP1: - iupY, mask := opcode == opIUP0, uint32(flagTouchedX) - if iupY { - mask = flagTouchedY - } - prevEnd := 0 - for _, end := range h.ends { - for i := prevEnd; i < end; i++ { - for i < end && h.points[glyphZone][current][i].Flags&mask == 0 { - i++ - } - if i == end { - break - } - firstTouched, curTouched := i, i - i++ - for ; i < end; i++ { - if h.points[glyphZone][current][i].Flags&mask != 0 { - h.iupInterp(iupY, curTouched+1, i-1, curTouched, i) - curTouched = i - } - } - if curTouched == firstTouched { - h.iupShift(iupY, prevEnd, end, curTouched) - } else { - h.iupInterp(iupY, curTouched+1, end-1, curTouched, firstTouched) - if firstTouched > 0 { - h.iupInterp(iupY, prevEnd, firstTouched-1, curTouched, firstTouched) - } - } - } - prevEnd = end - } - - case opSHP0, opSHP1: - if top < int(h.gs.loop) { - return errors.New("truetype: hinting: stack underflow") - } - _, _, d, ok := h.displacement(opcode&1 == 0) - if !ok { - return errors.New("truetype: hinting: point out of range") - } - for ; h.gs.loop != 0; h.gs.loop-- { - top-- - p := h.point(2, current, h.stack[top]) - if p == nil { - return errors.New("truetype: hinting: point out of range") - } - h.move(p, d, true) - } - h.gs.loop = 1 - - case opSHC0, opSHC1: - top-- - zonePointer, i, d, ok := h.displacement(opcode&1 == 0) - if !ok { - return errors.New("truetype: hinting: point out of range") - } - if h.gs.zp[2] == 0 { - // TODO: implement this when we have a glyph that does this. - return errors.New("hinting: unimplemented SHC instruction") - } - contour := h.stack[top] - if contour < 0 || len(ends) <= int(contour) { - return errors.New("truetype: hinting: contour out of range") - } - j0, j1 := int32(0), int32(h.ends[contour]) - if contour > 0 { - j0 = int32(h.ends[contour-1]) - } - move := h.gs.zp[zonePointer] != h.gs.zp[2] - for j := j0; j < j1; j++ { - if move || j != i { - h.move(h.point(2, current, j), d, true) - } - } - - case opSHZ0, opSHZ1: - top-- - zonePointer, i, d, ok := h.displacement(opcode&1 == 0) - if !ok { - return errors.New("truetype: hinting: point out of range") - } - - // As per C Freetype, SHZ doesn't move the phantom points, or mark - // the points as touched. - limit := int32(len(h.points[h.gs.zp[2]][current])) - if h.gs.zp[2] == glyphZone { - limit -= 4 - } - for j := int32(0); j < limit; j++ { - if i != j || h.gs.zp[zonePointer] != h.gs.zp[2] { - h.move(h.point(2, current, j), d, false) - } - } - - case opSHPIX: - top-- - d := fixed.Int26_6(h.stack[top]) - if top < int(h.gs.loop) { - return errors.New("truetype: hinting: stack underflow") - } - for ; h.gs.loop != 0; h.gs.loop-- { - top-- - p := h.point(2, current, h.stack[top]) - if p == nil { - return errors.New("truetype: hinting: point out of range") - } - h.move(p, d, true) - } - h.gs.loop = 1 - - case opIP: - if top < int(h.gs.loop) { - return errors.New("truetype: hinting: stack underflow") - } - pointType := inFontUnits - twilight := h.gs.zp[0] == 0 || h.gs.zp[1] == 0 || h.gs.zp[2] == 0 - if twilight { - pointType = unhinted - } - p := h.point(1, pointType, h.gs.rp[2]) - oldP := h.point(0, pointType, h.gs.rp[1]) - oldRange := dotProduct(p.X-oldP.X, p.Y-oldP.Y, h.gs.dv) - - p = h.point(1, current, h.gs.rp[2]) - curP := h.point(0, current, h.gs.rp[1]) - curRange := dotProduct(p.X-curP.X, p.Y-curP.Y, h.gs.pv) - for ; h.gs.loop != 0; h.gs.loop-- { - top-- - i := h.stack[top] - p = h.point(2, pointType, i) - oldDist := dotProduct(p.X-oldP.X, p.Y-oldP.Y, h.gs.dv) - p = h.point(2, current, i) - curDist := dotProduct(p.X-curP.X, p.Y-curP.Y, h.gs.pv) - newDist := fixed.Int26_6(0) - if oldDist != 0 { - if oldRange != 0 { - newDist = fixed.Int26_6(mulDiv(int64(oldDist), int64(curRange), int64(oldRange))) - } else { - newDist = -oldDist - } - } - h.move(p, newDist-curDist, true) - } - h.gs.loop = 1 - - case opMSIRP0, opMSIRP1: - top -= 2 - i := h.stack[top] - distance := fixed.Int26_6(h.stack[top+1]) - - // TODO: special case h.gs.zp[1] == 0 in C Freetype. - ref := h.point(0, current, h.gs.rp[0]) - p := h.point(1, current, i) - if ref == nil || p == nil { - return errors.New("truetype: hinting: point out of range") - } - curDist := dotProduct(p.X-ref.X, p.Y-ref.Y, h.gs.pv) - - // Set-RP0 bit. - if opcode == opMSIRP1 { - h.gs.rp[0] = i - } - h.gs.rp[1] = h.gs.rp[0] - h.gs.rp[2] = i - - // Move the point. - h.move(p, distance-curDist, true) - - case opALIGNRP: - if top < int(h.gs.loop) { - return errors.New("truetype: hinting: stack underflow") - } - ref := h.point(0, current, h.gs.rp[0]) - if ref == nil { - return errors.New("truetype: hinting: point out of range") - } - for ; h.gs.loop != 0; h.gs.loop-- { - top-- - p := h.point(1, current, h.stack[top]) - if p == nil { - return errors.New("truetype: hinting: point out of range") - } - h.move(p, -dotProduct(p.X-ref.X, p.Y-ref.Y, h.gs.pv), true) - } - h.gs.loop = 1 - - case opRTDG: - h.gs.roundPeriod = 1 << 5 - h.gs.roundPhase = 0 - h.gs.roundThreshold = 1 << 4 - h.gs.roundSuper45 = false - - case opMIAP0, opMIAP1: - top -= 2 - i := h.stack[top] - distance := h.getScaledCVT(h.stack[top+1]) - if h.gs.zp[0] == 0 { - p := h.point(0, unhinted, i) - q := h.point(0, current, i) - p.X = fixed.Int26_6((int64(distance) * int64(h.gs.fv[0])) >> 14) - p.Y = fixed.Int26_6((int64(distance) * int64(h.gs.fv[1])) >> 14) - *q = *p - } - p := h.point(0, current, i) - oldDist := dotProduct(p.X, p.Y, h.gs.pv) - if opcode == opMIAP1 { - if fabs(distance-oldDist) > h.gs.controlValueCutIn { - distance = oldDist - } - // TODO: metrics compensation. - distance = h.round(distance) - } - h.move(p, distance-oldDist, true) - h.gs.rp[0] = i - h.gs.rp[1] = i - - case opNPUSHB: - opcode = 0 - goto push - - case opNPUSHW: - opcode = 0x80 - goto push - - case opWS: - top -= 2 - i := int(h.stack[top]) - if i < 0 || len(h.store) <= i { - return errors.New("truetype: hinting: invalid data") - } - h.store[i] = h.stack[top+1] - - case opRS: - i := int(h.stack[top-1]) - if i < 0 || len(h.store) <= i { - return errors.New("truetype: hinting: invalid data") - } - h.stack[top-1] = h.store[i] - - case opWCVTP: - top -= 2 - h.setScaledCVT(h.stack[top], fixed.Int26_6(h.stack[top+1])) - - case opRCVT: - h.stack[top-1] = int32(h.getScaledCVT(h.stack[top-1])) - - case opGC0, opGC1: - i := h.stack[top-1] - if opcode == opGC0 { - p := h.point(2, current, i) - h.stack[top-1] = int32(dotProduct(p.X, p.Y, h.gs.pv)) - } else { - p := h.point(2, unhinted, i) - // Using dv as per C Freetype. - h.stack[top-1] = int32(dotProduct(p.X, p.Y, h.gs.dv)) - } - - case opSCFS: - top -= 2 - i := h.stack[top] - p := h.point(2, current, i) - if p == nil { - return errors.New("truetype: hinting: point out of range") - } - c := dotProduct(p.X, p.Y, h.gs.pv) - h.move(p, fixed.Int26_6(h.stack[top+1])-c, true) - if h.gs.zp[2] != 0 { - break - } - q := h.point(2, unhinted, i) - if q == nil { - return errors.New("truetype: hinting: point out of range") - } - q.X = p.X - q.Y = p.Y - - case opMD0, opMD1: - top-- - pt, v, scale := pointType(0), [2]f2dot14{}, false - if opcode == opMD0 { - pt = current - v = h.gs.pv - } else if h.gs.zp[0] == 0 || h.gs.zp[1] == 0 { - pt = unhinted - v = h.gs.dv - } else { - pt = inFontUnits - v = h.gs.dv - scale = true - } - p := h.point(0, pt, h.stack[top-1]) - q := h.point(1, pt, h.stack[top]) - if p == nil || q == nil { - return errors.New("truetype: hinting: point out of range") - } - d := int32(dotProduct(p.X-q.X, p.Y-q.Y, v)) - if scale { - d = int32(int64(d*int32(h.scale)) / int64(h.font.fUnitsPerEm)) - } - h.stack[top-1] = d - - case opMPPEM, opMPS: - if top >= len(h.stack) { - return errors.New("truetype: hinting: stack overflow") - } - // For MPS, point size should be irrelevant; we return the PPEM. - h.stack[top] = int32(h.scale) >> 6 - top++ - - case opFLIPON, opFLIPOFF: - h.gs.autoFlip = opcode == opFLIPON - - case opDEBUG: - // No-op. - - case opLT: - top-- - h.stack[top-1] = bool2int32(h.stack[top-1] < h.stack[top]) - - case opLTEQ: - top-- - h.stack[top-1] = bool2int32(h.stack[top-1] <= h.stack[top]) - - case opGT: - top-- - h.stack[top-1] = bool2int32(h.stack[top-1] > h.stack[top]) - - case opGTEQ: - top-- - h.stack[top-1] = bool2int32(h.stack[top-1] >= h.stack[top]) - - case opEQ: - top-- - h.stack[top-1] = bool2int32(h.stack[top-1] == h.stack[top]) - - case opNEQ: - top-- - h.stack[top-1] = bool2int32(h.stack[top-1] != h.stack[top]) - - case opODD, opEVEN: - i := h.round(fixed.Int26_6(h.stack[top-1])) >> 6 - h.stack[top-1] = int32(i&1) ^ int32(opcode-opODD) - - case opIF: - top-- - if h.stack[top] == 0 { - opcode = 0 - goto ifelse - } - - case opEIF: - // No-op. - - case opAND: - top-- - h.stack[top-1] = bool2int32(h.stack[top-1] != 0 && h.stack[top] != 0) - - case opOR: - top-- - h.stack[top-1] = bool2int32(h.stack[top-1]|h.stack[top] != 0) - - case opNOT: - h.stack[top-1] = bool2int32(h.stack[top-1] == 0) - - case opDELTAP1: - goto delta - - case opSDB: - top-- - h.gs.deltaBase = h.stack[top] - - case opSDS: - top-- - h.gs.deltaShift = h.stack[top] - - case opADD: - top-- - h.stack[top-1] += h.stack[top] - - case opSUB: - top-- - h.stack[top-1] -= h.stack[top] - - case opDIV: - top-- - if h.stack[top] == 0 { - return errors.New("truetype: hinting: division by zero") - } - h.stack[top-1] = int32(fdiv(fixed.Int26_6(h.stack[top-1]), fixed.Int26_6(h.stack[top]))) - - case opMUL: - top-- - h.stack[top-1] = int32(fmul(fixed.Int26_6(h.stack[top-1]), fixed.Int26_6(h.stack[top]))) - - case opABS: - if h.stack[top-1] < 0 { - h.stack[top-1] = -h.stack[top-1] - } - - case opNEG: - h.stack[top-1] = -h.stack[top-1] - - case opFLOOR: - h.stack[top-1] &^= 63 - - case opCEILING: - h.stack[top-1] += 63 - h.stack[top-1] &^= 63 - - case opROUND00, opROUND01, opROUND10, opROUND11: - // The four flavors of opROUND are equivalent. See the comment below on - // opNROUND for the rationale. - h.stack[top-1] = int32(h.round(fixed.Int26_6(h.stack[top-1]))) - - case opNROUND00, opNROUND01, opNROUND10, opNROUND11: - // No-op. The spec says to add one of four "compensations for the engine - // characteristics", to cater for things like "different dot-size printers". - // https://developer.apple.com/fonts/TTRefMan/RM02/Chap2.html#engine_compensation - // This code does not implement engine compensation, as we don't expect to - // be used to output on dot-matrix printers. - - case opWCVTF: - top -= 2 - h.setScaledCVT(h.stack[top], h.font.scale(h.scale*fixed.Int26_6(h.stack[top+1]))) - - case opDELTAP2, opDELTAP3, opDELTAC1, opDELTAC2, opDELTAC3: - goto delta - - case opSROUND, opS45ROUND: - top-- - switch (h.stack[top] >> 6) & 0x03 { - case 0: - h.gs.roundPeriod = 1 << 5 - case 1, 3: - h.gs.roundPeriod = 1 << 6 - case 2: - h.gs.roundPeriod = 1 << 7 - } - h.gs.roundSuper45 = opcode == opS45ROUND - if h.gs.roundSuper45 { - // The spec says to multiply by √2, but the C Freetype code says 1/√2. - // We go with 1/√2. - h.gs.roundPeriod *= 46341 - h.gs.roundPeriod /= 65536 - } - h.gs.roundPhase = h.gs.roundPeriod * fixed.Int26_6((h.stack[top]>>4)&0x03) / 4 - if x := h.stack[top] & 0x0f; x != 0 { - h.gs.roundThreshold = h.gs.roundPeriod * fixed.Int26_6(x-4) / 8 - } else { - h.gs.roundThreshold = h.gs.roundPeriod - 1 - } - - case opJROT: - top -= 2 - if h.stack[top+1] != 0 { - pc += int(h.stack[top]) - continue - } - - case opJROF: - top -= 2 - if h.stack[top+1] == 0 { - pc += int(h.stack[top]) - continue - } - - case opROFF: - h.gs.roundPeriod = 0 - h.gs.roundPhase = 0 - h.gs.roundThreshold = 0 - h.gs.roundSuper45 = false - - case opRUTG: - h.gs.roundPeriod = 1 << 6 - h.gs.roundPhase = 0 - h.gs.roundThreshold = 1<<6 - 1 - h.gs.roundSuper45 = false - - case opRDTG: - h.gs.roundPeriod = 1 << 6 - h.gs.roundPhase = 0 - h.gs.roundThreshold = 0 - h.gs.roundSuper45 = false - - case opSANGW, opAA: - // These ops are "anachronistic" and no longer used. - top-- - - case opFLIPPT: - if top < int(h.gs.loop) { - return errors.New("truetype: hinting: stack underflow") - } - points := h.points[glyphZone][current] - for ; h.gs.loop != 0; h.gs.loop-- { - top-- - i := h.stack[top] - if i < 0 || len(points) <= int(i) { - return errors.New("truetype: hinting: point out of range") - } - points[i].Flags ^= flagOnCurve - } - h.gs.loop = 1 - - case opFLIPRGON, opFLIPRGOFF: - top -= 2 - i, j, points := h.stack[top], h.stack[top+1], h.points[glyphZone][current] - if i < 0 || len(points) <= int(i) || j < 0 || len(points) <= int(j) { - return errors.New("truetype: hinting: point out of range") - } - for ; i <= j; i++ { - if opcode == opFLIPRGON { - points[i].Flags |= flagOnCurve - } else { - points[i].Flags &^= flagOnCurve - } - } - - case opSCANCTRL: - // We do not support dropout control, as we always rasterize grayscale glyphs. - top-- - - case opSDPVTL0, opSDPVTL1: - top -= 2 - for i := 0; i < 2; i++ { - pt := unhinted - if i != 0 { - pt = current - } - p := h.point(1, pt, h.stack[top]) - q := h.point(2, pt, h.stack[top+1]) - if p == nil || q == nil { - return errors.New("truetype: hinting: point out of range") - } - dx := f2dot14(p.X - q.X) - dy := f2dot14(p.Y - q.Y) - if dx == 0 && dy == 0 { - dx = 0x4000 - } else if opcode&1 != 0 { - // Counter-clockwise rotation. - dx, dy = -dy, dx - } - if i == 0 { - h.gs.dv = normalize(dx, dy) - } else { - h.gs.pv = normalize(dx, dy) - } - } - - case opGETINFO: - res := int32(0) - if h.stack[top-1]&(1<<0) != 0 { - // Set the engine version. We hard-code this to 35, the same as - // the C freetype code, which says that "Version~35 corresponds - // to MS rasterizer v.1.7 as used e.g. in Windows~98". - res |= 35 - } - if h.stack[top-1]&(1<<5) != 0 { - // Set that we support grayscale. - res |= 1 << 12 - } - // We set no other bits, as we do not support rotated or stretched glyphs. - h.stack[top-1] = res - - case opIDEF: - // IDEF is for ancient versions of the bytecode interpreter, and is no longer used. - return errors.New("truetype: hinting: unsupported IDEF instruction") - - case opROLL: - h.stack[top-1], h.stack[top-3], h.stack[top-2] = - h.stack[top-3], h.stack[top-2], h.stack[top-1] - - case opMAX: - top-- - if h.stack[top-1] < h.stack[top] { - h.stack[top-1] = h.stack[top] - } - - case opMIN: - top-- - if h.stack[top-1] > h.stack[top] { - h.stack[top-1] = h.stack[top] - } - - case opSCANTYPE: - // We do not support dropout control, as we always rasterize grayscale glyphs. - top-- - - case opINSTCTRL: - // TODO: support instruction execution control? It seems rare, and even when - // nominally used (e.g. Source Sans Pro), it seems conditional on extreme or - // unusual rasterization conditions. For example, the code snippet at - // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html#INSTCTRL - // uses INSTCTRL when grid-fitting a rotated or stretched glyph, but - // freetype-go does not support rotated or stretched glyphs. - top -= 2 - - default: - if opcode < opPUSHB000 { - return errors.New("truetype: hinting: unrecognized instruction") - } - - if opcode < opMDRP00000 { - // PUSHxxxx opcode. - - if opcode < opPUSHW000 { - opcode -= opPUSHB000 - 1 - } else { - opcode -= opPUSHW000 - 1 - 0x80 - } - goto push - } - - if opcode < opMIRP00000 { - // MDRPxxxxx opcode. - - top-- - i := h.stack[top] - ref := h.point(0, current, h.gs.rp[0]) - p := h.point(1, current, i) - if ref == nil || p == nil { - return errors.New("truetype: hinting: point out of range") - } - - oldDist := fixed.Int26_6(0) - if h.gs.zp[0] == 0 || h.gs.zp[1] == 0 { - p0 := h.point(1, unhinted, i) - p1 := h.point(0, unhinted, h.gs.rp[0]) - oldDist = dotProduct(p0.X-p1.X, p0.Y-p1.Y, h.gs.dv) - } else { - p0 := h.point(1, inFontUnits, i) - p1 := h.point(0, inFontUnits, h.gs.rp[0]) - oldDist = dotProduct(p0.X-p1.X, p0.Y-p1.Y, h.gs.dv) - oldDist = h.font.scale(h.scale * oldDist) - } - - // Single-width cut-in test. - if x := fabs(oldDist - h.gs.singleWidth); x < h.gs.singleWidthCutIn { - if oldDist >= 0 { - oldDist = +h.gs.singleWidth - } else { - oldDist = -h.gs.singleWidth - } - } - - // Rounding bit. - // TODO: metrics compensation. - distance := oldDist - if opcode&0x04 != 0 { - distance = h.round(oldDist) - } - - // Minimum distance bit. - if opcode&0x08 != 0 { - if oldDist >= 0 { - if distance < h.gs.minDist { - distance = h.gs.minDist - } - } else { - if distance > -h.gs.minDist { - distance = -h.gs.minDist - } - } - } - - // Set-RP0 bit. - h.gs.rp[1] = h.gs.rp[0] - h.gs.rp[2] = i - if opcode&0x10 != 0 { - h.gs.rp[0] = i - } - - // Move the point. - oldDist = dotProduct(p.X-ref.X, p.Y-ref.Y, h.gs.pv) - h.move(p, distance-oldDist, true) - - } else { - // MIRPxxxxx opcode. - - top -= 2 - i := h.stack[top] - cvtDist := h.getScaledCVT(h.stack[top+1]) - if fabs(cvtDist-h.gs.singleWidth) < h.gs.singleWidthCutIn { - if cvtDist >= 0 { - cvtDist = +h.gs.singleWidth - } else { - cvtDist = -h.gs.singleWidth - } - } - - if h.gs.zp[1] == 0 { - // TODO: implement once we have a .ttf file that triggers - // this, so that we can step through C's freetype. - return errors.New("truetype: hinting: unimplemented twilight point adjustment") - } - - ref := h.point(0, unhinted, h.gs.rp[0]) - p := h.point(1, unhinted, i) - if ref == nil || p == nil { - return errors.New("truetype: hinting: point out of range") - } - oldDist := dotProduct(p.X-ref.X, p.Y-ref.Y, h.gs.dv) - - ref = h.point(0, current, h.gs.rp[0]) - p = h.point(1, current, i) - if ref == nil || p == nil { - return errors.New("truetype: hinting: point out of range") - } - curDist := dotProduct(p.X-ref.X, p.Y-ref.Y, h.gs.pv) - - if h.gs.autoFlip && oldDist^cvtDist < 0 { - cvtDist = -cvtDist - } - - // Rounding bit. - // TODO: metrics compensation. - distance := cvtDist - if opcode&0x04 != 0 { - // The CVT value is only used if close enough to oldDist. - if (h.gs.zp[0] == h.gs.zp[1]) && - (fabs(cvtDist-oldDist) > h.gs.controlValueCutIn) { - - distance = oldDist - } - distance = h.round(distance) - } - - // Minimum distance bit. - if opcode&0x08 != 0 { - if oldDist >= 0 { - if distance < h.gs.minDist { - distance = h.gs.minDist - } - } else { - if distance > -h.gs.minDist { - distance = -h.gs.minDist - } - } - } - - // Set-RP0 bit. - h.gs.rp[1] = h.gs.rp[0] - h.gs.rp[2] = i - if opcode&0x10 != 0 { - h.gs.rp[0] = i - } - - // Move the point. - h.move(p, distance-curDist, true) - } - } - pc++ - continue - - ifelse: - // Skip past bytecode until the next ELSE (if opcode == 0) or the - // next EIF (for all opcodes). Opcode == 0 means that we have come - // from an IF. Opcode == 1 means that we have come from an ELSE. - { - ifelseloop: - for depth := 0; ; { - pc++ - if pc >= len(program) { - return errors.New("truetype: hinting: unbalanced IF or ELSE") - } - switch program[pc] { - case opIF: - depth++ - case opELSE: - if depth == 0 && opcode == 0 { - break ifelseloop - } - case opEIF: - depth-- - if depth < 0 { - break ifelseloop - } - default: - var ok bool - pc, ok = skipInstructionPayload(program, pc) - if !ok { - return errors.New("truetype: hinting: unbalanced IF or ELSE") - } - } - } - pc++ - continue - } - - push: - // Push n elements from the program to the stack, where n is the low 7 bits of - // opcode. If the low 7 bits are zero, then n is the next byte from the program. - // The high bit being 0 means that the elements are zero-extended bytes. - // The high bit being 1 means that the elements are sign-extended words. - { - width := 1 - if opcode&0x80 != 0 { - opcode &^= 0x80 - width = 2 - } - if opcode == 0 { - pc++ - if pc >= len(program) { - return errors.New("truetype: hinting: insufficient data") - } - opcode = program[pc] - } - pc++ - if top+int(opcode) > len(h.stack) { - return errors.New("truetype: hinting: stack overflow") - } - if pc+width*int(opcode) > len(program) { - return errors.New("truetype: hinting: insufficient data") - } - for ; opcode > 0; opcode-- { - if width == 1 { - h.stack[top] = int32(program[pc]) - } else { - h.stack[top] = int32(int8(program[pc]))<<8 | int32(program[pc+1]) - } - top++ - pc += width - } - continue - } - - delta: - { - if opcode >= opDELTAC1 && !h.scaledCVTInitialized { - h.initializeScaledCVT() - } - top-- - n := h.stack[top] - if int32(top) < 2*n { - return errors.New("truetype: hinting: stack underflow") - } - for ; n > 0; n-- { - top -= 2 - b := h.stack[top] - c := (b & 0xf0) >> 4 - switch opcode { - case opDELTAP2, opDELTAC2: - c += 16 - case opDELTAP3, opDELTAC3: - c += 32 - } - c += h.gs.deltaBase - if ppem := (int32(h.scale) + 1<<5) >> 6; ppem != c { - continue - } - b = (b & 0x0f) - 8 - if b >= 0 { - b++ - } - b = b * 64 / (1 << uint32(h.gs.deltaShift)) - if opcode >= opDELTAC1 { - a := h.stack[top+1] - if a < 0 || len(h.scaledCVT) <= int(a) { - return errors.New("truetype: hinting: index out of range") - } - h.scaledCVT[a] += fixed.Int26_6(b) - } else { - p := h.point(0, current, h.stack[top+1]) - if p == nil { - return errors.New("truetype: hinting: point out of range") - } - h.move(p, fixed.Int26_6(b), true) - } - } - pc++ - continue - } - } - return nil -} - -func (h *hinter) initializeScaledCVT() { - h.scaledCVTInitialized = true - if n := len(h.font.cvt) / 2; n <= cap(h.scaledCVT) { - h.scaledCVT = h.scaledCVT[:n] - } else { - if n < 32 { - n = 32 - } - h.scaledCVT = make([]fixed.Int26_6, len(h.font.cvt)/2, n) - } - for i := range h.scaledCVT { - unscaled := uint16(h.font.cvt[2*i])<<8 | uint16(h.font.cvt[2*i+1]) - h.scaledCVT[i] = h.font.scale(h.scale * fixed.Int26_6(int16(unscaled))) - } -} - -// getScaledCVT returns the scaled value from the font's Control Value Table. -func (h *hinter) getScaledCVT(i int32) fixed.Int26_6 { - if !h.scaledCVTInitialized { - h.initializeScaledCVT() - } - if i < 0 || len(h.scaledCVT) <= int(i) { - return 0 - } - return h.scaledCVT[i] -} - -// setScaledCVT overrides the scaled value from the font's Control Value Table. -func (h *hinter) setScaledCVT(i int32, v fixed.Int26_6) { - if !h.scaledCVTInitialized { - h.initializeScaledCVT() - } - if i < 0 || len(h.scaledCVT) <= int(i) { - return - } - h.scaledCVT[i] = v -} - -func (h *hinter) point(zonePointer uint32, pt pointType, i int32) *Point { - points := h.points[h.gs.zp[zonePointer]][pt] - if i < 0 || len(points) <= int(i) { - return nil - } - return &points[i] -} - -func (h *hinter) move(p *Point, distance fixed.Int26_6, touch bool) { - fvx := int64(h.gs.fv[0]) - pvx := int64(h.gs.pv[0]) - if fvx == 0x4000 && pvx == 0x4000 { - p.X += fixed.Int26_6(distance) - if touch { - p.Flags |= flagTouchedX - } - return - } - - fvy := int64(h.gs.fv[1]) - pvy := int64(h.gs.pv[1]) - if fvy == 0x4000 && pvy == 0x4000 { - p.Y += fixed.Int26_6(distance) - if touch { - p.Flags |= flagTouchedY - } - return - } - - fvDotPv := (fvx*pvx + fvy*pvy) >> 14 - - if fvx != 0 { - p.X += fixed.Int26_6(mulDiv(fvx, int64(distance), fvDotPv)) - if touch { - p.Flags |= flagTouchedX - } - } - - if fvy != 0 { - p.Y += fixed.Int26_6(mulDiv(fvy, int64(distance), fvDotPv)) - if touch { - p.Flags |= flagTouchedY - } - } -} - -func (h *hinter) iupInterp(interpY bool, p1, p2, ref1, ref2 int) { - if p1 > p2 { - return - } - if ref1 >= len(h.points[glyphZone][current]) || - ref2 >= len(h.points[glyphZone][current]) { - return - } - - var ifu1, ifu2 fixed.Int26_6 - if interpY { - ifu1 = h.points[glyphZone][inFontUnits][ref1].Y - ifu2 = h.points[glyphZone][inFontUnits][ref2].Y - } else { - ifu1 = h.points[glyphZone][inFontUnits][ref1].X - ifu2 = h.points[glyphZone][inFontUnits][ref2].X - } - if ifu1 > ifu2 { - ifu1, ifu2 = ifu2, ifu1 - ref1, ref2 = ref2, ref1 - } - - var unh1, unh2, delta1, delta2 fixed.Int26_6 - if interpY { - unh1 = h.points[glyphZone][unhinted][ref1].Y - unh2 = h.points[glyphZone][unhinted][ref2].Y - delta1 = h.points[glyphZone][current][ref1].Y - unh1 - delta2 = h.points[glyphZone][current][ref2].Y - unh2 - } else { - unh1 = h.points[glyphZone][unhinted][ref1].X - unh2 = h.points[glyphZone][unhinted][ref2].X - delta1 = h.points[glyphZone][current][ref1].X - unh1 - delta2 = h.points[glyphZone][current][ref2].X - unh2 - } - - var xy, ifuXY fixed.Int26_6 - if ifu1 == ifu2 { - for i := p1; i <= p2; i++ { - if interpY { - xy = h.points[glyphZone][unhinted][i].Y - } else { - xy = h.points[glyphZone][unhinted][i].X - } - - if xy <= unh1 { - xy += delta1 - } else { - xy += delta2 - } - - if interpY { - h.points[glyphZone][current][i].Y = xy - } else { - h.points[glyphZone][current][i].X = xy - } - } - return - } - - scale, scaleOK := int64(0), false - for i := p1; i <= p2; i++ { - if interpY { - xy = h.points[glyphZone][unhinted][i].Y - ifuXY = h.points[glyphZone][inFontUnits][i].Y - } else { - xy = h.points[glyphZone][unhinted][i].X - ifuXY = h.points[glyphZone][inFontUnits][i].X - } - - if xy <= unh1 { - xy += delta1 - } else if xy >= unh2 { - xy += delta2 - } else { - if !scaleOK { - scaleOK = true - scale = mulDiv(int64(unh2+delta2-unh1-delta1), 0x10000, int64(ifu2-ifu1)) - } - numer := int64(ifuXY-ifu1) * scale - if numer >= 0 { - numer += 0x8000 - } else { - numer -= 0x8000 - } - xy = unh1 + delta1 + fixed.Int26_6(numer/0x10000) - } - - if interpY { - h.points[glyphZone][current][i].Y = xy - } else { - h.points[glyphZone][current][i].X = xy - } - } -} - -func (h *hinter) iupShift(interpY bool, p1, p2, p int) { - var delta fixed.Int26_6 - if interpY { - delta = h.points[glyphZone][current][p].Y - h.points[glyphZone][unhinted][p].Y - } else { - delta = h.points[glyphZone][current][p].X - h.points[glyphZone][unhinted][p].X - } - if delta == 0 { - return - } - for i := p1; i < p2; i++ { - if i == p { - continue - } - if interpY { - h.points[glyphZone][current][i].Y += delta - } else { - h.points[glyphZone][current][i].X += delta - } - } -} - -func (h *hinter) displacement(useZP1 bool) (zonePointer uint32, i int32, d fixed.Int26_6, ok bool) { - zonePointer, i = uint32(0), h.gs.rp[1] - if useZP1 { - zonePointer, i = 1, h.gs.rp[2] - } - p := h.point(zonePointer, current, i) - q := h.point(zonePointer, unhinted, i) - if p == nil || q == nil { - return 0, 0, 0, false - } - d = dotProduct(p.X-q.X, p.Y-q.Y, h.gs.pv) - return zonePointer, i, d, true -} - -// skipInstructionPayload increments pc by the extra data that follows a -// variable length PUSHB or PUSHW instruction. -func skipInstructionPayload(program []byte, pc int) (newPC int, ok bool) { - switch program[pc] { - case opNPUSHB: - pc++ - if pc >= len(program) { - return 0, false - } - pc += int(program[pc]) - case opNPUSHW: - pc++ - if pc >= len(program) { - return 0, false - } - pc += 2 * int(program[pc]) - case opPUSHB000, opPUSHB001, opPUSHB010, opPUSHB011, - opPUSHB100, opPUSHB101, opPUSHB110, opPUSHB111: - pc += int(program[pc] - (opPUSHB000 - 1)) - case opPUSHW000, opPUSHW001, opPUSHW010, opPUSHW011, - opPUSHW100, opPUSHW101, opPUSHW110, opPUSHW111: - pc += 2 * int(program[pc]-(opPUSHW000-1)) - } - return pc, true -} - -// f2dot14 is a 2.14 fixed point number. -type f2dot14 int16 - -func normalize(x, y f2dot14) [2]f2dot14 { - fx, fy := float64(x), float64(y) - l := 0x4000 / math.Hypot(fx, fy) - fx *= l - if fx >= 0 { - fx += 0.5 - } else { - fx -= 0.5 - } - fy *= l - if fy >= 0 { - fy += 0.5 - } else { - fy -= 0.5 - } - return [2]f2dot14{f2dot14(fx), f2dot14(fy)} -} - -// fabs returns abs(x) in 26.6 fixed point arithmetic. -func fabs(x fixed.Int26_6) fixed.Int26_6 { - if x < 0 { - return -x - } - return x -} - -// fdiv returns x/y in 26.6 fixed point arithmetic. -func fdiv(x, y fixed.Int26_6) fixed.Int26_6 { - return fixed.Int26_6((int64(x) << 6) / int64(y)) -} - -// fmul returns x*y in 26.6 fixed point arithmetic. -func fmul(x, y fixed.Int26_6) fixed.Int26_6 { - return fixed.Int26_6((int64(x)*int64(y) + 1<<5) >> 6) -} - -// dotProduct returns the dot product of [x, y] and q. It is almost the same as -// px := int64(x) -// py := int64(y) -// qx := int64(q[0]) -// qy := int64(q[1]) -// return fixed.Int26_6((px*qx + py*qy + 1<<13) >> 14) -// except that the computation is done with 32-bit integers to produce exactly -// the same rounding behavior as C Freetype. -func dotProduct(x, y fixed.Int26_6, q [2]f2dot14) fixed.Int26_6 { - // Compute x*q[0] as 64-bit value. - l := uint32((int32(x) & 0xFFFF) * int32(q[0])) - m := (int32(x) >> 16) * int32(q[0]) - - lo1 := l + (uint32(m) << 16) - hi1 := (m >> 16) + (int32(l) >> 31) + bool2int32(lo1 < l) - - // Compute y*q[1] as 64-bit value. - l = uint32((int32(y) & 0xFFFF) * int32(q[1])) - m = (int32(y) >> 16) * int32(q[1]) - - lo2 := l + (uint32(m) << 16) - hi2 := (m >> 16) + (int32(l) >> 31) + bool2int32(lo2 < l) - - // Add them. - lo := lo1 + lo2 - hi := hi1 + hi2 + bool2int32(lo < lo1) - - // Divide the result by 2^14 with rounding. - s := hi >> 31 - l = lo + uint32(s) - hi += s + bool2int32(l < lo) - lo = l - - l = lo + 0x2000 - hi += bool2int32(l < lo) - - return fixed.Int26_6((uint32(hi) << 18) | (l >> 14)) -} - -// mulDiv returns x*y/z, rounded to the nearest integer. -func mulDiv(x, y, z int64) int64 { - xy := x * y - if z < 0 { - xy, z = -xy, -z - } - if xy >= 0 { - xy += z / 2 - } else { - xy -= z / 2 - } - return xy / z -} - -// round rounds the given number. The rounding algorithm is described at -// https://developer.apple.com/fonts/TTRefMan/RM02/Chap2.html#rounding -func (h *hinter) round(x fixed.Int26_6) fixed.Int26_6 { - if h.gs.roundPeriod == 0 { - // Rounding is off. - return x - } - if x >= 0 { - ret := x - h.gs.roundPhase + h.gs.roundThreshold - if h.gs.roundSuper45 { - ret /= h.gs.roundPeriod - ret *= h.gs.roundPeriod - } else { - ret &= -h.gs.roundPeriod - } - if x != 0 && ret < 0 { - ret = 0 - } - return ret + h.gs.roundPhase - } - ret := -x - h.gs.roundPhase + h.gs.roundThreshold - if h.gs.roundSuper45 { - ret /= h.gs.roundPeriod - ret *= h.gs.roundPeriod - } else { - ret &= -h.gs.roundPeriod - } - if ret < 0 { - ret = 0 - } - return -ret - h.gs.roundPhase -} - -func bool2int32(b bool) int32 { - if b { - return 1 - } - return 0 -} diff --git a/vendor/github.com/golang/freetype/truetype/hint_test.go b/vendor/github.com/golang/freetype/truetype/hint_test.go deleted file mode 100644 index 7eb43dd..0000000 --- a/vendor/github.com/golang/freetype/truetype/hint_test.go +++ /dev/null @@ -1,675 +0,0 @@ -// Copyright 2012 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package truetype - -import ( - "reflect" - "strings" - "testing" - - "golang.org/x/image/math/fixed" -) - -func TestBytecode(t *testing.T) { - testCases := []struct { - desc string - prog []byte - want []int32 - errStr string - }{ - { - "underflow", - []byte{ - opDUP, - }, - nil, - "underflow", - }, - { - "infinite loop", - []byte{ - opPUSHW000, // [-1] - 0xff, - 0xff, - opDUP, // [-1, -1] - opJMPR, // [-1] - }, - nil, - "too many steps", - }, - { - "unbalanced if/else", - []byte{ - opPUSHB000, // [0] - 0, - opIF, - }, - nil, - "unbalanced", - }, - { - "vector set/gets", - []byte{ - opSVTCA1, // [] - opGPV, // [0x4000, 0] - opSVTCA0, // [0x4000, 0] - opGFV, // [0x4000, 0, 0, 0x4000] - opNEG, // [0x4000, 0, 0, -0x4000] - opSPVFS, // [0x4000, 0] - opSFVTPV, // [0x4000, 0] - opPUSHB000, // [0x4000, 0, 1] - 1, - opGFV, // [0x4000, 0, 1, 0, -0x4000] - opPUSHB000, // [0x4000, 0, 1, 0, -0x4000, 2] - 2, - }, - []int32{0x4000, 0, 1, 0, -0x4000, 2}, - "", - }, - { - "jumps", - []byte{ - opPUSHB001, // [10, 2] - 10, - 2, - opJMPR, // [10] - opDUP, // not executed - opDUP, // [10, 10] - opPUSHB010, // [10, 10, 20, 2, 1] - 20, - 2, - 1, - opJROT, // [10, 10, 20] - opDUP, // not executed - opDUP, // [10, 10, 20, 20] - opPUSHB010, // [10, 10, 20, 20, 30, 2, 1] - 30, - 2, - 1, - opJROF, // [10, 10, 20, 20, 30] - opDUP, // [10, 10, 20, 20, 30, 30] - opDUP, // [10, 10, 20, 20, 30, 30, 30] - }, - []int32{10, 10, 20, 20, 30, 30, 30}, - "", - }, - { - "stack ops", - []byte{ - opPUSHB010, // [10, 20, 30] - 10, - 20, - 30, - opCLEAR, // [] - opPUSHB010, // [40, 50, 60] - 40, - 50, - 60, - opSWAP, // [40, 60, 50] - opDUP, // [40, 60, 50, 50] - opDUP, // [40, 60, 50, 50, 50] - opPOP, // [40, 60, 50, 50] - opDEPTH, // [40, 60, 50, 50, 4] - opCINDEX, // [40, 60, 50, 50, 40] - opPUSHB000, // [40, 60, 50, 50, 40, 4] - 4, - opMINDEX, // [40, 50, 50, 40, 60] - }, - []int32{40, 50, 50, 40, 60}, - "", - }, - { - "push ops", - []byte{ - opPUSHB000, // [255] - 255, - opPUSHW001, // [255, -2, 253] - 255, - 254, - 0, - 253, - opNPUSHB, // [1, -2, 253, 1, 2] - 2, - 1, - 2, - opNPUSHW, // [1, -2, 253, 1, 2, 0x0405, 0x0607, 0x0809] - 3, - 4, - 5, - 6, - 7, - 8, - 9, - }, - []int32{255, -2, 253, 1, 2, 0x0405, 0x0607, 0x0809}, - "", - }, - { - "store ops", - []byte{ - opPUSHB011, // [1, 22, 3, 44] - 1, - 22, - 3, - 44, - opWS, // [1, 22] - opWS, // [] - opPUSHB000, // [3] - 3, - opRS, // [44] - }, - []int32{44}, - "", - }, - { - "comparison ops", - []byte{ - opPUSHB001, // [10, 20] - 10, - 20, - opLT, // [1] - opPUSHB001, // [1, 10, 20] - 10, - 20, - opLTEQ, // [1, 1] - opPUSHB001, // [1, 1, 10, 20] - 10, - 20, - opGT, // [1, 1, 0] - opPUSHB001, // [1, 1, 0, 10, 20] - 10, - 20, - opGTEQ, // [1, 1, 0, 0] - opEQ, // [1, 1, 1] - opNEQ, // [1, 0] - }, - []int32{1, 0}, - "", - }, - { - "odd/even", - // Calculate odd(2+31/64), odd(2+32/64), even(2), even(1). - []byte{ - opPUSHB000, // [159] - 159, - opODD, // [0] - opPUSHB000, // [0, 160] - 160, - opODD, // [0, 1] - opPUSHB000, // [0, 1, 128] - 128, - opEVEN, // [0, 1, 1] - opPUSHB000, // [0, 1, 1, 64] - 64, - opEVEN, // [0, 1, 1, 0] - }, - []int32{0, 1, 1, 0}, - "", - }, - { - "if true", - []byte{ - opPUSHB001, // [255, 1] - 255, - 1, - opIF, - opPUSHB000, // [255, 2] - 2, - opEIF, - opPUSHB000, // [255, 2, 254] - 254, - }, - []int32{255, 2, 254}, - "", - }, - { - "if false", - []byte{ - opPUSHB001, // [255, 0] - 255, - 0, - opIF, - opPUSHB000, // [255] - 2, - opEIF, - opPUSHB000, // [255, 254] - 254, - }, - []int32{255, 254}, - "", - }, - { - "if/else true", - []byte{ - opPUSHB000, // [1] - 1, - opIF, - opPUSHB000, // [2] - 2, - opELSE, - opPUSHB000, // not executed - 3, - opEIF, - }, - []int32{2}, - "", - }, - { - "if/else false", - []byte{ - opPUSHB000, // [0] - 0, - opIF, - opPUSHB000, // not executed - 2, - opELSE, - opPUSHB000, // [3] - 3, - opEIF, - }, - []int32{3}, - "", - }, - { - "if/else true if/else false", - // 0x58 is the opcode for opIF. The literal 0x58s below are pushed data. - []byte{ - opPUSHB010, // [255, 0, 1] - 255, - 0, - 1, - opIF, - opIF, - opPUSHB001, // not executed - 0x58, - 0x58, - opELSE, - opPUSHW000, // [255, 0x5858] - 0x58, - 0x58, - opEIF, - opELSE, - opIF, - opNPUSHB, // not executed - 3, - 0x58, - 0x58, - 0x58, - opELSE, - opNPUSHW, // not executed - 2, - 0x58, - 0x58, - 0x58, - 0x58, - opEIF, - opEIF, - opPUSHB000, // [255, 0x5858, 254] - 254, - }, - []int32{255, 0x5858, 254}, - "", - }, - { - "if/else false if/else true", - // 0x58 is the opcode for opIF. The literal 0x58s below are pushed data. - []byte{ - opPUSHB010, // [255, 1, 0] - 255, - 1, - 0, - opIF, - opIF, - opPUSHB001, // not executed - 0x58, - 0x58, - opELSE, - opPUSHW000, // not executed - 0x58, - 0x58, - opEIF, - opELSE, - opIF, - opNPUSHB, // [255, 0x58, 0x58, 0x58] - 3, - 0x58, - 0x58, - 0x58, - opELSE, - opNPUSHW, // not executed - 2, - 0x58, - 0x58, - 0x58, - 0x58, - opEIF, - opEIF, - opPUSHB000, // [255, 0x58, 0x58, 0x58, 254] - 254, - }, - []int32{255, 0x58, 0x58, 0x58, 254}, - "", - }, - { - "logical ops", - []byte{ - opPUSHB010, // [0, 10, 20] - 0, - 10, - 20, - opAND, // [0, 1] - opOR, // [1] - opNOT, // [0] - }, - []int32{0}, - "", - }, - { - "arithmetic ops", - // Calculate abs((-(1 - (2*3)))/2 + 1/64). - // The answer is 5/2 + 1/64 in ideal numbers, or 161 in 26.6 fixed point math. - []byte{ - opPUSHB010, // [64, 128, 192] - 1 << 6, - 2 << 6, - 3 << 6, - opMUL, // [64, 384] - opSUB, // [-320] - opNEG, // [320] - opPUSHB000, // [320, 128] - 2 << 6, - opDIV, // [160] - opPUSHB000, // [160, 1] - 1, - opADD, // [161] - opABS, // [161] - }, - []int32{161}, - "", - }, - { - "floor, ceiling", - []byte{ - opPUSHB000, // [96] - 96, - opFLOOR, // [64] - opPUSHB000, // [64, 96] - 96, - opCEILING, // [64, 128] - }, - []int32{64, 128}, - "", - }, - { - "rounding", - // Round 1.40625 (which is 90/64) under various rounding policies. - // See figure 20 of https://developer.apple.com/fonts/TTRefMan/RM02/Chap2.html#rounding - []byte{ - opROFF, // [] - opPUSHB000, // [90] - 90, - opROUND00, // [90] - opRTG, // [90] - opPUSHB000, // [90, 90] - 90, - opROUND00, // [90, 64] - opRTHG, // [90, 64] - opPUSHB000, // [90, 64, 90] - 90, - opROUND00, // [90, 64, 96] - opRDTG, // [90, 64, 96] - opPUSHB000, // [90, 64, 96, 90] - 90, - opROUND00, // [90, 64, 96, 64] - opRUTG, // [90, 64, 96, 64] - opPUSHB000, // [90, 64, 96, 64, 90] - 90, - opROUND00, // [90, 64, 96, 64, 128] - opRTDG, // [90, 64, 96, 64, 128] - opPUSHB000, // [90, 64, 96, 64, 128, 90] - 90, - opROUND00, // [90, 64, 96, 64, 128, 96] - }, - []int32{90, 64, 96, 64, 128, 96}, - "", - }, - { - "super-rounding", - // See figure 20 of https://developer.apple.com/fonts/TTRefMan/RM02/Chap2.html#rounding - // and the sign preservation steps of the "Order of rounding operations" section. - []byte{ - opPUSHB000, // [0x58] - 0x58, - opSROUND, // [] - opPUSHW000, // [-81] - 0xff, - 0xaf, - opROUND00, // [-80] - opPUSHW000, // [-80, -80] - 0xff, - 0xb0, - opROUND00, // [-80, -80] - opPUSHW000, // [-80, -80, -17] - 0xff, - 0xef, - opROUND00, // [-80, -80, -16] - opPUSHW000, // [-80, -80, -16, -16] - 0xff, - 0xf0, - opROUND00, // [-80, -80, -16, -16] - opPUSHB000, // [-80, -80, -16, -16, 0] - 0, - opROUND00, // [-80, -80, -16, -16, 16] - opPUSHB000, // [-80, -80, -16, -16, 16, 16] - 16, - opROUND00, // [-80, -80, -16, -16, 16, 16] - opPUSHB000, // [-80, -80, -16, -16, 16, 16, 47] - 47, - opROUND00, // [-80, -80, -16, -16, 16, 16, 16] - opPUSHB000, // [-80, -80, -16, -16, 16, 16, 16, 48] - 48, - opROUND00, // [-80, -80, -16, -16, 16, 16, 16, 80] - }, - []int32{-80, -80, -16, -16, 16, 16, 16, 80}, - "", - }, - { - "roll", - []byte{ - opPUSHB010, // [1, 2, 3] - 1, - 2, - 3, - opROLL, // [2, 3, 1] - }, - []int32{2, 3, 1}, - "", - }, - { - "max/min", - []byte{ - opPUSHW001, // [-2, -3] - 0xff, - 0xfe, - 0xff, - 0xfd, - opMAX, // [-2] - opPUSHW001, // [-2, -4, -5] - 0xff, - 0xfc, - 0xff, - 0xfb, - opMIN, // [-2, -5] - }, - []int32{-2, -5}, - "", - }, - { - "functions", - []byte{ - opPUSHB011, // [3, 7, 0, 3] - 3, - 7, - 0, - 3, - - opFDEF, // Function #3 (not called) - opPUSHB000, - 98, - opENDF, - - opFDEF, // Function #0 - opDUP, - opADD, - opENDF, - - opFDEF, // Function #7 - opPUSHB001, - 10, - 0, - opCALL, - opDUP, - opENDF, - - opFDEF, // Function #3 (again) - opPUSHB000, - 99, - opENDF, - - opPUSHB001, // [2, 0] - 2, - 0, - opCALL, // [4] - opPUSHB000, // [4, 3] - 3, - opLOOPCALL, // [99, 99, 99, 99] - opPUSHB000, // [99, 99, 99, 99, 7] - 7, - opCALL, // [99, 99, 99, 99, 20, 20] - }, - []int32{99, 99, 99, 99, 20, 20}, - "", - }, - } - - for _, tc := range testCases { - h := &hinter{} - h.init(&Font{ - maxStorage: 32, - maxStackElements: 100, - }, 768) - err, errStr := h.run(tc.prog, nil, nil, nil, nil), "" - if err != nil { - errStr = err.Error() - } - if tc.errStr != "" { - if errStr == "" { - t.Errorf("%s: got no error, want %q", tc.desc, tc.errStr) - } else if !strings.Contains(errStr, tc.errStr) { - t.Errorf("%s: got error %q, want one containing %q", tc.desc, errStr, tc.errStr) - } - continue - } - if errStr != "" { - t.Errorf("%s: got error %q, want none", tc.desc, errStr) - continue - } - got := h.stack[:len(tc.want)] - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("%s: got %v, want %v", tc.desc, got, tc.want) - continue - } - } -} - -// TestMove tests that the hinter.move method matches the output of the C -// Freetype implementation. -func TestMove(t *testing.T) { - h, p := hinter{}, Point{} - testCases := []struct { - pvX, pvY, fvX, fvY f2dot14 - wantX, wantY fixed.Int26_6 - }{ - {+0x4000, +0x0000, +0x4000, +0x0000, +1000, +0}, - {+0x4000, +0x0000, -0x4000, +0x0000, +1000, +0}, - {-0x4000, +0x0000, +0x4000, +0x0000, -1000, +0}, - {-0x4000, +0x0000, -0x4000, +0x0000, -1000, +0}, - {+0x0000, +0x4000, +0x0000, +0x4000, +0, +1000}, - {+0x0000, +0x4000, +0x0000, -0x4000, +0, +1000}, - {+0x4000, +0x0000, +0x2d41, +0x2d41, +1000, +1000}, - {+0x4000, +0x0000, -0x2d41, +0x2d41, +1000, -1000}, - {+0x4000, +0x0000, +0x2d41, -0x2d41, +1000, -1000}, - {+0x4000, +0x0000, -0x2d41, -0x2d41, +1000, +1000}, - {-0x4000, +0x0000, +0x2d41, +0x2d41, -1000, -1000}, - {-0x4000, +0x0000, -0x2d41, +0x2d41, -1000, +1000}, - {-0x4000, +0x0000, +0x2d41, -0x2d41, -1000, +1000}, - {-0x4000, +0x0000, -0x2d41, -0x2d41, -1000, -1000}, - {+0x376d, +0x2000, +0x2d41, +0x2d41, +732, +732}, - {-0x376d, +0x2000, +0x2d41, +0x2d41, -2732, -2732}, - {+0x376d, +0x2000, +0x2d41, -0x2d41, +2732, -2732}, - {-0x376d, +0x2000, +0x2d41, -0x2d41, -732, +732}, - {-0x376d, -0x2000, +0x2d41, +0x2d41, -732, -732}, - {+0x376d, +0x2000, +0x4000, +0x0000, +1155, +0}, - {+0x376d, +0x2000, +0x0000, +0x4000, +0, +2000}, - } - for _, tc := range testCases { - p = Point{} - h.gs.pv = [2]f2dot14{tc.pvX, tc.pvY} - h.gs.fv = [2]f2dot14{tc.fvX, tc.fvY} - h.move(&p, 1000, true) - tx := p.Flags&flagTouchedX != 0 - ty := p.Flags&flagTouchedY != 0 - wantTX := tc.fvX != 0 - wantTY := tc.fvY != 0 - if p.X != tc.wantX || p.Y != tc.wantY || tx != wantTX || ty != wantTY { - t.Errorf("pv=%v, fv=%v\ngot %d, %d, %t, %t\nwant %d, %d, %t, %t", - h.gs.pv, h.gs.fv, p.X, p.Y, tx, ty, tc.wantX, tc.wantY, wantTX, wantTY) - continue - } - - // Check that p is aligned with the freedom vector. - a := int64(p.X) * int64(tc.fvY) - b := int64(p.Y) * int64(tc.fvX) - if a != b { - t.Errorf("pv=%v, fv=%v, p=%v not aligned with fv", h.gs.pv, h.gs.fv, p) - continue - } - - // Check that the projected p is 1000 away from the origin. - dotProd := (int64(p.X)*int64(tc.pvX) + int64(p.Y)*int64(tc.pvY) + 1<<13) >> 14 - if dotProd != 1000 { - t.Errorf("pv=%v, fv=%v, p=%v not 1000 from origin", h.gs.pv, h.gs.fv, p) - continue - } - } -} - -// TestNormalize tests that the normalize function matches the output of the C -// Freetype implementation. -func TestNormalize(t *testing.T) { - testCases := [][2]f2dot14{ - {-15895, 3974}, - {-15543, 5181}, - {-14654, 7327}, - {-11585, 11585}, - {0, 16384}, - {11585, 11585}, - {14654, 7327}, - {15543, 5181}, - {15895, 3974}, - {16066, 3213}, - {16161, 2694}, - {16219, 2317}, - {16257, 2032}, - {16284, 1809}, - } - for i, want := range testCases { - got := normalize(f2dot14(i)-4, 1) - if got != want { - t.Errorf("i=%d: got %v, want %v", i, got, want) - } - } -} diff --git a/vendor/github.com/golang/freetype/truetype/opcodes.go b/vendor/github.com/golang/freetype/truetype/opcodes.go deleted file mode 100644 index 1880e1e..0000000 --- a/vendor/github.com/golang/freetype/truetype/opcodes.go +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright 2012 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package truetype - -// The Truetype opcodes are summarized at -// https://developer.apple.com/fonts/TTRefMan/RM07/appendixA.html - -const ( - opSVTCA0 = 0x00 // Set freedom and projection Vectors To Coordinate Axis - opSVTCA1 = 0x01 // . - opSPVTCA0 = 0x02 // Set Projection Vector To Coordinate Axis - opSPVTCA1 = 0x03 // . - opSFVTCA0 = 0x04 // Set Freedom Vector to Coordinate Axis - opSFVTCA1 = 0x05 // . - opSPVTL0 = 0x06 // Set Projection Vector To Line - opSPVTL1 = 0x07 // . - opSFVTL0 = 0x08 // Set Freedom Vector To Line - opSFVTL1 = 0x09 // . - opSPVFS = 0x0a // Set Projection Vector From Stack - opSFVFS = 0x0b // Set Freedom Vector From Stack - opGPV = 0x0c // Get Projection Vector - opGFV = 0x0d // Get Freedom Vector - opSFVTPV = 0x0e // Set Freedom Vector To Projection Vector - opISECT = 0x0f // moves point p to the InterSECTion of two lines - opSRP0 = 0x10 // Set Reference Point 0 - opSRP1 = 0x11 // Set Reference Point 1 - opSRP2 = 0x12 // Set Reference Point 2 - opSZP0 = 0x13 // Set Zone Pointer 0 - opSZP1 = 0x14 // Set Zone Pointer 1 - opSZP2 = 0x15 // Set Zone Pointer 2 - opSZPS = 0x16 // Set Zone PointerS - opSLOOP = 0x17 // Set LOOP variable - opRTG = 0x18 // Round To Grid - opRTHG = 0x19 // Round To Half Grid - opSMD = 0x1a // Set Minimum Distance - opELSE = 0x1b // ELSE clause - opJMPR = 0x1c // JuMP Relative - opSCVTCI = 0x1d // Set Control Value Table Cut-In - opSSWCI = 0x1e // Set Single Width Cut-In - opSSW = 0x1f // Set Single Width - opDUP = 0x20 // DUPlicate top stack element - opPOP = 0x21 // POP top stack element - opCLEAR = 0x22 // CLEAR the stack - opSWAP = 0x23 // SWAP the top two elements on the stack - opDEPTH = 0x24 // DEPTH of the stack - opCINDEX = 0x25 // Copy the INDEXed element to the top of the stack - opMINDEX = 0x26 // Move the INDEXed element to the top of the stack - opALIGNPTS = 0x27 // ALIGN PoinTS - op_0x28 = 0x28 // deprecated - opUTP = 0x29 // UnTouch Point - opLOOPCALL = 0x2a // LOOP and CALL function - opCALL = 0x2b // CALL function - opFDEF = 0x2c // Function DEFinition - opENDF = 0x2d // END Function definition - opMDAP0 = 0x2e // Move Direct Absolute Point - opMDAP1 = 0x2f // . - opIUP0 = 0x30 // Interpolate Untouched Points through the outline - opIUP1 = 0x31 // . - opSHP0 = 0x32 // SHift Point using reference point - opSHP1 = 0x33 // . - opSHC0 = 0x34 // SHift Contour using reference point - opSHC1 = 0x35 // . - opSHZ0 = 0x36 // SHift Zone using reference point - opSHZ1 = 0x37 // . - opSHPIX = 0x38 // SHift point by a PIXel amount - opIP = 0x39 // Interpolate Point - opMSIRP0 = 0x3a // Move Stack Indirect Relative Point - opMSIRP1 = 0x3b // . - opALIGNRP = 0x3c // ALIGN to Reference Point - opRTDG = 0x3d // Round To Double Grid - opMIAP0 = 0x3e // Move Indirect Absolute Point - opMIAP1 = 0x3f // . - opNPUSHB = 0x40 // PUSH N Bytes - opNPUSHW = 0x41 // PUSH N Words - opWS = 0x42 // Write Store - opRS = 0x43 // Read Store - opWCVTP = 0x44 // Write Control Value Table in Pixel units - opRCVT = 0x45 // Read Control Value Table entry - opGC0 = 0x46 // Get Coordinate projected onto the projection vector - opGC1 = 0x47 // . - opSCFS = 0x48 // Sets Coordinate From the Stack using projection vector and freedom vector - opMD0 = 0x49 // Measure Distance - opMD1 = 0x4a // . - opMPPEM = 0x4b // Measure Pixels Per EM - opMPS = 0x4c // Measure Point Size - opFLIPON = 0x4d // set the auto FLIP Boolean to ON - opFLIPOFF = 0x4e // set the auto FLIP Boolean to OFF - opDEBUG = 0x4f // DEBUG call - opLT = 0x50 // Less Than - opLTEQ = 0x51 // Less Than or EQual - opGT = 0x52 // Greater Than - opGTEQ = 0x53 // Greater Than or EQual - opEQ = 0x54 // EQual - opNEQ = 0x55 // Not EQual - opODD = 0x56 // ODD - opEVEN = 0x57 // EVEN - opIF = 0x58 // IF test - opEIF = 0x59 // End IF - opAND = 0x5a // logical AND - opOR = 0x5b // logical OR - opNOT = 0x5c // logical NOT - opDELTAP1 = 0x5d // DELTA exception P1 - opSDB = 0x5e // Set Delta Base in the graphics state - opSDS = 0x5f // Set Delta Shift in the graphics state - opADD = 0x60 // ADD - opSUB = 0x61 // SUBtract - opDIV = 0x62 // DIVide - opMUL = 0x63 // MULtiply - opABS = 0x64 // ABSolute value - opNEG = 0x65 // NEGate - opFLOOR = 0x66 // FLOOR - opCEILING = 0x67 // CEILING - opROUND00 = 0x68 // ROUND value - opROUND01 = 0x69 // . - opROUND10 = 0x6a // . - opROUND11 = 0x6b // . - opNROUND00 = 0x6c // No ROUNDing of value - opNROUND01 = 0x6d // . - opNROUND10 = 0x6e // . - opNROUND11 = 0x6f // . - opWCVTF = 0x70 // Write Control Value Table in Funits - opDELTAP2 = 0x71 // DELTA exception P2 - opDELTAP3 = 0x72 // DELTA exception P3 - opDELTAC1 = 0x73 // DELTA exception C1 - opDELTAC2 = 0x74 // DELTA exception C2 - opDELTAC3 = 0x75 // DELTA exception C3 - opSROUND = 0x76 // Super ROUND - opS45ROUND = 0x77 // Super ROUND 45 degrees - opJROT = 0x78 // Jump Relative On True - opJROF = 0x79 // Jump Relative On False - opROFF = 0x7a // Round OFF - op_0x7b = 0x7b // deprecated - opRUTG = 0x7c // Round Up To Grid - opRDTG = 0x7d // Round Down To Grid - opSANGW = 0x7e // Set ANGle Weight - opAA = 0x7f // Adjust Angle - opFLIPPT = 0x80 // FLIP PoinT - opFLIPRGON = 0x81 // FLIP RanGe ON - opFLIPRGOFF = 0x82 // FLIP RanGe OFF - op_0x83 = 0x83 // deprecated - op_0x84 = 0x84 // deprecated - opSCANCTRL = 0x85 // SCAN conversion ConTRoL - opSDPVTL0 = 0x86 // Set Dual Projection Vector To Line - opSDPVTL1 = 0x87 // . - opGETINFO = 0x88 // GET INFOrmation - opIDEF = 0x89 // Instruction DEFinition - opROLL = 0x8a // ROLL the top three stack elements - opMAX = 0x8b // MAXimum of top two stack elements - opMIN = 0x8c // MINimum of top two stack elements - opSCANTYPE = 0x8d // SCANTYPE - opINSTCTRL = 0x8e // INSTRuction execution ConTRoL - op_0x8f = 0x8f - op_0x90 = 0x90 - op_0x91 = 0x91 - op_0x92 = 0x92 - op_0x93 = 0x93 - op_0x94 = 0x94 - op_0x95 = 0x95 - op_0x96 = 0x96 - op_0x97 = 0x97 - op_0x98 = 0x98 - op_0x99 = 0x99 - op_0x9a = 0x9a - op_0x9b = 0x9b - op_0x9c = 0x9c - op_0x9d = 0x9d - op_0x9e = 0x9e - op_0x9f = 0x9f - op_0xa0 = 0xa0 - op_0xa1 = 0xa1 - op_0xa2 = 0xa2 - op_0xa3 = 0xa3 - op_0xa4 = 0xa4 - op_0xa5 = 0xa5 - op_0xa6 = 0xa6 - op_0xa7 = 0xa7 - op_0xa8 = 0xa8 - op_0xa9 = 0xa9 - op_0xaa = 0xaa - op_0xab = 0xab - op_0xac = 0xac - op_0xad = 0xad - op_0xae = 0xae - op_0xaf = 0xaf - opPUSHB000 = 0xb0 // PUSH Bytes - opPUSHB001 = 0xb1 // . - opPUSHB010 = 0xb2 // . - opPUSHB011 = 0xb3 // . - opPUSHB100 = 0xb4 // . - opPUSHB101 = 0xb5 // . - opPUSHB110 = 0xb6 // . - opPUSHB111 = 0xb7 // . - opPUSHW000 = 0xb8 // PUSH Words - opPUSHW001 = 0xb9 // . - opPUSHW010 = 0xba // . - opPUSHW011 = 0xbb // . - opPUSHW100 = 0xbc // . - opPUSHW101 = 0xbd // . - opPUSHW110 = 0xbe // . - opPUSHW111 = 0xbf // . - opMDRP00000 = 0xc0 // Move Direct Relative Point - opMDRP00001 = 0xc1 // . - opMDRP00010 = 0xc2 // . - opMDRP00011 = 0xc3 // . - opMDRP00100 = 0xc4 // . - opMDRP00101 = 0xc5 // . - opMDRP00110 = 0xc6 // . - opMDRP00111 = 0xc7 // . - opMDRP01000 = 0xc8 // . - opMDRP01001 = 0xc9 // . - opMDRP01010 = 0xca // . - opMDRP01011 = 0xcb // . - opMDRP01100 = 0xcc // . - opMDRP01101 = 0xcd // . - opMDRP01110 = 0xce // . - opMDRP01111 = 0xcf // . - opMDRP10000 = 0xd0 // . - opMDRP10001 = 0xd1 // . - opMDRP10010 = 0xd2 // . - opMDRP10011 = 0xd3 // . - opMDRP10100 = 0xd4 // . - opMDRP10101 = 0xd5 // . - opMDRP10110 = 0xd6 // . - opMDRP10111 = 0xd7 // . - opMDRP11000 = 0xd8 // . - opMDRP11001 = 0xd9 // . - opMDRP11010 = 0xda // . - opMDRP11011 = 0xdb // . - opMDRP11100 = 0xdc // . - opMDRP11101 = 0xdd // . - opMDRP11110 = 0xde // . - opMDRP11111 = 0xdf // . - opMIRP00000 = 0xe0 // Move Indirect Relative Point - opMIRP00001 = 0xe1 // . - opMIRP00010 = 0xe2 // . - opMIRP00011 = 0xe3 // . - opMIRP00100 = 0xe4 // . - opMIRP00101 = 0xe5 // . - opMIRP00110 = 0xe6 // . - opMIRP00111 = 0xe7 // . - opMIRP01000 = 0xe8 // . - opMIRP01001 = 0xe9 // . - opMIRP01010 = 0xea // . - opMIRP01011 = 0xeb // . - opMIRP01100 = 0xec // . - opMIRP01101 = 0xed // . - opMIRP01110 = 0xee // . - opMIRP01111 = 0xef // . - opMIRP10000 = 0xf0 // . - opMIRP10001 = 0xf1 // . - opMIRP10010 = 0xf2 // . - opMIRP10011 = 0xf3 // . - opMIRP10100 = 0xf4 // . - opMIRP10101 = 0xf5 // . - opMIRP10110 = 0xf6 // . - opMIRP10111 = 0xf7 // . - opMIRP11000 = 0xf8 // . - opMIRP11001 = 0xf9 // . - opMIRP11010 = 0xfa // . - opMIRP11011 = 0xfb // . - opMIRP11100 = 0xfc // . - opMIRP11101 = 0xfd // . - opMIRP11110 = 0xfe // . - opMIRP11111 = 0xff // . -) - -// popCount is the number of stack elements that each opcode pops. -var popCount = [256]uint8{ - // 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f - 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 5, // 0x00 - 0x0f - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, // 0x10 - 0x1f - 1, 1, 0, 2, 0, 1, 1, 2, 0, 1, 2, 1, 1, 0, 1, 1, // 0x20 - 0x2f - 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 2, 2, 0, 0, 2, 2, // 0x30 - 0x3f - 0, 0, 2, 1, 2, 1, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, // 0x40 - 0x4f - 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 2, 2, 1, 1, 1, 1, // 0x50 - 0x5f - 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 - 0x6f - 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 1, 1, // 0x70 - 0x7f - 0, 2, 2, 0, 0, 1, 2, 2, 1, 1, 3, 2, 2, 1, 2, 0, // 0x80 - 0x8f - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x90 - 0x9f - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xa0 - 0xaf - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xb0 - 0xbf - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xc0 - 0xcf - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xd0 - 0xdf - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xe0 - 0xef - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xf0 - 0xff -} diff --git a/vendor/github.com/golang/freetype/truetype/truetype.go b/vendor/github.com/golang/freetype/truetype/truetype.go deleted file mode 100644 index 7270bbf..0000000 --- a/vendor/github.com/golang/freetype/truetype/truetype.go +++ /dev/null @@ -1,653 +0,0 @@ -// Copyright 2010 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -// Package truetype provides a parser for the TTF and TTC file formats. -// Those formats are documented at http://developer.apple.com/fonts/TTRefMan/ -// and http://www.microsoft.com/typography/otspec/ -// -// Some of a font's methods provide lengths or co-ordinates, e.g. bounds, font -// metrics and control points. All these methods take a scale parameter, which -// is the number of pixels in 1 em, expressed as a 26.6 fixed point value. For -// example, if 1 em is 10 pixels then scale is fixed.I(10), which is equal to -// fixed.Int26_6(10 << 6). -// -// To measure a TrueType font in ideal FUnit space, use scale equal to -// font.FUnitsPerEm(). -package truetype // import "github.com/golang/freetype/truetype" - -import ( - "fmt" - - "golang.org/x/image/math/fixed" -) - -// An Index is a Font's index of a rune. -type Index uint16 - -// A NameID identifies a name table entry. -// -// See https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html -type NameID uint16 - -const ( - NameIDCopyright NameID = 0 - NameIDFontFamily = 1 - NameIDFontSubfamily = 2 - NameIDUniqueSubfamilyID = 3 - NameIDFontFullName = 4 - NameIDNameTableVersion = 5 - NameIDPostscriptName = 6 - NameIDTrademarkNotice = 7 - NameIDManufacturerName = 8 - NameIDDesignerName = 9 - NameIDFontDescription = 10 - NameIDFontVendorURL = 11 - NameIDFontDesignerURL = 12 - NameIDFontLicense = 13 - NameIDFontLicenseURL = 14 - NameIDPreferredFamily = 16 - NameIDPreferredSubfamily = 17 - NameIDCompatibleName = 18 - NameIDSampleText = 19 -) - -const ( - // A 32-bit encoding consists of a most-significant 16-bit Platform ID and a - // least-significant 16-bit Platform Specific ID. The magic numbers are - // specified at https://www.microsoft.com/typography/otspec/name.htm - unicodeEncodingBMPOnly = 0x00000003 // PID = 0 (Unicode), PSID = 3 (Unicode 2.0 BMP Only) - unicodeEncodingFull = 0x00000004 // PID = 0 (Unicode), PSID = 4 (Unicode 2.0 Full Repertoire) - microsoftSymbolEncoding = 0x00030000 // PID = 3 (Microsoft), PSID = 0 (Symbol) - microsoftUCS2Encoding = 0x00030001 // PID = 3 (Microsoft), PSID = 1 (UCS-2) - microsoftUCS4Encoding = 0x0003000a // PID = 3 (Microsoft), PSID = 10 (UCS-4) -) - -// An HMetric holds the horizontal metrics of a single glyph. -type HMetric struct { - AdvanceWidth, LeftSideBearing fixed.Int26_6 -} - -// A VMetric holds the vertical metrics of a single glyph. -type VMetric struct { - AdvanceHeight, TopSideBearing fixed.Int26_6 -} - -// A FormatError reports that the input is not a valid TrueType font. -type FormatError string - -func (e FormatError) Error() string { - return "freetype: invalid TrueType format: " + string(e) -} - -// An UnsupportedError reports that the input uses a valid but unimplemented -// TrueType feature. -type UnsupportedError string - -func (e UnsupportedError) Error() string { - return "freetype: unsupported TrueType feature: " + string(e) -} - -// u32 returns the big-endian uint32 at b[i:]. -func u32(b []byte, i int) uint32 { - return uint32(b[i])<<24 | uint32(b[i+1])<<16 | uint32(b[i+2])<<8 | uint32(b[i+3]) -} - -// u16 returns the big-endian uint16 at b[i:]. -func u16(b []byte, i int) uint16 { - return uint16(b[i])<<8 | uint16(b[i+1]) -} - -// readTable returns a slice of the TTF data given by a table's directory entry. -func readTable(ttf []byte, offsetLength []byte) ([]byte, error) { - offset := int(u32(offsetLength, 0)) - if offset < 0 { - return nil, FormatError(fmt.Sprintf("offset too large: %d", uint32(offset))) - } - length := int(u32(offsetLength, 4)) - if length < 0 { - return nil, FormatError(fmt.Sprintf("length too large: %d", uint32(length))) - } - end := offset + length - if end < 0 || end > len(ttf) { - return nil, FormatError(fmt.Sprintf("offset + length too large: %d", uint32(offset)+uint32(length))) - } - return ttf[offset:end], nil -} - -// parseSubtables returns the offset and platformID of the best subtable in -// table, where best favors a Unicode cmap encoding, and failing that, a -// Microsoft cmap encoding. offset is the offset of the first subtable in -// table, and size is the size of each subtable. -// -// If pred is non-nil, then only subtables that satisfy that predicate will be -// considered. -func parseSubtables(table []byte, name string, offset, size int, pred func([]byte) bool) ( - bestOffset int, bestPID uint32, retErr error) { - - if len(table) < 4 { - return 0, 0, FormatError(name + " too short") - } - nSubtables := int(u16(table, 2)) - if len(table) < size*nSubtables+offset { - return 0, 0, FormatError(name + " too short") - } - ok := false - for i := 0; i < nSubtables; i, offset = i+1, offset+size { - if pred != nil && !pred(table[offset:]) { - continue - } - // We read the 16-bit Platform ID and 16-bit Platform Specific ID as a single uint32. - // All values are big-endian. - pidPsid := u32(table, offset) - // We prefer the Unicode cmap encoding. Failing to find that, we fall - // back onto the Microsoft cmap encoding. - if pidPsid == unicodeEncodingBMPOnly || pidPsid == unicodeEncodingFull { - bestOffset, bestPID, ok = offset, pidPsid>>16, true - break - - } else if pidPsid == microsoftSymbolEncoding || - pidPsid == microsoftUCS2Encoding || - pidPsid == microsoftUCS4Encoding { - - bestOffset, bestPID, ok = offset, pidPsid>>16, true - // We don't break out of the for loop, so that Unicode can override Microsoft. - } - } - if !ok { - return 0, 0, UnsupportedError(name + " encoding") - } - return bestOffset, bestPID, nil -} - -const ( - locaOffsetFormatUnknown int = iota - locaOffsetFormatShort - locaOffsetFormatLong -) - -// A cm holds a parsed cmap entry. -type cm struct { - start, end, delta, offset uint32 -} - -// A Font represents a Truetype font. -type Font struct { - // Tables sliced from the TTF data. The different tables are documented - // at http://developer.apple.com/fonts/TTRefMan/RM06/Chap6.html - cmap, cvt, fpgm, glyf, hdmx, head, hhea, hmtx, kern, loca, maxp, name, os2, prep, vmtx []byte - - cmapIndexes []byte - - // Cached values derived from the raw ttf data. - cm []cm - locaOffsetFormat int - nGlyph, nHMetric, nKern int - fUnitsPerEm int32 - ascent int32 // In FUnits. - descent int32 // In FUnits; typically negative. - bounds fixed.Rectangle26_6 // In FUnits. - // Values from the maxp section. - maxTwilightPoints, maxStorage, maxFunctionDefs, maxStackElements uint16 -} - -func (f *Font) parseCmap() error { - const ( - cmapFormat4 = 4 - cmapFormat12 = 12 - languageIndependent = 0 - ) - - offset, _, err := parseSubtables(f.cmap, "cmap", 4, 8, nil) - if err != nil { - return err - } - offset = int(u32(f.cmap, offset+4)) - if offset <= 0 || offset > len(f.cmap) { - return FormatError("bad cmap offset") - } - - cmapFormat := u16(f.cmap, offset) - switch cmapFormat { - case cmapFormat4: - language := u16(f.cmap, offset+4) - if language != languageIndependent { - return UnsupportedError(fmt.Sprintf("language: %d", language)) - } - segCountX2 := int(u16(f.cmap, offset+6)) - if segCountX2%2 == 1 { - return FormatError(fmt.Sprintf("bad segCountX2: %d", segCountX2)) - } - segCount := segCountX2 / 2 - offset += 14 - f.cm = make([]cm, segCount) - for i := 0; i < segCount; i++ { - f.cm[i].end = uint32(u16(f.cmap, offset)) - offset += 2 - } - offset += 2 - for i := 0; i < segCount; i++ { - f.cm[i].start = uint32(u16(f.cmap, offset)) - offset += 2 - } - for i := 0; i < segCount; i++ { - f.cm[i].delta = uint32(u16(f.cmap, offset)) - offset += 2 - } - for i := 0; i < segCount; i++ { - f.cm[i].offset = uint32(u16(f.cmap, offset)) - offset += 2 - } - f.cmapIndexes = f.cmap[offset:] - return nil - - case cmapFormat12: - if u16(f.cmap, offset+2) != 0 { - return FormatError(fmt.Sprintf("cmap format: % x", f.cmap[offset:offset+4])) - } - length := u32(f.cmap, offset+4) - language := u32(f.cmap, offset+8) - if language != languageIndependent { - return UnsupportedError(fmt.Sprintf("language: %d", language)) - } - nGroups := u32(f.cmap, offset+12) - if length != 12*nGroups+16 { - return FormatError("inconsistent cmap length") - } - offset += 16 - f.cm = make([]cm, nGroups) - for i := uint32(0); i < nGroups; i++ { - f.cm[i].start = u32(f.cmap, offset+0) - f.cm[i].end = u32(f.cmap, offset+4) - f.cm[i].delta = u32(f.cmap, offset+8) - f.cm[i].start - offset += 12 - } - return nil - } - return UnsupportedError(fmt.Sprintf("cmap format: %d", cmapFormat)) -} - -func (f *Font) parseHead() error { - if len(f.head) != 54 { - return FormatError(fmt.Sprintf("bad head length: %d", len(f.head))) - } - f.fUnitsPerEm = int32(u16(f.head, 18)) - f.bounds.Min.X = fixed.Int26_6(int16(u16(f.head, 36))) - f.bounds.Min.Y = fixed.Int26_6(int16(u16(f.head, 38))) - f.bounds.Max.X = fixed.Int26_6(int16(u16(f.head, 40))) - f.bounds.Max.Y = fixed.Int26_6(int16(u16(f.head, 42))) - switch i := u16(f.head, 50); i { - case 0: - f.locaOffsetFormat = locaOffsetFormatShort - case 1: - f.locaOffsetFormat = locaOffsetFormatLong - default: - return FormatError(fmt.Sprintf("bad indexToLocFormat: %d", i)) - } - return nil -} - -func (f *Font) parseHhea() error { - if len(f.hhea) != 36 { - return FormatError(fmt.Sprintf("bad hhea length: %d", len(f.hhea))) - } - f.ascent = int32(int16(u16(f.hhea, 4))) - f.descent = int32(int16(u16(f.hhea, 6))) - f.nHMetric = int(u16(f.hhea, 34)) - if 4*f.nHMetric+2*(f.nGlyph-f.nHMetric) != len(f.hmtx) { - return FormatError(fmt.Sprintf("bad hmtx length: %d", len(f.hmtx))) - } - return nil -} - -func (f *Font) parseKern() error { - // Apple's TrueType documentation (http://developer.apple.com/fonts/TTRefMan/RM06/Chap6kern.html) says: - // "Previous versions of the 'kern' table defined both the version and nTables fields in the header - // as UInt16 values and not UInt32 values. Use of the older format on the Mac OS is discouraged - // (although AAT can sense an old kerning table and still make correct use of it). Microsoft - // Windows still uses the older format for the 'kern' table and will not recognize the newer one. - // Fonts targeted for the Mac OS only should use the new format; fonts targeted for both the Mac OS - // and Windows should use the old format." - // Since we expect that almost all fonts aim to be Windows-compatible, we only parse the "older" format, - // just like the C Freetype implementation. - if len(f.kern) == 0 { - if f.nKern != 0 { - return FormatError("bad kern table length") - } - return nil - } - if len(f.kern) < 18 { - return FormatError("kern data too short") - } - version, offset := u16(f.kern, 0), 2 - if version != 0 { - return UnsupportedError(fmt.Sprintf("kern version: %d", version)) - } - - n, offset := u16(f.kern, offset), offset+2 - if n == 0 { - return UnsupportedError("kern nTables: 0") - } - // TODO: support multiple subtables. In practice, almost all .ttf files - // have only one subtable, if they have a kern table at all. But it's not - // impossible. Xolonium Regular (https://fontlibrary.org/en/font/xolonium) - // has 3 subtables. Those subtables appear to be disjoint, rather than - // being the same kerning pairs encoded in three different ways. - // - // For now, we'll use only the first subtable. - - offset += 2 // Skip the version. - length, offset := int(u16(f.kern, offset)), offset+2 - coverage, offset := u16(f.kern, offset), offset+2 - if coverage != 0x0001 { - // We only support horizontal kerning. - return UnsupportedError(fmt.Sprintf("kern coverage: 0x%04x", coverage)) - } - f.nKern, offset = int(u16(f.kern, offset)), offset+2 - if 6*f.nKern != length-14 { - return FormatError("bad kern table length") - } - return nil -} - -func (f *Font) parseMaxp() error { - if len(f.maxp) != 32 { - return FormatError(fmt.Sprintf("bad maxp length: %d", len(f.maxp))) - } - f.nGlyph = int(u16(f.maxp, 4)) - f.maxTwilightPoints = u16(f.maxp, 16) - f.maxStorage = u16(f.maxp, 18) - f.maxFunctionDefs = u16(f.maxp, 20) - f.maxStackElements = u16(f.maxp, 24) - return nil -} - -// scale returns x divided by f.fUnitsPerEm, rounded to the nearest integer. -func (f *Font) scale(x fixed.Int26_6) fixed.Int26_6 { - if x >= 0 { - x += fixed.Int26_6(f.fUnitsPerEm) / 2 - } else { - x -= fixed.Int26_6(f.fUnitsPerEm) / 2 - } - return x / fixed.Int26_6(f.fUnitsPerEm) -} - -// Bounds returns the union of a Font's glyphs' bounds. -func (f *Font) Bounds(scale fixed.Int26_6) fixed.Rectangle26_6 { - b := f.bounds - b.Min.X = f.scale(scale * b.Min.X) - b.Min.Y = f.scale(scale * b.Min.Y) - b.Max.X = f.scale(scale * b.Max.X) - b.Max.Y = f.scale(scale * b.Max.Y) - return b -} - -// FUnitsPerEm returns the number of FUnits in a Font's em-square's side. -func (f *Font) FUnitsPerEm() int32 { - return f.fUnitsPerEm -} - -// Index returns a Font's index for the given rune. -func (f *Font) Index(x rune) Index { - c := uint32(x) - for i, j := 0, len(f.cm); i < j; { - h := i + (j-i)/2 - cm := &f.cm[h] - if c < cm.start { - j = h - } else if cm.end < c { - i = h + 1 - } else if cm.offset == 0 { - return Index(c + cm.delta) - } else { - offset := int(cm.offset) + 2*(h-len(f.cm)+int(c-cm.start)) - return Index(u16(f.cmapIndexes, offset)) - } - } - return 0 -} - -// Name returns the Font's name value for the given NameID. It returns "" if -// there was an error, or if that name was not found. -func (f *Font) Name(id NameID) string { - x, platformID, err := parseSubtables(f.name, "name", 6, 12, func(b []byte) bool { - return NameID(u16(b, 6)) == id - }) - if err != nil { - return "" - } - offset, length := u16(f.name, 4)+u16(f.name, x+10), u16(f.name, x+8) - // Return the ASCII value of the encoded string. - // The string is encoded as UTF-16 on non-Apple platformIDs; Apple is platformID 1. - src := f.name[offset : offset+length] - var dst []byte - if platformID != 1 { // UTF-16. - if len(src)&1 != 0 { - return "" - } - dst = make([]byte, len(src)/2) - for i := range dst { - dst[i] = printable(u16(src, 2*i)) - } - } else { // ASCII. - dst = make([]byte, len(src)) - for i, c := range src { - dst[i] = printable(uint16(c)) - } - } - return string(dst) -} - -func printable(r uint16) byte { - if 0x20 <= r && r < 0x7f { - return byte(r) - } - return '?' -} - -// unscaledHMetric returns the unscaled horizontal metrics for the glyph with -// the given index. -func (f *Font) unscaledHMetric(i Index) (h HMetric) { - j := int(i) - if j < 0 || f.nGlyph <= j { - return HMetric{} - } - if j >= f.nHMetric { - p := 4 * (f.nHMetric - 1) - return HMetric{ - AdvanceWidth: fixed.Int26_6(u16(f.hmtx, p)), - LeftSideBearing: fixed.Int26_6(int16(u16(f.hmtx, p+2*(j-f.nHMetric)+4))), - } - } - return HMetric{ - AdvanceWidth: fixed.Int26_6(u16(f.hmtx, 4*j)), - LeftSideBearing: fixed.Int26_6(int16(u16(f.hmtx, 4*j+2))), - } -} - -// HMetric returns the horizontal metrics for the glyph with the given index. -func (f *Font) HMetric(scale fixed.Int26_6, i Index) HMetric { - h := f.unscaledHMetric(i) - h.AdvanceWidth = f.scale(scale * h.AdvanceWidth) - h.LeftSideBearing = f.scale(scale * h.LeftSideBearing) - return h -} - -// unscaledVMetric returns the unscaled vertical metrics for the glyph with -// the given index. yMax is the top of the glyph's bounding box. -func (f *Font) unscaledVMetric(i Index, yMax fixed.Int26_6) (v VMetric) { - j := int(i) - if j < 0 || f.nGlyph <= j { - return VMetric{} - } - if 4*j+4 <= len(f.vmtx) { - return VMetric{ - AdvanceHeight: fixed.Int26_6(u16(f.vmtx, 4*j)), - TopSideBearing: fixed.Int26_6(int16(u16(f.vmtx, 4*j+2))), - } - } - // The OS/2 table has grown over time. - // https://developer.apple.com/fonts/TTRefMan/RM06/Chap6OS2.html - // says that it was originally 68 bytes. Optional fields, including - // the ascender and descender, are described at - // http://www.microsoft.com/typography/otspec/os2.htm - if len(f.os2) >= 72 { - sTypoAscender := fixed.Int26_6(int16(u16(f.os2, 68))) - sTypoDescender := fixed.Int26_6(int16(u16(f.os2, 70))) - return VMetric{ - AdvanceHeight: sTypoAscender - sTypoDescender, - TopSideBearing: sTypoAscender - yMax, - } - } - return VMetric{ - AdvanceHeight: fixed.Int26_6(f.fUnitsPerEm), - TopSideBearing: 0, - } -} - -// VMetric returns the vertical metrics for the glyph with the given index. -func (f *Font) VMetric(scale fixed.Int26_6, i Index) VMetric { - // TODO: should 0 be bounds.YMax? - v := f.unscaledVMetric(i, 0) - v.AdvanceHeight = f.scale(scale * v.AdvanceHeight) - v.TopSideBearing = f.scale(scale * v.TopSideBearing) - return v -} - -// Kern returns the horizontal adjustment for the given glyph pair. A positive -// kern means to move the glyphs further apart. -func (f *Font) Kern(scale fixed.Int26_6, i0, i1 Index) fixed.Int26_6 { - if f.nKern == 0 { - return 0 - } - g := uint32(i0)<<16 | uint32(i1) - lo, hi := 0, f.nKern - for lo < hi { - i := (lo + hi) / 2 - ig := u32(f.kern, 18+6*i) - if ig < g { - lo = i + 1 - } else if ig > g { - hi = i - } else { - return f.scale(scale * fixed.Int26_6(int16(u16(f.kern, 22+6*i)))) - } - } - return 0 -} - -// Parse returns a new Font for the given TTF or TTC data. -// -// For TrueType Collections, the first font in the collection is parsed. -func Parse(ttf []byte) (font *Font, err error) { - return parse(ttf, 0) -} - -func parse(ttf []byte, offset int) (font *Font, err error) { - if len(ttf)-offset < 12 { - err = FormatError("TTF data is too short") - return - } - originalOffset := offset - magic, offset := u32(ttf, offset), offset+4 - switch magic { - case 0x00010000: - // No-op. - case 0x74746366: // "ttcf" as a big-endian uint32. - if originalOffset != 0 { - err = FormatError("recursive TTC") - return - } - ttcVersion, offset := u32(ttf, offset), offset+4 - if ttcVersion != 0x00010000 && ttcVersion != 0x00020000 { - err = FormatError("bad TTC version") - return - } - numFonts, offset := int(u32(ttf, offset)), offset+4 - if numFonts <= 0 { - err = FormatError("bad number of TTC fonts") - return - } - if len(ttf[offset:])/4 < numFonts { - err = FormatError("TTC offset table is too short") - return - } - // TODO: provide an API to select which font in a TrueType collection to return, - // not just the first one. This may require an API to parse a TTC's name tables, - // so users of this package can select the font in a TTC by name. - offset = int(u32(ttf, offset)) - if offset <= 0 || offset > len(ttf) { - err = FormatError("bad TTC offset") - return - } - return parse(ttf, offset) - default: - err = FormatError("bad TTF version") - return - } - n, offset := int(u16(ttf, offset)), offset+2 - offset += 6 // Skip the searchRange, entrySelector and rangeShift. - if len(ttf) < 16*n+offset { - err = FormatError("TTF data is too short") - return - } - f := new(Font) - // Assign the table slices. - for i := 0; i < n; i++ { - x := 16*i + offset - switch string(ttf[x : x+4]) { - case "cmap": - f.cmap, err = readTable(ttf, ttf[x+8:x+16]) - case "cvt ": - f.cvt, err = readTable(ttf, ttf[x+8:x+16]) - case "fpgm": - f.fpgm, err = readTable(ttf, ttf[x+8:x+16]) - case "glyf": - f.glyf, err = readTable(ttf, ttf[x+8:x+16]) - case "hdmx": - f.hdmx, err = readTable(ttf, ttf[x+8:x+16]) - case "head": - f.head, err = readTable(ttf, ttf[x+8:x+16]) - case "hhea": - f.hhea, err = readTable(ttf, ttf[x+8:x+16]) - case "hmtx": - f.hmtx, err = readTable(ttf, ttf[x+8:x+16]) - case "kern": - f.kern, err = readTable(ttf, ttf[x+8:x+16]) - case "loca": - f.loca, err = readTable(ttf, ttf[x+8:x+16]) - case "maxp": - f.maxp, err = readTable(ttf, ttf[x+8:x+16]) - case "name": - f.name, err = readTable(ttf, ttf[x+8:x+16]) - case "OS/2": - f.os2, err = readTable(ttf, ttf[x+8:x+16]) - case "prep": - f.prep, err = readTable(ttf, ttf[x+8:x+16]) - case "vmtx": - f.vmtx, err = readTable(ttf, ttf[x+8:x+16]) - } - if err != nil { - return - } - } - // Parse and sanity-check the TTF data. - if err = f.parseHead(); err != nil { - return - } - if err = f.parseMaxp(); err != nil { - return - } - if err = f.parseCmap(); err != nil { - return - } - if err = f.parseKern(); err != nil { - return - } - if err = f.parseHhea(); err != nil { - return - } - font = f - return -} diff --git a/vendor/github.com/golang/freetype/truetype/truetype_test.go b/vendor/github.com/golang/freetype/truetype/truetype_test.go deleted file mode 100644 index a194f37..0000000 --- a/vendor/github.com/golang/freetype/truetype/truetype_test.go +++ /dev/null @@ -1,400 +0,0 @@ -// Copyright 2012 The Freetype-Go Authors. All rights reserved. -// Use of this source code is governed by your choice of either the -// FreeType License or the GNU General Public License version 2 (or -// any later version), both of which can be found in the LICENSE file. - -package truetype - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "os" - "strconv" - "strings" - "testing" - - "golang.org/x/image/font" - "golang.org/x/image/math/fixed" -) - -func parseTestdataFont(name string) (f *Font, testdataIsOptional bool, err error) { - b, err := ioutil.ReadFile(fmt.Sprintf("../testdata/%s.ttf", name)) - if err != nil { - // The "x-foo" fonts are optional tests, as they are not checked - // in for copyright or file size reasons. - return nil, strings.HasPrefix(name, "x-"), fmt.Errorf("%s: ReadFile: %v", name, err) - } - f, err = Parse(b) - if err != nil { - return nil, true, fmt.Errorf("%s: Parse: %v", name, err) - } - return f, false, nil -} - -func mkBounds(minX, minY, maxX, maxY fixed.Int26_6) fixed.Rectangle26_6 { - return fixed.Rectangle26_6{ - Min: fixed.Point26_6{ - X: minX, - Y: minY, - }, - Max: fixed.Point26_6{ - X: maxX, - Y: maxY, - }, - } -} - -// TestParse tests that the luxisr.ttf metrics and glyphs are parsed correctly. -// The numerical values can be manually verified by examining luxisr.ttx. -func TestParse(t *testing.T) { - f, _, err := parseTestdataFont("luxisr") - if err != nil { - t.Fatal(err) - } - if got, want := f.FUnitsPerEm(), int32(2048); got != want { - t.Errorf("FUnitsPerEm: got %v, want %v", got, want) - } - fupe := fixed.Int26_6(f.FUnitsPerEm()) - if got, want := f.Bounds(fupe), mkBounds(-441, -432, 2024, 2033); got != want { - t.Errorf("Bounds: got %v, want %v", got, want) - } - - i0 := f.Index('A') - i1 := f.Index('V') - if i0 != 36 || i1 != 57 { - t.Fatalf("Index: i0, i1 = %d, %d, want 36, 57", i0, i1) - } - if got, want := f.HMetric(fupe, i0), (HMetric{1366, 19}); got != want { - t.Errorf("HMetric: got %v, want %v", got, want) - } - if got, want := f.VMetric(fupe, i0), (VMetric{2465, 553}); got != want { - t.Errorf("VMetric: got %v, want %v", got, want) - } - if got, want := f.Kern(fupe, i0, i1), fixed.Int26_6(-144); got != want { - t.Errorf("Kern: got %v, want %v", got, want) - } - - g := &GlyphBuf{} - err = g.Load(f, fupe, i0, font.HintingNone) - if err != nil { - t.Fatalf("Load: %v", err) - } - g0 := &GlyphBuf{ - Bounds: g.Bounds, - Points: g.Points, - Ends: g.Ends, - } - g1 := &GlyphBuf{ - Bounds: mkBounds(19, 0, 1342, 1480), - Points: []Point{ - {19, 0, 51}, - {581, 1480, 1}, - {789, 1480, 51}, - {1342, 0, 1}, - {1116, 0, 35}, - {962, 410, 3}, - {368, 410, 33}, - {214, 0, 3}, - {428, 566, 19}, - {904, 566, 33}, - {667, 1200, 3}, - }, - Ends: []int{8, 11}, - } - if got, want := fmt.Sprint(g0), fmt.Sprint(g1); got != want { - t.Errorf("GlyphBuf:\ngot %v\nwant %v", got, want) - } -} - -func TestIndex(t *testing.T) { - testCases := map[string]map[rune]Index{ - "luxisr": { - ' ': 3, - '!': 4, - 'A': 36, - 'V': 57, - 'É': 101, - 'fl': 193, - '\u22c5': 385, - '中': 0, - }, - - // The x-etc test cases use those versions of the .ttf files provided - // by Ubuntu 14.04. See testdata/make-other-hinting-txts.sh for details. - - "x-arial-bold": { - ' ': 3, - '+': 14, - '0': 19, - '_': 66, - 'w': 90, - '~': 97, - 'Ä': 98, - 'fl': 192, - '½': 242, - 'σ': 305, - 'λ': 540, - 'ỹ': 1275, - '\u04e9': 1319, - '中': 0, - }, - "x-deja-vu-sans-oblique": { - ' ': 3, - '*': 13, - 'Œ': 276, - 'ω': 861, - '‡': 2571, - '⊕': 3110, - 'fl': 4728, - '\ufb03': 4729, - '\ufffd': 4813, - // TODO: '\U0001f640': ???, - '中': 0, - }, - "x-droid-sans-japanese": { - ' ': 0, - '\u3000': 3, - '\u3041': 25, - '\u30fe': 201, - '\uff61': 202, - '\uff67': 208, - '\uff9e': 263, - '\uff9f': 264, - '\u4e00': 265, - '\u557e': 1000, - '\u61b6': 2024, - '\u6ede': 3177, - '\u7505': 3555, - '\u81e3': 4602, - '\u81e5': 4603, - '\u81e7': 4604, - '\u81e8': 4605, - '\u81ea': 4606, - '\u81ed': 4607, - '\u81f3': 4608, - '\u81f4': 4609, - '\u91c7': 5796, - '\u9fa0': 6620, - '\u203e': 12584, - }, - "x-times-new-roman": { - ' ': 3, - ':': 29, - 'fl': 192, - 'Ŀ': 273, - '♠': 388, - 'Ŗ': 451, - 'Σ': 520, - '\u200D': 745, - 'Ẽ': 1216, - '\u04e9': 1319, - '中': 0, - }, - } - for name, wants := range testCases { - f, testdataIsOptional, err := parseTestdataFont(name) - if err != nil { - if testdataIsOptional { - t.Log(err) - } else { - t.Fatal(err) - } - continue - } - for r, want := range wants { - if got := f.Index(r); got != want { - t.Errorf("%s: Index of %q, aka %U: got %d, want %d", name, r, r, got, want) - } - } - } -} - -func TestName(t *testing.T) { - testCases := map[string]string{ - "luximr": "Luxi Mono", - "luxirr": "Luxi Serif", - "luxisr": "Luxi Sans", - } - - for name, want := range testCases { - f, testdataIsOptional, err := parseTestdataFont(name) - if err != nil { - if testdataIsOptional { - t.Log(err) - } else { - t.Fatal(err) - } - continue - } - if got := f.Name(NameIDFontFamily); got != want { - t.Errorf("%s: got %q, want %q", name, got, want) - } - } -} - -type scalingTestData struct { - advanceWidth fixed.Int26_6 - bounds fixed.Rectangle26_6 - points []Point -} - -// scalingTestParse parses a line of points like -// 213 -22 -111 236 555;-22 -111 1, 178 555 1, 236 555 1, 36 -111 1 -// The line will not have a trailing "\n". -func scalingTestParse(line string) (ret scalingTestData) { - next := func(s string) (string, fixed.Int26_6) { - t, i := "", strings.Index(s, " ") - if i != -1 { - s, t = s[:i], s[i+1:] - } - x, _ := strconv.Atoi(s) - return t, fixed.Int26_6(x) - } - - i := strings.Index(line, ";") - prefix, line := line[:i], line[i+1:] - - prefix, ret.advanceWidth = next(prefix) - prefix, ret.bounds.Min.X = next(prefix) - prefix, ret.bounds.Min.Y = next(prefix) - prefix, ret.bounds.Max.X = next(prefix) - prefix, ret.bounds.Max.Y = next(prefix) - - ret.points = make([]Point, 0, 1+strings.Count(line, ",")) - for len(line) > 0 { - s := line - if i := strings.Index(line, ","); i != -1 { - s, line = line[:i], line[i+1:] - for len(line) > 0 && line[0] == ' ' { - line = line[1:] - } - } else { - line = "" - } - s, x := next(s) - s, y := next(s) - s, f := next(s) - ret.points = append(ret.points, Point{X: x, Y: y, Flags: uint32(f)}) - } - return ret -} - -// scalingTestEquals is equivalent to, but faster than, calling -// reflect.DeepEqual(a, b), and also returns the index of the first non-equal -// element. It also treats a nil []Point and an empty non-nil []Point as equal. -// a and b must have equal length. -func scalingTestEquals(a, b []Point) (index int, equals bool) { - for i, p := range a { - if p != b[i] { - return i, false - } - } - return 0, true -} - -var scalingTestCases = []struct { - name string - size int -}{ - {"luxisr", 12}, - {"x-arial-bold", 11}, - {"x-deja-vu-sans-oblique", 17}, - {"x-droid-sans-japanese", 9}, - {"x-times-new-roman", 13}, -} - -func testScaling(t *testing.T, h font.Hinting) { - for _, tc := range scalingTestCases { - f, testdataIsOptional, err := parseTestdataFont(tc.name) - if err != nil { - if testdataIsOptional { - t.Log(err) - } else { - t.Error(err) - } - continue - } - hintingStr := "sans" - if h != font.HintingNone { - hintingStr = "with" - } - testFile, err := os.Open(fmt.Sprintf( - "../testdata/%s-%dpt-%s-hinting.txt", tc.name, tc.size, hintingStr)) - if err != nil { - t.Errorf("%s: Open: %v", tc.name, err) - continue - } - defer testFile.Close() - - wants := []scalingTestData{} - scanner := bufio.NewScanner(testFile) - if scanner.Scan() { - major, minor, patch := 0, 0, 0 - _, err := fmt.Sscanf(scanner.Text(), "freetype version %d.%d.%d", &major, &minor, &patch) - if err != nil { - t.Errorf("%s: version information: %v", tc.name, err) - } - if (major < 2) || (major == 2 && minor < 5) || (major == 2 && minor == 5 && patch < 1) { - t.Errorf("%s: need freetype version >= 2.5.1.\n"+ - "Try setting LD_LIBRARY_PATH=/path/to/freetype_built_from_src/objs/.libs/\n"+ - "and re-running testdata/make-other-hinting-txts.sh", - tc.name) - continue - } - } else { - t.Errorf("%s: no version information", tc.name) - continue - } - for scanner.Scan() { - wants = append(wants, scalingTestParse(scanner.Text())) - } - if err := scanner.Err(); err != nil && err != io.EOF { - t.Errorf("%s: Scanner: %v", tc.name, err) - continue - } - - glyphBuf := &GlyphBuf{} - for i, want := range wants { - if err = glyphBuf.Load(f, fixed.I(tc.size), Index(i), h); err != nil { - t.Errorf("%s: glyph #%d: Load: %v", tc.name, i, err) - continue - } - got := scalingTestData{ - advanceWidth: glyphBuf.AdvanceWidth, - bounds: glyphBuf.Bounds, - points: glyphBuf.Points, - } - - if got.advanceWidth != want.advanceWidth { - t.Errorf("%s: glyph #%d advance width:\ngot %v\nwant %v", - tc.name, i, got.advanceWidth, want.advanceWidth) - continue - } - - if got.bounds != want.bounds { - t.Errorf("%s: glyph #%d bounds:\ngot %v\nwant %v", - tc.name, i, got.bounds, want.bounds) - continue - } - - for i := range got.points { - got.points[i].Flags &= 0x01 - } - if len(got.points) != len(want.points) { - t.Errorf("%s: glyph #%d:\ngot %v\nwant %v\ndifferent slice lengths: %d versus %d", - tc.name, i, got.points, want.points, len(got.points), len(want.points)) - continue - } - if j, equals := scalingTestEquals(got.points, want.points); !equals { - t.Errorf("%s: glyph #%d:\ngot %v\nwant %v\nat index %d: %v versus %v", - tc.name, i, got.points, want.points, j, got.points[j], want.points[j]) - continue - } - } - } -} - -func TestScalingHintingNone(t *testing.T) { testScaling(t, font.HintingNone) } -func TestScalingHintingFull(t *testing.T) { testScaling(t, font.HintingFull) } diff --git a/vendor/github.com/golang/protobuf/.gitignore b/vendor/github.com/golang/protobuf/.gitignore deleted file mode 100644 index 8f5b596..0000000 --- a/vendor/github.com/golang/protobuf/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -.DS_Store -*.[568ao] -*.ao -*.so -*.pyc -._* -.nfs.* -[568a].out -*~ -*.orig -core -_obj -_test -_testmain.go -protoc-gen-go/testdata/multi/*.pb.go -_conformance/_conformance diff --git a/vendor/github.com/golang/protobuf/.travis.yml b/vendor/github.com/golang/protobuf/.travis.yml deleted file mode 100644 index 93c6780..0000000 --- a/vendor/github.com/golang/protobuf/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -sudo: false -language: go -go: -- 1.6.x -- 1.7.x -- 1.8.x -- 1.9.x - -install: - - go get -v -d -t github.com/golang/protobuf/... - - curl -L https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip -o /tmp/protoc.zip - - unzip /tmp/protoc.zip -d $HOME/protoc - -env: - - PATH=$HOME/protoc/bin:$PATH - -script: - - make all test diff --git a/vendor/github.com/golang/protobuf/Make.protobuf b/vendor/github.com/golang/protobuf/Make.protobuf deleted file mode 100644 index 15071de..0000000 --- a/vendor/github.com/golang/protobuf/Make.protobuf +++ /dev/null @@ -1,40 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# Includable Makefile to add a rule for generating .pb.go files from .proto files -# (Google protocol buffer descriptions). -# Typical use if myproto.proto is a file in package mypackage in this directory: -# -# include $(GOROOT)/src/pkg/github.com/golang/protobuf/Make.protobuf - -%.pb.go: %.proto - protoc --go_out=. $< - diff --git a/vendor/github.com/golang/protobuf/Makefile b/vendor/github.com/golang/protobuf/Makefile deleted file mode 100644 index a1421d8..0000000 --- a/vendor/github.com/golang/protobuf/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -all: install - -install: - go install ./proto ./jsonpb ./ptypes - go install ./protoc-gen-go - -test: - go test ./proto ./jsonpb ./ptypes - make -C protoc-gen-go/testdata test - -clean: - go clean ./... - -nuke: - go clean -i ./... - -regenerate: - make -C protoc-gen-go/descriptor regenerate - make -C protoc-gen-go/plugin regenerate - make -C protoc-gen-go/testdata regenerate - make -C proto/testdata regenerate - make -C jsonpb/jsonpb_test_proto regenerate - make -C _conformance regenerate diff --git a/vendor/github.com/golang/protobuf/README.md b/vendor/github.com/golang/protobuf/README.md deleted file mode 100644 index 9c4c815..0000000 --- a/vendor/github.com/golang/protobuf/README.md +++ /dev/null @@ -1,244 +0,0 @@ -# Go support for Protocol Buffers - -[![Build Status](https://travis-ci.org/golang/protobuf.svg?branch=master)](https://travis-ci.org/golang/protobuf) -[![GoDoc](https://godoc.org/github.com/golang/protobuf?status.svg)](https://godoc.org/github.com/golang/protobuf) - -Google's data interchange format. -Copyright 2010 The Go Authors. -https://github.com/golang/protobuf - -This package and the code it generates requires at least Go 1.4. - -This software implements Go bindings for protocol buffers. For -information about protocol buffers themselves, see - https://developers.google.com/protocol-buffers/ - -## Installation ## - -To use this software, you must: -- Install the standard C++ implementation of protocol buffers from - https://developers.google.com/protocol-buffers/ -- Of course, install the Go compiler and tools from - https://golang.org/ - See - https://golang.org/doc/install - for details or, if you are using gccgo, follow the instructions at - https://golang.org/doc/install/gccgo -- Grab the code from the repository and install the proto package. - The simplest way is to run `go get -u github.com/golang/protobuf/protoc-gen-go`. - The compiler plugin, protoc-gen-go, will be installed in $GOBIN, - defaulting to $GOPATH/bin. It must be in your $PATH for the protocol - compiler, protoc, to find it. - -This software has two parts: a 'protocol compiler plugin' that -generates Go source files that, once compiled, can access and manage -protocol buffers; and a library that implements run-time support for -encoding (marshaling), decoding (unmarshaling), and accessing protocol -buffers. - -There is support for gRPC in Go using protocol buffers. -See the note at the bottom of this file for details. - -There are no insertion points in the plugin. - - -## Using protocol buffers with Go ## - -Once the software is installed, there are two steps to using it. -First you must compile the protocol buffer definitions and then import -them, with the support library, into your program. - -To compile the protocol buffer definition, run protoc with the --go_out -parameter set to the directory you want to output the Go code to. - - protoc --go_out=. *.proto - -The generated files will be suffixed .pb.go. See the Test code below -for an example using such a file. - - -The package comment for the proto library contains text describing -the interface provided in Go for protocol buffers. Here is an edited -version. - -========== - -The proto package converts data structures to and from the -wire format of protocol buffers. It works in concert with the -Go source code generated for .proto files by the protocol compiler. - -A summary of the properties of the protocol buffer interface -for a protocol buffer variable v: - - - Names are turned from camel_case to CamelCase for export. - - There are no methods on v to set fields; just treat - them as structure fields. - - There are getters that return a field's value if set, - and return the field's default value if unset. - The getters work even if the receiver is a nil message. - - The zero value for a struct is its correct initialization state. - All desired fields must be set before marshaling. - - A Reset() method will restore a protobuf struct to its zero state. - - Non-repeated fields are pointers to the values; nil means unset. - That is, optional or required field int32 f becomes F *int32. - - Repeated fields are slices. - - Helper functions are available to aid the setting of fields. - Helpers for getting values are superseded by the - GetFoo methods and their use is deprecated. - msg.Foo = proto.String("hello") // set field - - Constants are defined to hold the default values of all fields that - have them. They have the form Default_StructName_FieldName. - Because the getter methods handle defaulted values, - direct use of these constants should be rare. - - Enums are given type names and maps from names to values. - Enum values are prefixed with the enum's type name. Enum types have - a String method, and a Enum method to assist in message construction. - - Nested groups and enums have type names prefixed with the name of - the surrounding message type. - - Extensions are given descriptor names that start with E_, - followed by an underscore-delimited list of the nested messages - that contain it (if any) followed by the CamelCased name of the - extension field itself. HasExtension, ClearExtension, GetExtension - and SetExtension are functions for manipulating extensions. - - Oneof field sets are given a single field in their message, - with distinguished wrapper types for each possible field value. - - Marshal and Unmarshal are functions to encode and decode the wire format. - -When the .proto file specifies `syntax="proto3"`, there are some differences: - - - Non-repeated fields of non-message type are values instead of pointers. - - Enum types do not get an Enum method. - -Consider file test.proto, containing - -```proto - syntax = "proto2"; - package example; - - enum FOO { X = 17; }; - - message Test { - required string label = 1; - optional int32 type = 2 [default=77]; - repeated int64 reps = 3; - optional group OptionalGroup = 4 { - required string RequiredField = 5; - } - } -``` - -To create and play with a Test object from the example package, - -```go - package main - - import ( - "log" - - "github.com/golang/protobuf/proto" - "path/to/example" - ) - - func main() { - test := &example.Test { - Label: proto.String("hello"), - Type: proto.Int32(17), - Reps: []int64{1, 2, 3}, - Optionalgroup: &example.Test_OptionalGroup { - RequiredField: proto.String("good bye"), - }, - } - data, err := proto.Marshal(test) - if err != nil { - log.Fatal("marshaling error: ", err) - } - newTest := &example.Test{} - err = proto.Unmarshal(data, newTest) - if err != nil { - log.Fatal("unmarshaling error: ", err) - } - // Now test and newTest contain the same data. - if test.GetLabel() != newTest.GetLabel() { - log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) - } - // etc. - } -``` - -## Parameters ## - -To pass extra parameters to the plugin, use a comma-separated -parameter list separated from the output directory by a colon: - - - protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto - - -- `import_prefix=xxx` - a prefix that is added onto the beginning of - all imports. Useful for things like generating protos in a - subdirectory, or regenerating vendored protobufs in-place. -- `import_path=foo/bar` - used as the package if no input files - declare `go_package`. If it contains slashes, everything up to the - rightmost slash is ignored. -- `plugins=plugin1+plugin2` - specifies the list of sub-plugins to - load. The only plugin in this repo is `grpc`. -- `Mfoo/bar.proto=quux/shme` - declares that foo/bar.proto is - associated with Go package quux/shme. This is subject to the - import_prefix parameter. - -## gRPC Support ## - -If a proto file specifies RPC services, protoc-gen-go can be instructed to -generate code compatible with gRPC (http://www.grpc.io/). To do this, pass -the `plugins` parameter to protoc-gen-go; the usual way is to insert it into -the --go_out argument to protoc: - - protoc --go_out=plugins=grpc:. *.proto - -## Compatibility ## - -The library and the generated code are expected to be stable over time. -However, we reserve the right to make breaking changes without notice for the -following reasons: - -- Security. A security issue in the specification or implementation may come to - light whose resolution requires breaking compatibility. We reserve the right - to address such security issues. -- Unspecified behavior. There are some aspects of the Protocol Buffers - specification that are undefined. Programs that depend on such unspecified - behavior may break in future releases. -- Specification errors or changes. If it becomes necessary to address an - inconsistency, incompleteness, or change in the Protocol Buffers - specification, resolving the issue could affect the meaning or legality of - existing programs. We reserve the right to address such issues, including - updating the implementations. -- Bugs. If the library has a bug that violates the specification, a program - that depends on the buggy behavior may break if the bug is fixed. We reserve - the right to fix such bugs. -- Adding methods or fields to generated structs. These may conflict with field - names that already exist in a schema, causing applications to break. When the - code generator encounters a field in the schema that would collide with a - generated field or method name, the code generator will append an underscore - to the generated field or method name. -- Adding, removing, or changing methods or fields in generated structs that - start with `XXX`. These parts of the generated code are exported out of - necessity, but should not be considered part of the public API. -- Adding, removing, or changing unexported symbols in generated code. - -Any breaking changes outside of these will be announced 6 months in advance to -protobuf@googlegroups.com. - -You should, whenever possible, use generated code created by the `protoc-gen-go` -tool built at the same commit as the `proto` package. The `proto` package -declares package-level constants in the form `ProtoPackageIsVersionX`. -Application code and generated code may depend on one of these constants to -ensure that compilation will fail if the available version of the proto library -is too old. Whenever we make a change to the generated code that requires newer -library support, in the same commit we will increment the version number of the -generated code and declare a new package-level constant whose name incorporates -the latest version number. Removing a compatibility constant is considered a -breaking change and would be subject to the announcement policy stated above. - -The `protoc-gen-go/generator` package exposes a plugin interface, -which is used by the gRPC code generation. This interface is not -supported and is subject to incompatible changes without notice. diff --git a/vendor/github.com/golang/protobuf/proto/all_test.go b/vendor/github.com/golang/protobuf/proto/all_test.go deleted file mode 100644 index 41451a4..0000000 --- a/vendor/github.com/golang/protobuf/proto/all_test.go +++ /dev/null @@ -1,2278 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "math" - "math/rand" - "reflect" - "runtime/debug" - "strings" - "testing" - "time" - - . "github.com/golang/protobuf/proto" - . "github.com/golang/protobuf/proto/testdata" -) - -var globalO *Buffer - -func old() *Buffer { - if globalO == nil { - globalO = NewBuffer(nil) - } - globalO.Reset() - return globalO -} - -func equalbytes(b1, b2 []byte, t *testing.T) { - if len(b1) != len(b2) { - t.Errorf("wrong lengths: 2*%d != %d", len(b1), len(b2)) - return - } - for i := 0; i < len(b1); i++ { - if b1[i] != b2[i] { - t.Errorf("bad byte[%d]:%x %x: %s %s", i, b1[i], b2[i], b1, b2) - } - } -} - -func initGoTestField() *GoTestField { - f := new(GoTestField) - f.Label = String("label") - f.Type = String("type") - return f -} - -// These are all structurally equivalent but the tag numbers differ. -// (It's remarkable that required, optional, and repeated all have -// 8 letters.) -func initGoTest_RequiredGroup() *GoTest_RequiredGroup { - return &GoTest_RequiredGroup{ - RequiredField: String("required"), - } -} - -func initGoTest_OptionalGroup() *GoTest_OptionalGroup { - return &GoTest_OptionalGroup{ - RequiredField: String("optional"), - } -} - -func initGoTest_RepeatedGroup() *GoTest_RepeatedGroup { - return &GoTest_RepeatedGroup{ - RequiredField: String("repeated"), - } -} - -func initGoTest(setdefaults bool) *GoTest { - pb := new(GoTest) - if setdefaults { - pb.F_BoolDefaulted = Bool(Default_GoTest_F_BoolDefaulted) - pb.F_Int32Defaulted = Int32(Default_GoTest_F_Int32Defaulted) - pb.F_Int64Defaulted = Int64(Default_GoTest_F_Int64Defaulted) - pb.F_Fixed32Defaulted = Uint32(Default_GoTest_F_Fixed32Defaulted) - pb.F_Fixed64Defaulted = Uint64(Default_GoTest_F_Fixed64Defaulted) - pb.F_Uint32Defaulted = Uint32(Default_GoTest_F_Uint32Defaulted) - pb.F_Uint64Defaulted = Uint64(Default_GoTest_F_Uint64Defaulted) - pb.F_FloatDefaulted = Float32(Default_GoTest_F_FloatDefaulted) - pb.F_DoubleDefaulted = Float64(Default_GoTest_F_DoubleDefaulted) - pb.F_StringDefaulted = String(Default_GoTest_F_StringDefaulted) - pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted - pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted) - pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted) - } - - pb.Kind = GoTest_TIME.Enum() - pb.RequiredField = initGoTestField() - pb.F_BoolRequired = Bool(true) - pb.F_Int32Required = Int32(3) - pb.F_Int64Required = Int64(6) - pb.F_Fixed32Required = Uint32(32) - pb.F_Fixed64Required = Uint64(64) - pb.F_Uint32Required = Uint32(3232) - pb.F_Uint64Required = Uint64(6464) - pb.F_FloatRequired = Float32(3232) - pb.F_DoubleRequired = Float64(6464) - pb.F_StringRequired = String("string") - pb.F_BytesRequired = []byte("bytes") - pb.F_Sint32Required = Int32(-32) - pb.F_Sint64Required = Int64(-64) - pb.Requiredgroup = initGoTest_RequiredGroup() - - return pb -} - -func fail(msg string, b *bytes.Buffer, s string, t *testing.T) { - data := b.Bytes() - ld := len(data) - ls := len(s) / 2 - - fmt.Printf("fail %s ld=%d ls=%d\n", msg, ld, ls) - - // find the interesting spot - n - n := ls - if ld < ls { - n = ld - } - j := 0 - for i := 0; i < n; i++ { - bs := hex(s[j])*16 + hex(s[j+1]) - j += 2 - if data[i] == bs { - continue - } - n = i - break - } - l := n - 10 - if l < 0 { - l = 0 - } - h := n + 10 - - // find the interesting spot - n - fmt.Printf("is[%d]:", l) - for i := l; i < h; i++ { - if i >= ld { - fmt.Printf(" --") - continue - } - fmt.Printf(" %.2x", data[i]) - } - fmt.Printf("\n") - - fmt.Printf("sb[%d]:", l) - for i := l; i < h; i++ { - if i >= ls { - fmt.Printf(" --") - continue - } - bs := hex(s[j])*16 + hex(s[j+1]) - j += 2 - fmt.Printf(" %.2x", bs) - } - fmt.Printf("\n") - - t.Fail() - - // t.Errorf("%s: \ngood: %s\nbad: %x", msg, s, b.Bytes()) - // Print the output in a partially-decoded format; can - // be helpful when updating the test. It produces the output - // that is pasted, with minor edits, into the argument to verify(). - // data := b.Bytes() - // nesting := 0 - // for b.Len() > 0 { - // start := len(data) - b.Len() - // var u uint64 - // u, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on varint:", err) - // return - // } - // wire := u & 0x7 - // tag := u >> 3 - // switch wire { - // case WireVarint: - // v, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on varint:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireFixed32: - // v, err := DecodeFixed32(b) - // if err != nil { - // fmt.Printf("decode error on fixed32:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireFixed64: - // v, err := DecodeFixed64(b) - // if err != nil { - // fmt.Printf("decode error on fixed64:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n", - // data[start:len(data)-b.Len()], tag, wire, v) - // case WireBytes: - // nb, err := DecodeVarint(b) - // if err != nil { - // fmt.Printf("decode error on bytes:", err) - // return - // } - // after_tag := len(data) - b.Len() - // str := make([]byte, nb) - // _, err = b.Read(str) - // if err != nil { - // fmt.Printf("decode error on bytes:", err) - // return - // } - // fmt.Printf("\t\t\"%x\" \"%x\" // field %d, encoding %d (FIELD)\n", - // data[start:after_tag], str, tag, wire) - // case WireStartGroup: - // nesting++ - // fmt.Printf("\t\t\"%x\"\t\t// start group field %d level %d\n", - // data[start:len(data)-b.Len()], tag, nesting) - // case WireEndGroup: - // fmt.Printf("\t\t\"%x\"\t\t// end group field %d level %d\n", - // data[start:len(data)-b.Len()], tag, nesting) - // nesting-- - // default: - // fmt.Printf("unrecognized wire type %d\n", wire) - // return - // } - // } -} - -func hex(c uint8) uint8 { - if '0' <= c && c <= '9' { - return c - '0' - } - if 'a' <= c && c <= 'f' { - return 10 + c - 'a' - } - if 'A' <= c && c <= 'F' { - return 10 + c - 'A' - } - return 0 -} - -func equal(b []byte, s string, t *testing.T) bool { - if 2*len(b) != len(s) { - // fail(fmt.Sprintf("wrong lengths: 2*%d != %d", len(b), len(s)), b, s, t) - fmt.Printf("wrong lengths: 2*%d != %d\n", len(b), len(s)) - return false - } - for i, j := 0, 0; i < len(b); i, j = i+1, j+2 { - x := hex(s[j])*16 + hex(s[j+1]) - if b[i] != x { - // fail(fmt.Sprintf("bad byte[%d]:%x %x", i, b[i], x), b, s, t) - fmt.Printf("bad byte[%d]:%x %x", i, b[i], x) - return false - } - } - return true -} - -func overify(t *testing.T, pb *GoTest, expected string) { - o := old() - err := o.Marshal(pb) - if err != nil { - fmt.Printf("overify marshal-1 err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("expected = %s", expected) - } - if !equal(o.Bytes(), expected, t) { - o.DebugPrint("overify neq 1", o.Bytes()) - t.Fatalf("expected = %s", expected) - } - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - err = o.Unmarshal(pbd) - if err != nil { - t.Fatalf("overify unmarshal err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("string = %s", expected) - } - o.Reset() - err = o.Marshal(pbd) - if err != nil { - t.Errorf("overify marshal-2 err = %v", err) - o.DebugPrint("", o.Bytes()) - t.Fatalf("string = %s", expected) - } - if !equal(o.Bytes(), expected, t) { - o.DebugPrint("overify neq 2", o.Bytes()) - t.Fatalf("string = %s", expected) - } -} - -// Simple tests for numeric encode/decode primitives (varint, etc.) -func TestNumericPrimitives(t *testing.T) { - for i := uint64(0); i < 1e6; i += 111 { - o := old() - if o.EncodeVarint(i) != nil { - t.Error("EncodeVarint") - break - } - x, e := o.DecodeVarint() - if e != nil { - t.Fatal("DecodeVarint") - } - if x != i { - t.Fatal("varint decode fail:", i, x) - } - - o = old() - if o.EncodeFixed32(i) != nil { - t.Fatal("encFixed32") - } - x, e = o.DecodeFixed32() - if e != nil { - t.Fatal("decFixed32") - } - if x != i { - t.Fatal("fixed32 decode fail:", i, x) - } - - o = old() - if o.EncodeFixed64(i*1234567) != nil { - t.Error("encFixed64") - break - } - x, e = o.DecodeFixed64() - if e != nil { - t.Error("decFixed64") - break - } - if x != i*1234567 { - t.Error("fixed64 decode fail:", i*1234567, x) - break - } - - o = old() - i32 := int32(i - 12345) - if o.EncodeZigzag32(uint64(i32)) != nil { - t.Fatal("EncodeZigzag32") - } - x, e = o.DecodeZigzag32() - if e != nil { - t.Fatal("DecodeZigzag32") - } - if x != uint64(uint32(i32)) { - t.Fatal("zigzag32 decode fail:", i32, x) - } - - o = old() - i64 := int64(i - 12345) - if o.EncodeZigzag64(uint64(i64)) != nil { - t.Fatal("EncodeZigzag64") - } - x, e = o.DecodeZigzag64() - if e != nil { - t.Fatal("DecodeZigzag64") - } - if x != uint64(i64) { - t.Fatal("zigzag64 decode fail:", i64, x) - } - } -} - -// fakeMarshaler is a simple struct implementing Marshaler and Message interfaces. -type fakeMarshaler struct { - b []byte - err error -} - -func (f *fakeMarshaler) Marshal() ([]byte, error) { return f.b, f.err } -func (f *fakeMarshaler) String() string { return fmt.Sprintf("Bytes: %v Error: %v", f.b, f.err) } -func (f *fakeMarshaler) ProtoMessage() {} -func (f *fakeMarshaler) Reset() {} - -type msgWithFakeMarshaler struct { - M *fakeMarshaler `protobuf:"bytes,1,opt,name=fake"` -} - -func (m *msgWithFakeMarshaler) String() string { return CompactTextString(m) } -func (m *msgWithFakeMarshaler) ProtoMessage() {} -func (m *msgWithFakeMarshaler) Reset() {} - -// Simple tests for proto messages that implement the Marshaler interface. -func TestMarshalerEncoding(t *testing.T) { - tests := []struct { - name string - m Message - want []byte - errType reflect.Type - }{ - { - name: "Marshaler that fails", - m: &fakeMarshaler{ - err: errors.New("some marshal err"), - b: []byte{5, 6, 7}, - }, - // Since the Marshal method returned bytes, they should be written to the - // buffer. (For efficiency, we assume that Marshal implementations are - // always correct w.r.t. RequiredNotSetError and output.) - want: []byte{5, 6, 7}, - errType: reflect.TypeOf(errors.New("some marshal err")), - }, - { - name: "Marshaler that fails with RequiredNotSetError", - m: &msgWithFakeMarshaler{ - M: &fakeMarshaler{ - err: &RequiredNotSetError{}, - b: []byte{5, 6, 7}, - }, - }, - // Since there's an error that can be continued after, - // the buffer should be written. - want: []byte{ - 10, 3, // for &msgWithFakeMarshaler - 5, 6, 7, // for &fakeMarshaler - }, - errType: reflect.TypeOf(&RequiredNotSetError{}), - }, - { - name: "Marshaler that succeeds", - m: &fakeMarshaler{ - b: []byte{0, 1, 2, 3, 4, 127, 255}, - }, - want: []byte{0, 1, 2, 3, 4, 127, 255}, - }, - } - for _, test := range tests { - b := NewBuffer(nil) - err := b.Marshal(test.m) - if reflect.TypeOf(err) != test.errType { - t.Errorf("%s: got err %T(%v) wanted %T", test.name, err, err, test.errType) - } - if !reflect.DeepEqual(test.want, b.Bytes()) { - t.Errorf("%s: got bytes %v wanted %v", test.name, b.Bytes(), test.want) - } - if size := Size(test.m); size != len(b.Bytes()) { - t.Errorf("%s: Size(_) = %v, but marshaled to %v bytes", test.name, size, len(b.Bytes())) - } - - m, mErr := Marshal(test.m) - if !bytes.Equal(b.Bytes(), m) { - t.Errorf("%s: Marshal returned %v, but (*Buffer).Marshal wrote %v", test.name, m, b.Bytes()) - } - if !reflect.DeepEqual(err, mErr) { - t.Errorf("%s: Marshal err = %q, but (*Buffer).Marshal returned %q", - test.name, fmt.Sprint(mErr), fmt.Sprint(err)) - } - } -} - -// Simple tests for bytes -func TestBytesPrimitives(t *testing.T) { - o := old() - bytes := []byte{'n', 'o', 'w', ' ', 'i', 's', ' ', 't', 'h', 'e', ' ', 't', 'i', 'm', 'e'} - if o.EncodeRawBytes(bytes) != nil { - t.Error("EncodeRawBytes") - } - decb, e := o.DecodeRawBytes(false) - if e != nil { - t.Error("DecodeRawBytes") - } - equalbytes(bytes, decb, t) -} - -// Simple tests for strings -func TestStringPrimitives(t *testing.T) { - o := old() - s := "now is the time" - if o.EncodeStringBytes(s) != nil { - t.Error("enc_string") - } - decs, e := o.DecodeStringBytes() - if e != nil { - t.Error("dec_string") - } - if s != decs { - t.Error("string encode/decode fail:", s, decs) - } -} - -// Do we catch the "required bit not set" case? -func TestRequiredBit(t *testing.T) { - o := old() - pb := new(GoTest) - err := o.Marshal(pb) - if err == nil { - t.Error("did not catch missing required fields") - } else if strings.Index(err.Error(), "Kind") < 0 { - t.Error("wrong error type:", err) - } -} - -// Check that all fields are nil. -// Clearly silly, and a residue from a more interesting test with an earlier, -// different initialization property, but it once caught a compiler bug so -// it lives. -func checkInitialized(pb *GoTest, t *testing.T) { - if pb.F_BoolDefaulted != nil { - t.Error("New or Reset did not set boolean:", *pb.F_BoolDefaulted) - } - if pb.F_Int32Defaulted != nil { - t.Error("New or Reset did not set int32:", *pb.F_Int32Defaulted) - } - if pb.F_Int64Defaulted != nil { - t.Error("New or Reset did not set int64:", *pb.F_Int64Defaulted) - } - if pb.F_Fixed32Defaulted != nil { - t.Error("New or Reset did not set fixed32:", *pb.F_Fixed32Defaulted) - } - if pb.F_Fixed64Defaulted != nil { - t.Error("New or Reset did not set fixed64:", *pb.F_Fixed64Defaulted) - } - if pb.F_Uint32Defaulted != nil { - t.Error("New or Reset did not set uint32:", *pb.F_Uint32Defaulted) - } - if pb.F_Uint64Defaulted != nil { - t.Error("New or Reset did not set uint64:", *pb.F_Uint64Defaulted) - } - if pb.F_FloatDefaulted != nil { - t.Error("New or Reset did not set float:", *pb.F_FloatDefaulted) - } - if pb.F_DoubleDefaulted != nil { - t.Error("New or Reset did not set double:", *pb.F_DoubleDefaulted) - } - if pb.F_StringDefaulted != nil { - t.Error("New or Reset did not set string:", *pb.F_StringDefaulted) - } - if pb.F_BytesDefaulted != nil { - t.Error("New or Reset did not set bytes:", string(pb.F_BytesDefaulted)) - } - if pb.F_Sint32Defaulted != nil { - t.Error("New or Reset did not set int32:", *pb.F_Sint32Defaulted) - } - if pb.F_Sint64Defaulted != nil { - t.Error("New or Reset did not set int64:", *pb.F_Sint64Defaulted) - } -} - -// Does Reset() reset? -func TestReset(t *testing.T) { - pb := initGoTest(true) - // muck with some values - pb.F_BoolDefaulted = Bool(false) - pb.F_Int32Defaulted = Int32(237) - pb.F_Int64Defaulted = Int64(12346) - pb.F_Fixed32Defaulted = Uint32(32000) - pb.F_Fixed64Defaulted = Uint64(666) - pb.F_Uint32Defaulted = Uint32(323232) - pb.F_Uint64Defaulted = nil - pb.F_FloatDefaulted = nil - pb.F_DoubleDefaulted = Float64(0) - pb.F_StringDefaulted = String("gotcha") - pb.F_BytesDefaulted = []byte("asdfasdf") - pb.F_Sint32Defaulted = Int32(123) - pb.F_Sint64Defaulted = Int64(789) - pb.Reset() - checkInitialized(pb, t) -} - -// All required fields set, no defaults provided. -func TestEncodeDecode1(t *testing.T) { - pb := initGoTest(false) - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 0x20 - "714000000000000000"+ // field 14, encoding 1, value 0x40 - "78a019"+ // field 15, encoding 0, value 0xca0 = 3232 - "8001c032"+ // field 16, encoding 0, value 0x1940 = 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2, string "string" - "b304"+ // field 70, encoding 3, start group - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // field 70, encoding 4, end group - "aa0605"+"6279746573"+ // field 101, encoding 2, string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f") // field 103, encoding 0, 0x7f zigzag64 -} - -// All required fields set, defaults provided. -func TestEncodeDecode2(t *testing.T) { - pb := initGoTest(true) - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All default fields set to their default value by hand -func TestEncodeDecode3(t *testing.T) { - pb := initGoTest(false) - pb.F_BoolDefaulted = Bool(true) - pb.F_Int32Defaulted = Int32(32) - pb.F_Int64Defaulted = Int64(64) - pb.F_Fixed32Defaulted = Uint32(320) - pb.F_Fixed64Defaulted = Uint64(640) - pb.F_Uint32Defaulted = Uint32(3200) - pb.F_Uint64Defaulted = Uint64(6400) - pb.F_FloatDefaulted = Float32(314159) - pb.F_DoubleDefaulted = Float64(271828) - pb.F_StringDefaulted = String("hello, \"world!\"\n") - pb.F_BytesDefaulted = []byte("Bignose") - pb.F_Sint32Defaulted = Int32(-32) - pb.F_Sint64Defaulted = Int64(-64) - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, defaults provided, all non-defaulted optional fields have values. -func TestEncodeDecode4(t *testing.T) { - pb := initGoTest(true) - pb.Table = String("hello") - pb.Param = Int32(7) - pb.OptionalField = initGoTestField() - pb.F_BoolOptional = Bool(true) - pb.F_Int32Optional = Int32(32) - pb.F_Int64Optional = Int64(64) - pb.F_Fixed32Optional = Uint32(3232) - pb.F_Fixed64Optional = Uint64(6464) - pb.F_Uint32Optional = Uint32(323232) - pb.F_Uint64Optional = Uint64(646464) - pb.F_FloatOptional = Float32(32.) - pb.F_DoubleOptional = Float64(64.) - pb.F_StringOptional = String("hello") - pb.F_BytesOptional = []byte("Bignose") - pb.F_Sint32Optional = Int32(-32) - pb.F_Sint64Optional = Int64(-64) - pb.Optionalgroup = initGoTest_OptionalGroup() - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "1205"+"68656c6c6f"+ // field 2, encoding 2, string "hello" - "1807"+ // field 3, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "320d"+"0a056c6162656c120474797065"+ // field 6, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "f00101"+ // field 30, encoding 0, value 1 - "f80120"+ // field 31, encoding 0, value 32 - "800240"+ // field 32, encoding 0, value 64 - "8d02a00c0000"+ // field 33, encoding 5, value 3232 - "91024019000000000000"+ // field 34, encoding 1, value 6464 - "9802a0dd13"+ // field 35, encoding 0, value 323232 - "a002c0ba27"+ // field 36, encoding 0, value 646464 - "ad0200000042"+ // field 37, encoding 5, value 32.0 - "b1020000000000005040"+ // field 38, encoding 1, value 64.0 - "ba0205"+"68656c6c6f"+ // field 39, encoding 2, string "hello" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "d305"+ // start group field 90 level 1 - "da0508"+"6f7074696f6e616c"+ // field 91, encoding 2, string "optional" - "d405"+ // end group field 90 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "ea1207"+"4269676e6f7365"+ // field 301, encoding 2, string "Bignose" - "f0123f"+ // field 302, encoding 0, value 63 - "f8127f"+ // field 303, encoding 0, value 127 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, defaults provided, all repeated fields given two values. -func TestEncodeDecode5(t *testing.T) { - pb := initGoTest(true) - pb.RepeatedField = []*GoTestField{initGoTestField(), initGoTestField()} - pb.F_BoolRepeated = []bool{false, true} - pb.F_Int32Repeated = []int32{32, 33} - pb.F_Int64Repeated = []int64{64, 65} - pb.F_Fixed32Repeated = []uint32{3232, 3333} - pb.F_Fixed64Repeated = []uint64{6464, 6565} - pb.F_Uint32Repeated = []uint32{323232, 333333} - pb.F_Uint64Repeated = []uint64{646464, 656565} - pb.F_FloatRepeated = []float32{32., 33.} - pb.F_DoubleRepeated = []float64{64., 65.} - pb.F_StringRepeated = []string{"hello", "sailor"} - pb.F_BytesRepeated = [][]byte{[]byte("big"), []byte("nose")} - pb.F_Sint32Repeated = []int32{32, -32} - pb.F_Sint64Repeated = []int64{64, -64} - pb.Repeatedgroup = []*GoTest_RepeatedGroup{initGoTest_RepeatedGroup(), initGoTest_RepeatedGroup()} - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) - "2a0d"+"0a056c6162656c120474797065"+ // field 5, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "a00100"+ // field 20, encoding 0, value 0 - "a00101"+ // field 20, encoding 0, value 1 - "a80120"+ // field 21, encoding 0, value 32 - "a80121"+ // field 21, encoding 0, value 33 - "b00140"+ // field 22, encoding 0, value 64 - "b00141"+ // field 22, encoding 0, value 65 - "bd01a00c0000"+ // field 23, encoding 5, value 3232 - "bd01050d0000"+ // field 23, encoding 5, value 3333 - "c1014019000000000000"+ // field 24, encoding 1, value 6464 - "c101a519000000000000"+ // field 24, encoding 1, value 6565 - "c801a0dd13"+ // field 25, encoding 0, value 323232 - "c80195ac14"+ // field 25, encoding 0, value 333333 - "d001c0ba27"+ // field 26, encoding 0, value 646464 - "d001b58928"+ // field 26, encoding 0, value 656565 - "dd0100000042"+ // field 27, encoding 5, value 32.0 - "dd0100000442"+ // field 27, encoding 5, value 33.0 - "e1010000000000005040"+ // field 28, encoding 1, value 64.0 - "e1010000000000405040"+ // field 28, encoding 1, value 65.0 - "ea0105"+"68656c6c6f"+ // field 29, encoding 2, string "hello" - "ea0106"+"7361696c6f72"+ // field 29, encoding 2, string "sailor" - "c00201"+ // field 40, encoding 0, value 1 - "c80220"+ // field 41, encoding 0, value 32 - "d00240"+ // field 42, encoding 0, value 64 - "dd0240010000"+ // field 43, encoding 5, value 320 - "e1028002000000000000"+ // field 44, encoding 1, value 640 - "e8028019"+ // field 45, encoding 0, value 3200 - "f0028032"+ // field 46, encoding 0, value 6400 - "fd02e0659948"+ // field 47, encoding 5, value 314159.0 - "81030000000050971041"+ // field 48, encoding 1, value 271828.0 - "8a0310"+"68656c6c6f2c2022776f726c6421220a"+ // field 49, encoding 2 string "hello, \"world!\"\n" - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "8305"+ // start group field 80 level 1 - "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" - "8405"+ // end group field 80 level 1 - "8305"+ // start group field 80 level 1 - "8a0508"+"7265706561746564"+ // field 81, encoding 2, string "repeated" - "8405"+ // end group field 80 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "ca0c03"+"626967"+ // field 201, encoding 2, string "big" - "ca0c04"+"6e6f7365"+ // field 201, encoding 2, string "nose" - "d00c40"+ // field 202, encoding 0, value 32 - "d00c3f"+ // field 202, encoding 0, value -32 - "d80c8001"+ // field 203, encoding 0, value 64 - "d80c7f"+ // field 203, encoding 0, value -64 - "8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose" - "90193f"+ // field 402, encoding 0, value 63 - "98197f") // field 403, encoding 0, value 127 - -} - -// All required fields set, all packed repeated fields given two values. -func TestEncodeDecode6(t *testing.T) { - pb := initGoTest(false) - pb.F_BoolRepeatedPacked = []bool{false, true} - pb.F_Int32RepeatedPacked = []int32{32, 33} - pb.F_Int64RepeatedPacked = []int64{64, 65} - pb.F_Fixed32RepeatedPacked = []uint32{3232, 3333} - pb.F_Fixed64RepeatedPacked = []uint64{6464, 6565} - pb.F_Uint32RepeatedPacked = []uint32{323232, 333333} - pb.F_Uint64RepeatedPacked = []uint64{646464, 656565} - pb.F_FloatRepeatedPacked = []float32{32., 33.} - pb.F_DoubleRepeatedPacked = []float64{64., 65.} - pb.F_Sint32RepeatedPacked = []int32{32, -32} - pb.F_Sint64RepeatedPacked = []int64{64, -64} - - overify(t, pb, - "0807"+ // field 1, encoding 0, value 7 - "220d"+"0a056c6162656c120474797065"+ // field 4, encoding 2 (GoTestField) - "5001"+ // field 10, encoding 0, value 1 - "5803"+ // field 11, encoding 0, value 3 - "6006"+ // field 12, encoding 0, value 6 - "6d20000000"+ // field 13, encoding 5, value 32 - "714000000000000000"+ // field 14, encoding 1, value 64 - "78a019"+ // field 15, encoding 0, value 3232 - "8001c032"+ // field 16, encoding 0, value 6464 - "8d0100004a45"+ // field 17, encoding 5, value 3232.0 - "9101000000000040b940"+ // field 18, encoding 1, value 6464.0 - "9a0106"+"737472696e67"+ // field 19, encoding 2 string "string" - "9203020001"+ // field 50, encoding 2, 2 bytes, value 0, value 1 - "9a03022021"+ // field 51, encoding 2, 2 bytes, value 32, value 33 - "a203024041"+ // field 52, encoding 2, 2 bytes, value 64, value 65 - "aa0308"+ // field 53, encoding 2, 8 bytes - "a00c0000050d0000"+ // value 3232, value 3333 - "b20310"+ // field 54, encoding 2, 16 bytes - "4019000000000000a519000000000000"+ // value 6464, value 6565 - "ba0306"+ // field 55, encoding 2, 6 bytes - "a0dd1395ac14"+ // value 323232, value 333333 - "c20306"+ // field 56, encoding 2, 6 bytes - "c0ba27b58928"+ // value 646464, value 656565 - "ca0308"+ // field 57, encoding 2, 8 bytes - "0000004200000442"+ // value 32.0, value 33.0 - "d20310"+ // field 58, encoding 2, 16 bytes - "00000000000050400000000000405040"+ // value 64.0, value 65.0 - "b304"+ // start group field 70 level 1 - "ba0408"+"7265717569726564"+ // field 71, encoding 2, string "required" - "b404"+ // end group field 70 level 1 - "aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes" - "b0063f"+ // field 102, encoding 0, 0x3f zigzag32 - "b8067f"+ // field 103, encoding 0, 0x7f zigzag64 - "b21f02"+ // field 502, encoding 2, 2 bytes - "403f"+ // value 32, value -32 - "ba1f03"+ // field 503, encoding 2, 3 bytes - "80017f") // value 64, value -64 -} - -// Test that we can encode empty bytes fields. -func TestEncodeDecodeBytes1(t *testing.T) { - pb := initGoTest(false) - - // Create our bytes - pb.F_BytesRequired = []byte{} - pb.F_BytesRepeated = [][]byte{{}} - pb.F_BytesOptional = []byte{} - - d, err := Marshal(pb) - if err != nil { - t.Error(err) - } - - pbd := new(GoTest) - if err := Unmarshal(d, pbd); err != nil { - t.Error(err) - } - - if pbd.F_BytesRequired == nil || len(pbd.F_BytesRequired) != 0 { - t.Error("required empty bytes field is incorrect") - } - if pbd.F_BytesRepeated == nil || len(pbd.F_BytesRepeated) == 1 && pbd.F_BytesRepeated[0] == nil { - t.Error("repeated empty bytes field is incorrect") - } - if pbd.F_BytesOptional == nil || len(pbd.F_BytesOptional) != 0 { - t.Error("optional empty bytes field is incorrect") - } -} - -// Test that we encode nil-valued fields of a repeated bytes field correctly. -// Since entries in a repeated field cannot be nil, nil must mean empty value. -func TestEncodeDecodeBytes2(t *testing.T) { - pb := initGoTest(false) - - // Create our bytes - pb.F_BytesRepeated = [][]byte{nil} - - d, err := Marshal(pb) - if err != nil { - t.Error(err) - } - - pbd := new(GoTest) - if err := Unmarshal(d, pbd); err != nil { - t.Error(err) - } - - if len(pbd.F_BytesRepeated) != 1 || pbd.F_BytesRepeated[0] == nil { - t.Error("Unexpected value for repeated bytes field") - } -} - -// All required fields set, defaults provided, all repeated fields given two values. -func TestSkippingUnrecognizedFields(t *testing.T) { - o := old() - pb := initGoTestField() - - // Marshal it normally. - o.Marshal(pb) - - // Now new a GoSkipTest record. - skip := &GoSkipTest{ - SkipInt32: Int32(32), - SkipFixed32: Uint32(3232), - SkipFixed64: Uint64(6464), - SkipString: String("skipper"), - Skipgroup: &GoSkipTest_SkipGroup{ - GroupInt32: Int32(75), - GroupString: String("wxyz"), - }, - } - - // Marshal it into same buffer. - o.Marshal(skip) - - pbd := new(GoTestField) - o.Unmarshal(pbd) - - // The __unrecognized field should be a marshaling of GoSkipTest - skipd := new(GoSkipTest) - - o.SetBuf(pbd.XXX_unrecognized) - o.Unmarshal(skipd) - - if *skipd.SkipInt32 != *skip.SkipInt32 { - t.Error("skip int32", skipd.SkipInt32) - } - if *skipd.SkipFixed32 != *skip.SkipFixed32 { - t.Error("skip fixed32", skipd.SkipFixed32) - } - if *skipd.SkipFixed64 != *skip.SkipFixed64 { - t.Error("skip fixed64", skipd.SkipFixed64) - } - if *skipd.SkipString != *skip.SkipString { - t.Error("skip string", *skipd.SkipString) - } - if *skipd.Skipgroup.GroupInt32 != *skip.Skipgroup.GroupInt32 { - t.Error("skip group int32", skipd.Skipgroup.GroupInt32) - } - if *skipd.Skipgroup.GroupString != *skip.Skipgroup.GroupString { - t.Error("skip group string", *skipd.Skipgroup.GroupString) - } -} - -// Check that unrecognized fields of a submessage are preserved. -func TestSubmessageUnrecognizedFields(t *testing.T) { - nm := &NewMessage{ - Nested: &NewMessage_Nested{ - Name: String("Nigel"), - FoodGroup: String("carbs"), - }, - } - b, err := Marshal(nm) - if err != nil { - t.Fatalf("Marshal of NewMessage: %v", err) - } - - // Unmarshal into an OldMessage. - om := new(OldMessage) - if err := Unmarshal(b, om); err != nil { - t.Fatalf("Unmarshal to OldMessage: %v", err) - } - exp := &OldMessage{ - Nested: &OldMessage_Nested{ - Name: String("Nigel"), - // normal protocol buffer users should not do this - XXX_unrecognized: []byte("\x12\x05carbs"), - }, - } - if !Equal(om, exp) { - t.Errorf("om = %v, want %v", om, exp) - } - - // Clone the OldMessage. - om = Clone(om).(*OldMessage) - if !Equal(om, exp) { - t.Errorf("Clone(om) = %v, want %v", om, exp) - } - - // Marshal the OldMessage, then unmarshal it into an empty NewMessage. - if b, err = Marshal(om); err != nil { - t.Fatalf("Marshal of OldMessage: %v", err) - } - t.Logf("Marshal(%v) -> %q", om, b) - nm2 := new(NewMessage) - if err := Unmarshal(b, nm2); err != nil { - t.Fatalf("Unmarshal to NewMessage: %v", err) - } - if !Equal(nm, nm2) { - t.Errorf("NewMessage round-trip: %v => %v", nm, nm2) - } -} - -// Check that an int32 field can be upgraded to an int64 field. -func TestNegativeInt32(t *testing.T) { - om := &OldMessage{ - Num: Int32(-1), - } - b, err := Marshal(om) - if err != nil { - t.Fatalf("Marshal of OldMessage: %v", err) - } - - // Check the size. It should be 11 bytes; - // 1 for the field/wire type, and 10 for the negative number. - if len(b) != 11 { - t.Errorf("%v marshaled as %q, wanted 11 bytes", om, b) - } - - // Unmarshal into a NewMessage. - nm := new(NewMessage) - if err := Unmarshal(b, nm); err != nil { - t.Fatalf("Unmarshal to NewMessage: %v", err) - } - want := &NewMessage{ - Num: Int64(-1), - } - if !Equal(nm, want) { - t.Errorf("nm = %v, want %v", nm, want) - } -} - -// Check that we can grow an array (repeated field) to have many elements. -// This test doesn't depend only on our encoding; for variety, it makes sure -// we create, encode, and decode the correct contents explicitly. It's therefore -// a bit messier. -// This test also uses (and hence tests) the Marshal/Unmarshal functions -// instead of the methods. -func TestBigRepeated(t *testing.T) { - pb := initGoTest(true) - - // Create the arrays - const N = 50 // Internally the library starts much smaller. - pb.Repeatedgroup = make([]*GoTest_RepeatedGroup, N) - pb.F_Sint64Repeated = make([]int64, N) - pb.F_Sint32Repeated = make([]int32, N) - pb.F_BytesRepeated = make([][]byte, N) - pb.F_StringRepeated = make([]string, N) - pb.F_DoubleRepeated = make([]float64, N) - pb.F_FloatRepeated = make([]float32, N) - pb.F_Uint64Repeated = make([]uint64, N) - pb.F_Uint32Repeated = make([]uint32, N) - pb.F_Fixed64Repeated = make([]uint64, N) - pb.F_Fixed32Repeated = make([]uint32, N) - pb.F_Int64Repeated = make([]int64, N) - pb.F_Int32Repeated = make([]int32, N) - pb.F_BoolRepeated = make([]bool, N) - pb.RepeatedField = make([]*GoTestField, N) - - // Fill in the arrays with checkable values. - igtf := initGoTestField() - igtrg := initGoTest_RepeatedGroup() - for i := 0; i < N; i++ { - pb.Repeatedgroup[i] = igtrg - pb.F_Sint64Repeated[i] = int64(i) - pb.F_Sint32Repeated[i] = int32(i) - s := fmt.Sprint(i) - pb.F_BytesRepeated[i] = []byte(s) - pb.F_StringRepeated[i] = s - pb.F_DoubleRepeated[i] = float64(i) - pb.F_FloatRepeated[i] = float32(i) - pb.F_Uint64Repeated[i] = uint64(i) - pb.F_Uint32Repeated[i] = uint32(i) - pb.F_Fixed64Repeated[i] = uint64(i) - pb.F_Fixed32Repeated[i] = uint32(i) - pb.F_Int64Repeated[i] = int64(i) - pb.F_Int32Repeated[i] = int32(i) - pb.F_BoolRepeated[i] = i%2 == 0 - pb.RepeatedField[i] = igtf - } - - // Marshal. - buf, _ := Marshal(pb) - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - Unmarshal(buf, pbd) - - // Check the checkable values - for i := uint64(0); i < N; i++ { - if pbd.Repeatedgroup[i] == nil { // TODO: more checking? - t.Error("pbd.Repeatedgroup bad") - } - var x uint64 - x = uint64(pbd.F_Sint64Repeated[i]) - if x != i { - t.Error("pbd.F_Sint64Repeated bad", x, i) - } - x = uint64(pbd.F_Sint32Repeated[i]) - if x != i { - t.Error("pbd.F_Sint32Repeated bad", x, i) - } - s := fmt.Sprint(i) - equalbytes(pbd.F_BytesRepeated[i], []byte(s), t) - if pbd.F_StringRepeated[i] != s { - t.Error("pbd.F_Sint32Repeated bad", pbd.F_StringRepeated[i], i) - } - x = uint64(pbd.F_DoubleRepeated[i]) - if x != i { - t.Error("pbd.F_DoubleRepeated bad", x, i) - } - x = uint64(pbd.F_FloatRepeated[i]) - if x != i { - t.Error("pbd.F_FloatRepeated bad", x, i) - } - x = pbd.F_Uint64Repeated[i] - if x != i { - t.Error("pbd.F_Uint64Repeated bad", x, i) - } - x = uint64(pbd.F_Uint32Repeated[i]) - if x != i { - t.Error("pbd.F_Uint32Repeated bad", x, i) - } - x = pbd.F_Fixed64Repeated[i] - if x != i { - t.Error("pbd.F_Fixed64Repeated bad", x, i) - } - x = uint64(pbd.F_Fixed32Repeated[i]) - if x != i { - t.Error("pbd.F_Fixed32Repeated bad", x, i) - } - x = uint64(pbd.F_Int64Repeated[i]) - if x != i { - t.Error("pbd.F_Int64Repeated bad", x, i) - } - x = uint64(pbd.F_Int32Repeated[i]) - if x != i { - t.Error("pbd.F_Int32Repeated bad", x, i) - } - if pbd.F_BoolRepeated[i] != (i%2 == 0) { - t.Error("pbd.F_BoolRepeated bad", x, i) - } - if pbd.RepeatedField[i] == nil { // TODO: more checking? - t.Error("pbd.RepeatedField bad") - } - } -} - -// Verify we give a useful message when decoding to the wrong structure type. -func TestTypeMismatch(t *testing.T) { - pb1 := initGoTest(true) - - // Marshal - o := old() - o.Marshal(pb1) - - // Now Unmarshal it to the wrong type. - pb2 := initGoTestField() - err := o.Unmarshal(pb2) - if err == nil { - t.Error("expected error, got no error") - } else if !strings.Contains(err.Error(), "bad wiretype") { - t.Error("expected bad wiretype error, got", err) - } -} - -func encodeDecode(t *testing.T, in, out Message, msg string) { - buf, err := Marshal(in) - if err != nil { - t.Fatalf("failed marshaling %v: %v", msg, err) - } - if err := Unmarshal(buf, out); err != nil { - t.Fatalf("failed unmarshaling %v: %v", msg, err) - } -} - -func TestPackedNonPackedDecoderSwitching(t *testing.T) { - np, p := new(NonPackedTest), new(PackedTest) - - // non-packed -> packed - np.A = []int32{0, 1, 1, 2, 3, 5} - encodeDecode(t, np, p, "non-packed -> packed") - if !reflect.DeepEqual(np.A, p.B) { - t.Errorf("failed non-packed -> packed; np.A=%+v, p.B=%+v", np.A, p.B) - } - - // packed -> non-packed - np.Reset() - p.B = []int32{3, 1, 4, 1, 5, 9} - encodeDecode(t, p, np, "packed -> non-packed") - if !reflect.DeepEqual(p.B, np.A) { - t.Errorf("failed packed -> non-packed; p.B=%+v, np.A=%+v", p.B, np.A) - } -} - -func TestProto1RepeatedGroup(t *testing.T) { - pb := &MessageList{ - Message: []*MessageList_Message{ - { - Name: String("blah"), - Count: Int32(7), - }, - // NOTE: pb.Message[1] is a nil - nil, - }, - } - - o := old() - err := o.Marshal(pb) - if err == nil || !strings.Contains(err.Error(), "repeated field Message has nil") { - t.Fatalf("unexpected or no error when marshaling: %v", err) - } -} - -// Test that enums work. Checks for a bug introduced by making enums -// named types instead of int32: newInt32FromUint64 would crash with -// a type mismatch in reflect.PointTo. -func TestEnum(t *testing.T) { - pb := new(GoEnum) - pb.Foo = FOO_FOO1.Enum() - o := old() - if err := o.Marshal(pb); err != nil { - t.Fatal("error encoding enum:", err) - } - pb1 := new(GoEnum) - if err := o.Unmarshal(pb1); err != nil { - t.Fatal("error decoding enum:", err) - } - if *pb1.Foo != FOO_FOO1 { - t.Error("expected 7 but got ", *pb1.Foo) - } -} - -// Enum types have String methods. Check that enum fields can be printed. -// We don't care what the value actually is, just as long as it doesn't crash. -func TestPrintingNilEnumFields(t *testing.T) { - pb := new(GoEnum) - _ = fmt.Sprintf("%+v", pb) -} - -// Verify that absent required fields cause Marshal/Unmarshal to return errors. -func TestRequiredFieldEnforcement(t *testing.T) { - pb := new(GoTestField) - _, err := Marshal(pb) - if err == nil { - t.Error("marshal: expected error, got nil") - } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Label") { - t.Errorf("marshal: bad error type: %v", err) - } - - // A slightly sneaky, yet valid, proto. It encodes the same required field twice, - // so simply counting the required fields is insufficient. - // field 1, encoding 2, value "hi" - buf := []byte("\x0A\x02hi\x0A\x02hi") - err = Unmarshal(buf, pb) - if err == nil { - t.Error("unmarshal: expected error, got nil") - } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "{Unknown}") { - t.Errorf("unmarshal: bad error type: %v", err) - } -} - -// Verify that absent required fields in groups cause Marshal/Unmarshal to return errors. -func TestRequiredFieldEnforcementGroups(t *testing.T) { - pb := &GoTestRequiredGroupField{Group: &GoTestRequiredGroupField_Group{}} - if _, err := Marshal(pb); err == nil { - t.Error("marshal: expected error, got nil") - } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Group.Field") { - t.Errorf("marshal: bad error type: %v", err) - } - - buf := []byte{11, 12} - if err := Unmarshal(buf, pb); err == nil { - t.Error("unmarshal: expected error, got nil") - } else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Group.{Unknown}") { - t.Errorf("unmarshal: bad error type: %v", err) - } -} - -func TestTypedNilMarshal(t *testing.T) { - // A typed nil should return ErrNil and not crash. - { - var m *GoEnum - if _, err := Marshal(m); err != ErrNil { - t.Errorf("Marshal(%#v): got %v, want ErrNil", m, err) - } - } - - { - m := &Communique{Union: &Communique_Msg{nil}} - if _, err := Marshal(m); err == nil || err == ErrNil { - t.Errorf("Marshal(%#v): got %v, want errOneofHasNil", m, err) - } - } -} - -// A type that implements the Marshaler interface, but is not nillable. -type nonNillableInt uint64 - -func (nni nonNillableInt) Marshal() ([]byte, error) { - return EncodeVarint(uint64(nni)), nil -} - -type NNIMessage struct { - nni nonNillableInt -} - -func (*NNIMessage) Reset() {} -func (*NNIMessage) String() string { return "" } -func (*NNIMessage) ProtoMessage() {} - -// A type that implements the Marshaler interface and is nillable. -type nillableMessage struct { - x uint64 -} - -func (nm *nillableMessage) Marshal() ([]byte, error) { - return EncodeVarint(nm.x), nil -} - -type NMMessage struct { - nm *nillableMessage -} - -func (*NMMessage) Reset() {} -func (*NMMessage) String() string { return "" } -func (*NMMessage) ProtoMessage() {} - -// Verify a type that uses the Marshaler interface, but has a nil pointer. -func TestNilMarshaler(t *testing.T) { - // Try a struct with a Marshaler field that is nil. - // It should be directly marshable. - nmm := new(NMMessage) - if _, err := Marshal(nmm); err != nil { - t.Error("unexpected error marshaling nmm: ", err) - } - - // Try a struct with a Marshaler field that is not nillable. - nnim := new(NNIMessage) - nnim.nni = 7 - var _ Marshaler = nnim.nni // verify it is truly a Marshaler - if _, err := Marshal(nnim); err != nil { - t.Error("unexpected error marshaling nnim: ", err) - } -} - -func TestAllSetDefaults(t *testing.T) { - // Exercise SetDefaults with all scalar field types. - m := &Defaults{ - // NaN != NaN, so override that here. - F_Nan: Float32(1.7), - } - expected := &Defaults{ - F_Bool: Bool(true), - F_Int32: Int32(32), - F_Int64: Int64(64), - F_Fixed32: Uint32(320), - F_Fixed64: Uint64(640), - F_Uint32: Uint32(3200), - F_Uint64: Uint64(6400), - F_Float: Float32(314159), - F_Double: Float64(271828), - F_String: String(`hello, "world!"` + "\n"), - F_Bytes: []byte("Bignose"), - F_Sint32: Int32(-32), - F_Sint64: Int64(-64), - F_Enum: Defaults_GREEN.Enum(), - F_Pinf: Float32(float32(math.Inf(1))), - F_Ninf: Float32(float32(math.Inf(-1))), - F_Nan: Float32(1.7), - StrZero: String(""), - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("SetDefaults failed\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultsWithSetField(t *testing.T) { - // Check that a set value is not overridden. - m := &Defaults{ - F_Int32: Int32(12), - } - SetDefaults(m) - if v := m.GetF_Int32(); v != 12 { - t.Errorf("m.FInt32 = %v, want 12", v) - } -} - -func TestSetDefaultsWithSubMessage(t *testing.T) { - m := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("gopher"), - }, - } - expected := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("gopher"), - Port: Int32(4000), - }, - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultsWithRepeatedSubMessage(t *testing.T) { - m := &MyMessage{ - RepInner: []*InnerMessage{{}}, - } - expected := &MyMessage{ - RepInner: []*InnerMessage{{ - Port: Int32(4000), - }}, - } - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestSetDefaultWithRepeatedNonMessage(t *testing.T) { - m := &MyMessage{ - Pet: []string{"turtle", "wombat"}, - } - expected := Clone(m) - SetDefaults(m) - if !Equal(m, expected) { - t.Errorf("\n got %v\nwant %v", m, expected) - } -} - -func TestMaximumTagNumber(t *testing.T) { - m := &MaxTag{ - LastField: String("natural goat essence"), - } - buf, err := Marshal(m) - if err != nil { - t.Fatalf("proto.Marshal failed: %v", err) - } - m2 := new(MaxTag) - if err := Unmarshal(buf, m2); err != nil { - t.Fatalf("proto.Unmarshal failed: %v", err) - } - if got, want := m2.GetLastField(), *m.LastField; got != want { - t.Errorf("got %q, want %q", got, want) - } -} - -func TestJSON(t *testing.T) { - m := &MyMessage{ - Count: Int32(4), - Pet: []string{"bunny", "kitty"}, - Inner: &InnerMessage{ - Host: String("cauchy"), - }, - Bikeshed: MyMessage_GREEN.Enum(), - } - const expected = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":1}` - - b, err := json.Marshal(m) - if err != nil { - t.Fatalf("json.Marshal failed: %v", err) - } - s := string(b) - if s != expected { - t.Errorf("got %s\nwant %s", s, expected) - } - - received := new(MyMessage) - if err := json.Unmarshal(b, received); err != nil { - t.Fatalf("json.Unmarshal failed: %v", err) - } - if !Equal(received, m) { - t.Fatalf("got %s, want %s", received, m) - } - - // Test unmarshalling of JSON with symbolic enum name. - const old = `{"count":4,"pet":["bunny","kitty"],"inner":{"host":"cauchy"},"bikeshed":"GREEN"}` - received.Reset() - if err := json.Unmarshal([]byte(old), received); err != nil { - t.Fatalf("json.Unmarshal failed: %v", err) - } - if !Equal(received, m) { - t.Fatalf("got %s, want %s", received, m) - } -} - -func TestBadWireType(t *testing.T) { - b := []byte{7<<3 | 6} // field 7, wire type 6 - pb := new(OtherMessage) - if err := Unmarshal(b, pb); err == nil { - t.Errorf("Unmarshal did not fail") - } else if !strings.Contains(err.Error(), "unknown wire type") { - t.Errorf("wrong error: %v", err) - } -} - -func TestBytesWithInvalidLength(t *testing.T) { - // If a byte sequence has an invalid (negative) length, Unmarshal should not panic. - b := []byte{2<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0} - Unmarshal(b, new(MyMessage)) -} - -func TestLengthOverflow(t *testing.T) { - // Overflowing a length should not panic. - b := []byte{2<<3 | WireBytes, 1, 1, 3<<3 | WireBytes, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01} - Unmarshal(b, new(MyMessage)) -} - -func TestVarintOverflow(t *testing.T) { - // Overflowing a 64-bit length should not be allowed. - b := []byte{1<<3 | WireVarint, 0x01, 3<<3 | WireBytes, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01} - if err := Unmarshal(b, new(MyMessage)); err == nil { - t.Fatalf("Overflowed uint64 length without error") - } -} - -func TestUnmarshalFuzz(t *testing.T) { - const N = 1000 - seed := time.Now().UnixNano() - t.Logf("RNG seed is %d", seed) - rng := rand.New(rand.NewSource(seed)) - buf := make([]byte, 20) - for i := 0; i < N; i++ { - for j := range buf { - buf[j] = byte(rng.Intn(256)) - } - fuzzUnmarshal(t, buf) - } -} - -func TestMergeMessages(t *testing.T) { - pb := &MessageList{Message: []*MessageList_Message{{Name: String("x"), Count: Int32(1)}}} - data, err := Marshal(pb) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - pb1 := new(MessageList) - if err := Unmarshal(data, pb1); err != nil { - t.Fatalf("first Unmarshal: %v", err) - } - if err := Unmarshal(data, pb1); err != nil { - t.Fatalf("second Unmarshal: %v", err) - } - if len(pb1.Message) != 1 { - t.Errorf("two Unmarshals produced %d Messages, want 1", len(pb1.Message)) - } - - pb2 := new(MessageList) - if err := UnmarshalMerge(data, pb2); err != nil { - t.Fatalf("first UnmarshalMerge: %v", err) - } - if err := UnmarshalMerge(data, pb2); err != nil { - t.Fatalf("second UnmarshalMerge: %v", err) - } - if len(pb2.Message) != 2 { - t.Errorf("two UnmarshalMerges produced %d Messages, want 2", len(pb2.Message)) - } -} - -func TestExtensionMarshalOrder(t *testing.T) { - m := &MyMessage{Count: Int(123)} - if err := SetExtension(m, E_Ext_More, &Ext{Data: String("alpha")}); err != nil { - t.Fatalf("SetExtension: %v", err) - } - if err := SetExtension(m, E_Ext_Text, String("aleph")); err != nil { - t.Fatalf("SetExtension: %v", err) - } - if err := SetExtension(m, E_Ext_Number, Int32(1)); err != nil { - t.Fatalf("SetExtension: %v", err) - } - - // Serialize m several times, and check we get the same bytes each time. - var orig []byte - for i := 0; i < 100; i++ { - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - if i == 0 { - orig = b - continue - } - if !bytes.Equal(b, orig) { - t.Errorf("Bytes differ on attempt #%d", i) - } - } -} - -// Many extensions, because small maps might not iterate differently on each iteration. -var exts = []*ExtensionDesc{ - E_X201, - E_X202, - E_X203, - E_X204, - E_X205, - E_X206, - E_X207, - E_X208, - E_X209, - E_X210, - E_X211, - E_X212, - E_X213, - E_X214, - E_X215, - E_X216, - E_X217, - E_X218, - E_X219, - E_X220, - E_X221, - E_X222, - E_X223, - E_X224, - E_X225, - E_X226, - E_X227, - E_X228, - E_X229, - E_X230, - E_X231, - E_X232, - E_X233, - E_X234, - E_X235, - E_X236, - E_X237, - E_X238, - E_X239, - E_X240, - E_X241, - E_X242, - E_X243, - E_X244, - E_X245, - E_X246, - E_X247, - E_X248, - E_X249, - E_X250, -} - -func TestMessageSetMarshalOrder(t *testing.T) { - m := &MyMessageSet{} - for _, x := range exts { - if err := SetExtension(m, x, &Empty{}); err != nil { - t.Fatalf("SetExtension: %v", err) - } - } - - buf, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - // Serialize m several times, and check we get the same bytes each time. - for i := 0; i < 10; i++ { - b1, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - if !bytes.Equal(b1, buf) { - t.Errorf("Bytes differ on re-Marshal #%d", i) - } - - m2 := &MyMessageSet{} - if err := Unmarshal(buf, m2); err != nil { - t.Errorf("Unmarshal: %v", err) - } - b2, err := Marshal(m2) - if err != nil { - t.Errorf("re-Marshal: %v", err) - } - if !bytes.Equal(b2, buf) { - t.Errorf("Bytes differ on round-trip #%d", i) - } - } -} - -func TestUnmarshalMergesMessages(t *testing.T) { - // If a nested message occurs twice in the input, - // the fields should be merged when decoding. - a := &OtherMessage{ - Key: Int64(123), - Inner: &InnerMessage{ - Host: String("polhode"), - Port: Int32(1234), - }, - } - aData, err := Marshal(a) - if err != nil { - t.Fatalf("Marshal(a): %v", err) - } - b := &OtherMessage{ - Weight: Float32(1.2), - Inner: &InnerMessage{ - Host: String("herpolhode"), - Connected: Bool(true), - }, - } - bData, err := Marshal(b) - if err != nil { - t.Fatalf("Marshal(b): %v", err) - } - want := &OtherMessage{ - Key: Int64(123), - Weight: Float32(1.2), - Inner: &InnerMessage{ - Host: String("herpolhode"), - Port: Int32(1234), - Connected: Bool(true), - }, - } - got := new(OtherMessage) - if err := Unmarshal(append(aData, bData...), got); err != nil { - t.Fatalf("Unmarshal: %v", err) - } - if !Equal(got, want) { - t.Errorf("\n got %v\nwant %v", got, want) - } -} - -func TestEncodingSizes(t *testing.T) { - tests := []struct { - m Message - n int - }{ - {&Defaults{F_Int32: Int32(math.MaxInt32)}, 6}, - {&Defaults{F_Int32: Int32(math.MinInt32)}, 11}, - {&Defaults{F_Uint32: Uint32(uint32(math.MaxInt32) + 1)}, 6}, - {&Defaults{F_Uint32: Uint32(math.MaxUint32)}, 6}, - } - for _, test := range tests { - b, err := Marshal(test.m) - if err != nil { - t.Errorf("Marshal(%v): %v", test.m, err) - continue - } - if len(b) != test.n { - t.Errorf("Marshal(%v) yielded %d bytes, want %d bytes", test.m, len(b), test.n) - } - } -} - -func TestRequiredNotSetError(t *testing.T) { - pb := initGoTest(false) - pb.RequiredField.Label = nil - pb.F_Int32Required = nil - pb.F_Int64Required = nil - - expected := "0807" + // field 1, encoding 0, value 7 - "2206" + "120474797065" + // field 4, encoding 2 (GoTestField) - "5001" + // field 10, encoding 0, value 1 - "6d20000000" + // field 13, encoding 5, value 0x20 - "714000000000000000" + // field 14, encoding 1, value 0x40 - "78a019" + // field 15, encoding 0, value 0xca0 = 3232 - "8001c032" + // field 16, encoding 0, value 0x1940 = 6464 - "8d0100004a45" + // field 17, encoding 5, value 3232.0 - "9101000000000040b940" + // field 18, encoding 1, value 6464.0 - "9a0106" + "737472696e67" + // field 19, encoding 2, string "string" - "b304" + // field 70, encoding 3, start group - "ba0408" + "7265717569726564" + // field 71, encoding 2, string "required" - "b404" + // field 70, encoding 4, end group - "aa0605" + "6279746573" + // field 101, encoding 2, string "bytes" - "b0063f" + // field 102, encoding 0, 0x3f zigzag32 - "b8067f" // field 103, encoding 0, 0x7f zigzag64 - - o := old() - bytes, err := Marshal(pb) - if _, ok := err.(*RequiredNotSetError); !ok { - fmt.Printf("marshal-1 err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("expected = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.Label") < 0 { - t.Errorf("marshal-1 wrong err msg: %v", err) - } - if !equal(bytes, expected, t) { - o.DebugPrint("neq 1", bytes) - t.Fatalf("expected = %s", expected) - } - - // Now test Unmarshal by recreating the original buffer. - pbd := new(GoTest) - err = Unmarshal(bytes, pbd) - if _, ok := err.(*RequiredNotSetError); !ok { - t.Fatalf("unmarshal err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("string = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.{Unknown}") < 0 { - t.Errorf("unmarshal wrong err msg: %v", err) - } - bytes, err = Marshal(pbd) - if _, ok := err.(*RequiredNotSetError); !ok { - t.Errorf("marshal-2 err = %v, want *RequiredNotSetError", err) - o.DebugPrint("", bytes) - t.Fatalf("string = %s", expected) - } - if strings.Index(err.Error(), "RequiredField.Label") < 0 { - t.Errorf("marshal-2 wrong err msg: %v", err) - } - if !equal(bytes, expected, t) { - o.DebugPrint("neq 2", bytes) - t.Fatalf("string = %s", expected) - } -} - -func fuzzUnmarshal(t *testing.T, data []byte) { - defer func() { - if e := recover(); e != nil { - t.Errorf("These bytes caused a panic: %+v", data) - t.Logf("Stack:\n%s", debug.Stack()) - t.FailNow() - } - }() - - pb := new(MyMessage) - Unmarshal(data, pb) -} - -func TestMapFieldMarshal(t *testing.T) { - m := &MessageWithMap{ - NameMapping: map[int32]string{ - 1: "Rob", - 4: "Ian", - 8: "Dave", - }, - } - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - - // b should be the concatenation of these three byte sequences in some order. - parts := []string{ - "\n\a\b\x01\x12\x03Rob", - "\n\a\b\x04\x12\x03Ian", - "\n\b\b\x08\x12\x04Dave", - } - ok := false - for i := range parts { - for j := range parts { - if j == i { - continue - } - for k := range parts { - if k == i || k == j { - continue - } - try := parts[i] + parts[j] + parts[k] - if bytes.Equal(b, []byte(try)) { - ok = true - break - } - } - } - } - if !ok { - t.Fatalf("Incorrect Marshal output.\n got %q\nwant %q (or a permutation of that)", b, parts[0]+parts[1]+parts[2]) - } - t.Logf("FYI b: %q", b) - - (new(Buffer)).DebugPrint("Dump of b", b) -} - -func TestMapFieldRoundTrips(t *testing.T) { - m := &MessageWithMap{ - NameMapping: map[int32]string{ - 1: "Rob", - 4: "Ian", - 8: "Dave", - }, - MsgMapping: map[int64]*FloatingPoint{ - 0x7001: &FloatingPoint{F: Float64(2.0)}, - }, - ByteMapping: map[bool][]byte{ - false: []byte("that's not right!"), - true: []byte("aye, 'tis true!"), - }, - } - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - t.Logf("FYI b: %q", b) - m2 := new(MessageWithMap) - if err := Unmarshal(b, m2); err != nil { - t.Fatalf("Unmarshal: %v", err) - } - for _, pair := range [][2]interface{}{ - {m.NameMapping, m2.NameMapping}, - {m.MsgMapping, m2.MsgMapping}, - {m.ByteMapping, m2.ByteMapping}, - } { - if !reflect.DeepEqual(pair[0], pair[1]) { - t.Errorf("Map did not survive a round trip.\ninitial: %v\n final: %v", pair[0], pair[1]) - } - } -} - -func TestMapFieldWithNil(t *testing.T) { - m1 := &MessageWithMap{ - MsgMapping: map[int64]*FloatingPoint{ - 1: nil, - }, - } - b, err := Marshal(m1) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - m2 := new(MessageWithMap) - if err := Unmarshal(b, m2); err != nil { - t.Fatalf("Unmarshal: %v, got these bytes: %v", err, b) - } - if v, ok := m2.MsgMapping[1]; !ok { - t.Error("msg_mapping[1] not present") - } else if v != nil { - t.Errorf("msg_mapping[1] not nil: %v", v) - } -} - -func TestMapFieldWithNilBytes(t *testing.T) { - m1 := &MessageWithMap{ - ByteMapping: map[bool][]byte{ - false: []byte{}, - true: nil, - }, - } - n := Size(m1) - b, err := Marshal(m1) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - if n != len(b) { - t.Errorf("Size(m1) = %d; want len(Marshal(m1)) = %d", n, len(b)) - } - m2 := new(MessageWithMap) - if err := Unmarshal(b, m2); err != nil { - t.Fatalf("Unmarshal: %v, got these bytes: %v", err, b) - } - if v, ok := m2.ByteMapping[false]; !ok { - t.Error("byte_mapping[false] not present") - } else if len(v) != 0 { - t.Errorf("byte_mapping[false] not empty: %#v", v) - } - if v, ok := m2.ByteMapping[true]; !ok { - t.Error("byte_mapping[true] not present") - } else if len(v) != 0 { - t.Errorf("byte_mapping[true] not empty: %#v", v) - } -} - -func TestDecodeMapFieldMissingKey(t *testing.T) { - b := []byte{ - 0x0A, 0x03, // message, tag 1 (name_mapping), of length 3 bytes - // no key - 0x12, 0x01, 0x6D, // string value of length 1 byte, value "m" - } - got := &MessageWithMap{} - err := Unmarshal(b, got) - if err != nil { - t.Fatalf("failed to marshal map with missing key: %v", err) - } - want := &MessageWithMap{NameMapping: map[int32]string{0: "m"}} - if !Equal(got, want) { - t.Errorf("Unmarshaled map with no key was not as expected. got: %v, want %v", got, want) - } -} - -func TestDecodeMapFieldMissingValue(t *testing.T) { - b := []byte{ - 0x0A, 0x02, // message, tag 1 (name_mapping), of length 2 bytes - 0x08, 0x01, // varint key, value 1 - // no value - } - got := &MessageWithMap{} - err := Unmarshal(b, got) - if err != nil { - t.Fatalf("failed to marshal map with missing value: %v", err) - } - want := &MessageWithMap{NameMapping: map[int32]string{1: ""}} - if !Equal(got, want) { - t.Errorf("Unmarshaled map with no value was not as expected. got: %v, want %v", got, want) - } -} - -func TestOneof(t *testing.T) { - m := &Communique{} - b, err := Marshal(m) - if err != nil { - t.Fatalf("Marshal of empty message with oneof: %v", err) - } - if len(b) != 0 { - t.Errorf("Marshal of empty message yielded too many bytes: %v", b) - } - - m = &Communique{ - Union: &Communique_Name{"Barry"}, - } - - // Round-trip. - b, err = Marshal(m) - if err != nil { - t.Fatalf("Marshal of message with oneof: %v", err) - } - if len(b) != 7 { // name tag/wire (1) + name len (1) + name (5) - t.Errorf("Incorrect marshal of message with oneof: %v", b) - } - m.Reset() - if err := Unmarshal(b, m); err != nil { - t.Fatalf("Unmarshal of message with oneof: %v", err) - } - if x, ok := m.Union.(*Communique_Name); !ok || x.Name != "Barry" { - t.Errorf("After round trip, Union = %+v", m.Union) - } - if name := m.GetName(); name != "Barry" { - t.Errorf("After round trip, GetName = %q, want %q", name, "Barry") - } - - // Let's try with a message in the oneof. - m.Union = &Communique_Msg{&Strings{StringField: String("deep deep string")}} - b, err = Marshal(m) - if err != nil { - t.Fatalf("Marshal of message with oneof set to message: %v", err) - } - if len(b) != 20 { // msg tag/wire (1) + msg len (1) + msg (1 + 1 + 16) - t.Errorf("Incorrect marshal of message with oneof set to message: %v", b) - } - m.Reset() - if err := Unmarshal(b, m); err != nil { - t.Fatalf("Unmarshal of message with oneof set to message: %v", err) - } - ss, ok := m.Union.(*Communique_Msg) - if !ok || ss.Msg.GetStringField() != "deep deep string" { - t.Errorf("After round trip with oneof set to message, Union = %+v", m.Union) - } -} - -func TestInefficientPackedBool(t *testing.T) { - // https://github.com/golang/protobuf/issues/76 - inp := []byte{ - 0x12, 0x02, // 0x12 = 2<<3|2; 2 bytes - // Usually a bool should take a single byte, - // but it is permitted to be any varint. - 0xb9, 0x30, - } - if err := Unmarshal(inp, new(MoreRepeated)); err != nil { - t.Error(err) - } -} - -// Benchmarks - -func testMsg() *GoTest { - pb := initGoTest(true) - const N = 1000 // Internally the library starts much smaller. - pb.F_Int32Repeated = make([]int32, N) - pb.F_DoubleRepeated = make([]float64, N) - for i := 0; i < N; i++ { - pb.F_Int32Repeated[i] = int32(i) - pb.F_DoubleRepeated[i] = float64(i) - } - return pb -} - -func bytesMsg() *GoTest { - pb := initGoTest(true) - buf := make([]byte, 4000) - for i := range buf { - buf[i] = byte(i) - } - pb.F_BytesDefaulted = buf - return pb -} - -func benchmarkMarshal(b *testing.B, pb Message, marshal func(Message) ([]byte, error)) { - d, _ := marshal(pb) - b.SetBytes(int64(len(d))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - marshal(pb) - } -} - -func benchmarkBufferMarshal(b *testing.B, pb Message) { - p := NewBuffer(nil) - benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { - p.Reset() - err := p.Marshal(pb0) - return p.Bytes(), err - }) -} - -func benchmarkSize(b *testing.B, pb Message) { - benchmarkMarshal(b, pb, func(pb0 Message) ([]byte, error) { - Size(pb) - return nil, nil - }) -} - -func newOf(pb Message) Message { - in := reflect.ValueOf(pb) - if in.IsNil() { - return pb - } - return reflect.New(in.Type().Elem()).Interface().(Message) -} - -func benchmarkUnmarshal(b *testing.B, pb Message, unmarshal func([]byte, Message) error) { - d, _ := Marshal(pb) - b.SetBytes(int64(len(d))) - pbd := newOf(pb) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - unmarshal(d, pbd) - } -} - -func benchmarkBufferUnmarshal(b *testing.B, pb Message) { - p := NewBuffer(nil) - benchmarkUnmarshal(b, pb, func(d []byte, pb0 Message) error { - p.SetBuf(d) - return p.Unmarshal(pb0) - }) -} - -// Benchmark{Marshal,BufferMarshal,Size,Unmarshal,BufferUnmarshal}{,Bytes} - -func BenchmarkMarshal(b *testing.B) { - benchmarkMarshal(b, testMsg(), Marshal) -} - -func BenchmarkBufferMarshal(b *testing.B) { - benchmarkBufferMarshal(b, testMsg()) -} - -func BenchmarkSize(b *testing.B) { - benchmarkSize(b, testMsg()) -} - -func BenchmarkUnmarshal(b *testing.B) { - benchmarkUnmarshal(b, testMsg(), Unmarshal) -} - -func BenchmarkBufferUnmarshal(b *testing.B) { - benchmarkBufferUnmarshal(b, testMsg()) -} - -func BenchmarkMarshalBytes(b *testing.B) { - benchmarkMarshal(b, bytesMsg(), Marshal) -} - -func BenchmarkBufferMarshalBytes(b *testing.B) { - benchmarkBufferMarshal(b, bytesMsg()) -} - -func BenchmarkSizeBytes(b *testing.B) { - benchmarkSize(b, bytesMsg()) -} - -func BenchmarkUnmarshalBytes(b *testing.B) { - benchmarkUnmarshal(b, bytesMsg(), Unmarshal) -} - -func BenchmarkBufferUnmarshalBytes(b *testing.B) { - benchmarkBufferUnmarshal(b, bytesMsg()) -} - -func BenchmarkUnmarshalUnrecognizedFields(b *testing.B) { - b.StopTimer() - pb := initGoTestField() - skip := &GoSkipTest{ - SkipInt32: Int32(32), - SkipFixed32: Uint32(3232), - SkipFixed64: Uint64(6464), - SkipString: String("skipper"), - Skipgroup: &GoSkipTest_SkipGroup{ - GroupInt32: Int32(75), - GroupString: String("wxyz"), - }, - } - - pbd := new(GoTestField) - p := NewBuffer(nil) - p.Marshal(pb) - p.Marshal(skip) - p2 := NewBuffer(nil) - - b.StartTimer() - for i := 0; i < b.N; i++ { - p2.SetBuf(p.Bytes()) - p2.Unmarshal(pbd) - } -} diff --git a/vendor/github.com/golang/protobuf/proto/any_test.go b/vendor/github.com/golang/protobuf/proto/any_test.go deleted file mode 100644 index 1a3c22e..0000000 --- a/vendor/github.com/golang/protobuf/proto/any_test.go +++ /dev/null @@ -1,300 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "strings" - "testing" - - "github.com/golang/protobuf/proto" - - pb "github.com/golang/protobuf/proto/proto3_proto" - testpb "github.com/golang/protobuf/proto/testdata" - anypb "github.com/golang/protobuf/ptypes/any" -) - -var ( - expandedMarshaler = proto.TextMarshaler{ExpandAny: true} - expandedCompactMarshaler = proto.TextMarshaler{Compact: true, ExpandAny: true} -) - -// anyEqual reports whether two messages which may be google.protobuf.Any or may -// contain google.protobuf.Any fields are equal. We can't use proto.Equal for -// comparison, because semantically equivalent messages may be marshaled to -// binary in different tag order. Instead, trust that TextMarshaler with -// ExpandAny option works and compare the text marshaling results. -func anyEqual(got, want proto.Message) bool { - // if messages are proto.Equal, no need to marshal. - if proto.Equal(got, want) { - return true - } - g := expandedMarshaler.Text(got) - w := expandedMarshaler.Text(want) - return g == w -} - -type golden struct { - m proto.Message - t, c string -} - -var goldenMessages = makeGolden() - -func makeGolden() []golden { - nested := &pb.Nested{Bunny: "Monty"} - nb, err := proto.Marshal(nested) - if err != nil { - panic(err) - } - m1 := &pb.Message{ - Name: "David", - ResultCount: 47, - Anything: &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb}, - } - m2 := &pb.Message{ - Name: "David", - ResultCount: 47, - Anything: &anypb.Any{TypeUrl: "http://[::1]/type.googleapis.com/" + proto.MessageName(nested), Value: nb}, - } - m3 := &pb.Message{ - Name: "David", - ResultCount: 47, - Anything: &anypb.Any{TypeUrl: `type.googleapis.com/"/` + proto.MessageName(nested), Value: nb}, - } - m4 := &pb.Message{ - Name: "David", - ResultCount: 47, - Anything: &anypb.Any{TypeUrl: "type.googleapis.com/a/path/" + proto.MessageName(nested), Value: nb}, - } - m5 := &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb} - - any1 := &testpb.MyMessage{Count: proto.Int32(47), Name: proto.String("David")} - proto.SetExtension(any1, testpb.E_Ext_More, &testpb.Ext{Data: proto.String("foo")}) - proto.SetExtension(any1, testpb.E_Ext_Text, proto.String("bar")) - any1b, err := proto.Marshal(any1) - if err != nil { - panic(err) - } - any2 := &testpb.MyMessage{Count: proto.Int32(42), Bikeshed: testpb.MyMessage_GREEN.Enum(), RepBytes: [][]byte{[]byte("roboto")}} - proto.SetExtension(any2, testpb.E_Ext_More, &testpb.Ext{Data: proto.String("baz")}) - any2b, err := proto.Marshal(any2) - if err != nil { - panic(err) - } - m6 := &pb.Message{ - Name: "David", - ResultCount: 47, - Anything: &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b}, - ManyThings: []*anypb.Any{ - &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any2), Value: any2b}, - &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b}, - }, - } - - const ( - m1Golden = ` -name: "David" -result_count: 47 -anything: < - [type.googleapis.com/proto3_proto.Nested]: < - bunny: "Monty" - > -> -` - m2Golden = ` -name: "David" -result_count: 47 -anything: < - ["http://[::1]/type.googleapis.com/proto3_proto.Nested"]: < - bunny: "Monty" - > -> -` - m3Golden = ` -name: "David" -result_count: 47 -anything: < - ["type.googleapis.com/\"/proto3_proto.Nested"]: < - bunny: "Monty" - > -> -` - m4Golden = ` -name: "David" -result_count: 47 -anything: < - [type.googleapis.com/a/path/proto3_proto.Nested]: < - bunny: "Monty" - > -> -` - m5Golden = ` -[type.googleapis.com/proto3_proto.Nested]: < - bunny: "Monty" -> -` - m6Golden = ` -name: "David" -result_count: 47 -anything: < - [type.googleapis.com/testdata.MyMessage]: < - count: 47 - name: "David" - [testdata.Ext.more]: < - data: "foo" - > - [testdata.Ext.text]: "bar" - > -> -many_things: < - [type.googleapis.com/testdata.MyMessage]: < - count: 42 - bikeshed: GREEN - rep_bytes: "roboto" - [testdata.Ext.more]: < - data: "baz" - > - > -> -many_things: < - [type.googleapis.com/testdata.MyMessage]: < - count: 47 - name: "David" - [testdata.Ext.more]: < - data: "foo" - > - [testdata.Ext.text]: "bar" - > -> -` - ) - return []golden{ - {m1, strings.TrimSpace(m1Golden) + "\n", strings.TrimSpace(compact(m1Golden)) + " "}, - {m2, strings.TrimSpace(m2Golden) + "\n", strings.TrimSpace(compact(m2Golden)) + " "}, - {m3, strings.TrimSpace(m3Golden) + "\n", strings.TrimSpace(compact(m3Golden)) + " "}, - {m4, strings.TrimSpace(m4Golden) + "\n", strings.TrimSpace(compact(m4Golden)) + " "}, - {m5, strings.TrimSpace(m5Golden) + "\n", strings.TrimSpace(compact(m5Golden)) + " "}, - {m6, strings.TrimSpace(m6Golden) + "\n", strings.TrimSpace(compact(m6Golden)) + " "}, - } -} - -func TestMarshalGolden(t *testing.T) { - for _, tt := range goldenMessages { - if got, want := expandedMarshaler.Text(tt.m), tt.t; got != want { - t.Errorf("message %v: got:\n%s\nwant:\n%s", tt.m, got, want) - } - if got, want := expandedCompactMarshaler.Text(tt.m), tt.c; got != want { - t.Errorf("message %v: got:\n`%s`\nwant:\n`%s`", tt.m, got, want) - } - } -} - -func TestUnmarshalGolden(t *testing.T) { - for _, tt := range goldenMessages { - want := tt.m - got := proto.Clone(tt.m) - got.Reset() - if err := proto.UnmarshalText(tt.t, got); err != nil { - t.Errorf("failed to unmarshal\n%s\nerror: %v", tt.t, err) - } - if !anyEqual(got, want) { - t.Errorf("message:\n%s\ngot:\n%s\nwant:\n%s", tt.t, got, want) - } - got.Reset() - if err := proto.UnmarshalText(tt.c, got); err != nil { - t.Errorf("failed to unmarshal\n%s\nerror: %v", tt.c, err) - } - if !anyEqual(got, want) { - t.Errorf("message:\n%s\ngot:\n%s\nwant:\n%s", tt.c, got, want) - } - } -} - -func TestMarshalUnknownAny(t *testing.T) { - m := &pb.Message{ - Anything: &anypb.Any{ - TypeUrl: "foo", - Value: []byte("bar"), - }, - } - want := `anything: < - type_url: "foo" - value: "bar" -> -` - got := expandedMarshaler.Text(m) - if got != want { - t.Errorf("got\n`%s`\nwant\n`%s`", got, want) - } -} - -func TestAmbiguousAny(t *testing.T) { - pb := &anypb.Any{} - err := proto.UnmarshalText(` - type_url: "ttt/proto3_proto.Nested" - value: "\n\x05Monty" - `, pb) - t.Logf("result: %v (error: %v)", expandedMarshaler.Text(pb), err) - if err != nil { - t.Errorf("failed to parse ambiguous Any message: %v", err) - } -} - -func TestUnmarshalOverwriteAny(t *testing.T) { - pb := &anypb.Any{} - err := proto.UnmarshalText(` - [type.googleapis.com/a/path/proto3_proto.Nested]: < - bunny: "Monty" - > - [type.googleapis.com/a/path/proto3_proto.Nested]: < - bunny: "Rabbit of Caerbannog" - > - `, pb) - want := `line 7: Any message unpacked multiple times, or "type_url" already set` - if err.Error() != want { - t.Errorf("incorrect error.\nHave: %v\nWant: %v", err.Error(), want) - } -} - -func TestUnmarshalAnyMixAndMatch(t *testing.T) { - pb := &anypb.Any{} - err := proto.UnmarshalText(` - value: "\n\x05Monty" - [type.googleapis.com/a/path/proto3_proto.Nested]: < - bunny: "Rabbit of Caerbannog" - > - `, pb) - want := `line 5: Any message unpacked multiple times, or "value" already set` - if err.Error() != want { - t.Errorf("incorrect error.\nHave: %v\nWant: %v", err.Error(), want) - } -} diff --git a/vendor/github.com/golang/protobuf/proto/clone_test.go b/vendor/github.com/golang/protobuf/proto/clone_test.go deleted file mode 100644 index f607ff4..0000000 --- a/vendor/github.com/golang/protobuf/proto/clone_test.go +++ /dev/null @@ -1,300 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "testing" - - "github.com/golang/protobuf/proto" - - proto3pb "github.com/golang/protobuf/proto/proto3_proto" - pb "github.com/golang/protobuf/proto/testdata" -) - -var cloneTestMessage = &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &pb.InnerMessage{ - Host: proto.String("niles"), - Port: proto.Int32(9099), - Connected: proto.Bool(true), - }, - Others: []*pb.OtherMessage{ - { - Value: []byte("some bytes"), - }, - }, - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, -} - -func init() { - ext := &pb.Ext{ - Data: proto.String("extension"), - } - if err := proto.SetExtension(cloneTestMessage, pb.E_Ext_More, ext); err != nil { - panic("SetExtension: " + err.Error()) - } -} - -func TestClone(t *testing.T) { - m := proto.Clone(cloneTestMessage).(*pb.MyMessage) - if !proto.Equal(m, cloneTestMessage) { - t.Errorf("Clone(%v) = %v", cloneTestMessage, m) - } - - // Verify it was a deep copy. - *m.Inner.Port++ - if proto.Equal(m, cloneTestMessage) { - t.Error("Mutating clone changed the original") - } - // Byte fields and repeated fields should be copied. - if &m.Pet[0] == &cloneTestMessage.Pet[0] { - t.Error("Pet: repeated field not copied") - } - if &m.Others[0] == &cloneTestMessage.Others[0] { - t.Error("Others: repeated field not copied") - } - if &m.Others[0].Value[0] == &cloneTestMessage.Others[0].Value[0] { - t.Error("Others[0].Value: bytes field not copied") - } - if &m.RepBytes[0] == &cloneTestMessage.RepBytes[0] { - t.Error("RepBytes: repeated field not copied") - } - if &m.RepBytes[0][0] == &cloneTestMessage.RepBytes[0][0] { - t.Error("RepBytes[0]: bytes field not copied") - } -} - -func TestCloneNil(t *testing.T) { - var m *pb.MyMessage - if c := proto.Clone(m); !proto.Equal(m, c) { - t.Errorf("Clone(%v) = %v", m, c) - } -} - -var mergeTests = []struct { - src, dst, want proto.Message -}{ - { - src: &pb.MyMessage{ - Count: proto.Int32(42), - }, - dst: &pb.MyMessage{ - Name: proto.String("Dave"), - }, - want: &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - }, - }, - { - src: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("hey"), - Connected: proto.Bool(true), - }, - Pet: []string{"horsey"}, - Others: []*pb.OtherMessage{ - { - Value: []byte("some bytes"), - }, - }, - }, - dst: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("niles"), - Port: proto.Int32(9099), - }, - Pet: []string{"bunny", "kitty"}, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(31415926535), - }, - { - // Explicitly test a src=nil field - Inner: nil, - }, - }, - }, - want: &pb.MyMessage{ - Inner: &pb.InnerMessage{ - Host: proto.String("hey"), - Connected: proto.Bool(true), - Port: proto.Int32(9099), - }, - Pet: []string{"bunny", "kitty", "horsey"}, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(31415926535), - }, - {}, - { - Value: []byte("some bytes"), - }, - }, - }, - }, - { - src: &pb.MyMessage{ - RepBytes: [][]byte{[]byte("wow")}, - }, - dst: &pb.MyMessage{ - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham")}, - }, - want: &pb.MyMessage{ - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(6), - }, - RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, - }, - }, - // Check that a scalar bytes field replaces rather than appends. - { - src: &pb.OtherMessage{Value: []byte("foo")}, - dst: &pb.OtherMessage{Value: []byte("bar")}, - want: &pb.OtherMessage{Value: []byte("foo")}, - }, - { - src: &pb.MessageWithMap{ - NameMapping: map[int32]string{6: "Nigel"}, - MsgMapping: map[int64]*pb.FloatingPoint{ - 0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, - 0x4002: &pb.FloatingPoint{ - F: proto.Float64(2.0), - }, - }, - ByteMapping: map[bool][]byte{true: []byte("wowsa")}, - }, - dst: &pb.MessageWithMap{ - NameMapping: map[int32]string{ - 6: "Bruce", // should be overwritten - 7: "Andrew", - }, - MsgMapping: map[int64]*pb.FloatingPoint{ - 0x4002: &pb.FloatingPoint{ - F: proto.Float64(3.0), - Exact: proto.Bool(true), - }, // the entire message should be overwritten - }, - }, - want: &pb.MessageWithMap{ - NameMapping: map[int32]string{ - 6: "Nigel", - 7: "Andrew", - }, - MsgMapping: map[int64]*pb.FloatingPoint{ - 0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, - 0x4002: &pb.FloatingPoint{ - F: proto.Float64(2.0), - }, - }, - ByteMapping: map[bool][]byte{true: []byte("wowsa")}, - }, - }, - // proto3 shouldn't merge zero values, - // in the same way that proto2 shouldn't merge nils. - { - src: &proto3pb.Message{ - Name: "Aaron", - Data: []byte(""), // zero value, but not nil - }, - dst: &proto3pb.Message{ - HeightInCm: 176, - Data: []byte("texas!"), - }, - want: &proto3pb.Message{ - Name: "Aaron", - HeightInCm: 176, - Data: []byte("texas!"), - }, - }, - // Oneof fields should merge by assignment. - { - src: &pb.Communique{ - Union: &pb.Communique_Number{41}, - }, - dst: &pb.Communique{ - Union: &pb.Communique_Name{"Bobby Tables"}, - }, - want: &pb.Communique{ - Union: &pb.Communique_Number{41}, - }, - }, - // Oneof nil is the same as not set. - { - src: &pb.Communique{}, - dst: &pb.Communique{ - Union: &pb.Communique_Name{"Bobby Tables"}, - }, - want: &pb.Communique{ - Union: &pb.Communique_Name{"Bobby Tables"}, - }, - }, - { - src: &proto3pb.Message{ - Terrain: map[string]*proto3pb.Nested{ - "kay_a": &proto3pb.Nested{Cute: true}, // replace - "kay_b": &proto3pb.Nested{Bunny: "rabbit"}, // insert - }, - }, - dst: &proto3pb.Message{ - Terrain: map[string]*proto3pb.Nested{ - "kay_a": &proto3pb.Nested{Bunny: "lost"}, // replaced - "kay_c": &proto3pb.Nested{Bunny: "bunny"}, // keep - }, - }, - want: &proto3pb.Message{ - Terrain: map[string]*proto3pb.Nested{ - "kay_a": &proto3pb.Nested{Cute: true}, - "kay_b": &proto3pb.Nested{Bunny: "rabbit"}, - "kay_c": &proto3pb.Nested{Bunny: "bunny"}, - }, - }, - }, -} - -func TestMerge(t *testing.T) { - for _, m := range mergeTests { - got := proto.Clone(m.dst) - proto.Merge(got, m.src) - if !proto.Equal(got, m.want) { - t.Errorf("Merge(%v, %v)\n got %v\nwant %v\n", m.dst, m.src, got, m.want) - } - } -} diff --git a/vendor/github.com/golang/protobuf/proto/decode_test.go b/vendor/github.com/golang/protobuf/proto/decode_test.go deleted file mode 100644 index 2c4c31d..0000000 --- a/vendor/github.com/golang/protobuf/proto/decode_test.go +++ /dev/null @@ -1,258 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build go1.7 - -package proto_test - -import ( - "fmt" - "testing" - - "github.com/golang/protobuf/proto" - tpb "github.com/golang/protobuf/proto/proto3_proto" -) - -var ( - bytesBlackhole []byte - msgBlackhole = new(tpb.Message) -) - -// BenchmarkVarint32ArraySmall shows the performance on an array of small int32 fields (1 and -// 2 bytes long). -func BenchmarkVarint32ArraySmall(b *testing.B) { - for i := uint(1); i <= 10; i++ { - dist := genInt32Dist([7]int{0, 3, 1}, 1<unmarshal. -} - -func TestMarshalUnmarshalRepeatedExtension(t *testing.T) { - // Add a repeated extension to the result. - tests := []struct { - name string - ext []*pb.ComplexExtension - }{ - { - "two fields", - []*pb.ComplexExtension{ - {First: proto.Int32(7)}, - {Second: proto.Int32(11)}, - }, - }, - { - "repeated field", - []*pb.ComplexExtension{ - {Third: []int32{1000}}, - {Third: []int32{2000}}, - }, - }, - { - "two fields and repeated field", - []*pb.ComplexExtension{ - {Third: []int32{1000}}, - {First: proto.Int32(9)}, - {Second: proto.Int32(21)}, - {Third: []int32{2000}}, - }, - }, - } - for _, test := range tests { - // Marshal message with a repeated extension. - msg1 := new(pb.OtherMessage) - err := proto.SetExtension(msg1, pb.E_RComplex, test.ext) - if err != nil { - t.Fatalf("[%s] Error setting extension: %v", test.name, err) - } - b, err := proto.Marshal(msg1) - if err != nil { - t.Fatalf("[%s] Error marshaling message: %v", test.name, err) - } - - // Unmarshal and read the merged proto. - msg2 := new(pb.OtherMessage) - err = proto.Unmarshal(b, msg2) - if err != nil { - t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) - } - e, err := proto.GetExtension(msg2, pb.E_RComplex) - if err != nil { - t.Fatalf("[%s] Error getting extension: %v", test.name, err) - } - ext := e.([]*pb.ComplexExtension) - if ext == nil { - t.Fatalf("[%s] Invalid extension", test.name) - } - if !reflect.DeepEqual(ext, test.ext) { - t.Errorf("[%s] Wrong value for ComplexExtension: got: %v want: %v\n", test.name, ext, test.ext) - } - } -} - -func TestUnmarshalRepeatingNonRepeatedExtension(t *testing.T) { - // We may see multiple instances of the same extension in the wire - // format. For example, the proto compiler may encode custom options in - // this way. Here, we verify that we merge the extensions together. - tests := []struct { - name string - ext []*pb.ComplexExtension - }{ - { - "two fields", - []*pb.ComplexExtension{ - {First: proto.Int32(7)}, - {Second: proto.Int32(11)}, - }, - }, - { - "repeated field", - []*pb.ComplexExtension{ - {Third: []int32{1000}}, - {Third: []int32{2000}}, - }, - }, - { - "two fields and repeated field", - []*pb.ComplexExtension{ - {Third: []int32{1000}}, - {First: proto.Int32(9)}, - {Second: proto.Int32(21)}, - {Third: []int32{2000}}, - }, - }, - } - for _, test := range tests { - var buf bytes.Buffer - var want pb.ComplexExtension - - // Generate a serialized representation of a repeated extension - // by catenating bytes together. - for i, e := range test.ext { - // Merge to create the wanted proto. - proto.Merge(&want, e) - - // serialize the message - msg := new(pb.OtherMessage) - err := proto.SetExtension(msg, pb.E_Complex, e) - if err != nil { - t.Fatalf("[%s] Error setting extension %d: %v", test.name, i, err) - } - b, err := proto.Marshal(msg) - if err != nil { - t.Fatalf("[%s] Error marshaling message %d: %v", test.name, i, err) - } - buf.Write(b) - } - - // Unmarshal and read the merged proto. - msg2 := new(pb.OtherMessage) - err := proto.Unmarshal(buf.Bytes(), msg2) - if err != nil { - t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) - } - e, err := proto.GetExtension(msg2, pb.E_Complex) - if err != nil { - t.Fatalf("[%s] Error getting extension: %v", test.name, err) - } - ext := e.(*pb.ComplexExtension) - if ext == nil { - t.Fatalf("[%s] Invalid extension", test.name) - } - if !reflect.DeepEqual(*ext, want) { - t.Errorf("[%s] Wrong value for ComplexExtension: got: %s want: %s\n", test.name, ext, want) - } - } -} - -func TestClearAllExtensions(t *testing.T) { - // unregistered extension - desc := &proto.ExtensionDesc{ - ExtendedType: (*pb.MyMessage)(nil), - ExtensionType: (*bool)(nil), - Field: 101010100, - Name: "emptyextension", - Tag: "varint,0,opt", - } - m := &pb.MyMessage{} - if proto.HasExtension(m, desc) { - t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) - } - if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil { - t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err) - } - if !proto.HasExtension(m, desc) { - t.Errorf("proto.HasExtension(%s): got false, want true", proto.MarshalTextString(m)) - } - proto.ClearAllExtensions(m) - if proto.HasExtension(m, desc) { - t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) - } -} - -func TestMarshalRace(t *testing.T) { - // unregistered extension - desc := &proto.ExtensionDesc{ - ExtendedType: (*pb.MyMessage)(nil), - ExtensionType: (*bool)(nil), - Field: 101010100, - Name: "emptyextension", - Tag: "varint,0,opt", - } - - m := &pb.MyMessage{Count: proto.Int32(4)} - if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil { - t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err) - } - - var g errgroup.Group - for n := 3; n > 0; n-- { - g.Go(func() error { - _, err := proto.Marshal(m) - return err - }) - } - if err := g.Wait(); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/golang/protobuf/proto/map_test.go b/vendor/github.com/golang/protobuf/proto/map_test.go deleted file mode 100644 index 313e879..0000000 --- a/vendor/github.com/golang/protobuf/proto/map_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package proto_test - -import ( - "fmt" - "testing" - - "github.com/golang/protobuf/proto" - ppb "github.com/golang/protobuf/proto/proto3_proto" -) - -func marshalled() []byte { - m := &ppb.IntMaps{} - for i := 0; i < 1000; i++ { - m.Maps = append(m.Maps, &ppb.IntMap{ - Rtt: map[int32]int32{1: 2}, - }) - } - b, err := proto.Marshal(m) - if err != nil { - panic(fmt.Sprintf("Can't marshal %+v: %v", m, err)) - } - return b -} - -func BenchmarkConcurrentMapUnmarshal(b *testing.B) { - in := marshalled() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - var out ppb.IntMaps - if err := proto.Unmarshal(in, &out); err != nil { - b.Errorf("Can't unmarshal ppb.IntMaps: %v", err) - } - } - }) -} - -func BenchmarkSequentialMapUnmarshal(b *testing.B) { - in := marshalled() - b.ResetTimer() - for i := 0; i < b.N; i++ { - var out ppb.IntMaps - if err := proto.Unmarshal(in, &out); err != nil { - b.Errorf("Can't unmarshal ppb.IntMaps: %v", err) - } - } -} diff --git a/vendor/github.com/golang/protobuf/proto/message_set_test.go b/vendor/github.com/golang/protobuf/proto/message_set_test.go deleted file mode 100644 index 353a3ea..0000000 --- a/vendor/github.com/golang/protobuf/proto/message_set_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "bytes" - "testing" -) - -func TestUnmarshalMessageSetWithDuplicate(t *testing.T) { - // Check that a repeated message set entry will be concatenated. - in := &messageSet{ - Item: []*_MessageSet_Item{ - {TypeId: Int32(12345), Message: []byte("hoo")}, - {TypeId: Int32(12345), Message: []byte("hah")}, - }, - } - b, err := Marshal(in) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - t.Logf("Marshaled bytes: %q", b) - - var extensions XXX_InternalExtensions - if err := UnmarshalMessageSet(b, &extensions); err != nil { - t.Fatalf("UnmarshalMessageSet: %v", err) - } - ext, ok := extensions.p.extensionMap[12345] - if !ok { - t.Fatalf("Didn't retrieve extension 12345; map is %v", extensions.p.extensionMap) - } - // Skip wire type/field number and length varints. - got := skipVarint(skipVarint(ext.enc)) - if want := []byte("hoohah"); !bytes.Equal(got, want) { - t.Errorf("Combined extension is %q, want %q", got, want) - } -} diff --git a/vendor/github.com/golang/protobuf/proto/proto3_test.go b/vendor/github.com/golang/protobuf/proto/proto3_test.go deleted file mode 100644 index 735837f..0000000 --- a/vendor/github.com/golang/protobuf/proto/proto3_test.go +++ /dev/null @@ -1,135 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2014 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "testing" - - "github.com/golang/protobuf/proto" - pb "github.com/golang/protobuf/proto/proto3_proto" - tpb "github.com/golang/protobuf/proto/testdata" -) - -func TestProto3ZeroValues(t *testing.T) { - tests := []struct { - desc string - m proto.Message - }{ - {"zero message", &pb.Message{}}, - {"empty bytes field", &pb.Message{Data: []byte{}}}, - } - for _, test := range tests { - b, err := proto.Marshal(test.m) - if err != nil { - t.Errorf("%s: proto.Marshal: %v", test.desc, err) - continue - } - if len(b) > 0 { - t.Errorf("%s: Encoding is non-empty: %q", test.desc, b) - } - } -} - -func TestRoundTripProto3(t *testing.T) { - m := &pb.Message{ - Name: "David", // (2 | 1<<3): 0x0a 0x05 "David" - Hilarity: pb.Message_PUNS, // (0 | 2<<3): 0x10 0x01 - HeightInCm: 178, // (0 | 3<<3): 0x18 0xb2 0x01 - Data: []byte("roboto"), // (2 | 4<<3): 0x20 0x06 "roboto" - ResultCount: 47, // (0 | 7<<3): 0x38 0x2f - TrueScotsman: true, // (0 | 8<<3): 0x40 0x01 - Score: 8.1, // (5 | 9<<3): 0x4d <8.1> - - Key: []uint64{1, 0xdeadbeef}, - Nested: &pb.Nested{ - Bunny: "Monty", - }, - } - t.Logf(" m: %v", m) - - b, err := proto.Marshal(m) - if err != nil { - t.Fatalf("proto.Marshal: %v", err) - } - t.Logf(" b: %q", b) - - m2 := new(pb.Message) - if err := proto.Unmarshal(b, m2); err != nil { - t.Fatalf("proto.Unmarshal: %v", err) - } - t.Logf("m2: %v", m2) - - if !proto.Equal(m, m2) { - t.Errorf("proto.Equal returned false:\n m: %v\nm2: %v", m, m2) - } -} - -func TestGettersForBasicTypesExist(t *testing.T) { - var m pb.Message - if got := m.GetNested().GetBunny(); got != "" { - t.Errorf("m.GetNested().GetBunny() = %q, want empty string", got) - } - if got := m.GetNested().GetCute(); got { - t.Errorf("m.GetNested().GetCute() = %t, want false", got) - } -} - -func TestProto3SetDefaults(t *testing.T) { - in := &pb.Message{ - Terrain: map[string]*pb.Nested{ - "meadow": new(pb.Nested), - }, - Proto2Field: new(tpb.SubDefaults), - Proto2Value: map[string]*tpb.SubDefaults{ - "badlands": new(tpb.SubDefaults), - }, - } - - got := proto.Clone(in).(*pb.Message) - proto.SetDefaults(got) - - // There are no defaults in proto3. Everything should be the zero value, but - // we need to remember to set defaults for nested proto2 messages. - want := &pb.Message{ - Terrain: map[string]*pb.Nested{ - "meadow": new(pb.Nested), - }, - Proto2Field: &tpb.SubDefaults{N: proto.Int64(7)}, - Proto2Value: map[string]*tpb.SubDefaults{ - "badlands": &tpb.SubDefaults{N: proto.Int64(7)}, - }, - } - - if !proto.Equal(got, want) { - t.Errorf("with in = %v\nproto.SetDefaults(in) =>\ngot %v\nwant %v", in, got, want) - } -} diff --git a/vendor/github.com/golang/protobuf/proto/size2_test.go b/vendor/github.com/golang/protobuf/proto/size2_test.go deleted file mode 100644 index a2729c3..0000000 --- a/vendor/github.com/golang/protobuf/proto/size2_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "testing" -) - -// This is a separate file and package from size_test.go because that one uses -// generated messages and thus may not be in package proto without having a circular -// dependency, whereas this file tests unexported details of size.go. - -func TestVarintSize(t *testing.T) { - // Check the edge cases carefully. - testCases := []struct { - n uint64 - size int - }{ - {0, 1}, - {1, 1}, - {127, 1}, - {128, 2}, - {16383, 2}, - {16384, 3}, - {1<<63 - 1, 9}, - {1 << 63, 10}, - } - for _, tc := range testCases { - size := sizeVarint(tc.n) - if size != tc.size { - t.Errorf("sizeVarint(%d) = %d, want %d", tc.n, size, tc.size) - } - } -} diff --git a/vendor/github.com/golang/protobuf/proto/size_test.go b/vendor/github.com/golang/protobuf/proto/size_test.go deleted file mode 100644 index af1034d..0000000 --- a/vendor/github.com/golang/protobuf/proto/size_test.go +++ /dev/null @@ -1,164 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "log" - "strings" - "testing" - - . "github.com/golang/protobuf/proto" - proto3pb "github.com/golang/protobuf/proto/proto3_proto" - pb "github.com/golang/protobuf/proto/testdata" -) - -var messageWithExtension1 = &pb.MyMessage{Count: Int32(7)} - -// messageWithExtension2 is in equal_test.go. -var messageWithExtension3 = &pb.MyMessage{Count: Int32(8)} - -func init() { - if err := SetExtension(messageWithExtension1, pb.E_Ext_More, &pb.Ext{Data: String("Abbott")}); err != nil { - log.Panicf("SetExtension: %v", err) - } - if err := SetExtension(messageWithExtension3, pb.E_Ext_More, &pb.Ext{Data: String("Costello")}); err != nil { - log.Panicf("SetExtension: %v", err) - } - - // Force messageWithExtension3 to have the extension encoded. - Marshal(messageWithExtension3) - -} - -var SizeTests = []struct { - desc string - pb Message -}{ - {"empty", &pb.OtherMessage{}}, - // Basic types. - {"bool", &pb.Defaults{F_Bool: Bool(true)}}, - {"int32", &pb.Defaults{F_Int32: Int32(12)}}, - {"negative int32", &pb.Defaults{F_Int32: Int32(-1)}}, - {"small int64", &pb.Defaults{F_Int64: Int64(1)}}, - {"big int64", &pb.Defaults{F_Int64: Int64(1 << 20)}}, - {"negative int64", &pb.Defaults{F_Int64: Int64(-1)}}, - {"fixed32", &pb.Defaults{F_Fixed32: Uint32(71)}}, - {"fixed64", &pb.Defaults{F_Fixed64: Uint64(72)}}, - {"uint32", &pb.Defaults{F_Uint32: Uint32(123)}}, - {"uint64", &pb.Defaults{F_Uint64: Uint64(124)}}, - {"float", &pb.Defaults{F_Float: Float32(12.6)}}, - {"double", &pb.Defaults{F_Double: Float64(13.9)}}, - {"string", &pb.Defaults{F_String: String("niles")}}, - {"bytes", &pb.Defaults{F_Bytes: []byte("wowsa")}}, - {"bytes, empty", &pb.Defaults{F_Bytes: []byte{}}}, - {"sint32", &pb.Defaults{F_Sint32: Int32(65)}}, - {"sint64", &pb.Defaults{F_Sint64: Int64(67)}}, - {"enum", &pb.Defaults{F_Enum: pb.Defaults_BLUE.Enum()}}, - // Repeated. - {"empty repeated bool", &pb.MoreRepeated{Bools: []bool{}}}, - {"repeated bool", &pb.MoreRepeated{Bools: []bool{false, true, true, false}}}, - {"packed repeated bool", &pb.MoreRepeated{BoolsPacked: []bool{false, true, true, false, true, true, true}}}, - {"repeated int32", &pb.MoreRepeated{Ints: []int32{1, 12203, 1729, -1}}}, - {"repeated int32 packed", &pb.MoreRepeated{IntsPacked: []int32{1, 12203, 1729}}}, - {"repeated int64 packed", &pb.MoreRepeated{Int64SPacked: []int64{ - // Need enough large numbers to verify that the header is counting the number of bytes - // for the field, not the number of elements. - 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, - 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, - }}}, - {"repeated string", &pb.MoreRepeated{Strings: []string{"r", "ken", "gri"}}}, - {"repeated fixed", &pb.MoreRepeated{Fixeds: []uint32{1, 2, 3, 4}}}, - // Nested. - {"nested", &pb.OldMessage{Nested: &pb.OldMessage_Nested{Name: String("whatever")}}}, - {"group", &pb.GroupOld{G: &pb.GroupOld_G{X: Int32(12345)}}}, - // Other things. - {"unrecognized", &pb.MoreRepeated{XXX_unrecognized: []byte{13<<3 | 0, 4}}}, - {"extension (unencoded)", messageWithExtension1}, - {"extension (encoded)", messageWithExtension3}, - // proto3 message - {"proto3 empty", &proto3pb.Message{}}, - {"proto3 bool", &proto3pb.Message{TrueScotsman: true}}, - {"proto3 int64", &proto3pb.Message{ResultCount: 1}}, - {"proto3 uint32", &proto3pb.Message{HeightInCm: 123}}, - {"proto3 float", &proto3pb.Message{Score: 12.6}}, - {"proto3 string", &proto3pb.Message{Name: "Snezana"}}, - {"proto3 bytes", &proto3pb.Message{Data: []byte("wowsa")}}, - {"proto3 bytes, empty", &proto3pb.Message{Data: []byte{}}}, - {"proto3 enum", &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, - {"proto3 map field with empty bytes", &proto3pb.MessageWithMap{ByteMapping: map[bool][]byte{false: []byte{}}}}, - - {"map field", &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob", 7: "Andrew"}}}, - {"map field with message", &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{0x7001: &pb.FloatingPoint{F: Float64(2.0)}}}}, - {"map field with bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte("this time for sure")}}}, - {"map field with empty bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte{}}}}, - - {"map field with big entry", &pb.MessageWithMap{NameMapping: map[int32]string{8: strings.Repeat("x", 125)}}}, - {"map field with big key and val", &pb.MessageWithMap{StrToStr: map[string]string{strings.Repeat("x", 70): strings.Repeat("y", 70)}}}, - {"map field with big numeric key", &pb.MessageWithMap{NameMapping: map[int32]string{0xf00d: "om nom nom"}}}, - - {"oneof not set", &pb.Oneof{}}, - {"oneof bool", &pb.Oneof{Union: &pb.Oneof_F_Bool{true}}}, - {"oneof zero int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{0}}}, - {"oneof big int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{1 << 20}}}, - {"oneof int64", &pb.Oneof{Union: &pb.Oneof_F_Int64{42}}}, - {"oneof fixed32", &pb.Oneof{Union: &pb.Oneof_F_Fixed32{43}}}, - {"oneof fixed64", &pb.Oneof{Union: &pb.Oneof_F_Fixed64{44}}}, - {"oneof uint32", &pb.Oneof{Union: &pb.Oneof_F_Uint32{45}}}, - {"oneof uint64", &pb.Oneof{Union: &pb.Oneof_F_Uint64{46}}}, - {"oneof float", &pb.Oneof{Union: &pb.Oneof_F_Float{47.1}}}, - {"oneof double", &pb.Oneof{Union: &pb.Oneof_F_Double{48.9}}}, - {"oneof string", &pb.Oneof{Union: &pb.Oneof_F_String{"Rhythmic Fman"}}}, - {"oneof bytes", &pb.Oneof{Union: &pb.Oneof_F_Bytes{[]byte("let go")}}}, - {"oneof sint32", &pb.Oneof{Union: &pb.Oneof_F_Sint32{50}}}, - {"oneof sint64", &pb.Oneof{Union: &pb.Oneof_F_Sint64{51}}}, - {"oneof enum", &pb.Oneof{Union: &pb.Oneof_F_Enum{pb.MyMessage_BLUE}}}, - {"message for oneof", &pb.GoTestField{Label: String("k"), Type: String("v")}}, - {"oneof message", &pb.Oneof{Union: &pb.Oneof_F_Message{&pb.GoTestField{Label: String("k"), Type: String("v")}}}}, - {"oneof group", &pb.Oneof{Union: &pb.Oneof_FGroup{&pb.Oneof_F_Group{X: Int32(52)}}}}, - {"oneof largest tag", &pb.Oneof{Union: &pb.Oneof_F_Largest_Tag{1}}}, - {"multiple oneofs", &pb.Oneof{Union: &pb.Oneof_F_Int32{1}, Tormato: &pb.Oneof_Value{2}}}, -} - -func TestSize(t *testing.T) { - for _, tc := range SizeTests { - size := Size(tc.pb) - b, err := Marshal(tc.pb) - if err != nil { - t.Errorf("%v: Marshal failed: %v", tc.desc, err) - continue - } - if size != len(b) { - t.Errorf("%v: Size(%v) = %d, want %d", tc.desc, tc.pb, size, len(b)) - t.Logf("%v: bytes: %#v", tc.desc, b) - } - } -} diff --git a/vendor/github.com/golang/protobuf/proto/text_parser_test.go b/vendor/github.com/golang/protobuf/proto/text_parser_test.go deleted file mode 100644 index 8f7cb4d..0000000 --- a/vendor/github.com/golang/protobuf/proto/text_parser_test.go +++ /dev/null @@ -1,673 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "math" - "reflect" - "testing" - - . "github.com/golang/protobuf/proto" - proto3pb "github.com/golang/protobuf/proto/proto3_proto" - . "github.com/golang/protobuf/proto/testdata" -) - -type UnmarshalTextTest struct { - in string - err string // if "", no error expected - out *MyMessage -} - -func buildExtStructTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - SetExtension(msg, E_Ext_More, &Ext{ - Data: String("Hello, world!"), - }) - return UnmarshalTextTest{in: text, out: msg} -} - -func buildExtDataTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - SetExtension(msg, E_Ext_Text, String("Hello, world!")) - SetExtension(msg, E_Ext_Number, Int32(1729)) - return UnmarshalTextTest{in: text, out: msg} -} - -func buildExtRepStringTest(text string) UnmarshalTextTest { - msg := &MyMessage{ - Count: Int32(42), - } - if err := SetExtension(msg, E_Greeting, []string{"bula", "hola"}); err != nil { - panic(err) - } - return UnmarshalTextTest{in: text, out: msg} -} - -var unMarshalTextTests = []UnmarshalTextTest{ - // Basic - { - in: " count:42\n name:\"Dave\" ", - out: &MyMessage{ - Count: Int32(42), - Name: String("Dave"), - }, - }, - - // Empty quoted string - { - in: `count:42 name:""`, - out: &MyMessage{ - Count: Int32(42), - Name: String(""), - }, - }, - - // Quoted string concatenation with double quotes - { - in: `count:42 name: "My name is "` + "\n" + `"elsewhere"`, - out: &MyMessage{ - Count: Int32(42), - Name: String("My name is elsewhere"), - }, - }, - - // Quoted string concatenation with single quotes - { - in: "count:42 name: 'My name is '\n'elsewhere'", - out: &MyMessage{ - Count: Int32(42), - Name: String("My name is elsewhere"), - }, - }, - - // Quoted string concatenations with mixed quotes - { - in: "count:42 name: 'My name is '\n\"elsewhere\"", - out: &MyMessage{ - Count: Int32(42), - Name: String("My name is elsewhere"), - }, - }, - { - in: "count:42 name: \"My name is \"\n'elsewhere'", - out: &MyMessage{ - Count: Int32(42), - Name: String("My name is elsewhere"), - }, - }, - - // Quoted string with escaped apostrophe - { - in: `count:42 name: "HOLIDAY - New Year\'s Day"`, - out: &MyMessage{ - Count: Int32(42), - Name: String("HOLIDAY - New Year's Day"), - }, - }, - - // Quoted string with single quote - { - in: `count:42 name: 'Roger "The Ramster" Ramjet'`, - out: &MyMessage{ - Count: Int32(42), - Name: String(`Roger "The Ramster" Ramjet`), - }, - }, - - // Quoted string with all the accepted special characters from the C++ test - { - in: `count:42 name: ` + "\"\\\"A string with \\' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"", - out: &MyMessage{ - Count: Int32(42), - Name: String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces"), - }, - }, - - // Quoted string with quoted backslash - { - in: `count:42 name: "\\'xyz"`, - out: &MyMessage{ - Count: Int32(42), - Name: String(`\'xyz`), - }, - }, - - // Quoted string with UTF-8 bytes. - { - in: "count:42 name: '\303\277\302\201\xAB'", - out: &MyMessage{ - Count: Int32(42), - Name: String("\303\277\302\201\xAB"), - }, - }, - - // Bad quoted string - { - in: `inner: < host: "\0" >` + "\n", - err: `line 1.15: invalid quoted string "\0": \0 requires 2 following digits`, - }, - - // Number too large for int64 - { - in: "count: 1 others { key: 123456789012345678901 }", - err: "line 1.23: invalid int64: 123456789012345678901", - }, - - // Number too large for int32 - { - in: "count: 1234567890123", - err: "line 1.7: invalid int32: 1234567890123", - }, - - // Number in hexadecimal - { - in: "count: 0x2beef", - out: &MyMessage{ - Count: Int32(0x2beef), - }, - }, - - // Number in octal - { - in: "count: 024601", - out: &MyMessage{ - Count: Int32(024601), - }, - }, - - // Floating point number with "f" suffix - { - in: "count: 4 others:< weight: 17.0f >", - out: &MyMessage{ - Count: Int32(4), - Others: []*OtherMessage{ - { - Weight: Float32(17), - }, - }, - }, - }, - - // Floating point positive infinity - { - in: "count: 4 bigfloat: inf", - out: &MyMessage{ - Count: Int32(4), - Bigfloat: Float64(math.Inf(1)), - }, - }, - - // Floating point negative infinity - { - in: "count: 4 bigfloat: -inf", - out: &MyMessage{ - Count: Int32(4), - Bigfloat: Float64(math.Inf(-1)), - }, - }, - - // Number too large for float32 - { - in: "others:< weight: 12345678901234567890123456789012345678901234567890 >", - err: "line 1.17: invalid float32: 12345678901234567890123456789012345678901234567890", - }, - - // Number posing as a quoted string - { - in: `inner: < host: 12 >` + "\n", - err: `line 1.15: invalid string: 12`, - }, - - // Quoted string posing as int32 - { - in: `count: "12"`, - err: `line 1.7: invalid int32: "12"`, - }, - - // Quoted string posing a float32 - { - in: `others:< weight: "17.4" >`, - err: `line 1.17: invalid float32: "17.4"`, - }, - - // Enum - { - in: `count:42 bikeshed: BLUE`, - out: &MyMessage{ - Count: Int32(42), - Bikeshed: MyMessage_BLUE.Enum(), - }, - }, - - // Repeated field - { - in: `count:42 pet: "horsey" pet:"bunny"`, - out: &MyMessage{ - Count: Int32(42), - Pet: []string{"horsey", "bunny"}, - }, - }, - - // Repeated field with list notation - { - in: `count:42 pet: ["horsey", "bunny"]`, - out: &MyMessage{ - Count: Int32(42), - Pet: []string{"horsey", "bunny"}, - }, - }, - - // Repeated message with/without colon and <>/{} - { - in: `count:42 others:{} others{} others:<> others:{}`, - out: &MyMessage{ - Count: Int32(42), - Others: []*OtherMessage{ - {}, - {}, - {}, - {}, - }, - }, - }, - - // Missing colon for inner message - { - in: `count:42 inner < host: "cauchy.syd" >`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("cauchy.syd"), - }, - }, - }, - - // Missing colon for string field - { - in: `name "Dave"`, - err: `line 1.5: expected ':', found "\"Dave\""`, - }, - - // Missing colon for int32 field - { - in: `count 42`, - err: `line 1.6: expected ':', found "42"`, - }, - - // Missing required field - { - in: `name: "Pawel"`, - err: `proto: required field "testdata.MyMessage.count" not set`, - out: &MyMessage{ - Name: String("Pawel"), - }, - }, - - // Missing required field in a required submessage - { - in: `count: 42 we_must_go_deeper < leo_finally_won_an_oscar <> >`, - err: `proto: required field "testdata.InnerMessage.host" not set`, - out: &MyMessage{ - Count: Int32(42), - WeMustGoDeeper: &RequiredInnerMessage{LeoFinallyWonAnOscar: &InnerMessage{}}, - }, - }, - - // Repeated non-repeated field - { - in: `name: "Rob" name: "Russ"`, - err: `line 1.12: non-repeated field "name" was repeated`, - }, - - // Group - { - in: `count: 17 SomeGroup { group_field: 12 }`, - out: &MyMessage{ - Count: Int32(17), - Somegroup: &MyMessage_SomeGroup{ - GroupField: Int32(12), - }, - }, - }, - - // Semicolon between fields - { - in: `count:3;name:"Calvin"`, - out: &MyMessage{ - Count: Int32(3), - Name: String("Calvin"), - }, - }, - // Comma between fields - { - in: `count:4,name:"Ezekiel"`, - out: &MyMessage{ - Count: Int32(4), - Name: String("Ezekiel"), - }, - }, - - // Boolean false - { - in: `count:42 inner { host: "example.com" connected: false }`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("example.com"), - Connected: Bool(false), - }, - }, - }, - // Boolean true - { - in: `count:42 inner { host: "example.com" connected: true }`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("example.com"), - Connected: Bool(true), - }, - }, - }, - // Boolean 0 - { - in: `count:42 inner { host: "example.com" connected: 0 }`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("example.com"), - Connected: Bool(false), - }, - }, - }, - // Boolean 1 - { - in: `count:42 inner { host: "example.com" connected: 1 }`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("example.com"), - Connected: Bool(true), - }, - }, - }, - // Boolean f - { - in: `count:42 inner { host: "example.com" connected: f }`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("example.com"), - Connected: Bool(false), - }, - }, - }, - // Boolean t - { - in: `count:42 inner { host: "example.com" connected: t }`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("example.com"), - Connected: Bool(true), - }, - }, - }, - // Boolean False - { - in: `count:42 inner { host: "example.com" connected: False }`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("example.com"), - Connected: Bool(false), - }, - }, - }, - // Boolean True - { - in: `count:42 inner { host: "example.com" connected: True }`, - out: &MyMessage{ - Count: Int32(42), - Inner: &InnerMessage{ - Host: String("example.com"), - Connected: Bool(true), - }, - }, - }, - - // Extension - buildExtStructTest(`count: 42 [testdata.Ext.more]:`), - buildExtStructTest(`count: 42 [testdata.Ext.more] {data:"Hello, world!"}`), - buildExtDataTest(`count: 42 [testdata.Ext.text]:"Hello, world!" [testdata.Ext.number]:1729`), - buildExtRepStringTest(`count: 42 [testdata.greeting]:"bula" [testdata.greeting]:"hola"`), - - // Big all-in-one - { - in: "count:42 # Meaning\n" + - `name:"Dave" ` + - `quote:"\"I didn't want to go.\"" ` + - `pet:"bunny" ` + - `pet:"kitty" ` + - `pet:"horsey" ` + - `inner:<` + - ` host:"footrest.syd" ` + - ` port:7001 ` + - ` connected:true ` + - `> ` + - `others:<` + - ` key:3735928559 ` + - ` value:"\x01A\a\f" ` + - `> ` + - `others:<` + - " weight:58.9 # Atomic weight of Co\n" + - ` inner:<` + - ` host:"lesha.mtv" ` + - ` port:8002 ` + - ` >` + - `>`, - out: &MyMessage{ - Count: Int32(42), - Name: String("Dave"), - Quote: String(`"I didn't want to go."`), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &InnerMessage{ - Host: String("footrest.syd"), - Port: Int32(7001), - Connected: Bool(true), - }, - Others: []*OtherMessage{ - { - Key: Int64(3735928559), - Value: []byte{0x1, 'A', '\a', '\f'}, - }, - { - Weight: Float32(58.9), - Inner: &InnerMessage{ - Host: String("lesha.mtv"), - Port: Int32(8002), - }, - }, - }, - }, - }, -} - -func TestUnmarshalText(t *testing.T) { - for i, test := range unMarshalTextTests { - pb := new(MyMessage) - err := UnmarshalText(test.in, pb) - if test.err == "" { - // We don't expect failure. - if err != nil { - t.Errorf("Test %d: Unexpected error: %v", i, err) - } else if !reflect.DeepEqual(pb, test.out) { - t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", - i, pb, test.out) - } - } else { - // We do expect failure. - if err == nil { - t.Errorf("Test %d: Didn't get expected error: %v", i, test.err) - } else if err.Error() != test.err { - t.Errorf("Test %d: Incorrect error.\nHave: %v\nWant: %v", - i, err.Error(), test.err) - } else if _, ok := err.(*RequiredNotSetError); ok && test.out != nil && !reflect.DeepEqual(pb, test.out) { - t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", - i, pb, test.out) - } - } - } -} - -func TestUnmarshalTextCustomMessage(t *testing.T) { - msg := &textMessage{} - if err := UnmarshalText("custom", msg); err != nil { - t.Errorf("Unexpected error from custom unmarshal: %v", err) - } - if UnmarshalText("not custom", msg) == nil { - t.Errorf("Didn't get expected error from custom unmarshal") - } -} - -// Regression test; this caused a panic. -func TestRepeatedEnum(t *testing.T) { - pb := new(RepeatedEnum) - if err := UnmarshalText("color: RED", pb); err != nil { - t.Fatal(err) - } - exp := &RepeatedEnum{ - Color: []RepeatedEnum_Color{RepeatedEnum_RED}, - } - if !Equal(pb, exp) { - t.Errorf("Incorrect populated \nHave: %v\nWant: %v", pb, exp) - } -} - -func TestProto3TextParsing(t *testing.T) { - m := new(proto3pb.Message) - const in = `name: "Wallace" true_scotsman: true` - want := &proto3pb.Message{ - Name: "Wallace", - TrueScotsman: true, - } - if err := UnmarshalText(in, m); err != nil { - t.Fatal(err) - } - if !Equal(m, want) { - t.Errorf("\n got %v\nwant %v", m, want) - } -} - -func TestMapParsing(t *testing.T) { - m := new(MessageWithMap) - const in = `name_mapping: name_mapping:` + - `msg_mapping:,>` + // separating commas are okay - `msg_mapping>` + // no colon after "value" - `msg_mapping:>` + // omitted key - `msg_mapping:` + // omitted value - `byte_mapping:` + - `byte_mapping:<>` // omitted key and value - want := &MessageWithMap{ - NameMapping: map[int32]string{ - 1: "Beatles", - 1234: "Feist", - }, - MsgMapping: map[int64]*FloatingPoint{ - -4: {F: Float64(2.0)}, - -2: {F: Float64(4.0)}, - 0: {F: Float64(5.0)}, - 1: nil, - }, - ByteMapping: map[bool][]byte{ - false: nil, - true: []byte("so be it"), - }, - } - if err := UnmarshalText(in, m); err != nil { - t.Fatal(err) - } - if !Equal(m, want) { - t.Errorf("\n got %v\nwant %v", m, want) - } -} - -func TestOneofParsing(t *testing.T) { - const in = `name:"Shrek"` - m := new(Communique) - want := &Communique{Union: &Communique_Name{"Shrek"}} - if err := UnmarshalText(in, m); err != nil { - t.Fatal(err) - } - if !Equal(m, want) { - t.Errorf("\n got %v\nwant %v", m, want) - } - - const inOverwrite = `name:"Shrek" number:42` - m = new(Communique) - testErr := "line 1.13: field 'number' would overwrite already parsed oneof 'Union'" - if err := UnmarshalText(inOverwrite, m); err == nil { - t.Errorf("TestOneofParsing: Didn't get expected error: %v", testErr) - } else if err.Error() != testErr { - t.Errorf("TestOneofParsing: Incorrect error.\nHave: %v\nWant: %v", - err.Error(), testErr) - } - -} - -var benchInput string - -func init() { - benchInput = "count: 4\n" - for i := 0; i < 1000; i++ { - benchInput += "pet: \"fido\"\n" - } - - // Check it is valid input. - pb := new(MyMessage) - err := UnmarshalText(benchInput, pb) - if err != nil { - panic("Bad benchmark input: " + err.Error()) - } -} - -func BenchmarkUnmarshalText(b *testing.B) { - pb := new(MyMessage) - for i := 0; i < b.N; i++ { - UnmarshalText(benchInput, pb) - } - b.SetBytes(int64(len(benchInput))) -} diff --git a/vendor/github.com/golang/protobuf/proto/text_test.go b/vendor/github.com/golang/protobuf/proto/text_test.go deleted file mode 100644 index 3eabaca..0000000 --- a/vendor/github.com/golang/protobuf/proto/text_test.go +++ /dev/null @@ -1,474 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto_test - -import ( - "bytes" - "errors" - "io/ioutil" - "math" - "strings" - "testing" - - "github.com/golang/protobuf/proto" - - proto3pb "github.com/golang/protobuf/proto/proto3_proto" - pb "github.com/golang/protobuf/proto/testdata" -) - -// textMessage implements the methods that allow it to marshal and unmarshal -// itself as text. -type textMessage struct { -} - -func (*textMessage) MarshalText() ([]byte, error) { - return []byte("custom"), nil -} - -func (*textMessage) UnmarshalText(bytes []byte) error { - if string(bytes) != "custom" { - return errors.New("expected 'custom'") - } - return nil -} - -func (*textMessage) Reset() {} -func (*textMessage) String() string { return "" } -func (*textMessage) ProtoMessage() {} - -func newTestMessage() *pb.MyMessage { - msg := &pb.MyMessage{ - Count: proto.Int32(42), - Name: proto.String("Dave"), - Quote: proto.String(`"I didn't want to go."`), - Pet: []string{"bunny", "kitty", "horsey"}, - Inner: &pb.InnerMessage{ - Host: proto.String("footrest.syd"), - Port: proto.Int32(7001), - Connected: proto.Bool(true), - }, - Others: []*pb.OtherMessage{ - { - Key: proto.Int64(0xdeadbeef), - Value: []byte{1, 65, 7, 12}, - }, - { - Weight: proto.Float32(6.022), - Inner: &pb.InnerMessage{ - Host: proto.String("lesha.mtv"), - Port: proto.Int32(8002), - }, - }, - }, - Bikeshed: pb.MyMessage_BLUE.Enum(), - Somegroup: &pb.MyMessage_SomeGroup{ - GroupField: proto.Int32(8), - }, - // One normally wouldn't do this. - // This is an undeclared tag 13, as a varint (wire type 0) with value 4. - XXX_unrecognized: []byte{13<<3 | 0, 4}, - } - ext := &pb.Ext{ - Data: proto.String("Big gobs for big rats"), - } - if err := proto.SetExtension(msg, pb.E_Ext_More, ext); err != nil { - panic(err) - } - greetings := []string{"adg", "easy", "cow"} - if err := proto.SetExtension(msg, pb.E_Greeting, greetings); err != nil { - panic(err) - } - - // Add an unknown extension. We marshal a pb.Ext, and fake the ID. - b, err := proto.Marshal(&pb.Ext{Data: proto.String("3G skiing")}) - if err != nil { - panic(err) - } - b = append(proto.EncodeVarint(201<<3|proto.WireBytes), b...) - proto.SetRawExtension(msg, 201, b) - - // Extensions can be plain fields, too, so let's test that. - b = append(proto.EncodeVarint(202<<3|proto.WireVarint), 19) - proto.SetRawExtension(msg, 202, b) - - return msg -} - -const text = `count: 42 -name: "Dave" -quote: "\"I didn't want to go.\"" -pet: "bunny" -pet: "kitty" -pet: "horsey" -inner: < - host: "footrest.syd" - port: 7001 - connected: true -> -others: < - key: 3735928559 - value: "\001A\007\014" -> -others: < - weight: 6.022 - inner: < - host: "lesha.mtv" - port: 8002 - > -> -bikeshed: BLUE -SomeGroup { - group_field: 8 -} -/* 2 unknown bytes */ -13: 4 -[testdata.Ext.more]: < - data: "Big gobs for big rats" -> -[testdata.greeting]: "adg" -[testdata.greeting]: "easy" -[testdata.greeting]: "cow" -/* 13 unknown bytes */ -201: "\t3G skiing" -/* 3 unknown bytes */ -202: 19 -` - -func TestMarshalText(t *testing.T) { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, newTestMessage()); err != nil { - t.Fatalf("proto.MarshalText: %v", err) - } - s := buf.String() - if s != text { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, text) - } -} - -func TestMarshalTextCustomMessage(t *testing.T) { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, &textMessage{}); err != nil { - t.Fatalf("proto.MarshalText: %v", err) - } - s := buf.String() - if s != "custom" { - t.Errorf("Got %q, expected %q", s, "custom") - } -} -func TestMarshalTextNil(t *testing.T) { - want := "" - tests := []proto.Message{nil, (*pb.MyMessage)(nil)} - for i, test := range tests { - buf := new(bytes.Buffer) - if err := proto.MarshalText(buf, test); err != nil { - t.Fatal(err) - } - if got := buf.String(); got != want { - t.Errorf("%d: got %q want %q", i, got, want) - } - } -} - -func TestMarshalTextUnknownEnum(t *testing.T) { - // The Color enum only specifies values 0-2. - m := &pb.MyMessage{Bikeshed: pb.MyMessage_Color(3).Enum()} - got := m.String() - const want = `bikeshed:3 ` - if got != want { - t.Errorf("\n got %q\nwant %q", got, want) - } -} - -func TestTextOneof(t *testing.T) { - tests := []struct { - m proto.Message - want string - }{ - // zero message - {&pb.Communique{}, ``}, - // scalar field - {&pb.Communique{Union: &pb.Communique_Number{4}}, `number:4`}, - // message field - {&pb.Communique{Union: &pb.Communique_Msg{ - &pb.Strings{StringField: proto.String("why hello!")}, - }}, `msg:`}, - // bad oneof (should not panic) - {&pb.Communique{Union: &pb.Communique_Msg{nil}}, `msg:/* nil */`}, - } - for _, test := range tests { - got := strings.TrimSpace(test.m.String()) - if got != test.want { - t.Errorf("\n got %s\nwant %s", got, test.want) - } - } -} - -func BenchmarkMarshalTextBuffered(b *testing.B) { - buf := new(bytes.Buffer) - m := newTestMessage() - for i := 0; i < b.N; i++ { - buf.Reset() - proto.MarshalText(buf, m) - } -} - -func BenchmarkMarshalTextUnbuffered(b *testing.B) { - w := ioutil.Discard - m := newTestMessage() - for i := 0; i < b.N; i++ { - proto.MarshalText(w, m) - } -} - -func compact(src string) string { - // s/[ \n]+/ /g; s/ $//; - dst := make([]byte, len(src)) - space, comment := false, false - j := 0 - for i := 0; i < len(src); i++ { - if strings.HasPrefix(src[i:], "/*") { - comment = true - i++ - continue - } - if comment && strings.HasPrefix(src[i:], "*/") { - comment = false - i++ - continue - } - if comment { - continue - } - c := src[i] - if c == ' ' || c == '\n' { - space = true - continue - } - if j > 0 && (dst[j-1] == ':' || dst[j-1] == '<' || dst[j-1] == '{') { - space = false - } - if c == '{' { - space = false - } - if space { - dst[j] = ' ' - j++ - space = false - } - dst[j] = c - j++ - } - if space { - dst[j] = ' ' - j++ - } - return string(dst[0:j]) -} - -var compactText = compact(text) - -func TestCompactText(t *testing.T) { - s := proto.CompactTextString(newTestMessage()) - if s != compactText { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v\n===\n", s, compactText) - } -} - -func TestStringEscaping(t *testing.T) { - testCases := []struct { - in *pb.Strings - out string - }{ - { - // Test data from C++ test (TextFormatTest.StringEscape). - // Single divergence: we don't escape apostrophes. - &pb.Strings{StringField: proto.String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and multiple spaces")}, - "string_field: \"\\\"A string with ' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and multiple spaces\"\n", - }, - { - // Test data from the same C++ test. - &pb.Strings{StringField: proto.String("\350\260\267\346\255\214")}, - "string_field: \"\\350\\260\\267\\346\\255\\214\"\n", - }, - { - // Some UTF-8. - &pb.Strings{StringField: proto.String("\x00\x01\xff\x81")}, - `string_field: "\000\001\377\201"` + "\n", - }, - } - - for i, tc := range testCases { - var buf bytes.Buffer - if err := proto.MarshalText(&buf, tc.in); err != nil { - t.Errorf("proto.MarsalText: %v", err) - continue - } - s := buf.String() - if s != tc.out { - t.Errorf("#%d: Got:\n%s\nExpected:\n%s\n", i, s, tc.out) - continue - } - - // Check round-trip. - pb := new(pb.Strings) - if err := proto.UnmarshalText(s, pb); err != nil { - t.Errorf("#%d: UnmarshalText: %v", i, err) - continue - } - if !proto.Equal(pb, tc.in) { - t.Errorf("#%d: Round-trip failed:\nstart: %v\n end: %v", i, tc.in, pb) - } - } -} - -// A limitedWriter accepts some output before it fails. -// This is a proxy for something like a nearly-full or imminently-failing disk, -// or a network connection that is about to die. -type limitedWriter struct { - b bytes.Buffer - limit int -} - -var outOfSpace = errors.New("proto: insufficient space") - -func (w *limitedWriter) Write(p []byte) (n int, err error) { - var avail = w.limit - w.b.Len() - if avail <= 0 { - return 0, outOfSpace - } - if len(p) <= avail { - return w.b.Write(p) - } - n, _ = w.b.Write(p[:avail]) - return n, outOfSpace -} - -func TestMarshalTextFailing(t *testing.T) { - // Try lots of different sizes to exercise more error code-paths. - for lim := 0; lim < len(text); lim++ { - buf := new(limitedWriter) - buf.limit = lim - err := proto.MarshalText(buf, newTestMessage()) - // We expect a certain error, but also some partial results in the buffer. - if err != outOfSpace { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", err, outOfSpace) - } - s := buf.b.String() - x := text[:buf.limit] - if s != x { - t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, x) - } - } -} - -func TestFloats(t *testing.T) { - tests := []struct { - f float64 - want string - }{ - {0, "0"}, - {4.7, "4.7"}, - {math.Inf(1), "inf"}, - {math.Inf(-1), "-inf"}, - {math.NaN(), "nan"}, - } - for _, test := range tests { - msg := &pb.FloatingPoint{F: &test.f} - got := strings.TrimSpace(msg.String()) - want := `f:` + test.want - if got != want { - t.Errorf("f=%f: got %q, want %q", test.f, got, want) - } - } -} - -func TestRepeatedNilText(t *testing.T) { - m := &pb.MessageList{ - Message: []*pb.MessageList_Message{ - nil, - &pb.MessageList_Message{ - Name: proto.String("Horse"), - }, - nil, - }, - } - want := `Message -Message { - name: "Horse" -} -Message -` - if s := proto.MarshalTextString(m); s != want { - t.Errorf(" got: %s\nwant: %s", s, want) - } -} - -func TestProto3Text(t *testing.T) { - tests := []struct { - m proto.Message - want string - }{ - // zero message - {&proto3pb.Message{}, ``}, - // zero message except for an empty byte slice - {&proto3pb.Message{Data: []byte{}}, ``}, - // trivial case - {&proto3pb.Message{Name: "Rob", HeightInCm: 175}, `name:"Rob" height_in_cm:175`}, - // empty map - {&pb.MessageWithMap{}, ``}, - // non-empty map; map format is the same as a repeated struct, - // and they are sorted by key (numerically for numeric keys). - { - &pb.MessageWithMap{NameMapping: map[int32]string{ - -1: "Negatory", - 7: "Lucky", - 1234: "Feist", - 6345789: "Otis", - }}, - `name_mapping: ` + - `name_mapping: ` + - `name_mapping: ` + - `name_mapping:`, - }, - // map with nil value; not well-defined, but we shouldn't crash - { - &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{7: nil}}, - `msg_mapping:`, - }, - } - for _, test := range tests { - got := strings.TrimSpace(test.m.String()) - if got != test.want { - t.Errorf("\n got %s\nwant %s", got, test.want) - } - } -} diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml b/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml deleted file mode 100644 index f1309c9..0000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/.travis.yml +++ /dev/null @@ -1,2 +0,0 @@ -language: go - diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/README.md b/vendor/github.com/matttproud/golang_protobuf_extensions/README.md deleted file mode 100644 index 751ee69..0000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Overview -This repository provides various Protocol Buffer extensions for the Go -language (golang), namely support for record length-delimited message -streaming. - -| Java | Go | -| ------------------------------ | --------------------- | -| MessageLite#parseDelimitedFrom | pbutil.ReadDelimited | -| MessageLite#writeDelimitedTo | pbutil.WriteDelimited | - -Because [Code Review 9102043](https://codereview.appspot.com/9102043/) is -destined to never be merged into mainline (i.e., never be promoted to formal -[goprotobuf features](https://github.com/golang/protobuf)), this repository -will live here in the wild. - -# Documentation -We have [generated Go Doc documentation](http://godoc.org/github.com/matttproud/golang_protobuf_extensions/pbutil) here. - -# Testing -[![Build Status](https://travis-ci.org/matttproud/golang_protobuf_extensions.png?branch=master)](https://travis-ci.org/matttproud/golang_protobuf_extensions) diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go deleted file mode 100644 index 5c46372..0000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/all_test.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2013 Matt T. Proud -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package pbutil - -import ( - "bytes" - "testing" - - . "github.com/golang/protobuf/proto" - . "github.com/golang/protobuf/proto/testdata" -) - -func TestWriteDelimited(t *testing.T) { - t.Parallel() - for _, test := range []struct { - msg Message - buf []byte - n int - err error - }{ - { - msg: &Empty{}, - n: 1, - buf: []byte{0}, - }, - { - msg: &GoEnum{Foo: FOO_FOO1.Enum()}, - n: 3, - buf: []byte{2, 8, 1}, - }, - { - msg: &Strings{ - StringField: String(`This is my gigantic, unhappy string. It exceeds -the encoding size of a single byte varint. We are using it to fuzz test the -correctness of the header decoding mechanisms, which may prove problematic. -I expect it may. Let's hope you enjoy testing as much as we do.`), - }, - n: 271, - buf: []byte{141, 2, 10, 138, 2, 84, 104, 105, 115, 32, 105, 115, 32, 109, - 121, 32, 103, 105, 103, 97, 110, 116, 105, 99, 44, 32, 117, 110, 104, - 97, 112, 112, 121, 32, 115, 116, 114, 105, 110, 103, 46, 32, 32, 73, - 116, 32, 101, 120, 99, 101, 101, 100, 115, 10, 116, 104, 101, 32, 101, - 110, 99, 111, 100, 105, 110, 103, 32, 115, 105, 122, 101, 32, 111, 102, - 32, 97, 32, 115, 105, 110, 103, 108, 101, 32, 98, 121, 116, 101, 32, - 118, 97, 114, 105, 110, 116, 46, 32, 32, 87, 101, 32, 97, 114, 101, 32, - 117, 115, 105, 110, 103, 32, 105, 116, 32, 116, 111, 32, 102, 117, 122, - 122, 32, 116, 101, 115, 116, 32, 116, 104, 101, 10, 99, 111, 114, 114, - 101, 99, 116, 110, 101, 115, 115, 32, 111, 102, 32, 116, 104, 101, 32, - 104, 101, 97, 100, 101, 114, 32, 100, 101, 99, 111, 100, 105, 110, 103, - 32, 109, 101, 99, 104, 97, 110, 105, 115, 109, 115, 44, 32, 119, 104, - 105, 99, 104, 32, 109, 97, 121, 32, 112, 114, 111, 118, 101, 32, 112, - 114, 111, 98, 108, 101, 109, 97, 116, 105, 99, 46, 10, 73, 32, 101, 120, - 112, 101, 99, 116, 32, 105, 116, 32, 109, 97, 121, 46, 32, 32, 76, 101, - 116, 39, 115, 32, 104, 111, 112, 101, 32, 121, 111, 117, 32, 101, 110, - 106, 111, 121, 32, 116, 101, 115, 116, 105, 110, 103, 32, 97, 115, 32, - 109, 117, 99, 104, 32, 97, 115, 32, 119, 101, 32, 100, 111, 46}, - }, - } { - var buf bytes.Buffer - if n, err := WriteDelimited(&buf, test.msg); n != test.n || err != test.err { - t.Fatalf("WriteDelimited(buf, %#v) = %v, %v; want %v, %v", test.msg, n, err, test.n, test.err) - } - if out := buf.Bytes(); !bytes.Equal(out, test.buf) { - t.Fatalf("WriteDelimited(buf, %#v); buf = %v; want %v", test.msg, out, test.buf) - } - } -} - -func TestReadDelimited(t *testing.T) { - t.Parallel() - for _, test := range []struct { - buf []byte - msg Message - n int - err error - }{ - { - buf: []byte{0}, - msg: &Empty{}, - n: 1, - }, - { - n: 3, - buf: []byte{2, 8, 1}, - msg: &GoEnum{Foo: FOO_FOO1.Enum()}, - }, - { - buf: []byte{141, 2, 10, 138, 2, 84, 104, 105, 115, 32, 105, 115, 32, 109, - 121, 32, 103, 105, 103, 97, 110, 116, 105, 99, 44, 32, 117, 110, 104, - 97, 112, 112, 121, 32, 115, 116, 114, 105, 110, 103, 46, 32, 32, 73, - 116, 32, 101, 120, 99, 101, 101, 100, 115, 10, 116, 104, 101, 32, 101, - 110, 99, 111, 100, 105, 110, 103, 32, 115, 105, 122, 101, 32, 111, 102, - 32, 97, 32, 115, 105, 110, 103, 108, 101, 32, 98, 121, 116, 101, 32, - 118, 97, 114, 105, 110, 116, 46, 32, 32, 87, 101, 32, 97, 114, 101, 32, - 117, 115, 105, 110, 103, 32, 105, 116, 32, 116, 111, 32, 102, 117, 122, - 122, 32, 116, 101, 115, 116, 32, 116, 104, 101, 10, 99, 111, 114, 114, - 101, 99, 116, 110, 101, 115, 115, 32, 111, 102, 32, 116, 104, 101, 32, - 104, 101, 97, 100, 101, 114, 32, 100, 101, 99, 111, 100, 105, 110, 103, - 32, 109, 101, 99, 104, 97, 110, 105, 115, 109, 115, 44, 32, 119, 104, - 105, 99, 104, 32, 109, 97, 121, 32, 112, 114, 111, 118, 101, 32, 112, - 114, 111, 98, 108, 101, 109, 97, 116, 105, 99, 46, 10, 73, 32, 101, 120, - 112, 101, 99, 116, 32, 105, 116, 32, 109, 97, 121, 46, 32, 32, 76, 101, - 116, 39, 115, 32, 104, 111, 112, 101, 32, 121, 111, 117, 32, 101, 110, - 106, 111, 121, 32, 116, 101, 115, 116, 105, 110, 103, 32, 97, 115, 32, - 109, 117, 99, 104, 32, 97, 115, 32, 119, 101, 32, 100, 111, 46}, - msg: &Strings{ - StringField: String(`This is my gigantic, unhappy string. It exceeds -the encoding size of a single byte varint. We are using it to fuzz test the -correctness of the header decoding mechanisms, which may prove problematic. -I expect it may. Let's hope you enjoy testing as much as we do.`), - }, - n: 271, - }, - } { - msg := Clone(test.msg) - msg.Reset() - if n, err := ReadDelimited(bytes.NewBuffer(test.buf), msg); n != test.n || err != test.err { - t.Fatalf("ReadDelimited(%v, msg) = %v, %v; want %v, %v", test.buf, n, err, test.n, test.err) - } - if !Equal(msg, test.msg) { - t.Fatalf("ReadDelimited(%v, msg); msg = %v; want %v", test.buf, msg, test.msg) - } - } -} - -func TestEndToEndValid(t *testing.T) { - t.Parallel() - for _, test := range [][]Message{ - {&Empty{}}, - {&GoEnum{Foo: FOO_FOO1.Enum()}, &Empty{}, &GoEnum{Foo: FOO_FOO1.Enum()}}, - {&GoEnum{Foo: FOO_FOO1.Enum()}}, - {&Strings{ - StringField: String(`This is my gigantic, unhappy string. It exceeds -the encoding size of a single byte varint. We are using it to fuzz test the -correctness of the header decoding mechanisms, which may prove problematic. -I expect it may. Let's hope you enjoy testing as much as we do.`), - }}, - } { - var buf bytes.Buffer - var written int - for i, msg := range test { - n, err := WriteDelimited(&buf, msg) - if err != nil { - // Assumption: TestReadDelimited and TestWriteDelimited are sufficient - // and inputs for this test are explicitly exercised there. - t.Fatalf("WriteDelimited(buf, %v[%d]) = ?, %v; wanted ?, nil", test, i, err) - } - written += n - } - var read int - for i, msg := range test { - out := Clone(msg) - out.Reset() - n, _ := ReadDelimited(&buf, out) - // Decide to do EOF checking? - read += n - if !Equal(out, msg) { - t.Fatalf("out = %v; want %v[%d] = %#v", out, test, i, msg) - } - } - if read != written { - t.Fatalf("%v read = %d; want %d", test, read, written) - } - } -} diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go deleted file mode 100644 index 364a7b7..0000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode_test.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2016 Matt T. Proud -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package pbutil - -import ( - "bytes" - "io" - "testing" - "testing/iotest" -) - -func TestReadDelimitedIllegalVarint(t *testing.T) { - t.Parallel() - var tests = []struct { - in []byte - n int - err error - }{ - { - in: []byte{255, 255, 255, 255, 255}, - n: 5, - err: errInvalidVarint, - }, - { - in: []byte{255, 255, 255, 255, 255, 255}, - n: 5, - err: errInvalidVarint, - }, - } - for _, test := range tests { - n, err := ReadDelimited(bytes.NewReader(test.in), nil) - if got, want := n, test.n; got != want { - t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", test.in, got, want) - } - if got, want := err, test.err; got != want { - t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", test.in, got, want) - } - } -} - -func TestReadDelimitedPrematureHeader(t *testing.T) { - t.Parallel() - var data = []byte{128, 5} // 256 + 256 + 128 - n, err := ReadDelimited(bytes.NewReader(data[0:1]), nil) - if got, want := n, 1; got != want { - t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data[0:1], got, want) - } - if got, want := err, io.EOF; got != want { - t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data[0:1], got, want) - } -} - -func TestReadDelimitedPrematureBody(t *testing.T) { - t.Parallel() - var data = []byte{128, 5, 0, 0, 0} // 256 + 256 + 128 - n, err := ReadDelimited(bytes.NewReader(data[:]), nil) - if got, want := n, 5; got != want { - t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data, got, want) - } - if got, want := err, io.ErrUnexpectedEOF; got != want { - t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data, got, want) - } -} - -func TestReadDelimitedPrematureHeaderIncremental(t *testing.T) { - t.Parallel() - var data = []byte{128, 5} // 256 + 256 + 128 - n, err := ReadDelimited(iotest.OneByteReader(bytes.NewReader(data[0:1])), nil) - if got, want := n, 1; got != want { - t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data[0:1], got, want) - } - if got, want := err, io.EOF; got != want { - t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data[0:1], got, want) - } -} - -func TestReadDelimitedPrematureBodyIncremental(t *testing.T) { - t.Parallel() - var data = []byte{128, 5, 0, 0, 0} // 256 + 256 + 128 - n, err := ReadDelimited(iotest.OneByteReader(bytes.NewReader(data[:])), nil) - if got, want := n, 5; got != want { - t.Errorf("ReadDelimited(%#v, nil) = %#v, ?; want = %v#, ?", data, got, want) - } - if got, want := err, io.ErrUnexpectedEOF; got != want { - t.Errorf("ReadDelimited(%#v, nil) = ?, %#v; want = ?, %#v", data, got, want) - } -} diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go deleted file mode 100644 index f92632b..0000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2016 Matt T. Proud -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package pbutil - -import ( - "bytes" - "errors" - "testing" - - "github.com/golang/protobuf/proto" -) - -var errMarshal = errors.New("pbutil: can't marshal") - -type cantMarshal struct{ proto.Message } - -func (cantMarshal) Marshal() ([]byte, error) { return nil, errMarshal } - -var _ proto.Message = cantMarshal{} - -func TestWriteDelimitedMarshalErr(t *testing.T) { - t.Parallel() - var data cantMarshal - var buf bytes.Buffer - n, err := WriteDelimited(&buf, data) - if got, want := n, 0; got != want { - t.Errorf("WriteDelimited(buf, %#v) = %#v, ?; want = %v#, ?", data, got, want) - } - if got, want := err, errMarshal; got != want { - t.Errorf("WriteDelimited(buf, %#v) = ?, %#v; want = ?, %#v", data, got, want) - } -} - -type canMarshal struct{ proto.Message } - -func (canMarshal) Marshal() ([]byte, error) { return []byte{0, 1, 2, 3, 4, 5}, nil } - -var errWrite = errors.New("pbutil: can't write") - -type cantWrite struct{} - -func (cantWrite) Write([]byte) (int, error) { return 0, errWrite } - -func TestWriteDelimitedWriteErr(t *testing.T) { - t.Parallel() - var data canMarshal - var buf cantWrite - n, err := WriteDelimited(buf, data) - if got, want := n, 0; got != want { - t.Errorf("WriteDelimited(buf, %#v) = %#v, ?; want = %v#, ?", data, got, want) - } - if got, want := err, errWrite; got != want { - t.Errorf("WriteDelimited(buf, %#v) = ?, %#v; want = ?, %#v", data, got, want) - } -} diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go deleted file mode 100644 index d6d9b25..0000000 --- a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/fixtures_test.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// http://github.com/golang/protobuf/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package pbutil - -import ( - . "github.com/golang/protobuf/proto" - . "github.com/golang/protobuf/proto/testdata" -) - -// FROM https://github.com/golang/protobuf/blob/master/proto/all_test.go. - -func initGoTestField() *GoTestField { - f := new(GoTestField) - f.Label = String("label") - f.Type = String("type") - return f -} - -// These are all structurally equivalent but the tag numbers differ. -// (It's remarkable that required, optional, and repeated all have -// 8 letters.) -func initGoTest_RequiredGroup() *GoTest_RequiredGroup { - return &GoTest_RequiredGroup{ - RequiredField: String("required"), - } -} - -func initGoTest_OptionalGroup() *GoTest_OptionalGroup { - return &GoTest_OptionalGroup{ - RequiredField: String("optional"), - } -} - -func initGoTest_RepeatedGroup() *GoTest_RepeatedGroup { - return &GoTest_RepeatedGroup{ - RequiredField: String("repeated"), - } -} - -func initGoTest(setdefaults bool) *GoTest { - pb := new(GoTest) - if setdefaults { - pb.F_BoolDefaulted = Bool(Default_GoTest_F_BoolDefaulted) - pb.F_Int32Defaulted = Int32(Default_GoTest_F_Int32Defaulted) - pb.F_Int64Defaulted = Int64(Default_GoTest_F_Int64Defaulted) - pb.F_Fixed32Defaulted = Uint32(Default_GoTest_F_Fixed32Defaulted) - pb.F_Fixed64Defaulted = Uint64(Default_GoTest_F_Fixed64Defaulted) - pb.F_Uint32Defaulted = Uint32(Default_GoTest_F_Uint32Defaulted) - pb.F_Uint64Defaulted = Uint64(Default_GoTest_F_Uint64Defaulted) - pb.F_FloatDefaulted = Float32(Default_GoTest_F_FloatDefaulted) - pb.F_DoubleDefaulted = Float64(Default_GoTest_F_DoubleDefaulted) - pb.F_StringDefaulted = String(Default_GoTest_F_StringDefaulted) - pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted - pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted) - pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted) - } - - pb.Kind = GoTest_TIME.Enum() - pb.RequiredField = initGoTestField() - pb.F_BoolRequired = Bool(true) - pb.F_Int32Required = Int32(3) - pb.F_Int64Required = Int64(6) - pb.F_Fixed32Required = Uint32(32) - pb.F_Fixed64Required = Uint64(64) - pb.F_Uint32Required = Uint32(3232) - pb.F_Uint64Required = Uint64(6464) - pb.F_FloatRequired = Float32(3232) - pb.F_DoubleRequired = Float64(6464) - pb.F_StringRequired = String("string") - pb.F_BytesRequired = []byte("bytes") - pb.F_Sint32Required = Int32(-32) - pb.F_Sint64Required = Int64(-64) - pb.Requiredgroup = initGoTest_RequiredGroup() - - return pb -} diff --git a/vendor/github.com/prometheus/client_golang/.gitignore b/vendor/github.com/prometheus/client_golang/.gitignore deleted file mode 100644 index f6fc2e8..0000000 --- a/vendor/github.com/prometheus/client_golang/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe - -*~ -*# -.build diff --git a/vendor/github.com/prometheus/client_golang/.travis.yml b/vendor/github.com/prometheus/client_golang/.travis.yml deleted file mode 100644 index d83f31a..0000000 --- a/vendor/github.com/prometheus/client_golang/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -sudo: false -language: go - -go: - - 1.5.4 - - 1.6.2 - -script: - - go test -short ./... diff --git a/vendor/github.com/prometheus/client_golang/CHANGELOG.md b/vendor/github.com/prometheus/client_golang/CHANGELOG.md deleted file mode 100644 index 330788a..0000000 --- a/vendor/github.com/prometheus/client_golang/CHANGELOG.md +++ /dev/null @@ -1,109 +0,0 @@ -## 0.8.0 / 2016-08-17 -* [CHANGE] Registry is doing more consistency checks. This might break - existing setups that used to export inconsistent metrics. -* [CHANGE] Pushing to Pushgateway moved to package `push` and changed to allow - arbitrary grouping. -* [CHANGE] Removed `SelfCollector`. -* [CHANGE] Removed `PanicOnCollectError` and `EnableCollectChecks` methods. -* [CHANGE] Moved packages to the prometheus/common repo: `text`, `model`, - `extraction`. -* [CHANGE] Deprecated a number of functions. -* [FEATURE] Allow custom registries. Added `Registerer` and `Gatherer` - interfaces. -* [FEATURE] Separated HTTP exposition, allowing custom HTTP handlers (package - `promhttp`) and enabling the creation of other exposition mechanisms. -* [FEATURE] `MustRegister` is variadic now, allowing registration of many - collectors in one call. -* [FEATURE] Added HTTP API v1 package. -* [ENHANCEMENT] Numerous documentation improvements. -* [ENHANCEMENT] Improved metric sorting. -* [ENHANCEMENT] Inlined fnv64a hashing for improved performance. -* [ENHANCEMENT] Several test improvements. -* [BUGFIX] Handle collisions in MetricVec. - -## 0.7.0 / 2015-07-27 -* [CHANGE] Rename ExporterLabelPrefix to ExportedLabelPrefix. -* [BUGFIX] Closed gaps in metric consistency check. -* [BUGFIX] Validate LabelName/LabelSet on JSON unmarshaling. -* [ENHANCEMENT] Document the possibility to create "empty" metrics in - a metric vector. -* [ENHANCEMENT] Fix and clarify various doc comments and the README.md. -* [ENHANCEMENT] (Kind of) solve "The Proxy Problem" of http.InstrumentHandler. -* [ENHANCEMENT] Change responseWriterDelegator.written to int64. - -## 0.6.0 / 2015-06-01 -* [CHANGE] Rename process_goroutines to go_goroutines. -* [ENHANCEMENT] Validate label names during YAML decoding. -* [ENHANCEMENT] Add LabelName regular expression. -* [BUGFIX] Ensure alignment of struct members for 32-bit systems. - -## 0.5.0 / 2015-05-06 -* [BUGFIX] Removed a weakness in the fingerprinting aka signature code. - This makes fingerprinting slower and more allocation-heavy, but the - weakness was too severe to be tolerated. -* [CHANGE] As a result of the above, Metric.Fingerprint is now returning - a different fingerprint. To keep the same fingerprint, the new method - Metric.FastFingerprint was introduced, which will be used by the - Prometheus server for storage purposes (implying that a collision - detection has to be added, too). -* [ENHANCEMENT] The Metric.Equal and Metric.Before do not depend on - fingerprinting anymore, removing the possibility of an undetected - fingerprint collision. -* [FEATURE] The Go collector in the exposition library includes garbage - collection stats. -* [FEATURE] The exposition library allows to create constant "throw-away" - summaries and histograms. -* [CHANGE] A number of new reserved labels and prefixes. - -## 0.4.0 / 2015-04-08 -* [CHANGE] Return NaN when Summaries have no observations yet. -* [BUGFIX] Properly handle Summary decay upon Write(). -* [BUGFIX] Fix the documentation link to the consumption library. -* [FEATURE] Allow the metric family injection hook to merge with existing - metric families. -* [ENHANCEMENT] Removed cgo dependency and conditional compilation of procfs. -* [MAINTENANCE] Adjusted to changes in matttproud/golang_protobuf_extensions. - -## 0.3.2 / 2015-03-11 -* [BUGFIX] Fixed the receiver type of COWMetric.Set(). This method is - only used by the Prometheus server internally. -* [CLEANUP] Added licenses of vendored code left out by godep. - -## 0.3.1 / 2015-03-04 -* [ENHANCEMENT] Switched fingerprinting functions from own free list to - sync.Pool. -* [CHANGE] Makefile uses Go 1.4.2 now (only relevant for examples and tests). - -## 0.3.0 / 2015-03-03 -* [CHANGE] Changed the fingerprinting for metrics. THIS WILL INVALIDATE ALL - PERSISTED FINGERPRINTS. IF YOU COMPILE THE PROMETHEUS SERVER WITH THIS - VERSION, YOU HAVE TO WIPE THE PREVIOUSLY CREATED STORAGE. -* [CHANGE] LabelValuesToSignature removed. (Nobody had used it, and it was - arguably broken.) -* [CHANGE] Vendored dependencies. Those are only used by the Makefile. If - client_golang is used as a library, the vendoring will stay out of your way. -* [BUGFIX] Remove a weakness in the fingerprinting for metrics. (This made - the fingerprinting change above necessary.) -* [FEATURE] Added new fingerprinting functions SignatureForLabels and - SignatureWithoutLabels to be used by the Prometheus server. These functions - require fewer allocations than the ones currently used by the server. - -## 0.2.0 / 2015-02-23 -* [FEATURE] Introduce new Histagram metric type. -* [CHANGE] Ignore process collector errors for now (better error handling - pending). -* [CHANGE] Use clear error interface for process pidFn. -* [BUGFIX] Fix Go download links for several archs and OSes. -* [ENHANCEMENT] Massively improve Gauge and Counter performance. -* [ENHANCEMENT] Catch illegal label names for summaries in histograms. -* [ENHANCEMENT] Reduce allocations during fingerprinting. -* [ENHANCEMENT] Remove cgo dependency. procfs package will only be included if - both cgo is available and the build is for an OS with procfs. -* [CLEANUP] Clean up code style issues. -* [CLEANUP] Mark slow test as such and exclude them from travis. -* [CLEANUP] Update protobuf library package name. -* [CLEANUP] Updated vendoring of beorn7/perks. - -## 0.1.0 / 2015-02-02 -* [CLEANUP] Introduced semantic versioning and changelog. From now on, - changes will be reported in this file. diff --git a/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md b/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md deleted file mode 100644 index 5705f0f..0000000 --- a/vendor/github.com/prometheus/client_golang/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing - -Prometheus uses GitHub to manage reviews of pull requests. - -* If you have a trivial fix or improvement, go ahead and create a pull - request, addressing (with `@...`) one or more of the maintainers - (see [AUTHORS.md](AUTHORS.md)) in the description of the pull request. - -* If you plan to do something more involved, first discuss your ideas - on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). - This will avoid unnecessary work and surely give you and us a good deal - of inspiration. - -* Relevant coding style guidelines are the [Go Code Review - Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) - and the _Formatting and style_ section of Peter Bourgon's [Go: Best - Practices for Production - Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/vendor/github.com/prometheus/client_golang/README.md b/vendor/github.com/prometheus/client_golang/README.md deleted file mode 100644 index 557eacf..0000000 --- a/vendor/github.com/prometheus/client_golang/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# Prometheus Go client library - -[![Build Status](https://travis-ci.org/prometheus/client_golang.svg?branch=master)](https://travis-ci.org/prometheus/client_golang) - -This is the [Go](http://golang.org) client library for -[Prometheus](http://prometheus.io). It has two separate parts, one for -instrumenting application code, and one for creating clients that talk to the -Prometheus HTTP API. - -## Instrumenting applications - -[![code-coverage](http://gocover.io/_badge/github.com/prometheus/client_golang/prometheus)](http://gocover.io/github.com/prometheus/client_golang/prometheus) [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus) - -The -[`prometheus` directory](https://github.com/prometheus/client_golang/tree/master/prometheus) -contains the instrumentation library. See the -[best practices section](http://prometheus.io/docs/practices/naming/) of the -Prometheus documentation to learn more about instrumenting applications. - -The -[`examples` directory](https://github.com/prometheus/client_golang/tree/master/examples) -contains simple examples of instrumented code. - -## Client for the Prometheus HTTP API - -[![code-coverage](http://gocover.io/_badge/github.com/prometheus/client_golang/api/prometheus)](http://gocover.io/github.com/prometheus/client_golang/api/prometheus) [![go-doc](https://godoc.org/github.com/prometheus/client_golang/api/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/api/prometheus) - -The -[`api/prometheus` directory](https://github.com/prometheus/client_golang/tree/master/api/prometheus) -contains the client for the -[Prometheus HTTP API](http://prometheus.io/docs/querying/api/). It allows you -to write Go applications that query time series data from a Prometheus server. - -## Where is `model`, `extraction`, and `text`? - -The `model` packages has been moved to -[`prometheus/common/model`](https://github.com/prometheus/common/tree/master/model). - -The `extraction` and `text` packages are now contained in -[`prometheus/common/expfmt`](https://github.com/prometheus/common/tree/master/expfmt). - -## Contributing and community - -See the [contributing guidelines](CONTRIBUTING.md) and the -[Community section](http://prometheus.io/community/) of the homepage. diff --git a/vendor/github.com/prometheus/client_golang/VERSION b/vendor/github.com/prometheus/client_golang/VERSION deleted file mode 100644 index a3df0a6..0000000 --- a/vendor/github.com/prometheus/client_golang/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.8.0 diff --git a/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go b/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go deleted file mode 100644 index a3d8669..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/benchmark_test.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "sync" - "testing" -) - -func BenchmarkCounterWithLabelValues(b *testing.B) { - m := NewCounterVec( - CounterOpts{ - Name: "benchmark_counter", - Help: "A counter to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.WithLabelValues("eins", "zwei", "drei").Inc() - } -} - -func BenchmarkCounterWithLabelValuesConcurrent(b *testing.B) { - m := NewCounterVec( - CounterOpts{ - Name: "benchmark_counter", - Help: "A counter to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - wg := sync.WaitGroup{} - for i := 0; i < 10; i++ { - wg.Add(1) - go func() { - for j := 0; j < b.N/10; j++ { - m.WithLabelValues("eins", "zwei", "drei").Inc() - } - wg.Done() - }() - } - wg.Wait() -} - -func BenchmarkCounterWithMappedLabels(b *testing.B) { - m := NewCounterVec( - CounterOpts{ - Name: "benchmark_counter", - Help: "A counter to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.With(Labels{"two": "zwei", "one": "eins", "three": "drei"}).Inc() - } -} - -func BenchmarkCounterWithPreparedMappedLabels(b *testing.B) { - m := NewCounterVec( - CounterOpts{ - Name: "benchmark_counter", - Help: "A counter to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - labels := Labels{"two": "zwei", "one": "eins", "three": "drei"} - for i := 0; i < b.N; i++ { - m.With(labels).Inc() - } -} - -func BenchmarkCounterNoLabels(b *testing.B) { - m := NewCounter(CounterOpts{ - Name: "benchmark_counter", - Help: "A counter to benchmark it.", - }) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.Inc() - } -} - -func BenchmarkGaugeWithLabelValues(b *testing.B) { - m := NewGaugeVec( - GaugeOpts{ - Name: "benchmark_gauge", - Help: "A gauge to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.WithLabelValues("eins", "zwei", "drei").Set(3.1415) - } -} - -func BenchmarkGaugeNoLabels(b *testing.B) { - m := NewGauge(GaugeOpts{ - Name: "benchmark_gauge", - Help: "A gauge to benchmark it.", - }) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.Set(3.1415) - } -} - -func BenchmarkSummaryWithLabelValues(b *testing.B) { - m := NewSummaryVec( - SummaryOpts{ - Name: "benchmark_summary", - Help: "A summary to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.WithLabelValues("eins", "zwei", "drei").Observe(3.1415) - } -} - -func BenchmarkSummaryNoLabels(b *testing.B) { - m := NewSummary(SummaryOpts{ - Name: "benchmark_summary", - Help: "A summary to benchmark it.", - }, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.Observe(3.1415) - } -} - -func BenchmarkHistogramWithLabelValues(b *testing.B) { - m := NewHistogramVec( - HistogramOpts{ - Name: "benchmark_histogram", - Help: "A histogram to benchmark it.", - }, - []string{"one", "two", "three"}, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.WithLabelValues("eins", "zwei", "drei").Observe(3.1415) - } -} - -func BenchmarkHistogramNoLabels(b *testing.B) { - m := NewHistogram(HistogramOpts{ - Name: "benchmark_histogram", - Help: "A histogram to benchmark it.", - }, - ) - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.Observe(3.1415) - } -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go b/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go deleted file mode 100644 index 67391a2..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/counter_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "math" - "testing" - - dto "github.com/prometheus/client_model/go" -) - -func TestCounterAdd(t *testing.T) { - counter := NewCounter(CounterOpts{ - Name: "test", - Help: "test help", - ConstLabels: Labels{"a": "1", "b": "2"}, - }).(*counter) - counter.Inc() - if expected, got := 1., math.Float64frombits(counter.valBits); expected != got { - t.Errorf("Expected %f, got %f.", expected, got) - } - counter.Add(42) - if expected, got := 43., math.Float64frombits(counter.valBits); expected != got { - t.Errorf("Expected %f, got %f.", expected, got) - } - - if expected, got := "counter cannot decrease in value", decreaseCounter(counter).Error(); expected != got { - t.Errorf("Expected error %q, got %q.", expected, got) - } - - m := &dto.Metric{} - counter.Write(m) - - if expected, got := `label: label: counter: `, m.String(); expected != got { - t.Errorf("expected %q, got %q", expected, got) - } -} - -func decreaseCounter(c *counter) (err error) { - defer func() { - if e := recover(); e != nil { - err = e.(error) - } - }() - c.Add(-1) - return nil -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go b/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go deleted file mode 100644 index 260c1b5..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/example_clustermanager_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus_test - -import "github.com/prometheus/client_golang/prometheus" - -// ClusterManager is an example for a system that might have been built without -// Prometheus in mind. It models a central manager of jobs running in a -// cluster. To turn it into something that collects Prometheus metrics, we -// simply add the two methods required for the Collector interface. -// -// An additional challenge is that multiple instances of the ClusterManager are -// run within the same binary, each in charge of a different zone. We need to -// make use of ConstLabels to be able to register each ClusterManager instance -// with Prometheus. -type ClusterManager struct { - Zone string - OOMCountDesc *prometheus.Desc - RAMUsageDesc *prometheus.Desc - // ... many more fields -} - -// ReallyExpensiveAssessmentOfTheSystemState is a mock for the data gathering a -// real cluster manager would have to do. Since it may actually be really -// expensive, it must only be called once per collection. This implementation, -// obviously, only returns some made-up data. -func (c *ClusterManager) ReallyExpensiveAssessmentOfTheSystemState() ( - oomCountByHost map[string]int, ramUsageByHost map[string]float64, -) { - // Just example fake data. - oomCountByHost = map[string]int{ - "foo.example.org": 42, - "bar.example.org": 2001, - } - ramUsageByHost = map[string]float64{ - "foo.example.org": 6.023e23, - "bar.example.org": 3.14, - } - return -} - -// Describe simply sends the two Descs in the struct to the channel. -func (c *ClusterManager) Describe(ch chan<- *prometheus.Desc) { - ch <- c.OOMCountDesc - ch <- c.RAMUsageDesc -} - -// Collect first triggers the ReallyExpensiveAssessmentOfTheSystemState. Then it -// creates constant metrics for each host on the fly based on the returned data. -// -// Note that Collect could be called concurrently, so we depend on -// ReallyExpensiveAssessmentOfTheSystemState to be concurrency-safe. -func (c *ClusterManager) Collect(ch chan<- prometheus.Metric) { - oomCountByHost, ramUsageByHost := c.ReallyExpensiveAssessmentOfTheSystemState() - for host, oomCount := range oomCountByHost { - ch <- prometheus.MustNewConstMetric( - c.OOMCountDesc, - prometheus.CounterValue, - float64(oomCount), - host, - ) - } - for host, ramUsage := range ramUsageByHost { - ch <- prometheus.MustNewConstMetric( - c.RAMUsageDesc, - prometheus.GaugeValue, - ramUsage, - host, - ) - } -} - -// NewClusterManager creates the two Descs OOMCountDesc and RAMUsageDesc. Note -// that the zone is set as a ConstLabel. (It's different in each instance of the -// ClusterManager, but constant over the lifetime of an instance.) Then there is -// a variable label "host", since we want to partition the collected metrics by -// host. Since all Descs created in this way are consistent across instances, -// with a guaranteed distinction by the "zone" label, we can register different -// ClusterManager instances with the same registry. -func NewClusterManager(zone string) *ClusterManager { - return &ClusterManager{ - Zone: zone, - OOMCountDesc: prometheus.NewDesc( - "clustermanager_oom_crashes_total", - "Number of OOM crashes.", - []string{"host"}, - prometheus.Labels{"zone": zone}, - ), - RAMUsageDesc: prometheus.NewDesc( - "clustermanager_ram_usage_bytes", - "RAM usage as reported to the cluster manager.", - []string{"host"}, - prometheus.Labels{"zone": zone}, - ), - } -} - -func ExampleCollector() { - workerDB := NewClusterManager("db") - workerCA := NewClusterManager("ca") - - // Since we are dealing with custom Collector implementations, it might - // be a good idea to try it out with a pedantic registry. - reg := prometheus.NewPedanticRegistry() - reg.MustRegister(workerDB) - reg.MustRegister(workerCA) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go b/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go deleted file mode 100644 index f87f21a..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/examples_test.go +++ /dev/null @@ -1,751 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus_test - -import ( - "bytes" - "fmt" - "math" - "net/http" - "runtime" - "sort" - "strings" - - dto "github.com/prometheus/client_model/go" - "github.com/prometheus/common/expfmt" - - "github.com/golang/protobuf/proto" - - "github.com/prometheus/client_golang/prometheus" -) - -func ExampleGauge() { - opsQueued := prometheus.NewGauge(prometheus.GaugeOpts{ - Namespace: "our_company", - Subsystem: "blob_storage", - Name: "ops_queued", - Help: "Number of blob storage operations waiting to be processed.", - }) - prometheus.MustRegister(opsQueued) - - // 10 operations queued by the goroutine managing incoming requests. - opsQueued.Add(10) - // A worker goroutine has picked up a waiting operation. - opsQueued.Dec() - // And once more... - opsQueued.Dec() -} - -func ExampleGaugeVec() { - opsQueued := prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Namespace: "our_company", - Subsystem: "blob_storage", - Name: "ops_queued", - Help: "Number of blob storage operations waiting to be processed, partitioned by user and type.", - }, - []string{ - // Which user has requested the operation? - "user", - // Of what type is the operation? - "type", - }, - ) - prometheus.MustRegister(opsQueued) - - // Increase a value using compact (but order-sensitive!) WithLabelValues(). - opsQueued.WithLabelValues("bob", "put").Add(4) - // Increase a value with a map using WithLabels. More verbose, but order - // doesn't matter anymore. - opsQueued.With(prometheus.Labels{"type": "delete", "user": "alice"}).Inc() -} - -func ExampleGaugeFunc() { - if err := prometheus.Register(prometheus.NewGaugeFunc( - prometheus.GaugeOpts{ - Subsystem: "runtime", - Name: "goroutines_count", - Help: "Number of goroutines that currently exist.", - }, - func() float64 { return float64(runtime.NumGoroutine()) }, - )); err == nil { - fmt.Println("GaugeFunc 'goroutines_count' registered.") - } - // Note that the count of goroutines is a gauge (and not a counter) as - // it can go up and down. - - // Output: - // GaugeFunc 'goroutines_count' registered. -} - -func ExampleCounter() { - pushCounter := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "repository_pushes", // Note: No help string... - }) - err := prometheus.Register(pushCounter) // ... so this will return an error. - if err != nil { - fmt.Println("Push counter couldn't be registered, no counting will happen:", err) - return - } - - // Try it once more, this time with a help string. - pushCounter = prometheus.NewCounter(prometheus.CounterOpts{ - Name: "repository_pushes", - Help: "Number of pushes to external repository.", - }) - err = prometheus.Register(pushCounter) - if err != nil { - fmt.Println("Push counter couldn't be registered AGAIN, no counting will happen:", err) - return - } - - pushComplete := make(chan struct{}) - // TODO: Start a goroutine that performs repository pushes and reports - // each completion via the channel. - for _ = range pushComplete { - pushCounter.Inc() - } - // Output: - // Push counter couldn't be registered, no counting will happen: descriptor Desc{fqName: "repository_pushes", help: "", constLabels: {}, variableLabels: []} is invalid: empty help string -} - -func ExampleCounterVec() { - httpReqs := prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "http_requests_total", - Help: "How many HTTP requests processed, partitioned by status code and HTTP method.", - }, - []string{"code", "method"}, - ) - prometheus.MustRegister(httpReqs) - - httpReqs.WithLabelValues("404", "POST").Add(42) - - // If you have to access the same set of labels very frequently, it - // might be good to retrieve the metric only once and keep a handle to - // it. But beware of deletion of that metric, see below! - m := httpReqs.WithLabelValues("200", "GET") - for i := 0; i < 1000000; i++ { - m.Inc() - } - // Delete a metric from the vector. If you have previously kept a handle - // to that metric (as above), future updates via that handle will go - // unseen (even if you re-create a metric with the same label set - // later). - httpReqs.DeleteLabelValues("200", "GET") - // Same thing with the more verbose Labels syntax. - httpReqs.Delete(prometheus.Labels{"method": "GET", "code": "200"}) -} - -func ExampleInstrumentHandler() { - // Handle the "/doc" endpoint with the standard http.FileServer handler. - // By wrapping the handler with InstrumentHandler, request count, - // request and response sizes, and request latency are automatically - // exported to Prometheus, partitioned by HTTP status code and method - // and by the handler name (here "fileserver"). - http.Handle("/doc", prometheus.InstrumentHandler( - "fileserver", http.FileServer(http.Dir("/usr/share/doc")), - )) - // The Prometheus handler still has to be registered to handle the - // "/metrics" endpoint. The handler returned by prometheus.Handler() is - // already instrumented - with "prometheus" as the handler name. In this - // example, we want the handler name to be "metrics", so we instrument - // the uninstrumented Prometheus handler ourselves. - http.Handle("/metrics", prometheus.InstrumentHandler( - "metrics", prometheus.UninstrumentedHandler(), - )) -} - -func ExampleLabelPairSorter() { - labelPairs := []*dto.LabelPair{ - &dto.LabelPair{Name: proto.String("status"), Value: proto.String("404")}, - &dto.LabelPair{Name: proto.String("method"), Value: proto.String("get")}, - } - - sort.Sort(prometheus.LabelPairSorter(labelPairs)) - - fmt.Println(labelPairs) - // Output: - // [name:"method" value:"get" name:"status" value:"404" ] -} - -func ExampleRegister() { - // Imagine you have a worker pool and want to count the tasks completed. - taskCounter := prometheus.NewCounter(prometheus.CounterOpts{ - Subsystem: "worker_pool", - Name: "completed_tasks_total", - Help: "Total number of tasks completed.", - }) - // This will register fine. - if err := prometheus.Register(taskCounter); err != nil { - fmt.Println(err) - } else { - fmt.Println("taskCounter registered.") - } - // Don't forget to tell the HTTP server about the Prometheus handler. - // (In a real program, you still need to start the HTTP server...) - http.Handle("/metrics", prometheus.Handler()) - - // Now you can start workers and give every one of them a pointer to - // taskCounter and let it increment it whenever it completes a task. - taskCounter.Inc() // This has to happen somewhere in the worker code. - - // But wait, you want to see how individual workers perform. So you need - // a vector of counters, with one element for each worker. - taskCounterVec := prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: "worker_pool", - Name: "completed_tasks_total", - Help: "Total number of tasks completed.", - }, - []string{"worker_id"}, - ) - - // Registering will fail because we already have a metric of that name. - if err := prometheus.Register(taskCounterVec); err != nil { - fmt.Println("taskCounterVec not registered:", err) - } else { - fmt.Println("taskCounterVec registered.") - } - - // To fix, first unregister the old taskCounter. - if prometheus.Unregister(taskCounter) { - fmt.Println("taskCounter unregistered.") - } - - // Try registering taskCounterVec again. - if err := prometheus.Register(taskCounterVec); err != nil { - fmt.Println("taskCounterVec not registered:", err) - } else { - fmt.Println("taskCounterVec registered.") - } - // Bummer! Still doesn't work. - - // Prometheus will not allow you to ever export metrics with - // inconsistent help strings or label names. After unregistering, the - // unregistered metrics will cease to show up in the /metrics HTTP - // response, but the registry still remembers that those metrics had - // been exported before. For this example, we will now choose a - // different name. (In a real program, you would obviously not export - // the obsolete metric in the first place.) - taskCounterVec = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: "worker_pool", - Name: "completed_tasks_by_id", - Help: "Total number of tasks completed.", - }, - []string{"worker_id"}, - ) - if err := prometheus.Register(taskCounterVec); err != nil { - fmt.Println("taskCounterVec not registered:", err) - } else { - fmt.Println("taskCounterVec registered.") - } - // Finally it worked! - - // The workers have to tell taskCounterVec their id to increment the - // right element in the metric vector. - taskCounterVec.WithLabelValues("42").Inc() // Code from worker 42. - - // Each worker could also keep a reference to their own counter element - // around. Pick the counter at initialization time of the worker. - myCounter := taskCounterVec.WithLabelValues("42") // From worker 42 initialization code. - myCounter.Inc() // Somewhere in the code of that worker. - - // Note that something like WithLabelValues("42", "spurious arg") would - // panic (because you have provided too many label values). If you want - // to get an error instead, use GetMetricWithLabelValues(...) instead. - notMyCounter, err := taskCounterVec.GetMetricWithLabelValues("42", "spurious arg") - if err != nil { - fmt.Println("Worker initialization failed:", err) - } - if notMyCounter == nil { - fmt.Println("notMyCounter is nil.") - } - - // A different (and somewhat tricky) approach is to use - // ConstLabels. ConstLabels are pairs of label names and label values - // that never change. You might ask what those labels are good for (and - // rightfully so - if they never change, they could as well be part of - // the metric name). There are essentially two use-cases: The first is - // if labels are constant throughout the lifetime of a binary execution, - // but they vary over time or between different instances of a running - // binary. The second is what we have here: Each worker creates and - // registers an own Counter instance where the only difference is in the - // value of the ConstLabels. Those Counters can all be registered - // because the different ConstLabel values guarantee that each worker - // will increment a different Counter metric. - counterOpts := prometheus.CounterOpts{ - Subsystem: "worker_pool", - Name: "completed_tasks", - Help: "Total number of tasks completed.", - ConstLabels: prometheus.Labels{"worker_id": "42"}, - } - taskCounterForWorker42 := prometheus.NewCounter(counterOpts) - if err := prometheus.Register(taskCounterForWorker42); err != nil { - fmt.Println("taskCounterVForWorker42 not registered:", err) - } else { - fmt.Println("taskCounterForWorker42 registered.") - } - // Obviously, in real code, taskCounterForWorker42 would be a member - // variable of a worker struct, and the "42" would be retrieved with a - // GetId() method or something. The Counter would be created and - // registered in the initialization code of the worker. - - // For the creation of the next Counter, we can recycle - // counterOpts. Just change the ConstLabels. - counterOpts.ConstLabels = prometheus.Labels{"worker_id": "2001"} - taskCounterForWorker2001 := prometheus.NewCounter(counterOpts) - if err := prometheus.Register(taskCounterForWorker2001); err != nil { - fmt.Println("taskCounterVForWorker2001 not registered:", err) - } else { - fmt.Println("taskCounterForWorker2001 registered.") - } - - taskCounterForWorker2001.Inc() - taskCounterForWorker42.Inc() - taskCounterForWorker2001.Inc() - - // Yet another approach would be to turn the workers themselves into - // Collectors and register them. See the Collector example for details. - - // Output: - // taskCounter registered. - // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: [worker_id]} has different label names or a different help string - // taskCounter unregistered. - // taskCounterVec not registered: a previously registered descriptor with the same fully-qualified name as Desc{fqName: "worker_pool_completed_tasks_total", help: "Total number of tasks completed.", constLabels: {}, variableLabels: [worker_id]} has different label names or a different help string - // taskCounterVec registered. - // Worker initialization failed: inconsistent label cardinality - // notMyCounter is nil. - // taskCounterForWorker42 registered. - // taskCounterForWorker2001 registered. -} - -func ExampleSummary() { - temps := prometheus.NewSummary(prometheus.SummaryOpts{ - Name: "pond_temperature_celsius", - Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. - }) - - // Simulate some observations. - for i := 0; i < 1000; i++ { - temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) - } - - // Just for demonstration, let's check the state of the summary by - // (ab)using its Write method (which is usually only used by Prometheus - // internally). - metric := &dto.Metric{} - temps.Write(metric) - fmt.Println(proto.MarshalTextString(metric)) - - // Output: - // summary: < - // sample_count: 1000 - // sample_sum: 29969.50000000001 - // quantile: < - // quantile: 0.5 - // value: 31.1 - // > - // quantile: < - // quantile: 0.9 - // value: 41.3 - // > - // quantile: < - // quantile: 0.99 - // value: 41.9 - // > - // > -} - -func ExampleSummaryVec() { - temps := prometheus.NewSummaryVec( - prometheus.SummaryOpts{ - Name: "pond_temperature_celsius", - Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. - }, - []string{"species"}, - ) - - // Simulate some observations. - for i := 0; i < 1000; i++ { - temps.WithLabelValues("litoria-caerulea").Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) - temps.WithLabelValues("lithobates-catesbeianus").Observe(32 + math.Floor(100*math.Cos(float64(i)*0.11))/10) - } - - // Create a Summary without any observations. - temps.WithLabelValues("leiopelma-hochstetteri") - - // Just for demonstration, let's check the state of the summary vector - // by registering it with a custom registry and then let it collect the - // metrics. - reg := prometheus.NewRegistry() - reg.MustRegister(temps) - - metricFamilies, err := reg.Gather() - if err != nil || len(metricFamilies) != 1 { - panic("unexpected behavior of custom test registry") - } - fmt.Println(proto.MarshalTextString(metricFamilies[0])) - - // Output: - // name: "pond_temperature_celsius" - // help: "The temperature of the frog pond." - // type: SUMMARY - // metric: < - // label: < - // name: "species" - // value: "leiopelma-hochstetteri" - // > - // summary: < - // sample_count: 0 - // sample_sum: 0 - // quantile: < - // quantile: 0.5 - // value: nan - // > - // quantile: < - // quantile: 0.9 - // value: nan - // > - // quantile: < - // quantile: 0.99 - // value: nan - // > - // > - // > - // metric: < - // label: < - // name: "species" - // value: "lithobates-catesbeianus" - // > - // summary: < - // sample_count: 1000 - // sample_sum: 31956.100000000017 - // quantile: < - // quantile: 0.5 - // value: 32.4 - // > - // quantile: < - // quantile: 0.9 - // value: 41.4 - // > - // quantile: < - // quantile: 0.99 - // value: 41.9 - // > - // > - // > - // metric: < - // label: < - // name: "species" - // value: "litoria-caerulea" - // > - // summary: < - // sample_count: 1000 - // sample_sum: 29969.50000000001 - // quantile: < - // quantile: 0.5 - // value: 31.1 - // > - // quantile: < - // quantile: 0.9 - // value: 41.3 - // > - // quantile: < - // quantile: 0.99 - // value: 41.9 - // > - // > - // > -} - -func ExampleNewConstSummary() { - desc := prometheus.NewDesc( - "http_request_duration_seconds", - "A summary of the HTTP request durations.", - []string{"code", "method"}, - prometheus.Labels{"owner": "example"}, - ) - - // Create a constant summary from values we got from a 3rd party telemetry system. - s := prometheus.MustNewConstSummary( - desc, - 4711, 403.34, - map[float64]float64{0.5: 42.3, 0.9: 323.3}, - "200", "get", - ) - - // Just for demonstration, let's check the state of the summary by - // (ab)using its Write method (which is usually only used by Prometheus - // internally). - metric := &dto.Metric{} - s.Write(metric) - fmt.Println(proto.MarshalTextString(metric)) - - // Output: - // label: < - // name: "code" - // value: "200" - // > - // label: < - // name: "method" - // value: "get" - // > - // label: < - // name: "owner" - // value: "example" - // > - // summary: < - // sample_count: 4711 - // sample_sum: 403.34 - // quantile: < - // quantile: 0.5 - // value: 42.3 - // > - // quantile: < - // quantile: 0.9 - // value: 323.3 - // > - // > -} - -func ExampleHistogram() { - temps := prometheus.NewHistogram(prometheus.HistogramOpts{ - Name: "pond_temperature_celsius", - Help: "The temperature of the frog pond.", // Sorry, we can't measure how badly it smells. - Buckets: prometheus.LinearBuckets(20, 5, 5), // 5 buckets, each 5 centigrade wide. - }) - - // Simulate some observations. - for i := 0; i < 1000; i++ { - temps.Observe(30 + math.Floor(120*math.Sin(float64(i)*0.1))/10) - } - - // Just for demonstration, let's check the state of the histogram by - // (ab)using its Write method (which is usually only used by Prometheus - // internally). - metric := &dto.Metric{} - temps.Write(metric) - fmt.Println(proto.MarshalTextString(metric)) - - // Output: - // histogram: < - // sample_count: 1000 - // sample_sum: 29969.50000000001 - // bucket: < - // cumulative_count: 192 - // upper_bound: 20 - // > - // bucket: < - // cumulative_count: 366 - // upper_bound: 25 - // > - // bucket: < - // cumulative_count: 501 - // upper_bound: 30 - // > - // bucket: < - // cumulative_count: 638 - // upper_bound: 35 - // > - // bucket: < - // cumulative_count: 816 - // upper_bound: 40 - // > - // > -} - -func ExampleNewConstHistogram() { - desc := prometheus.NewDesc( - "http_request_duration_seconds", - "A histogram of the HTTP request durations.", - []string{"code", "method"}, - prometheus.Labels{"owner": "example"}, - ) - - // Create a constant histogram from values we got from a 3rd party telemetry system. - h := prometheus.MustNewConstHistogram( - desc, - 4711, 403.34, - map[float64]uint64{25: 121, 50: 2403, 100: 3221, 200: 4233}, - "200", "get", - ) - - // Just for demonstration, let's check the state of the histogram by - // (ab)using its Write method (which is usually only used by Prometheus - // internally). - metric := &dto.Metric{} - h.Write(metric) - fmt.Println(proto.MarshalTextString(metric)) - - // Output: - // label: < - // name: "code" - // value: "200" - // > - // label: < - // name: "method" - // value: "get" - // > - // label: < - // name: "owner" - // value: "example" - // > - // histogram: < - // sample_count: 4711 - // sample_sum: 403.34 - // bucket: < - // cumulative_count: 121 - // upper_bound: 25 - // > - // bucket: < - // cumulative_count: 2403 - // upper_bound: 50 - // > - // bucket: < - // cumulative_count: 3221 - // upper_bound: 100 - // > - // bucket: < - // cumulative_count: 4233 - // upper_bound: 200 - // > - // > -} - -func ExampleAlreadyRegisteredError() { - reqCounter := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "requests_total", - Help: "The total number of requests served.", - }) - if err := prometheus.Register(reqCounter); err != nil { - if are, ok := err.(prometheus.AlreadyRegisteredError); ok { - // A counter for that metric has been registered before. - // Use the old counter from now on. - reqCounter = are.ExistingCollector.(prometheus.Counter) - } else { - // Something else went wrong! - panic(err) - } - } -} - -func ExampleGatherers() { - reg := prometheus.NewRegistry() - temp := prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "temperature_kelvin", - Help: "Temperature in Kelvin.", - }, - []string{"location"}, - ) - reg.MustRegister(temp) - temp.WithLabelValues("outside").Set(273.14) - temp.WithLabelValues("inside").Set(298.44) - - var parser expfmt.TextParser - - text := ` -# TYPE humidity_percent gauge -# HELP humidity_percent Humidity in %. -humidity_percent{location="outside"} 45.4 -humidity_percent{location="inside"} 33.2 -# TYPE temperature_kelvin gauge -# HELP temperature_kelvin Temperature in Kelvin. -temperature_kelvin{location="somewhere else"} 4.5 -` - - parseText := func() ([]*dto.MetricFamily, error) { - parsed, err := parser.TextToMetricFamilies(strings.NewReader(text)) - if err != nil { - return nil, err - } - var result []*dto.MetricFamily - for _, mf := range parsed { - result = append(result, mf) - } - return result, nil - } - - gatherers := prometheus.Gatherers{ - reg, - prometheus.GathererFunc(parseText), - } - - gathering, err := gatherers.Gather() - if err != nil { - fmt.Println(err) - } - - out := &bytes.Buffer{} - for _, mf := range gathering { - if _, err := expfmt.MetricFamilyToText(out, mf); err != nil { - panic(err) - } - } - fmt.Print(out.String()) - fmt.Println("----------") - - // Note how the temperature_kelvin metric family has been merged from - // different sources. Now try - text = ` -# TYPE humidity_percent gauge -# HELP humidity_percent Humidity in %. -humidity_percent{location="outside"} 45.4 -humidity_percent{location="inside"} 33.2 -# TYPE temperature_kelvin gauge -# HELP temperature_kelvin Temperature in Kelvin. -# Duplicate metric: -temperature_kelvin{location="outside"} 265.3 - # Wrong labels: -temperature_kelvin 4.5 -` - - gathering, err = gatherers.Gather() - if err != nil { - fmt.Println(err) - } - // Note that still as many metrics as possible are returned: - out.Reset() - for _, mf := range gathering { - if _, err := expfmt.MetricFamilyToText(out, mf); err != nil { - panic(err) - } - } - fmt.Print(out.String()) - - // Output: - // # HELP humidity_percent Humidity in %. - // # TYPE humidity_percent gauge - // humidity_percent{location="inside"} 33.2 - // humidity_percent{location="outside"} 45.4 - // # HELP temperature_kelvin Temperature in Kelvin. - // # TYPE temperature_kelvin gauge - // temperature_kelvin{location="inside"} 298.44 - // temperature_kelvin{location="outside"} 273.14 - // temperature_kelvin{location="somewhere else"} 4.5 - // ---------- - // 2 error(s) occurred: - // * collected metric temperature_kelvin label: gauge: was collected before with the same name and label values - // * collected metric temperature_kelvin gauge: has label dimensions inconsistent with previously collected metrics in the same metric family - // # HELP humidity_percent Humidity in %. - // # TYPE humidity_percent gauge - // humidity_percent{location="inside"} 33.2 - // humidity_percent{location="outside"} 45.4 - // # HELP temperature_kelvin Temperature in Kelvin. - // # TYPE temperature_kelvin gauge - // temperature_kelvin{location="inside"} 298.44 - // temperature_kelvin{location="outside"} 273.14 -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go b/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go deleted file mode 100644 index 5d3128f..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus_test - -import ( - "expvar" - "fmt" - "sort" - "strings" - - dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/client_golang/prometheus" -) - -func ExampleExpvarCollector() { - expvarCollector := prometheus.NewExpvarCollector(map[string]*prometheus.Desc{ - "memstats": prometheus.NewDesc( - "expvar_memstats", - "All numeric memstats as one metric family. Not a good role-model, actually... ;-)", - []string{"type"}, nil, - ), - "lone-int": prometheus.NewDesc( - "expvar_lone_int", - "Just an expvar int as an example.", - nil, nil, - ), - "http-request-map": prometheus.NewDesc( - "expvar_http_request_total", - "How many http requests processed, partitioned by status code and http method.", - []string{"code", "method"}, nil, - ), - }) - prometheus.MustRegister(expvarCollector) - - // The Prometheus part is done here. But to show that this example is - // doing anything, we have to manually export something via expvar. In - // real-life use-cases, some library would already have exported via - // expvar what we want to re-export as Prometheus metrics. - expvar.NewInt("lone-int").Set(42) - expvarMap := expvar.NewMap("http-request-map") - var ( - expvarMap1, expvarMap2 expvar.Map - expvarInt11, expvarInt12, expvarInt21, expvarInt22 expvar.Int - ) - expvarMap1.Init() - expvarMap2.Init() - expvarInt11.Set(3) - expvarInt12.Set(13) - expvarInt21.Set(11) - expvarInt22.Set(212) - expvarMap1.Set("POST", &expvarInt11) - expvarMap1.Set("GET", &expvarInt12) - expvarMap2.Set("POST", &expvarInt21) - expvarMap2.Set("GET", &expvarInt22) - expvarMap.Set("404", &expvarMap1) - expvarMap.Set("200", &expvarMap2) - // Results in the following expvar map: - // "http-request-count": {"200": {"POST": 11, "GET": 212}, "404": {"POST": 3, "GET": 13}} - - // Let's see what the scrape would yield, but exclude the memstats metrics. - metricStrings := []string{} - metric := dto.Metric{} - metricChan := make(chan prometheus.Metric) - go func() { - expvarCollector.Collect(metricChan) - close(metricChan) - }() - for m := range metricChan { - if strings.Index(m.Desc().String(), "expvar_memstats") == -1 { - metric.Reset() - m.Write(&metric) - metricStrings = append(metricStrings, metric.String()) - } - } - sort.Strings(metricStrings) - for _, s := range metricStrings { - fmt.Println(strings.TrimRight(s, " ")) - } - // Output: - // label: label: untyped: - // label: label: untyped: - // label: label: untyped: - // label: label: untyped: - // untyped: -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go b/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go deleted file mode 100644 index 48cab46..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/gauge_test.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "math" - "math/rand" - "sync" - "testing" - "testing/quick" - - dto "github.com/prometheus/client_model/go" -) - -func listenGaugeStream(vals, result chan float64, done chan struct{}) { - var sum float64 -outer: - for { - select { - case <-done: - close(vals) - for v := range vals { - sum += v - } - break outer - case v := <-vals: - sum += v - } - } - result <- sum - close(result) -} - -func TestGaugeConcurrency(t *testing.T) { - it := func(n uint32) bool { - mutations := int(n % 10000) - concLevel := int(n%15 + 1) - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - sStream := make(chan float64, mutations*concLevel) - result := make(chan float64) - done := make(chan struct{}) - - go listenGaugeStream(sStream, result, done) - go func() { - end.Wait() - close(done) - }() - - gge := NewGauge(GaugeOpts{ - Name: "test_gauge", - Help: "no help can be found here", - }) - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - for j := 0; j < mutations; j++ { - vals[j] = rand.Float64() - 0.5 - } - - go func(vals []float64) { - start.Wait() - for _, v := range vals { - sStream <- v - gge.Add(v) - } - end.Done() - }(vals) - } - start.Done() - - if expected, got := <-result, math.Float64frombits(gge.(*value).valBits); math.Abs(expected-got) > 0.000001 { - t.Fatalf("expected approx. %f, got %f", expected, got) - return false - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Fatal(err) - } -} - -func TestGaugeVecConcurrency(t *testing.T) { - it := func(n uint32) bool { - mutations := int(n % 10000) - concLevel := int(n%15 + 1) - vecLength := int(n%5 + 1) - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - sStreams := make([]chan float64, vecLength) - results := make([]chan float64, vecLength) - done := make(chan struct{}) - - for i := 0; i < vecLength; i++ { - sStreams[i] = make(chan float64, mutations*concLevel) - results[i] = make(chan float64) - go listenGaugeStream(sStreams[i], results[i], done) - } - - go func() { - end.Wait() - close(done) - }() - - gge := NewGaugeVec( - GaugeOpts{ - Name: "test_gauge", - Help: "no help can be found here", - }, - []string{"label"}, - ) - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - pick := make([]int, mutations) - for j := 0; j < mutations; j++ { - vals[j] = rand.Float64() - 0.5 - pick[j] = rand.Intn(vecLength) - } - - go func(vals []float64) { - start.Wait() - for i, v := range vals { - sStreams[pick[i]] <- v - gge.WithLabelValues(string('A' + pick[i])).Add(v) - } - end.Done() - }(vals) - } - start.Done() - - for i := range sStreams { - if expected, got := <-results[i], math.Float64frombits(gge.WithLabelValues(string('A'+i)).(*value).valBits); math.Abs(expected-got) > 0.000001 { - t.Fatalf("expected approx. %f, got %f", expected, got) - return false - } - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Fatal(err) - } -} - -func TestGaugeFunc(t *testing.T) { - gf := NewGaugeFunc( - GaugeOpts{ - Name: "test_name", - Help: "test help", - ConstLabels: Labels{"a": "1", "b": "2"}, - }, - func() float64 { return 3.1415 }, - ) - - if expected, got := `Desc{fqName: "test_name", help: "test help", constLabels: {a="1",b="2"}, variableLabels: []}`, gf.Desc().String(); expected != got { - t.Errorf("expected %q, got %q", expected, got) - } - - m := &dto.Metric{} - gf.Write(m) - - if expected, got := `label: label: gauge: `, m.String(); expected != got { - t.Errorf("expected %q, got %q", expected, got) - } -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go b/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go deleted file mode 100644 index 9a8858c..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/go_collector_test.go +++ /dev/null @@ -1,123 +0,0 @@ -package prometheus - -import ( - "runtime" - "testing" - "time" - - dto "github.com/prometheus/client_model/go" -) - -func TestGoCollector(t *testing.T) { - var ( - c = NewGoCollector() - ch = make(chan Metric) - waitc = make(chan struct{}) - closec = make(chan struct{}) - old = -1 - ) - defer close(closec) - - go func() { - c.Collect(ch) - go func(c <-chan struct{}) { - <-c - }(closec) - <-waitc - c.Collect(ch) - }() - - for { - select { - case metric := <-ch: - switch m := metric.(type) { - // Attention, this also catches Counter... - case Gauge: - pb := &dto.Metric{} - m.Write(pb) - if pb.GetGauge() == nil { - continue - } - - if old == -1 { - old = int(pb.GetGauge().GetValue()) - close(waitc) - continue - } - - if diff := int(pb.GetGauge().GetValue()) - old; diff != 1 { - // TODO: This is flaky in highly concurrent situations. - t.Errorf("want 1 new goroutine, got %d", diff) - } - - // GoCollector performs two sends per call. - // On line 27 we need to receive the second send - // to shut down cleanly. - <-ch - return - } - case <-time.After(1 * time.Second): - t.Fatalf("expected collect timed out") - } - } -} - -func TestGCCollector(t *testing.T) { - var ( - c = NewGoCollector() - ch = make(chan Metric) - waitc = make(chan struct{}) - closec = make(chan struct{}) - oldGC uint64 - oldPause float64 - ) - defer close(closec) - - go func() { - c.Collect(ch) - // force GC - runtime.GC() - <-waitc - c.Collect(ch) - }() - - first := true - for { - select { - case metric := <-ch: - switch m := metric.(type) { - case *constSummary, *value: - pb := &dto.Metric{} - m.Write(pb) - if pb.GetSummary() == nil { - continue - } - - if len(pb.GetSummary().Quantile) != 5 { - t.Errorf("expected 4 buckets, got %d", len(pb.GetSummary().Quantile)) - } - for idx, want := range []float64{0.0, 0.25, 0.5, 0.75, 1.0} { - if *pb.GetSummary().Quantile[idx].Quantile != want { - t.Errorf("bucket #%d is off, got %f, want %f", idx, *pb.GetSummary().Quantile[idx].Quantile, want) - } - } - if first { - first = false - oldGC = *pb.GetSummary().SampleCount - oldPause = *pb.GetSummary().SampleSum - close(waitc) - continue - } - if diff := *pb.GetSummary().SampleCount - oldGC; diff != 1 { - t.Errorf("want 1 new garbage collection run, got %d", diff) - } - if diff := *pb.GetSummary().SampleSum - oldPause; diff <= 0 { - t.Errorf("want moar pause, got %f", diff) - } - return - } - case <-time.After(1 * time.Second): - t.Fatalf("expected collect timed out") - } - } -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go b/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go deleted file mode 100644 index d1242e0..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/histogram_test.go +++ /dev/null @@ -1,326 +0,0 @@ -// Copyright 2015 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "math" - "math/rand" - "reflect" - "sort" - "sync" - "testing" - "testing/quick" - - dto "github.com/prometheus/client_model/go" -) - -func benchmarkHistogramObserve(w int, b *testing.B) { - b.StopTimer() - - wg := new(sync.WaitGroup) - wg.Add(w) - - g := new(sync.WaitGroup) - g.Add(1) - - s := NewHistogram(HistogramOpts{}) - - for i := 0; i < w; i++ { - go func() { - g.Wait() - - for i := 0; i < b.N; i++ { - s.Observe(float64(i)) - } - - wg.Done() - }() - } - - b.StartTimer() - g.Done() - wg.Wait() -} - -func BenchmarkHistogramObserve1(b *testing.B) { - benchmarkHistogramObserve(1, b) -} - -func BenchmarkHistogramObserve2(b *testing.B) { - benchmarkHistogramObserve(2, b) -} - -func BenchmarkHistogramObserve4(b *testing.B) { - benchmarkHistogramObserve(4, b) -} - -func BenchmarkHistogramObserve8(b *testing.B) { - benchmarkHistogramObserve(8, b) -} - -func benchmarkHistogramWrite(w int, b *testing.B) { - b.StopTimer() - - wg := new(sync.WaitGroup) - wg.Add(w) - - g := new(sync.WaitGroup) - g.Add(1) - - s := NewHistogram(HistogramOpts{}) - - for i := 0; i < 1000000; i++ { - s.Observe(float64(i)) - } - - for j := 0; j < w; j++ { - outs := make([]dto.Metric, b.N) - - go func(o []dto.Metric) { - g.Wait() - - for i := 0; i < b.N; i++ { - s.Write(&o[i]) - } - - wg.Done() - }(outs) - } - - b.StartTimer() - g.Done() - wg.Wait() -} - -func BenchmarkHistogramWrite1(b *testing.B) { - benchmarkHistogramWrite(1, b) -} - -func BenchmarkHistogramWrite2(b *testing.B) { - benchmarkHistogramWrite(2, b) -} - -func BenchmarkHistogramWrite4(b *testing.B) { - benchmarkHistogramWrite(4, b) -} - -func BenchmarkHistogramWrite8(b *testing.B) { - benchmarkHistogramWrite(8, b) -} - -// Intentionally adding +Inf here to test if that case is handled correctly. -// Also, getCumulativeCounts depends on it. -var testBuckets = []float64{-2, -1, -0.5, 0, 0.5, 1, 2, math.Inf(+1)} - -func TestHistogramConcurrency(t *testing.T) { - if testing.Short() { - t.Skip("Skipping test in short mode.") - } - - rand.Seed(42) - - it := func(n uint32) bool { - mutations := int(n%1e4 + 1e4) - concLevel := int(n%5 + 1) - total := mutations * concLevel - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - sum := NewHistogram(HistogramOpts{ - Name: "test_histogram", - Help: "helpless", - Buckets: testBuckets, - }) - - allVars := make([]float64, total) - var sampleSum float64 - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - for j := 0; j < mutations; j++ { - v := rand.NormFloat64() - vals[j] = v - allVars[i*mutations+j] = v - sampleSum += v - } - - go func(vals []float64) { - start.Wait() - for _, v := range vals { - sum.Observe(v) - } - end.Done() - }(vals) - } - sort.Float64s(allVars) - start.Done() - end.Wait() - - m := &dto.Metric{} - sum.Write(m) - if got, want := int(*m.Histogram.SampleCount), total; got != want { - t.Errorf("got sample count %d, want %d", got, want) - } - if got, want := *m.Histogram.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { - t.Errorf("got sample sum %f, want %f", got, want) - } - - wantCounts := getCumulativeCounts(allVars) - - if got, want := len(m.Histogram.Bucket), len(testBuckets)-1; got != want { - t.Errorf("got %d buckets in protobuf, want %d", got, want) - } - for i, wantBound := range testBuckets { - if i == len(testBuckets)-1 { - break // No +Inf bucket in protobuf. - } - if gotBound := *m.Histogram.Bucket[i].UpperBound; gotBound != wantBound { - t.Errorf("got bound %f, want %f", gotBound, wantBound) - } - if gotCount, wantCount := *m.Histogram.Bucket[i].CumulativeCount, wantCounts[i]; gotCount != wantCount { - t.Errorf("got count %d, want %d", gotCount, wantCount) - } - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Error(err) - } -} - -func TestHistogramVecConcurrency(t *testing.T) { - if testing.Short() { - t.Skip("Skipping test in short mode.") - } - - rand.Seed(42) - - objectives := make([]float64, 0, len(DefObjectives)) - for qu := range DefObjectives { - - objectives = append(objectives, qu) - } - sort.Float64s(objectives) - - it := func(n uint32) bool { - mutations := int(n%1e4 + 1e4) - concLevel := int(n%7 + 1) - vecLength := int(n%3 + 1) - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - his := NewHistogramVec( - HistogramOpts{ - Name: "test_histogram", - Help: "helpless", - Buckets: []float64{-2, -1, -0.5, 0, 0.5, 1, 2, math.Inf(+1)}, - }, - []string{"label"}, - ) - - allVars := make([][]float64, vecLength) - sampleSums := make([]float64, vecLength) - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - picks := make([]int, mutations) - for j := 0; j < mutations; j++ { - v := rand.NormFloat64() - vals[j] = v - pick := rand.Intn(vecLength) - picks[j] = pick - allVars[pick] = append(allVars[pick], v) - sampleSums[pick] += v - } - - go func(vals []float64) { - start.Wait() - for i, v := range vals { - his.WithLabelValues(string('A' + picks[i])).Observe(v) - } - end.Done() - }(vals) - } - for _, vars := range allVars { - sort.Float64s(vars) - } - start.Done() - end.Wait() - - for i := 0; i < vecLength; i++ { - m := &dto.Metric{} - s := his.WithLabelValues(string('A' + i)) - s.Write(m) - - if got, want := len(m.Histogram.Bucket), len(testBuckets)-1; got != want { - t.Errorf("got %d buckets in protobuf, want %d", got, want) - } - if got, want := int(*m.Histogram.SampleCount), len(allVars[i]); got != want { - t.Errorf("got sample count %d, want %d", got, want) - } - if got, want := *m.Histogram.SampleSum, sampleSums[i]; math.Abs((got-want)/want) > 0.001 { - t.Errorf("got sample sum %f, want %f", got, want) - } - - wantCounts := getCumulativeCounts(allVars[i]) - - for j, wantBound := range testBuckets { - if j == len(testBuckets)-1 { - break // No +Inf bucket in protobuf. - } - if gotBound := *m.Histogram.Bucket[j].UpperBound; gotBound != wantBound { - t.Errorf("got bound %f, want %f", gotBound, wantBound) - } - if gotCount, wantCount := *m.Histogram.Bucket[j].CumulativeCount, wantCounts[j]; gotCount != wantCount { - t.Errorf("got count %d, want %d", gotCount, wantCount) - } - } - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Error(err) - } -} - -func getCumulativeCounts(vars []float64) []uint64 { - counts := make([]uint64, len(testBuckets)) - for _, v := range vars { - for i := len(testBuckets) - 1; i >= 0; i-- { - if v > testBuckets[i] { - break - } - counts[i]++ - } - } - return counts -} - -func TestBuckets(t *testing.T) { - got := LinearBuckets(-15, 5, 6) - want := []float64{-15, -10, -5, 0, 5, 10} - if !reflect.DeepEqual(got, want) { - t.Errorf("linear buckets: got %v, want %v", got, want) - } - - got = ExponentialBuckets(100, 1.2, 3) - want = []float64{100, 120, 144} - if !reflect.DeepEqual(got, want) { - t.Errorf("linear buckets: got %v, want %v", got, want) - } -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/http_test.go b/vendor/github.com/prometheus/client_golang/prometheus/http_test.go deleted file mode 100644 index ffe0418..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/http_test.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "net/http" - "net/http/httptest" - "testing" - "time" - - dto "github.com/prometheus/client_model/go" -) - -type respBody string - -func (b respBody) ServeHTTP(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusTeapot) - w.Write([]byte(b)) -} - -func TestInstrumentHandler(t *testing.T) { - defer func(n nower) { - now = n.(nower) - }(now) - - instant := time.Now() - end := instant.Add(30 * time.Second) - now = nowSeries(instant, end) - respBody := respBody("Howdy there!") - - hndlr := InstrumentHandler("test-handler", respBody) - - opts := SummaryOpts{ - Subsystem: "http", - ConstLabels: Labels{"handler": "test-handler"}, - } - - reqCnt := MustRegisterOrGet(NewCounterVec( - CounterOpts{ - Namespace: opts.Namespace, - Subsystem: opts.Subsystem, - Name: "requests_total", - Help: "Total number of HTTP requests made.", - ConstLabels: opts.ConstLabels, - }, - instLabels, - )).(*CounterVec) - - opts.Name = "request_duration_microseconds" - opts.Help = "The HTTP request latencies in microseconds." - reqDur := MustRegisterOrGet(NewSummary(opts)).(Summary) - - opts.Name = "request_size_bytes" - opts.Help = "The HTTP request sizes in bytes." - MustRegisterOrGet(NewSummary(opts)) - - opts.Name = "response_size_bytes" - opts.Help = "The HTTP response sizes in bytes." - MustRegisterOrGet(NewSummary(opts)) - - reqCnt.Reset() - - resp := httptest.NewRecorder() - req := &http.Request{ - Method: "GET", - } - - hndlr.ServeHTTP(resp, req) - - if resp.Code != http.StatusTeapot { - t.Fatalf("expected status %d, got %d", http.StatusTeapot, resp.Code) - } - if string(resp.Body.Bytes()) != "Howdy there!" { - t.Fatalf("expected body %s, got %s", "Howdy there!", string(resp.Body.Bytes())) - } - - out := &dto.Metric{} - reqDur.Write(out) - if want, got := "test-handler", out.Label[0].GetValue(); want != got { - t.Errorf("want label value %q in reqDur, got %q", want, got) - } - if want, got := uint64(1), out.Summary.GetSampleCount(); want != got { - t.Errorf("want sample count %d in reqDur, got %d", want, got) - } - - out.Reset() - if want, got := 1, len(reqCnt.children); want != got { - t.Errorf("want %d children in reqCnt, got %d", want, got) - } - cnt, err := reqCnt.GetMetricWithLabelValues("get", "418") - if err != nil { - t.Fatal(err) - } - cnt.Write(out) - if want, got := "418", out.Label[0].GetValue(); want != got { - t.Errorf("want label value %q in reqCnt, got %q", want, got) - } - if want, got := "test-handler", out.Label[1].GetValue(); want != got { - t.Errorf("want label value %q in reqCnt, got %q", want, got) - } - if want, got := "get", out.Label[2].GetValue(); want != got { - t.Errorf("want label value %q in reqCnt, got %q", want, got) - } - if out.Counter == nil { - t.Fatal("expected non-nil counter in reqCnt") - } - if want, got := 1., out.Counter.GetValue(); want != got { - t.Errorf("want reqCnt of %f, got %f", want, got) - } -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go b/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go deleted file mode 100644 index 7145f5e..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/metric_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import "testing" - -func TestBuildFQName(t *testing.T) { - scenarios := []struct{ namespace, subsystem, name, result string }{ - {"a", "b", "c", "a_b_c"}, - {"", "b", "c", "b_c"}, - {"a", "", "c", "a_c"}, - {"", "", "c", "c"}, - {"a", "b", "", ""}, - {"a", "", "", ""}, - {"", "b", "", ""}, - {" ", "", "", ""}, - } - - for i, s := range scenarios { - if want, got := s.result, BuildFQName(s.namespace, s.subsystem, s.name); want != got { - t.Errorf("%d. want %s, got %s", i, want, got) - } - } -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go deleted file mode 100644 index d3362da..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/process_collector_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package prometheus - -import ( - "bytes" - "os" - "regexp" - "testing" - - "github.com/prometheus/common/expfmt" - "github.com/prometheus/procfs" -) - -func TestProcessCollector(t *testing.T) { - if _, err := procfs.Self(); err != nil { - t.Skipf("skipping TestProcessCollector, procfs not available: %s", err) - } - - registry := NewRegistry() - if err := registry.Register(NewProcessCollector(os.Getpid(), "")); err != nil { - t.Fatal(err) - } - if err := registry.Register(NewProcessCollectorPIDFn( - func() (int, error) { return os.Getpid(), nil }, "foobar"), - ); err != nil { - t.Fatal(err) - } - - mfs, err := registry.Gather() - if err != nil { - t.Fatal(err) - } - - var buf bytes.Buffer - for _, mf := range mfs { - if _, err := expfmt.MetricFamilyToText(&buf, mf); err != nil { - t.Fatal(err) - } - } - - for _, re := range []*regexp.Regexp{ - regexp.MustCompile("process_cpu_seconds_total [0-9]"), - regexp.MustCompile("process_max_fds [1-9]"), - regexp.MustCompile("process_open_fds [1-9]"), - regexp.MustCompile("process_virtual_memory_bytes [1-9]"), - regexp.MustCompile("process_resident_memory_bytes [1-9]"), - regexp.MustCompile("process_start_time_seconds [0-9.]{10,}"), - regexp.MustCompile("foobar_process_cpu_seconds_total [0-9]"), - regexp.MustCompile("foobar_process_max_fds [1-9]"), - regexp.MustCompile("foobar_process_open_fds [1-9]"), - regexp.MustCompile("foobar_process_virtual_memory_bytes [1-9]"), - regexp.MustCompile("foobar_process_resident_memory_bytes [1-9]"), - regexp.MustCompile("foobar_process_start_time_seconds [0-9.]{10,}"), - } { - if !re.Match(buf.Bytes()) { - t.Errorf("want body to match %s\n%s", re, buf.String()) - } - } -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go deleted file mode 100644 index d4a7d4a..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http_test.go +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2016 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Copyright (c) 2013, The Prometheus Authors -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be found -// in the LICENSE file. - -package promhttp - -import ( - "bytes" - "errors" - "log" - "net/http" - "net/http/httptest" - "testing" - - "github.com/prometheus/client_golang/prometheus" -) - -type errorCollector struct{} - -func (e errorCollector) Describe(ch chan<- *prometheus.Desc) { - ch <- prometheus.NewDesc("invalid_metric", "not helpful", nil, nil) -} - -func (e errorCollector) Collect(ch chan<- prometheus.Metric) { - ch <- prometheus.NewInvalidMetric( - prometheus.NewDesc("invalid_metric", "not helpful", nil, nil), - errors.New("collect error"), - ) -} - -func TestHandlerErrorHandling(t *testing.T) { - - // Create a registry that collects a MetricFamily with two elements, - // another with one, and reports an error. - reg := prometheus.NewRegistry() - - cnt := prometheus.NewCounter(prometheus.CounterOpts{ - Name: "the_count", - Help: "Ah-ah-ah! Thunder and lightning!", - }) - reg.MustRegister(cnt) - - cntVec := prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "name", - Help: "docstring", - ConstLabels: prometheus.Labels{"constname": "constvalue"}, - }, - []string{"labelname"}, - ) - cntVec.WithLabelValues("val1").Inc() - cntVec.WithLabelValues("val2").Inc() - reg.MustRegister(cntVec) - - reg.MustRegister(errorCollector{}) - - logBuf := &bytes.Buffer{} - logger := log.New(logBuf, "", 0) - - writer := httptest.NewRecorder() - request, _ := http.NewRequest("GET", "/", nil) - request.Header.Add("Accept", "test/plain") - - errorHandler := HandlerFor(reg, HandlerOpts{ - ErrorLog: logger, - ErrorHandling: HTTPErrorOnError, - }) - continueHandler := HandlerFor(reg, HandlerOpts{ - ErrorLog: logger, - ErrorHandling: ContinueOnError, - }) - panicHandler := HandlerFor(reg, HandlerOpts{ - ErrorLog: logger, - ErrorHandling: PanicOnError, - }) - wantMsg := `error gathering metrics: error collecting metric Desc{fqName: "invalid_metric", help: "not helpful", constLabels: {}, variableLabels: []}: collect error -` - wantErrorBody := `An error has occurred during metrics gathering: - -error collecting metric Desc{fqName: "invalid_metric", help: "not helpful", constLabels: {}, variableLabels: []}: collect error -` - wantOKBody := `# HELP name docstring -# TYPE name counter -name{constname="constvalue",labelname="val1"} 1 -name{constname="constvalue",labelname="val2"} 1 -# HELP the_count Ah-ah-ah! Thunder and lightning! -# TYPE the_count counter -the_count 0 -` - - errorHandler.ServeHTTP(writer, request) - if got, want := writer.Code, http.StatusInternalServerError; got != want { - t.Errorf("got HTTP status code %d, want %d", got, want) - } - if got := logBuf.String(); got != wantMsg { - t.Errorf("got log message:\n%s\nwant log mesage:\n%s\n", got, wantMsg) - } - if got := writer.Body.String(); got != wantErrorBody { - t.Errorf("got body:\n%s\nwant body:\n%s\n", got, wantErrorBody) - } - logBuf.Reset() - writer.Body.Reset() - writer.Code = http.StatusOK - - continueHandler.ServeHTTP(writer, request) - if got, want := writer.Code, http.StatusOK; got != want { - t.Errorf("got HTTP status code %d, want %d", got, want) - } - if got := logBuf.String(); got != wantMsg { - t.Errorf("got log message %q, want %q", got, wantMsg) - } - if got := writer.Body.String(); got != wantOKBody { - t.Errorf("got body %q, want %q", got, wantOKBody) - } - - defer func() { - if err := recover(); err == nil { - t.Error("expected panic from panicHandler") - } - }() - panicHandler.ServeHTTP(writer, request) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go b/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go deleted file mode 100644 index 9dacb62..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/registry_test.go +++ /dev/null @@ -1,545 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Copyright (c) 2013, The Prometheus Authors -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be found -// in the LICENSE file. - -package prometheus_test - -import ( - "bytes" - "net/http" - "net/http/httptest" - "testing" - - dto "github.com/prometheus/client_model/go" - - "github.com/golang/protobuf/proto" - "github.com/prometheus/common/expfmt" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" -) - -func testHandler(t testing.TB) { - - metricVec := prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "name", - Help: "docstring", - ConstLabels: prometheus.Labels{"constname": "constvalue"}, - }, - []string{"labelname"}, - ) - - metricVec.WithLabelValues("val1").Inc() - metricVec.WithLabelValues("val2").Inc() - - externalMetricFamily := &dto.MetricFamily{ - Name: proto.String("externalname"), - Help: proto.String("externaldocstring"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - { - Label: []*dto.LabelPair{ - { - Name: proto.String("externalconstname"), - Value: proto.String("externalconstvalue"), - }, - { - Name: proto.String("externallabelname"), - Value: proto.String("externalval1"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(1), - }, - }, - }, - } - externalBuf := &bytes.Buffer{} - enc := expfmt.NewEncoder(externalBuf, expfmt.FmtProtoDelim) - if err := enc.Encode(externalMetricFamily); err != nil { - t.Fatal(err) - } - externalMetricFamilyAsBytes := externalBuf.Bytes() - externalMetricFamilyAsText := []byte(`# HELP externalname externaldocstring -# TYPE externalname counter -externalname{externalconstname="externalconstvalue",externallabelname="externalval1"} 1 -`) - externalMetricFamilyAsProtoText := []byte(`name: "externalname" -help: "externaldocstring" -type: COUNTER -metric: < - label: < - name: "externalconstname" - value: "externalconstvalue" - > - label: < - name: "externallabelname" - value: "externalval1" - > - counter: < - value: 1 - > -> - -`) - externalMetricFamilyAsProtoCompactText := []byte(`name:"externalname" help:"externaldocstring" type:COUNTER metric: label: counter: > -`) - - expectedMetricFamily := &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("docstring"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - { - Label: []*dto.LabelPair{ - { - Name: proto.String("constname"), - Value: proto.String("constvalue"), - }, - { - Name: proto.String("labelname"), - Value: proto.String("val1"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(1), - }, - }, - { - Label: []*dto.LabelPair{ - { - Name: proto.String("constname"), - Value: proto.String("constvalue"), - }, - { - Name: proto.String("labelname"), - Value: proto.String("val2"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(1), - }, - }, - }, - } - buf := &bytes.Buffer{} - enc = expfmt.NewEncoder(buf, expfmt.FmtProtoDelim) - if err := enc.Encode(expectedMetricFamily); err != nil { - t.Fatal(err) - } - expectedMetricFamilyAsBytes := buf.Bytes() - expectedMetricFamilyAsText := []byte(`# HELP name docstring -# TYPE name counter -name{constname="constvalue",labelname="val1"} 1 -name{constname="constvalue",labelname="val2"} 1 -`) - expectedMetricFamilyAsProtoText := []byte(`name: "name" -help: "docstring" -type: COUNTER -metric: < - label: < - name: "constname" - value: "constvalue" - > - label: < - name: "labelname" - value: "val1" - > - counter: < - value: 1 - > -> -metric: < - label: < - name: "constname" - value: "constvalue" - > - label: < - name: "labelname" - value: "val2" - > - counter: < - value: 1 - > -> - -`) - expectedMetricFamilyAsProtoCompactText := []byte(`name:"name" help:"docstring" type:COUNTER metric: label: counter: > metric: label: counter: > -`) - - externalMetricFamilyWithSameName := &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("docstring"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - { - Label: []*dto.LabelPair{ - { - Name: proto.String("constname"), - Value: proto.String("constvalue"), - }, - { - Name: proto.String("labelname"), - Value: proto.String("different_val"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(42), - }, - }, - }, - } - - expectedMetricFamilyMergedWithExternalAsProtoCompactText := []byte(`name:"name" help:"docstring" type:COUNTER metric: label: counter: > metric: label: counter: > metric: label: counter: > -`) - - type output struct { - headers map[string]string - body []byte - } - - var scenarios = []struct { - headers map[string]string - out output - collector prometheus.Collector - externalMF []*dto.MetricFamily - }{ - { // 0 - headers: map[string]string{ - "Accept": "foo/bar;q=0.2, dings/bums;q=0.8", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: []byte{}, - }, - }, - { // 1 - headers: map[string]string{ - "Accept": "foo/bar;q=0.2, application/quark;q=0.8", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: []byte{}, - }, - }, - { // 2 - headers: map[string]string{ - "Accept": "foo/bar;q=0.2, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.8", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: []byte{}, - }, - }, - { // 3 - headers: map[string]string{ - "Accept": "text/plain;q=0.2, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.8", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, - }, - body: []byte{}, - }, - }, - { // 4 - headers: map[string]string{ - "Accept": "application/json", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: expectedMetricFamilyAsText, - }, - collector: metricVec, - }, - { // 5 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, - }, - body: expectedMetricFamilyAsBytes, - }, - collector: metricVec, - }, - { // 6 - headers: map[string]string{ - "Accept": "application/json", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: externalMetricFamilyAsText, - }, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 7 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, - }, - body: externalMetricFamilyAsBytes, - }, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 8 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsBytes, - expectedMetricFamilyAsBytes, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 9 - headers: map[string]string{ - "Accept": "text/plain", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: []byte{}, - }, - }, - { // 10 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.2, text/plain;q=0.5", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: expectedMetricFamilyAsText, - }, - collector: metricVec, - }, - { // 11 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=bla;q=0.2, text/plain;q=0.5;version=0.0.4", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `text/plain; version=0.0.4`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsText, - expectedMetricFamilyAsText, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 12 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.2, text/plain;q=0.5;version=0.0.2", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsBytes, - expectedMetricFamilyAsBytes, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 13 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=text;q=0.5, application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited;q=0.4", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=text`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsProtoText, - expectedMetricFamilyAsProtoText, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 14 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=compact-text`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsProtoCompactText, - expectedMetricFamilyAsProtoCompactText, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{externalMetricFamily}, - }, - { // 15 - headers: map[string]string{ - "Accept": "application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=compact-text", - }, - out: output{ - headers: map[string]string{ - "Content-Type": `application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=compact-text`, - }, - body: bytes.Join( - [][]byte{ - externalMetricFamilyAsProtoCompactText, - expectedMetricFamilyMergedWithExternalAsProtoCompactText, - }, - []byte{}, - ), - }, - collector: metricVec, - externalMF: []*dto.MetricFamily{ - externalMetricFamily, - externalMetricFamilyWithSameName, - }, - }, - } - for i, scenario := range scenarios { - registry := prometheus.NewPedanticRegistry() - gatherer := prometheus.Gatherer(registry) - if scenario.externalMF != nil { - gatherer = prometheus.Gatherers{ - registry, - prometheus.GathererFunc(func() ([]*dto.MetricFamily, error) { - return scenario.externalMF, nil - }), - } - } - - if scenario.collector != nil { - registry.Register(scenario.collector) - } - writer := httptest.NewRecorder() - handler := prometheus.InstrumentHandler("prometheus", promhttp.HandlerFor(gatherer, promhttp.HandlerOpts{})) - request, _ := http.NewRequest("GET", "/", nil) - for key, value := range scenario.headers { - request.Header.Add(key, value) - } - handler(writer, request) - - for key, value := range scenario.out.headers { - if writer.HeaderMap.Get(key) != value { - t.Errorf( - "%d. expected %q for header %q, got %q", - i, value, key, writer.Header().Get(key), - ) - } - } - - if !bytes.Equal(scenario.out.body, writer.Body.Bytes()) { - t.Errorf( - "%d. expected body:\n%s\ngot body:\n%s\n", - i, scenario.out.body, writer.Body.Bytes(), - ) - } - } -} - -func TestHandler(t *testing.T) { - testHandler(t) -} - -func BenchmarkHandler(b *testing.B) { - for i := 0; i < b.N; i++ { - testHandler(b) - } -} - -func TestRegisterWithOrGet(t *testing.T) { - // Replace the default registerer just to be sure. This is bad, but this - // whole test will go away once RegisterOrGet is removed. - oldRegisterer := prometheus.DefaultRegisterer - defer func() { - prometheus.DefaultRegisterer = oldRegisterer - }() - prometheus.DefaultRegisterer = prometheus.NewRegistry() - original := prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "test", - Help: "help", - }, - []string{"foo", "bar"}, - ) - equalButNotSame := prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "test", - Help: "help", - }, - []string{"foo", "bar"}, - ) - if err := prometheus.Register(original); err != nil { - t.Fatal(err) - } - if err := prometheus.Register(equalButNotSame); err == nil { - t.Fatal("expected error when registringe equal collector") - } - existing, err := prometheus.RegisterOrGet(equalButNotSame) - if err != nil { - t.Fatal(err) - } - if existing != original { - t.Error("expected original collector but got something else") - } - if existing == equalButNotSame { - t.Error("expected original callector but got new one") - } -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go b/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go deleted file mode 100644 index c4575ff..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/summary_test.go +++ /dev/null @@ -1,347 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "math" - "math/rand" - "sort" - "sync" - "testing" - "testing/quick" - "time" - - dto "github.com/prometheus/client_model/go" -) - -func benchmarkSummaryObserve(w int, b *testing.B) { - b.StopTimer() - - wg := new(sync.WaitGroup) - wg.Add(w) - - g := new(sync.WaitGroup) - g.Add(1) - - s := NewSummary(SummaryOpts{}) - - for i := 0; i < w; i++ { - go func() { - g.Wait() - - for i := 0; i < b.N; i++ { - s.Observe(float64(i)) - } - - wg.Done() - }() - } - - b.StartTimer() - g.Done() - wg.Wait() -} - -func BenchmarkSummaryObserve1(b *testing.B) { - benchmarkSummaryObserve(1, b) -} - -func BenchmarkSummaryObserve2(b *testing.B) { - benchmarkSummaryObserve(2, b) -} - -func BenchmarkSummaryObserve4(b *testing.B) { - benchmarkSummaryObserve(4, b) -} - -func BenchmarkSummaryObserve8(b *testing.B) { - benchmarkSummaryObserve(8, b) -} - -func benchmarkSummaryWrite(w int, b *testing.B) { - b.StopTimer() - - wg := new(sync.WaitGroup) - wg.Add(w) - - g := new(sync.WaitGroup) - g.Add(1) - - s := NewSummary(SummaryOpts{}) - - for i := 0; i < 1000000; i++ { - s.Observe(float64(i)) - } - - for j := 0; j < w; j++ { - outs := make([]dto.Metric, b.N) - - go func(o []dto.Metric) { - g.Wait() - - for i := 0; i < b.N; i++ { - s.Write(&o[i]) - } - - wg.Done() - }(outs) - } - - b.StartTimer() - g.Done() - wg.Wait() -} - -func BenchmarkSummaryWrite1(b *testing.B) { - benchmarkSummaryWrite(1, b) -} - -func BenchmarkSummaryWrite2(b *testing.B) { - benchmarkSummaryWrite(2, b) -} - -func BenchmarkSummaryWrite4(b *testing.B) { - benchmarkSummaryWrite(4, b) -} - -func BenchmarkSummaryWrite8(b *testing.B) { - benchmarkSummaryWrite(8, b) -} - -func TestSummaryConcurrency(t *testing.T) { - if testing.Short() { - t.Skip("Skipping test in short mode.") - } - - rand.Seed(42) - - it := func(n uint32) bool { - mutations := int(n%1e4 + 1e4) - concLevel := int(n%5 + 1) - total := mutations * concLevel - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - sum := NewSummary(SummaryOpts{ - Name: "test_summary", - Help: "helpless", - }) - - allVars := make([]float64, total) - var sampleSum float64 - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - for j := 0; j < mutations; j++ { - v := rand.NormFloat64() - vals[j] = v - allVars[i*mutations+j] = v - sampleSum += v - } - - go func(vals []float64) { - start.Wait() - for _, v := range vals { - sum.Observe(v) - } - end.Done() - }(vals) - } - sort.Float64s(allVars) - start.Done() - end.Wait() - - m := &dto.Metric{} - sum.Write(m) - if got, want := int(*m.Summary.SampleCount), total; got != want { - t.Errorf("got sample count %d, want %d", got, want) - } - if got, want := *m.Summary.SampleSum, sampleSum; math.Abs((got-want)/want) > 0.001 { - t.Errorf("got sample sum %f, want %f", got, want) - } - - objectives := make([]float64, 0, len(DefObjectives)) - for qu := range DefObjectives { - objectives = append(objectives, qu) - } - sort.Float64s(objectives) - - for i, wantQ := range objectives { - ε := DefObjectives[wantQ] - gotQ := *m.Summary.Quantile[i].Quantile - gotV := *m.Summary.Quantile[i].Value - min, max := getBounds(allVars, wantQ, ε) - if gotQ != wantQ { - t.Errorf("got quantile %f, want %f", gotQ, wantQ) - } - if gotV < min || gotV > max { - t.Errorf("got %f for quantile %f, want [%f,%f]", gotV, gotQ, min, max) - } - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Error(err) - } -} - -func TestSummaryVecConcurrency(t *testing.T) { - if testing.Short() { - t.Skip("Skipping test in short mode.") - } - - rand.Seed(42) - - objectives := make([]float64, 0, len(DefObjectives)) - for qu := range DefObjectives { - - objectives = append(objectives, qu) - } - sort.Float64s(objectives) - - it := func(n uint32) bool { - mutations := int(n%1e4 + 1e4) - concLevel := int(n%7 + 1) - vecLength := int(n%3 + 1) - - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - sum := NewSummaryVec( - SummaryOpts{ - Name: "test_summary", - Help: "helpless", - }, - []string{"label"}, - ) - - allVars := make([][]float64, vecLength) - sampleSums := make([]float64, vecLength) - for i := 0; i < concLevel; i++ { - vals := make([]float64, mutations) - picks := make([]int, mutations) - for j := 0; j < mutations; j++ { - v := rand.NormFloat64() - vals[j] = v - pick := rand.Intn(vecLength) - picks[j] = pick - allVars[pick] = append(allVars[pick], v) - sampleSums[pick] += v - } - - go func(vals []float64) { - start.Wait() - for i, v := range vals { - sum.WithLabelValues(string('A' + picks[i])).Observe(v) - } - end.Done() - }(vals) - } - for _, vars := range allVars { - sort.Float64s(vars) - } - start.Done() - end.Wait() - - for i := 0; i < vecLength; i++ { - m := &dto.Metric{} - s := sum.WithLabelValues(string('A' + i)) - s.Write(m) - if got, want := int(*m.Summary.SampleCount), len(allVars[i]); got != want { - t.Errorf("got sample count %d for label %c, want %d", got, 'A'+i, want) - } - if got, want := *m.Summary.SampleSum, sampleSums[i]; math.Abs((got-want)/want) > 0.001 { - t.Errorf("got sample sum %f for label %c, want %f", got, 'A'+i, want) - } - for j, wantQ := range objectives { - ε := DefObjectives[wantQ] - gotQ := *m.Summary.Quantile[j].Quantile - gotV := *m.Summary.Quantile[j].Value - min, max := getBounds(allVars[i], wantQ, ε) - if gotQ != wantQ { - t.Errorf("got quantile %f for label %c, want %f", gotQ, 'A'+i, wantQ) - } - if gotV < min || gotV > max { - t.Errorf("got %f for quantile %f for label %c, want [%f,%f]", gotV, gotQ, 'A'+i, min, max) - } - } - } - return true - } - - if err := quick.Check(it, nil); err != nil { - t.Error(err) - } -} - -func TestSummaryDecay(t *testing.T) { - if testing.Short() { - t.Skip("Skipping test in short mode.") - // More because it depends on timing than because it is particularly long... - } - - sum := NewSummary(SummaryOpts{ - Name: "test_summary", - Help: "helpless", - MaxAge: 100 * time.Millisecond, - Objectives: map[float64]float64{0.1: 0.001}, - AgeBuckets: 10, - }) - - m := &dto.Metric{} - i := 0 - tick := time.NewTicker(time.Millisecond) - for _ = range tick.C { - i++ - sum.Observe(float64(i)) - if i%10 == 0 { - sum.Write(m) - if got, want := *m.Summary.Quantile[0].Value, math.Max(float64(i)/10, float64(i-90)); math.Abs(got-want) > 20 { - t.Errorf("%d. got %f, want %f", i, got, want) - } - m.Reset() - } - if i >= 1000 { - break - } - } - tick.Stop() - // Wait for MaxAge without observations and make sure quantiles are NaN. - time.Sleep(100 * time.Millisecond) - sum.Write(m) - if got := *m.Summary.Quantile[0].Value; !math.IsNaN(got) { - t.Errorf("got %f, want NaN after expiration", got) - } -} - -func getBounds(vars []float64, q, ε float64) (min, max float64) { - // TODO(beorn7): This currently tolerates an error of up to 2*ε. The - // error must be at most ε, but for some reason, it's sometimes slightly - // higher. That's a bug. - n := float64(len(vars)) - lower := int((q - 2*ε) * n) - upper := int(math.Ceil((q + 2*ε) * n)) - min = vars[0] - if lower > 1 { - min = vars[lower-1] - } - max = vars[len(vars)-1] - if upper < len(vars) { - max = vars[upper-1] - } - return -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go b/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go deleted file mode 100644 index 445a6b3..0000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/vec_test.go +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "fmt" - "testing" - - dto "github.com/prometheus/client_model/go" -) - -func TestDelete(t *testing.T) { - vec := NewUntypedVec( - UntypedOpts{ - Name: "test", - Help: "helpless", - }, - []string{"l1", "l2"}, - ) - testDelete(t, vec) -} - -func TestDeleteWithCollisions(t *testing.T) { - vec := NewUntypedVec( - UntypedOpts{ - Name: "test", - Help: "helpless", - }, - []string{"l1", "l2"}, - ) - vec.hashAdd = func(h uint64, s string) uint64 { return 1 } - vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } - testDelete(t, vec) -} - -func testDelete(t *testing.T, vec *UntypedVec) { - if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - - vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) - if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), true; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.Delete(Labels{"l1": "v1", "l2": "v2"}), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - - vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) - if got, want := vec.Delete(Labels{"l2": "v2", "l1": "v1"}), true; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.Delete(Labels{"l2": "v2", "l1": "v1"}), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - - vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) - if got, want := vec.Delete(Labels{"l2": "v1", "l1": "v2"}), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.Delete(Labels{"l1": "v1"}), false; got != want { - t.Errorf("got %v, want %v", got, want) - } -} - -func TestDeleteLabelValues(t *testing.T) { - vec := NewUntypedVec( - UntypedOpts{ - Name: "test", - Help: "helpless", - }, - []string{"l1", "l2"}, - ) - testDeleteLabelValues(t, vec) -} - -func TestDeleteLabelValuesWithCollisions(t *testing.T) { - vec := NewUntypedVec( - UntypedOpts{ - Name: "test", - Help: "helpless", - }, - []string{"l1", "l2"}, - ) - vec.hashAdd = func(h uint64, s string) uint64 { return 1 } - vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } - testDeleteLabelValues(t, vec) -} - -func testDeleteLabelValues(t *testing.T, vec *UntypedVec) { - if got, want := vec.DeleteLabelValues("v1", "v2"), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - - vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) - vec.With(Labels{"l1": "v1", "l2": "v3"}).(Untyped).Set(42) // Add junk data for collision. - if got, want := vec.DeleteLabelValues("v1", "v2"), true; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.DeleteLabelValues("v1", "v2"), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.DeleteLabelValues("v1", "v3"), true; got != want { - t.Errorf("got %v, want %v", got, want) - } - - vec.With(Labels{"l1": "v1", "l2": "v2"}).(Untyped).Set(42) - // Delete out of order. - if got, want := vec.DeleteLabelValues("v2", "v1"), false; got != want { - t.Errorf("got %v, want %v", got, want) - } - if got, want := vec.DeleteLabelValues("v1"), false; got != want { - t.Errorf("got %v, want %v", got, want) - } -} - -func TestMetricVec(t *testing.T) { - vec := NewUntypedVec( - UntypedOpts{ - Name: "test", - Help: "helpless", - }, - []string{"l1", "l2"}, - ) - testMetricVec(t, vec) -} - -func TestMetricVecWithCollisions(t *testing.T) { - vec := NewUntypedVec( - UntypedOpts{ - Name: "test", - Help: "helpless", - }, - []string{"l1", "l2"}, - ) - vec.hashAdd = func(h uint64, s string) uint64 { return 1 } - vec.hashAddByte = func(h uint64, b byte) uint64 { return 1 } - testMetricVec(t, vec) -} - -func testMetricVec(t *testing.T, vec *UntypedVec) { - vec.Reset() // Actually test Reset now! - - var pair [2]string - // Keep track of metrics. - expected := map[[2]string]int{} - - for i := 0; i < 1000; i++ { - pair[0], pair[1] = fmt.Sprint(i%4), fmt.Sprint(i%5) // Varying combinations multiples. - expected[pair]++ - vec.WithLabelValues(pair[0], pair[1]).Inc() - - expected[[2]string{"v1", "v2"}]++ - vec.WithLabelValues("v1", "v2").(Untyped).Inc() - } - - var total int - for _, metrics := range vec.children { - for _, metric := range metrics { - total++ - copy(pair[:], metric.values) - - var metricOut dto.Metric - if err := metric.metric.Write(&metricOut); err != nil { - t.Fatal(err) - } - actual := *metricOut.Untyped.Value - - var actualPair [2]string - for i, label := range metricOut.Label { - actualPair[i] = *label.Value - } - - // Test output pair against metric.values to ensure we've selected - // the right one. We check this to ensure the below check means - // anything at all. - if actualPair != pair { - t.Fatalf("unexpected pair association in metric map: %v != %v", actualPair, pair) - } - - if actual != float64(expected[pair]) { - t.Fatalf("incorrect counter value for %v: %v != %v", pair, actual, expected[pair]) - } - } - } - - if total != len(expected) { - t.Fatalf("unexpected number of metrics: %v != %v", total, len(expected)) - } - - vec.Reset() - - if len(vec.children) > 0 { - t.Fatalf("reset failed") - } -} - -func TestCounterVecEndToEndWithCollision(t *testing.T) { - vec := NewCounterVec( - CounterOpts{ - Name: "test", - Help: "helpless", - }, - []string{"labelname"}, - ) - vec.WithLabelValues("77kepQFQ8Kl").Inc() - vec.WithLabelValues("!0IC=VloaY").Add(2) - - m := &dto.Metric{} - if err := vec.WithLabelValues("77kepQFQ8Kl").Write(m); err != nil { - t.Fatal(err) - } - if got, want := m.GetLabel()[0].GetValue(), "77kepQFQ8Kl"; got != want { - t.Errorf("got label value %q, want %q", got, want) - } - if got, want := m.GetCounter().GetValue(), 1.; got != want { - t.Errorf("got value %f, want %f", got, want) - } - m.Reset() - if err := vec.WithLabelValues("!0IC=VloaY").Write(m); err != nil { - t.Fatal(err) - } - if got, want := m.GetLabel()[0].GetValue(), "!0IC=VloaY"; got != want { - t.Errorf("got label value %q, want %q", got, want) - } - if got, want := m.GetCounter().GetValue(), 2.; got != want { - t.Errorf("got value %f, want %f", got, want) - } -} - -func BenchmarkMetricVecWithLabelValuesBasic(b *testing.B) { - benchmarkMetricVecWithLabelValues(b, map[string][]string{ - "l1": []string{"onevalue"}, - "l2": []string{"twovalue"}, - }) -} - -func BenchmarkMetricVecWithLabelValues2Keys10ValueCardinality(b *testing.B) { - benchmarkMetricVecWithLabelValuesCardinality(b, 2, 10) -} - -func BenchmarkMetricVecWithLabelValues4Keys10ValueCardinality(b *testing.B) { - benchmarkMetricVecWithLabelValuesCardinality(b, 4, 10) -} - -func BenchmarkMetricVecWithLabelValues2Keys100ValueCardinality(b *testing.B) { - benchmarkMetricVecWithLabelValuesCardinality(b, 2, 100) -} - -func BenchmarkMetricVecWithLabelValues10Keys100ValueCardinality(b *testing.B) { - benchmarkMetricVecWithLabelValuesCardinality(b, 10, 100) -} - -func BenchmarkMetricVecWithLabelValues10Keys1000ValueCardinality(b *testing.B) { - benchmarkMetricVecWithLabelValuesCardinality(b, 10, 1000) -} - -func benchmarkMetricVecWithLabelValuesCardinality(b *testing.B, nkeys, nvalues int) { - labels := map[string][]string{} - - for i := 0; i < nkeys; i++ { - var ( - k = fmt.Sprintf("key-%v", i) - vs = make([]string, 0, nvalues) - ) - for j := 0; j < nvalues; j++ { - vs = append(vs, fmt.Sprintf("value-%v", j)) - } - labels[k] = vs - } - - benchmarkMetricVecWithLabelValues(b, labels) -} - -func benchmarkMetricVecWithLabelValues(b *testing.B, labels map[string][]string) { - var keys []string - for k := range labels { // Map order dependent, who cares though. - keys = append(keys, k) - } - - values := make([]string, len(labels)) // Value cache for permutations. - vec := NewUntypedVec( - UntypedOpts{ - Name: "test", - Help: "helpless", - }, - keys, - ) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - // Varies input across provide map entries based on key size. - for j, k := range keys { - candidates := labels[k] - values[j] = candidates[i%len(candidates)] - } - - vec.WithLabelValues(values...) - } -} diff --git a/vendor/github.com/prometheus/client_model/.gitignore b/vendor/github.com/prometheus/client_model/.gitignore deleted file mode 100644 index 2f7896d..0000000 --- a/vendor/github.com/prometheus/client_model/.gitignore +++ /dev/null @@ -1 +0,0 @@ -target/ diff --git a/vendor/github.com/prometheus/client_model/CONTRIBUTING.md b/vendor/github.com/prometheus/client_model/CONTRIBUTING.md deleted file mode 100644 index 40503ed..0000000 --- a/vendor/github.com/prometheus/client_model/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing - -Prometheus uses GitHub to manage reviews of pull requests. - -* If you have a trivial fix or improvement, go ahead and create a pull request, - addressing (with `@...`) the maintainer of this repository (see - [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. - -* If you plan to do something more involved, first discuss your ideas - on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). - This will avoid unnecessary work and surely give you and us a good deal - of inspiration. - -* Relevant coding style guidelines are the [Go Code Review - Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) - and the _Formatting and style_ section of Peter Bourgon's [Go: Best - Practices for Production - Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/vendor/github.com/prometheus/client_model/MAINTAINERS.md b/vendor/github.com/prometheus/client_model/MAINTAINERS.md deleted file mode 100644 index 3ede55f..0000000 --- a/vendor/github.com/prometheus/client_model/MAINTAINERS.md +++ /dev/null @@ -1 +0,0 @@ -* Björn Rabenstein diff --git a/vendor/github.com/prometheus/client_model/Makefile b/vendor/github.com/prometheus/client_model/Makefile deleted file mode 100644 index e147c69..0000000 --- a/vendor/github.com/prometheus/client_model/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2013 Prometheus Team -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -KEY_ID ?= _DEFINE_ME_ - -all: cpp go java python ruby - -SUFFIXES: - -cpp: cpp/metrics.pb.cc cpp/metrics.pb.h - -cpp/metrics.pb.cc: metrics.proto - protoc $< --cpp_out=cpp/ - -cpp/metrics.pb.h: metrics.proto - protoc $< --cpp_out=cpp/ - -go: go/metrics.pb.go - -go/metrics.pb.go: metrics.proto - protoc $< --go_out=go/ - -java: src/main/java/io/prometheus/client/Metrics.java pom.xml - mvn clean compile package - -src/main/java/io/prometheus/client/Metrics.java: metrics.proto - protoc $< --java_out=src/main/java - -python: python/prometheus/client/model/metrics_pb2.py - -python/prometheus/client/model/metrics_pb2.py: metrics.proto - mkdir -p python/prometheus/client/model - protoc $< --python_out=python/prometheus/client/model - -ruby: - $(MAKE) -C ruby build - -clean: - -rm -rf cpp/* - -rm -rf go/* - -rm -rf java/* - -rm -rf python/* - -$(MAKE) -C ruby clean - -mvn clean - -maven-deploy-snapshot: java - mvn clean deploy -Dgpg.keyname=$(KEY_ID) -DperformRelease=true - -maven-deploy-release: java - mvn clean release:clean release:prepare release:perform -Dgpg.keyname=$(KEY_ID) -DperformRelease=true - -.PHONY: all clean cpp go java maven-deploy-snapshot maven-deploy-release python ruby diff --git a/vendor/github.com/prometheus/client_model/README.md b/vendor/github.com/prometheus/client_model/README.md deleted file mode 100644 index a710042..0000000 --- a/vendor/github.com/prometheus/client_model/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Background -Under most circumstances, manually downloading this repository should never -be required. - -# Prerequisites -# Base -* [Google Protocol Buffers](https://developers.google.com/protocol-buffers) - -## Java -* [Apache Maven](http://maven.apache.org) -* [Prometheus Maven Repository](https://github.com/prometheus/io.prometheus-maven-repository) checked out into ../io.prometheus-maven-repository - -## Go -* [Go](http://golang.org) -* [goprotobuf](https://code.google.com/p/goprotobuf) - -## Ruby -* [Ruby](https://www.ruby-lang.org) -* [bundler](https://rubygems.org/gems/bundler) - -# Building - $ make - -# Getting Started - * The Go source code is periodically indexed: [Go Protocol Buffer Model](http://godoc.org/github.com/prometheus/client_model/go). - * All of the core developers are accessible via the [Prometheus Developers Mailinglist](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). diff --git a/vendor/github.com/prometheus/client_model/metrics.proto b/vendor/github.com/prometheus/client_model/metrics.proto deleted file mode 100644 index 0b84af9..0000000 --- a/vendor/github.com/prometheus/client_model/metrics.proto +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2013 Prometheus Team -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto2"; - -package io.prometheus.client; -option java_package = "io.prometheus.client"; - -message LabelPair { - optional string name = 1; - optional string value = 2; -} - -enum MetricType { - COUNTER = 0; - GAUGE = 1; - SUMMARY = 2; - UNTYPED = 3; - HISTOGRAM = 4; -} - -message Gauge { - optional double value = 1; -} - -message Counter { - optional double value = 1; -} - -message Quantile { - optional double quantile = 1; - optional double value = 2; -} - -message Summary { - optional uint64 sample_count = 1; - optional double sample_sum = 2; - repeated Quantile quantile = 3; -} - -message Untyped { - optional double value = 1; -} - -message Histogram { - optional uint64 sample_count = 1; - optional double sample_sum = 2; - repeated Bucket bucket = 3; // Ordered in increasing order of upper_bound, +Inf bucket is optional. -} - -message Bucket { - optional uint64 cumulative_count = 1; // Cumulative in increasing order. - optional double upper_bound = 2; // Inclusive. -} - -message Metric { - repeated LabelPair label = 1; - optional Gauge gauge = 2; - optional Counter counter = 3; - optional Summary summary = 4; - optional Untyped untyped = 5; - optional Histogram histogram = 7; - optional int64 timestamp_ms = 6; -} - -message MetricFamily { - optional string name = 1; - optional string help = 2; - optional MetricType type = 3; - repeated Metric metric = 4; -} diff --git a/vendor/github.com/prometheus/client_model/pom.xml b/vendor/github.com/prometheus/client_model/pom.xml deleted file mode 100644 index 4d34c90..0000000 --- a/vendor/github.com/prometheus/client_model/pom.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - 4.0.0 - - io.prometheus.client - model - 0.0.3-SNAPSHOT - - - org.sonatype.oss - oss-parent - 7 - - - Prometheus Client Data Model - http://github.com/prometheus/client_model - - Prometheus Client Data Model: Generated Protocol Buffer Assets - - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - scm:git:git@github.com:prometheus/client_model.git - scm:git:git@github.com:prometheus/client_model.git - git@github.com:prometheus/client_model.git - - - - - mtp - Matt T. Proud - matt.proud@gmail.com - - - - - - com.google.protobuf - protobuf-java - 2.5.0 - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8 - - UTF-8 - UTF-8 - true - - - - generate-javadoc-site-report - site - - javadoc - - - - attach-javadocs - - jar - - - - - - maven-compiler-plugin - - 1.6 - 1.6 - - 3.1 - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources - - jar - - - - - - - - - release-sign-artifacts - - - performRelease - true - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.4 - - - sign-artifacts - verify - - sign - - - - - - - - - diff --git a/vendor/github.com/prometheus/client_model/setup.py b/vendor/github.com/prometheus/client_model/setup.py deleted file mode 100644 index 67b9f20..0000000 --- a/vendor/github.com/prometheus/client_model/setup.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python - -from setuptools import setup - -setup( - name = 'prometheus_client_model', - version = '0.0.1', - author = 'Matt T. Proud', - author_email = 'matt.proud@gmail.com', - description = 'Data model artifacts for the Prometheus client.', - license = 'Apache License 2.0', - url = 'http://github.com/prometheus/client_model', - packages = ['prometheus', 'prometheus/client', 'prometheus/client/model'], - package_dir = {'': 'python'}, - requires = ['protobuf(==2.4.1)'], - platforms = 'Platform Independent', - classifiers = ['Development Status :: 3 - Alpha', - 'Intended Audience :: Developers', - 'Intended Audience :: System Administrators', - 'License :: OSI Approved :: Apache Software License', - 'Operating System :: OS Independent', - 'Topic :: Software Development :: Testing', - 'Topic :: System :: Monitoring']) diff --git a/vendor/github.com/prometheus/common/.travis.yml b/vendor/github.com/prometheus/common/.travis.yml deleted file mode 100644 index 2fe8e9a..0000000 --- a/vendor/github.com/prometheus/common/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -sudo: false - -language: go -go: - - 1.7.5 - - tip diff --git a/vendor/github.com/prometheus/common/CONTRIBUTING.md b/vendor/github.com/prometheus/common/CONTRIBUTING.md deleted file mode 100644 index 40503ed..0000000 --- a/vendor/github.com/prometheus/common/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing - -Prometheus uses GitHub to manage reviews of pull requests. - -* If you have a trivial fix or improvement, go ahead and create a pull request, - addressing (with `@...`) the maintainer of this repository (see - [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. - -* If you plan to do something more involved, first discuss your ideas - on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). - This will avoid unnecessary work and surely give you and us a good deal - of inspiration. - -* Relevant coding style guidelines are the [Go Code Review - Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) - and the _Formatting and style_ section of Peter Bourgon's [Go: Best - Practices for Production - Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style). diff --git a/vendor/github.com/prometheus/common/MAINTAINERS.md b/vendor/github.com/prometheus/common/MAINTAINERS.md deleted file mode 100644 index 1b31521..0000000 --- a/vendor/github.com/prometheus/common/MAINTAINERS.md +++ /dev/null @@ -1 +0,0 @@ -* Fabian Reinartz diff --git a/vendor/github.com/prometheus/common/README.md b/vendor/github.com/prometheus/common/README.md deleted file mode 100644 index 11a5849..0000000 --- a/vendor/github.com/prometheus/common/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Common -[![Build Status](https://travis-ci.org/prometheus/common.svg)](https://travis-ci.org/prometheus/common) - -This repository contains Go libraries that are shared across Prometheus -components and libraries. - -* **config**: Common configuration structures -* **expfmt**: Decoding and encoding for the exposition format -* **log**: A logging wrapper around [logrus](https://github.com/sirupsen/logrus) -* **model**: Shared data structures -* **route**: A routing wrapper around [httprouter](https://github.com/julienschmidt/httprouter) using `context.Context` -* **version**: Version informations and metric diff --git a/vendor/github.com/prometheus/common/expfmt/bench_test.go b/vendor/github.com/prometheus/common/expfmt/bench_test.go deleted file mode 100644 index e539bfc..0000000 --- a/vendor/github.com/prometheus/common/expfmt/bench_test.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2015 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package expfmt - -import ( - "bytes" - "compress/gzip" - "io" - "io/ioutil" - "testing" - - "github.com/matttproud/golang_protobuf_extensions/pbutil" - - dto "github.com/prometheus/client_model/go" -) - -var parser TextParser - -// Benchmarks to show how much penalty text format parsing actually inflicts. -// -// Example results on Linux 3.13.0, Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz, go1.4. -// -// BenchmarkParseText 1000 1188535 ns/op 205085 B/op 6135 allocs/op -// BenchmarkParseTextGzip 1000 1376567 ns/op 246224 B/op 6151 allocs/op -// BenchmarkParseProto 10000 172790 ns/op 52258 B/op 1160 allocs/op -// BenchmarkParseProtoGzip 5000 324021 ns/op 94931 B/op 1211 allocs/op -// BenchmarkParseProtoMap 10000 187946 ns/op 58714 B/op 1203 allocs/op -// -// CONCLUSION: The overhead for the map is negligible. Text format needs ~5x more allocations. -// Without compression, it needs ~7x longer, but with compression (the more relevant scenario), -// the difference becomes less relevant, only ~4x. -// -// The test data contains 248 samples. - -// BenchmarkParseText benchmarks the parsing of a text-format scrape into metric -// family DTOs. -func BenchmarkParseText(b *testing.B) { - b.StopTimer() - data, err := ioutil.ReadFile("testdata/text") - if err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - if _, err := parser.TextToMetricFamilies(bytes.NewReader(data)); err != nil { - b.Fatal(err) - } - } -} - -// BenchmarkParseTextGzip benchmarks the parsing of a gzipped text-format scrape -// into metric family DTOs. -func BenchmarkParseTextGzip(b *testing.B) { - b.StopTimer() - data, err := ioutil.ReadFile("testdata/text.gz") - if err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - in, err := gzip.NewReader(bytes.NewReader(data)) - if err != nil { - b.Fatal(err) - } - if _, err := parser.TextToMetricFamilies(in); err != nil { - b.Fatal(err) - } - } -} - -// BenchmarkParseProto benchmarks the parsing of a protobuf-format scrape into -// metric family DTOs. Note that this does not build a map of metric families -// (as the text version does), because it is not required for Prometheus -// ingestion either. (However, it is required for the text-format parsing, as -// the metric family might be sprinkled all over the text, while the -// protobuf-format guarantees bundling at one place.) -func BenchmarkParseProto(b *testing.B) { - b.StopTimer() - data, err := ioutil.ReadFile("testdata/protobuf") - if err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - family := &dto.MetricFamily{} - in := bytes.NewReader(data) - for { - family.Reset() - if _, err := pbutil.ReadDelimited(in, family); err != nil { - if err == io.EOF { - break - } - b.Fatal(err) - } - } - } -} - -// BenchmarkParseProtoGzip is like BenchmarkParseProto above, but parses gzipped -// protobuf format. -func BenchmarkParseProtoGzip(b *testing.B) { - b.StopTimer() - data, err := ioutil.ReadFile("testdata/protobuf.gz") - if err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - family := &dto.MetricFamily{} - in, err := gzip.NewReader(bytes.NewReader(data)) - if err != nil { - b.Fatal(err) - } - for { - family.Reset() - if _, err := pbutil.ReadDelimited(in, family); err != nil { - if err == io.EOF { - break - } - b.Fatal(err) - } - } - } -} - -// BenchmarkParseProtoMap is like BenchmarkParseProto but DOES put the parsed -// metric family DTOs into a map. This is not happening during Prometheus -// ingestion. It is just here to measure the overhead of that map creation and -// separate it from the overhead of the text format parsing. -func BenchmarkParseProtoMap(b *testing.B) { - b.StopTimer() - data, err := ioutil.ReadFile("testdata/protobuf") - if err != nil { - b.Fatal(err) - } - b.StartTimer() - - for i := 0; i < b.N; i++ { - families := map[string]*dto.MetricFamily{} - in := bytes.NewReader(data) - for { - family := &dto.MetricFamily{} - if _, err := pbutil.ReadDelimited(in, family); err != nil { - if err == io.EOF { - break - } - b.Fatal(err) - } - families[family.GetName()] = family - } - } -} diff --git a/vendor/github.com/prometheus/common/expfmt/decode_test.go b/vendor/github.com/prometheus/common/expfmt/decode_test.go deleted file mode 100644 index 82c1130..0000000 --- a/vendor/github.com/prometheus/common/expfmt/decode_test.go +++ /dev/null @@ -1,435 +0,0 @@ -// Copyright 2015 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package expfmt - -import ( - "io" - "net/http" - "reflect" - "sort" - "strings" - "testing" - - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/common/model" -) - -func TestTextDecoder(t *testing.T) { - var ( - ts = model.Now() - in = ` -# Only a quite simple scenario with two metric families. -# More complicated tests of the parser itself can be found in the text package. -# TYPE mf2 counter -mf2 3 -mf1{label="value1"} -3.14 123456 -mf1{label="value2"} 42 -mf2 4 -` - out = model.Vector{ - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "mf1", - "label": "value1", - }, - Value: -3.14, - Timestamp: 123456, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "mf1", - "label": "value2", - }, - Value: 42, - Timestamp: ts, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "mf2", - }, - Value: 3, - Timestamp: ts, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "mf2", - }, - Value: 4, - Timestamp: ts, - }, - } - ) - - dec := &SampleDecoder{ - Dec: &textDecoder{r: strings.NewReader(in)}, - Opts: &DecodeOptions{ - Timestamp: ts, - }, - } - var all model.Vector - for { - var smpls model.Vector - err := dec.Decode(&smpls) - if err == io.EOF { - break - } - if err != nil { - t.Fatal(err) - } - all = append(all, smpls...) - } - sort.Sort(all) - sort.Sort(out) - if !reflect.DeepEqual(all, out) { - t.Fatalf("output does not match") - } -} - -func TestProtoDecoder(t *testing.T) { - - var testTime = model.Now() - - scenarios := []struct { - in string - expected model.Vector - fail bool - }{ - { - in: "", - }, - { - in: "\x8f\x01\n\rrequest_count\x12\x12Number of requests\x18\x00\"0\n#\n\x0fsome_!abel_name\x12\x10some_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00E\xc0\"6\n)\n\x12another_label_name\x12\x13another_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00U@", - fail: true, - }, - { - in: "\x8f\x01\n\rrequest_count\x12\x12Number of requests\x18\x00\"0\n#\n\x0fsome_label_name\x12\x10some_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00E\xc0\"6\n)\n\x12another_label_name\x12\x13another_label_value\x1a\t\t\x00\x00\x00\x00\x00\x00U@", - expected: model.Vector{ - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - "some_label_name": "some_label_value", - }, - Value: -42, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - "another_label_name": "another_label_value", - }, - Value: 84, - Timestamp: testTime, - }, - }, - }, - { - in: "\xb9\x01\n\rrequest_count\x12\x12Number of requests\x18\x02\"O\n#\n\x0fsome_label_name\x12\x10some_label_value\"(\x1a\x12\t\xaeG\xe1z\x14\xae\xef?\x11\x00\x00\x00\x00\x00\x00E\xc0\x1a\x12\t+\x87\x16\xd9\xce\xf7\xef?\x11\x00\x00\x00\x00\x00\x00U\xc0\"A\n)\n\x12another_label_name\x12\x13another_label_value\"\x14\x1a\x12\t\x00\x00\x00\x00\x00\x00\xe0?\x11\x00\x00\x00\x00\x00\x00$@", - expected: model.Vector{ - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count_count", - "some_label_name": "some_label_value", - }, - Value: 0, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count_sum", - "some_label_name": "some_label_value", - }, - Value: 0, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - "some_label_name": "some_label_value", - "quantile": "0.99", - }, - Value: -42, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - "some_label_name": "some_label_value", - "quantile": "0.999", - }, - Value: -84, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count_count", - "another_label_name": "another_label_value", - }, - Value: 0, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count_sum", - "another_label_name": "another_label_value", - }, - Value: 0, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - "another_label_name": "another_label_value", - "quantile": "0.5", - }, - Value: 10, - Timestamp: testTime, - }, - }, - }, - { - in: "\x8d\x01\n\x1drequest_duration_microseconds\x12\x15The response latency.\x18\x04\"S:Q\b\x85\x15\x11\xcd\xcc\xccL\x8f\xcb:A\x1a\v\b{\x11\x00\x00\x00\x00\x00\x00Y@\x1a\f\b\x9c\x03\x11\x00\x00\x00\x00\x00\x00^@\x1a\f\b\xd0\x04\x11\x00\x00\x00\x00\x00\x00b@\x1a\f\b\xf4\v\x11\x9a\x99\x99\x99\x99\x99e@\x1a\f\b\x85\x15\x11\x00\x00\x00\x00\x00\x00\xf0\u007f", - expected: model.Vector{ - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_bucket", - "le": "100", - }, - Value: 123, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_bucket", - "le": "120", - }, - Value: 412, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_bucket", - "le": "144", - }, - Value: 592, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_bucket", - "le": "172.8", - }, - Value: 1524, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_bucket", - "le": "+Inf", - }, - Value: 2693, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_sum", - }, - Value: 1756047.3, - Timestamp: testTime, - }, - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_duration_microseconds_count", - }, - Value: 2693, - Timestamp: testTime, - }, - }, - }, - { - // The metric type is unset in this protobuf, which needs to be handled - // correctly by the decoder. - in: "\x1c\n\rrequest_count\"\v\x1a\t\t\x00\x00\x00\x00\x00\x00\xf0?", - expected: model.Vector{ - &model.Sample{ - Metric: model.Metric{ - model.MetricNameLabel: "request_count", - }, - Value: 1, - Timestamp: testTime, - }, - }, - }, - } - - for i, scenario := range scenarios { - dec := &SampleDecoder{ - Dec: &protoDecoder{r: strings.NewReader(scenario.in)}, - Opts: &DecodeOptions{ - Timestamp: testTime, - }, - } - - var all model.Vector - for { - var smpls model.Vector - err := dec.Decode(&smpls) - if err == io.EOF { - break - } - if scenario.fail { - if err == nil { - t.Fatal("Expected error but got none") - } - break - } - if err != nil { - t.Fatal(err) - } - all = append(all, smpls...) - } - sort.Sort(all) - sort.Sort(scenario.expected) - if !reflect.DeepEqual(all, scenario.expected) { - t.Fatalf("%d. output does not match, want: %#v, got %#v", i, scenario.expected, all) - } - } -} - -func testDiscriminatorHTTPHeader(t testing.TB) { - var scenarios = []struct { - input map[string]string - output Format - err error - }{ - { - input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="io.prometheus.client.MetricFamily"; encoding="delimited"`}, - output: FmtProtoDelim, - }, - { - input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="illegal"; encoding="delimited"`}, - output: FmtUnknown, - }, - { - input: map[string]string{"Content-Type": `application/vnd.google.protobuf; proto="io.prometheus.client.MetricFamily"; encoding="illegal"`}, - output: FmtUnknown, - }, - { - input: map[string]string{"Content-Type": `text/plain; version=0.0.4`}, - output: FmtText, - }, - { - input: map[string]string{"Content-Type": `text/plain`}, - output: FmtText, - }, - { - input: map[string]string{"Content-Type": `text/plain; version=0.0.3`}, - output: FmtUnknown, - }, - } - - for i, scenario := range scenarios { - var header http.Header - - if len(scenario.input) > 0 { - header = http.Header{} - } - - for key, value := range scenario.input { - header.Add(key, value) - } - - actual := ResponseFormat(header) - - if scenario.output != actual { - t.Errorf("%d. expected %s, got %s", i, scenario.output, actual) - } - } -} - -func TestDiscriminatorHTTPHeader(t *testing.T) { - testDiscriminatorHTTPHeader(t) -} - -func BenchmarkDiscriminatorHTTPHeader(b *testing.B) { - for i := 0; i < b.N; i++ { - testDiscriminatorHTTPHeader(b) - } -} - -func TestExtractSamples(t *testing.T) { - var ( - goodMetricFamily1 = &dto.MetricFamily{ - Name: proto.String("foo"), - Help: proto.String("Help for foo."), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Counter: &dto.Counter{ - Value: proto.Float64(4711), - }, - }, - }, - } - goodMetricFamily2 = &dto.MetricFamily{ - Name: proto.String("bar"), - Help: proto.String("Help for bar."), - Type: dto.MetricType_GAUGE.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Gauge: &dto.Gauge{ - Value: proto.Float64(3.14), - }, - }, - }, - } - badMetricFamily = &dto.MetricFamily{ - Name: proto.String("bad"), - Help: proto.String("Help for bad."), - Type: dto.MetricType(42).Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Gauge: &dto.Gauge{ - Value: proto.Float64(2.7), - }, - }, - }, - } - - opts = &DecodeOptions{ - Timestamp: 42, - } - ) - - got, err := ExtractSamples(opts, goodMetricFamily1, goodMetricFamily2) - if err != nil { - t.Error("Unexpected error from ExtractSamples:", err) - } - want := model.Vector{ - &model.Sample{Metric: model.Metric{model.MetricNameLabel: "foo"}, Value: 4711, Timestamp: 42}, - &model.Sample{Metric: model.Metric{model.MetricNameLabel: "bar"}, Value: 3.14, Timestamp: 42}, - } - if !reflect.DeepEqual(got, want) { - t.Errorf("unexpected samples extracted, got: %v, want: %v", got, want) - } - - got, err = ExtractSamples(opts, goodMetricFamily1, badMetricFamily, goodMetricFamily2) - if err == nil { - t.Error("Expected error from ExtractSamples") - } - if !reflect.DeepEqual(got, want) { - t.Errorf("unexpected samples extracted, got: %v, want: %v", got, want) - } -} diff --git a/vendor/github.com/prometheus/common/expfmt/text_create_test.go b/vendor/github.com/prometheus/common/expfmt/text_create_test.go deleted file mode 100644 index e4cc5d8..0000000 --- a/vendor/github.com/prometheus/common/expfmt/text_create_test.go +++ /dev/null @@ -1,443 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package expfmt - -import ( - "bytes" - "math" - "strings" - "testing" - - "github.com/golang/protobuf/proto" - - dto "github.com/prometheus/client_model/go" -) - -func testCreate(t testing.TB) { - var scenarios = []struct { - in *dto.MetricFamily - out string - }{ - // 0: Counter, NaN as value, timestamp given. - { - in: &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("two-line\n doc str\\ing"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val1"), - }, - &dto.LabelPair{ - Name: proto.String("basename"), - Value: proto.String("basevalue"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(math.NaN()), - }, - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val2"), - }, - &dto.LabelPair{ - Name: proto.String("basename"), - Value: proto.String("basevalue"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(.23), - }, - TimestampMs: proto.Int64(1234567890), - }, - }, - }, - out: `# HELP name two-line\n doc str\\ing -# TYPE name counter -name{labelname="val1",basename="basevalue"} NaN -name{labelname="val2",basename="basevalue"} 0.23 1234567890 -`, - }, - // 1: Gauge, some escaping required, +Inf as value, multi-byte characters in label values. - { - in: &dto.MetricFamily{ - Name: proto.String("gauge_name"), - Help: proto.String("gauge\ndoc\nstr\"ing"), - Type: dto.MetricType_GAUGE.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("name_1"), - Value: proto.String("val with\nnew line"), - }, - &dto.LabelPair{ - Name: proto.String("name_2"), - Value: proto.String("val with \\backslash and \"quotes\""), - }, - }, - Gauge: &dto.Gauge{ - Value: proto.Float64(math.Inf(+1)), - }, - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("name_1"), - Value: proto.String("Björn"), - }, - &dto.LabelPair{ - Name: proto.String("name_2"), - Value: proto.String("佖佥"), - }, - }, - Gauge: &dto.Gauge{ - Value: proto.Float64(3.14E42), - }, - }, - }, - }, - out: `# HELP gauge_name gauge\ndoc\nstr"ing -# TYPE gauge_name gauge -gauge_name{name_1="val with\nnew line",name_2="val with \\backslash and \"quotes\""} +Inf -gauge_name{name_1="Björn",name_2="佖佥"} 3.14e+42 -`, - }, - // 2: Untyped, no help, one sample with no labels and -Inf as value, another sample with one label. - { - in: &dto.MetricFamily{ - Name: proto.String("untyped_name"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(math.Inf(-1)), - }, - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("name_1"), - Value: proto.String("value 1"), - }, - }, - Untyped: &dto.Untyped{ - Value: proto.Float64(-1.23e-45), - }, - }, - }, - }, - out: `# TYPE untyped_name untyped -untyped_name -Inf -untyped_name{name_1="value 1"} -1.23e-45 -`, - }, - // 3: Summary. - { - in: &dto.MetricFamily{ - Name: proto.String("summary_name"), - Help: proto.String("summary docstring"), - Type: dto.MetricType_SUMMARY.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Summary: &dto.Summary{ - SampleCount: proto.Uint64(42), - SampleSum: proto.Float64(-3.4567), - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(0.5), - Value: proto.Float64(-1.23), - }, - &dto.Quantile{ - Quantile: proto.Float64(0.9), - Value: proto.Float64(.2342354), - }, - &dto.Quantile{ - Quantile: proto.Float64(0.99), - Value: proto.Float64(0), - }, - }, - }, - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("name_1"), - Value: proto.String("value 1"), - }, - &dto.LabelPair{ - Name: proto.String("name_2"), - Value: proto.String("value 2"), - }, - }, - Summary: &dto.Summary{ - SampleCount: proto.Uint64(4711), - SampleSum: proto.Float64(2010.1971), - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(0.5), - Value: proto.Float64(1), - }, - &dto.Quantile{ - Quantile: proto.Float64(0.9), - Value: proto.Float64(2), - }, - &dto.Quantile{ - Quantile: proto.Float64(0.99), - Value: proto.Float64(3), - }, - }, - }, - }, - }, - }, - out: `# HELP summary_name summary docstring -# TYPE summary_name summary -summary_name{quantile="0.5"} -1.23 -summary_name{quantile="0.9"} 0.2342354 -summary_name{quantile="0.99"} 0 -summary_name_sum -3.4567 -summary_name_count 42 -summary_name{name_1="value 1",name_2="value 2",quantile="0.5"} 1 -summary_name{name_1="value 1",name_2="value 2",quantile="0.9"} 2 -summary_name{name_1="value 1",name_2="value 2",quantile="0.99"} 3 -summary_name_sum{name_1="value 1",name_2="value 2"} 2010.1971 -summary_name_count{name_1="value 1",name_2="value 2"} 4711 -`, - }, - // 4: Histogram - { - in: &dto.MetricFamily{ - Name: proto.String("request_duration_microseconds"), - Help: proto.String("The response latency."), - Type: dto.MetricType_HISTOGRAM.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Histogram: &dto.Histogram{ - SampleCount: proto.Uint64(2693), - SampleSum: proto.Float64(1756047.3), - Bucket: []*dto.Bucket{ - &dto.Bucket{ - UpperBound: proto.Float64(100), - CumulativeCount: proto.Uint64(123), - }, - &dto.Bucket{ - UpperBound: proto.Float64(120), - CumulativeCount: proto.Uint64(412), - }, - &dto.Bucket{ - UpperBound: proto.Float64(144), - CumulativeCount: proto.Uint64(592), - }, - &dto.Bucket{ - UpperBound: proto.Float64(172.8), - CumulativeCount: proto.Uint64(1524), - }, - &dto.Bucket{ - UpperBound: proto.Float64(math.Inf(+1)), - CumulativeCount: proto.Uint64(2693), - }, - }, - }, - }, - }, - }, - out: `# HELP request_duration_microseconds The response latency. -# TYPE request_duration_microseconds histogram -request_duration_microseconds_bucket{le="100"} 123 -request_duration_microseconds_bucket{le="120"} 412 -request_duration_microseconds_bucket{le="144"} 592 -request_duration_microseconds_bucket{le="172.8"} 1524 -request_duration_microseconds_bucket{le="+Inf"} 2693 -request_duration_microseconds_sum 1.7560473e+06 -request_duration_microseconds_count 2693 -`, - }, - // 5: Histogram with missing +Inf bucket. - { - in: &dto.MetricFamily{ - Name: proto.String("request_duration_microseconds"), - Help: proto.String("The response latency."), - Type: dto.MetricType_HISTOGRAM.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Histogram: &dto.Histogram{ - SampleCount: proto.Uint64(2693), - SampleSum: proto.Float64(1756047.3), - Bucket: []*dto.Bucket{ - &dto.Bucket{ - UpperBound: proto.Float64(100), - CumulativeCount: proto.Uint64(123), - }, - &dto.Bucket{ - UpperBound: proto.Float64(120), - CumulativeCount: proto.Uint64(412), - }, - &dto.Bucket{ - UpperBound: proto.Float64(144), - CumulativeCount: proto.Uint64(592), - }, - &dto.Bucket{ - UpperBound: proto.Float64(172.8), - CumulativeCount: proto.Uint64(1524), - }, - }, - }, - }, - }, - }, - out: `# HELP request_duration_microseconds The response latency. -# TYPE request_duration_microseconds histogram -request_duration_microseconds_bucket{le="100"} 123 -request_duration_microseconds_bucket{le="120"} 412 -request_duration_microseconds_bucket{le="144"} 592 -request_duration_microseconds_bucket{le="172.8"} 1524 -request_duration_microseconds_bucket{le="+Inf"} 2693 -request_duration_microseconds_sum 1.7560473e+06 -request_duration_microseconds_count 2693 -`, - }, - // 6: No metric type, should result in default type Counter. - { - in: &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("doc string"), - Metric: []*dto.Metric{ - &dto.Metric{ - Counter: &dto.Counter{ - Value: proto.Float64(math.Inf(-1)), - }, - }, - }, - }, - out: `# HELP name doc string -# TYPE name counter -name -Inf -`, - }, - } - - for i, scenario := range scenarios { - out := bytes.NewBuffer(make([]byte, 0, len(scenario.out))) - n, err := MetricFamilyToText(out, scenario.in) - if err != nil { - t.Errorf("%d. error: %s", i, err) - continue - } - if expected, got := len(scenario.out), n; expected != got { - t.Errorf( - "%d. expected %d bytes written, got %d", - i, expected, got, - ) - } - if expected, got := scenario.out, out.String(); expected != got { - t.Errorf( - "%d. expected out=%q, got %q", - i, expected, got, - ) - } - } - -} - -func TestCreate(t *testing.T) { - testCreate(t) -} - -func BenchmarkCreate(b *testing.B) { - for i := 0; i < b.N; i++ { - testCreate(b) - } -} - -func testCreateError(t testing.TB) { - var scenarios = []struct { - in *dto.MetricFamily - err string - }{ - // 0: No metric. - { - in: &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("doc string"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{}, - }, - err: "MetricFamily has no metrics", - }, - // 1: No metric name. - { - in: &dto.MetricFamily{ - Help: proto.String("doc string"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(math.Inf(-1)), - }, - }, - }, - }, - err: "MetricFamily has no name", - }, - // 2: Wrong type. - { - in: &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("doc string"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(math.Inf(-1)), - }, - }, - }, - }, - err: "expected counter in metric", - }, - } - - for i, scenario := range scenarios { - var out bytes.Buffer - _, err := MetricFamilyToText(&out, scenario.in) - if err == nil { - t.Errorf("%d. expected error, got nil", i) - continue - } - if expected, got := scenario.err, err.Error(); strings.Index(got, expected) != 0 { - t.Errorf( - "%d. expected error starting with %q, got %q", - i, expected, got, - ) - } - } - -} - -func TestCreateError(t *testing.T) { - testCreateError(t) -} - -func BenchmarkCreateError(b *testing.B) { - for i := 0; i < b.N; i++ { - testCreateError(b) - } -} diff --git a/vendor/github.com/prometheus/common/expfmt/text_parse_test.go b/vendor/github.com/prometheus/common/expfmt/text_parse_test.go deleted file mode 100644 index 76c9511..0000000 --- a/vendor/github.com/prometheus/common/expfmt/text_parse_test.go +++ /dev/null @@ -1,593 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package expfmt - -import ( - "math" - "strings" - "testing" - - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" -) - -func testTextParse(t testing.TB) { - var scenarios = []struct { - in string - out []*dto.MetricFamily - }{ - // 0: Empty lines as input. - { - in: ` - -`, - out: []*dto.MetricFamily{}, - }, - // 1: Minimal case. - { - in: ` -minimal_metric 1.234 -another_metric -3e3 103948 -# Even that: -no_labels{} 3 -# HELP line for non-existing metric will be ignored. -`, - out: []*dto.MetricFamily{ - &dto.MetricFamily{ - Name: proto.String("minimal_metric"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(1.234), - }, - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("another_metric"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(-3e3), - }, - TimestampMs: proto.Int64(103948), - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("no_labels"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(3), - }, - }, - }, - }, - }, - }, - // 2: Counters & gauges, docstrings, various whitespace, escape sequences. - { - in: ` -# A normal comment. -# -# TYPE name counter -name{labelname="val1",basename="basevalue"} NaN -name {labelname="val2",basename="base\"v\\al\nue"} 0.23 1234567890 -# HELP name two-line\n doc str\\ing - - # HELP name2 doc str"ing 2 - # TYPE name2 gauge -name2{labelname="val2" ,basename = "basevalue2" } +Inf 54321 -name2{ labelname = "val1" , }-Inf -`, - out: []*dto.MetricFamily{ - &dto.MetricFamily{ - Name: proto.String("name"), - Help: proto.String("two-line\n doc str\\ing"), - Type: dto.MetricType_COUNTER.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val1"), - }, - &dto.LabelPair{ - Name: proto.String("basename"), - Value: proto.String("basevalue"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(math.NaN()), - }, - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val2"), - }, - &dto.LabelPair{ - Name: proto.String("basename"), - Value: proto.String("base\"v\\al\nue"), - }, - }, - Counter: &dto.Counter{ - Value: proto.Float64(.23), - }, - TimestampMs: proto.Int64(1234567890), - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("name2"), - Help: proto.String("doc str\"ing 2"), - Type: dto.MetricType_GAUGE.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val2"), - }, - &dto.LabelPair{ - Name: proto.String("basename"), - Value: proto.String("basevalue2"), - }, - }, - Gauge: &dto.Gauge{ - Value: proto.Float64(math.Inf(+1)), - }, - TimestampMs: proto.Int64(54321), - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("labelname"), - Value: proto.String("val1"), - }, - }, - Gauge: &dto.Gauge{ - Value: proto.Float64(math.Inf(-1)), - }, - }, - }, - }, - }, - }, - // 3: The evil summary, mixed with other types and funny comments. - { - in: ` -# TYPE my_summary summary -my_summary{n1="val1",quantile="0.5"} 110 -decoy -1 -2 -my_summary{n1="val1",quantile="0.9"} 140 1 -my_summary_count{n1="val1"} 42 -# Latest timestamp wins in case of a summary. -my_summary_sum{n1="val1"} 4711 2 -fake_sum{n1="val1"} 2001 -# TYPE another_summary summary -another_summary_count{n2="val2",n1="val1"} 20 -my_summary_count{n2="val2",n1="val1"} 5 5 -another_summary{n1="val1",n2="val2",quantile=".3"} -1.2 -my_summary_sum{n1="val2"} 08 15 -my_summary{n1="val3", quantile="0.2"} 4711 - my_summary{n1="val1",n2="val2",quantile="-12.34",} NaN -# some -# funny comments -# HELP -# HELP -# HELP my_summary -# HELP my_summary -`, - out: []*dto.MetricFamily{ - &dto.MetricFamily{ - Name: proto.String("fake_sum"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val1"), - }, - }, - Untyped: &dto.Untyped{ - Value: proto.Float64(2001), - }, - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("decoy"), - Type: dto.MetricType_UNTYPED.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Untyped: &dto.Untyped{ - Value: proto.Float64(-1), - }, - TimestampMs: proto.Int64(-2), - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("my_summary"), - Type: dto.MetricType_SUMMARY.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val1"), - }, - }, - Summary: &dto.Summary{ - SampleCount: proto.Uint64(42), - SampleSum: proto.Float64(4711), - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(0.5), - Value: proto.Float64(110), - }, - &dto.Quantile{ - Quantile: proto.Float64(0.9), - Value: proto.Float64(140), - }, - }, - }, - TimestampMs: proto.Int64(2), - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n2"), - Value: proto.String("val2"), - }, - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val1"), - }, - }, - Summary: &dto.Summary{ - SampleCount: proto.Uint64(5), - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(-12.34), - Value: proto.Float64(math.NaN()), - }, - }, - }, - TimestampMs: proto.Int64(5), - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val2"), - }, - }, - Summary: &dto.Summary{ - SampleSum: proto.Float64(8), - }, - TimestampMs: proto.Int64(15), - }, - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val3"), - }, - }, - Summary: &dto.Summary{ - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(0.2), - Value: proto.Float64(4711), - }, - }, - }, - }, - }, - }, - &dto.MetricFamily{ - Name: proto.String("another_summary"), - Type: dto.MetricType_SUMMARY.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Label: []*dto.LabelPair{ - &dto.LabelPair{ - Name: proto.String("n2"), - Value: proto.String("val2"), - }, - &dto.LabelPair{ - Name: proto.String("n1"), - Value: proto.String("val1"), - }, - }, - Summary: &dto.Summary{ - SampleCount: proto.Uint64(20), - Quantile: []*dto.Quantile{ - &dto.Quantile{ - Quantile: proto.Float64(0.3), - Value: proto.Float64(-1.2), - }, - }, - }, - }, - }, - }, - }, - }, - // 4: The histogram. - { - in: ` -# HELP request_duration_microseconds The response latency. -# TYPE request_duration_microseconds histogram -request_duration_microseconds_bucket{le="100"} 123 -request_duration_microseconds_bucket{le="120"} 412 -request_duration_microseconds_bucket{le="144"} 592 -request_duration_microseconds_bucket{le="172.8"} 1524 -request_duration_microseconds_bucket{le="+Inf"} 2693 -request_duration_microseconds_sum 1.7560473e+06 -request_duration_microseconds_count 2693 -`, - out: []*dto.MetricFamily{ - { - Name: proto.String("request_duration_microseconds"), - Help: proto.String("The response latency."), - Type: dto.MetricType_HISTOGRAM.Enum(), - Metric: []*dto.Metric{ - &dto.Metric{ - Histogram: &dto.Histogram{ - SampleCount: proto.Uint64(2693), - SampleSum: proto.Float64(1756047.3), - Bucket: []*dto.Bucket{ - &dto.Bucket{ - UpperBound: proto.Float64(100), - CumulativeCount: proto.Uint64(123), - }, - &dto.Bucket{ - UpperBound: proto.Float64(120), - CumulativeCount: proto.Uint64(412), - }, - &dto.Bucket{ - UpperBound: proto.Float64(144), - CumulativeCount: proto.Uint64(592), - }, - &dto.Bucket{ - UpperBound: proto.Float64(172.8), - CumulativeCount: proto.Uint64(1524), - }, - &dto.Bucket{ - UpperBound: proto.Float64(math.Inf(+1)), - CumulativeCount: proto.Uint64(2693), - }, - }, - }, - }, - }, - }, - }, - }, - } - - for i, scenario := range scenarios { - out, err := parser.TextToMetricFamilies(strings.NewReader(scenario.in)) - if err != nil { - t.Errorf("%d. error: %s", i, err) - continue - } - if expected, got := len(scenario.out), len(out); expected != got { - t.Errorf( - "%d. expected %d MetricFamilies, got %d", - i, expected, got, - ) - } - for _, expected := range scenario.out { - got, ok := out[expected.GetName()] - if !ok { - t.Errorf( - "%d. expected MetricFamily %q, found none", - i, expected.GetName(), - ) - continue - } - if expected.String() != got.String() { - t.Errorf( - "%d. expected MetricFamily %s, got %s", - i, expected, got, - ) - } - } - } -} - -func TestTextParse(t *testing.T) { - testTextParse(t) -} - -func BenchmarkTextParse(b *testing.B) { - for i := 0; i < b.N; i++ { - testTextParse(b) - } -} - -func testTextParseError(t testing.TB) { - var scenarios = []struct { - in string - err string - }{ - // 0: No new-line at end of input. - { - in: ` -bla 3.14 -blubber 42`, - err: "text format parsing error in line 3: unexpected end of input stream", - }, - // 1: Invalid escape sequence in label value. - { - in: `metric{label="\t"} 3.14`, - err: "text format parsing error in line 1: invalid escape sequence", - }, - // 2: Newline in label value. - { - in: ` -metric{label="new -line"} 3.14 -`, - err: `text format parsing error in line 2: label value "new" contains unescaped new-line`, - }, - // 3: - { - in: `metric{@="bla"} 3.14`, - err: "text format parsing error in line 1: invalid label name for metric", - }, - // 4: - { - in: `metric{__name__="bla"} 3.14`, - err: `text format parsing error in line 1: label name "__name__" is reserved`, - }, - // 5: - { - in: `metric{label+="bla"} 3.14`, - err: "text format parsing error in line 1: expected '=' after label name", - }, - // 6: - { - in: `metric{label=bla} 3.14`, - err: "text format parsing error in line 1: expected '\"' at start of label value", - }, - // 7: - { - in: ` -# TYPE metric summary -metric{quantile="bla"} 3.14 -`, - err: "text format parsing error in line 3: expected float as value for 'quantile' label", - }, - // 8: - { - in: `metric{label="bla"+} 3.14`, - err: "text format parsing error in line 1: unexpected end of label value", - }, - // 9: - { - in: `metric{label="bla"} 3.14 2.72 -`, - err: "text format parsing error in line 1: expected integer as timestamp", - }, - // 10: - { - in: `metric{label="bla"} 3.14 2 3 -`, - err: "text format parsing error in line 1: spurious string after timestamp", - }, - // 11: - { - in: `metric{label="bla"} blubb -`, - err: "text format parsing error in line 1: expected float as value", - }, - // 12: - { - in: ` -# HELP metric one -# HELP metric two -`, - err: "text format parsing error in line 3: second HELP line for metric name", - }, - // 13: - { - in: ` -# TYPE metric counter -# TYPE metric untyped -`, - err: `text format parsing error in line 3: second TYPE line for metric name "metric", or TYPE reported after samples`, - }, - // 14: - { - in: ` -metric 4.12 -# TYPE metric counter -`, - err: `text format parsing error in line 3: second TYPE line for metric name "metric", or TYPE reported after samples`, - }, - // 14: - { - in: ` -# TYPE metric bla -`, - err: "text format parsing error in line 2: unknown metric type", - }, - // 15: - { - in: ` -# TYPE met-ric -`, - err: "text format parsing error in line 2: invalid metric name in comment", - }, - // 16: - { - in: `@invalidmetric{label="bla"} 3.14 2`, - err: "text format parsing error in line 1: invalid metric name", - }, - // 17: - { - in: `{label="bla"} 3.14 2`, - err: "text format parsing error in line 1: invalid metric name", - }, - // 18: - { - in: ` -# TYPE metric histogram -metric_bucket{le="bla"} 3.14 -`, - err: "text format parsing error in line 3: expected float as value for 'le' label", - }, - // 19: Invalid UTF-8 in label value. - { - in: "metric{l=\"\xbd\"} 3.14\n", - err: "text format parsing error in line 1: invalid label value \"\\xbd\"", - }, - } - - for i, scenario := range scenarios { - _, err := parser.TextToMetricFamilies(strings.NewReader(scenario.in)) - if err == nil { - t.Errorf("%d. expected error, got nil", i) - continue - } - if expected, got := scenario.err, err.Error(); strings.Index(got, expected) != 0 { - t.Errorf( - "%d. expected error starting with %q, got %q", - i, expected, got, - ) - } - } - -} - -func TestTextParseError(t *testing.T) { - testTextParseError(t) -} - -func BenchmarkParseError(b *testing.B) { - for i := 0; i < b.N; i++ { - testTextParseError(b) - } -} diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go deleted file mode 100644 index 41d328f..0000000 --- a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package goautoneg - -import ( - "testing" -) - -var chrome = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" - -func TestParseAccept(t *testing.T) { - alternatives := []string{"text/html", "image/png"} - content_type := Negotiate(chrome, alternatives) - if content_type != "image/png" { - t.Errorf("got %s expected image/png", content_type) - } - - alternatives = []string{"text/html", "text/plain", "text/n3"} - content_type = Negotiate(chrome, alternatives) - if content_type != "text/html" { - t.Errorf("got %s expected text/html", content_type) - } - - alternatives = []string{"text/n3", "text/plain"} - content_type = Negotiate(chrome, alternatives) - if content_type != "text/plain" { - t.Errorf("got %s expected text/plain", content_type) - } - - alternatives = []string{"text/n3", "application/rdf+xml"} - content_type = Negotiate(chrome, alternatives) - if content_type != "text/n3" { - t.Errorf("got %s expected text/n3", content_type) - } -} diff --git a/vendor/github.com/prometheus/common/model/alert_test.go b/vendor/github.com/prometheus/common/model/alert_test.go deleted file mode 100644 index 9692bca..0000000 --- a/vendor/github.com/prometheus/common/model/alert_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package model - -import ( - "strings" - "testing" - "time" -) - -func TestAlertValidate(t *testing.T) { - ts := time.Now() - - var cases = []struct { - alert *Alert - err string - }{ - { - alert: &Alert{ - Labels: LabelSet{"a": "b"}, - StartsAt: ts, - }, - }, - { - alert: &Alert{ - Labels: LabelSet{"a": "b"}, - }, - err: "start time missing", - }, - { - alert: &Alert{ - Labels: LabelSet{"a": "b"}, - StartsAt: ts, - EndsAt: ts, - }, - }, - { - alert: &Alert{ - Labels: LabelSet{"a": "b"}, - StartsAt: ts, - EndsAt: ts.Add(1 * time.Minute), - }, - }, - { - alert: &Alert{ - Labels: LabelSet{"a": "b"}, - StartsAt: ts, - EndsAt: ts.Add(-1 * time.Minute), - }, - err: "start time must be before end time", - }, - { - alert: &Alert{ - StartsAt: ts, - }, - err: "at least one label pair required", - }, - { - alert: &Alert{ - Labels: LabelSet{"a": "b", "!bad": "label"}, - StartsAt: ts, - }, - err: "invalid label set: invalid name", - }, - { - alert: &Alert{ - Labels: LabelSet{"a": "b", "bad": "\xfflabel"}, - StartsAt: ts, - }, - err: "invalid label set: invalid value", - }, - { - alert: &Alert{ - Labels: LabelSet{"a": "b"}, - Annotations: LabelSet{"!bad": "label"}, - StartsAt: ts, - }, - err: "invalid annotations: invalid name", - }, - { - alert: &Alert{ - Labels: LabelSet{"a": "b"}, - Annotations: LabelSet{"bad": "\xfflabel"}, - StartsAt: ts, - }, - err: "invalid annotations: invalid value", - }, - } - - for i, c := range cases { - err := c.alert.Validate() - if err == nil { - if c.err == "" { - continue - } - t.Errorf("%d. Expected error %q but got none", i, c.err) - continue - } - if c.err == "" && err != nil { - t.Errorf("%d. Expected no error but got %q", i, err) - continue - } - if !strings.Contains(err.Error(), c.err) { - t.Errorf("%d. Expected error to contain %q but got %q", i, c.err, err) - } - } -} diff --git a/vendor/github.com/prometheus/common/model/labels_test.go b/vendor/github.com/prometheus/common/model/labels_test.go deleted file mode 100644 index e8df28f..0000000 --- a/vendor/github.com/prometheus/common/model/labels_test.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package model - -import ( - "sort" - "testing" -) - -func testLabelNames(t testing.TB) { - var scenarios = []struct { - in LabelNames - out LabelNames - }{ - { - in: LabelNames{"ZZZ", "zzz"}, - out: LabelNames{"ZZZ", "zzz"}, - }, - { - in: LabelNames{"aaa", "AAA"}, - out: LabelNames{"AAA", "aaa"}, - }, - } - - for i, scenario := range scenarios { - sort.Sort(scenario.in) - - for j, expected := range scenario.out { - if expected != scenario.in[j] { - t.Errorf("%d.%d expected %s, got %s", i, j, expected, scenario.in[j]) - } - } - } -} - -func TestLabelNames(t *testing.T) { - testLabelNames(t) -} - -func BenchmarkLabelNames(b *testing.B) { - for i := 0; i < b.N; i++ { - testLabelNames(b) - } -} - -func testLabelValues(t testing.TB) { - var scenarios = []struct { - in LabelValues - out LabelValues - }{ - { - in: LabelValues{"ZZZ", "zzz"}, - out: LabelValues{"ZZZ", "zzz"}, - }, - { - in: LabelValues{"aaa", "AAA"}, - out: LabelValues{"AAA", "aaa"}, - }, - } - - for i, scenario := range scenarios { - sort.Sort(scenario.in) - - for j, expected := range scenario.out { - if expected != scenario.in[j] { - t.Errorf("%d.%d expected %s, got %s", i, j, expected, scenario.in[j]) - } - } - } -} - -func TestLabelValues(t *testing.T) { - testLabelValues(t) -} - -func BenchmarkLabelValues(b *testing.B) { - for i := 0; i < b.N; i++ { - testLabelValues(b) - } -} - -func TestLabelNameIsValid(t *testing.T) { - var scenarios = []struct { - ln LabelName - valid bool - }{ - { - ln: "Avalid_23name", - valid: true, - }, - { - ln: "_Avalid_23name", - valid: true, - }, - { - ln: "1valid_23name", - valid: false, - }, - { - ln: "avalid_23name", - valid: true, - }, - { - ln: "Ava:lid_23name", - valid: false, - }, - { - ln: "a lid_23name", - valid: false, - }, - { - ln: ":leading_colon", - valid: false, - }, - { - ln: "colon:in:the:middle", - valid: false, - }, - } - - for _, s := range scenarios { - if s.ln.IsValid() != s.valid { - t.Errorf("Expected %v for %q using IsValid method", s.valid, s.ln) - } - if LabelNameRE.MatchString(string(s.ln)) != s.valid { - t.Errorf("Expected %v for %q using regexp match", s.valid, s.ln) - } - } -} diff --git a/vendor/github.com/prometheus/common/model/metric_test.go b/vendor/github.com/prometheus/common/model/metric_test.go deleted file mode 100644 index 06f9de5..0000000 --- a/vendor/github.com/prometheus/common/model/metric_test.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package model - -import "testing" - -func testMetric(t testing.TB) { - var scenarios = []struct { - input LabelSet - fingerprint Fingerprint - fastFingerprint Fingerprint - }{ - { - input: LabelSet{}, - fingerprint: 14695981039346656037, - fastFingerprint: 14695981039346656037, - }, - { - input: LabelSet{ - "first_name": "electro", - "occupation": "robot", - "manufacturer": "westinghouse", - }, - fingerprint: 5911716720268894962, - fastFingerprint: 11310079640881077873, - }, - { - input: LabelSet{ - "x": "y", - }, - fingerprint: 8241431561484471700, - fastFingerprint: 13948396922932177635, - }, - { - input: LabelSet{ - "a": "bb", - "b": "c", - }, - fingerprint: 3016285359649981711, - fastFingerprint: 3198632812309449502, - }, - { - input: LabelSet{ - "a": "b", - "bb": "c", - }, - fingerprint: 7122421792099404749, - fastFingerprint: 5774953389407657638, - }, - } - - for i, scenario := range scenarios { - input := Metric(scenario.input) - - if scenario.fingerprint != input.Fingerprint() { - t.Errorf("%d. expected %d, got %d", i, scenario.fingerprint, input.Fingerprint()) - } - if scenario.fastFingerprint != input.FastFingerprint() { - t.Errorf("%d. expected %d, got %d", i, scenario.fastFingerprint, input.FastFingerprint()) - } - } -} - -func TestMetric(t *testing.T) { - testMetric(t) -} - -func BenchmarkMetric(b *testing.B) { - for i := 0; i < b.N; i++ { - testMetric(b) - } -} - -func TestMetricNameIsValid(t *testing.T) { - var scenarios = []struct { - mn LabelValue - valid bool - }{ - { - mn: "Avalid_23name", - valid: true, - }, - { - mn: "_Avalid_23name", - valid: true, - }, - { - mn: "1valid_23name", - valid: false, - }, - { - mn: "avalid_23name", - valid: true, - }, - { - mn: "Ava:lid_23name", - valid: true, - }, - { - mn: "a lid_23name", - valid: false, - }, - { - mn: ":leading_colon", - valid: true, - }, - { - mn: "colon:in:the:middle", - valid: true, - }, - } - - for _, s := range scenarios { - if IsValidMetricName(s.mn) != s.valid { - t.Errorf("Expected %v for %q using IsValidMetricName function", s.valid, s.mn) - } - if MetricNameRE.MatchString(string(s.mn)) != s.valid { - t.Errorf("Expected %v for %q using regexp matching", s.valid, s.mn) - } - } -} diff --git a/vendor/github.com/prometheus/common/model/signature_test.go b/vendor/github.com/prometheus/common/model/signature_test.go deleted file mode 100644 index d59c8a8..0000000 --- a/vendor/github.com/prometheus/common/model/signature_test.go +++ /dev/null @@ -1,314 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package model - -import ( - "runtime" - "sync" - "testing" -) - -func TestLabelsToSignature(t *testing.T) { - var scenarios = []struct { - in map[string]string - out uint64 - }{ - { - in: map[string]string{}, - out: 14695981039346656037, - }, - { - in: map[string]string{"name": "garland, briggs", "fear": "love is not enough"}, - out: 5799056148416392346, - }, - } - - for i, scenario := range scenarios { - actual := LabelsToSignature(scenario.in) - - if actual != scenario.out { - t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) - } - } -} - -func TestMetricToFingerprint(t *testing.T) { - var scenarios = []struct { - in LabelSet - out Fingerprint - }{ - { - in: LabelSet{}, - out: 14695981039346656037, - }, - { - in: LabelSet{"name": "garland, briggs", "fear": "love is not enough"}, - out: 5799056148416392346, - }, - } - - for i, scenario := range scenarios { - actual := labelSetToFingerprint(scenario.in) - - if actual != scenario.out { - t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) - } - } -} - -func TestMetricToFastFingerprint(t *testing.T) { - var scenarios = []struct { - in LabelSet - out Fingerprint - }{ - { - in: LabelSet{}, - out: 14695981039346656037, - }, - { - in: LabelSet{"name": "garland, briggs", "fear": "love is not enough"}, - out: 12952432476264840823, - }, - } - - for i, scenario := range scenarios { - actual := labelSetToFastFingerprint(scenario.in) - - if actual != scenario.out { - t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) - } - } -} - -func TestSignatureForLabels(t *testing.T) { - var scenarios = []struct { - in Metric - labels LabelNames - out uint64 - }{ - { - in: Metric{}, - labels: nil, - out: 14695981039346656037, - }, - { - in: Metric{}, - labels: LabelNames{"empty"}, - out: 7187873163539638612, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: LabelNames{"empty"}, - out: 7187873163539638612, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: LabelNames{"fear", "name"}, - out: 5799056148416392346, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough", "foo": "bar"}, - labels: LabelNames{"fear", "name"}, - out: 5799056148416392346, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: LabelNames{}, - out: 14695981039346656037, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: nil, - out: 14695981039346656037, - }, - } - - for i, scenario := range scenarios { - actual := SignatureForLabels(scenario.in, scenario.labels...) - - if actual != scenario.out { - t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) - } - } -} - -func TestSignatureWithoutLabels(t *testing.T) { - var scenarios = []struct { - in Metric - labels map[LabelName]struct{} - out uint64 - }{ - { - in: Metric{}, - labels: nil, - out: 14695981039346656037, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: map[LabelName]struct{}{"fear": struct{}{}, "name": struct{}{}}, - out: 14695981039346656037, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough", "foo": "bar"}, - labels: map[LabelName]struct{}{"foo": struct{}{}}, - out: 5799056148416392346, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: map[LabelName]struct{}{}, - out: 5799056148416392346, - }, - { - in: Metric{"name": "garland, briggs", "fear": "love is not enough"}, - labels: nil, - out: 5799056148416392346, - }, - } - - for i, scenario := range scenarios { - actual := SignatureWithoutLabels(scenario.in, scenario.labels) - - if actual != scenario.out { - t.Errorf("%d. expected %d, got %d", i, scenario.out, actual) - } - } -} - -func benchmarkLabelToSignature(b *testing.B, l map[string]string, e uint64) { - for i := 0; i < b.N; i++ { - if a := LabelsToSignature(l); a != e { - b.Fatalf("expected signature of %d for %s, got %d", e, l, a) - } - } -} - -func BenchmarkLabelToSignatureScalar(b *testing.B) { - benchmarkLabelToSignature(b, nil, 14695981039346656037) -} - -func BenchmarkLabelToSignatureSingle(b *testing.B) { - benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value"}, 5146282821936882169) -} - -func BenchmarkLabelToSignatureDouble(b *testing.B) { - benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value", "second-label": "second-label-value"}, 3195800080984914717) -} - -func BenchmarkLabelToSignatureTriple(b *testing.B) { - benchmarkLabelToSignature(b, map[string]string{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 13843036195897128121) -} - -func benchmarkMetricToFingerprint(b *testing.B, ls LabelSet, e Fingerprint) { - for i := 0; i < b.N; i++ { - if a := labelSetToFingerprint(ls); a != e { - b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) - } - } -} - -func BenchmarkMetricToFingerprintScalar(b *testing.B) { - benchmarkMetricToFingerprint(b, nil, 14695981039346656037) -} - -func BenchmarkMetricToFingerprintSingle(b *testing.B) { - benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value"}, 5146282821936882169) -} - -func BenchmarkMetricToFingerprintDouble(b *testing.B) { - benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value"}, 3195800080984914717) -} - -func BenchmarkMetricToFingerprintTriple(b *testing.B) { - benchmarkMetricToFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 13843036195897128121) -} - -func benchmarkMetricToFastFingerprint(b *testing.B, ls LabelSet, e Fingerprint) { - for i := 0; i < b.N; i++ { - if a := labelSetToFastFingerprint(ls); a != e { - b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) - } - } -} - -func BenchmarkMetricToFastFingerprintScalar(b *testing.B) { - benchmarkMetricToFastFingerprint(b, nil, 14695981039346656037) -} - -func BenchmarkMetricToFastFingerprintSingle(b *testing.B) { - benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value"}, 5147259542624943964) -} - -func BenchmarkMetricToFastFingerprintDouble(b *testing.B) { - benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value"}, 18269973311206963528) -} - -func BenchmarkMetricToFastFingerprintTriple(b *testing.B) { - benchmarkMetricToFastFingerprint(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676) -} - -func BenchmarkEmptyLabelSignature(b *testing.B) { - input := []map[string]string{nil, {}} - - var ms runtime.MemStats - runtime.ReadMemStats(&ms) - - alloc := ms.Alloc - - for _, labels := range input { - LabelsToSignature(labels) - } - - runtime.ReadMemStats(&ms) - - if got := ms.Alloc; alloc != got { - b.Fatal("expected LabelsToSignature with empty labels not to perform allocations") - } -} - -func benchmarkMetricToFastFingerprintConc(b *testing.B, ls LabelSet, e Fingerprint, concLevel int) { - var start, end sync.WaitGroup - start.Add(1) - end.Add(concLevel) - - for i := 0; i < concLevel; i++ { - go func() { - start.Wait() - for j := b.N / concLevel; j >= 0; j-- { - if a := labelSetToFastFingerprint(ls); a != e { - b.Fatalf("expected signature of %d for %s, got %d", e, ls, a) - } - } - end.Done() - }() - } - b.ResetTimer() - start.Done() - end.Wait() -} - -func BenchmarkMetricToFastFingerprintTripleConc1(b *testing.B) { - benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 1) -} - -func BenchmarkMetricToFastFingerprintTripleConc2(b *testing.B) { - benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 2) -} - -func BenchmarkMetricToFastFingerprintTripleConc4(b *testing.B) { - benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 4) -} - -func BenchmarkMetricToFastFingerprintTripleConc8(b *testing.B) { - benchmarkMetricToFastFingerprintConc(b, LabelSet{"first-label": "first-label-value", "second-label": "second-label-value", "third-label": "third-label-value"}, 15738406913934009676, 8) -} diff --git a/vendor/github.com/prometheus/common/model/silence_test.go b/vendor/github.com/prometheus/common/model/silence_test.go deleted file mode 100644 index 8eaaf07..0000000 --- a/vendor/github.com/prometheus/common/model/silence_test.go +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright 2015 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package model - -import ( - "strings" - "testing" - "time" -) - -func TestMatcherValidate(t *testing.T) { - var cases = []struct { - matcher *Matcher - err string - }{ - { - matcher: &Matcher{ - Name: "name", - Value: "value", - }, - }, - { - matcher: &Matcher{ - Name: "name", - Value: "value", - IsRegex: true, - }, - }, - { - matcher: &Matcher{ - Name: "name!", - Value: "value", - }, - err: "invalid name", - }, - { - matcher: &Matcher{ - Name: "", - Value: "value", - }, - err: "invalid name", - }, - { - matcher: &Matcher{ - Name: "name", - Value: "value\xff", - }, - err: "invalid value", - }, - { - matcher: &Matcher{ - Name: "name", - Value: "", - }, - err: "invalid value", - }, - } - - for i, c := range cases { - err := c.matcher.Validate() - if err == nil { - if c.err == "" { - continue - } - t.Errorf("%d. Expected error %q but got none", i, c.err) - continue - } - if c.err == "" && err != nil { - t.Errorf("%d. Expected no error but got %q", i, err) - continue - } - if !strings.Contains(err.Error(), c.err) { - t.Errorf("%d. Expected error to contain %q but got %q", i, c.err, err) - } - } -} - -func TestSilenceValidate(t *testing.T) { - ts := time.Now() - - var cases = []struct { - sil *Silence - err string - }{ - { - sil: &Silence{ - Matchers: []*Matcher{ - {Name: "name", Value: "value"}, - }, - StartsAt: ts, - EndsAt: ts, - CreatedAt: ts, - CreatedBy: "name", - Comment: "comment", - }, - }, - { - sil: &Silence{ - Matchers: []*Matcher{ - {Name: "name", Value: "value"}, - {Name: "name", Value: "value"}, - {Name: "name", Value: "value"}, - {Name: "name", Value: "value", IsRegex: true}, - }, - StartsAt: ts, - EndsAt: ts, - CreatedAt: ts, - CreatedBy: "name", - Comment: "comment", - }, - }, - { - sil: &Silence{ - Matchers: []*Matcher{ - {Name: "name", Value: "value"}, - }, - StartsAt: ts, - EndsAt: ts.Add(-1 * time.Minute), - CreatedAt: ts, - CreatedBy: "name", - Comment: "comment", - }, - err: "start time must be before end time", - }, - { - sil: &Silence{ - Matchers: []*Matcher{ - {Name: "name", Value: "value"}, - }, - StartsAt: ts, - CreatedAt: ts, - CreatedBy: "name", - Comment: "comment", - }, - err: "end time missing", - }, - { - sil: &Silence{ - Matchers: []*Matcher{ - {Name: "name", Value: "value"}, - }, - EndsAt: ts, - CreatedAt: ts, - CreatedBy: "name", - Comment: "comment", - }, - err: "start time missing", - }, - { - sil: &Silence{ - Matchers: []*Matcher{ - {Name: "!name", Value: "value"}, - }, - StartsAt: ts, - EndsAt: ts, - CreatedAt: ts, - CreatedBy: "name", - Comment: "comment", - }, - err: "invalid matcher", - }, - { - sil: &Silence{ - Matchers: []*Matcher{ - {Name: "name", Value: "value"}, - }, - StartsAt: ts, - EndsAt: ts, - CreatedAt: ts, - CreatedBy: "name", - }, - err: "comment missing", - }, - { - sil: &Silence{ - Matchers: []*Matcher{ - {Name: "name", Value: "value"}, - }, - StartsAt: ts, - EndsAt: ts, - CreatedBy: "name", - Comment: "comment", - }, - err: "creation timestamp missing", - }, - { - sil: &Silence{ - Matchers: []*Matcher{ - {Name: "name", Value: "value"}, - }, - StartsAt: ts, - EndsAt: ts, - CreatedAt: ts, - Comment: "comment", - }, - err: "creator information missing", - }, - } - - for i, c := range cases { - err := c.sil.Validate() - if err == nil { - if c.err == "" { - continue - } - t.Errorf("%d. Expected error %q but got none", i, c.err) - continue - } - if c.err == "" && err != nil { - t.Errorf("%d. Expected no error but got %q", i, err) - continue - } - if !strings.Contains(err.Error(), c.err) { - t.Errorf("%d. Expected error to contain %q but got %q", i, c.err, err) - } - } -} diff --git a/vendor/github.com/prometheus/common/model/time_test.go b/vendor/github.com/prometheus/common/model/time_test.go deleted file mode 100644 index 3efdd65..0000000 --- a/vendor/github.com/prometheus/common/model/time_test.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package model - -import ( - "testing" - "time" -) - -func TestComparators(t *testing.T) { - t1a := TimeFromUnix(0) - t1b := TimeFromUnix(0) - t2 := TimeFromUnix(2*second - 1) - - if !t1a.Equal(t1b) { - t.Fatalf("Expected %s to be equal to %s", t1a, t1b) - } - if t1a.Equal(t2) { - t.Fatalf("Expected %s to not be equal to %s", t1a, t2) - } - - if !t1a.Before(t2) { - t.Fatalf("Expected %s to be before %s", t1a, t2) - } - if t1a.Before(t1b) { - t.Fatalf("Expected %s to not be before %s", t1a, t1b) - } - - if !t2.After(t1a) { - t.Fatalf("Expected %s to be after %s", t2, t1a) - } - if t1b.After(t1a) { - t.Fatalf("Expected %s to not be after %s", t1b, t1a) - } -} - -func TestTimeConversions(t *testing.T) { - unixSecs := int64(1136239445) - unixNsecs := int64(123456789) - unixNano := unixSecs*1e9 + unixNsecs - - t1 := time.Unix(unixSecs, unixNsecs-unixNsecs%nanosPerTick) - t2 := time.Unix(unixSecs, unixNsecs) - - ts := TimeFromUnixNano(unixNano) - if !ts.Time().Equal(t1) { - t.Fatalf("Expected %s, got %s", t1, ts.Time()) - } - - // Test available precision. - ts = TimeFromUnixNano(t2.UnixNano()) - if !ts.Time().Equal(t1) { - t.Fatalf("Expected %s, got %s", t1, ts.Time()) - } - - if ts.UnixNano() != unixNano-unixNano%nanosPerTick { - t.Fatalf("Expected %d, got %d", unixNano, ts.UnixNano()) - } -} - -func TestDuration(t *testing.T) { - duration := time.Second + time.Minute + time.Hour - goTime := time.Unix(1136239445, 0) - - ts := TimeFromUnix(goTime.Unix()) - if !goTime.Add(duration).Equal(ts.Add(duration).Time()) { - t.Fatalf("Expected %s to be equal to %s", goTime.Add(duration), ts.Add(duration)) - } - - earlier := ts.Add(-duration) - delta := ts.Sub(earlier) - if delta != duration { - t.Fatalf("Expected %s to be equal to %s", delta, duration) - } -} - -func TestParseDuration(t *testing.T) { - var cases = []struct { - in string - out time.Duration - }{ - { - in: "0s", - out: 0, - }, { - in: "324ms", - out: 324 * time.Millisecond, - }, { - in: "3s", - out: 3 * time.Second, - }, { - in: "5m", - out: 5 * time.Minute, - }, { - in: "1h", - out: time.Hour, - }, { - in: "4d", - out: 4 * 24 * time.Hour, - }, { - in: "3w", - out: 3 * 7 * 24 * time.Hour, - }, { - in: "10y", - out: 10 * 365 * 24 * time.Hour, - }, - } - - for _, c := range cases { - d, err := ParseDuration(c.in) - if err != nil { - t.Errorf("Unexpected error on input %q", c.in) - } - if time.Duration(d) != c.out { - t.Errorf("Expected %v but got %v", c.out, d) - } - if d.String() != c.in { - t.Errorf("Expected duration string %q but got %q", c.in, d.String()) - } - } -} diff --git a/vendor/github.com/prometheus/common/model/value_test.go b/vendor/github.com/prometheus/common/model/value_test.go deleted file mode 100644 index b97dcf8..0000000 --- a/vendor/github.com/prometheus/common/model/value_test.go +++ /dev/null @@ -1,468 +0,0 @@ -// Copyright 2013 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package model - -import ( - "encoding/json" - "math" - "reflect" - "sort" - "testing" -) - -func TestEqualValues(t *testing.T) { - tests := map[string]struct { - in1, in2 SampleValue - want bool - }{ - "equal floats": { - in1: 3.14, - in2: 3.14, - want: true, - }, - "unequal floats": { - in1: 3.14, - in2: 3.1415, - want: false, - }, - "positive inifinities": { - in1: SampleValue(math.Inf(+1)), - in2: SampleValue(math.Inf(+1)), - want: true, - }, - "negative inifinities": { - in1: SampleValue(math.Inf(-1)), - in2: SampleValue(math.Inf(-1)), - want: true, - }, - "different inifinities": { - in1: SampleValue(math.Inf(+1)), - in2: SampleValue(math.Inf(-1)), - want: false, - }, - "number and infinity": { - in1: 42, - in2: SampleValue(math.Inf(+1)), - want: false, - }, - "number and NaN": { - in1: 42, - in2: SampleValue(math.NaN()), - want: false, - }, - "NaNs": { - in1: SampleValue(math.NaN()), - in2: SampleValue(math.NaN()), - want: true, // !!! - }, - } - - for name, test := range tests { - got := test.in1.Equal(test.in2) - if got != test.want { - t.Errorf("Comparing %s, %f and %f: got %t, want %t", name, test.in1, test.in2, got, test.want) - } - } -} - -func TestEqualSamples(t *testing.T) { - testSample := &Sample{} - - tests := map[string]struct { - in1, in2 *Sample - want bool - }{ - "equal pointers": { - in1: testSample, - in2: testSample, - want: true, - }, - "different metrics": { - in1: &Sample{Metric: Metric{"foo": "bar"}}, - in2: &Sample{Metric: Metric{"foo": "biz"}}, - want: false, - }, - "different timestamp": { - in1: &Sample{Timestamp: 0}, - in2: &Sample{Timestamp: 1}, - want: false, - }, - "different value": { - in1: &Sample{Value: 0}, - in2: &Sample{Value: 1}, - want: false, - }, - "equal samples": { - in1: &Sample{ - Metric: Metric{"foo": "bar"}, - Timestamp: 0, - Value: 1, - }, - in2: &Sample{ - Metric: Metric{"foo": "bar"}, - Timestamp: 0, - Value: 1, - }, - want: true, - }, - } - - for name, test := range tests { - got := test.in1.Equal(test.in2) - if got != test.want { - t.Errorf("Comparing %s, %v and %v: got %t, want %t", name, test.in1, test.in2, got, test.want) - } - } - -} - -func TestSamplePairJSON(t *testing.T) { - input := []struct { - plain string - value SamplePair - }{ - { - plain: `[1234.567,"123.1"]`, - value: SamplePair{ - Value: 123.1, - Timestamp: 1234567, - }, - }, - } - - for _, test := range input { - b, err := json.Marshal(test.value) - if err != nil { - t.Error(err) - continue - } - - if string(b) != test.plain { - t.Errorf("encoding error: expected %q, got %q", test.plain, b) - continue - } - - var sp SamplePair - err = json.Unmarshal(b, &sp) - if err != nil { - t.Error(err) - continue - } - - if sp != test.value { - t.Errorf("decoding error: expected %v, got %v", test.value, sp) - } - } -} - -func TestSampleJSON(t *testing.T) { - input := []struct { - plain string - value Sample - }{ - { - plain: `{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]}`, - value: Sample{ - Metric: Metric{ - MetricNameLabel: "test_metric", - }, - Value: 123.1, - Timestamp: 1234567, - }, - }, - } - - for _, test := range input { - b, err := json.Marshal(test.value) - if err != nil { - t.Error(err) - continue - } - - if string(b) != test.plain { - t.Errorf("encoding error: expected %q, got %q", test.plain, b) - continue - } - - var sv Sample - err = json.Unmarshal(b, &sv) - if err != nil { - t.Error(err) - continue - } - - if !reflect.DeepEqual(sv, test.value) { - t.Errorf("decoding error: expected %v, got %v", test.value, sv) - } - } -} - -func TestVectorJSON(t *testing.T) { - input := []struct { - plain string - value Vector - }{ - { - plain: `[]`, - value: Vector{}, - }, - { - plain: `[{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]}]`, - value: Vector{&Sample{ - Metric: Metric{ - MetricNameLabel: "test_metric", - }, - Value: 123.1, - Timestamp: 1234567, - }}, - }, - { - plain: `[{"metric":{"__name__":"test_metric"},"value":[1234.567,"123.1"]},{"metric":{"foo":"bar"},"value":[1.234,"+Inf"]}]`, - value: Vector{ - &Sample{ - Metric: Metric{ - MetricNameLabel: "test_metric", - }, - Value: 123.1, - Timestamp: 1234567, - }, - &Sample{ - Metric: Metric{ - "foo": "bar", - }, - Value: SampleValue(math.Inf(1)), - Timestamp: 1234, - }, - }, - }, - } - - for _, test := range input { - b, err := json.Marshal(test.value) - if err != nil { - t.Error(err) - continue - } - - if string(b) != test.plain { - t.Errorf("encoding error: expected %q, got %q", test.plain, b) - continue - } - - var vec Vector - err = json.Unmarshal(b, &vec) - if err != nil { - t.Error(err) - continue - } - - if !reflect.DeepEqual(vec, test.value) { - t.Errorf("decoding error: expected %v, got %v", test.value, vec) - } - } -} - -func TestScalarJSON(t *testing.T) { - input := []struct { - plain string - value Scalar - }{ - { - plain: `[123.456,"456"]`, - value: Scalar{ - Timestamp: 123456, - Value: 456, - }, - }, - { - plain: `[123123.456,"+Inf"]`, - value: Scalar{ - Timestamp: 123123456, - Value: SampleValue(math.Inf(1)), - }, - }, - { - plain: `[123123.456,"-Inf"]`, - value: Scalar{ - Timestamp: 123123456, - Value: SampleValue(math.Inf(-1)), - }, - }, - } - - for _, test := range input { - b, err := json.Marshal(test.value) - if err != nil { - t.Error(err) - continue - } - - if string(b) != test.plain { - t.Errorf("encoding error: expected %q, got %q", test.plain, b) - continue - } - - var sv Scalar - err = json.Unmarshal(b, &sv) - if err != nil { - t.Error(err) - continue - } - - if sv != test.value { - t.Errorf("decoding error: expected %v, got %v", test.value, sv) - } - } -} - -func TestStringJSON(t *testing.T) { - input := []struct { - plain string - value String - }{ - { - plain: `[123.456,"test"]`, - value: String{ - Timestamp: 123456, - Value: "test", - }, - }, - { - plain: `[123123.456,"台北"]`, - value: String{ - Timestamp: 123123456, - Value: "台北", - }, - }, - } - - for _, test := range input { - b, err := json.Marshal(test.value) - if err != nil { - t.Error(err) - continue - } - - if string(b) != test.plain { - t.Errorf("encoding error: expected %q, got %q", test.plain, b) - continue - } - - var sv String - err = json.Unmarshal(b, &sv) - if err != nil { - t.Error(err) - continue - } - - if sv != test.value { - t.Errorf("decoding error: expected %v, got %v", test.value, sv) - } - } -} - -func TestVectorSort(t *testing.T) { - input := Vector{ - &Sample{ - Metric: Metric{ - MetricNameLabel: "A", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "A", - }, - Timestamp: 2, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "C", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "C", - }, - Timestamp: 2, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "B", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "B", - }, - Timestamp: 2, - }, - } - - expected := Vector{ - &Sample{ - Metric: Metric{ - MetricNameLabel: "A", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "A", - }, - Timestamp: 2, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "B", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "B", - }, - Timestamp: 2, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "C", - }, - Timestamp: 1, - }, - &Sample{ - Metric: Metric{ - MetricNameLabel: "C", - }, - Timestamp: 2, - }, - } - - sort.Sort(input) - - for i, actual := range input { - actualFp := actual.Metric.Fingerprint() - expectedFp := expected[i].Metric.Fingerprint() - - if actualFp != expectedFp { - t.Fatalf("%d. Incorrect fingerprint. Got %s; want %s", i, actualFp.String(), expectedFp.String()) - } - - if actual.Timestamp != expected[i].Timestamp { - t.Fatalf("%d. Incorrect timestamp. Got %s; want %s", i, actual.Timestamp, expected[i].Timestamp) - } - } -} diff --git a/vendor/github.com/prometheus/procfs/buddyinfo_test.go b/vendor/github.com/prometheus/procfs/buddyinfo_test.go deleted file mode 100644 index bcf9355..0000000 --- a/vendor/github.com/prometheus/procfs/buddyinfo_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "strings" - "testing" -) - -func TestBuddyInfo(t *testing.T) { - buddyInfo, err := FS("fixtures/buddyinfo/valid").NewBuddyInfo() - if err != nil { - t.Fatal(err) - } - - if want, got := "DMA", buddyInfo[0].Zone; want != got { - t.Errorf("want Node 0, Zone %s, got %s", want, got) - } - - if want, got := "Normal", buddyInfo[2].Zone; want != got { - t.Errorf("want Node 0, Zone %s, got %s", want, got) - } - - if want, got := 4381.0, buddyInfo[2].Sizes[0]; want != got { - t.Errorf("want Node 0, Zone Normal %f, got %f", want, got) - } - - if want, got := 572.0, buddyInfo[1].Sizes[1]; want != got { - t.Errorf("want Node 0, Zone DMA32 %f, got %f", want, got) - } -} - -func TestBuddyInfoShort(t *testing.T) { - _, err := FS("fixtures/buddyinfo/short").NewBuddyInfo() - if err == nil { - t.Errorf("expected error, but none occurred") - } - - if want, got := "invalid number of fields when parsing buddyinfo", err.Error(); want != got { - t.Errorf("wrong error returned, wanted %q, got %q", want, got) - } -} - -func TestBuddyInfoSizeMismatch(t *testing.T) { - _, err := FS("fixtures/buddyinfo/sizemismatch").NewBuddyInfo() - if err == nil { - t.Errorf("expected error, but none occurred") - } - - if want, got := "mismatch in number of buddyinfo buckets", err.Error(); !strings.HasPrefix(got, want) { - t.Errorf("wrong error returned, wanted prefix %q, got %q", want, got) - } -} diff --git a/vendor/github.com/prometheus/procfs/fs_test.go b/vendor/github.com/prometheus/procfs/fs_test.go deleted file mode 100644 index a4e07f5..0000000 --- a/vendor/github.com/prometheus/procfs/fs_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import "testing" - -func TestNewFS(t *testing.T) { - if _, err := NewFS("foobar"); err == nil { - t.Error("want NewFS to fail for non-existing mount point") - } - - if _, err := NewFS("procfs.go"); err == nil { - t.Error("want NewFS to fail if mount point is not a directory") - } -} - -func TestFSXFSStats(t *testing.T) { - stats, err := FS("fixtures").XFSStats() - if err != nil { - t.Fatalf("failed to parse XFS stats: %v", err) - } - - // Very lightweight test just to sanity check the path used - // to open XFS stats. Heavier tests in package xfs. - if want, got := uint32(92447), stats.ExtentAllocation.ExtentsAllocated; want != got { - t.Errorf("unexpected extents allocated:\nwant: %d\nhave: %d", want, got) - } -} diff --git a/vendor/github.com/prometheus/procfs/ipvs_test.go b/vendor/github.com/prometheus/procfs/ipvs_test.go deleted file mode 100644 index 9c34e6d..0000000 --- a/vendor/github.com/prometheus/procfs/ipvs_test.go +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "net" - "testing" -) - -var ( - expectedIPVSStats = IPVSStats{ - Connections: 23765872, - IncomingPackets: 3811989221, - OutgoingPackets: 0, - IncomingBytes: 89991519156915, - OutgoingBytes: 0, - } - expectedIPVSBackendStatuses = []IPVSBackendStatus{ - { - LocalAddress: net.ParseIP("192.168.0.22"), - LocalPort: 3306, - RemoteAddress: net.ParseIP("192.168.82.22"), - RemotePort: 3306, - Proto: "TCP", - Weight: 100, - ActiveConn: 248, - InactConn: 2, - }, - { - LocalAddress: net.ParseIP("192.168.0.22"), - LocalPort: 3306, - RemoteAddress: net.ParseIP("192.168.83.24"), - RemotePort: 3306, - Proto: "TCP", - Weight: 100, - ActiveConn: 248, - InactConn: 2, - }, - { - LocalAddress: net.ParseIP("192.168.0.22"), - LocalPort: 3306, - RemoteAddress: net.ParseIP("192.168.83.21"), - RemotePort: 3306, - Proto: "TCP", - Weight: 100, - ActiveConn: 248, - InactConn: 1, - }, - { - LocalAddress: net.ParseIP("192.168.0.57"), - LocalPort: 3306, - RemoteAddress: net.ParseIP("192.168.84.22"), - RemotePort: 3306, - Proto: "TCP", - Weight: 0, - ActiveConn: 0, - InactConn: 0, - }, - { - LocalAddress: net.ParseIP("192.168.0.57"), - LocalPort: 3306, - RemoteAddress: net.ParseIP("192.168.82.21"), - RemotePort: 3306, - Proto: "TCP", - Weight: 100, - ActiveConn: 1499, - InactConn: 0, - }, - { - LocalAddress: net.ParseIP("192.168.0.57"), - LocalPort: 3306, - RemoteAddress: net.ParseIP("192.168.50.21"), - RemotePort: 3306, - Proto: "TCP", - Weight: 100, - ActiveConn: 1498, - InactConn: 0, - }, - { - LocalAddress: net.ParseIP("192.168.0.55"), - LocalPort: 3306, - RemoteAddress: net.ParseIP("192.168.50.26"), - RemotePort: 3306, - Proto: "TCP", - Weight: 0, - ActiveConn: 0, - InactConn: 0, - }, - { - LocalAddress: net.ParseIP("192.168.0.55"), - LocalPort: 3306, - RemoteAddress: net.ParseIP("192.168.49.32"), - RemotePort: 3306, - Proto: "TCP", - Weight: 100, - ActiveConn: 0, - InactConn: 0, - }, - { - LocalAddress: net.ParseIP("2620::1"), - LocalPort: 80, - RemoteAddress: net.ParseIP("2620::2"), - RemotePort: 80, - Proto: "TCP", - Weight: 1, - ActiveConn: 0, - InactConn: 0, - }, - { - LocalAddress: net.ParseIP("2620::1"), - LocalPort: 80, - RemoteAddress: net.ParseIP("2620::3"), - RemotePort: 80, - Proto: "TCP", - Weight: 1, - ActiveConn: 0, - InactConn: 0, - }, - { - LocalAddress: net.ParseIP("2620::1"), - LocalPort: 80, - RemoteAddress: net.ParseIP("2620::4"), - RemotePort: 80, - Proto: "TCP", - Weight: 1, - ActiveConn: 1, - InactConn: 1, - }, - { - LocalMark: "10001000", - RemoteAddress: net.ParseIP("192.168.50.26"), - RemotePort: 3306, - Proto: "FWM", - Weight: 0, - ActiveConn: 0, - InactConn: 1, - }, - { - LocalMark: "10001000", - RemoteAddress: net.ParseIP("192.168.50.21"), - RemotePort: 3306, - Proto: "FWM", - Weight: 0, - ActiveConn: 0, - InactConn: 2, - }, - } -) - -func TestIPVSStats(t *testing.T) { - stats, err := FS("fixtures").NewIPVSStats() - if err != nil { - t.Fatal(err) - } - - if stats != expectedIPVSStats { - t.Errorf("want %+v, have %+v", expectedIPVSStats, stats) - } -} - -func TestParseIPPort(t *testing.T) { - ip := net.ParseIP("192.168.0.22") - port := uint16(3306) - - gotIP, gotPort, err := parseIPPort("C0A80016:0CEA") - if err != nil { - t.Fatal(err) - } - if !(gotIP.Equal(ip) && port == gotPort) { - t.Errorf("want %s:%d, have %s:%d", ip, port, gotIP, gotPort) - } -} - -func TestParseIPPortInvalid(t *testing.T) { - testcases := []string{ - "", - "C0A80016", - "C0A800:1234", - "FOOBARBA:1234", - "C0A80016:0CEA:1234", - } - - for _, s := range testcases { - ip, port, err := parseIPPort(s) - if ip != nil || port != uint16(0) || err == nil { - t.Errorf("Expected error for input %s, have ip = %s, port = %v, err = %v", s, ip, port, err) - } - } -} - -func TestParseIPPortIPv6(t *testing.T) { - ip := net.ParseIP("dead:beef::1") - port := uint16(8080) - - gotIP, gotPort, err := parseIPPort("[DEAD:BEEF:0000:0000:0000:0000:0000:0001]:1F90") - if err != nil { - t.Fatal(err) - } - if !(gotIP.Equal(ip) && port == gotPort) { - t.Errorf("want %s:%d, have %s:%d", ip, port, gotIP, gotPort) - } -} - -func TestIPVSBackendStatus(t *testing.T) { - backendStats, err := FS("fixtures").NewIPVSBackendStatus() - if err != nil { - t.Fatal(err) - } - if want, have := len(expectedIPVSBackendStatuses), len(backendStats); want != have { - t.Fatalf("want %d backend statuses, have %d", want, have) - } - - for idx, expect := range expectedIPVSBackendStatuses { - if !backendStats[idx].LocalAddress.Equal(expect.LocalAddress) { - t.Errorf("want LocalAddress %s, have %s", expect.LocalAddress, backendStats[idx].LocalAddress) - } - if backendStats[idx].LocalPort != expect.LocalPort { - t.Errorf("want LocalPort %d, have %d", expect.LocalPort, backendStats[idx].LocalPort) - } - if !backendStats[idx].RemoteAddress.Equal(expect.RemoteAddress) { - t.Errorf("want RemoteAddress %s, have %s", expect.RemoteAddress, backendStats[idx].RemoteAddress) - } - if backendStats[idx].RemotePort != expect.RemotePort { - t.Errorf("want RemotePort %d, have %d", expect.RemotePort, backendStats[idx].RemotePort) - } - if backendStats[idx].Proto != expect.Proto { - t.Errorf("want Proto %s, have %s", expect.Proto, backendStats[idx].Proto) - } - if backendStats[idx].Weight != expect.Weight { - t.Errorf("want Weight %d, have %d", expect.Weight, backendStats[idx].Weight) - } - if backendStats[idx].ActiveConn != expect.ActiveConn { - t.Errorf("want ActiveConn %d, have %d", expect.ActiveConn, backendStats[idx].ActiveConn) - } - if backendStats[idx].InactConn != expect.InactConn { - t.Errorf("want InactConn %d, have %d", expect.InactConn, backendStats[idx].InactConn) - } - } -} diff --git a/vendor/github.com/prometheus/procfs/mdstat_test.go b/vendor/github.com/prometheus/procfs/mdstat_test.go deleted file mode 100644 index 8819228..0000000 --- a/vendor/github.com/prometheus/procfs/mdstat_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "testing" -) - -func TestMDStat(t *testing.T) { - mdStates, err := FS("fixtures").ParseMDStat() - if err != nil { - t.Fatalf("parsing of reference-file failed entirely: %s", err) - } - - refs := map[string]MDStat{ - "md3": {"md3", "active", 8, 8, 5853468288, 5853468288}, - "md127": {"md127", "active", 2, 2, 312319552, 312319552}, - "md0": {"md0", "active", 2, 2, 248896, 248896}, - "md4": {"md4", "inactive", 2, 2, 4883648, 4883648}, - "md6": {"md6", "active", 1, 2, 195310144, 16775552}, - "md8": {"md8", "active", 2, 2, 195310144, 16775552}, - "md7": {"md7", "active", 3, 4, 7813735424, 7813735424}, - } - - if want, have := len(refs), len(mdStates); want != have { - t.Errorf("want %d parsed md-devices, have %d", want, have) - } - for _, md := range mdStates { - if want, have := refs[md.Name], md; want != have { - t.Errorf("%s: want %v, have %v", md.Name, want, have) - } - } -} diff --git a/vendor/github.com/prometheus/procfs/mountstats_test.go b/vendor/github.com/prometheus/procfs/mountstats_test.go deleted file mode 100644 index 7df1d15..0000000 --- a/vendor/github.com/prometheus/procfs/mountstats_test.go +++ /dev/null @@ -1,286 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "fmt" - "reflect" - "strings" - "testing" - "time" -) - -func TestMountStats(t *testing.T) { - tests := []struct { - name string - s string - mounts []*Mount - invalid bool - }{ - { - name: "no devices", - s: `hello`, - }, - { - name: "device has too few fields", - s: `device foo`, - invalid: true, - }, - { - name: "device incorrect format", - s: `device rootfs BAD on / with fstype rootfs`, - invalid: true, - }, - { - name: "device incorrect format", - s: `device rootfs mounted BAD / with fstype rootfs`, - invalid: true, - }, - { - name: "device incorrect format", - s: `device rootfs mounted on / BAD fstype rootfs`, - invalid: true, - }, - { - name: "device incorrect format", - s: `device rootfs mounted on / with BAD rootfs`, - invalid: true, - }, - { - name: "device rootfs cannot have stats", - s: `device rootfs mounted on / with fstype rootfs stats`, - invalid: true, - }, - { - name: "NFSv4 device with too little info", - s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nhello", - invalid: true, - }, - { - name: "NFSv4 device with bad bytes", - s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nbytes: 0", - invalid: true, - }, - { - name: "NFSv4 device with bad events", - s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nevents: 0", - invalid: true, - }, - { - name: "NFSv4 device with bad per-op stats", - s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nper-op statistics\nFOO 0", - invalid: true, - }, - { - name: "NFSv4 device with bad transport stats", - s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nxprt: tcp", - invalid: true, - }, - { - name: "NFSv4 device with bad transport version", - s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=foo\nxprt: tcp 0", - invalid: true, - }, - { - name: "NFSv4 device with bad transport stats version 1.0", - s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.0\nxprt: tcp 0 0 0 0 0 0 0 0 0 0 0 0 0", - invalid: true, - }, - { - name: "NFSv4 device with bad transport stats version 1.1", - s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs4 statvers=1.1\nxprt: tcp 0 0 0 0 0 0 0 0 0 0", - invalid: true, - }, - { - name: "NFSv3 device with transport stats version 1.0 OK", - s: "device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs statvers=1.0\nxprt: tcp 1 2 3 4 5 6 7 8 9 10", - mounts: []*Mount{{ - Device: "192.168.1.1:/srv", - Mount: "/mnt/nfs", - Type: "nfs", - Stats: &MountStatsNFS{ - StatVersion: "1.0", - Transport: NFSTransportStats{ - Port: 1, - Bind: 2, - Connect: 3, - ConnectIdleTime: 4, - IdleTime: 5 * time.Second, - Sends: 6, - Receives: 7, - BadTransactionIDs: 8, - CumulativeActiveRequests: 9, - CumulativeBacklog: 10, - }, - }, - }}, - }, - { - name: "device rootfs OK", - s: `device rootfs mounted on / with fstype rootfs`, - mounts: []*Mount{{ - Device: "rootfs", - Mount: "/", - Type: "rootfs", - }}, - }, - { - name: "NFSv3 device with minimal stats OK", - s: `device 192.168.1.1:/srv mounted on /mnt/nfs with fstype nfs statvers=1.1`, - mounts: []*Mount{{ - Device: "192.168.1.1:/srv", - Mount: "/mnt/nfs", - Type: "nfs", - Stats: &MountStatsNFS{ - StatVersion: "1.1", - }, - }}, - }, - { - name: "fixtures OK", - mounts: []*Mount{ - { - Device: "rootfs", - Mount: "/", - Type: "rootfs", - }, - { - Device: "sysfs", - Mount: "/sys", - Type: "sysfs", - }, - { - Device: "proc", - Mount: "/proc", - Type: "proc", - }, - { - Device: "/dev/sda1", - Mount: "/", - Type: "ext4", - }, - { - Device: "192.168.1.1:/srv/test", - Mount: "/mnt/nfs/test", - Type: "nfs4", - Stats: &MountStatsNFS{ - StatVersion: "1.1", - Age: 13968 * time.Second, - Bytes: NFSBytesStats{ - Read: 1207640230, - ReadTotal: 1210214218, - ReadPages: 295483, - }, - Events: NFSEventsStats{ - InodeRevalidate: 52, - DnodeRevalidate: 226, - VFSOpen: 1, - VFSLookup: 13, - VFSAccess: 398, - VFSReadPages: 331, - VFSWritePages: 47, - VFSFlush: 77, - VFSFileRelease: 77, - }, - Operations: []NFSOperationStats{ - { - Operation: "NULL", - }, - { - Operation: "READ", - Requests: 1298, - Transmissions: 1298, - BytesSent: 207680, - BytesReceived: 1210292152, - CumulativeQueueTime: 6 * time.Millisecond, - CumulativeTotalResponseTime: 79386 * time.Millisecond, - CumulativeTotalRequestTime: 79407 * time.Millisecond, - }, - { - Operation: "WRITE", - }, - }, - Transport: NFSTransportStats{ - Port: 832, - Connect: 1, - IdleTime: 11 * time.Second, - Sends: 6428, - Receives: 6428, - CumulativeActiveRequests: 12154, - MaximumRPCSlotsUsed: 24, - CumulativeSendingQueue: 26, - CumulativePendingQueue: 5726, - }, - }, - }, - }, - }, - } - - for i, tt := range tests { - t.Logf("[%02d] test %q", i, tt.name) - - var mounts []*Mount - var err error - - if tt.s != "" { - mounts, err = parseMountStats(strings.NewReader(tt.s)) - } else { - proc, e := FS("fixtures").NewProc(26231) - if e != nil { - t.Fatalf("failed to create proc: %v", err) - } - - mounts, err = proc.MountStats() - } - - if tt.invalid && err == nil { - t.Error("expected an error, but none occurred") - } - if !tt.invalid && err != nil { - t.Errorf("unexpected error: %v", err) - } - - if want, have := tt.mounts, mounts; !reflect.DeepEqual(want, have) { - t.Errorf("mounts:\nwant:\n%v\nhave:\n%v", mountsStr(want), mountsStr(have)) - } - } -} - -func mountsStr(mounts []*Mount) string { - var out string - for i, m := range mounts { - out += fmt.Sprintf("[%d] %q on %q (%q)", i, m.Device, m.Mount, m.Type) - - stats, ok := m.Stats.(*MountStatsNFS) - if !ok { - out += "\n" - continue - } - - out += fmt.Sprintf("\n\t- v%s, age: %s", stats.StatVersion, stats.Age) - out += fmt.Sprintf("\n\t- bytes: %v", stats.Bytes) - out += fmt.Sprintf("\n\t- events: %v", stats.Events) - out += fmt.Sprintf("\n\t- transport: %v", stats.Transport) - out += fmt.Sprintf("\n\t- per-operation stats:") - - for _, o := range stats.Operations { - out += fmt.Sprintf("\n\t\t- %v", o) - } - - out += "\n" - } - - return out -} diff --git a/vendor/github.com/prometheus/procfs/net_dev_test.go b/vendor/github.com/prometheus/procfs/net_dev_test.go deleted file mode 100644 index b162e9c..0000000 --- a/vendor/github.com/prometheus/procfs/net_dev_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "testing" -) - -func TestNetDevParseLine(t *testing.T) { - const rawLine = ` eth0: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16` - - have, err := NetDev{}.parseLine(rawLine) - if err != nil { - t.Fatal(err) - } - - want := NetDevLine{"eth0", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16} - if want != *have { - t.Errorf("want %v, have %v", want, have) - } -} - -func TestNewNetDev(t *testing.T) { - fs, err := NewFS("fixtures") - if err != nil { - t.Fatal(err) - } - - nd, err := fs.NewNetDev() - if err != nil { - t.Fatal(err) - } - - lines := map[string]NetDevLine{ - "vethf345468": {Name: "vethf345468", RxBytes: 648, RxPackets: 8, TxBytes: 438, TxPackets: 5}, - "lo": {Name: "lo", RxBytes: 1664039048, RxPackets: 1566805, TxBytes: 1664039048, TxPackets: 1566805}, - "docker0": {Name: "docker0", RxBytes: 2568, RxPackets: 38, TxBytes: 438, TxPackets: 5}, - "eth0": {Name: "eth0", RxBytes: 874354587, RxPackets: 1036395, TxBytes: 563352563, TxPackets: 732147}, - } - - if want, have := len(lines), len(nd); want != have { - t.Errorf("want %d parsed net/dev lines, have %d", want, have) - } - for _, line := range nd { - if want, have := lines[line.Name], line; want != have { - t.Errorf("%s: want %v, have %v", line.Name, want, have) - } - } -} - -func TestProcNewNetDev(t *testing.T) { - p, err := FS("fixtures").NewProc(26231) - if err != nil { - t.Fatal(err) - } - - nd, err := p.NewNetDev() - if err != nil { - t.Fatal(err) - } - - lines := map[string]NetDevLine{ - "lo": {Name: "lo"}, - "eth0": {Name: "eth0", RxBytes: 438, RxPackets: 5, TxBytes: 648, TxPackets: 8}, - } - - if want, have := len(lines), len(nd); want != have { - t.Errorf("want %d parsed net/dev lines, have %d", want, have) - } - for _, line := range nd { - if want, have := lines[line.Name], line; want != have { - t.Errorf("%s: want %v, have %v", line.Name, want, have) - } - } -} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse_nfs_test.go b/vendor/github.com/prometheus/procfs/nfs/parse_nfs_test.go deleted file mode 100644 index 372f9be..0000000 --- a/vendor/github.com/prometheus/procfs/nfs/parse_nfs_test.go +++ /dev/null @@ -1,305 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package nfs_test - -import ( - "reflect" - "strings" - "testing" - - "github.com/prometheus/procfs/nfs" -) - -func TestNewNFSClientRPCStats(t *testing.T) { - tests := []struct { - name string - content string - stats *nfs.ClientRPCStats - invalid bool - }{ - { - name: "invalid file", - content: "invalid", - invalid: true, - }, { - name: "good old kernel version file", - content: `net 70 70 69 45 -rpc 1218785755 374636 1218815394 -proc2 18 16 57 74 52 71 73 45 86 0 52 83 61 17 53 50 23 70 82 -proc3 22 0 1061909262 48906 4077635 117661341 5 29391916 2570425 2993289 590 0 0 7815 15 1130 0 3983 92385 13332 2 1 23729 -proc4 48 98 51 54 83 85 23 24 1 28 73 68 83 12 84 39 68 59 58 88 29 74 69 96 21 84 15 53 86 54 66 56 97 36 49 32 85 81 11 58 32 67 13 28 35 90 1 26 1337 -`, - stats: &nfs.ClientRPCStats{ - Network: nfs.Network{ - NetCount: 70, - UDPCount: 70, - TCPCount: 69, - TCPConnect: 45, - }, - ClientRPC: nfs.ClientRPC{ - RPCCount: 1218785755, - Retransmissions: 374636, - AuthRefreshes: 1218815394, - }, - V2Stats: nfs.V2Stats{ - Null: 16, - GetAttr: 57, - SetAttr: 74, - Root: 52, - Lookup: 71, - ReadLink: 73, - Read: 45, - WrCache: 86, - Write: 0, - Create: 52, - Remove: 83, - Rename: 61, - Link: 17, - SymLink: 53, - MkDir: 50, - RmDir: 23, - ReadDir: 70, - FsStat: 82, - }, - V3Stats: nfs.V3Stats{ - Null: 0, - GetAttr: 1061909262, - SetAttr: 48906, - Lookup: 4077635, - Access: 117661341, - ReadLink: 5, - Read: 29391916, - Write: 2570425, - Create: 2993289, - MkDir: 590, - SymLink: 0, - MkNod: 0, - Remove: 7815, - RmDir: 15, - Rename: 1130, - Link: 0, - ReadDir: 3983, - ReadDirPlus: 92385, - FsStat: 13332, - FsInfo: 2, - PathConf: 1, - Commit: 23729}, - ClientV4Stats: nfs.ClientV4Stats{ - Null: 98, - Read: 51, - Write: 54, - Commit: 83, - Open: 85, - OpenConfirm: 23, - OpenNoattr: 24, - OpenDowngrade: 1, - Close: 28, - Setattr: 73, - FsInfo: 68, - Renew: 83, - SetClientId: 12, - SetClientIdConfirm: 84, - Lock: 39, - Lockt: 68, - Locku: 59, - Access: 58, - Getattr: 88, - Lookup: 29, - LookupRoot: 74, - Remove: 69, - Rename: 96, - Link: 21, - Symlink: 84, - Create: 15, - Pathconf: 53, - StatFs: 86, - ReadLink: 54, - ReadDir: 66, - ServerCaps: 56, - DelegReturn: 97, - GetAcl: 36, - SetAcl: 49, - FsLocations: 32, - ReleaseLockowner: 85, - Secinfo: 81, - FsidPresent: 11, - ExchangeId: 58, - CreateSession: 32, - DestroySession: 67, - Sequence: 13, - GetLeaseTime: 28, - ReclaimComplete: 35, - LayoutGet: 90, - GetDeviceInfo: 1, - LayoutCommit: 26, - LayoutReturn: 1337, - SecinfoNoName: 0, - TestStateId: 0, - FreeStateId: 0, - GetDeviceList: 0, - BindConnToSession: 0, - DestroyClientId: 0, - Seek: 0, - Allocate: 0, - DeAllocate: 0, - LayoutStats: 0, - Clone: 0, - }, - }, - }, { - name: "good file", - content: `net 18628 0 18628 6 -rpc 4329785 0 4338291 -proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 -proc3 22 1 4084749 29200 94754 32580 186 47747 7981 8639 0 6356 0 6962 0 7958 0 0 241 4 4 2 39 -proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 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 -`, - stats: &nfs.ClientRPCStats{ - Network: nfs.Network{ - NetCount: 18628, - UDPCount: 0, - TCPCount: 18628, - TCPConnect: 6, - }, - ClientRPC: nfs.ClientRPC{ - RPCCount: 4329785, - Retransmissions: 0, - AuthRefreshes: 4338291, - }, - V2Stats: nfs.V2Stats{ - Null: 2, - GetAttr: 69, - SetAttr: 0, - Root: 0, - Lookup: 4410, - ReadLink: 0, - Read: 0, - WrCache: 0, - Write: 0, - Create: 0, - Remove: 0, - Rename: 0, - Link: 0, - SymLink: 0, - MkDir: 0, - RmDir: 0, - ReadDir: 99, - FsStat: 2, - }, - V3Stats: nfs.V3Stats{ - Null: 1, - GetAttr: 4084749, - SetAttr: 29200, - Lookup: 94754, - Access: 32580, - ReadLink: 186, - Read: 47747, - Write: 7981, - Create: 8639, - MkDir: 0, - SymLink: 6356, - MkNod: 0, - Remove: 6962, - RmDir: 0, - Rename: 7958, - Link: 0, - ReadDir: 0, - ReadDirPlus: 241, - FsStat: 4, - FsInfo: 4, - PathConf: 2, - Commit: 39, - }, - ClientV4Stats: nfs.ClientV4Stats{ - Null: 1, - Read: 0, - Write: 0, - Commit: 0, - Open: 0, - OpenConfirm: 0, - OpenNoattr: 0, - OpenDowngrade: 0, - Close: 0, - Setattr: 0, - FsInfo: 0, - Renew: 0, - SetClientId: 1, - SetClientIdConfirm: 1, - Lock: 0, - Lockt: 0, - Locku: 0, - Access: 0, - Getattr: 0, - Lookup: 0, - LookupRoot: 0, - Remove: 2, - Rename: 0, - Link: 0, - Symlink: 0, - Create: 0, - Pathconf: 0, - StatFs: 0, - ReadLink: 0, - ReadDir: 0, - ServerCaps: 0, - DelegReturn: 0, - GetAcl: 0, - SetAcl: 0, - FsLocations: 0, - ReleaseLockowner: 0, - Secinfo: 0, - FsidPresent: 0, - ExchangeId: 0, - CreateSession: 0, - DestroySession: 0, - Sequence: 0, - GetLeaseTime: 0, - ReclaimComplete: 0, - LayoutGet: 0, - GetDeviceInfo: 0, - LayoutCommit: 0, - LayoutReturn: 0, - SecinfoNoName: 0, - TestStateId: 0, - FreeStateId: 0, - GetDeviceList: 0, - BindConnToSession: 0, - DestroyClientId: 0, - Seek: 0, - Allocate: 0, - DeAllocate: 0, - LayoutStats: 0, - Clone: 0, - }, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - stats, err := nfs.ParseClientRPCStats(strings.NewReader(tt.content)) - - if tt.invalid && err == nil { - t.Fatal("expected an error, but none occurred") - } - if !tt.invalid && err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) { - t.Fatalf("unexpected NFS stats:\nwant:\n%v\nhave:\n%v", want, have) - } - }) - } -} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse_nfsd_test.go b/vendor/github.com/prometheus/procfs/nfs/parse_nfsd_test.go deleted file mode 100644 index b09b3b5..0000000 --- a/vendor/github.com/prometheus/procfs/nfs/parse_nfsd_test.go +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package nfs_test - -import ( - "reflect" - "strings" - "testing" - - "github.com/prometheus/procfs/nfs" -) - -func TestNewNFSdServerRPCStats(t *testing.T) { - tests := []struct { - name string - content string - stats *nfs.ServerRPCStats - invalid bool - }{ - { - name: "invalid file", - content: "invalid", - invalid: true, - }, { - name: "good file", - content: `rc 0 6 18622 -fh 0 0 0 0 0 -io 157286400 0 -th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -ra 32 0 0 0 0 0 0 0 0 0 0 0 -net 18628 0 18628 6 -rpc 18628 0 0 0 0 -proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 -proc3 22 2 112 0 2719 111 0 0 0 0 0 0 0 0 0 0 0 27 216 0 2 1 0 -proc4 2 2 10853 -proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 1272 0 0 0 1236 0 0 0 0 3 3 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 -`, - stats: &nfs.ServerRPCStats{ - ReplyCache: nfs.ReplyCache{ - Hits: 0, - Misses: 6, - NoCache: 18622, - }, - FileHandles: nfs.FileHandles{ - Stale: 0, - TotalLookups: 0, - AnonLookups: 0, - DirNoCache: 0, - NoDirNoCache: 0, - }, - InputOutput: nfs.InputOutput{ - Read: 157286400, - Write: 0, - }, - Threads: nfs.Threads{ - Threads: 8, - FullCnt: 0, - }, - ReadAheadCache: nfs.ReadAheadCache{ - CacheSize: 32, - CacheHistogram: []uint64{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - NotFound: 0, - }, - Network: nfs.Network{ - NetCount: 18628, - UDPCount: 0, - TCPCount: 18628, - TCPConnect: 6, - }, - ServerRPC: nfs.ServerRPC{ - RPCCount: 18628, - BadCnt: 0, - BadFmt: 0, - BadAuth: 0, - BadcInt: 0, - }, - V2Stats: nfs.V2Stats{ - Null: 2, - GetAttr: 69, - SetAttr: 0, - Root: 0, - Lookup: 4410, - ReadLink: 0, - Read: 0, - WrCache: 0, - Write: 0, - Create: 0, - Remove: 0, - Rename: 0, - Link: 0, - SymLink: 0, - MkDir: 0, - RmDir: 0, - ReadDir: 99, - FsStat: 2, - }, - V3Stats: nfs.V3Stats{ - Null: 2, - GetAttr: 112, - SetAttr: 0, - Lookup: 2719, - Access: 111, - ReadLink: 0, - Read: 0, - Write: 0, - Create: 0, - MkDir: 0, - SymLink: 0, - MkNod: 0, - Remove: 0, - RmDir: 0, - Rename: 0, - Link: 0, - ReadDir: 27, - ReadDirPlus: 216, - FsStat: 0, - FsInfo: 2, - PathConf: 1, - Commit: 0, - }, - ServerV4Stats: nfs.ServerV4Stats{ - Null: 2, - Compound: 10853, - }, - V4Ops: nfs.V4Ops{ - Op0Unused: 0, - Op1Unused: 0, - Op2Future: 0, - Access: 1098, - Close: 2, - Commit: 0, - Create: 0, - DelegPurge: 0, - DelegReturn: 0, - GetAttr: 8179, - GetFH: 5896, - Link: 0, - Lock: 0, - Lockt: 0, - Locku: 0, - Lookup: 5900, - LookupRoot: 0, - Nverify: 0, - Open: 2, - OpenAttr: 0, - OpenConfirm: 2, - OpenDgrd: 0, - PutFH: 9609, - PutPubFH: 0, - PutRootFH: 2, - Read: 150, - ReadDir: 1272, - ReadLink: 0, - Remove: 0, - Rename: 0, - Renew: 1236, - RestoreFH: 0, - SaveFH: 0, - SecInfo: 0, - SetAttr: 0, - Verify: 3, - Write: 3, - RelLockOwner: 0, - }, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - stats, err := nfs.ParseServerRPCStats(strings.NewReader(tt.content)) - - if tt.invalid && err == nil { - t.Fatal("expected an error, but none occurred") - } - if !tt.invalid && err != nil { - t.Fatalf("unexpected error: %v", err) - } - - if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) { - t.Fatalf("unexpected NFS stats:\nwant:\n%v\nhave:\n%v", want, have) - } - }) - } -} diff --git a/vendor/github.com/prometheus/procfs/proc_io_test.go b/vendor/github.com/prometheus/procfs/proc_io_test.go deleted file mode 100644 index 1afdbd4..0000000 --- a/vendor/github.com/prometheus/procfs/proc_io_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import "testing" - -func TestProcIO(t *testing.T) { - p, err := FS("fixtures").NewProc(26231) - if err != nil { - t.Fatal(err) - } - - s, err := p.NewIO() - if err != nil { - t.Fatal(err) - } - - for _, test := range []struct { - name string - want int64 - have int64 - }{ - {name: "RChar", want: 750339, have: int64(s.RChar)}, - {name: "WChar", want: 818609, have: int64(s.WChar)}, - {name: "SyscR", want: 7405, have: int64(s.SyscR)}, - {name: "SyscW", want: 5245, have: int64(s.SyscW)}, - {name: "ReadBytes", want: 1024, have: int64(s.ReadBytes)}, - {name: "WriteBytes", want: 2048, have: int64(s.WriteBytes)}, - {name: "CancelledWriteBytes", want: -1024, have: s.CancelledWriteBytes}, - } { - if test.want != test.have { - t.Errorf("want %s %d, have %d", test.name, test.want, test.have) - } - } -} diff --git a/vendor/github.com/prometheus/procfs/proc_limits_test.go b/vendor/github.com/prometheus/procfs/proc_limits_test.go deleted file mode 100644 index ebb43ae..0000000 --- a/vendor/github.com/prometheus/procfs/proc_limits_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import "testing" - -func TestNewLimits(t *testing.T) { - p, err := FS("fixtures").NewProc(26231) - if err != nil { - t.Fatal(err) - } - - l, err := p.NewLimits() - if err != nil { - t.Fatal(err) - } - - for _, test := range []struct { - name string - want int64 - have int64 - }{ - {name: "cpu time", want: -1, have: l.CPUTime}, - {name: "open files", want: 2048, have: l.OpenFiles}, - {name: "msgqueue size", want: 819200, have: l.MsqqueueSize}, - {name: "nice priority", want: 0, have: l.NicePriority}, - {name: "address space", want: 8589934592, have: l.AddressSpace}, - } { - if test.want != test.have { - t.Errorf("want %s %d, have %d", test.name, test.want, test.have) - } - } -} diff --git a/vendor/github.com/prometheus/procfs/proc_ns_test.go b/vendor/github.com/prometheus/procfs/proc_ns_test.go deleted file mode 100644 index abfd63e..0000000 --- a/vendor/github.com/prometheus/procfs/proc_ns_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "testing" -) - -func TestNewNamespaces(t *testing.T) { - p, err := FS("fixtures").NewProc(26231) - if err != nil { - t.Fatal(err) - } - - namespaces, err := p.NewNamespaces() - if err != nil { - t.Fatal(err) - } - - expectedNamespaces := map[string]Namespace{ - "mnt": {"mnt", 4026531840}, - "net": {"net", 4026531993}, - } - - if want, have := len(expectedNamespaces), len(namespaces); want != have { - t.Errorf("want %d parsed namespaces, have %d", want, have) - } - for _, ns := range namespaces { - if want, have := expectedNamespaces[ns.Type], ns; want != have { - t.Errorf("%s: want %v, have %v", ns.Type, want, have) - } - } -} diff --git a/vendor/github.com/prometheus/procfs/proc_stat_test.go b/vendor/github.com/prometheus/procfs/proc_stat_test.go deleted file mode 100644 index e2df884..0000000 --- a/vendor/github.com/prometheus/procfs/proc_stat_test.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "os" - "testing" -) - -func TestProcStat(t *testing.T) { - p, err := FS("fixtures").NewProc(26231) - if err != nil { - t.Fatal(err) - } - - s, err := p.NewStat() - if err != nil { - t.Fatal(err) - } - - for _, test := range []struct { - name string - want int - have int - }{ - {name: "pid", want: 26231, have: s.PID}, - {name: "user time", want: 1677, have: int(s.UTime)}, - {name: "system time", want: 44, have: int(s.STime)}, - {name: "start time", want: 82375, have: int(s.Starttime)}, - {name: "virtual memory size", want: 56274944, have: s.VSize}, - {name: "resident set size", want: 1981, have: s.RSS}, - } { - if test.want != test.have { - t.Errorf("want %s %d, have %d", test.name, test.want, test.have) - } - } -} - -func TestProcStatComm(t *testing.T) { - s1, err := testProcStat(26231) - if err != nil { - t.Fatal(err) - } - if want, have := "vim", s1.Comm; want != have { - t.Errorf("want comm %s, have %s", want, have) - } - - s2, err := testProcStat(584) - if err != nil { - t.Fatal(err) - } - if want, have := "(a b ) ( c d) ", s2.Comm; want != have { - t.Errorf("want comm %s, have %s", want, have) - } -} - -func TestProcStatVirtualMemory(t *testing.T) { - s, err := testProcStat(26231) - if err != nil { - t.Fatal(err) - } - - if want, have := 56274944, s.VirtualMemory(); want != have { - t.Errorf("want virtual memory %d, have %d", want, have) - } -} - -func TestProcStatResidentMemory(t *testing.T) { - s, err := testProcStat(26231) - if err != nil { - t.Fatal(err) - } - - if want, have := 1981*os.Getpagesize(), s.ResidentMemory(); want != have { - t.Errorf("want resident memory %d, have %d", want, have) - } -} - -func TestProcStatStartTime(t *testing.T) { - s, err := testProcStat(26231) - if err != nil { - t.Fatal(err) - } - - time, err := s.StartTime() - if err != nil { - t.Fatal(err) - } - if want, have := 1418184099.75, time; want != have { - t.Errorf("want start time %f, have %f", want, have) - } -} - -func TestProcStatCPUTime(t *testing.T) { - s, err := testProcStat(26231) - if err != nil { - t.Fatal(err) - } - - if want, have := 17.21, s.CPUTime(); want != have { - t.Errorf("want cpu time %f, have %f", want, have) - } -} - -func testProcStat(pid int) (ProcStat, error) { - p, err := FS("fixtures").NewProc(pid) - if err != nil { - return ProcStat{}, err - } - - return p.NewStat() -} diff --git a/vendor/github.com/prometheus/procfs/proc_test.go b/vendor/github.com/prometheus/procfs/proc_test.go deleted file mode 100644 index ee7e69d..0000000 --- a/vendor/github.com/prometheus/procfs/proc_test.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "reflect" - "sort" - "testing" -) - -func TestSelf(t *testing.T) { - fs := FS("fixtures") - - p1, err := fs.NewProc(26231) - if err != nil { - t.Fatal(err) - } - p2, err := fs.Self() - if err != nil { - t.Fatal(err) - } - - if !reflect.DeepEqual(p1, p2) { - t.Errorf("want process %v, have %v", p1, p2) - } -} - -func TestAllProcs(t *testing.T) { - procs, err := FS("fixtures").AllProcs() - if err != nil { - t.Fatal(err) - } - sort.Sort(procs) - for i, p := range []*Proc{{PID: 584}, {PID: 26231}} { - if want, have := p.PID, procs[i].PID; want != have { - t.Errorf("want processes %d, have %d", want, have) - } - } -} - -func TestCmdLine(t *testing.T) { - for _, tt := range []struct { - process int - want []string - }{ - {process: 26231, want: []string{"vim", "test.go", "+10"}}, - {process: 26232, want: []string{}}, - {process: 26233, want: []string{"com.github.uiautomator"}}, - } { - p1, err := FS("fixtures").NewProc(tt.process) - if err != nil { - t.Fatal(err) - } - c1, err := p1.CmdLine() - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(tt.want, c1) { - t.Errorf("want cmdline %v, have %v", tt.want, c1) - } - } -} - -func TestComm(t *testing.T) { - for _, tt := range []struct { - process int - want string - }{ - {process: 26231, want: "vim"}, - {process: 26232, want: "ata_sff"}, - } { - p1, err := FS("fixtures").NewProc(tt.process) - if err != nil { - t.Fatal(err) - } - c1, err := p1.Comm() - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(tt.want, c1) { - t.Errorf("want comm %v, have %v", tt.want, c1) - } - } -} - -func TestExecutable(t *testing.T) { - for _, tt := range []struct { - process int - want string - }{ - {process: 26231, want: "/usr/bin/vim"}, - {process: 26232, want: ""}, - } { - p, err := FS("fixtures").NewProc(tt.process) - if err != nil { - t.Fatal(err) - } - exe, err := p.Executable() - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(tt.want, exe) { - t.Errorf("want absolute path to cmdline %v, have %v", tt.want, exe) - } - } -} - -func TestFileDescriptors(t *testing.T) { - p1, err := FS("fixtures").NewProc(26231) - if err != nil { - t.Fatal(err) - } - fds, err := p1.FileDescriptors() - if err != nil { - t.Fatal(err) - } - sort.Sort(byUintptr(fds)) - if want := []uintptr{0, 1, 2, 3, 10}; !reflect.DeepEqual(want, fds) { - t.Errorf("want fds %v, have %v", want, fds) - } -} - -func TestFileDescriptorTargets(t *testing.T) { - p1, err := FS("fixtures").NewProc(26231) - if err != nil { - t.Fatal(err) - } - fds, err := p1.FileDescriptorTargets() - if err != nil { - t.Fatal(err) - } - sort.Strings(fds) - var want = []string{ - "../../symlinktargets/abc", - "../../symlinktargets/def", - "../../symlinktargets/ghi", - "../../symlinktargets/uvw", - "../../symlinktargets/xyz", - } - if !reflect.DeepEqual(want, fds) { - t.Errorf("want fds %v, have %v", want, fds) - } -} - -func TestFileDescriptorsLen(t *testing.T) { - p1, err := FS("fixtures").NewProc(26231) - if err != nil { - t.Fatal(err) - } - l, err := p1.FileDescriptorsLen() - if err != nil { - t.Fatal(err) - } - if want, have := 5, l; want != have { - t.Errorf("want fds %d, have %d", want, have) - } -} - -type byUintptr []uintptr - -func (a byUintptr) Len() int { return len(a) } -func (a byUintptr) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byUintptr) Less(i, j int) bool { return a[i] < a[j] } diff --git a/vendor/github.com/prometheus/procfs/stat_test.go b/vendor/github.com/prometheus/procfs/stat_test.go deleted file mode 100644 index 2043b5e..0000000 --- a/vendor/github.com/prometheus/procfs/stat_test.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import "testing" - -func TestStat(t *testing.T) { - s, err := FS("fixtures").NewStat() - if err != nil { - t.Fatal(err) - } - - // cpu - if want, have := float64(301854)/userHZ, s.CPUTotal.User; want != have { - t.Errorf("want cpu/user %v, have %v", want, have) - } - if want, have := float64(31)/userHZ, s.CPU[7].SoftIRQ; want != have { - t.Errorf("want cpu7/softirq %v, have %v", want, have) - } - - // intr - if want, have := uint64(8885917), s.IRQTotal; want != have { - t.Errorf("want irq/total %d, have %d", want, have) - } - if want, have := uint64(1), s.IRQ[8]; want != have { - t.Errorf("want irq8 %d, have %d", want, have) - } - - // ctxt - if want, have := uint64(38014093), s.ContextSwitches; want != have { - t.Errorf("want context switches (ctxt) %d, have %d", want, have) - } - - // btime - if want, have := uint64(1418183276), s.BootTime; want != have { - t.Errorf("want boot time (btime) %d, have %d", want, have) - } - - // processes - if want, have := uint64(26442), s.ProcessCreated; want != have { - t.Errorf("want process created (processes) %d, have %d", want, have) - } - - // procs_running - if want, have := uint64(2), s.ProcessesRunning; want != have { - t.Errorf("want processes running (procs_running) %d, have %d", want, have) - } - - // procs_blocked - if want, have := uint64(1), s.ProcessesBlocked; want != have { - t.Errorf("want processes blocked (procs_blocked) %d, have %d", want, have) - } - - // softirq - if want, have := uint64(5057579), s.SoftIRQTotal; want != have { - t.Errorf("want softirq total %d, have %d", want, have) - } - - if want, have := uint64(508444), s.SoftIRQ.Rcu; want != have { - t.Errorf("want softirq RCU %d, have %d", want, have) - } - -} diff --git a/vendor/github.com/prometheus/procfs/ttar b/vendor/github.com/prometheus/procfs/ttar old mode 100755 new mode 100644 diff --git a/vendor/github.com/prometheus/procfs/xfrm_test.go b/vendor/github.com/prometheus/procfs/xfrm_test.go deleted file mode 100644 index 5918c39..0000000 --- a/vendor/github.com/prometheus/procfs/xfrm_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2017 Prometheus Team -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "testing" -) - -func TestXfrmStats(t *testing.T) { - xfrmStats, err := FS("fixtures").NewXfrmStat() - if err != nil { - t.Fatal(err) - } - - for _, test := range []struct { - name string - want int - got int - }{ - {name: "XfrmInError", want: 1, got: xfrmStats.XfrmInError}, - {name: "XfrmInBufferError", want: 2, got: xfrmStats.XfrmInBufferError}, - {name: "XfrmInHdrError", want: 4, got: xfrmStats.XfrmInHdrError}, - {name: "XfrmInNoStates", want: 3, got: xfrmStats.XfrmInNoStates}, - {name: "XfrmInStateProtoError", want: 40, got: xfrmStats.XfrmInStateProtoError}, - {name: "XfrmInStateModeError", want: 100, got: xfrmStats.XfrmInStateModeError}, - {name: "XfrmInStateSeqError", want: 6000, got: xfrmStats.XfrmInStateSeqError}, - {name: "XfrmInStateExpired", want: 4, got: xfrmStats.XfrmInStateExpired}, - {name: "XfrmInStateMismatch", want: 23451, got: xfrmStats.XfrmInStateMismatch}, - {name: "XfrmInStateInvalid", want: 55555, got: xfrmStats.XfrmInStateInvalid}, - {name: "XfrmInTmplMismatch", want: 51, got: xfrmStats.XfrmInTmplMismatch}, - {name: "XfrmInNoPols", want: 65432, got: xfrmStats.XfrmInNoPols}, - {name: "XfrmInPolBlock", want: 100, got: xfrmStats.XfrmInPolBlock}, - {name: "XfrmInPolError", want: 10000, got: xfrmStats.XfrmInPolError}, - {name: "XfrmOutError", want: 1000000, got: xfrmStats.XfrmOutError}, - {name: "XfrmOutBundleGenError", want: 43321, got: xfrmStats.XfrmOutBundleGenError}, - {name: "XfrmOutBundleCheckError", want: 555, got: xfrmStats.XfrmOutBundleCheckError}, - {name: "XfrmOutNoStates", want: 869, got: xfrmStats.XfrmOutNoStates}, - {name: "XfrmOutStateProtoError", want: 4542, got: xfrmStats.XfrmOutStateProtoError}, - {name: "XfrmOutStateModeError", want: 4, got: xfrmStats.XfrmOutStateModeError}, - {name: "XfrmOutStateSeqError", want: 543, got: xfrmStats.XfrmOutStateSeqError}, - {name: "XfrmOutStateExpired", want: 565, got: xfrmStats.XfrmOutStateExpired}, - {name: "XfrmOutPolBlock", want: 43456, got: xfrmStats.XfrmOutPolBlock}, - {name: "XfrmOutPolDead", want: 7656, got: xfrmStats.XfrmOutPolDead}, - {name: "XfrmOutPolError", want: 1454, got: xfrmStats.XfrmOutPolError}, - {name: "XfrmFwdHdrError", want: 6654, got: xfrmStats.XfrmFwdHdrError}, - {name: "XfrmOutStateInvaliad", want: 28765, got: xfrmStats.XfrmOutStateInvalid}, - {name: "XfrmAcquireError", want: 24532, got: xfrmStats.XfrmAcquireError}, - {name: "XfrmInStateInvalid", want: 55555, got: xfrmStats.XfrmInStateInvalid}, - {name: "XfrmOutError", want: 1000000, got: xfrmStats.XfrmOutError}, - } { - if test.want != test.got { - t.Errorf("Want %s %d, have %d", test.name, test.want, test.got) - } - } -} diff --git a/vendor/github.com/prometheus/procfs/xfs/parse_test.go b/vendor/github.com/prometheus/procfs/xfs/parse_test.go deleted file mode 100644 index 2e946c2..0000000 --- a/vendor/github.com/prometheus/procfs/xfs/parse_test.go +++ /dev/null @@ -1,442 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package xfs_test - -import ( - "reflect" - "strings" - "testing" - - "github.com/prometheus/procfs" - "github.com/prometheus/procfs/xfs" -) - -func TestParseStats(t *testing.T) { - tests := []struct { - name string - s string - fs bool - stats *xfs.Stats - invalid bool - }{ - { - name: "empty file OK", - }, - { - name: "short or empty lines and unknown labels ignored", - s: "one\n\ntwo 1 2 3\n", - stats: &xfs.Stats{}, - }, - { - name: "bad uint32", - s: "extent_alloc XXX", - invalid: true, - }, - { - name: "bad uint64", - s: "xpc XXX", - invalid: true, - }, - { - name: "extent_alloc bad", - s: "extent_alloc 1", - invalid: true, - }, - { - name: "extent_alloc OK", - s: "extent_alloc 1 2 3 4", - stats: &xfs.Stats{ - ExtentAllocation: xfs.ExtentAllocationStats{ - ExtentsAllocated: 1, - BlocksAllocated: 2, - ExtentsFreed: 3, - BlocksFreed: 4, - }, - }, - }, - { - name: "abt bad", - s: "abt 1", - invalid: true, - }, - { - name: "abt OK", - s: "abt 1 2 3 4", - stats: &xfs.Stats{ - AllocationBTree: xfs.BTreeStats{ - Lookups: 1, - Compares: 2, - RecordsInserted: 3, - RecordsDeleted: 4, - }, - }, - }, - { - name: "blk_map bad", - s: "blk_map 1", - invalid: true, - }, - { - name: "blk_map OK", - s: "blk_map 1 2 3 4 5 6 7", - stats: &xfs.Stats{ - BlockMapping: xfs.BlockMappingStats{ - Reads: 1, - Writes: 2, - Unmaps: 3, - ExtentListInsertions: 4, - ExtentListDeletions: 5, - ExtentListLookups: 6, - ExtentListCompares: 7, - }, - }, - }, - { - name: "bmbt bad", - s: "bmbt 1", - invalid: true, - }, - { - name: "bmbt OK", - s: "bmbt 1 2 3 4", - stats: &xfs.Stats{ - BlockMapBTree: xfs.BTreeStats{ - Lookups: 1, - Compares: 2, - RecordsInserted: 3, - RecordsDeleted: 4, - }, - }, - }, - { - name: "dir bad", - s: "dir 1", - invalid: true, - }, - { - name: "dir OK", - s: "dir 1 2 3 4", - stats: &xfs.Stats{ - DirectoryOperation: xfs.DirectoryOperationStats{ - Lookups: 1, - Creates: 2, - Removes: 3, - Getdents: 4, - }, - }, - }, - { - name: "trans bad", - s: "trans 1", - invalid: true, - }, - { - name: "trans OK", - s: "trans 1 2 3", - stats: &xfs.Stats{ - Transaction: xfs.TransactionStats{ - Sync: 1, - Async: 2, - Empty: 3, - }, - }, - }, - { - name: "ig bad", - s: "ig 1", - invalid: true, - }, - { - name: "ig OK", - s: "ig 1 2 3 4 5 6 7", - stats: &xfs.Stats{ - InodeOperation: xfs.InodeOperationStats{ - Attempts: 1, - Found: 2, - Recycle: 3, - Missed: 4, - Duplicate: 5, - Reclaims: 6, - AttributeChange: 7, - }, - }, - }, - { - name: "log bad", - s: "log 1", - invalid: true, - }, - { - name: "log OK", - s: "log 1 2 3 4 5", - stats: &xfs.Stats{ - LogOperation: xfs.LogOperationStats{ - Writes: 1, - Blocks: 2, - NoInternalBuffers: 3, - Force: 4, - ForceSleep: 5, - }, - }, - }, - { - name: "rw bad", - s: "rw 1", - invalid: true, - }, - { - name: "rw OK", - s: "rw 1 2", - stats: &xfs.Stats{ - ReadWrite: xfs.ReadWriteStats{ - Read: 1, - Write: 2, - }, - }, - }, - { - name: "attr bad", - s: "attr 1", - invalid: true, - }, - { - name: "attr OK", - s: "attr 1 2 3 4", - stats: &xfs.Stats{ - AttributeOperation: xfs.AttributeOperationStats{ - Get: 1, - Set: 2, - Remove: 3, - List: 4, - }, - }, - }, - { - name: "icluster bad", - s: "icluster 1", - invalid: true, - }, - { - name: "icluster OK", - s: "icluster 1 2 3", - stats: &xfs.Stats{ - InodeClustering: xfs.InodeClusteringStats{ - Iflush: 1, - Flush: 2, - FlushInode: 3, - }, - }, - }, - { - name: "vnodes bad", - s: "vnodes 1", - invalid: true, - }, - { - name: "vnodes (missing free) OK", - s: "vnodes 1 2 3 4 5 6 7", - stats: &xfs.Stats{ - Vnode: xfs.VnodeStats{ - Active: 1, - Allocate: 2, - Get: 3, - Hold: 4, - Release: 5, - Reclaim: 6, - Remove: 7, - }, - }, - }, - { - name: "vnodes (with free) OK", - s: "vnodes 1 2 3 4 5 6 7 8", - stats: &xfs.Stats{ - Vnode: xfs.VnodeStats{ - Active: 1, - Allocate: 2, - Get: 3, - Hold: 4, - Release: 5, - Reclaim: 6, - Remove: 7, - Free: 8, - }, - }, - }, - { - name: "buf bad", - s: "buf 1", - invalid: true, - }, - { - name: "buf OK", - s: "buf 1 2 3 4 5 6 7 8 9", - stats: &xfs.Stats{ - Buffer: xfs.BufferStats{ - Get: 1, - Create: 2, - GetLocked: 3, - GetLockedWaited: 4, - BusyLocked: 5, - MissLocked: 6, - PageRetries: 7, - PageFound: 8, - GetRead: 9, - }, - }, - }, - { - name: "xpc bad", - s: "xpc 1", - invalid: true, - }, - { - name: "xpc OK", - s: "xpc 1 2 3", - stats: &xfs.Stats{ - ExtendedPrecision: xfs.ExtendedPrecisionStats{ - FlushBytes: 1, - WriteBytes: 2, - ReadBytes: 3, - }, - }, - }, - { - name: "fixtures OK", - fs: true, - stats: &xfs.Stats{ - ExtentAllocation: xfs.ExtentAllocationStats{ - ExtentsAllocated: 92447, - BlocksAllocated: 97589, - ExtentsFreed: 92448, - BlocksFreed: 93751, - }, - AllocationBTree: xfs.BTreeStats{ - Lookups: 0, - Compares: 0, - RecordsInserted: 0, - RecordsDeleted: 0, - }, - BlockMapping: xfs.BlockMappingStats{ - Reads: 1767055, - Writes: 188820, - Unmaps: 184891, - ExtentListInsertions: 92447, - ExtentListDeletions: 92448, - ExtentListLookups: 2140766, - ExtentListCompares: 0, - }, - BlockMapBTree: xfs.BTreeStats{ - Lookups: 0, - Compares: 0, - RecordsInserted: 0, - RecordsDeleted: 0, - }, - DirectoryOperation: xfs.DirectoryOperationStats{ - Lookups: 185039, - Creates: 92447, - Removes: 92444, - Getdents: 136422, - }, - Transaction: xfs.TransactionStats{ - Sync: 706, - Async: 944304, - Empty: 0, - }, - InodeOperation: xfs.InodeOperationStats{ - Attempts: 185045, - Found: 58807, - Recycle: 0, - Missed: 126238, - Duplicate: 0, - Reclaims: 33637, - AttributeChange: 22, - }, - LogOperation: xfs.LogOperationStats{ - Writes: 2883, - Blocks: 113448, - NoInternalBuffers: 9, - Force: 17360, - ForceSleep: 739, - }, - ReadWrite: xfs.ReadWriteStats{ - Read: 107739, - Write: 94045, - }, - AttributeOperation: xfs.AttributeOperationStats{ - Get: 4, - Set: 0, - Remove: 0, - List: 0, - }, - InodeClustering: xfs.InodeClusteringStats{ - Iflush: 8677, - Flush: 7849, - FlushInode: 135802, - }, - Vnode: xfs.VnodeStats{ - Active: 92601, - Allocate: 0, - Get: 0, - Hold: 0, - Release: 92444, - Reclaim: 92444, - Remove: 92444, - Free: 0, - }, - Buffer: xfs.BufferStats{ - Get: 2666287, - Create: 7122, - GetLocked: 2659202, - GetLockedWaited: 3599, - BusyLocked: 2, - MissLocked: 7085, - PageRetries: 0, - PageFound: 10297, - GetRead: 7085, - }, - ExtendedPrecision: xfs.ExtendedPrecisionStats{ - FlushBytes: 399724544, - WriteBytes: 92823103, - ReadBytes: 86219234, - }, - }, - }, - } - - for _, tt := range tests { - var ( - stats *xfs.Stats - err error - ) - - if tt.s != "" { - stats, err = xfs.ParseStats(strings.NewReader(tt.s)) - } - if tt.fs { - stats, err = procfs.FS("../fixtures").XFSStats() - } - - if tt.invalid && err == nil { - t.Error("expected an error, but none occurred") - } - if !tt.invalid && err != nil { - t.Errorf("unexpected error: %v", err) - } - - if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) { - t.Errorf("unexpected XFS stats:\nwant:\n%v\nhave:\n%v", want, have) - } - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/.gitignore b/vendor/github.com/wcharczuk/go-chart/.gitignore deleted file mode 100644 index 722d5e7..0000000 --- a/vendor/github.com/wcharczuk/go-chart/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.vscode diff --git a/vendor/github.com/wcharczuk/go-chart/.travis.yml b/vendor/github.com/wcharczuk/go-chart/.travis.yml deleted file mode 100644 index f2e55e9..0000000 --- a/vendor/github.com/wcharczuk/go-chart/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go - -go: - - 1.6.2 - -sudo: false - -before_script: - - go get -u github.com/blendlabs/go-assert - - go get ./... - -script: - - go test ./... diff --git a/vendor/github.com/wcharczuk/go-chart/LICENSE b/vendor/github.com/wcharczuk/go-chart/LICENSE deleted file mode 100644 index 8d9f1c5..0000000 --- a/vendor/github.com/wcharczuk/go-chart/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 William Charczuk. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/wcharczuk/go-chart/Makefile b/vendor/github.com/wcharczuk/go-chart/Makefile deleted file mode 100644 index cc16258..0000000 --- a/vendor/github.com/wcharczuk/go-chart/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -all: test - -test: - @go test ./... - -cover: - @go test -short -covermode=set -coverprofile=profile.cov - @go tool cover -html=profile.cov - @rm profile.cov \ No newline at end of file diff --git a/vendor/github.com/wcharczuk/go-chart/README.md b/vendor/github.com/wcharczuk/go-chart/README.md deleted file mode 100644 index 0ed0a51..0000000 --- a/vendor/github.com/wcharczuk/go-chart/README.md +++ /dev/null @@ -1,99 +0,0 @@ -go-chart -======== -[![Build Status](https://travis-ci.org/wcharczuk/go-chart.svg?branch=master)](https://travis-ci.org/wcharczuk/go-chart)[![Go Report Card](https://goreportcard.com/badge/github.com/wcharczuk/go-chart)](https://goreportcard.com/report/github.com/wcharczuk/go-chart) - -Package `chart` is a very simple golang native charting library that supports timeseries and continuous -line charts. - -The v1.0 release has been tagged so things should be more or less stable, if something changes please log an issue. - -Master should now be on the v2.x codebase, which brings a couple new features and better handling of basics like axes labeling etc. Per usual, see `_examples` for more information. - -# Installation - -To install `chart` run the following: - -```bash -> go get -u github.com/wcharczuk/go-chart -``` - -Most of the components are interchangeable so feel free to crib whatever you want. - -# Output Examples - -Spark Lines: - -![](https://raw.githubusercontent.com/wcharczuk/go-chart/master/_images/tvix_ltm.png) - -Single axis: - -![](https://raw.githubusercontent.com/wcharczuk/go-chart/master/_images/goog_ltm.png) - -Two axis: - -![](https://raw.githubusercontent.com/wcharczuk/go-chart/master/_images/two_axis.png) - -# Other Chart Types - -Pie Chart: - -![](https://raw.githubusercontent.com/wcharczuk/go-chart/master/_images/pie_chart.png) - -The code for this chart can be found in `_examples/pie_chart/main.go`. - -Stacked Bar: - -![](https://raw.githubusercontent.com/wcharczuk/go-chart/master/_images/stacked_bar.png) - -The code for this chart can be found in `_examples/stacked_bar/main.go`. - -# Code Examples - -Actual chart configurations and examples can be found in the `./_examples/` directory. They are web servers, so start them with `go run main.go` then access `http://localhost:8080` to see the output. - -# Usage - -Everything starts with the `chart.Chart` object. The bare minimum to draw a chart would be the following: - -```golang - -import ( - ... - "bytes" - ... - "github.com/wcharczuk/go-chart" //exposes "chart" -) - -graph := chart.Chart{ - Series: []chart.Series{ - chart.ContinuousSeries{ - XValues: []float64{1.0, 2.0, 3.0, 4.0}, - YValues: []float64{1.0, 2.0, 3.0, 4.0}, - }, - }, -} - -buffer := bytes.NewBuffer([]byte{}) -err := graph.Render(chart.PNG, buffer) -``` - -Explanation of the above: A `chart` can have many `Series`, a `Series` is a collection of things that need to be drawn according to the X range and the Y range(s). - -Here, we have a single series with x range values as float64s, rendered to a PNG. Note; we can pass any type of `io.Writer` into `Render(...)`, meaning that we can render the chart to a file or a resonse or anything else that implements `io.Writer`. - -# API Overview - -Everything on the `chart.Chart` object has defaults that can be overriden. Whenever a developer sets a property on the chart object, it is to be assumed that value will be used instead of the default. One complication here -is any object's root `chart.Style` object (i.e named `Style`) and the `Show` property specifically, if any other property is set and the `Show` property is unset, it is assumed to be it's default value of `False`. - -The best way to see the api in action is to look at the examples in the `./_examples/` directory. - -# Design Philosophy - -I wanted to make a charting library that used only native golang, that could be stood up on a server (i.e. it had built in fonts). - -The goal with the API itself is to have the "zero value be useful", and to require the user to not code more than they absolutely needed. - -# Contributions - -This library is super early but contributions are welcome. diff --git a/vendor/github.com/wcharczuk/go-chart/annotation_series.go b/vendor/github.com/wcharczuk/go-chart/annotation_series.go deleted file mode 100644 index 01d8569..0000000 --- a/vendor/github.com/wcharczuk/go-chart/annotation_series.go +++ /dev/null @@ -1,75 +0,0 @@ -package chart - -import "math" - -// AnnotationSeries is a series of labels on the chart. -type AnnotationSeries struct { - Name string - Style Style - YAxis YAxisType - Annotations []Value2 -} - -// GetName returns the name of the time series. -func (as AnnotationSeries) GetName() string { - return as.Name -} - -// GetStyle returns the line style. -func (as AnnotationSeries) GetStyle() Style { - return as.Style -} - -// GetYAxis returns which YAxis the series draws on. -func (as AnnotationSeries) GetYAxis() YAxisType { - return as.YAxis -} - -func (as AnnotationSeries) annotationStyleDefaults(defaults Style) Style { - return Style{ - FontColor: DefaultTextColor, - Font: defaults.Font, - FillColor: DefaultAnnotationFillColor, - FontSize: DefaultAnnotationFontSize, - StrokeColor: defaults.StrokeColor, - StrokeWidth: defaults.StrokeWidth, - Padding: DefaultAnnotationPadding, - } -} - -// Measure returns a bounds box of the series. -func (as AnnotationSeries) Measure(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) Box { - box := Box{ - Top: math.MaxInt32, - Left: math.MaxInt32, - Right: 0, - Bottom: 0, - } - if as.Style.IsZero() || as.Style.Show { - seriesStyle := as.Style.InheritFrom(as.annotationStyleDefaults(defaults)) - for _, a := range as.Annotations { - style := a.Style.InheritFrom(seriesStyle) - lx := canvasBox.Left + xrange.Translate(a.XValue) - ly := canvasBox.Bottom - yrange.Translate(a.YValue) - ab := Draw.MeasureAnnotation(r, canvasBox, style, lx, ly, a.Label) - box.Top = Math.MinInt(box.Top, ab.Top) - box.Left = Math.MinInt(box.Left, ab.Left) - box.Right = Math.MaxInt(box.Right, ab.Right) - box.Bottom = Math.MaxInt(box.Bottom, ab.Bottom) - } - } - return box -} - -// Render draws the series. -func (as AnnotationSeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - if as.Style.IsZero() || as.Style.Show { - seriesStyle := as.Style.InheritFrom(as.annotationStyleDefaults(defaults)) - for _, a := range as.Annotations { - style := a.Style.InheritFrom(seriesStyle) - lx := canvasBox.Left + xrange.Translate(a.XValue) - ly := canvasBox.Bottom - yrange.Translate(a.YValue) - Draw.Annotation(r, canvasBox, style, lx, ly, a.Label) - } - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/annotation_series_test.go b/vendor/github.com/wcharczuk/go-chart/annotation_series_test.go deleted file mode 100644 index 4437f82..0000000 --- a/vendor/github.com/wcharczuk/go-chart/annotation_series_test.go +++ /dev/null @@ -1,119 +0,0 @@ -package chart - -import ( - "image/color" - "testing" - - "github.com/blendlabs/go-assert" - "github.com/wcharczuk/go-chart/drawing" -) - -func TestAnnotationSeriesMeasure(t *testing.T) { - assert := assert.New(t) - - as := AnnotationSeries{ - Style: Style{ - Show: true, - }, - Annotations: []Value2{ - {XValue: 1.0, YValue: 1.0, Label: "1.0"}, - {XValue: 2.0, YValue: 2.0, Label: "2.0"}, - {XValue: 3.0, YValue: 3.0, Label: "3.0"}, - {XValue: 4.0, YValue: 4.0, Label: "4.0"}, - }, - } - - r, err := PNG(110, 110) - assert.Nil(err) - - f, err := GetDefaultFont() - assert.Nil(err) - - xrange := &ContinuousRange{ - Min: 1.0, - Max: 4.0, - Domain: 100, - } - yrange := &ContinuousRange{ - Min: 1.0, - Max: 4.0, - Domain: 100, - } - - cb := Box{ - Top: 5, - Left: 5, - Right: 105, - Bottom: 105, - } - sd := Style{ - FontSize: 10.0, - Font: f, - } - - box := as.Measure(r, cb, xrange, yrange, sd) - assert.False(box.IsZero()) - assert.Equal(-5.0, box.Top) - assert.Equal(5.0, box.Left) - assert.Equal(147.0, box.Right) //the top,left annotation sticks up 5px and out ~44px. - assert.Equal(115.0, box.Bottom) -} - -func TestAnnotationSeriesRender(t *testing.T) { - assert := assert.New(t) - - as := AnnotationSeries{ - Style: Style{ - Show: true, - FillColor: drawing.ColorWhite, - StrokeColor: drawing.ColorBlack, - }, - Annotations: []Value2{ - {XValue: 1.0, YValue: 1.0, Label: "1.0"}, - {XValue: 2.0, YValue: 2.0, Label: "2.0"}, - {XValue: 3.0, YValue: 3.0, Label: "3.0"}, - {XValue: 4.0, YValue: 4.0, Label: "4.0"}, - }, - } - - r, err := PNG(110, 110) - assert.Nil(err) - - f, err := GetDefaultFont() - assert.Nil(err) - - xrange := &ContinuousRange{ - Min: 1.0, - Max: 4.0, - Domain: 100, - } - yrange := &ContinuousRange{ - Min: 1.0, - Max: 4.0, - Domain: 100, - } - - cb := Box{ - Top: 5, - Left: 5, - Right: 105, - Bottom: 105, - } - sd := Style{ - FontSize: 10.0, - Font: f, - } - - as.Render(r, cb, xrange, yrange, sd) - - rr, isRaster := r.(*rasterRenderer) - assert.True(isRaster) - assert.NotNil(rr) - - c := rr.i.At(38, 70) - converted, isRGBA := color.RGBAModel.Convert(c).(color.RGBA) - assert.True(isRGBA) - assert.Equal(0, converted.R) - assert.Equal(0, converted.G) - assert.Equal(0, converted.B) -} diff --git a/vendor/github.com/wcharczuk/go-chart/axis.go b/vendor/github.com/wcharczuk/go-chart/axis.go deleted file mode 100644 index 6fd0a60..0000000 --- a/vendor/github.com/wcharczuk/go-chart/axis.go +++ /dev/null @@ -1,42 +0,0 @@ -package chart - -// TickPosition is an enumeration of possible tick drawing positions. -type TickPosition int - -const ( - // TickPositionUnset means to use the default tick position. - TickPositionUnset TickPosition = 0 - // TickPositionBetweenTicks draws the labels for a tick between the previous and current tick. - TickPositionBetweenTicks TickPosition = 1 - // TickPositionUnderTick draws the tick below the tick. - TickPositionUnderTick TickPosition = 2 -) - -// YAxisType is a type of y-axis; it can either be primary or secondary. -type YAxisType int - -const ( - // YAxisPrimary is the primary axis. - YAxisPrimary YAxisType = 0 - // YAxisSecondary is the secondary axis. - YAxisSecondary YAxisType = 1 -) - -// Axis is a chart feature detailing what values happen where. -type Axis interface { - GetName() string - GetStyle() Style - - GetTicks() []Tick - GenerateTicks(r Renderer, ra Range, vf ValueFormatter) []Tick - - // GetGridLines returns the gridlines for the axis. - GetGridLines(ticks []Tick) []GridLine - - // Measure should return an absolute box for the axis. - // This is used when auto-fitting the canvas to the background. - Measure(r Renderer, canvasBox Box, ra Range, style Style, ticks []Tick) Box - - // Render renders the axis. - Render(r Renderer, canvasBox Box, ra Range, style Style, ticks []Tick) -} diff --git a/vendor/github.com/wcharczuk/go-chart/bar_chart.go b/vendor/github.com/wcharczuk/go-chart/bar_chart.go deleted file mode 100644 index 6a74083..0000000 --- a/vendor/github.com/wcharczuk/go-chart/bar_chart.go +++ /dev/null @@ -1,461 +0,0 @@ -package chart - -import ( - "errors" - "io" - "math" - - "github.com/golang/freetype/truetype" -) - -// BarChart is a chart that draws bars on a range. -type BarChart struct { - Title string - TitleStyle Style - - Width int - Height int - DPI float64 - - BarWidth int - - Background Style - Canvas Style - - XAxis Style - YAxis YAxis - - BarSpacing int - - Font *truetype.Font - defaultFont *truetype.Font - - Bars []Value - Elements []Renderable -} - -// GetDPI returns the dpi for the chart. -func (bc BarChart) GetDPI() float64 { - if bc.DPI == 0 { - return DefaultDPI - } - return bc.DPI -} - -// GetFont returns the text font. -func (bc BarChart) GetFont() *truetype.Font { - if bc.Font == nil { - return bc.defaultFont - } - return bc.Font -} - -// GetWidth returns the chart width or the default value. -func (bc BarChart) GetWidth() int { - if bc.Width == 0 { - return DefaultChartWidth - } - return bc.Width -} - -// GetHeight returns the chart height or the default value. -func (bc BarChart) GetHeight() int { - if bc.Height == 0 { - return DefaultChartHeight - } - return bc.Height -} - -// GetBarSpacing returns the spacing between bars. -func (bc BarChart) GetBarSpacing() int { - if bc.BarSpacing == 0 { - return DefaultBarSpacing - } - return bc.BarSpacing -} - -// GetBarWidth returns the default bar width. -func (bc BarChart) GetBarWidth() int { - if bc.BarWidth == 0 { - return DefaultBarWidth - } - return bc.BarWidth -} - -// Render renders the chart with the given renderer to the given io.Writer. -func (bc BarChart) Render(rp RendererProvider, w io.Writer) error { - if len(bc.Bars) == 0 { - return errors.New("Please provide at least one bar.") - } - - r, err := rp(bc.GetWidth(), bc.GetHeight()) - if err != nil { - return err - } - - if bc.Font == nil { - defaultFont, err := GetDefaultFont() - if err != nil { - return err - } - bc.defaultFont = defaultFont - } - r.SetDPI(bc.GetDPI()) - - bc.drawBackground(r) - - var canvasBox Box - var yt []Tick - var yr Range - var yf ValueFormatter - - canvasBox = bc.getDefaultCanvasBox() - yr = bc.getRanges() - yr = bc.setRangeDomains(canvasBox, yr) - yf = bc.getValueFormatters() - - if bc.hasAxes() { - yt = bc.getAxesTicks(r, yr, yf) - canvasBox = bc.getAdjustedCanvasBox(r, canvasBox, yr, yt) - yr = bc.setRangeDomains(canvasBox, yr) - } - - bc.drawBars(r, canvasBox, yr) - bc.drawXAxis(r, canvasBox) - bc.drawYAxis(r, canvasBox, yr, yt) - - bc.drawTitle(r) - for _, a := range bc.Elements { - a(r, canvasBox, bc.styleDefaultsElements()) - } - - return r.Save(w) -} - -func (bc BarChart) getRanges() Range { - var yrange Range - if bc.YAxis.Range != nil && !bc.YAxis.Range.IsZero() { - yrange = bc.YAxis.Range - } else { - yrange = &ContinuousRange{} - } - - if !yrange.IsZero() { - return yrange - } - - if len(bc.YAxis.Ticks) > 0 { - tickMin, tickMax := math.MaxFloat64, -math.MaxFloat64 - for _, t := range bc.YAxis.Ticks { - tickMin = math.Min(tickMin, t.Value) - tickMax = math.Max(tickMax, t.Value) - } - yrange.SetMin(tickMin) - yrange.SetMax(tickMax) - return yrange - } - - min, max := math.MaxFloat64, -math.MaxFloat64 - for _, b := range bc.Bars { - min = math.Min(b.Value, min) - max = math.Max(b.Value, max) - } - - yrange.SetMin(min) - yrange.SetMax(max) - - return yrange -} - -func (bc BarChart) drawBackground(r Renderer) { - Draw.Box(r, Box{ - Right: bc.GetWidth(), - Bottom: bc.GetHeight(), - }, bc.getBackgroundStyle()) -} - -func (bc BarChart) drawBars(r Renderer, canvasBox Box, yr Range) { - xoffset := canvasBox.Left - - width, spacing, _ := bc.calculateScaledTotalWidth(canvasBox) - bs2 := spacing >> 1 - - var barBox Box - var bxl, bxr, by int - for index, bar := range bc.Bars { - bxl = xoffset + bs2 - bxr = bxl + width - - by = canvasBox.Bottom - yr.Translate(bar.Value) - - barBox = Box{ - Top: by, - Left: bxl, - Right: bxr, - Bottom: canvasBox.Bottom, - } - - Draw.Box(r, barBox, bar.Style.InheritFrom(bc.styleDefaultsBar(index))) - - xoffset += width + spacing - } -} - -func (bc BarChart) drawXAxis(r Renderer, canvasBox Box) { - if bc.XAxis.Show { - axisStyle := bc.XAxis.InheritFrom(bc.styleDefaultsAxes()) - axisStyle.WriteToRenderer(r) - - width, spacing, _ := bc.calculateScaledTotalWidth(canvasBox) - - r.MoveTo(canvasBox.Left, canvasBox.Bottom) - r.LineTo(canvasBox.Right, canvasBox.Bottom) - r.Stroke() - - r.MoveTo(canvasBox.Left, canvasBox.Bottom) - r.LineTo(canvasBox.Left, canvasBox.Bottom+DefaultVerticalTickHeight) - r.Stroke() - - cursor := canvasBox.Left - for index, bar := range bc.Bars { - barLabelBox := Box{ - Top: canvasBox.Bottom + DefaultXAxisMargin, - Left: cursor, - Right: cursor + width + spacing, - Bottom: bc.GetHeight(), - } - - if len(bar.Label) > 0 { - Draw.TextWithin(r, bar.Label, barLabelBox, axisStyle) - } - - axisStyle.WriteToRenderer(r) - if index < len(bc.Bars)-1 { - r.MoveTo(barLabelBox.Right, canvasBox.Bottom) - r.LineTo(barLabelBox.Right, canvasBox.Bottom+DefaultVerticalTickHeight) - r.Stroke() - } - cursor += width + spacing - } - } -} - -func (bc BarChart) drawYAxis(r Renderer, canvasBox Box, yr Range, ticks []Tick) { - if bc.YAxis.Style.Show { - axisStyle := bc.YAxis.Style.InheritFrom(bc.styleDefaultsAxes()) - axisStyle.WriteToRenderer(r) - - r.MoveTo(canvasBox.Right, canvasBox.Top) - r.LineTo(canvasBox.Right, canvasBox.Bottom) - r.Stroke() - - r.MoveTo(canvasBox.Right, canvasBox.Bottom) - r.LineTo(canvasBox.Right+DefaultHorizontalTickWidth, canvasBox.Bottom) - r.Stroke() - - var ty int - var tb Box - for _, t := range ticks { - ty = canvasBox.Bottom - yr.Translate(t.Value) - - axisStyle.GetStrokeOptions().WriteToRenderer(r) - r.MoveTo(canvasBox.Right, ty) - r.LineTo(canvasBox.Right+DefaultHorizontalTickWidth, ty) - r.Stroke() - - axisStyle.GetTextOptions().WriteToRenderer(r) - tb = r.MeasureText(t.Label) - Draw.Text(r, t.Label, canvasBox.Right+DefaultYAxisMargin+5, ty+(tb.Height()>>1), axisStyle) - } - - } -} - -func (bc BarChart) drawTitle(r Renderer) { - if len(bc.Title) > 0 && bc.TitleStyle.Show { - Draw.TextWithin(r, bc.Title, bc.box(), bc.styleDefaultsTitle()) - } -} - -func (bc BarChart) hasAxes() bool { - return bc.YAxis.Style.Show -} - -func (bc BarChart) setRangeDomains(canvasBox Box, yr Range) Range { - yr.SetDomain(canvasBox.Height()) - return yr -} - -func (bc BarChart) getDefaultCanvasBox() Box { - return bc.box() -} - -func (bc BarChart) getValueFormatters() ValueFormatter { - if bc.YAxis.ValueFormatter != nil { - return bc.YAxis.ValueFormatter - } - return FloatValueFormatter -} - -func (bc BarChart) getAxesTicks(r Renderer, yr Range, yf ValueFormatter) (yticks []Tick) { - if bc.YAxis.Style.Show { - yticks = bc.YAxis.GetTicks(r, yr, bc.styleDefaultsAxes(), yf) - } - return -} - -func (bc BarChart) calculateEffectiveBarSpacing(canvasBox Box) int { - totalWithBaseSpacing := bc.calculateTotalBarWidth(bc.GetBarWidth(), bc.GetBarSpacing()) - if totalWithBaseSpacing > canvasBox.Width() { - lessBarWidths := canvasBox.Width() - (len(bc.Bars) * bc.GetBarWidth()) - if lessBarWidths > 0 { - return int(math.Ceil(float64(lessBarWidths) / float64(len(bc.Bars)))) - } - return 0 - } - return bc.GetBarSpacing() -} - -func (bc BarChart) calculateEffectiveBarWidth(canvasBox Box, spacing int) int { - totalWithBaseWidth := bc.calculateTotalBarWidth(bc.GetBarWidth(), spacing) - if totalWithBaseWidth > canvasBox.Width() { - totalLessBarSpacings := canvasBox.Width() - (len(bc.Bars) * spacing) - if totalLessBarSpacings > 0 { - return int(math.Ceil(float64(totalLessBarSpacings) / float64(len(bc.Bars)))) - } - return 0 - } - return bc.GetBarWidth() -} - -func (bc BarChart) calculateTotalBarWidth(barWidth, spacing int) int { - return len(bc.Bars) * (barWidth + spacing) -} - -func (bc BarChart) calculateScaledTotalWidth(canvasBox Box) (width, spacing, total int) { - spacing = bc.calculateEffectiveBarSpacing(canvasBox) - width = bc.calculateEffectiveBarWidth(canvasBox, spacing) - total = bc.calculateTotalBarWidth(width, spacing) - return -} - -func (bc BarChart) getAdjustedCanvasBox(r Renderer, canvasBox Box, yrange Range, yticks []Tick) Box { - axesOuterBox := canvasBox.Clone() - - _, _, totalWidth := bc.calculateScaledTotalWidth(canvasBox) - - if bc.XAxis.Show { - xaxisHeight := DefaultVerticalTickHeight - - axisStyle := bc.XAxis.InheritFrom(bc.styleDefaultsAxes()) - axisStyle.WriteToRenderer(r) - - cursor := canvasBox.Left - for _, bar := range bc.Bars { - if len(bar.Label) > 0 { - barLabelBox := Box{ - Top: canvasBox.Bottom + DefaultXAxisMargin, - Left: cursor, - Right: cursor + bc.GetBarWidth() + bc.GetBarSpacing(), - Bottom: bc.GetHeight(), - } - lines := Text.WrapFit(r, bar.Label, barLabelBox.Width(), axisStyle) - linesBox := Text.MeasureLines(r, lines, axisStyle) - - xaxisHeight = Math.MaxInt(linesBox.Height()+(2*DefaultXAxisMargin), xaxisHeight) - } - } - - xbox := Box{ - Top: canvasBox.Top, - Left: canvasBox.Left, - Right: canvasBox.Left + totalWidth, - Bottom: bc.GetHeight() - xaxisHeight, - } - - axesOuterBox = axesOuterBox.Grow(xbox) - } - - if bc.YAxis.Style.Show { - axesBounds := bc.YAxis.Measure(r, canvasBox, yrange, bc.styleDefaultsAxes(), yticks) - axesOuterBox = axesOuterBox.Grow(axesBounds) - } - - return canvasBox.OuterConstrain(bc.box(), axesOuterBox) -} - -// box returns the chart bounds as a box. -func (bc BarChart) box() Box { - dpr := bc.Background.Padding.GetRight(10) - dpb := bc.Background.Padding.GetBottom(50) - - return Box{ - Top: 20, - Left: 20, - Right: bc.GetWidth() - dpr, - Bottom: bc.GetHeight() - dpb, - } -} - -func (bc BarChart) getBackgroundStyle() Style { - return bc.Background.InheritFrom(bc.styleDefaultsBackground()) -} - -func (bc BarChart) styleDefaultsBackground() Style { - return Style{ - FillColor: DefaultBackgroundColor, - StrokeColor: DefaultBackgroundStrokeColor, - StrokeWidth: DefaultStrokeWidth, - } -} - -func (bc BarChart) styleDefaultsBar(index int) Style { - return Style{ - StrokeColor: GetAlternateColor(index), - StrokeWidth: 3.0, - FillColor: GetAlternateColor(index), - } -} - -func (bc BarChart) styleDefaultsTitle() Style { - return bc.TitleStyle.InheritFrom(Style{ - FontColor: DefaultTextColor, - Font: bc.GetFont(), - FontSize: bc.getTitleFontSize(), - TextHorizontalAlign: TextHorizontalAlignCenter, - TextVerticalAlign: TextVerticalAlignTop, - TextWrap: TextWrapWord, - }) -} - -func (bc BarChart) getTitleFontSize() float64 { - effectiveDimension := Math.MinInt(bc.GetWidth(), bc.GetHeight()) - if effectiveDimension >= 2048 { - return 48 - } else if effectiveDimension >= 1024 { - return 24 - } else if effectiveDimension >= 512 { - return 18 - } else if effectiveDimension >= 256 { - return 12 - } - return 10 -} - -func (bc BarChart) styleDefaultsAxes() Style { - return Style{ - StrokeColor: DefaultAxisColor, - Font: bc.GetFont(), - FontSize: DefaultAxisFontSize, - FontColor: DefaultAxisColor, - TextHorizontalAlign: TextHorizontalAlignCenter, - TextVerticalAlign: TextVerticalAlignTop, - TextWrap: TextWrapWord, - } -} - -func (bc BarChart) styleDefaultsElements() Style { - return Style{ - Font: bc.GetFont(), - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/bar_chart_test.go b/vendor/github.com/wcharczuk/go-chart/bar_chart_test.go deleted file mode 100644 index 75d9886..0000000 --- a/vendor/github.com/wcharczuk/go-chart/bar_chart_test.go +++ /dev/null @@ -1,298 +0,0 @@ -package chart - -import ( - "bytes" - "math" - "testing" - - assert "github.com/blendlabs/go-assert" -) - -func TestBarChartRender(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{ - Width: 1024, - Title: "Test Title", - TitleStyle: StyleShow(), - XAxis: StyleShow(), - YAxis: YAxis{ - Style: StyleShow(), - }, - Bars: []Value{ - {Value: 1.0, Label: "One"}, - {Value: 2.0, Label: "Two"}, - {Value: 3.0, Label: "Three"}, - {Value: 4.0, Label: "Four"}, - {Value: 5.0, Label: "Five"}, - }, - } - - buf := bytes.NewBuffer([]byte{}) - err := bc.Render(PNG, buf) - assert.Nil(err) - assert.NotZero(buf.Len()) -} - -func TestBarChartProps(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{} - - assert.Equal(DefaultDPI, bc.GetDPI()) - bc.DPI = 100 - assert.Equal(100, bc.GetDPI()) - - assert.Nil(bc.GetFont()) - f, err := GetDefaultFont() - assert.Nil(err) - bc.Font = f - assert.NotNil(bc.GetFont()) - - assert.Equal(DefaultChartWidth, bc.GetWidth()) - bc.Width = DefaultChartWidth - 1 - assert.Equal(DefaultChartWidth-1, bc.GetWidth()) - - assert.Equal(DefaultChartHeight, bc.GetHeight()) - bc.Height = DefaultChartHeight - 1 - assert.Equal(DefaultChartHeight-1, bc.GetHeight()) - - assert.Equal(DefaultBarSpacing, bc.GetBarSpacing()) - bc.BarSpacing = 150 - assert.Equal(150, bc.GetBarSpacing()) - - assert.Equal(DefaultBarWidth, bc.GetBarWidth()) - bc.BarWidth = 75 - assert.Equal(75, bc.GetBarWidth()) -} - -func TestBarChartRenderNoBars(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{} - err := bc.Render(PNG, bytes.NewBuffer([]byte{})) - assert.NotNil(err) -} - -func TestBarChartGetRanges(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{} - - yr := bc.getRanges() - assert.NotNil(yr) - assert.False(yr.IsZero()) - - assert.Equal(-math.MaxFloat64, yr.GetMax()) - assert.Equal(math.MaxFloat64, yr.GetMin()) -} - -func TestBarChartGetRangesBarsMinMax(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{ - Bars: []Value{ - {Value: 1.0}, - {Value: 10.0}, - }, - } - - yr := bc.getRanges() - assert.NotNil(yr) - assert.False(yr.IsZero()) - - assert.Equal(10, yr.GetMax()) - assert.Equal(1, yr.GetMin()) -} - -func TestBarChartGetRangesMinMax(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{ - YAxis: YAxis{ - Range: &ContinuousRange{ - Min: 5.0, - Max: 15.0, - }, - Ticks: []Tick{ - {Value: 7.0, Label: "Foo"}, - {Value: 11.0, Label: "Foo2"}, - }, - }, - Bars: []Value{ - {Value: 1.0}, - {Value: 10.0}, - }, - } - - yr := bc.getRanges() - assert.NotNil(yr) - assert.False(yr.IsZero()) - - assert.Equal(15, yr.GetMax()) - assert.Equal(5, yr.GetMin()) -} - -func TestBarChartGetRangesTicksMinMax(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{ - YAxis: YAxis{ - Ticks: []Tick{ - {Value: 7.0, Label: "Foo"}, - {Value: 11.0, Label: "Foo2"}, - }, - }, - Bars: []Value{ - {Value: 1.0}, - {Value: 10.0}, - }, - } - - yr := bc.getRanges() - assert.NotNil(yr) - assert.False(yr.IsZero()) - - assert.Equal(11, yr.GetMax()) - assert.Equal(7, yr.GetMin()) -} - -func TestBarChartHasAxes(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{} - assert.False(bc.hasAxes()) - bc.YAxis = YAxis{ - Style: StyleShow(), - } - - assert.True(bc.hasAxes()) -} - -func TestBarChartGetDefaultCanvasBox(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{} - b := bc.getDefaultCanvasBox() - assert.False(b.IsZero()) -} - -func TestBarChartSetRangeDomains(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{} - cb := bc.box() - yr := bc.getRanges() - yr2 := bc.setRangeDomains(cb, yr) - assert.NotZero(yr2.GetDomain()) -} - -func TestBarChartGetValueFormatters(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{} - vf := bc.getValueFormatters() - assert.NotNil(vf) - assert.Equal("1234.00", vf(1234.0)) - - bc.YAxis.ValueFormatter = func(_ interface{}) string { return "test" } - assert.Equal("test", bc.getValueFormatters()(1234)) -} - -func TestBarChartGetAxesTicks(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{ - Bars: []Value{ - {Value: 1.0}, - {Value: 2.0}, - {Value: 3.0}, - }, - } - - r, err := PNG(128, 128) - assert.Nil(err) - yr := bc.getRanges() - yf := bc.getValueFormatters() - - ticks := bc.getAxesTicks(r, yr, yf) - assert.Empty(ticks) - - bc.YAxis.Style.Show = true - ticks = bc.getAxesTicks(r, yr, yf) - assert.Len(ticks, 2) -} - -func TestBarChartCalculateEffectiveBarSpacing(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{ - Width: 1024, - BarWidth: 10, - Bars: []Value{ - {Value: 1.0, Label: "One"}, - {Value: 2.0, Label: "Two"}, - {Value: 3.0, Label: "Three"}, - {Value: 4.0, Label: "Four"}, - {Value: 5.0, Label: "Five"}, - }, - } - - spacing := bc.calculateEffectiveBarSpacing(bc.box()) - assert.NotZero(spacing) - - bc.BarWidth = 250 - spacing = bc.calculateEffectiveBarSpacing(bc.box()) - assert.Zero(spacing) -} - -func TestBarChartCalculateEffectiveBarWidth(t *testing.T) { - assert := assert.New(t) - - bc := BarChart{ - Width: 1024, - BarWidth: 10, - Bars: []Value{ - {Value: 1.0, Label: "One"}, - {Value: 2.0, Label: "Two"}, - {Value: 3.0, Label: "Three"}, - {Value: 4.0, Label: "Four"}, - {Value: 5.0, Label: "Five"}, - }, - } - - cb := bc.box() - - spacing := bc.calculateEffectiveBarSpacing(bc.box()) - assert.NotZero(spacing) - - barWidth := bc.calculateEffectiveBarWidth(bc.box(), spacing) - assert.Equal(10, barWidth) - - bc.BarWidth = 250 - spacing = bc.calculateEffectiveBarSpacing(bc.box()) - assert.Zero(spacing) - barWidth = bc.calculateEffectiveBarWidth(bc.box(), spacing) - assert.Equal(199, barWidth) - - assert.Equal(cb.Width()+1, bc.calculateTotalBarWidth(barWidth, spacing)) - - bw, bs, total := bc.calculateScaledTotalWidth(cb) - assert.Equal(spacing, bs) - assert.Equal(barWidth, bw) - assert.Equal(cb.Width()+1, total) -} - -func TestBarChatGetTitleFontSize(t *testing.T) { - assert := assert.New(t) - size := BarChart{Width: 2049, Height: 2049}.getTitleFontSize() - assert.Equal(48, size) - size = BarChart{Width: 1025, Height: 1025}.getTitleFontSize() - assert.Equal(24, size) - size = BarChart{Width: 513, Height: 513}.getTitleFontSize() - assert.Equal(18, size) - size = BarChart{Width: 257, Height: 257}.getTitleFontSize() - assert.Equal(12, size) - size = BarChart{Width: 128, Height: 128}.getTitleFontSize() - assert.Equal(10, size) -} diff --git a/vendor/github.com/wcharczuk/go-chart/bollinger_band_series.go b/vendor/github.com/wcharczuk/go-chart/bollinger_band_series.go deleted file mode 100644 index f74b489..0000000 --- a/vendor/github.com/wcharczuk/go-chart/bollinger_band_series.go +++ /dev/null @@ -1,149 +0,0 @@ -package chart - -import "math" - -// BollingerBandsSeries draws bollinger bands for an inner series. -// Bollinger bands are defined by two lines, one at SMA+k*stddev, one at SMA-k*stdev. -type BollingerBandsSeries struct { - Name string - Style Style - YAxis YAxisType - - Period int - K float64 - InnerSeries ValueProvider - - valueBuffer *RingBuffer -} - -// GetName returns the name of the time series. -func (bbs BollingerBandsSeries) GetName() string { - return bbs.Name -} - -// GetStyle returns the line style. -func (bbs BollingerBandsSeries) GetStyle() Style { - return bbs.Style -} - -// GetYAxis returns which YAxis the series draws on. -func (bbs BollingerBandsSeries) GetYAxis() YAxisType { - return bbs.YAxis -} - -// GetPeriod returns the window size. -func (bbs BollingerBandsSeries) GetPeriod() int { - if bbs.Period == 0 { - return DefaultSimpleMovingAveragePeriod - } - return bbs.Period -} - -// GetK returns the K value. -func (bbs BollingerBandsSeries) GetK(defaults ...float64) float64 { - if bbs.K == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return 2.0 - } - return bbs.K -} - -// Len returns the number of elements in the series. -func (bbs *BollingerBandsSeries) Len() int { - return bbs.InnerSeries.Len() -} - -// GetBoundedValue gets the bounded value for the series. -func (bbs *BollingerBandsSeries) GetBoundedValue(index int) (x, y1, y2 float64) { - if bbs.InnerSeries == nil { - return - } - if bbs.valueBuffer == nil || index == 0 { - bbs.valueBuffer = NewRingBufferWithCapacity(bbs.GetPeriod()) - } - if bbs.valueBuffer.Len() >= bbs.GetPeriod() { - bbs.valueBuffer.Dequeue() - } - px, py := bbs.InnerSeries.GetValue(index) - bbs.valueBuffer.Enqueue(py) - x = px - - ay := bbs.getAverage(bbs.valueBuffer) - std := bbs.getStdDev(bbs.valueBuffer) - - y1 = ay + (bbs.GetK() * std) - y2 = ay - (bbs.GetK() * std) - return -} - -// GetBoundedLastValue returns the last bounded value for the series. -func (bbs *BollingerBandsSeries) GetBoundedLastValue() (x, y1, y2 float64) { - if bbs.InnerSeries == nil { - return - } - period := bbs.GetPeriod() - seriesLength := bbs.InnerSeries.Len() - startAt := seriesLength - period - if startAt < 0 { - startAt = 0 - } - - vb := NewRingBufferWithCapacity(period) - for index := startAt; index < seriesLength; index++ { - xn, yn := bbs.InnerSeries.GetValue(index) - vb.Enqueue(yn) - x = xn - } - - ay := bbs.getAverage(vb) - std := bbs.getStdDev(vb) - - y1 = ay + (bbs.GetK() * std) - y2 = ay - (bbs.GetK() * std) - - return -} - -// Render renders the series. -func (bbs *BollingerBandsSeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - s := bbs.Style.InheritFrom(defaults.InheritFrom(Style{ - StrokeWidth: 1.0, - StrokeColor: DefaultAxisColor.WithAlpha(64), - FillColor: DefaultAxisColor.WithAlpha(32), - })) - - Draw.BoundedSeries(r, canvasBox, xrange, yrange, s, bbs, bbs.GetPeriod()) -} - -func (bbs BollingerBandsSeries) getAverage(valueBuffer *RingBuffer) float64 { - var accum float64 - valueBuffer.Each(func(v interface{}) { - if typed, isTyped := v.(float64); isTyped { - accum += typed - } - }) - return accum / float64(valueBuffer.Len()) -} - -func (bbs BollingerBandsSeries) getVariance(valueBuffer *RingBuffer) float64 { - if valueBuffer.Len() == 0 { - return 0 - } - - var variance float64 - m := bbs.getAverage(valueBuffer) - - valueBuffer.Each(func(v interface{}) { - if n, isTyped := v.(float64); isTyped { - variance += (float64(n) - m) * (float64(n) - m) - } - }) - - return variance / float64(valueBuffer.Len()) -} - -func (bbs BollingerBandsSeries) getStdDev(valueBuffer *RingBuffer) float64 { - return math.Pow(bbs.getVariance(valueBuffer), 0.5) -} diff --git a/vendor/github.com/wcharczuk/go-chart/bollinger_band_series_test.go b/vendor/github.com/wcharczuk/go-chart/bollinger_band_series_test.go deleted file mode 100644 index 28d5564..0000000 --- a/vendor/github.com/wcharczuk/go-chart/bollinger_band_series_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package chart - -import ( - "math" - "testing" - - "github.com/blendlabs/go-assert" -) - -func TestBollingerBandSeries(t *testing.T) { - assert := assert.New(t) - - s1 := mockValueProvider{ - X: Sequence.Float64(1.0, 100.0), - Y: Sequence.Random(100, 1024), - } - - bbs := &BollingerBandsSeries{ - InnerSeries: s1, - } - - xvalues := make([]float64, 100) - y1values := make([]float64, 100) - y2values := make([]float64, 100) - - for x := 0; x < 100; x++ { - xvalues[x], y1values[x], y2values[x] = bbs.GetBoundedValue(x) - } - - for x := bbs.GetPeriod(); x < 100; x++ { - assert.True(y1values[x] > y2values[x]) - } -} - -func TestBollingerBandLastValue(t *testing.T) { - assert := assert.New(t) - - s1 := mockValueProvider{ - X: Sequence.Float64(1.0, 100.0), - Y: Sequence.Float64(1.0, 100.0), - } - - bbs := &BollingerBandsSeries{ - InnerSeries: s1, - } - - x, y1, y2 := bbs.GetBoundedLastValue() - assert.Equal(100.0, x) - assert.Equal(101, math.Floor(y1)) - assert.Equal(83, math.Floor(y2)) -} diff --git a/vendor/github.com/wcharczuk/go-chart/box.go b/vendor/github.com/wcharczuk/go-chart/box.go deleted file mode 100644 index 98c1f17..0000000 --- a/vendor/github.com/wcharczuk/go-chart/box.go +++ /dev/null @@ -1,330 +0,0 @@ -package chart - -import ( - "fmt" - "math" -) - -// Box represents the main 4 dimensions of a box. -type Box struct { - Top int - Left int - Right int - Bottom int -} - -// IsZero returns if the box is set or not. -func (b Box) IsZero() bool { - return b.Top == 0 && b.Left == 0 && b.Right == 0 && b.Bottom == 0 -} - -// String returns a string representation of the box. -func (b Box) String() string { - return fmt.Sprintf("box(%d,%d,%d,%d)", b.Top, b.Left, b.Right, b.Bottom) -} - -// GetTop returns a coalesced value with a default. -func (b Box) GetTop(defaults ...int) int { - if b.Top == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return 0 - } - return b.Top -} - -// GetLeft returns a coalesced value with a default. -func (b Box) GetLeft(defaults ...int) int { - if b.Left == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return 0 - } - return b.Left -} - -// GetRight returns a coalesced value with a default. -func (b Box) GetRight(defaults ...int) int { - if b.Right == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return 0 - } - return b.Right -} - -// GetBottom returns a coalesced value with a default. -func (b Box) GetBottom(defaults ...int) int { - if b.Bottom == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return 0 - } - return b.Bottom -} - -// Width returns the width -func (b Box) Width() int { - return Math.AbsInt(b.Right - b.Left) -} - -// Height returns the height -func (b Box) Height() int { - return Math.AbsInt(b.Bottom - b.Top) -} - -// Center returns the center of the box -func (b Box) Center() (x, y int) { - w2, h2 := b.Width()>>1, b.Height()>>1 - return b.Left + w2, b.Top + h2 -} - -// Aspect returns the aspect ratio of the box. -func (b Box) Aspect() float64 { - return float64(b.Width()) / float64(b.Height()) -} - -// Clone returns a new copy of the box. -func (b Box) Clone() Box { - return Box{ - Top: b.Top, - Left: b.Left, - Right: b.Right, - Bottom: b.Bottom, - } -} - -// IsBiggerThan returns if a box is bigger than another box. -func (b Box) IsBiggerThan(other Box) bool { - return b.Top < other.Top || - b.Bottom > other.Bottom || - b.Left < other.Left || - b.Right > other.Right -} - -// IsSmallerThan returns if a box is smaller than another box. -func (b Box) IsSmallerThan(other Box) bool { - return b.Top > other.Top && - b.Bottom < other.Bottom && - b.Left > other.Left && - b.Right < other.Right -} - -// Equals returns if the box equals another box. -func (b Box) Equals(other Box) bool { - return b.Top == other.Top && - b.Left == other.Left && - b.Right == other.Right && - b.Bottom == other.Bottom -} - -// Grow grows a box based on another box. -func (b Box) Grow(other Box) Box { - return Box{ - Top: Math.MinInt(b.Top, other.Top), - Left: Math.MinInt(b.Left, other.Left), - Right: Math.MaxInt(b.Right, other.Right), - Bottom: Math.MaxInt(b.Bottom, other.Bottom), - } -} - -// Shift pushes a box by x,y. -func (b Box) Shift(x, y int) Box { - return Box{ - Top: b.Top + y, - Left: b.Left + x, - Right: b.Right + x, - Bottom: b.Bottom + y, - } -} - -// Corners returns the box as a set of corners. -func (b Box) Corners() BoxCorners { - return BoxCorners{ - TopLeft: Point{b.Left, b.Top}, - TopRight: Point{b.Right, b.Top}, - BottomRight: Point{b.Right, b.Bottom}, - BottomLeft: Point{b.Left, b.Bottom}, - } -} - -// Fit is functionally the inverse of grow. -// Fit maintains the original aspect ratio of the `other` box, -// but constrains it to the bounds of the target box. -func (b Box) Fit(other Box) Box { - ba := b.Aspect() - oa := other.Aspect() - - if oa == ba { - return b.Clone() - } - - bw, bh := float64(b.Width()), float64(b.Height()) - bw2 := int(bw) >> 1 - bh2 := int(bh) >> 1 - if oa > ba { // ex. 16:9 vs. 4:3 - var noh2 int - if oa > 1.0 { - noh2 = int(bw/oa) >> 1 - } else { - noh2 = int(bh*oa) >> 1 - } - return Box{ - Top: (b.Top + bh2) - noh2, - Left: b.Left, - Right: b.Right, - Bottom: (b.Top + bh2) + noh2, - } - } - var now2 int - if oa > 1.0 { - now2 = int(bh/oa) >> 1 - } else { - now2 = int(bw*oa) >> 1 - } - return Box{ - Top: b.Top, - Left: (b.Left + bw2) - now2, - Right: (b.Left + bw2) + now2, - Bottom: b.Bottom, - } -} - -// Constrain is similar to `Fit` except that it will work -// more literally like the opposite of grow. -func (b Box) Constrain(other Box) Box { - newBox := b.Clone() - - newBox.Top = Math.MaxInt(newBox.Top, other.Top) - newBox.Left = Math.MaxInt(newBox.Left, other.Left) - newBox.Right = Math.MinInt(newBox.Right, other.Right) - newBox.Bottom = Math.MinInt(newBox.Bottom, other.Bottom) - - return newBox -} - -// OuterConstrain is similar to `Constraint` with the difference -// that it applies corrections -func (b Box) OuterConstrain(bounds, other Box) Box { - newBox := b.Clone() - if other.Top < bounds.Top { - delta := bounds.Top - other.Top - newBox.Top = b.Top + delta - } - - if other.Left < bounds.Left { - delta := bounds.Left - other.Left - newBox.Left = b.Left + delta - } - - if other.Right > bounds.Right { - delta := other.Right - bounds.Right - newBox.Right = b.Right - delta - } - - if other.Bottom > bounds.Bottom { - delta := other.Bottom - bounds.Bottom - newBox.Bottom = b.Bottom - delta - } - return newBox -} - -// BoxCorners is a box with independent corners. -type BoxCorners struct { - TopLeft, TopRight, BottomRight, BottomLeft Point -} - -// Box return the BoxCorners as a regular box. -func (bc BoxCorners) Box() Box { - return Box{ - Top: Math.MinInt(bc.TopLeft.Y, bc.TopRight.Y), - Left: Math.MinInt(bc.TopLeft.X, bc.BottomLeft.X), - Right: Math.MaxInt(bc.TopRight.X, bc.BottomRight.X), - Bottom: Math.MaxInt(bc.BottomLeft.Y, bc.BottomRight.Y), - } -} - -// Width returns the width -func (bc BoxCorners) Width() int { - minLeft := Math.MinInt(bc.TopLeft.X, bc.BottomLeft.X) - maxRight := Math.MaxInt(bc.TopRight.X, bc.BottomRight.X) - return maxRight - minLeft -} - -// Height returns the height -func (bc BoxCorners) Height() int { - minTop := Math.MinInt(bc.TopLeft.Y, bc.TopRight.Y) - maxBottom := Math.MaxInt(bc.BottomLeft.Y, bc.BottomRight.Y) - return maxBottom - minTop -} - -// Center returns the center of the box -func (bc BoxCorners) Center() (x, y int) { - - left := Math.MeanInt(bc.TopLeft.X, bc.BottomLeft.X) - right := Math.MeanInt(bc.TopRight.X, bc.BottomRight.X) - x = ((right - left) >> 1) + left - - top := Math.MeanInt(bc.TopLeft.Y, bc.TopRight.Y) - bottom := Math.MeanInt(bc.BottomLeft.Y, bc.BottomRight.Y) - y = ((bottom - top) >> 1) + top - - return -} - -// Rotate rotates the box. -func (bc BoxCorners) Rotate(thetaDegrees float64) BoxCorners { - cx, cy := bc.Center() - - thetaRadians := Math.DegreesToRadians(thetaDegrees) - - tlx, tly := Math.RotateCoordinate(cx, cy, bc.TopLeft.X, bc.TopLeft.Y, thetaRadians) - trx, try := Math.RotateCoordinate(cx, cy, bc.TopRight.X, bc.TopRight.Y, thetaRadians) - brx, bry := Math.RotateCoordinate(cx, cy, bc.BottomRight.X, bc.BottomRight.Y, thetaRadians) - blx, bly := Math.RotateCoordinate(cx, cy, bc.BottomLeft.X, bc.BottomLeft.Y, thetaRadians) - - return BoxCorners{ - TopLeft: Point{tlx, tly}, - TopRight: Point{trx, try}, - BottomRight: Point{brx, bry}, - BottomLeft: Point{blx, bly}, - } -} - -// Equals returns if the box equals another box. -func (bc BoxCorners) Equals(other BoxCorners) bool { - return bc.TopLeft.Equals(other.TopLeft) && - bc.TopRight.Equals(other.TopRight) && - bc.BottomRight.Equals(other.BottomRight) && - bc.BottomLeft.Equals(other.BottomLeft) -} - -func (bc BoxCorners) String() string { - return fmt.Sprintf("BoxC{%s,%s,%s,%s}", bc.TopLeft.String(), bc.TopRight.String(), bc.BottomRight.String(), bc.BottomLeft.String()) -} - -// Point is an X,Y pair -type Point struct { - X, Y int -} - -// DistanceTo calculates the distance to another point. -func (p Point) DistanceTo(other Point) float64 { - dx := math.Pow(float64(p.X-other.X), 2) - dy := math.Pow(float64(p.Y-other.Y), 2) - return math.Pow(dx+dy, 0.5) -} - -// Equals returns if a point equals another point. -func (p Point) Equals(other Point) bool { - return p.X == other.X && p.Y == other.Y -} - -// String returns a string representation of the point. -func (p Point) String() string { - return fmt.Sprintf("P{%d,%d}", p.X, p.Y) -} diff --git a/vendor/github.com/wcharczuk/go-chart/box_test.go b/vendor/github.com/wcharczuk/go-chart/box_test.go deleted file mode 100644 index 89eafcf..0000000 --- a/vendor/github.com/wcharczuk/go-chart/box_test.go +++ /dev/null @@ -1,188 +0,0 @@ -package chart - -import ( - "math" - "testing" - - "github.com/blendlabs/go-assert" -) - -func TestBoxClone(t *testing.T) { - assert := assert.New(t) - a := Box{Top: 5, Left: 5, Right: 15, Bottom: 15} - b := a.Clone() - assert.True(a.Equals(b)) - assert.True(b.Equals(a)) -} - -func TestBoxEquals(t *testing.T) { - assert := assert.New(t) - - a := Box{Top: 5, Left: 5, Right: 15, Bottom: 15} - b := Box{Top: 10, Left: 10, Right: 30, Bottom: 30} - c := Box{Top: 5, Left: 5, Right: 15, Bottom: 15} - assert.True(a.Equals(a)) - assert.True(a.Equals(c)) - assert.True(c.Equals(a)) - assert.False(a.Equals(b)) - assert.False(c.Equals(b)) - assert.False(b.Equals(a)) - assert.False(b.Equals(c)) -} - -func TestBoxIsBiggerThan(t *testing.T) { - assert := assert.New(t) - - a := Box{Top: 5, Left: 5, Right: 25, Bottom: 25} - b := Box{Top: 10, Left: 10, Right: 20, Bottom: 20} // only half bigger - c := Box{Top: 1, Left: 1, Right: 30, Bottom: 30} //bigger - assert.True(a.IsBiggerThan(b)) - assert.False(a.IsBiggerThan(c)) - assert.True(c.IsBiggerThan(a)) -} - -func TestBoxIsSmallerThan(t *testing.T) { - assert := assert.New(t) - - a := Box{Top: 5, Left: 5, Right: 25, Bottom: 25} - b := Box{Top: 10, Left: 10, Right: 20, Bottom: 20} // only half bigger - c := Box{Top: 1, Left: 1, Right: 30, Bottom: 30} //bigger - assert.False(a.IsSmallerThan(b)) - assert.True(a.IsSmallerThan(c)) - assert.False(c.IsSmallerThan(a)) -} - -func TestBoxGrow(t *testing.T) { - assert := assert.New(t) - - a := Box{Top: 1, Left: 2, Right: 15, Bottom: 15} - b := Box{Top: 4, Left: 5, Right: 30, Bottom: 35} - c := a.Grow(b) - assert.False(c.Equals(b)) - assert.False(c.Equals(a)) - assert.Equal(1, c.Top) - assert.Equal(2, c.Left) - assert.Equal(30, c.Right) - assert.Equal(35, c.Bottom) -} - -func TestBoxFit(t *testing.T) { - assert := assert.New(t) - - a := Box{Top: 64, Left: 64, Right: 192, Bottom: 192} - b := Box{Top: 16, Left: 16, Right: 256, Bottom: 170} - c := Box{Top: 16, Left: 16, Right: 170, Bottom: 256} - - fab := a.Fit(b) - assert.Equal(a.Left, fab.Left) - assert.Equal(a.Right, fab.Right) - assert.True(fab.Top < fab.Bottom) - assert.True(fab.Left < fab.Right) - assert.True(math.Abs(b.Aspect()-fab.Aspect()) < 0.02) - - fac := a.Fit(c) - assert.Equal(a.Top, fac.Top) - assert.Equal(a.Bottom, fac.Bottom) - assert.True(math.Abs(c.Aspect()-fac.Aspect()) < 0.02) -} - -func TestBoxConstrain(t *testing.T) { - assert := assert.New(t) - - a := Box{Top: 64, Left: 64, Right: 192, Bottom: 192} - b := Box{Top: 16, Left: 16, Right: 256, Bottom: 170} - c := Box{Top: 16, Left: 16, Right: 170, Bottom: 256} - - cab := a.Constrain(b) - assert.Equal(64, cab.Top) - assert.Equal(64, cab.Left) - assert.Equal(192, cab.Right) - assert.Equal(170, cab.Bottom) - - cac := a.Constrain(c) - assert.Equal(64, cac.Top) - assert.Equal(64, cac.Left) - assert.Equal(170, cac.Right) - assert.Equal(192, cac.Bottom) -} - -func TestBoxOuterConstrain(t *testing.T) { - assert := assert.New(t) - - box := Box{0, 0, 100, 100} - canvas := Box{5, 5, 95, 95} - taller := Box{-10, 5, 50, 50} - - c := canvas.OuterConstrain(box, taller) - assert.Equal(15, c.Top, c.String()) - assert.Equal(5, c.Left, c.String()) - assert.Equal(95, c.Right, c.String()) - assert.Equal(95, c.Bottom, c.String()) - - wider := Box{5, 5, 110, 50} - d := canvas.OuterConstrain(box, wider) - assert.Equal(5, d.Top, d.String()) - assert.Equal(5, d.Left, d.String()) - assert.Equal(85, d.Right, d.String()) - assert.Equal(95, d.Bottom, d.String()) -} - -func TestBoxShift(t *testing.T) { - assert := assert.New(t) - - b := Box{ - Top: 5, - Left: 5, - Right: 10, - Bottom: 10, - } - - shifted := b.Shift(1, 2) - assert.Equal(7, shifted.Top) - assert.Equal(6, shifted.Left) - assert.Equal(11, shifted.Right) - assert.Equal(12, shifted.Bottom) -} - -func TestBoxCenter(t *testing.T) { - assert := assert.New(t) - - b := Box{ - Top: 10, - Left: 10, - Right: 20, - Bottom: 30, - } - cx, cy := b.Center() - assert.Equal(15, cx) - assert.Equal(20, cy) -} - -func TestBoxCornersCenter(t *testing.T) { - assert := assert.New(t) - - bc := BoxCorners{ - TopLeft: Point{5, 5}, - TopRight: Point{15, 5}, - BottomRight: Point{15, 15}, - BottomLeft: Point{5, 15}, - } - - cx, cy := bc.Center() - assert.Equal(10, cx) - assert.Equal(10, cy) -} - -func TestBoxCornersRotate(t *testing.T) { - assert := assert.New(t) - - bc := BoxCorners{ - TopLeft: Point{5, 5}, - TopRight: Point{15, 5}, - BottomRight: Point{15, 15}, - BottomLeft: Point{5, 15}, - } - - rotated := bc.Rotate(45) - assert.True(rotated.TopLeft.Equals(Point{10, 3}), rotated.String()) -} diff --git a/vendor/github.com/wcharczuk/go-chart/chart.go b/vendor/github.com/wcharczuk/go-chart/chart.go deleted file mode 100644 index 236d714..0000000 --- a/vendor/github.com/wcharczuk/go-chart/chart.go +++ /dev/null @@ -1,502 +0,0 @@ -package chart - -import ( - "errors" - "io" - "math" - - "github.com/golang/freetype/truetype" -) - -// Chart is what we're drawing. -type Chart struct { - Title string - TitleStyle Style - - Width int - Height int - DPI float64 - - Background Style - Canvas Style - - XAxis XAxis - YAxis YAxis - YAxisSecondary YAxis - - Font *truetype.Font - defaultFont *truetype.Font - - Series []Series - Elements []Renderable -} - -// GetDPI returns the dpi for the chart. -func (c Chart) GetDPI(defaults ...float64) float64 { - if c.DPI == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return DefaultDPI - } - return c.DPI -} - -// GetFont returns the text font. -func (c Chart) GetFont() *truetype.Font { - if c.Font == nil { - return c.defaultFont - } - return c.Font -} - -// GetWidth returns the chart width or the default value. -func (c Chart) GetWidth() int { - if c.Width == 0 { - return DefaultChartWidth - } - return c.Width -} - -// GetHeight returns the chart height or the default value. -func (c Chart) GetHeight() int { - if c.Height == 0 { - return DefaultChartHeight - } - return c.Height -} - -// Render renders the chart with the given renderer to the given io.Writer. -func (c Chart) Render(rp RendererProvider, w io.Writer) error { - if len(c.Series) == 0 { - return errors.New("Please provide at least one series") - } - c.YAxisSecondary.AxisType = YAxisSecondary - - r, err := rp(c.GetWidth(), c.GetHeight()) - if err != nil { - return err - } - - if c.Font == nil { - defaultFont, err := GetDefaultFont() - if err != nil { - return err - } - c.defaultFont = defaultFont - } - r.SetDPI(c.GetDPI(DefaultDPI)) - - c.drawBackground(r) - - var xt, yt, yta []Tick - xr, yr, yra := c.getRanges() - canvasBox := c.getDefaultCanvasBox() - xf, yf, yfa := c.getValueFormatters() - xr, yr, yra = c.setRangeDomains(canvasBox, xr, yr, yra) - - err = c.checkRanges(xr, yr, yra) - if err != nil { - return err - } - - if c.hasAxes() { - xt, yt, yta = c.getAxesTicks(r, xr, yr, yra, xf, yf, yfa) - canvasBox = c.getAxesAdjustedCanvasBox(r, canvasBox, xr, yr, yra, xt, yt, yta) - xr, yr, yra = c.setRangeDomains(canvasBox, xr, yr, yra) - - // do a second pass in case things haven't settled yet. - xt, yt, yta = c.getAxesTicks(r, xr, yr, yra, xf, yf, yfa) - canvasBox = c.getAxesAdjustedCanvasBox(r, canvasBox, xr, yr, yra, xt, yt, yta) - xr, yr, yra = c.setRangeDomains(canvasBox, xr, yr, yra) - } - - if c.hasAnnotationSeries() { - canvasBox = c.getAnnotationAdjustedCanvasBox(r, canvasBox, xr, yr, yra, xf, yf, yfa) - xr, yr, yra = c.setRangeDomains(canvasBox, xr, yr, yra) - xt, yt, yta = c.getAxesTicks(r, xr, yr, yra, xf, yf, yfa) - } - - c.drawCanvas(r, canvasBox) - c.drawAxes(r, canvasBox, xr, yr, yra, xt, yt, yta) - for index, series := range c.Series { - c.drawSeries(r, canvasBox, xr, yr, yra, series, index) - } - - c.drawTitle(r) - - for _, a := range c.Elements { - a(r, canvasBox, c.styleDefaultsElements()) - } - - return r.Save(w) -} - -func (c Chart) getRanges() (xrange, yrange, yrangeAlt Range) { - var minx, maxx float64 = math.MaxFloat64, -math.MaxFloat64 - var miny, maxy float64 = math.MaxFloat64, -math.MaxFloat64 - var minya, maxya float64 = math.MaxFloat64, -math.MaxFloat64 - - seriesMappedToSecondaryAxis := false - - // note: a possible future optimization is to not scan the series values if - // all axis are represented by either custom ticks or custom ranges. - for _, s := range c.Series { - if s.GetStyle().IsZero() || s.GetStyle().Show { - seriesAxis := s.GetYAxis() - if bvp, isBoundedValueProvider := s.(BoundedValueProvider); isBoundedValueProvider { - seriesLength := bvp.Len() - for index := 0; index < seriesLength; index++ { - vx, vy1, vy2 := bvp.GetBoundedValue(index) - - minx = math.Min(minx, vx) - maxx = math.Max(maxx, vx) - - if seriesAxis == YAxisPrimary { - miny = math.Min(miny, vy1) - miny = math.Min(miny, vy2) - maxy = math.Max(maxy, vy1) - maxy = math.Max(maxy, vy2) - } else if seriesAxis == YAxisSecondary { - minya = math.Min(minya, vy1) - minya = math.Min(minya, vy2) - maxya = math.Max(maxya, vy1) - maxya = math.Max(maxya, vy2) - seriesMappedToSecondaryAxis = true - } - } - } else if vp, isValueProvider := s.(ValueProvider); isValueProvider { - seriesLength := vp.Len() - for index := 0; index < seriesLength; index++ { - vx, vy := vp.GetValue(index) - - minx = math.Min(minx, vx) - maxx = math.Max(maxx, vx) - - if seriesAxis == YAxisPrimary { - miny = math.Min(miny, vy) - maxy = math.Max(maxy, vy) - } else if seriesAxis == YAxisSecondary { - minya = math.Min(minya, vy) - maxya = math.Max(maxya, vy) - seriesMappedToSecondaryAxis = true - } - } - } - } - } - - if c.XAxis.Range == nil { - xrange = &ContinuousRange{} - } else { - xrange = c.XAxis.Range - } - - if c.YAxis.Range == nil { - yrange = &ContinuousRange{} - } else { - yrange = c.YAxis.Range - } - - if c.YAxisSecondary.Range == nil { - yrangeAlt = &ContinuousRange{} - } else { - yrangeAlt = c.YAxisSecondary.Range - } - - if len(c.XAxis.Ticks) > 0 { - tickMin, tickMax := math.MaxFloat64, -math.MaxFloat64 - for _, t := range c.XAxis.Ticks { - tickMin = math.Min(tickMin, t.Value) - tickMax = math.Max(tickMax, t.Value) - } - xrange.SetMin(tickMin) - xrange.SetMax(tickMax) - } else if xrange.IsZero() { - xrange.SetMin(minx) - xrange.SetMax(maxx) - } - - if len(c.YAxis.Ticks) > 0 { - tickMin, tickMax := math.MaxFloat64, -math.MaxFloat64 - for _, t := range c.YAxis.Ticks { - tickMin = math.Min(tickMin, t.Value) - tickMax = math.Max(tickMax, t.Value) - } - yrange.SetMin(tickMin) - yrange.SetMax(tickMax) - } else if yrange.IsZero() { - yrange.SetMin(miny) - yrange.SetMax(maxy) - - delta := yrange.GetDelta() - roundTo := Math.GetRoundToForDelta(delta) - rmin, rmax := Math.RoundDown(yrange.GetMin(), roundTo), Math.RoundUp(yrange.GetMax(), roundTo) - yrange.SetMin(rmin) - yrange.SetMax(rmax) - } - - if len(c.YAxisSecondary.Ticks) > 0 { - tickMin, tickMax := math.MaxFloat64, -math.MaxFloat64 - for _, t := range c.YAxis.Ticks { - tickMin = math.Min(tickMin, t.Value) - tickMax = math.Max(tickMax, t.Value) - } - yrangeAlt.SetMin(tickMin) - yrangeAlt.SetMax(tickMax) - } else if seriesMappedToSecondaryAxis && yrangeAlt.IsZero() { - yrangeAlt.SetMin(minya) - yrangeAlt.SetMax(maxya) - - delta := yrangeAlt.GetDelta() - roundTo := Math.GetRoundToForDelta(delta) - rmin, rmax := Math.RoundDown(yrangeAlt.GetMin(), roundTo), Math.RoundUp(yrangeAlt.GetMax(), roundTo) - yrangeAlt.SetMin(rmin) - yrangeAlt.SetMax(rmax) - } - - return -} - -func (c Chart) checkRanges(xr, yr, yra Range) error { - if math.IsInf(xr.GetDelta(), 0) || math.IsNaN(xr.GetDelta()) || xr.GetDelta() == 0 { - return errors.New("Invalid (infinite or NaN) x-range delta") - } - if math.IsInf(yr.GetDelta(), 0) || math.IsNaN(yr.GetDelta()) || yr.GetDelta() == 0 { - return errors.New("Invalid (infinite or NaN) y-range delta") - } - if c.hasSecondarySeries() { - if math.IsInf(yra.GetDelta(), 0) || math.IsNaN(yra.GetDelta()) || yra.GetDelta() == 0 { - return errors.New("Invalid (infinite or NaN) y-secondary-range delta") - } - } - - return nil -} - -func (c Chart) getDefaultCanvasBox() Box { - return c.Box() -} - -func (c Chart) getValueFormatters() (x, y, ya ValueFormatter) { - for _, s := range c.Series { - if vfp, isVfp := s.(ValueFormatterProvider); isVfp { - sx, sy := vfp.GetValueFormatters() - if s.GetYAxis() == YAxisPrimary { - x = sx - y = sy - } else if s.GetYAxis() == YAxisSecondary { - x = sx - ya = sy - } - } - } - if c.XAxis.ValueFormatter != nil { - x = c.XAxis.ValueFormatter - } - if c.YAxis.ValueFormatter != nil { - y = c.YAxis.ValueFormatter - } - if c.YAxisSecondary.ValueFormatter != nil { - ya = c.YAxisSecondary.ValueFormatter - } - return -} - -func (c Chart) hasAxes() bool { - return c.XAxis.Style.Show || c.YAxis.Style.Show || c.YAxisSecondary.Style.Show -} - -func (c Chart) getAxesTicks(r Renderer, xr, yr, yar Range, xf, yf, yfa ValueFormatter) (xticks, yticks, yticksAlt []Tick) { - if c.XAxis.Style.Show { - xticks = c.XAxis.GetTicks(r, xr, c.styleDefaultsAxes(), xf) - } - if c.YAxis.Style.Show { - yticks = c.YAxis.GetTicks(r, yr, c.styleDefaultsAxes(), yf) - } - if c.YAxisSecondary.Style.Show { - yticksAlt = c.YAxisSecondary.GetTicks(r, yar, c.styleDefaultsAxes(), yfa) - } - return -} - -func (c Chart) getAxesAdjustedCanvasBox(r Renderer, canvasBox Box, xr, yr, yra Range, xticks, yticks, yticksAlt []Tick) Box { - axesOuterBox := canvasBox.Clone() - if c.XAxis.Style.Show { - axesBounds := c.XAxis.Measure(r, canvasBox, xr, c.styleDefaultsAxes(), xticks) - axesOuterBox = axesOuterBox.Grow(axesBounds) - } - if c.YAxis.Style.Show { - axesBounds := c.YAxis.Measure(r, canvasBox, yr, c.styleDefaultsAxes(), yticks) - axesOuterBox = axesOuterBox.Grow(axesBounds) - } - if c.YAxisSecondary.Style.Show { - axesBounds := c.YAxisSecondary.Measure(r, canvasBox, yra, c.styleDefaultsAxes(), yticksAlt) - axesOuterBox = axesOuterBox.Grow(axesBounds) - } - - return canvasBox.OuterConstrain(c.Box(), axesOuterBox) -} - -func (c Chart) setRangeDomains(canvasBox Box, xr, yr, yra Range) (Range, Range, Range) { - xr.SetDomain(canvasBox.Width()) - yr.SetDomain(canvasBox.Height()) - yra.SetDomain(canvasBox.Height()) - return xr, yr, yra -} - -func (c Chart) hasAnnotationSeries() bool { - for _, s := range c.Series { - if as, isAnnotationSeries := s.(AnnotationSeries); isAnnotationSeries { - if as.Style.IsZero() || as.Style.Show { - return true - } - } - } - return false -} - -func (c Chart) hasSecondarySeries() bool { - for _, s := range c.Series { - if s.GetYAxis() == YAxisSecondary { - return true - } - } - return false -} - -func (c Chart) getAnnotationAdjustedCanvasBox(r Renderer, canvasBox Box, xr, yr, yra Range, xf, yf, yfa ValueFormatter) Box { - annotationSeriesBox := canvasBox.Clone() - for seriesIndex, s := range c.Series { - if as, isAnnotationSeries := s.(AnnotationSeries); isAnnotationSeries { - if as.Style.IsZero() || as.Style.Show { - style := c.styleDefaultsSeries(seriesIndex) - var annotationBounds Box - if as.YAxis == YAxisPrimary { - annotationBounds = as.Measure(r, canvasBox, xr, yr, style) - } else if as.YAxis == YAxisSecondary { - annotationBounds = as.Measure(r, canvasBox, xr, yra, style) - } - - annotationSeriesBox = annotationSeriesBox.Grow(annotationBounds) - } - } - } - - return canvasBox.OuterConstrain(c.Box(), annotationSeriesBox) -} - -func (c Chart) getBackgroundStyle() Style { - return c.Background.InheritFrom(c.styleDefaultsBackground()) -} - -func (c Chart) drawBackground(r Renderer) { - Draw.Box(r, Box{ - Right: c.GetWidth(), - Bottom: c.GetHeight(), - }, c.getBackgroundStyle()) -} - -func (c Chart) getCanvasStyle() Style { - return c.Canvas.InheritFrom(c.styleDefaultsCanvas()) -} - -func (c Chart) drawCanvas(r Renderer, canvasBox Box) { - Draw.Box(r, canvasBox, c.getCanvasStyle()) -} - -func (c Chart) drawAxes(r Renderer, canvasBox Box, xrange, yrange, yrangeAlt Range, xticks, yticks, yticksAlt []Tick) { - if c.XAxis.Style.Show { - c.XAxis.Render(r, canvasBox, xrange, c.styleDefaultsAxes(), xticks) - } - if c.YAxis.Style.Show { - c.YAxis.Render(r, canvasBox, yrange, c.styleDefaultsAxes(), yticks) - } - if c.YAxisSecondary.Style.Show { - c.YAxisSecondary.Render(r, canvasBox, yrangeAlt, c.styleDefaultsAxes(), yticksAlt) - } -} - -func (c Chart) drawSeries(r Renderer, canvasBox Box, xrange, yrange, yrangeAlt Range, s Series, seriesIndex int) { - if s.GetStyle().IsZero() || s.GetStyle().Show { - if s.GetYAxis() == YAxisPrimary { - s.Render(r, canvasBox, xrange, yrange, c.styleDefaultsSeries(seriesIndex)) - } else if s.GetYAxis() == YAxisSecondary { - s.Render(r, canvasBox, xrange, yrangeAlt, c.styleDefaultsSeries(seriesIndex)) - } - } -} - -func (c Chart) drawTitle(r Renderer) { - if len(c.Title) > 0 && c.TitleStyle.Show { - r.SetFont(c.TitleStyle.GetFont(c.GetFont())) - r.SetFontColor(c.TitleStyle.GetFontColor(DefaultTextColor)) - titleFontSize := c.TitleStyle.GetFontSize(DefaultTitleFontSize) - r.SetFontSize(titleFontSize) - - textBox := r.MeasureText(c.Title) - - textWidth := textBox.Width() - textHeight := textBox.Height() - - titleX := (c.GetWidth() >> 1) - (textWidth >> 1) - titleY := c.TitleStyle.Padding.GetTop(DefaultTitleTop) + textHeight - - r.Text(c.Title, titleX, titleY) - } -} - -func (c Chart) styleDefaultsBackground() Style { - return Style{ - FillColor: DefaultBackgroundColor, - StrokeColor: DefaultBackgroundStrokeColor, - StrokeWidth: DefaultStrokeWidth, - } -} - -func (c Chart) styleDefaultsCanvas() Style { - return Style{ - FillColor: DefaultCanvasColor, - StrokeColor: DefaultCanvasStrokeColor, - StrokeWidth: DefaultStrokeWidth, - } -} - -func (c Chart) styleDefaultsSeries(seriesIndex int) Style { - strokeColor := GetDefaultColor(seriesIndex) - return Style{ - StrokeColor: strokeColor, - StrokeWidth: DefaultStrokeWidth, - Font: c.GetFont(), - FontSize: DefaultFontSize, - } -} - -func (c Chart) styleDefaultsAxes() Style { - return Style{ - Font: c.GetFont(), - FontColor: DefaultAxisColor, - FontSize: DefaultAxisFontSize, - StrokeColor: DefaultAxisColor, - StrokeWidth: DefaultAxisLineWidth, - } -} - -func (c Chart) styleDefaultsElements() Style { - return Style{ - Font: c.GetFont(), - } -} - -// Box returns the chart bounds as a box. -func (c Chart) Box() Box { - dpr := c.Background.Padding.GetRight(DefaultBackgroundPadding.Right) - dpb := c.Background.Padding.GetBottom(DefaultBackgroundPadding.Bottom) - - return Box{ - Top: c.Background.Padding.GetTop(DefaultBackgroundPadding.Top), - Left: c.Background.Padding.GetLeft(DefaultBackgroundPadding.Left), - Right: c.GetWidth() - dpr, - Bottom: c.GetHeight() - dpb, - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/chart_test.go b/vendor/github.com/wcharczuk/go-chart/chart_test.go deleted file mode 100644 index fdaf7c3..0000000 --- a/vendor/github.com/wcharczuk/go-chart/chart_test.go +++ /dev/null @@ -1,400 +0,0 @@ -package chart - -import ( - "bytes" - "math" - "testing" - "time" - - "github.com/blendlabs/go-assert" - "github.com/wcharczuk/go-chart/drawing" -) - -func TestChartGetDPI(t *testing.T) { - assert := assert.New(t) - - unset := Chart{} - assert.Equal(DefaultDPI, unset.GetDPI()) - assert.Equal(192, unset.GetDPI(192)) - - set := Chart{DPI: 128} - assert.Equal(128, set.GetDPI()) - assert.Equal(128, set.GetDPI(192)) -} - -func TestChartGetFont(t *testing.T) { - assert := assert.New(t) - - f, err := GetDefaultFont() - assert.Nil(err) - - unset := Chart{} - assert.Nil(unset.GetFont()) - - set := Chart{Font: f} - assert.NotNil(set.GetFont()) -} - -func TestChartGetWidth(t *testing.T) { - assert := assert.New(t) - - unset := Chart{} - assert.Equal(DefaultChartWidth, unset.GetWidth()) - - set := Chart{Width: DefaultChartWidth + 10} - assert.Equal(DefaultChartWidth+10, set.GetWidth()) -} - -func TestChartGetHeight(t *testing.T) { - assert := assert.New(t) - - unset := Chart{} - assert.Equal(DefaultChartHeight, unset.GetHeight()) - - set := Chart{Height: DefaultChartHeight + 10} - assert.Equal(DefaultChartHeight+10, set.GetHeight()) -} - -func TestChartGetRanges(t *testing.T) { - assert := assert.New(t) - - c := Chart{ - Series: []Series{ - ContinuousSeries{ - XValues: []float64{-2.0, -1.0, 0, 1.0, 2.0}, - YValues: []float64{1.0, 2.0, 3.0, 4.0, 4.5}, - }, - ContinuousSeries{ - XValues: []float64{1.0, 2.0, 3.0, 4.0, 5.0}, - YValues: []float64{-2.1, -1.0, 0, 1.0, 2.0}, - }, - ContinuousSeries{ - YAxis: YAxisSecondary, - XValues: []float64{1.0, 2.0, 3.0, 4.0, 5.0}, - YValues: []float64{10.0, 11.0, 12.0, 13.0, 14.0}, - }, - }, - } - - xrange, yrange, yrangeAlt := c.getRanges() - assert.Equal(-2.0, xrange.GetMin()) - assert.Equal(5.0, xrange.GetMax()) - - assert.Equal(-2.1, yrange.GetMin()) - assert.Equal(4.5, yrange.GetMax()) - - assert.Equal(10.0, yrangeAlt.GetMin()) - assert.Equal(14.0, yrangeAlt.GetMax()) - - cSet := Chart{ - XAxis: XAxis{ - Range: &ContinuousRange{Min: 9.8, Max: 19.8}, - }, - YAxis: YAxis{ - Range: &ContinuousRange{Min: 9.9, Max: 19.9}, - }, - YAxisSecondary: YAxis{ - Range: &ContinuousRange{Min: 9.7, Max: 19.7}, - }, - Series: []Series{ - ContinuousSeries{ - XValues: []float64{-2.0, -1.0, 0, 1.0, 2.0}, - YValues: []float64{1.0, 2.0, 3.0, 4.0, 4.5}, - }, - ContinuousSeries{ - XValues: []float64{1.0, 2.0, 3.0, 4.0, 5.0}, - YValues: []float64{-2.1, -1.0, 0, 1.0, 2.0}, - }, - ContinuousSeries{ - YAxis: YAxisSecondary, - XValues: []float64{1.0, 2.0, 3.0, 4.0, 5.0}, - YValues: []float64{10.0, 11.0, 12.0, 13.0, 14.0}, - }, - }, - } - - xr2, yr2, yra2 := cSet.getRanges() - assert.Equal(9.8, xr2.GetMin()) - assert.Equal(19.8, xr2.GetMax()) - - assert.Equal(9.9, yr2.GetMin()) - assert.Equal(19.9, yr2.GetMax()) - - assert.Equal(9.7, yra2.GetMin()) - assert.Equal(19.7, yra2.GetMax()) -} - -func TestChartGetRangesUseTicks(t *testing.T) { - assert := assert.New(t) - - // this test asserts that ticks should supercede manual ranges when generating the overall ranges. - - c := Chart{ - YAxis: YAxis{ - Ticks: []Tick{ - {0.0, "Zero"}, - {1.0, "1.0"}, - {2.0, "2.0"}, - {3.0, "3.0"}, - {4.0, "4.0"}, - {5.0, "Five"}, - }, - Range: &ContinuousRange{ - Min: -5.0, - Max: 5.0, - }, - }, - Series: []Series{ - ContinuousSeries{ - XValues: []float64{-2.0, -1.0, 0, 1.0, 2.0}, - YValues: []float64{1.0, 2.0, 3.0, 4.0, 4.5}, - }, - }, - } - - xr, yr, yar := c.getRanges() - assert.Equal(-2.0, xr.GetMin()) - assert.Equal(2.0, xr.GetMax()) - assert.Equal(0.0, yr.GetMin()) - assert.Equal(5.0, yr.GetMax()) - assert.True(yar.IsZero(), yar.String()) -} - -func TestChartGetRangesUseUserRanges(t *testing.T) { - assert := assert.New(t) - - c := Chart{ - YAxis: YAxis{ - Range: &ContinuousRange{ - Min: -5.0, - Max: 5.0, - }, - }, - Series: []Series{ - ContinuousSeries{ - XValues: []float64{-2.0, -1.0, 0, 1.0, 2.0}, - YValues: []float64{1.0, 2.0, 3.0, 4.0, 4.5}, - }, - }, - } - - xr, yr, yar := c.getRanges() - assert.Equal(-2.0, xr.GetMin()) - assert.Equal(2.0, xr.GetMax()) - assert.Equal(-5.0, yr.GetMin()) - assert.Equal(5.0, yr.GetMax()) - assert.True(yar.IsZero(), yar.String()) -} - -func TestChartGetBackgroundStyle(t *testing.T) { - assert := assert.New(t) - - c := Chart{ - Background: Style{ - FillColor: drawing.ColorBlack, - }, - } - - bs := c.getBackgroundStyle() - assert.Equal(bs.FillColor.String(), drawing.ColorBlack.String()) -} - -func TestChartGetCanvasStyle(t *testing.T) { - assert := assert.New(t) - - c := Chart{ - Canvas: Style{ - FillColor: drawing.ColorBlack, - }, - } - - bs := c.getCanvasStyle() - assert.Equal(bs.FillColor.String(), drawing.ColorBlack.String()) -} - -func TestChartGetDefaultCanvasBox(t *testing.T) { - assert := assert.New(t) - - c := Chart{} - canvasBoxDefault := c.getDefaultCanvasBox() - assert.False(canvasBoxDefault.IsZero()) - assert.Equal(DefaultBackgroundPadding.Top, canvasBoxDefault.Top) - assert.Equal(DefaultBackgroundPadding.Left, canvasBoxDefault.Left) - assert.Equal(c.GetWidth()-DefaultBackgroundPadding.Right, canvasBoxDefault.Right) - assert.Equal(c.GetHeight()-DefaultBackgroundPadding.Bottom, canvasBoxDefault.Bottom) - - custom := Chart{ - Background: Style{ - Padding: Box{ - Top: DefaultBackgroundPadding.Top + 1, - Left: DefaultBackgroundPadding.Left + 1, - Right: DefaultBackgroundPadding.Right + 1, - Bottom: DefaultBackgroundPadding.Bottom + 1, - }, - }, - } - canvasBoxCustom := custom.getDefaultCanvasBox() - assert.False(canvasBoxCustom.IsZero()) - assert.Equal(DefaultBackgroundPadding.Top+1, canvasBoxCustom.Top) - assert.Equal(DefaultBackgroundPadding.Left+1, canvasBoxCustom.Left) - assert.Equal(c.GetWidth()-(DefaultBackgroundPadding.Right+1), canvasBoxCustom.Right) - assert.Equal(c.GetHeight()-(DefaultBackgroundPadding.Bottom+1), canvasBoxCustom.Bottom) -} - -func TestChartGetValueFormatters(t *testing.T) { - assert := assert.New(t) - - c := Chart{ - Series: []Series{ - ContinuousSeries{ - XValues: []float64{-2.0, -1.0, 0, 1.0, 2.0}, - YValues: []float64{1.0, 2.0, 3.0, 4.0, 4.5}, - }, - ContinuousSeries{ - XValues: []float64{1.0, 2.0, 3.0, 4.0, 5.0}, - YValues: []float64{-2.1, -1.0, 0, 1.0, 2.0}, - }, - ContinuousSeries{ - YAxis: YAxisSecondary, - XValues: []float64{1.0, 2.0, 3.0, 4.0, 5.0}, - YValues: []float64{10.0, 11.0, 12.0, 13.0, 14.0}, - }, - }, - } - - dxf, dyf, dyaf := c.getValueFormatters() - assert.NotNil(dxf) - assert.NotNil(dyf) - assert.NotNil(dyaf) -} - -func TestChartHasAxes(t *testing.T) { - assert := assert.New(t) - - assert.False(Chart{}.hasAxes()) - - x := Chart{ - XAxis: XAxis{ - Style: Style{ - Show: true, - }, - }, - } - assert.True(x.hasAxes()) - - y := Chart{ - YAxis: YAxis{ - Style: Style{ - Show: true, - }, - }, - } - assert.True(y.hasAxes()) - - ya := Chart{ - YAxisSecondary: YAxis{ - Style: Style{ - Show: true, - }, - }, - } - assert.True(ya.hasAxes()) -} - -func TestChartGetAxesTicks(t *testing.T) { - assert := assert.New(t) - - r, err := PNG(1024, 1024) - assert.Nil(err) - - c := Chart{ - XAxis: XAxis{ - Style: Style{Show: true}, - Range: &ContinuousRange{Min: 9.8, Max: 19.8}, - }, - YAxis: YAxis{ - Style: Style{Show: true}, - Range: &ContinuousRange{Min: 9.9, Max: 19.9}, - }, - YAxisSecondary: YAxis{ - Style: Style{Show: true}, - Range: &ContinuousRange{Min: 9.7, Max: 19.7}, - }, - } - xr, yr, yar := c.getRanges() - - xt, yt, yat := c.getAxesTicks(r, xr, yr, yar, FloatValueFormatter, FloatValueFormatter, FloatValueFormatter) - assert.NotEmpty(xt) - assert.NotEmpty(yt) - assert.NotEmpty(yat) -} - -func TestChartSingleSeries(t *testing.T) { - assert := assert.New(t) - now := time.Now() - c := Chart{ - Title: "Hello!", - TitleStyle: StyleShow(), - Width: 1024, - Height: 400, - YAxis: YAxis{ - Style: StyleShow(), - Range: &ContinuousRange{ - Min: 0.0, - Max: 4.0, - }, - }, - XAxis: XAxis{ - Style: StyleShow(), - }, - Series: []Series{ - TimeSeries{ - Name: "goog", - XValues: []time.Time{now.AddDate(0, 0, -3), now.AddDate(0, 0, -2), now.AddDate(0, 0, -1)}, - YValues: []float64{1.0, 2.0, 3.0}, - }, - }, - } - - buffer := bytes.NewBuffer([]byte{}) - c.Render(PNG, buffer) - assert.NotEmpty(buffer.Bytes()) -} - -func TestChartRegressionBadRanges(t *testing.T) { - assert := assert.New(t) - - c := Chart{ - Series: []Series{ - ContinuousSeries{ - XValues: []float64{math.Inf(1), math.Inf(1), math.Inf(1), math.Inf(1), math.Inf(1)}, - YValues: []float64{1.0, 2.0, 3.0, 4.0, 4.5}, - }, - }, - } - buffer := bytes.NewBuffer([]byte{}) - c.Render(PNG, buffer) - assert.True(true, "Render needs to finish.") -} - -func TestChartRegressionBadRangesByUser(t *testing.T) { - assert := assert.New(t) - - c := Chart{ - YAxis: YAxis{ - Range: &ContinuousRange{ - Min: math.Inf(-1), - Max: math.Inf(1), // this could really happen? eh. - }, - }, - Series: []Series{ - ContinuousSeries{ - XValues: Sequence.Float64(1.0, 10.0), - YValues: Sequence.Float64(1.0, 10.0), - }, - }, - } - buffer := bytes.NewBuffer([]byte{}) - c.Render(PNG, buffer) - assert.True(true, "Render needs to finish.") -} diff --git a/vendor/github.com/wcharczuk/go-chart/concat_series.go b/vendor/github.com/wcharczuk/go-chart/concat_series.go deleted file mode 100644 index 2c2098f..0000000 --- a/vendor/github.com/wcharczuk/go-chart/concat_series.go +++ /dev/null @@ -1,32 +0,0 @@ -package chart - -// ConcatSeries is a special type of series that concatenates its `InnerSeries`. -type ConcatSeries []Series - -// Len returns the length of the concatenated set of series. -func (cs ConcatSeries) Len() int { - total := 0 - for _, s := range cs { - if typed, isValueProvider := s.(ValueProvider); isValueProvider { - total += typed.Len() - } - } - - return total -} - -// GetValue returns the value at the (meta) index (i.e 0 => totalLen-1) -func (cs ConcatSeries) GetValue(index int) (x, y float64) { - cursor := 0 - for _, s := range cs { - if typed, isValueProvider := s.(ValueProvider); isValueProvider { - len := typed.Len() - if index < cursor+len { - x, y = typed.GetValue(index - cursor) //FENCEPOSTS. - return - } - cursor += typed.Len() - } - } - return -} diff --git a/vendor/github.com/wcharczuk/go-chart/concat_series_test.go b/vendor/github.com/wcharczuk/go-chart/concat_series_test.go deleted file mode 100644 index f72eb23..0000000 --- a/vendor/github.com/wcharczuk/go-chart/concat_series_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package chart - -import ( - "testing" - - assert "github.com/blendlabs/go-assert" -) - -func TestConcatSeries(t *testing.T) { - assert := assert.New(t) - - s1 := ContinuousSeries{ - XValues: Sequence.Float64(1.0, 10.0), - YValues: Sequence.Float64(1.0, 10.0), - } - - s2 := ContinuousSeries{ - XValues: Sequence.Float64(11, 20.0), - YValues: Sequence.Float64(10.0, 1.0), - } - - s3 := ContinuousSeries{ - XValues: Sequence.Float64(21, 30.0), - YValues: Sequence.Float64(1.0, 10.0), - } - - cs := ConcatSeries([]Series{s1, s2, s3}) - assert.Equal(30, cs.Len()) - - x0, y0 := cs.GetValue(0) - assert.Equal(1.0, x0) - assert.Equal(1.0, y0) - - xm, ym := cs.GetValue(19) - assert.Equal(20.0, xm) - assert.Equal(1.0, ym) - - xn, yn := cs.GetValue(29) - assert.Equal(30.0, xn) - assert.Equal(10.0, yn) -} diff --git a/vendor/github.com/wcharczuk/go-chart/continuous_range.go b/vendor/github.com/wcharczuk/go-chart/continuous_range.go deleted file mode 100644 index d119649..0000000 --- a/vendor/github.com/wcharczuk/go-chart/continuous_range.go +++ /dev/null @@ -1,67 +0,0 @@ -package chart - -import ( - "fmt" - "math" -) - -// ContinuousRange represents a boundary for a set of numbers. -type ContinuousRange struct { - Min float64 - Max float64 - Domain int -} - -// IsZero returns if the ContinuousRange has been set or not. -func (r ContinuousRange) IsZero() bool { - return (r.Min == 0 || math.IsNaN(r.Min)) && - (r.Max == 0 || math.IsNaN(r.Max)) && - r.Domain == 0 -} - -// GetMin gets the min value for the continuous range. -func (r ContinuousRange) GetMin() float64 { - return r.Min -} - -// SetMin sets the min value for the continuous range. -func (r *ContinuousRange) SetMin(min float64) { - r.Min = min -} - -// GetMax returns the max value for the continuous range. -func (r ContinuousRange) GetMax() float64 { - return r.Max -} - -// SetMax sets the max value for the continuous range. -func (r *ContinuousRange) SetMax(max float64) { - r.Max = max -} - -// GetDelta returns the difference between the min and max value. -func (r ContinuousRange) GetDelta() float64 { - return r.Max - r.Min -} - -// GetDomain returns the range domain. -func (r ContinuousRange) GetDomain() int { - return r.Domain -} - -// SetDomain sets the range domain. -func (r *ContinuousRange) SetDomain(domain int) { - r.Domain = domain -} - -// String returns a simple string for the ContinuousRange. -func (r ContinuousRange) String() string { - return fmt.Sprintf("ContinuousRange [%.2f,%.2f] => %d", r.Min, r.Max, r.Domain) -} - -// Translate maps a given value into the ContinuousRange space. -func (r ContinuousRange) Translate(value float64) int { - normalized := value - r.Min - ratio := normalized / r.GetDelta() - return int(math.Ceil(ratio * float64(r.Domain))) -} diff --git a/vendor/github.com/wcharczuk/go-chart/continuous_range_test.go b/vendor/github.com/wcharczuk/go-chart/continuous_range_test.go deleted file mode 100644 index 114ecbe..0000000 --- a/vendor/github.com/wcharczuk/go-chart/continuous_range_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package chart - -import ( - "testing" - - "github.com/blendlabs/go-assert" -) - -func TestRangeTranslate(t *testing.T) { - assert := assert.New(t) - values := []float64{1.0, 2.0, 2.5, 2.7, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0} - r := ContinuousRange{Domain: 1000} - r.Min, r.Max = Math.MinAndMax(values...) - - // delta = ~7.0 - // value = ~5.0 - // domain = ~1000 - // 5/8 * 1000 ~= - assert.Equal(0, r.Translate(1.0)) - assert.Equal(1000, r.Translate(8.0)) - assert.Equal(572, r.Translate(5.0)) -} diff --git a/vendor/github.com/wcharczuk/go-chart/continuous_series.go b/vendor/github.com/wcharczuk/go-chart/continuous_series.go deleted file mode 100644 index fe8d068..0000000 --- a/vendor/github.com/wcharczuk/go-chart/continuous_series.go +++ /dev/null @@ -1,55 +0,0 @@ -package chart - -// ContinuousSeries represents a line on a chart. -type ContinuousSeries struct { - Name string - Style Style - - YAxis YAxisType - - XValues []float64 - YValues []float64 -} - -// GetName returns the name of the time series. -func (cs ContinuousSeries) GetName() string { - return cs.Name -} - -// GetStyle returns the line style. -func (cs ContinuousSeries) GetStyle() Style { - return cs.Style -} - -// Len returns the number of elements in the series. -func (cs ContinuousSeries) Len() int { - return len(cs.XValues) -} - -// GetValue gets a value at a given index. -func (cs ContinuousSeries) GetValue(index int) (float64, float64) { - return cs.XValues[index], cs.YValues[index] -} - -// GetLastValue gets the last value. -func (cs ContinuousSeries) GetLastValue() (float64, float64) { - return cs.XValues[len(cs.XValues)-1], cs.YValues[len(cs.YValues)-1] -} - -// GetValueFormatters returns value formatter defaults for the series. -func (cs ContinuousSeries) GetValueFormatters() (x, y ValueFormatter) { - x = FloatValueFormatter - y = FloatValueFormatter - return -} - -// GetYAxis returns which YAxis the series draws on. -func (cs ContinuousSeries) GetYAxis() YAxisType { - return cs.YAxis -} - -// Render renders the series. -func (cs ContinuousSeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - style := cs.Style.InheritFrom(defaults) - Draw.LineSeries(r, canvasBox, xrange, yrange, style, cs) -} diff --git a/vendor/github.com/wcharczuk/go-chart/continuous_series_test.go b/vendor/github.com/wcharczuk/go-chart/continuous_series_test.go deleted file mode 100644 index 171db37..0000000 --- a/vendor/github.com/wcharczuk/go-chart/continuous_series_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package chart - -import ( - "testing" - - assert "github.com/blendlabs/go-assert" -) - -func TestContinuousSeries(t *testing.T) { - assert := assert.New(t) - - cs := ContinuousSeries{ - Name: "Test Series", - XValues: Sequence.Float64(1.0, 10.0), - YValues: Sequence.Float64(1.0, 10.0), - } - - assert.Equal("Test Series", cs.GetName()) - assert.Equal(10, cs.Len()) - x0, y0 := cs.GetValue(0) - assert.Equal(1.0, x0) - assert.Equal(1.0, y0) - - xn, yn := cs.GetValue(9) - assert.Equal(10.0, xn) - assert.Equal(10.0, yn) - - xn, yn = cs.GetLastValue() - assert.Equal(10.0, xn) - assert.Equal(10.0, yn) -} diff --git a/vendor/github.com/wcharczuk/go-chart/date.go b/vendor/github.com/wcharczuk/go-chart/date.go deleted file mode 100644 index e75bdaa..0000000 --- a/vendor/github.com/wcharczuk/go-chart/date.go +++ /dev/null @@ -1,402 +0,0 @@ -package chart - -import ( - "sync" - "time" -) - -const ( - // AllDaysMask is a bitmask of all the days of the week. - AllDaysMask = 1<friday. -func (d date) IsWeekDay(day time.Weekday) bool { - return !d.IsWeekendDay(day) -} - -// IsWeekendDay returns if the day is a monday->friday. -func (d date) IsWeekendDay(day time.Weekday) bool { - return day == time.Saturday || day == time.Sunday -} - -// Before returns if a timestamp is strictly before another date (ignoring hours, minutes etc.) -func (d date) Before(before, reference time.Time) bool { - tzAdjustedBefore := before.In(reference.Location()) - if tzAdjustedBefore.Year() < reference.Year() { - return true - } - if tzAdjustedBefore.Month() < reference.Month() { - return true - } - return tzAdjustedBefore.Year() == reference.Year() && tzAdjustedBefore.Month() == reference.Month() && tzAdjustedBefore.Day() < reference.Day() -} - -// NextMarketOpen returns the next market open after a given time. -func (d date) NextMarketOpen(after, openTime time.Time, isHoliday HolidayProvider) time.Time { - afterLocalized := after.In(openTime.Location()) - todaysOpen := d.On(openTime, afterLocalized) - - if isHoliday == nil { - isHoliday = defaultHolidayProvider - } - - todayIsValidTradingDay := d.IsWeekDay(todaysOpen.Weekday()) && !isHoliday(todaysOpen) - - if (afterLocalized.Equal(todaysOpen) || afterLocalized.Before(todaysOpen)) && todayIsValidTradingDay { - return todaysOpen - } - - for cursorDay := 1; cursorDay < 7; cursorDay++ { - newDay := todaysOpen.AddDate(0, 0, cursorDay) - isValidTradingDay := d.IsWeekDay(newDay.Weekday()) && !isHoliday(newDay) - if isValidTradingDay { - return d.On(openTime, newDay) - } - } - panic("Have exhausted day window looking for next market open.") -} - -// NextMarketClose returns the next market close after a given time. -func (d date) NextMarketClose(after, closeTime time.Time, isHoliday HolidayProvider) time.Time { - afterLocalized := after.In(closeTime.Location()) - - if isHoliday == nil { - isHoliday = defaultHolidayProvider - } - - todaysClose := d.On(closeTime, afterLocalized) - if afterLocalized.Before(todaysClose) && d.IsWeekDay(todaysClose.Weekday()) && !isHoliday(todaysClose) { - return todaysClose - } - - if afterLocalized.Equal(todaysClose) { //rare but it might happen. - return todaysClose - } - - for cursorDay := 1; cursorDay < 6; cursorDay++ { - newDay := todaysClose.AddDate(0, 0, cursorDay) - if d.IsWeekDay(newDay.Weekday()) && !isHoliday(newDay) { - return d.On(closeTime, newDay) - } - } - panic("Have exhausted day window looking for next market close.") -} - -// CalculateMarketSecondsBetween calculates the number of seconds the market was open between two dates. -func (d date) CalculateMarketSecondsBetween(start, end, marketOpen, marketClose time.Time, isHoliday HolidayProvider) (seconds int64) { - startEastern := start.In(d.Eastern()) - endEastern := end.In(d.Eastern()) - - startMarketOpen := d.On(marketOpen, startEastern) - startMarketClose := d.On(marketClose, startEastern) - - if !d.IsWeekendDay(startMarketOpen.Weekday()) && !isHoliday(startMarketOpen) { - if (startEastern.Equal(startMarketOpen) || startEastern.After(startMarketOpen)) && startEastern.Before(startMarketClose) { - if endEastern.Before(startMarketClose) { - seconds += int64(endEastern.Sub(startEastern) / time.Second) - } else { - seconds += int64(startMarketClose.Sub(startEastern) / time.Second) - } - } - } - - cursor := d.NextMarketOpen(startMarketClose, marketOpen, isHoliday) - for d.Before(cursor, endEastern) { - if d.IsWeekDay(cursor.Weekday()) && !isHoliday(cursor) { - close := d.NextMarketClose(cursor, marketClose, isHoliday) - seconds += int64(close.Sub(cursor) / time.Second) - } - cursor = cursor.AddDate(0, 0, 1) - } - - finalMarketOpen := d.NextMarketOpen(cursor, marketOpen, isHoliday) - finalMarketClose := d.NextMarketClose(cursor, marketClose, isHoliday) - if endEastern.After(finalMarketOpen) { - if endEastern.Before(finalMarketClose) { - seconds += int64(endEastern.Sub(finalMarketOpen) / time.Second) - } else { - seconds += int64(finalMarketClose.Sub(finalMarketOpen) / time.Second) - } - } - - return -} - -const ( - _secondsPerDay = 60 * 60 * 24 -) - -func (d date) Diff(t1, t2 time.Time) (days int64) { - t1n := t1.Unix() - t2n := t2.Unix() - diff := t1n - t2n - return diff / (_secondsPerDay) -} - -// NextDay returns the timestamp advanced a day. -func (d date) NextDay(ts time.Time) time.Time { - return ts.AddDate(0, 0, 1) -} - -// NextHour returns the next timestamp on the hour. -func (d date) NextHour(ts time.Time) time.Time { - //advance a full hour ... - advanced := ts.Add(time.Hour) - minutes := time.Duration(advanced.Minute()) * time.Minute - final := advanced.Add(-minutes) - return time.Date(final.Year(), final.Month(), final.Day(), final.Hour(), 0, 0, 0, final.Location()) -} - -// NextDayOfWeek returns the next instance of a given weekday after a given timestamp. -func (d date) NextDayOfWeek(after time.Time, dayOfWeek time.Weekday) time.Time { - afterWeekday := after.Weekday() - if afterWeekday == dayOfWeek { - return after.AddDate(0, 0, 7) - } - - // 1 vs 5 ~ add 4 days - if afterWeekday < dayOfWeek { - dayDelta := int(dayOfWeek - afterWeekday) - return after.AddDate(0, 0, dayDelta) - } - - // 5 vs 1, add 7-(5-1) ~ 3 days - dayDelta := 7 - int(afterWeekday-dayOfWeek) - return after.AddDate(0, 0, dayDelta) -} diff --git a/vendor/github.com/wcharczuk/go-chart/date_test.go b/vendor/github.com/wcharczuk/go-chart/date_test.go deleted file mode 100644 index 70194f7..0000000 --- a/vendor/github.com/wcharczuk/go-chart/date_test.go +++ /dev/null @@ -1,238 +0,0 @@ -package chart - -import ( - "testing" - "time" - - assert "github.com/blendlabs/go-assert" -) - -func parse(v string) time.Time { - ts, _ := time.Parse("2006-01-02", v) - return ts -} - -func TestDateTime(t *testing.T) { - assert := assert.New(t) - - ts := Date.Time(5, 6, 7, 8, time.UTC) - assert.Equal(05, ts.Hour()) - assert.Equal(06, ts.Minute()) - assert.Equal(07, ts.Second()) - assert.Equal(8, ts.Nanosecond()) - assert.Equal(time.UTC, ts.Location()) -} - -func TestDateDate(t *testing.T) { - assert := assert.New(t) - - ts := Date.Date(2015, 5, 6, time.UTC) - assert.Equal(2015, ts.Year()) - assert.Equal(5, ts.Month()) - assert.Equal(6, ts.Day()) - assert.Equal(time.UTC, ts.Location()) -} - -func TestDateOn(t *testing.T) { - assert := assert.New(t) - - ts := Date.On(Date.Time(5, 4, 3, 2, time.UTC), Date.Date(2016, 6, 7, Date.Eastern())) - assert.Equal(2016, ts.Year()) - assert.Equal(6, ts.Month()) - assert.Equal(7, ts.Day()) - assert.Equal(5, ts.Hour()) - assert.Equal(4, ts.Minute()) - assert.Equal(3, ts.Second()) - assert.Equal(2, ts.Nanosecond()) - assert.Equal(time.UTC, ts.Location()) -} - -func TestDateNoonOn(t *testing.T) { - assert := assert.New(t) - noon := Date.NoonOn(time.Date(2016, 04, 03, 02, 01, 0, 0, time.UTC)) - - assert.Equal(2016, noon.Year()) - assert.Equal(4, noon.Month()) - assert.Equal(3, noon.Day()) - assert.Equal(12, noon.Hour()) - assert.Equal(0, noon.Minute()) - assert.Equal(time.UTC, noon.Location()) -} - -func TestDateBefore(t *testing.T) { - assert := assert.New(t) - - assert.True(Date.Before(parse("2015-07-02"), parse("2016-07-01"))) - assert.True(Date.Before(parse("2016-06-01"), parse("2016-07-01"))) - assert.True(Date.Before(parse("2016-07-01"), parse("2016-07-02"))) - - assert.False(Date.Before(parse("2016-07-01"), parse("2016-07-01"))) - assert.False(Date.Before(parse("2016-07-03"), parse("2016-07-01"))) - assert.False(Date.Before(parse("2016-08-03"), parse("2016-07-01"))) - assert.False(Date.Before(parse("2017-08-03"), parse("2016-07-01"))) -} - -func TestDateBeforeHandlesTimezones(t *testing.T) { - assert := assert.New(t) - - tuesdayUTC := time.Date(2016, 8, 02, 22, 00, 0, 0, time.UTC) - mondayUTC := time.Date(2016, 8, 01, 1, 00, 0, 0, time.UTC) - sundayEST := time.Date(2016, 7, 31, 22, 00, 0, 0, Date.Eastern()) - - assert.True(Date.Before(sundayEST, tuesdayUTC)) - assert.False(Date.Before(sundayEST, mondayUTC)) -} - -func TestNextMarketOpen(t *testing.T) { - assert := assert.New(t) - - beforeOpen := time.Date(2016, 07, 18, 9, 0, 0, 0, Date.Eastern()) - todayOpen := time.Date(2016, 07, 18, 9, 30, 0, 0, Date.Eastern()) - - afterOpen := time.Date(2016, 07, 18, 9, 31, 0, 0, Date.Eastern()) - tomorrowOpen := time.Date(2016, 07, 19, 9, 30, 0, 0, Date.Eastern()) - - afterFriday := time.Date(2016, 07, 22, 9, 31, 0, 0, Date.Eastern()) - mondayOpen := time.Date(2016, 07, 25, 9, 30, 0, 0, Date.Eastern()) - - weekend := time.Date(2016, 07, 23, 9, 31, 0, 0, Date.Eastern()) - - assert.True(todayOpen.Equal(Date.NextMarketOpen(beforeOpen, NYSEOpen, Date.IsNYSEHoliday))) - assert.True(tomorrowOpen.Equal(Date.NextMarketOpen(afterOpen, NYSEOpen, Date.IsNYSEHoliday))) - assert.True(mondayOpen.Equal(Date.NextMarketOpen(afterFriday, NYSEOpen, Date.IsNYSEHoliday))) - assert.True(mondayOpen.Equal(Date.NextMarketOpen(weekend, NYSEOpen, Date.IsNYSEHoliday))) - - assert.Equal(Date.Eastern(), todayOpen.Location()) - assert.Equal(Date.Eastern(), tomorrowOpen.Location()) - assert.Equal(Date.Eastern(), mondayOpen.Location()) - - testRegression := time.Date(2016, 07, 18, 16, 0, 0, 0, Date.Eastern()) - shouldbe := time.Date(2016, 07, 19, 9, 30, 0, 0, Date.Eastern()) - - assert.True(shouldbe.Equal(Date.NextMarketOpen(testRegression, NYSEOpen, Date.IsNYSEHoliday))) -} - -func TestNextMarketClose(t *testing.T) { - assert := assert.New(t) - - beforeClose := time.Date(2016, 07, 18, 15, 0, 0, 0, Date.Eastern()) - todayClose := time.Date(2016, 07, 18, 16, 00, 0, 0, Date.Eastern()) - - afterClose := time.Date(2016, 07, 18, 16, 1, 0, 0, Date.Eastern()) - tomorrowClose := time.Date(2016, 07, 19, 16, 00, 0, 0, Date.Eastern()) - - afterFriday := time.Date(2016, 07, 22, 16, 1, 0, 0, Date.Eastern()) - mondayClose := time.Date(2016, 07, 25, 16, 0, 0, 0, Date.Eastern()) - - weekend := time.Date(2016, 07, 23, 9, 31, 0, 0, Date.Eastern()) - - assert.True(todayClose.Equal(Date.NextMarketClose(beforeClose, NYSEClose, Date.IsNYSEHoliday))) - assert.True(tomorrowClose.Equal(Date.NextMarketClose(afterClose, NYSEClose, Date.IsNYSEHoliday))) - assert.True(mondayClose.Equal(Date.NextMarketClose(afterFriday, NYSEClose, Date.IsNYSEHoliday))) - assert.True(mondayClose.Equal(Date.NextMarketClose(weekend, NYSEClose, Date.IsNYSEHoliday))) - - assert.Equal(Date.Eastern(), todayClose.Location()) - assert.Equal(Date.Eastern(), tomorrowClose.Location()) - assert.Equal(Date.Eastern(), mondayClose.Location()) -} - -func TestCalculateMarketSecondsBetween(t *testing.T) { - assert := assert.New(t) - - start := time.Date(2016, 07, 18, 9, 30, 0, 0, Date.Eastern()) - end := time.Date(2016, 07, 22, 16, 00, 0, 0, Date.Eastern()) - - shouldbe := 5 * 6.5 * 60 * 60 - - assert.Equal(shouldbe, Date.CalculateMarketSecondsBetween(start, end, NYSEOpen, NYSEClose, Date.IsNYSEHoliday)) -} - -func TestCalculateMarketSecondsBetween1D(t *testing.T) { - assert := assert.New(t) - - start := time.Date(2016, 07, 22, 9, 45, 0, 0, Date.Eastern()) - end := time.Date(2016, 07, 22, 15, 45, 0, 0, Date.Eastern()) - - shouldbe := 6 * 60 * 60 - - assert.Equal(shouldbe, Date.CalculateMarketSecondsBetween(start, end, NYSEOpen, NYSEClose, Date.IsNYSEHoliday)) -} - -func TestCalculateMarketSecondsBetweenLTM(t *testing.T) { - assert := assert.New(t) - - start := time.Date(2015, 07, 01, 9, 30, 0, 0, Date.Eastern()) - end := time.Date(2016, 07, 01, 9, 30, 0, 0, Date.Eastern()) - - shouldbe := 253 * 6.5 * 60 * 60 //253 full market days since this date last year. - assert.Equal(shouldbe, Date.CalculateMarketSecondsBetween(start, end, NYSEOpen, NYSEClose, Date.IsNYSEHoliday)) -} - -func TestDateNextHour(t *testing.T) { - assert := assert.New(t) - - start := time.Date(2015, 07, 01, 9, 30, 0, 0, Date.Eastern()) - next := Date.NextHour(start) - assert.Equal(2015, next.Year()) - assert.Equal(07, next.Month()) - assert.Equal(01, next.Day()) - assert.Equal(10, next.Hour()) - assert.Equal(00, next.Minute()) - - next = Date.NextHour(next) - assert.Equal(11, next.Hour()) - - next = Date.NextHour(next) - assert.Equal(12, next.Hour()) - -} - -func TestDateNextDayOfWeek(t *testing.T) { - assert := assert.New(t) - - weds := Date.Date(2016, 8, 10, time.UTC) - fri := Date.Date(2016, 8, 12, time.UTC) - sun := Date.Date(2016, 8, 14, time.UTC) - mon := Date.Date(2016, 8, 15, time.UTC) - weds2 := Date.Date(2016, 8, 17, time.UTC) - - nextFri := Date.NextDayOfWeek(weds, time.Friday) - nextSunday := Date.NextDayOfWeek(weds, time.Sunday) - nextMonday := Date.NextDayOfWeek(weds, time.Monday) - nextWeds := Date.NextDayOfWeek(weds, time.Wednesday) - - assert.Equal(fri.Year(), nextFri.Year()) - assert.Equal(fri.Month(), nextFri.Month()) - assert.Equal(fri.Day(), nextFri.Day()) - - assert.Equal(sun.Year(), nextSunday.Year()) - assert.Equal(sun.Month(), nextSunday.Month()) - assert.Equal(sun.Day(), nextSunday.Day()) - - assert.Equal(mon.Year(), nextMonday.Year()) - assert.Equal(mon.Month(), nextMonday.Month()) - assert.Equal(mon.Day(), nextMonday.Day()) - - assert.Equal(weds2.Year(), nextWeds.Year()) - assert.Equal(weds2.Month(), nextWeds.Month()) - assert.Equal(weds2.Day(), nextWeds.Day()) - - assert.Equal(time.UTC, nextFri.Location()) - assert.Equal(time.UTC, nextSunday.Location()) - assert.Equal(time.UTC, nextMonday.Location()) -} - -func TestDateIsNYSEHoliday(t *testing.T) { - assert := assert.New(t) - - cursor := time.Date(2013, 01, 01, 0, 0, 0, 0, time.UTC) - end := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC) - var holidays int - for Date.Before(cursor, end) { - if Date.IsNYSEHoliday(cursor) { - holidays++ - } - cursor = cursor.AddDate(0, 0, 1) - } - assert.Equal(holidays, 55) -} diff --git a/vendor/github.com/wcharczuk/go-chart/defaults.go b/vendor/github.com/wcharczuk/go-chart/defaults.go deleted file mode 100644 index 482d489..0000000 --- a/vendor/github.com/wcharczuk/go-chart/defaults.go +++ /dev/null @@ -1,214 +0,0 @@ -package chart - -import ( - "sync" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/drawing" -) - -const ( - // DefaultChartHeight is the default chart height. - DefaultChartHeight = 400 - // DefaultChartWidth is the default chart width. - DefaultChartWidth = 1024 - // DefaultStrokeWidth is the default chart line/stroke width. - DefaultStrokeWidth = 1.0 - // DefaultAxisLineWidth is the line width of the axis lines. - DefaultAxisLineWidth = 1.0 - //DefaultDPI is the default dots per inch for the chart. - DefaultDPI = 92.0 - // DefaultMinimumFontSize is the default minimum font size. - DefaultMinimumFontSize = 8.0 - // DefaultFontSize is the default font size. - DefaultFontSize = 10.0 - // DefaultTitleFontSize is the default title font size. - DefaultTitleFontSize = 18.0 - // DefaultAnnotationDeltaWidth is the width of the left triangle out of annotations. - DefaultAnnotationDeltaWidth = 10 - // DefaultAnnotationFontSize is the font size of annotations. - DefaultAnnotationFontSize = 10.0 - // DefaultAxisFontSize is the font size of the axis labels. - DefaultAxisFontSize = 10.0 - // DefaultTitleTop is the default distance from the top of the chart to put the title. - DefaultTitleTop = 10 - - // DefaultLineSpacing is the default vertical distance between lines of text. - DefaultLineSpacing = 5 - - // DefaultYAxisMargin is the default distance from the right of the canvas to the y axis labels. - DefaultYAxisMargin = 10 - // DefaultXAxisMargin is the default distance from bottom of the canvas to the x axis labels. - DefaultXAxisMargin = 10 - - //DefaultVerticalTickHeight is half the margin. - DefaultVerticalTickHeight = DefaultXAxisMargin >> 1 - //DefaultHorizontalTickWidth is half the margin. - DefaultHorizontalTickWidth = DefaultYAxisMargin >> 1 - - // DefaultTickCount is the default number of ticks to show - DefaultTickCount = 10 - // DefaultTickCountSanityCheck is a hard limit on number of ticks to prevent infinite loops. - DefaultTickCountSanityCheck = 1 << 10 //1024 - - // DefaultMinimumTickHorizontalSpacing is the minimum distance between horizontal ticks. - DefaultMinimumTickHorizontalSpacing = 20 - // DefaultMinimumTickVerticalSpacing is the minimum distance between vertical ticks. - DefaultMinimumTickVerticalSpacing = 20 - - // DefaultDateFormat is the default date format. - DefaultDateFormat = "2006-01-02" - // DefaultDateHourFormat is the date format for hour timestamp formats. - DefaultDateHourFormat = "01-02 3PM" - // DefaultDateMinuteFormat is the date format for minute range timestamp formats. - DefaultDateMinuteFormat = "01-02 3:04PM" - // DefaultFloatFormat is the default float format. - DefaultFloatFormat = "%.2f" - // DefaultPercentValueFormat is the default percent format. - DefaultPercentValueFormat = "%0.2f%%" - - // DefaultBarSpacing is the default pixel spacing between bars. - DefaultBarSpacing = 100 - // DefaultBarWidth is the default pixel width of bars in a bar chart. - DefaultBarWidth = 50 -) - -var ( - // ColorWhite is white. - ColorWhite = drawing.Color{R: 255, G: 255, B: 255, A: 255} - // ColorBlue is the basic theme blue color. - ColorBlue = drawing.Color{R: 0, G: 116, B: 217, A: 255} - // ColorCyan is the basic theme cyan color. - ColorCyan = drawing.Color{R: 0, G: 217, B: 210, A: 255} - // ColorGreen is the basic theme green color. - ColorGreen = drawing.Color{R: 0, G: 217, B: 101, A: 255} - // ColorRed is the basic theme red color. - ColorRed = drawing.Color{R: 217, G: 0, B: 116, A: 255} - // ColorOrange is the basic theme orange color. - ColorOrange = drawing.Color{R: 217, G: 101, B: 0, A: 255} - // ColorYellow is the basic theme yellow color. - ColorYellow = drawing.Color{R: 217, G: 210, B: 0, A: 255} - // ColorBlack is the basic theme black color. - ColorBlack = drawing.Color{R: 51, G: 51, B: 51, A: 255} - // ColorLightGray is the basic theme light gray color. - ColorLightGray = drawing.Color{R: 239, G: 239, B: 239, A: 255} - - // ColorAlternateBlue is a alternate theme color. - ColorAlternateBlue = drawing.Color{R: 106, G: 195, B: 203, A: 255} - // ColorAlternateGreen is a alternate theme color. - ColorAlternateGreen = drawing.Color{R: 42, G: 190, B: 137, A: 255} - // ColorAlternateGray is a alternate theme color. - ColorAlternateGray = drawing.Color{R: 110, G: 128, B: 139, A: 255} - // ColorAlternateYellow is a alternate theme color. - ColorAlternateYellow = drawing.Color{R: 240, G: 174, B: 90, A: 255} - // ColorAlternateLightGray is a alternate theme color. - ColorAlternateLightGray = drawing.Color{R: 187, G: 190, B: 191, A: 255} -) - -var ( - // DefaultBackgroundColor is the default chart background color. - // It is equivalent to css color:white. - DefaultBackgroundColor = ColorWhite - // DefaultBackgroundStrokeColor is the default chart border color. - // It is equivalent to color:white. - DefaultBackgroundStrokeColor = ColorWhite - // DefaultCanvasColor is the default chart canvas color. - // It is equivalent to css color:white. - DefaultCanvasColor = ColorWhite - // DefaultCanvasStrokeColor is the default chart canvas stroke color. - // It is equivalent to css color:white. - DefaultCanvasStrokeColor = ColorWhite - // DefaultTextColor is the default chart text color. - // It is equivalent to #333333. - DefaultTextColor = ColorBlack - // DefaultAxisColor is the default chart axis line color. - // It is equivalent to #333333. - DefaultAxisColor = ColorBlack - // DefaultStrokeColor is the default chart border color. - // It is equivalent to #efefef. - DefaultStrokeColor = ColorLightGray - // DefaultFillColor is the default fill color. - // It is equivalent to #0074d9. - DefaultFillColor = ColorBlue - // DefaultAnnotationFillColor is the default annotation background color. - DefaultAnnotationFillColor = ColorWhite - // DefaultGridLineColor is the default grid line color. - DefaultGridLineColor = ColorLightGray -) - -var ( - // DefaultColors are a couple default series colors. - DefaultColors = []drawing.Color{ - ColorBlue, - ColorGreen, - ColorRed, - ColorCyan, - ColorOrange, - } - - // DefaultAlternateColors are a couple alternate colors. - DefaultAlternateColors = []drawing.Color{ - ColorAlternateBlue, - ColorAlternateGreen, - ColorAlternateGray, - ColorAlternateYellow, - ColorBlue, - ColorGreen, - ColorRed, - ColorCyan, - ColorOrange, - } -) - -var ( - // DashArrayDots is a dash array that represents '....' style stroke dashes. - DashArrayDots = []int{1, 1} - // DashArrayDashesSmall is a dash array that represents '- - -' style stroke dashes. - DashArrayDashesSmall = []int{3, 3} - // DashArrayDashesMedium is a dash array that represents '-- -- --' style stroke dashes. - DashArrayDashesMedium = []int{5, 5} - // DashArrayDashesLarge is a dash array that represents '----- ----- -----' style stroke dashes. - DashArrayDashesLarge = []int{10, 10} -) - -// GetDefaultColor returns a color from the default list by index. -// NOTE: the index will wrap around (using a modulo). -func GetDefaultColor(index int) drawing.Color { - finalIndex := index % len(DefaultColors) - return DefaultColors[finalIndex] -} - -// GetAlternateColor returns a color from the default list by index. -// NOTE: the index will wrap around (using a modulo). -func GetAlternateColor(index int) drawing.Color { - finalIndex := index % len(DefaultAlternateColors) - return DefaultAlternateColors[finalIndex] -} - -var ( - // DefaultAnnotationPadding is the padding around an annotation. - DefaultAnnotationPadding = Box{Top: 5, Left: 5, Right: 5, Bottom: 5} - // DefaultBackgroundPadding is the default canvas padding config. - DefaultBackgroundPadding = Box{Top: 5, Left: 5, Right: 5, Bottom: 5} -) - -var ( - _defaultFontLock sync.Mutex - _defaultFont *truetype.Font -) - -// GetDefaultFont returns the default font (Roboto-Medium). -func GetDefaultFont() (*truetype.Font, error) { - if _defaultFont == nil { - _defaultFontLock.Lock() - defer _defaultFontLock.Unlock() - if _defaultFont == nil { - font, err := truetype.Parse(roboto) - if err != nil { - return nil, err - } - _defaultFont = font - } - } - return _defaultFont, nil -} diff --git a/vendor/github.com/wcharczuk/go-chart/draw.go b/vendor/github.com/wcharczuk/go-chart/draw.go deleted file mode 100644 index e06462e..0000000 --- a/vendor/github.com/wcharczuk/go-chart/draw.go +++ /dev/null @@ -1,294 +0,0 @@ -package chart - -import "math" - -var ( - // Draw contains helpers for drawing common objects. - Draw = &draw{} -) - -type draw struct{} - -// LineSeries draws a line series with a renderer. -func (d draw) LineSeries(r Renderer, canvasBox Box, xrange, yrange Range, style Style, vs ValueProvider) { - if vs.Len() == 0 { - return - } - - cb := canvasBox.Bottom - cl := canvasBox.Left - - v0x, v0y := vs.GetValue(0) - x0 := cl + xrange.Translate(v0x) - y0 := cb - yrange.Translate(v0y) - - yv0 := yrange.Translate(0) - - var vx, vy float64 - var x, y int - - fill := style.GetFillColor() - if !fill.IsZero() { - style.GetFillOptions().WriteToRenderer(r) - r.MoveTo(x0, y0) - for i := 1; i < vs.Len(); i++ { - vx, vy = vs.GetValue(i) - x = cl + xrange.Translate(vx) - y = cb - yrange.Translate(vy) - r.LineTo(x, y) - } - r.LineTo(x, Math.MinInt(cb, cb-yv0)) - r.LineTo(x0, Math.MinInt(cb, cb-yv0)) - r.LineTo(x0, y0) - r.Fill() - } - - style.GetStrokeOptions().WriteToRenderer(r) - - r.MoveTo(x0, y0) - for i := 1; i < vs.Len(); i++ { - vx, vy = vs.GetValue(i) - x = cl + xrange.Translate(vx) - y = cb - yrange.Translate(vy) - r.LineTo(x, y) - } - r.Stroke() -} - -// BoundedSeries draws a series that implements BoundedValueProvider. -func (d draw) BoundedSeries(r Renderer, canvasBox Box, xrange, yrange Range, style Style, bbs BoundedValueProvider, drawOffsetIndexes ...int) { - drawOffsetIndex := 0 - if len(drawOffsetIndexes) > 0 { - drawOffsetIndex = drawOffsetIndexes[0] - } - - cb := canvasBox.Bottom - cl := canvasBox.Left - - v0x, v0y1, v0y2 := bbs.GetBoundedValue(0) - x0 := cl + xrange.Translate(v0x) - y0 := cb - yrange.Translate(v0y1) - - var vx, vy1, vy2 float64 - var x, y int - - xvalues := make([]float64, bbs.Len()) - xvalues[0] = v0x - y2values := make([]float64, bbs.Len()) - y2values[0] = v0y2 - - style.GetFillAndStrokeOptions().WriteToRenderer(r) - r.MoveTo(x0, y0) - for i := 1; i < bbs.Len(); i++ { - vx, vy1, vy2 = bbs.GetBoundedValue(i) - - xvalues[i] = vx - y2values[i] = vy2 - - x = cl + xrange.Translate(vx) - y = cb - yrange.Translate(vy1) - if i > drawOffsetIndex { - r.LineTo(x, y) - } else { - r.MoveTo(x, y) - } - } - y = cb - yrange.Translate(vy2) - r.LineTo(x, y) - for i := bbs.Len() - 1; i >= drawOffsetIndex; i-- { - vx, vy2 = xvalues[i], y2values[i] - x = cl + xrange.Translate(vx) - y = cb - yrange.Translate(vy2) - r.LineTo(x, y) - } - r.Close() - r.FillStroke() -} - -// HistogramSeries draws a value provider as boxes from 0. -func (d draw) HistogramSeries(r Renderer, canvasBox Box, xrange, yrange Range, style Style, vs ValueProvider, barWidths ...int) { - if vs.Len() == 0 { - return - } - - //calculate bar width? - seriesLength := vs.Len() - barWidth := int(math.Floor(float64(xrange.GetDomain()) / float64(seriesLength))) - if len(barWidths) > 0 { - barWidth = barWidths[0] - } - - cb := canvasBox.Bottom - cl := canvasBox.Left - - //foreach datapoint, draw a box. - for index := 0; index < seriesLength; index++ { - vx, vy := vs.GetValue(index) - y0 := yrange.Translate(0) - x := cl + xrange.Translate(vx) - y := yrange.Translate(vy) - - d.Box(r, Box{ - Top: cb - y0, - Left: x - (barWidth >> 1), - Right: x + (barWidth >> 1), - Bottom: cb - y, - }, style) - } -} - -// MeasureAnnotation measures how big an annotation would be. -func (d draw) MeasureAnnotation(r Renderer, canvasBox Box, style Style, lx, ly int, label string) Box { - style.WriteToRenderer(r) - defer r.ResetStyle() - - textBox := r.MeasureText(label) - textWidth := textBox.Width() - textHeight := textBox.Height() - halfTextHeight := textHeight >> 1 - - pt := style.Padding.GetTop(DefaultAnnotationPadding.Top) - pl := style.Padding.GetLeft(DefaultAnnotationPadding.Left) - pr := style.Padding.GetRight(DefaultAnnotationPadding.Right) - pb := style.Padding.GetBottom(DefaultAnnotationPadding.Bottom) - - strokeWidth := style.GetStrokeWidth() - - top := ly - (pt + halfTextHeight) - right := lx + pl + pr + textWidth + DefaultAnnotationDeltaWidth + int(strokeWidth) - bottom := ly + (pb + halfTextHeight) - - return Box{ - Top: top, - Left: lx, - Right: right, - Bottom: bottom, - } -} - -// Annotation draws an anotation with a renderer. -func (d draw) Annotation(r Renderer, canvasBox Box, style Style, lx, ly int, label string) { - style.GetTextOptions().WriteToRenderer(r) - defer r.ResetStyle() - - textBox := r.MeasureText(label) - textWidth := textBox.Width() - halfTextHeight := textBox.Height() >> 1 - - style.GetFillAndStrokeOptions().WriteToRenderer(r) - - pt := style.Padding.GetTop(DefaultAnnotationPadding.Top) - pl := style.Padding.GetLeft(DefaultAnnotationPadding.Left) - pr := style.Padding.GetRight(DefaultAnnotationPadding.Right) - pb := style.Padding.GetBottom(DefaultAnnotationPadding.Bottom) - - textX := lx + pl + DefaultAnnotationDeltaWidth - textY := ly + halfTextHeight - - ltx := lx + DefaultAnnotationDeltaWidth - lty := ly - (pt + halfTextHeight) - - rtx := lx + pl + pr + textWidth + DefaultAnnotationDeltaWidth - rty := ly - (pt + halfTextHeight) - - rbx := lx + pl + pr + textWidth + DefaultAnnotationDeltaWidth - rby := ly + (pb + halfTextHeight) - - lbx := lx + DefaultAnnotationDeltaWidth - lby := ly + (pb + halfTextHeight) - - r.MoveTo(lx, ly) - r.LineTo(ltx, lty) - r.LineTo(rtx, rty) - r.LineTo(rbx, rby) - r.LineTo(lbx, lby) - r.LineTo(lx, ly) - r.Close() - r.FillStroke() - - style.GetTextOptions().WriteToRenderer(r) - r.Text(label, textX, textY) -} - -// Box draws a box with a given style. -func (d draw) Box(r Renderer, b Box, s Style) { - s.GetFillAndStrokeOptions().WriteToRenderer(r) - defer r.ResetStyle() - - r.MoveTo(b.Left, b.Top) - r.LineTo(b.Right, b.Top) - r.LineTo(b.Right, b.Bottom) - r.LineTo(b.Left, b.Bottom) - r.LineTo(b.Left, b.Top) - r.FillStroke() -} - -func (d draw) BoxRotated(r Renderer, b Box, thetaDegrees float64, s Style) { - d.BoxCorners(r, b.Corners().Rotate(thetaDegrees), s) -} - -func (d draw) BoxCorners(r Renderer, bc BoxCorners, s Style) { - s.GetFillAndStrokeOptions().WriteToRenderer(r) - defer r.ResetStyle() - - r.MoveTo(bc.TopLeft.X, bc.TopLeft.Y) - r.LineTo(bc.TopRight.X, bc.TopRight.Y) - r.LineTo(bc.BottomRight.X, bc.BottomRight.Y) - r.LineTo(bc.BottomLeft.X, bc.BottomLeft.Y) - r.Close() - r.FillStroke() -} - -// DrawText draws text with a given style. -func (d draw) Text(r Renderer, text string, x, y int, style Style) { - style.GetTextOptions().WriteToRenderer(r) - defer r.ResetStyle() - - r.Text(text, x, y) -} - -func (d draw) MeasureText(r Renderer, text string, style Style) Box { - style.GetTextOptions().WriteToRenderer(r) - defer r.ResetStyle() - - return r.MeasureText(text) -} - -// TextWithin draws the text within a given box. -func (d draw) TextWithin(r Renderer, text string, box Box, style Style) { - style.GetTextOptions().WriteToRenderer(r) - defer r.ResetStyle() - - lines := Text.WrapFit(r, text, box.Width(), style) - linesBox := Text.MeasureLines(r, lines, style) - - y := box.Top - - switch style.GetTextVerticalAlign() { - case TextVerticalAlignBottom, TextVerticalAlignBaseline: // i have to build better baseline handling into measure text - y = y - linesBox.Height() - case TextVerticalAlignMiddle, TextVerticalAlignMiddleBaseline: - y = (y - linesBox.Height()) >> 1 - } - - var tx, ty int - for _, line := range lines { - lineBox := r.MeasureText(line) - switch style.GetTextHorizontalAlign() { - case TextHorizontalAlignCenter: - tx = box.Left + ((box.Width() - lineBox.Width()) >> 1) - case TextHorizontalAlignRight: - tx = box.Right - lineBox.Width() - default: - tx = box.Left - } - if style.TextRotationDegrees == 0 { - ty = y + lineBox.Height() - } else { - ty = y - } - - d.Text(r, line, tx, ty, style) - y += lineBox.Height() + style.GetTextLineSpacing() - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/README.md b/vendor/github.com/wcharczuk/go-chart/drawing/README.md deleted file mode 100644 index a97cb30..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/README.md +++ /dev/null @@ -1,5 +0,0 @@ -go-chart > drawing -================== - -The bulk of the code in this package is based on [draw2d](https://github.com/llgcode/draw2d), but -with significant modifications to make the APIs more golang friendly and careful about units (points vs. pixels). \ No newline at end of file diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/color.go b/vendor/github.com/wcharczuk/go-chart/drawing/color.go deleted file mode 100644 index 19b3a4f..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/color.go +++ /dev/null @@ -1,95 +0,0 @@ -package drawing - -import ( - "fmt" - "strconv" -) - -var ( - // ColorTransparent is a fully transparent color. - ColorTransparent = Color{} - - // ColorWhite is white. - ColorWhite = Color{R: 255, G: 255, B: 255, A: 255} - - // ColorBlack is black. - ColorBlack = Color{R: 0, G: 0, B: 0, A: 255} - - // ColorRed is red. - ColorRed = Color{R: 255, G: 0, B: 0, A: 255} - - // ColorGreen is green. - ColorGreen = Color{R: 0, G: 255, B: 0, A: 255} - - // ColorBlue is blue. - ColorBlue = Color{R: 0, G: 0, B: 255, A: 255} -) - -func parseHex(hex string) uint8 { - v, _ := strconv.ParseInt(hex, 16, 16) - return uint8(v) -} - -// ColorFromHex returns a color from a css hex code. -func ColorFromHex(hex string) Color { - var c Color - if len(hex) == 3 { - c.R = parseHex(string(hex[0])) * 0x11 - c.G = parseHex(string(hex[1])) * 0x11 - c.B = parseHex(string(hex[2])) * 0x11 - } else { - c.R = parseHex(string(hex[0:2])) - c.G = parseHex(string(hex[2:4])) - c.B = parseHex(string(hex[4:6])) - } - c.A = 255 - return c -} - -// Color is our internal color type because color.Color is bullshit. -type Color struct { - R uint8 - G uint8 - B uint8 - A uint8 -} - -// RGBA returns the color as a pre-alpha mixed color set. -func (c Color) RGBA() (r, g, b, a uint32) { - fa := float64(c.A) / 255.0 - r = uint32(float64(uint32(c.R)) * fa) - r |= r << 8 - g = uint32(float64(uint32(c.G)) * fa) - g |= g << 8 - b = uint32(float64(uint32(c.B)) * fa) - b |= b << 8 - a = uint32(c.A) - a |= a << 8 - return -} - -// IsZero returns if the color has been set or not. -func (c Color) IsZero() bool { - return c.R == 0 && c.G == 0 && c.B == 0 && c.A == 0 -} - -// IsTransparent returns if the colors alpha channel is zero. -func (c Color) IsTransparent() bool { - return c.A == 0 -} - -// WithAlpha returns a copy of the color with a given alpha. -func (c Color) WithAlpha(a uint8) Color { - return Color{ - R: c.R, - G: c.G, - B: c.B, - A: a, - } -} - -// String returns a css string representation of the color. -func (c Color) String() string { - fa := float64(c.A) / float64(255) - return fmt.Sprintf("rgba(%v,%v,%v,%.1f)", c.R, c.G, c.B, fa) -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/color_test.go b/vendor/github.com/wcharczuk/go-chart/drawing/color_test.go deleted file mode 100644 index d0616e2..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/color_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package drawing - -import ( - "testing" - - "github.com/blendlabs/go-assert" -) - -func TestColorFromHex(t *testing.T) { - assert := assert.New(t) - - white := ColorFromHex("FFFFFF") - assert.Equal(ColorWhite, white) - - shortWhite := ColorFromHex("FFF") - assert.Equal(ColorWhite, shortWhite) - - black := ColorFromHex("000000") - assert.Equal(ColorBlack, black) - - shortBlack := ColorFromHex("000") - assert.Equal(ColorBlack, shortBlack) - - red := ColorFromHex("FF0000") - assert.Equal(ColorRed, red) - - shortRed := ColorFromHex("F00") - assert.Equal(ColorRed, shortRed) - - green := ColorFromHex("00FF00") - assert.Equal(ColorGreen, green) - - shortGreen := ColorFromHex("0F0") - assert.Equal(ColorGreen, shortGreen) - - blue := ColorFromHex("0000FF") - assert.Equal(ColorBlue, blue) - - shortBlue := ColorFromHex("00F") - assert.Equal(ColorBlue, shortBlue) -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/constants.go b/vendor/github.com/wcharczuk/go-chart/drawing/constants.go deleted file mode 100644 index 2fb154e..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/constants.go +++ /dev/null @@ -1,6 +0,0 @@ -package drawing - -const ( - // DefaultDPI is the default image DPI. - DefaultDPI = 96.0 -) diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/curve.go b/vendor/github.com/wcharczuk/go-chart/drawing/curve.go deleted file mode 100644 index 304be1c..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/curve.go +++ /dev/null @@ -1,158 +0,0 @@ -package drawing - -import ( - "math" -) - -const ( - // CurveRecursionLimit represents the maximum recursion that is really necessary to subsivide a curve into straight lines - CurveRecursionLimit = 32 -) - -// Cubic -// x1, y1, cpx1, cpy1, cpx2, cpy2, x2, y2 float64 - -// SubdivideCubic a Bezier cubic curve in 2 equivalents Bezier cubic curves. -// c1 and c2 parameters are the resulting curves -func SubdivideCubic(c, c1, c2 []float64) { - // First point of c is the first point of c1 - c1[0], c1[1] = c[0], c[1] - // Last point of c is the last point of c2 - c2[6], c2[7] = c[6], c[7] - - // Subdivide segment using midpoints - c1[2] = (c[0] + c[2]) / 2 - c1[3] = (c[1] + c[3]) / 2 - - midX := (c[2] + c[4]) / 2 - midY := (c[3] + c[5]) / 2 - - c2[4] = (c[4] + c[6]) / 2 - c2[5] = (c[5] + c[7]) / 2 - - c1[4] = (c1[2] + midX) / 2 - c1[5] = (c1[3] + midY) / 2 - - c2[2] = (midX + c2[4]) / 2 - c2[3] = (midY + c2[5]) / 2 - - c1[6] = (c1[4] + c2[2]) / 2 - c1[7] = (c1[5] + c2[3]) / 2 - - // Last Point of c1 is equal to the first point of c2 - c2[0], c2[1] = c1[6], c1[7] -} - -// TraceCubic generate lines subdividing the cubic curve using a Liner -// flattening_threshold helps determines the flattening expectation of the curve -func TraceCubic(t Liner, cubic []float64, flatteningThreshold float64) { - // Allocation curves - var curves [CurveRecursionLimit * 8]float64 - copy(curves[0:8], cubic[0:8]) - i := 0 - - // current curve - var c []float64 - - var dx, dy, d2, d3 float64 - - for i >= 0 { - c = curves[i*8:] - dx = c[6] - c[0] - dy = c[7] - c[1] - - d2 = math.Abs((c[2]-c[6])*dy - (c[3]-c[7])*dx) - d3 = math.Abs((c[4]-c[6])*dy - (c[5]-c[7])*dx) - - // if it's flat then trace a line - if (d2+d3)*(d2+d3) < flatteningThreshold*(dx*dx+dy*dy) || i == len(curves)-1 { - t.LineTo(c[6], c[7]) - i-- - } else { - // second half of bezier go lower onto the stack - SubdivideCubic(c, curves[(i+1)*8:], curves[i*8:]) - i++ - } - } -} - -// Quad -// x1, y1, cpx1, cpy2, x2, y2 float64 - -// SubdivideQuad a Bezier quad curve in 2 equivalents Bezier quad curves. -// c1 and c2 parameters are the resulting curves -func SubdivideQuad(c, c1, c2 []float64) { - // First point of c is the first point of c1 - c1[0], c1[1] = c[0], c[1] - // Last point of c is the last point of c2 - c2[4], c2[5] = c[4], c[5] - - // Subdivide segment using midpoints - c1[2] = (c[0] + c[2]) / 2 - c1[3] = (c[1] + c[3]) / 2 - c2[2] = (c[2] + c[4]) / 2 - c2[3] = (c[3] + c[5]) / 2 - c1[4] = (c1[2] + c2[2]) / 2 - c1[5] = (c1[3] + c2[3]) / 2 - c2[0], c2[1] = c1[4], c1[5] - return -} - -// TraceQuad generate lines subdividing the curve using a Liner -// flattening_threshold helps determines the flattening expectation of the curve -func TraceQuad(t Liner, quad []float64, flatteningThreshold float64) { - // Allocates curves stack - var curves [CurveRecursionLimit * 6]float64 - copy(curves[0:6], quad[0:6]) - i := 0 - // current curve - var c []float64 - var dx, dy, d float64 - - for i >= 0 { - c = curves[i*6:] - dx = c[4] - c[0] - dy = c[5] - c[1] - - d = math.Abs(((c[2]-c[4])*dy - (c[3]-c[5])*dx)) - - // if it's flat then trace a line - if (d*d) < flatteningThreshold*(dx*dx+dy*dy) || i == len(curves)-1 { - t.LineTo(c[4], c[5]) - i-- - } else { - // second half of bezier go lower onto the stack - SubdivideQuad(c, curves[(i+1)*6:], curves[i*6:]) - i++ - } - } -} - -// TraceArc trace an arc using a Liner -func TraceArc(t Liner, x, y, rx, ry, start, angle, scale float64) (lastX, lastY float64) { - end := start + angle - clockWise := true - if angle < 0 { - clockWise = false - } - ra := (math.Abs(rx) + math.Abs(ry)) / 2 - da := math.Acos(ra/(ra+0.125/scale)) * 2 - //normalize - if !clockWise { - da = -da - } - angle = start + da - var curX, curY float64 - for { - if (angle < end-da/4) != clockWise { - curX = x + math.Cos(end)*rx - curY = y + math.Sin(end)*ry - return curX, curY - } - curX = x + math.Cos(angle)*rx - curY = y + math.Sin(angle)*ry - - angle += da - t.LineTo(curX, curY) - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/dasher.go b/vendor/github.com/wcharczuk/go-chart/drawing/dasher.go deleted file mode 100644 index 20a5a6b..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/dasher.go +++ /dev/null @@ -1,89 +0,0 @@ -package drawing - -// NewDashVertexConverter creates a new dash converter. -func NewDashVertexConverter(dash []float64, dashOffset float64, flattener Flattener) *DashVertexConverter { - var dasher DashVertexConverter - dasher.dash = dash - dasher.currentDash = 0 - dasher.dashOffset = dashOffset - dasher.next = flattener - return &dasher -} - -// DashVertexConverter is a converter for dash vertexes. -type DashVertexConverter struct { - next Flattener - x, y, distance float64 - dash []float64 - currentDash int - dashOffset float64 -} - -// LineTo implements the pathbuilder interface. -func (dasher *DashVertexConverter) LineTo(x, y float64) { - dasher.lineTo(x, y) -} - -// MoveTo implements the pathbuilder interface. -func (dasher *DashVertexConverter) MoveTo(x, y float64) { - dasher.next.MoveTo(x, y) - dasher.x, dasher.y = x, y - dasher.distance = dasher.dashOffset - dasher.currentDash = 0 -} - -// LineJoin implements the pathbuilder interface. -func (dasher *DashVertexConverter) LineJoin() { - dasher.next.LineJoin() -} - -// Close implements the pathbuilder interface. -func (dasher *DashVertexConverter) Close() { - dasher.next.Close() -} - -// End implements the pathbuilder interface. -func (dasher *DashVertexConverter) End() { - dasher.next.End() -} - -func (dasher *DashVertexConverter) lineTo(x, y float64) { - rest := dasher.dash[dasher.currentDash] - dasher.distance - for rest < 0 { - dasher.distance = dasher.distance - dasher.dash[dasher.currentDash] - dasher.currentDash = (dasher.currentDash + 1) % len(dasher.dash) - rest = dasher.dash[dasher.currentDash] - dasher.distance - } - d := distance(dasher.x, dasher.y, x, y) - for d >= rest { - k := rest / d - lx := dasher.x + k*(x-dasher.x) - ly := dasher.y + k*(y-dasher.y) - if dasher.currentDash%2 == 0 { - // line - dasher.next.LineTo(lx, ly) - } else { - // gap - dasher.next.End() - dasher.next.MoveTo(lx, ly) - } - d = d - rest - dasher.x, dasher.y = lx, ly - dasher.currentDash = (dasher.currentDash + 1) % len(dasher.dash) - rest = dasher.dash[dasher.currentDash] - } - dasher.distance = d - if dasher.currentDash%2 == 0 { - // line - dasher.next.LineTo(x, y) - } else { - // gap - dasher.next.End() - dasher.next.MoveTo(x, y) - } - if dasher.distance >= dasher.dash[dasher.currentDash] { - dasher.distance = dasher.distance - dasher.dash[dasher.currentDash] - dasher.currentDash = (dasher.currentDash + 1) % len(dasher.dash) - } - dasher.x, dasher.y = x, y -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/demux_flattener.go b/vendor/github.com/wcharczuk/go-chart/drawing/demux_flattener.go deleted file mode 100644 index 43b8646..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/demux_flattener.go +++ /dev/null @@ -1,41 +0,0 @@ -package drawing - -// DemuxFlattener is a flattener -type DemuxFlattener struct { - Flatteners []Flattener -} - -// MoveTo implements the path builder interface. -func (dc DemuxFlattener) MoveTo(x, y float64) { - for _, flattener := range dc.Flatteners { - flattener.MoveTo(x, y) - } -} - -// LineTo implements the path builder interface. -func (dc DemuxFlattener) LineTo(x, y float64) { - for _, flattener := range dc.Flatteners { - flattener.LineTo(x, y) - } -} - -// LineJoin implements the path builder interface. -func (dc DemuxFlattener) LineJoin() { - for _, flattener := range dc.Flatteners { - flattener.LineJoin() - } -} - -// Close implements the path builder interface. -func (dc DemuxFlattener) Close() { - for _, flattener := range dc.Flatteners { - flattener.Close() - } -} - -// End implements the path builder interface. -func (dc DemuxFlattener) End() { - for _, flattener := range dc.Flatteners { - flattener.End() - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/drawing.go b/vendor/github.com/wcharczuk/go-chart/drawing/drawing.go deleted file mode 100644 index 8a1da6a..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/drawing.go +++ /dev/null @@ -1,148 +0,0 @@ -package drawing - -import ( - "image/color" - - "github.com/golang/freetype/truetype" -) - -// FillRule defines the type for fill rules -type FillRule int - -const ( - // FillRuleEvenOdd determines the "insideness" of a point in the shape - // by drawing a ray from that point to infinity in any direction - // and counting the number of path segments from the given shape that the ray crosses. - // If this number is odd, the point is inside; if even, the point is outside. - FillRuleEvenOdd FillRule = iota - // FillRuleWinding determines the "insideness" of a point in the shape - // by drawing a ray from that point to infinity in any direction - // and then examining the places where a segment of the shape crosses the ray. - // Starting with a count of zero, add one each time a path segment crosses - // the ray from left to right and subtract one each time - // a path segment crosses the ray from right to left. After counting the crossings, - // if the result is zero then the point is outside the path. Otherwise, it is inside. - FillRuleWinding -) - -// LineCap is the style of line extremities -type LineCap int - -const ( - // RoundCap defines a rounded shape at the end of the line - RoundCap LineCap = iota - // ButtCap defines a squared shape exactly at the end of the line - ButtCap - // SquareCap defines a squared shape at the end of the line - SquareCap -) - -// LineJoin is the style of segments joint -type LineJoin int - -const ( - // BevelJoin represents cut segments joint - BevelJoin LineJoin = iota - // RoundJoin represents rounded segments joint - RoundJoin - // MiterJoin represents peaker segments joint - MiterJoin -) - -// StrokeStyle keeps stroke style attributes -// that is used by the Stroke method of a Drawer -type StrokeStyle struct { - // Color defines the color of stroke - Color color.Color - // Line width - Width float64 - // Line cap style rounded, butt or square - LineCap LineCap - // Line join style bevel, round or miter - LineJoin LineJoin - // offset of the first dash - DashOffset float64 - // array represented dash length pair values are plain dash and impair are space between dash - // if empty display plain line - Dash []float64 -} - -// SolidFillStyle define style attributes for a solid fill style -type SolidFillStyle struct { - // Color defines the line color - Color color.Color - // FillRule defines the file rule to used - FillRule FillRule -} - -// Valign Vertical Alignment of the text -type Valign int - -const ( - // ValignTop top align text - ValignTop Valign = iota - // ValignCenter centered text - ValignCenter - // ValignBottom bottom aligned text - ValignBottom - // ValignBaseline align text with the baseline of the font - ValignBaseline -) - -// Halign Horizontal Alignment of the text -type Halign int - -const ( - // HalignLeft Horizontally align to left - HalignLeft = iota - // HalignCenter Horizontally align to center - HalignCenter - // HalignRight Horizontally align to right - HalignRight -) - -// TextStyle describe text property -type TextStyle struct { - // Color defines the color of text - Color color.Color - // Size font size - Size float64 - // The font to use - Font *truetype.Font - // Horizontal Alignment of the text - Halign Halign - // Vertical Alignment of the text - Valign Valign -} - -// ScalingPolicy is a constant to define how to scale an image -type ScalingPolicy int - -const ( - // ScalingNone no scaling applied - ScalingNone ScalingPolicy = iota - // ScalingStretch the image is stretched so that its width and height are exactly the given width and height - ScalingStretch - // ScalingWidth the image is scaled so that its width is exactly the given width - ScalingWidth - // ScalingHeight the image is scaled so that its height is exactly the given height - ScalingHeight - // ScalingFit the image is scaled to the largest scale that allow the image to fit within a rectangle width x height - ScalingFit - // ScalingSameArea the image is scaled so that its area is exactly the area of the given rectangle width x height - ScalingSameArea - // ScalingFill the image is scaled to the smallest scale that allow the image to fully cover a rectangle width x height - ScalingFill -) - -// ImageScaling style attributes used to display the image -type ImageScaling struct { - // Horizontal Alignment of the image - Halign Halign - // Vertical Alignment of the image - Valign Valign - // Width Height used by scaling policy - Width, Height float64 - // ScalingPolicy defines the scaling policy to applied to the image - ScalingPolicy ScalingPolicy -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/flattener.go b/vendor/github.com/wcharczuk/go-chart/drawing/flattener.go deleted file mode 100644 index 61bfd07..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/flattener.go +++ /dev/null @@ -1,96 +0,0 @@ -package drawing - -// Liner receive segment definition -type Liner interface { - // LineTo Draw a line from the current position to the point (x, y) - LineTo(x, y float64) -} - -// Flattener receive segment definition -type Flattener interface { - // MoveTo Start a New line from the point (x, y) - MoveTo(x, y float64) - // LineTo Draw a line from the current position to the point (x, y) - LineTo(x, y float64) - // LineJoin add the most recent starting point to close the path to create a polygon - LineJoin() - // Close add the most recent starting point to close the path to create a polygon - Close() - // End mark the current line as finished so we can draw caps - End() -} - -// Flatten convert curves into straight segments keeping join segments info -func Flatten(path *Path, flattener Flattener, scale float64) { - // First Point - var startX, startY float64 = 0, 0 - // Current Point - var x, y float64 = 0, 0 - i := 0 - for _, cmp := range path.Components { - switch cmp { - case MoveToComponent: - x, y = path.Points[i], path.Points[i+1] - startX, startY = x, y - if i != 0 { - flattener.End() - } - flattener.MoveTo(x, y) - i += 2 - case LineToComponent: - x, y = path.Points[i], path.Points[i+1] - flattener.LineTo(x, y) - flattener.LineJoin() - i += 2 - case QuadCurveToComponent: - TraceQuad(flattener, path.Points[i-2:], 0.5) - x, y = path.Points[i+2], path.Points[i+3] - flattener.LineTo(x, y) - i += 4 - case CubicCurveToComponent: - TraceCubic(flattener, path.Points[i-2:], 0.5) - x, y = path.Points[i+4], path.Points[i+5] - flattener.LineTo(x, y) - i += 6 - case ArcToComponent: - x, y = TraceArc(flattener, path.Points[i], path.Points[i+1], path.Points[i+2], path.Points[i+3], path.Points[i+4], path.Points[i+5], scale) - flattener.LineTo(x, y) - i += 6 - case CloseComponent: - flattener.LineTo(startX, startY) - flattener.Close() - } - } - flattener.End() -} - -// SegmentedPath is a path of disparate point sectinos. -type SegmentedPath struct { - Points []float64 -} - -// MoveTo implements the path interface. -func (p *SegmentedPath) MoveTo(x, y float64) { - p.Points = append(p.Points, x, y) - // TODO need to mark this point as moveto -} - -// LineTo implements the path interface. -func (p *SegmentedPath) LineTo(x, y float64) { - p.Points = append(p.Points, x, y) -} - -// LineJoin implements the path interface. -func (p *SegmentedPath) LineJoin() { - // TODO need to mark the current point as linejoin -} - -// Close implements the path interface. -func (p *SegmentedPath) Close() { - // TODO Close -} - -// End implements the path interface. -func (p *SegmentedPath) End() { - // Nothing to do -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/free_type_path.go b/vendor/github.com/wcharczuk/go-chart/drawing/free_type_path.go deleted file mode 100644 index 5c3c266..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/free_type_path.go +++ /dev/null @@ -1,30 +0,0 @@ -package drawing - -import ( - "github.com/golang/freetype/raster" - "golang.org/x/image/math/fixed" -) - -// FtLineBuilder is a builder for freetype raster glyphs. -type FtLineBuilder struct { - Adder raster.Adder -} - -// MoveTo implements the path builder interface. -func (liner FtLineBuilder) MoveTo(x, y float64) { - liner.Adder.Start(fixed.Point26_6{X: fixed.Int26_6(x * 64), Y: fixed.Int26_6(y * 64)}) -} - -// LineTo implements the path builder interface. -func (liner FtLineBuilder) LineTo(x, y float64) { - liner.Adder.Add1(fixed.Point26_6{X: fixed.Int26_6(x * 64), Y: fixed.Int26_6(y * 64)}) -} - -// LineJoin implements the path builder interface. -func (liner FtLineBuilder) LineJoin() {} - -// Close implements the path builder interface. -func (liner FtLineBuilder) Close() {} - -// End implements the path builder interface. -func (liner FtLineBuilder) End() {} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/graphic_context.go b/vendor/github.com/wcharczuk/go-chart/drawing/graphic_context.go deleted file mode 100644 index 553c1eb..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/graphic_context.go +++ /dev/null @@ -1,82 +0,0 @@ -package drawing - -import ( - "image" - "image/color" - - "github.com/golang/freetype/truetype" -) - -// GraphicContext describes the interface for the various backends (images, pdf, opengl, ...) -type GraphicContext interface { - // PathBuilder describes the interface for path drawing - PathBuilder - // BeginPath creates a new path - BeginPath() - // GetMatrixTransform returns the current transformation matrix - GetMatrixTransform() Matrix - // SetMatrixTransform sets the current transformation matrix - SetMatrixTransform(tr Matrix) - // ComposeMatrixTransform composes the current transformation matrix with tr - ComposeMatrixTransform(tr Matrix) - // Rotate applies a rotation to the current transformation matrix. angle is in radian. - Rotate(angle float64) - // Translate applies a translation to the current transformation matrix. - Translate(tx, ty float64) - // Scale applies a scale to the current transformation matrix. - Scale(sx, sy float64) - // SetStrokeColor sets the current stroke color - SetStrokeColor(c color.Color) - // SetFillColor sets the current fill color - SetFillColor(c color.Color) - // SetFillRule sets the current fill rule - SetFillRule(f FillRule) - // SetLineWidth sets the current line width - SetLineWidth(lineWidth float64) - // SetLineCap sets the current line cap - SetLineCap(cap LineCap) - // SetLineJoin sets the current line join - SetLineJoin(join LineJoin) - // SetLineDash sets the current dash - SetLineDash(dash []float64, dashOffset float64) - // SetFontSize sets the current font size - SetFontSize(fontSize float64) - // GetFontSize gets the current font size - GetFontSize() float64 - // SetFont sets the font for the context - SetFont(f *truetype.Font) - // GetFont returns the current font - GetFont() *truetype.Font - // DrawImage draws the raster image in the current canvas - DrawImage(image image.Image) - // Save the context and push it to the context stack - Save() - // Restore remove the current context and restore the last one - Restore() - // Clear fills the current canvas with a default transparent color - Clear() - // ClearRect fills the specified rectangle with a default transparent color - ClearRect(x1, y1, x2, y2 int) - // SetDPI sets the current DPI - SetDPI(dpi int) - // GetDPI gets the current DPI - GetDPI() int - // GetStringBounds gets pixel bounds(dimensions) of given string - GetStringBounds(s string) (left, top, right, bottom float64) - // CreateStringPath creates a path from the string s at x, y - CreateStringPath(text string, x, y float64) (cursor float64) - // FillString draws the text at point (0, 0) - FillString(text string) (cursor float64) - // FillStringAt draws the text at the specified point (x, y) - FillStringAt(text string, x, y float64) (cursor float64) - // StrokeString draws the contour of the text at point (0, 0) - StrokeString(text string) (cursor float64) - // StrokeStringAt draws the contour of the text at point (x, y) - StrokeStringAt(text string, x, y float64) (cursor float64) - // Stroke strokes the paths with the color specified by SetStrokeColor - Stroke(paths ...*Path) - // Fill fills the paths with the color specified by SetFillColor - Fill(paths ...*Path) - // FillStroke first fills the paths and than strokes them - FillStroke(paths ...*Path) -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/image_filter.go b/vendor/github.com/wcharczuk/go-chart/drawing/image_filter.go deleted file mode 100644 index 3cf0309..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/image_filter.go +++ /dev/null @@ -1,13 +0,0 @@ -package drawing - -// ImageFilter defines the type of filter to use -type ImageFilter int - -const ( - // LinearFilter defines a linear filter - LinearFilter ImageFilter = iota - // BilinearFilter defines a bilinear filter - BilinearFilter - // BicubicFilter defines a bicubic filter - BicubicFilter -) diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/line.go b/vendor/github.com/wcharczuk/go-chart/drawing/line.go deleted file mode 100644 index b4e28e7..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/line.go +++ /dev/null @@ -1,48 +0,0 @@ -package drawing - -import ( - "image/color" - "image/draw" -) - -// PolylineBresenham draws a polyline to an image -func PolylineBresenham(img draw.Image, c color.Color, s ...float64) { - for i := 2; i < len(s); i += 2 { - Bresenham(img, c, int(s[i-2]+0.5), int(s[i-1]+0.5), int(s[i]+0.5), int(s[i+1]+0.5)) - } -} - -// Bresenham draws a line between (x0, y0) and (x1, y1) -func Bresenham(img draw.Image, color color.Color, x0, y0, x1, y1 int) { - dx := abs(x1 - x0) - dy := abs(y1 - y0) - var sx, sy int - if x0 < x1 { - sx = 1 - } else { - sx = -1 - } - if y0 < y1 { - sy = 1 - } else { - sy = -1 - } - err := dx - dy - - var e2 int - for { - img.Set(x0, y0, color) - if x0 == x1 && y0 == y1 { - return - } - e2 = 2 * err - if e2 > -dy { - err = err - dy - x0 = x0 + sx - } - if e2 < dx { - err = err + dx - y0 = y0 + sy - } - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/matrix.go b/vendor/github.com/wcharczuk/go-chart/drawing/matrix.go deleted file mode 100644 index 8bd2049..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/matrix.go +++ /dev/null @@ -1,220 +0,0 @@ -package drawing - -import ( - "math" -) - -// Matrix represents an affine transformation -type Matrix [6]float64 - -const ( - epsilon = 1e-6 -) - -// Determinant compute the determinant of the matrix -func (tr Matrix) Determinant() float64 { - return tr[0]*tr[3] - tr[1]*tr[2] -} - -// Transform applies the transformation matrix to points. It modify the points passed in parameter. -func (tr Matrix) Transform(points []float64) { - for i, j := 0, 1; j < len(points); i, j = i+2, j+2 { - x := points[i] - y := points[j] - points[i] = x*tr[0] + y*tr[2] + tr[4] - points[j] = x*tr[1] + y*tr[3] + tr[5] - } -} - -// TransformPoint applies the transformation matrix to point. It returns the point the transformed point. -func (tr Matrix) TransformPoint(x, y float64) (xres, yres float64) { - xres = x*tr[0] + y*tr[2] + tr[4] - yres = x*tr[1] + y*tr[3] + tr[5] - return xres, yres -} - -func minMax(x, y float64) (min, max float64) { - if x > y { - return y, x - } - return x, y -} - -// TransformRectangle applies the transformation matrix to the rectangle represented by the min and the max point of the rectangle -func (tr Matrix) TransformRectangle(x0, y0, x2, y2 float64) (nx0, ny0, nx2, ny2 float64) { - points := []float64{x0, y0, x2, y0, x2, y2, x0, y2} - tr.Transform(points) - points[0], points[2] = minMax(points[0], points[2]) - points[4], points[6] = minMax(points[4], points[6]) - points[1], points[3] = minMax(points[1], points[3]) - points[5], points[7] = minMax(points[5], points[7]) - - nx0 = math.Min(points[0], points[4]) - ny0 = math.Min(points[1], points[5]) - nx2 = math.Max(points[2], points[6]) - ny2 = math.Max(points[3], points[7]) - return nx0, ny0, nx2, ny2 -} - -// InverseTransform applies the transformation inverse matrix to the rectangle represented by the min and the max point of the rectangle -func (tr Matrix) InverseTransform(points []float64) { - d := tr.Determinant() // matrix determinant - for i, j := 0, 1; j < len(points); i, j = i+2, j+2 { - x := points[i] - y := points[j] - points[i] = ((x-tr[4])*tr[3] - (y-tr[5])*tr[2]) / d - points[j] = ((y-tr[5])*tr[0] - (x-tr[4])*tr[1]) / d - } -} - -// InverseTransformPoint applies the transformation inverse matrix to point. It returns the point the transformed point. -func (tr Matrix) InverseTransformPoint(x, y float64) (xres, yres float64) { - d := tr.Determinant() // matrix determinant - xres = ((x-tr[4])*tr[3] - (y-tr[5])*tr[2]) / d - yres = ((y-tr[5])*tr[0] - (x-tr[4])*tr[1]) / d - return xres, yres -} - -// VectorTransform applies the transformation matrix to points without using the translation parameter of the affine matrix. -// It modify the points passed in parameter. -func (tr Matrix) VectorTransform(points []float64) { - for i, j := 0, 1; j < len(points); i, j = i+2, j+2 { - x := points[i] - y := points[j] - points[i] = x*tr[0] + y*tr[2] - points[j] = x*tr[1] + y*tr[3] - } -} - -// NewIdentityMatrix creates an identity transformation matrix. -func NewIdentityMatrix() Matrix { - return Matrix{1, 0, 0, 1, 0, 0} -} - -// NewTranslationMatrix creates a transformation matrix with a translation tx and ty translation parameter -func NewTranslationMatrix(tx, ty float64) Matrix { - return Matrix{1, 0, 0, 1, tx, ty} -} - -// NewScaleMatrix creates a transformation matrix with a sx, sy scale factor -func NewScaleMatrix(sx, sy float64) Matrix { - return Matrix{sx, 0, 0, sy, 0, 0} -} - -// NewRotationMatrix creates a rotation transformation matrix. angle is in radian -func NewRotationMatrix(angle float64) Matrix { - c := math.Cos(angle) - s := math.Sin(angle) - return Matrix{c, s, -s, c, 0, 0} -} - -// NewMatrixFromRects creates a transformation matrix, combining a scale and a translation, that transform rectangle1 into rectangle2. -func NewMatrixFromRects(rectangle1, rectangle2 [4]float64) Matrix { - xScale := (rectangle2[2] - rectangle2[0]) / (rectangle1[2] - rectangle1[0]) - yScale := (rectangle2[3] - rectangle2[1]) / (rectangle1[3] - rectangle1[1]) - xOffset := rectangle2[0] - (rectangle1[0] * xScale) - yOffset := rectangle2[1] - (rectangle1[1] * yScale) - return Matrix{xScale, 0, 0, yScale, xOffset, yOffset} -} - -// Inverse computes the inverse matrix -func (tr *Matrix) Inverse() { - d := tr.Determinant() // matrix determinant - tr0, tr1, tr2, tr3, tr4, tr5 := tr[0], tr[1], tr[2], tr[3], tr[4], tr[5] - tr[0] = tr3 / d - tr[1] = -tr1 / d - tr[2] = -tr2 / d - tr[3] = tr0 / d - tr[4] = (tr2*tr5 - tr3*tr4) / d - tr[5] = (tr1*tr4 - tr0*tr5) / d -} - -// Copy copies the matrix. -func (tr Matrix) Copy() Matrix { - var result Matrix - copy(result[:], tr[:]) - return result -} - -// Compose multiplies trToConcat x tr -func (tr *Matrix) Compose(trToCompose Matrix) { - tr0, tr1, tr2, tr3, tr4, tr5 := tr[0], tr[1], tr[2], tr[3], tr[4], tr[5] - tr[0] = trToCompose[0]*tr0 + trToCompose[1]*tr2 - tr[1] = trToCompose[1]*tr3 + trToCompose[0]*tr1 - tr[2] = trToCompose[2]*tr0 + trToCompose[3]*tr2 - tr[3] = trToCompose[3]*tr3 + trToCompose[2]*tr1 - tr[4] = trToCompose[4]*tr0 + trToCompose[5]*tr2 + tr4 - tr[5] = trToCompose[5]*tr3 + trToCompose[4]*tr1 + tr5 -} - -// Scale adds a scale to the matrix -func (tr *Matrix) Scale(sx, sy float64) { - tr[0] = sx * tr[0] - tr[1] = sx * tr[1] - tr[2] = sy * tr[2] - tr[3] = sy * tr[3] -} - -// Translate adds a translation to the matrix -func (tr *Matrix) Translate(tx, ty float64) { - tr[4] = tx*tr[0] + ty*tr[2] + tr[4] - tr[5] = ty*tr[3] + tx*tr[1] + tr[5] -} - -// Rotate adds a rotation to the matrix. -func (tr *Matrix) Rotate(radians float64) { - c := math.Cos(radians) - s := math.Sin(radians) - t0 := c*tr[0] + s*tr[2] - t1 := s*tr[3] + c*tr[1] - t2 := c*tr[2] - s*tr[0] - t3 := c*tr[3] - s*tr[1] - tr[0] = t0 - tr[1] = t1 - tr[2] = t2 - tr[3] = t3 -} - -// GetTranslation gets the matrix traslation. -func (tr Matrix) GetTranslation() (x, y float64) { - return tr[4], tr[5] -} - -// GetScaling gets the matrix scaling. -func (tr Matrix) GetScaling() (x, y float64) { - return tr[0], tr[3] -} - -// GetScale computes a scale for the matrix -func (tr Matrix) GetScale() float64 { - x := 0.707106781*tr[0] + 0.707106781*tr[1] - y := 0.707106781*tr[2] + 0.707106781*tr[3] - return math.Sqrt(x*x + y*y) -} - -// ******************** Testing ******************** - -// Equals tests if a two transformation are equal. A tolerance is applied when comparing matrix elements. -func (tr Matrix) Equals(tr2 Matrix) bool { - for i := 0; i < 6; i = i + 1 { - if !fequals(tr[i], tr2[i]) { - return false - } - } - return true -} - -// IsIdentity tests if a transformation is the identity transformation. A tolerance is applied when comparing matrix elements. -func (tr Matrix) IsIdentity() bool { - return fequals(tr[4], 0) && fequals(tr[5], 0) && tr.IsTranslation() -} - -// IsTranslation tests if a transformation is is a pure translation. A tolerance is applied when comparing matrix elements. -func (tr Matrix) IsTranslation() bool { - return fequals(tr[0], 1) && fequals(tr[1], 0) && fequals(tr[2], 0) && fequals(tr[3], 1) -} - -// fequals compares two floats. return true if the distance between the two floats is less than epsilon, false otherwise -func fequals(float1, float2 float64) bool { - return math.Abs(float1-float2) <= epsilon -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/painter.go b/vendor/github.com/wcharczuk/go-chart/drawing/painter.go deleted file mode 100644 index 1353449..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/painter.go +++ /dev/null @@ -1,31 +0,0 @@ -package drawing - -import ( - "image" - "image/color" - - "golang.org/x/image/draw" - "golang.org/x/image/math/f64" - - "github.com/golang/freetype/raster" -) - -// Painter implements the freetype raster.Painter and has a SetColor method like the RGBAPainter -type Painter interface { - raster.Painter - SetColor(color color.Color) -} - -// DrawImage draws an image into dest using an affine transformation matrix, an op and a filter -func DrawImage(src image.Image, dest draw.Image, tr Matrix, op draw.Op, filter ImageFilter) { - var transformer draw.Transformer - switch filter { - case LinearFilter: - transformer = draw.NearestNeighbor - case BilinearFilter: - transformer = draw.BiLinear - case BicubicFilter: - transformer = draw.CatmullRom - } - transformer.Transform(dest, f64.Aff3{tr[0], tr[1], tr[4], tr[2], tr[3], tr[5]}, src, src.Bounds(), op, nil) -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/path.go b/vendor/github.com/wcharczuk/go-chart/drawing/path.go deleted file mode 100644 index 20f2d2e..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/path.go +++ /dev/null @@ -1,186 +0,0 @@ -package drawing - -import ( - "fmt" - "math" -) - -// PathBuilder describes the interface for path drawing. -type PathBuilder interface { - // LastPoint returns the current point of the current sub path - LastPoint() (x, y float64) - // MoveTo creates a new subpath that start at the specified point - MoveTo(x, y float64) - // LineTo adds a line to the current subpath - LineTo(x, y float64) - // QuadCurveTo adds a quadratic Bézier curve to the current subpath - QuadCurveTo(cx, cy, x, y float64) - // CubicCurveTo adds a cubic Bézier curve to the current subpath - CubicCurveTo(cx1, cy1, cx2, cy2, x, y float64) - // ArcTo adds an arc to the current subpath - ArcTo(cx, cy, rx, ry, startAngle, angle float64) - // Close creates a line from the current point to the last MoveTo - // point (if not the same) and mark the path as closed so the - // first and last lines join nicely. - Close() -} - -// PathComponent represents component of a path -type PathComponent int - -const ( - // MoveToComponent is a MoveTo component in a Path - MoveToComponent PathComponent = iota - // LineToComponent is a LineTo component in a Path - LineToComponent - // QuadCurveToComponent is a QuadCurveTo component in a Path - QuadCurveToComponent - // CubicCurveToComponent is a CubicCurveTo component in a Path - CubicCurveToComponent - // ArcToComponent is a ArcTo component in a Path - ArcToComponent - // CloseComponent is a ArcTo component in a Path - CloseComponent -) - -// Path stores points -type Path struct { - // Components is a slice of PathComponent in a Path and mark the role of each points in the Path - Components []PathComponent - // Points are combined with Components to have a specific role in the path - Points []float64 - // Last Point of the Path - x, y float64 -} - -func (p *Path) appendToPath(cmd PathComponent, points ...float64) { - p.Components = append(p.Components, cmd) - p.Points = append(p.Points, points...) -} - -// LastPoint returns the current point of the current path -func (p *Path) LastPoint() (x, y float64) { - return p.x, p.y -} - -// MoveTo starts a new path at (x, y) position -func (p *Path) MoveTo(x, y float64) { - p.appendToPath(MoveToComponent, x, y) - p.x = x - p.y = y -} - -// LineTo adds a line to the current path -func (p *Path) LineTo(x, y float64) { - if len(p.Components) == 0 { //special case when no move has been done - p.MoveTo(0, 0) - } - p.appendToPath(LineToComponent, x, y) - p.x = x - p.y = y -} - -// QuadCurveTo adds a quadratic bezier curve to the current path -func (p *Path) QuadCurveTo(cx, cy, x, y float64) { - if len(p.Components) == 0 { //special case when no move has been done - p.MoveTo(0, 0) - } - p.appendToPath(QuadCurveToComponent, cx, cy, x, y) - p.x = x - p.y = y -} - -// CubicCurveTo adds a cubic bezier curve to the current path -func (p *Path) CubicCurveTo(cx1, cy1, cx2, cy2, x, y float64) { - if len(p.Components) == 0 { //special case when no move has been done - p.MoveTo(0, 0) - } - p.appendToPath(CubicCurveToComponent, cx1, cy1, cx2, cy2, x, y) - p.x = x - p.y = y -} - -// ArcTo adds an arc to the path -func (p *Path) ArcTo(cx, cy, rx, ry, startAngle, delta float64) { - endAngle := startAngle + delta - clockWise := true - if delta < 0 { - clockWise = false - } - // normalize - if clockWise { - for endAngle < startAngle { - endAngle += math.Pi * 2.0 - } - } else { - for startAngle < endAngle { - startAngle += math.Pi * 2.0 - } - } - startX := cx + math.Cos(startAngle)*rx - startY := cy + math.Sin(startAngle)*ry - if len(p.Components) > 0 { - p.LineTo(startX, startY) - } else { - p.MoveTo(startX, startY) - } - p.appendToPath(ArcToComponent, cx, cy, rx, ry, startAngle, delta) - p.x = cx + math.Cos(endAngle)*rx - p.y = cy + math.Sin(endAngle)*ry -} - -// Close closes the current path -func (p *Path) Close() { - p.appendToPath(CloseComponent) -} - -// Copy make a clone of the current path and return it -func (p *Path) Copy() (dest *Path) { - dest = new(Path) - dest.Components = make([]PathComponent, len(p.Components)) - copy(dest.Components, p.Components) - dest.Points = make([]float64, len(p.Points)) - copy(dest.Points, p.Points) - dest.x, dest.y = p.x, p.y - return dest -} - -// Clear reset the path -func (p *Path) Clear() { - p.Components = p.Components[0:0] - p.Points = p.Points[0:0] - return -} - -// IsEmpty returns true if the path is empty -func (p *Path) IsEmpty() bool { - return len(p.Components) == 0 -} - -// String returns a debug text view of the path -func (p *Path) String() string { - s := "" - j := 0 - for _, cmd := range p.Components { - switch cmd { - case MoveToComponent: - s += fmt.Sprintf("MoveTo: %f, %f\n", p.Points[j], p.Points[j+1]) - j = j + 2 - case LineToComponent: - s += fmt.Sprintf("LineTo: %f, %f\n", p.Points[j], p.Points[j+1]) - j = j + 2 - case QuadCurveToComponent: - s += fmt.Sprintf("QuadCurveTo: %f, %f, %f, %f\n", p.Points[j], p.Points[j+1], p.Points[j+2], p.Points[j+3]) - j = j + 4 - case CubicCurveToComponent: - s += fmt.Sprintf("CubicCurveTo: %f, %f, %f, %f, %f, %f\n", p.Points[j], p.Points[j+1], p.Points[j+2], p.Points[j+3], p.Points[j+4], p.Points[j+5]) - j = j + 6 - case ArcToComponent: - s += fmt.Sprintf("ArcTo: %f, %f, %f, %f, %f, %f\n", p.Points[j], p.Points[j+1], p.Points[j+2], p.Points[j+3], p.Points[j+4], p.Points[j+5]) - j = j + 6 - case CloseComponent: - s += "Close\n" - } - } - return s -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/raster_graphic_context.go b/vendor/github.com/wcharczuk/go-chart/drawing/raster_graphic_context.go deleted file mode 100644 index 1ca0c30..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/raster_graphic_context.go +++ /dev/null @@ -1,283 +0,0 @@ -package drawing - -import ( - "errors" - "image" - "image/color" - "math" - - "github.com/golang/freetype/raster" - "github.com/golang/freetype/truetype" - "golang.org/x/image/draw" - "golang.org/x/image/font" - "golang.org/x/image/math/fixed" -) - -// NewRasterGraphicContext creates a new Graphic context from an image. -func NewRasterGraphicContext(img draw.Image) (*RasterGraphicContext, error) { - var painter Painter - switch selectImage := img.(type) { - case *image.RGBA: - painter = raster.NewRGBAPainter(selectImage) - default: - return nil, errors.New("NewRasterGraphicContext() :: invalid image type") - } - return NewRasterGraphicContextWithPainter(img, painter), nil -} - -// NewRasterGraphicContextWithPainter creates a new Graphic context from an image and a Painter (see Freetype-go) -func NewRasterGraphicContextWithPainter(img draw.Image, painter Painter) *RasterGraphicContext { - width, height := img.Bounds().Dx(), img.Bounds().Dy() - return &RasterGraphicContext{ - NewStackGraphicContext(), - img, - painter, - raster.NewRasterizer(width, height), - raster.NewRasterizer(width, height), - &truetype.GlyphBuf{}, - DefaultDPI, - } -} - -// RasterGraphicContext is the implementation of GraphicContext for a raster image -type RasterGraphicContext struct { - *StackGraphicContext - img draw.Image - painter Painter - fillRasterizer *raster.Rasterizer - strokeRasterizer *raster.Rasterizer - glyphBuf *truetype.GlyphBuf - DPI float64 -} - -// SetDPI sets the screen resolution in dots per inch. -func (rgc *RasterGraphicContext) SetDPI(dpi float64) { - rgc.DPI = dpi - rgc.recalc() -} - -// GetDPI returns the resolution of the Image GraphicContext -func (rgc *RasterGraphicContext) GetDPI() float64 { - return rgc.DPI -} - -// Clear fills the current canvas with a default transparent color -func (rgc *RasterGraphicContext) Clear() { - width, height := rgc.img.Bounds().Dx(), rgc.img.Bounds().Dy() - rgc.ClearRect(0, 0, width, height) -} - -// ClearRect fills the current canvas with a default transparent color at the specified rectangle -func (rgc *RasterGraphicContext) ClearRect(x1, y1, x2, y2 int) { - imageColor := image.NewUniform(rgc.current.FillColor) - draw.Draw(rgc.img, image.Rect(x1, y1, x2, y2), imageColor, image.ZP, draw.Over) -} - -// DrawImage draws the raster image in the current canvas -func (rgc *RasterGraphicContext) DrawImage(img image.Image) { - DrawImage(img, rgc.img, rgc.current.Tr, draw.Over, BilinearFilter) -} - -// FillString draws the text at point (0, 0) -func (rgc *RasterGraphicContext) FillString(text string) (cursor float64, err error) { - cursor, err = rgc.FillStringAt(text, 0, 0) - return -} - -// FillStringAt draws the text at the specified point (x, y) -func (rgc *RasterGraphicContext) FillStringAt(text string, x, y float64) (cursor float64, err error) { - cursor, err = rgc.CreateStringPath(text, x, y) - rgc.Fill() - return -} - -// StrokeString draws the contour of the text at point (0, 0) -func (rgc *RasterGraphicContext) StrokeString(text string) (cursor float64, err error) { - cursor, err = rgc.StrokeStringAt(text, 0, 0) - return -} - -// StrokeStringAt draws the contour of the text at point (x, y) -func (rgc *RasterGraphicContext) StrokeStringAt(text string, x, y float64) (cursor float64, err error) { - cursor, err = rgc.CreateStringPath(text, x, y) - rgc.Stroke() - return -} - -func (rgc *RasterGraphicContext) drawGlyph(glyph truetype.Index, dx, dy float64) error { - if err := rgc.glyphBuf.Load(rgc.current.Font, fixed.Int26_6(rgc.current.Scale), glyph, font.HintingNone); err != nil { - return err - } - e0 := 0 - for _, e1 := range rgc.glyphBuf.Ends { - DrawContour(rgc, rgc.glyphBuf.Points[e0:e1], dx, dy) - e0 = e1 - } - return nil -} - -// CreateStringPath creates a path from the string s at x, y, and returns the string width. -// The text is placed so that the left edge of the em square of the first character of s -// and the baseline intersect at x, y. The majority of the affected pixels will be -// above and to the right of the point, but some may be below or to the left. -// For example, drawing a string that starts with a 'J' in an italic font may -// affect pixels below and left of the point. -func (rgc *RasterGraphicContext) CreateStringPath(s string, x, y float64) (cursor float64, err error) { - f := rgc.GetFont() - if f == nil { - err = errors.New("No font loaded, cannot continue") - return - } - rgc.recalc() - - startx := x - prev, hasPrev := truetype.Index(0), false - for _, rc := range s { - index := f.Index(rc) - if hasPrev { - x += fUnitsToFloat64(f.Kern(fixed.Int26_6(rgc.current.Scale), prev, index)) - } - err = rgc.drawGlyph(index, x, y) - if err != nil { - cursor = x - startx - return - } - x += fUnitsToFloat64(f.HMetric(fixed.Int26_6(rgc.current.Scale), index).AdvanceWidth) - prev, hasPrev = index, true - } - cursor = x - startx - return -} - -// GetStringBounds returns the approximate pixel bounds of a string. -func (rgc *RasterGraphicContext) GetStringBounds(s string) (left, top, right, bottom float64, err error) { - f := rgc.GetFont() - if f == nil { - err = errors.New("No font loaded, cannot continue") - return - } - rgc.recalc() - - left = math.MaxFloat64 - top = math.MaxFloat64 - - cursor := 0.0 - prev, hasPrev := truetype.Index(0), false - for _, rc := range s { - index := f.Index(rc) - if hasPrev { - cursor += fUnitsToFloat64(f.Kern(fixed.Int26_6(rgc.current.Scale), prev, index)) - } - - if err = rgc.glyphBuf.Load(rgc.current.Font, fixed.Int26_6(rgc.current.Scale), index, font.HintingNone); err != nil { - return - } - e0 := 0 - for _, e1 := range rgc.glyphBuf.Ends { - ps := rgc.glyphBuf.Points[e0:e1] - for _, p := range ps { - x, y := pointToF64Point(p) - top = math.Min(top, y) - bottom = math.Max(bottom, y) - left = math.Min(left, x+cursor) - right = math.Max(right, x+cursor) - } - e0 = e1 - } - cursor += fUnitsToFloat64(f.HMetric(fixed.Int26_6(rgc.current.Scale), index).AdvanceWidth) - prev, hasPrev = index, true - } - return -} - -// recalc recalculates scale and bounds values from the font size, screen -// resolution and font metrics, and invalidates the glyph cache. -func (rgc *RasterGraphicContext) recalc() { - rgc.current.Scale = rgc.current.FontSizePoints * float64(rgc.DPI) -} - -// SetFont sets the font used to draw text. -func (rgc *RasterGraphicContext) SetFont(font *truetype.Font) { - rgc.current.Font = font -} - -// GetFont returns the font used to draw text. -func (rgc *RasterGraphicContext) GetFont() *truetype.Font { - return rgc.current.Font -} - -// SetFontSize sets the font size in points (as in ``a 12 point font''). -func (rgc *RasterGraphicContext) SetFontSize(fontSizePoints float64) { - rgc.current.FontSizePoints = fontSizePoints - rgc.recalc() -} - -func (rgc *RasterGraphicContext) paint(rasterizer *raster.Rasterizer, color color.Color) { - rgc.painter.SetColor(color) - rasterizer.Rasterize(rgc.painter) - rasterizer.Clear() - rgc.current.Path.Clear() -} - -// Stroke strokes the paths with the color specified by SetStrokeColor -func (rgc *RasterGraphicContext) Stroke(paths ...*Path) { - paths = append(paths, rgc.current.Path) - rgc.strokeRasterizer.UseNonZeroWinding = true - - stroker := NewLineStroker(rgc.current.Cap, rgc.current.Join, Transformer{Tr: rgc.current.Tr, Flattener: FtLineBuilder{Adder: rgc.strokeRasterizer}}) - stroker.HalfLineWidth = rgc.current.LineWidth / 2 - - var liner Flattener - if rgc.current.Dash != nil && len(rgc.current.Dash) > 0 { - liner = NewDashVertexConverter(rgc.current.Dash, rgc.current.DashOffset, stroker) - } else { - liner = stroker - } - for _, p := range paths { - Flatten(p, liner, rgc.current.Tr.GetScale()) - } - - rgc.paint(rgc.strokeRasterizer, rgc.current.StrokeColor) -} - -// Fill fills the paths with the color specified by SetFillColor -func (rgc *RasterGraphicContext) Fill(paths ...*Path) { - paths = append(paths, rgc.current.Path) - rgc.fillRasterizer.UseNonZeroWinding = rgc.current.FillRule == FillRuleWinding - - flattener := Transformer{Tr: rgc.current.Tr, Flattener: FtLineBuilder{Adder: rgc.fillRasterizer}} - for _, p := range paths { - Flatten(p, flattener, rgc.current.Tr.GetScale()) - } - - rgc.paint(rgc.fillRasterizer, rgc.current.FillColor) -} - -// FillStroke first fills the paths and than strokes them -func (rgc *RasterGraphicContext) FillStroke(paths ...*Path) { - paths = append(paths, rgc.current.Path) - rgc.fillRasterizer.UseNonZeroWinding = rgc.current.FillRule == FillRuleWinding - rgc.strokeRasterizer.UseNonZeroWinding = true - - flattener := Transformer{Tr: rgc.current.Tr, Flattener: FtLineBuilder{Adder: rgc.fillRasterizer}} - - stroker := NewLineStroker(rgc.current.Cap, rgc.current.Join, Transformer{Tr: rgc.current.Tr, Flattener: FtLineBuilder{Adder: rgc.strokeRasterizer}}) - stroker.HalfLineWidth = rgc.current.LineWidth / 2 - - var liner Flattener - if rgc.current.Dash != nil && len(rgc.current.Dash) > 0 { - liner = NewDashVertexConverter(rgc.current.Dash, rgc.current.DashOffset, stroker) - } else { - liner = stroker - } - - demux := DemuxFlattener{Flatteners: []Flattener{flattener, liner}} - for _, p := range paths { - Flatten(p, demux, rgc.current.Tr.GetScale()) - } - - // Fill - rgc.paint(rgc.fillRasterizer, rgc.current.FillColor) - // Stroke - rgc.paint(rgc.strokeRasterizer, rgc.current.StrokeColor) -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/stack_graphic_context.go b/vendor/github.com/wcharczuk/go-chart/drawing/stack_graphic_context.go deleted file mode 100644 index c3243c9..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/stack_graphic_context.go +++ /dev/null @@ -1,211 +0,0 @@ -package drawing - -import ( - "image" - "image/color" - - "github.com/golang/freetype/truetype" -) - -// StackGraphicContext is a context that does thngs. -type StackGraphicContext struct { - current *ContextStack -} - -// ContextStack is a graphic context implementation. -type ContextStack struct { - Tr Matrix - Path *Path - LineWidth float64 - Dash []float64 - DashOffset float64 - StrokeColor color.Color - FillColor color.Color - FillRule FillRule - Cap LineCap - Join LineJoin - - FontSizePoints float64 - Font *truetype.Font - - Scale float64 - - Previous *ContextStack -} - -// NewStackGraphicContext Create a new Graphic context from an image -func NewStackGraphicContext() *StackGraphicContext { - gc := &StackGraphicContext{} - gc.current = new(ContextStack) - gc.current.Tr = NewIdentityMatrix() - gc.current.Path = new(Path) - gc.current.LineWidth = 1.0 - gc.current.StrokeColor = image.Black - gc.current.FillColor = image.White - gc.current.Cap = RoundCap - gc.current.FillRule = FillRuleEvenOdd - gc.current.Join = RoundJoin - gc.current.FontSizePoints = 10 - return gc -} - -// GetMatrixTransform returns the matrix transform. -func (gc *StackGraphicContext) GetMatrixTransform() Matrix { - return gc.current.Tr -} - -// SetMatrixTransform sets the matrix transform. -func (gc *StackGraphicContext) SetMatrixTransform(tr Matrix) { - gc.current.Tr = tr -} - -// ComposeMatrixTransform composes a transform into the current transform. -func (gc *StackGraphicContext) ComposeMatrixTransform(tr Matrix) { - gc.current.Tr.Compose(tr) -} - -// Rotate rotates the matrix transform by an angle in degrees. -func (gc *StackGraphicContext) Rotate(angle float64) { - gc.current.Tr.Rotate(angle) -} - -// Translate translates a transform. -func (gc *StackGraphicContext) Translate(tx, ty float64) { - gc.current.Tr.Translate(tx, ty) -} - -// Scale scales a transform. -func (gc *StackGraphicContext) Scale(sx, sy float64) { - gc.current.Tr.Scale(sx, sy) -} - -// SetStrokeColor sets the stroke color. -func (gc *StackGraphicContext) SetStrokeColor(c color.Color) { - gc.current.StrokeColor = c -} - -// SetFillColor sets the fill color. -func (gc *StackGraphicContext) SetFillColor(c color.Color) { - gc.current.FillColor = c -} - -// SetFillRule sets the fill rule. -func (gc *StackGraphicContext) SetFillRule(f FillRule) { - gc.current.FillRule = f -} - -// SetLineWidth sets the line width. -func (gc *StackGraphicContext) SetLineWidth(lineWidth float64) { - gc.current.LineWidth = lineWidth -} - -// SetLineCap sets the line cap. -func (gc *StackGraphicContext) SetLineCap(cap LineCap) { - gc.current.Cap = cap -} - -// SetLineJoin sets the line join. -func (gc *StackGraphicContext) SetLineJoin(join LineJoin) { - gc.current.Join = join -} - -// SetLineDash sets the line dash. -func (gc *StackGraphicContext) SetLineDash(dash []float64, dashOffset float64) { - gc.current.Dash = dash - gc.current.DashOffset = dashOffset -} - -// SetFontSize sets the font size. -func (gc *StackGraphicContext) SetFontSize(fontSizePoints float64) { - gc.current.FontSizePoints = fontSizePoints -} - -// GetFontSize gets the font size. -func (gc *StackGraphicContext) GetFontSize() float64 { - return gc.current.FontSizePoints -} - -// SetFont sets the current font. -func (gc *StackGraphicContext) SetFont(f *truetype.Font) { - gc.current.Font = f -} - -// GetFont returns the font. -func (gc *StackGraphicContext) GetFont() *truetype.Font { - return gc.current.Font -} - -// BeginPath starts a new path. -func (gc *StackGraphicContext) BeginPath() { - gc.current.Path.Clear() -} - -// IsEmpty returns if the path is empty. -func (gc *StackGraphicContext) IsEmpty() bool { - return gc.current.Path.IsEmpty() -} - -// LastPoint returns the last point on the path. -func (gc *StackGraphicContext) LastPoint() (x float64, y float64) { - return gc.current.Path.LastPoint() -} - -// MoveTo moves the cursor for a path. -func (gc *StackGraphicContext) MoveTo(x, y float64) { - gc.current.Path.MoveTo(x, y) -} - -// LineTo draws a line. -func (gc *StackGraphicContext) LineTo(x, y float64) { - gc.current.Path.LineTo(x, y) -} - -// QuadCurveTo draws a quad curve. -func (gc *StackGraphicContext) QuadCurveTo(cx, cy, x, y float64) { - gc.current.Path.QuadCurveTo(cx, cy, x, y) -} - -// CubicCurveTo draws a cubic curve. -func (gc *StackGraphicContext) CubicCurveTo(cx1, cy1, cx2, cy2, x, y float64) { - gc.current.Path.CubicCurveTo(cx1, cy1, cx2, cy2, x, y) -} - -// ArcTo draws an arc. -func (gc *StackGraphicContext) ArcTo(cx, cy, rx, ry, startAngle, delta float64) { - gc.current.Path.ArcTo(cx, cy, rx, ry, startAngle, delta) -} - -// Close closes a path. -func (gc *StackGraphicContext) Close() { - gc.current.Path.Close() -} - -// Save pushes a context onto the stack. -func (gc *StackGraphicContext) Save() { - context := new(ContextStack) - context.FontSizePoints = gc.current.FontSizePoints - context.Font = gc.current.Font - context.LineWidth = gc.current.LineWidth - context.StrokeColor = gc.current.StrokeColor - context.FillColor = gc.current.FillColor - context.FillRule = gc.current.FillRule - context.Dash = gc.current.Dash - context.DashOffset = gc.current.DashOffset - context.Cap = gc.current.Cap - context.Join = gc.current.Join - context.Path = gc.current.Path.Copy() - context.Font = gc.current.Font - context.Scale = gc.current.Scale - copy(context.Tr[:], gc.current.Tr[:]) - context.Previous = gc.current - gc.current = context -} - -// Restore restores the previous context. -func (gc *StackGraphicContext) Restore() { - if gc.current.Previous != nil { - oldContext := gc.current - gc.current = gc.current.Previous - oldContext.Previous = nil - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/stroker.go b/vendor/github.com/wcharczuk/go-chart/drawing/stroker.go deleted file mode 100644 index e3ae070..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/stroker.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2010 The draw2d Authors. All rights reserved. -// created: 13/12/2010 by Laurent Le Goff - -package drawing - -// NewLineStroker creates a new line stroker. -func NewLineStroker(c LineCap, j LineJoin, flattener Flattener) *LineStroker { - l := new(LineStroker) - l.Flattener = flattener - l.HalfLineWidth = 0.5 - l.Cap = c - l.Join = j - return l -} - -// LineStroker draws the stroke portion of a line. -type LineStroker struct { - Flattener Flattener - HalfLineWidth float64 - Cap LineCap - Join LineJoin - vertices []float64 - rewind []float64 - x, y, nx, ny float64 -} - -// MoveTo implements the path builder interface. -func (l *LineStroker) MoveTo(x, y float64) { - l.x, l.y = x, y -} - -// LineTo implements the path builder interface. -func (l *LineStroker) LineTo(x, y float64) { - l.line(l.x, l.y, x, y) -} - -// LineJoin implements the path builder interface. -func (l *LineStroker) LineJoin() {} - -func (l *LineStroker) line(x1, y1, x2, y2 float64) { - dx := (x2 - x1) - dy := (y2 - y1) - d := vectorDistance(dx, dy) - if d != 0 { - nx := dy * l.HalfLineWidth / d - ny := -(dx * l.HalfLineWidth / d) - l.appendVertex(x1+nx, y1+ny, x2+nx, y2+ny, x1-nx, y1-ny, x2-nx, y2-ny) - l.x, l.y, l.nx, l.ny = x2, y2, nx, ny - } -} - -// Close implements the path builder interface. -func (l *LineStroker) Close() { - if len(l.vertices) > 1 { - l.appendVertex(l.vertices[0], l.vertices[1], l.rewind[0], l.rewind[1]) - } -} - -// End implements the path builder interface. -func (l *LineStroker) End() { - if len(l.vertices) > 1 { - l.Flattener.MoveTo(l.vertices[0], l.vertices[1]) - for i, j := 2, 3; j < len(l.vertices); i, j = i+2, j+2 { - l.Flattener.LineTo(l.vertices[i], l.vertices[j]) - } - } - for i, j := len(l.rewind)-2, len(l.rewind)-1; j > 0; i, j = i-2, j-2 { - l.Flattener.LineTo(l.rewind[i], l.rewind[j]) - } - if len(l.vertices) > 1 { - l.Flattener.LineTo(l.vertices[0], l.vertices[1]) - } - l.Flattener.End() - // reinit vertices - l.vertices = l.vertices[0:0] - l.rewind = l.rewind[0:0] - l.x, l.y, l.nx, l.ny = 0, 0, 0, 0 - -} - -func (l *LineStroker) appendVertex(vertices ...float64) { - s := len(vertices) / 2 - l.vertices = append(l.vertices, vertices[:s]...) - l.rewind = append(l.rewind, vertices[s:]...) -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/text.go b/vendor/github.com/wcharczuk/go-chart/drawing/text.go deleted file mode 100644 index d7ff5c2..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/text.go +++ /dev/null @@ -1,67 +0,0 @@ -package drawing - -import ( - "github.com/golang/freetype/truetype" - "golang.org/x/image/math/fixed" -) - -// DrawContour draws the given closed contour at the given sub-pixel offset. -func DrawContour(path PathBuilder, ps []truetype.Point, dx, dy float64) { - if len(ps) == 0 { - return - } - startX, startY := pointToF64Point(ps[0]) - path.MoveTo(startX+dx, startY+dy) - q0X, q0Y, on0 := startX, startY, true - for _, p := range ps[1:] { - qX, qY := pointToF64Point(p) - on := p.Flags&0x01 != 0 - if on { - if on0 { - path.LineTo(qX+dx, qY+dy) - } else { - path.QuadCurveTo(q0X+dx, q0Y+dy, qX+dx, qY+dy) - } - } else if !on0 { - midX := (q0X + qX) / 2 - midY := (q0Y + qY) / 2 - path.QuadCurveTo(q0X+dx, q0Y+dy, midX+dx, midY+dy) - } - q0X, q0Y, on0 = qX, qY, on - } - // Close the curve. - if on0 { - path.LineTo(startX+dx, startY+dy) - } else { - path.QuadCurveTo(q0X+dx, q0Y+dy, startX+dx, startY+dy) - } -} - -// FontExtents contains font metric information. -type FontExtents struct { - // Ascent is the distance that the text - // extends above the baseline. - Ascent float64 - - // Descent is the distance that the text - // extends below the baseline. The descent - // is given as a negative value. - Descent float64 - - // Height is the distance from the lowest - // descending point to the highest ascending - // point. - Height float64 -} - -// Extents returns the FontExtents for a font. -// TODO needs to read this https://developer.apple.com/fonts/TrueType-Reference-Manual/RM02/Chap2.html#intro -func Extents(font *truetype.Font, size float64) FontExtents { - bounds := font.Bounds(fixed.Int26_6(font.FUnitsPerEm())) - scale := size / float64(font.FUnitsPerEm()) - return FontExtents{ - Ascent: float64(bounds.Max.Y) * scale, - Descent: float64(bounds.Min.Y) * scale, - Height: float64(bounds.Max.Y-bounds.Min.Y) * scale, - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/transformer.go b/vendor/github.com/wcharczuk/go-chart/drawing/transformer.go deleted file mode 100644 index 4e31720..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/transformer.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2010 The draw2d Authors. All rights reserved. -// created: 13/12/2010 by Laurent Le Goff - -package drawing - -// Transformer apply the Matrix transformation tr -type Transformer struct { - Tr Matrix - Flattener Flattener -} - -// MoveTo implements the path builder interface. -func (t Transformer) MoveTo(x, y float64) { - u := x*t.Tr[0] + y*t.Tr[2] + t.Tr[4] - v := x*t.Tr[1] + y*t.Tr[3] + t.Tr[5] - t.Flattener.MoveTo(u, v) -} - -// LineTo implements the path builder interface. -func (t Transformer) LineTo(x, y float64) { - u := x*t.Tr[0] + y*t.Tr[2] + t.Tr[4] - v := x*t.Tr[1] + y*t.Tr[3] + t.Tr[5] - t.Flattener.LineTo(u, v) -} - -// LineJoin implements the path builder interface. -func (t Transformer) LineJoin() { - t.Flattener.LineJoin() -} - -// Close implements the path builder interface. -func (t Transformer) Close() { - t.Flattener.Close() -} - -// End implements the path builder interface. -func (t Transformer) End() { - t.Flattener.End() -} diff --git a/vendor/github.com/wcharczuk/go-chart/drawing/util.go b/vendor/github.com/wcharczuk/go-chart/drawing/util.go deleted file mode 100644 index 1eba3ff..0000000 --- a/vendor/github.com/wcharczuk/go-chart/drawing/util.go +++ /dev/null @@ -1,68 +0,0 @@ -package drawing - -import ( - "math" - - "golang.org/x/image/math/fixed" - - "github.com/golang/freetype/raster" - "github.com/golang/freetype/truetype" -) - -// PixelsToPoints returns the points for a given number of pixels at a DPI. -func PixelsToPoints(dpi, pixels float64) (points float64) { - points = (pixels * 72.0) / dpi - return -} - -// PointsToPixels returns the pixels for a given number of points at a DPI. -func PointsToPixels(dpi, points float64) (pixels float64) { - pixels = (points * dpi) / 72.0 - return -} - -func abs(i int) int { - if i < 0 { - return -i - } - return i -} - -func distance(x1, y1, x2, y2 float64) float64 { - return vectorDistance(x2-x1, y2-y1) -} - -func vectorDistance(dx, dy float64) float64 { - return float64(math.Sqrt(dx*dx + dy*dy)) -} - -func toFtCap(c LineCap) raster.Capper { - switch c { - case RoundCap: - return raster.RoundCapper - case ButtCap: - return raster.ButtCapper - case SquareCap: - return raster.SquareCapper - } - return raster.RoundCapper -} - -func toFtJoin(j LineJoin) raster.Joiner { - switch j { - case RoundJoin: - return raster.RoundJoiner - case BevelJoin: - return raster.BevelJoiner - } - return raster.RoundJoiner -} - -func pointToF64Point(p truetype.Point) (x, y float64) { - return fUnitsToFloat64(p.X), -fUnitsToFloat64(p.Y) -} - -func fUnitsToFloat64(x fixed.Int26_6) float64 { - scaled := x << 2 - return float64(scaled/256) + float64(scaled%256)/256.0 -} diff --git a/vendor/github.com/wcharczuk/go-chart/ema_series.go b/vendor/github.com/wcharczuk/go-chart/ema_series.go deleted file mode 100644 index affadc1..0000000 --- a/vendor/github.com/wcharczuk/go-chart/ema_series.go +++ /dev/null @@ -1,101 +0,0 @@ -package chart - -const ( - // DefaultEMAPeriod is the default EMA period used in the sigma calculation. - DefaultEMAPeriod = 12 -) - -// EMASeries is a computed series. -type EMASeries struct { - Name string - Style Style - YAxis YAxisType - - Period int - InnerSeries ValueProvider - - cache []float64 -} - -// GetName returns the name of the time series. -func (ema EMASeries) GetName() string { - return ema.Name -} - -// GetStyle returns the line style. -func (ema EMASeries) GetStyle() Style { - return ema.Style -} - -// GetYAxis returns which YAxis the series draws on. -func (ema EMASeries) GetYAxis() YAxisType { - return ema.YAxis -} - -// GetPeriod returns the window size. -func (ema EMASeries) GetPeriod() int { - if ema.Period == 0 { - return DefaultEMAPeriod - } - return ema.Period -} - -// Len returns the number of elements in the series. -func (ema EMASeries) Len() int { - return ema.InnerSeries.Len() -} - -// GetSigma returns the smoothing factor for the serise. -func (ema EMASeries) GetSigma() float64 { - return 2.0 / (float64(ema.GetPeriod()) + 1) -} - -// GetValue gets a value at a given index. -func (ema *EMASeries) GetValue(index int) (x, y float64) { - if ema.InnerSeries == nil { - return - } - if len(ema.cache) == 0 { - ema.ensureCachedValues() - } - vx, _ := ema.InnerSeries.GetValue(index) - x = vx - y = ema.cache[index] - return -} - -// GetLastValue computes the last moving average value but walking back window size samples, -// and recomputing the last moving average chunk. -func (ema *EMASeries) GetLastValue() (x, y float64) { - if ema.InnerSeries == nil { - return - } - if len(ema.cache) == 0 { - ema.ensureCachedValues() - } - lastIndex := ema.InnerSeries.Len() - 1 - x, _ = ema.InnerSeries.GetValue(lastIndex) - y = ema.cache[lastIndex] - return -} - -func (ema *EMASeries) ensureCachedValues() { - seriesLength := ema.InnerSeries.Len() - ema.cache = make([]float64, seriesLength) - sigma := ema.GetSigma() - for x := 0; x < seriesLength; x++ { - _, y := ema.InnerSeries.GetValue(x) - if x == 0 { - ema.cache[x] = y - continue - } - previousEMA := ema.cache[x-1] - ema.cache[x] = ((y - previousEMA) * sigma) + previousEMA - } -} - -// Render renders the series. -func (ema *EMASeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - style := ema.Style.InheritFrom(defaults) - Draw.LineSeries(r, canvasBox, xrange, yrange, style, ema) -} diff --git a/vendor/github.com/wcharczuk/go-chart/ema_series_test.go b/vendor/github.com/wcharczuk/go-chart/ema_series_test.go deleted file mode 100644 index ad74d72..0000000 --- a/vendor/github.com/wcharczuk/go-chart/ema_series_test.go +++ /dev/null @@ -1,105 +0,0 @@ -package chart - -import ( - "testing" - - "github.com/blendlabs/go-assert" -) - -var ( - emaXValues = Sequence.Float64(1.0, 50.0) - emaYValues = []float64{ - 1, 2, 3, 4, 5, 4, 3, 2, - 1, 2, 3, 4, 5, 4, 3, 2, - 1, 2, 3, 4, 5, 4, 3, 2, - 1, 2, 3, 4, 5, 4, 3, 2, - 1, 2, 3, 4, 5, 4, 3, 2, - 1, 2, 3, 4, 5, 4, 3, 2, - 1, 2, - } - emaExpected = []float64{ - 1, - 1.074074074, - 1.216735254, - 1.422903013, - 1.68787316, - 1.859141815, - 1.943649828, - 1.947823915, - 1.877614736, - 1.886680311, - 1.969148437, - 2.119581886, - 2.33294619, - 2.456431658, - 2.496695979, - 2.459903685, - 2.351762671, - 2.325706177, - 2.375653867, - 2.495975803, - 2.681459077, - 2.779128775, - 2.795489607, - 2.73656445, - 2.607930047, - 2.562898191, - 2.595276103, - 2.699329725, - 2.869749746, - 2.953471987, - 2.956918506, - 2.886035654, - 2.746329309, - 2.691045657, - 2.713931163, - 2.809195522, - 2.971477335, - 3.047664199, - 3.044133518, - 2.966790294, - 2.821102124, - 2.760279745, - 2.778036801, - 2.868552593, - 3.026437586, - 3.098553321, - 3.091253075, - 3.010419514, - 2.86149955, - 2.797684768, - } - emaDelta = 0.0001 -) - -func TestEMASeries(t *testing.T) { - assert := assert.New(t) - - mockSeries := mockValueProvider{ - emaXValues, - emaYValues, - } - assert.Equal(50, mockSeries.Len()) - - ema := &EMASeries{ - InnerSeries: mockSeries, - Period: 26, - } - - sig := ema.GetSigma() - assert.Equal(2.0/(26.0+1), sig) - - var yvalues []float64 - for x := 0; x < ema.Len(); x++ { - _, y := ema.GetValue(x) - yvalues = append(yvalues, y) - } - - for index, yv := range yvalues { - assert.InDelta(yv, emaExpected[index], emaDelta) - } - - lvx, lvy := ema.GetLastValue() - assert.Equal(50.0, lvx) - assert.InDelta(lvy, emaExpected[49], emaDelta) -} diff --git a/vendor/github.com/wcharczuk/go-chart/file_util.go b/vendor/github.com/wcharczuk/go-chart/file_util.go deleted file mode 100644 index 7fd66bf..0000000 --- a/vendor/github.com/wcharczuk/go-chart/file_util.go +++ /dev/null @@ -1,52 +0,0 @@ -package chart - -import ( - "bufio" - "io" - "os" - - exception "github.com/blendlabs/go-exception" -) - -var ( - // File contains file utility functions - File = fileUtil{} -) - -type fileUtil struct{} - -// ReadByLines reads a file and calls the handler for each line. -func (fu fileUtil) ReadByLines(filePath string, handler func(line string)) error { - if f, err := os.Open(filePath); err == nil { - defer f.Close() - - scanner := bufio.NewScanner(f) - for scanner.Scan() { - line := scanner.Text() - handler(line) - } - } else { - return exception.Wrap(err) - } - return nil -} - -// ReadByChunks reads a file in `chunkSize` pieces, dispatched to the handler. -func (fu fileUtil) ReadByChunks(filePath string, chunkSize int, handler func(line []byte)) error { - if f, err := os.Open(filePath); err == nil { - defer f.Close() - - chunk := make([]byte, chunkSize) - for { - readBytes, err := f.Read(chunk) - if err == io.EOF { - break - } - readData := chunk[:readBytes] - handler(readData) - } - } else { - return exception.Wrap(err) - } - return nil -} diff --git a/vendor/github.com/wcharczuk/go-chart/grid_line.go b/vendor/github.com/wcharczuk/go-chart/grid_line.go deleted file mode 100644 index 80274bd..0000000 --- a/vendor/github.com/wcharczuk/go-chart/grid_line.go +++ /dev/null @@ -1,72 +0,0 @@ -package chart - -// GridLineProvider is a type that provides grid lines. -type GridLineProvider interface { - GetGridLines(ticks []Tick, isVertical bool, majorStyle, minorStyle Style) []GridLine -} - -// GridLine is a line on a graph canvas. -type GridLine struct { - IsMinor bool - Style Style - Value float64 -} - -// Major returns if the gridline is a `major` line. -func (gl GridLine) Major() bool { - return !gl.IsMinor -} - -// Minor returns if the gridline is a `minor` line. -func (gl GridLine) Minor() bool { - return gl.IsMinor -} - -// Render renders the gridline -func (gl GridLine) Render(r Renderer, canvasBox Box, ra Range, isVertical bool, defaults Style) { - r.SetStrokeColor(gl.Style.GetStrokeColor(defaults.GetStrokeColor())) - r.SetStrokeWidth(gl.Style.GetStrokeWidth(defaults.GetStrokeWidth())) - r.SetStrokeDashArray(gl.Style.GetStrokeDashArray(defaults.GetStrokeDashArray())) - - if isVertical { - lineLeft := canvasBox.Left + ra.Translate(gl.Value) - lineBottom := canvasBox.Bottom - lineTop := canvasBox.Top - - r.MoveTo(lineLeft, lineBottom) - r.LineTo(lineLeft, lineTop) - r.Stroke() - } else { - lineLeft := canvasBox.Left - lineRight := canvasBox.Right - lineHeight := canvasBox.Bottom - ra.Translate(gl.Value) - - r.MoveTo(lineLeft, lineHeight) - r.LineTo(lineRight, lineHeight) - r.Stroke() - } -} - -// GenerateGridLines generates grid lines. -func GenerateGridLines(ticks []Tick, majorStyle, minorStyle Style) []GridLine { - var gl []GridLine - isMinor := false - - if len(ticks) < 3 { - return gl - } - - for _, t := range ticks[1 : len(ticks)-1] { - s := majorStyle - if isMinor { - s = minorStyle - } - gl = append(gl, GridLine{ - Style: s, - IsMinor: isMinor, - Value: t.Value, - }) - isMinor = !isMinor - } - return gl -} diff --git a/vendor/github.com/wcharczuk/go-chart/grid_line_test.go b/vendor/github.com/wcharczuk/go-chart/grid_line_test.go deleted file mode 100644 index ac57f7b..0000000 --- a/vendor/github.com/wcharczuk/go-chart/grid_line_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package chart - -import ( - "testing" - - "github.com/blendlabs/go-assert" -) - -func TestGenerateGridLines(t *testing.T) { - assert := assert.New(t) - - ticks := []Tick{ - {Value: 1.0, Label: "1.0"}, - {Value: 2.0, Label: "2.0"}, - {Value: 3.0, Label: "3.0"}, - {Value: 4.0, Label: "4.0"}, - } - - gl := GenerateGridLines(ticks, Style{}, Style{}) - assert.Len(gl, 2) - - assert.Equal(2.0, gl[0].Value) - assert.Equal(3.0, gl[1].Value) -} diff --git a/vendor/github.com/wcharczuk/go-chart/histogram_series.go b/vendor/github.com/wcharczuk/go-chart/histogram_series.go deleted file mode 100644 index 0542c1a..0000000 --- a/vendor/github.com/wcharczuk/go-chart/histogram_series.go +++ /dev/null @@ -1,57 +0,0 @@ -package chart - -// HistogramSeries is a special type of series that draws as a histogram. -// Some peculiarities; it will always be lower bounded at 0 (at the very least). -// This may alter ranges a bit and generally you want to put a histogram series on it's own y-axis. -type HistogramSeries struct { - Name string - Style Style - YAxis YAxisType - InnerSeries ValueProvider -} - -// GetName implements Series.GetName. -func (hs HistogramSeries) GetName() string { - return hs.Name -} - -// GetStyle implements Series.GetStyle. -func (hs HistogramSeries) GetStyle() Style { - return hs.Style -} - -// GetYAxis returns which yaxis the series is mapped to. -func (hs HistogramSeries) GetYAxis() YAxisType { - return hs.YAxis -} - -// Len implements BoundedValueProvider.Len. -func (hs HistogramSeries) Len() int { - return hs.InnerSeries.Len() -} - -// GetValue implements ValueProvider.GetValue. -func (hs HistogramSeries) GetValue(index int) (x, y float64) { - return hs.InnerSeries.GetValue(index) -} - -// GetBoundedValue implements BoundedValueProvider.GetBoundedValue -func (hs HistogramSeries) GetBoundedValue(index int) (x, y1, y2 float64) { - vx, vy := hs.InnerSeries.GetValue(index) - - x = vx - - if vy > 0 { - y1 = vy - return - } - - y2 = vy - return -} - -// Render implements Series.Render. -func (hs HistogramSeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - style := hs.Style.InheritFrom(defaults) - Draw.HistogramSeries(r, canvasBox, xrange, yrange, style, hs) -} diff --git a/vendor/github.com/wcharczuk/go-chart/histogram_series_test.go b/vendor/github.com/wcharczuk/go-chart/histogram_series_test.go deleted file mode 100644 index 3e51833..0000000 --- a/vendor/github.com/wcharczuk/go-chart/histogram_series_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package chart - -import ( - "testing" - - assert "github.com/blendlabs/go-assert" -) - -func TestHistogramSeries(t *testing.T) { - assert := assert.New(t) - - cs := ContinuousSeries{ - Name: "Test Series", - XValues: Sequence.Float64(1.0, 20.0), - YValues: Sequence.Float64(10.0, -10.0), - } - - hs := HistogramSeries{ - InnerSeries: cs, - } - - for x := 0; x < hs.Len(); x++ { - csx, csy := cs.GetValue(0) - hsx, hsy1, hsy2 := hs.GetBoundedValue(0) - assert.Equal(csx, hsx) - assert.True(hsy1 > 0) - assert.True(hsy2 <= 0) - assert.True(csy < 0 || (csy > 0 && csy == hsy1)) - assert.True(csy > 0 || (csy < 0 && csy == hsy2)) - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/image_writer.go b/vendor/github.com/wcharczuk/go-chart/image_writer.go deleted file mode 100644 index e9cfd7a..0000000 --- a/vendor/github.com/wcharczuk/go-chart/image_writer.go +++ /dev/null @@ -1,42 +0,0 @@ -package chart - -import ( - "bytes" - "errors" - "image" - "image/png" -) - -// RGBACollector is a render target for a chart. -type RGBACollector interface { - SetRGBA(i *image.RGBA) -} - -// ImageWriter is a special type of io.Writer that produces a final image. -type ImageWriter struct { - rgba *image.RGBA - contents *bytes.Buffer -} - -func (ir *ImageWriter) Write(buffer []byte) (int, error) { - if ir.contents == nil { - ir.contents = bytes.NewBuffer([]byte{}) - } - return ir.contents.Write(buffer) -} - -// SetRGBA sets a raw version of the image. -func (ir *ImageWriter) SetRGBA(i *image.RGBA) { - ir.rgba = i -} - -// Image returns an *image.Image for the result. -func (ir *ImageWriter) Image() (image.Image, error) { - if ir.rgba != nil { - return ir.rgba, nil - } - if ir.contents != nil && ir.contents.Len() > 0 { - return png.Decode(ir.contents) - } - return nil, errors.New("No valid sources for image data, cannot continue.") -} diff --git a/vendor/github.com/wcharczuk/go-chart/last_value_annotation_series.go b/vendor/github.com/wcharczuk/go-chart/last_value_annotation_series.go deleted file mode 100644 index 9006378..0000000 --- a/vendor/github.com/wcharczuk/go-chart/last_value_annotation_series.go +++ /dev/null @@ -1,37 +0,0 @@ -package chart - -import "fmt" - -// LastValueAnnotation returns an annotation series of just the last value of a value provider. -func LastValueAnnotation(innerSeries ValueProvider, vfs ...ValueFormatter) AnnotationSeries { - var vf ValueFormatter - if len(vfs) > 0 { - vf = vfs[0] - } else if typed, isTyped := innerSeries.(ValueFormatterProvider); isTyped { - _, vf = typed.GetValueFormatters() - } else { - vf = FloatValueFormatter - } - - var lastValue Value2 - if typed, isTyped := innerSeries.(LastValueProvider); isTyped { - lastValue.XValue, lastValue.YValue = typed.GetLastValue() - lastValue.Label = vf(lastValue.YValue) - } else { - lastValue.XValue, lastValue.YValue = innerSeries.GetValue(innerSeries.Len() - 1) - lastValue.Label = vf(lastValue.YValue) - } - - var seriesName string - var seriesStyle Style - if typed, isTyped := innerSeries.(Series); isTyped { - seriesName = fmt.Sprintf("%s - Last Value", typed.GetName()) - seriesStyle = typed.GetStyle() - } - - return AnnotationSeries{ - Name: seriesName, - Style: seriesStyle, - Annotations: []Value2{lastValue}, - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/legend.go b/vendor/github.com/wcharczuk/go-chart/legend.go deleted file mode 100644 index 20d4a04..0000000 --- a/vendor/github.com/wcharczuk/go-chart/legend.go +++ /dev/null @@ -1,215 +0,0 @@ -package chart - -import "github.com/wcharczuk/go-chart/drawing" - -// Legend returns a legend renderable function. -func Legend(c *Chart, userDefaults ...Style) Renderable { - return func(r Renderer, cb Box, chartDefaults Style) { - legendDefaults := Style{ - FillColor: drawing.ColorWhite, - FontColor: DefaultTextColor, - FontSize: 8.0, - StrokeColor: DefaultAxisColor, - StrokeWidth: DefaultAxisLineWidth, - } - - var legendStyle Style - if len(userDefaults) > 0 { - legendStyle = userDefaults[0].InheritFrom(chartDefaults.InheritFrom(legendDefaults)) - } else { - legendStyle = chartDefaults.InheritFrom(legendDefaults) - } - - // DEFAULTS - legendPadding := Box{ - Top: 5, - Left: 5, - Right: 5, - Bottom: 5, - } - lineTextGap := 5 - lineLengthMinimum := 25 - - var labels []string - var lines []Style - for index, s := range c.Series { - if s.GetStyle().IsZero() || s.GetStyle().Show { - if _, isAnnotationSeries := s.(AnnotationSeries); !isAnnotationSeries { - labels = append(labels, s.GetName()) - lines = append(lines, s.GetStyle().InheritFrom(c.styleDefaultsSeries(index))) - } - } - } - - legend := Box{ - Top: cb.Top, - Left: cb.Left, - // bottom and right will be sized by the legend content + relevant padding. - } - - legendContent := Box{ - Top: legend.Top + legendPadding.Top, - Left: legend.Left + legendPadding.Left, - Right: legend.Left + legendPadding.Left, - Bottom: legend.Top + legendPadding.Top, - } - - legendStyle.GetTextOptions().WriteToRenderer(r) - - // measure - labelCount := 0 - for x := 0; x < len(labels); x++ { - if len(labels[x]) > 0 { - tb := r.MeasureText(labels[x]) - if labelCount > 0 { - legendContent.Bottom += DefaultMinimumTickVerticalSpacing - } - legendContent.Bottom += tb.Height() - right := legendContent.Left + tb.Width() + lineTextGap + lineLengthMinimum - legendContent.Right = Math.MaxInt(legendContent.Right, right) - labelCount++ - } - } - - legend = legend.Grow(legendContent) - legend.Right = legendContent.Right + legendPadding.Right - legend.Bottom = legendContent.Bottom + legendPadding.Bottom - - Draw.Box(r, legend, legendStyle) - - legendStyle.GetTextOptions().WriteToRenderer(r) - - ycursor := legendContent.Top - tx := legendContent.Left - legendCount := 0 - var label string - for x := 0; x < len(labels); x++ { - label = labels[x] - if len(label) > 0 { - if legendCount > 0 { - ycursor += DefaultMinimumTickVerticalSpacing - } - - tb := r.MeasureText(label) - - ty := ycursor + tb.Height() - r.Text(label, tx, ty) - - th2 := tb.Height() >> 1 - - lx := tx + tb.Width() + lineTextGap - ly := ty - th2 - lx2 := legendContent.Right - legendPadding.Right - - r.SetStrokeColor(lines[x].GetStrokeColor()) - r.SetStrokeWidth(lines[x].GetStrokeWidth()) - r.SetStrokeDashArray(lines[x].GetStrokeDashArray()) - - r.MoveTo(lx, ly) - r.LineTo(lx2, ly) - r.Stroke() - - ycursor += tb.Height() - legendCount++ - } - } - } -} - -// LegendThin is a legend that doesn't obscure the chart area. -func LegendThin(c *Chart, userDefaults ...Style) Renderable { - return func(r Renderer, cb Box, chartDefaults Style) { - legendDefaults := Style{ - FillColor: drawing.ColorWhite, - FontColor: DefaultTextColor, - FontSize: 8.0, - StrokeColor: DefaultAxisColor, - StrokeWidth: DefaultAxisLineWidth, - Padding: Box{ - Top: 2, - Left: 7, - Right: 7, - Bottom: 5, - }, - } - - var legendStyle Style - if len(userDefaults) > 0 { - legendStyle = userDefaults[0].InheritFrom(chartDefaults.InheritFrom(legendDefaults)) - } else { - legendStyle = chartDefaults.InheritFrom(legendDefaults) - } - - r.SetFont(legendStyle.GetFont()) - r.SetFontColor(legendStyle.GetFontColor()) - r.SetFontSize(legendStyle.GetFontSize()) - - var labels []string - var lines []Style - for index, s := range c.Series { - if s.GetStyle().IsZero() || s.GetStyle().Show { - if _, isAnnotationSeries := s.(AnnotationSeries); !isAnnotationSeries { - labels = append(labels, s.GetName()) - lines = append(lines, s.GetStyle().InheritFrom(c.styleDefaultsSeries(index))) - } - } - } - - var textHeight int - var textWidth int - var textBox Box - for x := 0; x < len(labels); x++ { - if len(labels[x]) > 0 { - textBox = r.MeasureText(labels[x]) - textHeight = Math.MaxInt(textBox.Height(), textHeight) - textWidth = Math.MaxInt(textBox.Width(), textWidth) - } - } - - legendBoxHeight := textHeight + legendStyle.Padding.Top + legendStyle.Padding.Bottom - chartPadding := cb.Top - legendYMargin := (chartPadding - legendBoxHeight) >> 1 - - legendBox := Box{ - Left: cb.Left, - Right: cb.Right, - Top: legendYMargin, - Bottom: legendYMargin + legendBoxHeight, - } - - Draw.Box(r, legendBox, legendDefaults) - - r.SetFont(legendStyle.GetFont()) - r.SetFontColor(legendStyle.GetFontColor()) - r.SetFontSize(legendStyle.GetFontSize()) - - lineTextGap := 5 - lineLengthMinimum := 25 - - tx := legendBox.Left + legendStyle.Padding.Left - ty := legendYMargin + legendStyle.Padding.Top + textHeight - var label string - var lx, ly int - th2 := textHeight >> 1 - for index := range labels { - label = labels[index] - if len(label) > 0 { - textBox = r.MeasureText(label) - r.Text(label, tx, ty) - - lx = tx + textBox.Width() + lineTextGap - ly = ty - th2 - - r.SetStrokeColor(lines[index].GetStrokeColor()) - r.SetStrokeWidth(lines[index].GetStrokeWidth()) - r.SetStrokeDashArray(lines[index].GetStrokeDashArray()) - - r.MoveTo(lx, ly) - r.LineTo(lx+lineLengthMinimum, ly) - r.Stroke() - - tx += textBox.Width() + DefaultMinimumTickHorizontalSpacing + lineTextGap + lineLengthMinimum - } - } - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/legend_test.go b/vendor/github.com/wcharczuk/go-chart/legend_test.go deleted file mode 100644 index 720506c..0000000 --- a/vendor/github.com/wcharczuk/go-chart/legend_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package chart - -import ( - "bytes" - "testing" - - "github.com/blendlabs/go-assert" -) - -func TestLegend(t *testing.T) { - assert := assert.New(t) - - graph := Chart{ - Series: []Series{ - ContinuousSeries{ - Name: "A test series", - XValues: []float64{1.0, 2.0, 3.0, 4.0, 5.0}, - YValues: []float64{1.0, 2.0, 3.0, 4.0, 5.0}, - }, - }, - } - - //note we have to do this as a separate step because we need a reference to graph - graph.Elements = []Renderable{ - Legend(&graph), - } - buf := bytes.NewBuffer([]byte{}) - err := graph.Render(PNG, buf) - assert.Nil(err) - assert.NotZero(buf.Len()) -} diff --git a/vendor/github.com/wcharczuk/go-chart/linear_regression_series.go b/vendor/github.com/wcharczuk/go-chart/linear_regression_series.go deleted file mode 100644 index a33a0b1..0000000 --- a/vendor/github.com/wcharczuk/go-chart/linear_regression_series.go +++ /dev/null @@ -1,132 +0,0 @@ -package chart - -// LinearRegressionSeries is a series that plots the n-nearest neighbors -// linear regression for the values. -type LinearRegressionSeries struct { - Name string - Style Style - YAxis YAxisType - - Window int - Offset int - InnerSeries ValueProvider - - m float64 - b float64 - avgx float64 - stddevx float64 -} - -// GetName returns the name of the time series. -func (lrs LinearRegressionSeries) GetName() string { - return lrs.Name -} - -// GetStyle returns the line style. -func (lrs LinearRegressionSeries) GetStyle() Style { - return lrs.Style -} - -// GetYAxis returns which YAxis the series draws on. -func (lrs LinearRegressionSeries) GetYAxis() YAxisType { - return lrs.YAxis -} - -// Len returns the number of elements in the series. -func (lrs LinearRegressionSeries) Len() int { - return Math.MinInt(lrs.GetWindow(), lrs.InnerSeries.Len()-lrs.GetOffset()) -} - -// GetWindow returns the window size. -func (lrs LinearRegressionSeries) GetWindow() int { - if lrs.Window == 0 { - return lrs.InnerSeries.Len() - } - return lrs.Window -} - -// GetEndIndex returns the effective window end. -func (lrs LinearRegressionSeries) GetEndIndex() int { - return Math.MinInt(lrs.GetOffset()+(lrs.Len()), (lrs.InnerSeries.Len() - 1)) -} - -// GetOffset returns the data offset. -func (lrs LinearRegressionSeries) GetOffset() int { - if lrs.Offset == 0 { - return 0 - } - return lrs.Offset -} - -// GetValue gets a value at a given index. -func (lrs *LinearRegressionSeries) GetValue(index int) (x, y float64) { - if lrs.InnerSeries == nil { - return - } - if lrs.m == 0 && lrs.b == 0 { - lrs.computeCoefficients() - } - offset := lrs.GetOffset() - effectiveIndex := Math.MinInt(index+offset, lrs.InnerSeries.Len()) - x, y = lrs.InnerSeries.GetValue(effectiveIndex) - y = (lrs.m * lrs.normalize(x)) + lrs.b - return -} - -// GetLastValue computes the last moving average value but walking back window size samples, -// and recomputing the last moving average chunk. -func (lrs *LinearRegressionSeries) GetLastValue() (x, y float64) { - if lrs.InnerSeries == nil { - return - } - if lrs.m == 0 && lrs.b == 0 { - lrs.computeCoefficients() - } - endIndex := lrs.GetEndIndex() - x, y = lrs.InnerSeries.GetValue(endIndex) - y = (lrs.m * lrs.normalize(x)) + lrs.b - return -} - -func (lrs *LinearRegressionSeries) normalize(xvalue float64) float64 { - return (xvalue - lrs.avgx) / lrs.stddevx -} - -// computeCoefficients computes the `m` and `b` terms in the linear formula given by `y = mx+b`. -func (lrs *LinearRegressionSeries) computeCoefficients() { - startIndex := lrs.GetOffset() - endIndex := lrs.GetEndIndex() - - p := float64(endIndex - startIndex) - - xvalues := NewRingBufferWithCapacity(lrs.Len()) - for index := startIndex; index < endIndex; index++ { - - x, _ := lrs.InnerSeries.GetValue(index) - xvalues.Enqueue(x) - } - - lrs.avgx = xvalues.Average() - lrs.stddevx = xvalues.StdDev() - - var sumx, sumy, sumxx, sumxy float64 - for index := startIndex; index < endIndex; index++ { - x, y := lrs.InnerSeries.GetValue(index) - - x = lrs.normalize(x) - - sumx += x - sumy += y - sumxx += x * x - sumxy += x * y - } - - lrs.m = (p*sumxy - sumx*sumy) / (p*sumxx - sumx*sumx) - lrs.b = (sumy / p) - (lrs.m * sumx / p) -} - -// Render renders the series. -func (lrs *LinearRegressionSeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - style := lrs.Style.InheritFrom(defaults) - Draw.LineSeries(r, canvasBox, xrange, yrange, style, lrs) -} diff --git a/vendor/github.com/wcharczuk/go-chart/linear_regression_series_test.go b/vendor/github.com/wcharczuk/go-chart/linear_regression_series_test.go deleted file mode 100644 index 4a72669..0000000 --- a/vendor/github.com/wcharczuk/go-chart/linear_regression_series_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package chart - -import ( - "testing" - - assert "github.com/blendlabs/go-assert" -) - -func TestLinearRegressionSeries(t *testing.T) { - assert := assert.New(t) - - mainSeries := ContinuousSeries{ - Name: "A test series", - XValues: Sequence.Float64(1.0, 100.0), - YValues: Sequence.Float64(1.0, 100.0), - } - - linRegSeries := &LinearRegressionSeries{ - InnerSeries: mainSeries, - } - - lrx0, lry0 := linRegSeries.GetValue(0) - assert.InDelta(1.0, lrx0, 0.0000001) - assert.InDelta(1.0, lry0, 0.0000001) - - lrxn, lryn := linRegSeries.GetLastValue() - assert.InDelta(100.0, lrxn, 0.0000001) - assert.InDelta(100.0, lryn, 0.0000001) -} - -func TestLinearRegressionSeriesDesc(t *testing.T) { - assert := assert.New(t) - - mainSeries := ContinuousSeries{ - Name: "A test series", - XValues: Sequence.Float64(100.0, 1.0), - YValues: Sequence.Float64(100.0, 1.0), - } - - linRegSeries := &LinearRegressionSeries{ - InnerSeries: mainSeries, - } - - lrx0, lry0 := linRegSeries.GetValue(0) - assert.InDelta(100.0, lrx0, 0.0000001) - assert.InDelta(100.0, lry0, 0.0000001) - - lrxn, lryn := linRegSeries.GetLastValue() - assert.InDelta(1.0, lrxn, 0.0000001) - assert.InDelta(1.0, lryn, 0.0000001) -} - -func TestLinearRegressionSeriesWindowAndOffset(t *testing.T) { - assert := assert.New(t) - - mainSeries := ContinuousSeries{ - Name: "A test series", - XValues: Sequence.Float64(100.0, 1.0), - YValues: Sequence.Float64(100.0, 1.0), - } - - linRegSeries := &LinearRegressionSeries{ - InnerSeries: mainSeries, - Offset: 10, - Window: 10, - } - - assert.Equal(10, linRegSeries.Len()) - - lrx0, lry0 := linRegSeries.GetValue(0) - assert.InDelta(90.0, lrx0, 0.0000001) - assert.InDelta(90.0, lry0, 0.0000001) - - lrxn, lryn := linRegSeries.GetLastValue() - assert.InDelta(80.0, lrxn, 0.0000001) - assert.InDelta(80.0, lryn, 0.0000001) -} diff --git a/vendor/github.com/wcharczuk/go-chart/macd_series.go b/vendor/github.com/wcharczuk/go-chart/macd_series.go deleted file mode 100644 index b3b80c0..0000000 --- a/vendor/github.com/wcharczuk/go-chart/macd_series.go +++ /dev/null @@ -1,289 +0,0 @@ -package chart - -const ( - // DefaultMACDPeriodPrimary is the long window. - DefaultMACDPeriodPrimary = 26 - // DefaultMACDPeriodSecondary is the short window. - DefaultMACDPeriodSecondary = 12 - // DefaultMACDSignalPeriod is the signal period to compute for the MACD. - DefaultMACDSignalPeriod = 9 -) - -// MACDSeries computes the difference between the MACD line and the MACD Signal line. -// It is used in technical analysis and gives a lagging indicator of momentum. -type MACDSeries struct { - Name string - Style Style - YAxis YAxisType - InnerSeries ValueProvider - - PrimaryPeriod int - SecondaryPeriod int - SignalPeriod int - - signal *MACDSignalSeries - macdl *MACDLineSeries -} - -// GetPeriods returns the primary and secondary periods. -func (macd MACDSeries) GetPeriods() (w1, w2, sig int) { - if macd.PrimaryPeriod == 0 { - w1 = DefaultMACDPeriodPrimary - } else { - w1 = macd.PrimaryPeriod - } - if macd.SecondaryPeriod == 0 { - w2 = DefaultMACDPeriodSecondary - } else { - w2 = macd.SecondaryPeriod - } - if macd.SignalPeriod == 0 { - sig = DefaultMACDSignalPeriod - } else { - sig = macd.SignalPeriod - } - return -} - -// GetName returns the name of the time series. -func (macd MACDSeries) GetName() string { - return macd.Name -} - -// GetStyle returns the line style. -func (macd MACDSeries) GetStyle() Style { - return macd.Style -} - -// GetYAxis returns which YAxis the series draws on. -func (macd MACDSeries) GetYAxis() YAxisType { - return macd.YAxis -} - -// Len returns the number of elements in the series. -func (macd MACDSeries) Len() int { - if macd.InnerSeries == nil { - return 0 - } - - return macd.InnerSeries.Len() -} - -// GetValue gets a value at a given index. For MACD it is the signal value. -func (macd *MACDSeries) GetValue(index int) (x float64, y float64) { - if macd.InnerSeries == nil { - return - } - - if macd.signal == nil || macd.macdl == nil { - macd.ensureChildSeries() - } - - _, lv := macd.macdl.GetValue(index) - _, sv := macd.signal.GetValue(index) - - x, _ = macd.InnerSeries.GetValue(index) - y = lv - sv - - return -} - -func (macd *MACDSeries) ensureChildSeries() { - w1, w2, sig := macd.GetPeriods() - - macd.signal = &MACDSignalSeries{ - InnerSeries: macd.InnerSeries, - PrimaryPeriod: w1, - SecondaryPeriod: w2, - SignalPeriod: sig, - } - - macd.macdl = &MACDLineSeries{ - InnerSeries: macd.InnerSeries, - PrimaryPeriod: w1, - SecondaryPeriod: w2, - } -} - -// MACDSignalSeries computes the EMA of the MACDLineSeries. -type MACDSignalSeries struct { - Name string - Style Style - YAxis YAxisType - InnerSeries ValueProvider - - PrimaryPeriod int - SecondaryPeriod int - SignalPeriod int - - signal *EMASeries -} - -// GetPeriods returns the primary and secondary periods. -func (macds MACDSignalSeries) GetPeriods() (w1, w2, sig int) { - if macds.PrimaryPeriod == 0 { - w1 = DefaultMACDPeriodPrimary - } else { - w1 = macds.PrimaryPeriod - } - if macds.SecondaryPeriod == 0 { - w2 = DefaultMACDPeriodSecondary - } else { - w2 = macds.SecondaryPeriod - } - if macds.SignalPeriod == 0 { - sig = DefaultMACDSignalPeriod - } else { - sig = macds.SignalPeriod - } - return -} - -// GetName returns the name of the time series. -func (macds MACDSignalSeries) GetName() string { - return macds.Name -} - -// GetStyle returns the line style. -func (macds MACDSignalSeries) GetStyle() Style { - return macds.Style -} - -// GetYAxis returns which YAxis the series draws on. -func (macds MACDSignalSeries) GetYAxis() YAxisType { - return macds.YAxis -} - -// Len returns the number of elements in the series. -func (macds *MACDSignalSeries) Len() int { - if macds.InnerSeries == nil { - return 0 - } - - return macds.InnerSeries.Len() -} - -// GetValue gets a value at a given index. For MACD it is the signal value. -func (macds *MACDSignalSeries) GetValue(index int) (x float64, y float64) { - if macds.InnerSeries == nil { - return - } - - if macds.signal == nil { - macds.ensureSignal() - } - x, _ = macds.InnerSeries.GetValue(index) - _, y = macds.signal.GetValue(index) - return -} - -func (macds *MACDSignalSeries) ensureSignal() { - w1, w2, sig := macds.GetPeriods() - - macds.signal = &EMASeries{ - InnerSeries: &MACDLineSeries{ - InnerSeries: macds.InnerSeries, - PrimaryPeriod: w1, - SecondaryPeriod: w2, - }, - Period: sig, - } -} - -// Render renders the series. -func (macds *MACDSignalSeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - style := macds.Style.InheritFrom(defaults) - Draw.LineSeries(r, canvasBox, xrange, yrange, style, macds) -} - -// MACDLineSeries is a series that computes the inner ema1-ema2 value as a series. -type MACDLineSeries struct { - Name string - Style Style - YAxis YAxisType - InnerSeries ValueProvider - - PrimaryPeriod int - SecondaryPeriod int - - ema1 *EMASeries - ema2 *EMASeries - - Sigma float64 -} - -// GetName returns the name of the time series. -func (macdl MACDLineSeries) GetName() string { - return macdl.Name -} - -// GetStyle returns the line style. -func (macdl MACDLineSeries) GetStyle() Style { - return macdl.Style -} - -// GetYAxis returns which YAxis the series draws on. -func (macdl MACDLineSeries) GetYAxis() YAxisType { - return macdl.YAxis -} - -// GetPeriods returns the primary and secondary periods. -func (macdl MACDLineSeries) GetPeriods() (w1, w2 int) { - if macdl.PrimaryPeriod == 0 { - w1 = DefaultMACDPeriodPrimary - } else { - w1 = macdl.PrimaryPeriod - } - if macdl.SecondaryPeriod == 0 { - w2 = DefaultMACDPeriodSecondary - } else { - w2 = macdl.SecondaryPeriod - } - return -} - -// Len returns the number of elements in the series. -func (macdl *MACDLineSeries) Len() int { - if macdl.InnerSeries == nil { - return 0 - } - - return macdl.InnerSeries.Len() -} - -// GetValue gets a value at a given index. For MACD it is the signal value. -func (macdl *MACDLineSeries) GetValue(index int) (x float64, y float64) { - if macdl.InnerSeries == nil { - return - } - if macdl.ema1 == nil && macdl.ema2 == nil { - macdl.ensureEMASeries() - } - - x, _ = macdl.InnerSeries.GetValue(index) - - _, emav1 := macdl.ema1.GetValue(index) - _, emav2 := macdl.ema2.GetValue(index) - - y = emav2 - emav1 - return -} - -func (macdl *MACDLineSeries) ensureEMASeries() { - w1, w2 := macdl.GetPeriods() - - macdl.ema1 = &EMASeries{ - InnerSeries: macdl.InnerSeries, - Period: w1, - } - macdl.ema2 = &EMASeries{ - InnerSeries: macdl.InnerSeries, - Period: w2, - } -} - -// Render renders the series. -func (macdl *MACDLineSeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - style := macdl.Style.InheritFrom(defaults) - Draw.LineSeries(r, canvasBox, xrange, yrange, style, macdl) -} diff --git a/vendor/github.com/wcharczuk/go-chart/macd_series_test.go b/vendor/github.com/wcharczuk/go-chart/macd_series_test.go deleted file mode 100644 index f6f6a31..0000000 --- a/vendor/github.com/wcharczuk/go-chart/macd_series_test.go +++ /dev/null @@ -1,88 +0,0 @@ -package chart - -import ( - "fmt" - "testing" - - "github.com/blendlabs/go-assert" -) - -var ( - macdExpected = []float64{ - 0, - 0.06381766382, - 0.1641441222, - 0.2817201894, - 0.4033023481, - 0.3924673744, - 0.2983093823, - 0.1561821464, - -0.008916708129, - -0.05210332292, - -0.01649503993, - 0.06667130899, - 0.1751344574, - 0.1657328378, - 0.08257097469, - -0.04265109369, - -0.1875741257, - -0.2091853882, - -0.1518975486, - -0.04781419838, - 0.08025242841, - 0.08881960494, - 0.02183529775, - -0.08904155476, - -0.2214141128, - -0.2321805992, - -0.1656331722, - -0.05373789678, - 0.08083727586, - 0.09475354363, - 0.03209767112, - -0.07534076818, - -0.2050442354, - -0.2138010557, - -0.1458045181, - -0.03293263556, - 0.1022243734, - 0.1163957964, - 0.05372761902, - -0.05393941791, - -0.1840438454, - -0.1933365048, - -0.1259788988, - -0.01382225715, - 0.1205656194, - 0.1339326478, - 0.07044017167, - -0.03805851969, - -0.1689918111, - -0.1791024416, - } -) - -func TestMACDSeries(t *testing.T) { - assert := assert.New(t) - - mockSeries := mockValueProvider{ - emaXValues, - emaYValues, - } - assert.Equal(50, mockSeries.Len()) - - mas := &MACDSeries{ - InnerSeries: mockSeries, - } - - var yvalues []float64 - for x := 0; x < mas.Len(); x++ { - _, y := mas.GetValue(x) - yvalues = append(yvalues, y) - } - - assert.NotEmpty(yvalues) - for index, vy := range yvalues { - assert.InDelta(vy, macdExpected[index], emaDelta, fmt.Sprintf("delta @ %d actual: %0.9f expected: %0.9f", index, vy, macdExpected[index])) - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/market_hours_range.go b/vendor/github.com/wcharczuk/go-chart/market_hours_range.go deleted file mode 100644 index 265cffa..0000000 --- a/vendor/github.com/wcharczuk/go-chart/market_hours_range.go +++ /dev/null @@ -1,181 +0,0 @@ -package chart - -import ( - "fmt" - "time" -) - -// MarketHoursRange is a special type of range that compresses a time range into just the -// market (i.e. NYSE operating hours and days) range. -type MarketHoursRange struct { - Min time.Time - Max time.Time - - MarketOpen time.Time - MarketClose time.Time - - HolidayProvider HolidayProvider - - ValueFormatter ValueFormatter - - Domain int -} - -// GetTimezone returns the timezone for the market hours range. -func (mhr MarketHoursRange) GetTimezone() *time.Location { - return mhr.GetMarketOpen().Location() -} - -// IsZero returns if the range is setup or not. -func (mhr MarketHoursRange) IsZero() bool { - return mhr.Min.IsZero() && mhr.Max.IsZero() -} - -// GetMin returns the min value. -func (mhr MarketHoursRange) GetMin() float64 { - return Time.ToFloat64(mhr.Min) -} - -// GetMax returns the max value. -func (mhr MarketHoursRange) GetMax() float64 { - return Time.ToFloat64(mhr.GetEffectiveMax()) -} - -// GetEffectiveMax gets either the close on the max, or the max itself. -func (mhr MarketHoursRange) GetEffectiveMax() time.Time { - maxClose := Date.On(mhr.MarketClose, mhr.Max) - if maxClose.After(mhr.Max) { - return maxClose - } - return mhr.Max -} - -// SetMin sets the min value. -func (mhr *MarketHoursRange) SetMin(min float64) { - mhr.Min = Time.FromFloat64(min) - mhr.Min = mhr.Min.In(mhr.GetTimezone()) -} - -// SetMax sets the max value. -func (mhr *MarketHoursRange) SetMax(max float64) { - mhr.Max = Time.FromFloat64(max) - mhr.Max = mhr.Max.In(mhr.GetTimezone()) -} - -// GetDelta gets the delta. -func (mhr MarketHoursRange) GetDelta() float64 { - min := mhr.GetMin() - max := mhr.GetMax() - return max - min -} - -// GetDomain gets the domain. -func (mhr MarketHoursRange) GetDomain() int { - return mhr.Domain -} - -// SetDomain sets the domain. -func (mhr *MarketHoursRange) SetDomain(domain int) { - mhr.Domain = domain -} - -// GetHolidayProvider coalesces a userprovided holiday provider and the date.DefaultHolidayProvider. -func (mhr MarketHoursRange) GetHolidayProvider() HolidayProvider { - if mhr.HolidayProvider == nil { - return defaultHolidayProvider - } - return mhr.HolidayProvider -} - -// GetMarketOpen returns the market open time. -func (mhr MarketHoursRange) GetMarketOpen() time.Time { - if mhr.MarketOpen.IsZero() { - return NYSEOpen - } - return mhr.MarketOpen -} - -// GetMarketClose returns the market close time. -func (mhr MarketHoursRange) GetMarketClose() time.Time { - if mhr.MarketClose.IsZero() { - return NYSEClose - } - return mhr.MarketClose -} - -// GetTicks returns the ticks for the range. -// This is to override the default continous ticks that would be generated for the range. -func (mhr *MarketHoursRange) GetTicks(r Renderer, defaults Style, vf ValueFormatter) []Tick { - times := Sequence.MarketHours(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) - timesWidth := mhr.measureTimes(r, defaults, vf, times) - if timesWidth <= mhr.Domain { - return mhr.makeTicks(vf, times) - } - - times = Sequence.MarketHourQuarters(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) - timesWidth = mhr.measureTimes(r, defaults, vf, times) - if timesWidth <= mhr.Domain { - return mhr.makeTicks(vf, times) - } - - times = Sequence.MarketDayCloses(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) - timesWidth = mhr.measureTimes(r, defaults, vf, times) - if timesWidth <= mhr.Domain { - return mhr.makeTicks(vf, times) - } - - times = Sequence.MarketDayAlternateCloses(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) - timesWidth = mhr.measureTimes(r, defaults, vf, times) - if timesWidth <= mhr.Domain { - return mhr.makeTicks(vf, times) - } - - times = Sequence.MarketDayMondayCloses(mhr.Min, mhr.Max, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.GetHolidayProvider()) - timesWidth = mhr.measureTimes(r, defaults, vf, times) - if timesWidth <= mhr.Domain { - return mhr.makeTicks(vf, times) - } - - return GenerateContinuousTicks(r, mhr, false, defaults, vf) - -} - -func (mhr *MarketHoursRange) measureTimes(r Renderer, defaults Style, vf ValueFormatter, times []time.Time) int { - defaults.GetTextOptions().WriteToRenderer(r) - var total int - for index, t := range times { - timeLabel := vf(t) - - labelBox := r.MeasureText(timeLabel) - total += labelBox.Width() - if index > 0 { - total += DefaultMinimumTickHorizontalSpacing - } - } - return total -} - -func (mhr *MarketHoursRange) makeTicks(vf ValueFormatter, times []time.Time) []Tick { - ticks := make([]Tick, len(times)) - for index, t := range times { - ticks[index] = Tick{ - Value: Time.ToFloat64(t), - Label: vf(t), - } - } - return ticks -} - -func (mhr MarketHoursRange) String() string { - return fmt.Sprintf("MarketHoursRange [%s, %s] => %d", mhr.Min.Format(time.RFC3339), mhr.Max.Format(time.RFC3339), mhr.Domain) -} - -// Translate maps a given value into the ContinuousRange space. -func (mhr MarketHoursRange) Translate(value float64) int { - valueTime := Time.FromFloat64(value) - valueTimeEastern := valueTime.In(Date.Eastern()) - totalSeconds := Date.CalculateMarketSecondsBetween(mhr.Min, mhr.GetEffectiveMax(), mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.HolidayProvider) - valueDelta := Date.CalculateMarketSecondsBetween(mhr.Min, valueTimeEastern, mhr.GetMarketOpen(), mhr.GetMarketClose(), mhr.HolidayProvider) - translated := int((float64(valueDelta) / float64(totalSeconds)) * float64(mhr.Domain)) - return translated -} diff --git a/vendor/github.com/wcharczuk/go-chart/market_hours_range_test.go b/vendor/github.com/wcharczuk/go-chart/market_hours_range_test.go deleted file mode 100644 index 45458c4..0000000 --- a/vendor/github.com/wcharczuk/go-chart/market_hours_range_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package chart - -import ( - "testing" - "time" - - assert "github.com/blendlabs/go-assert" -) - -func TestMarketHoursRangeGetDelta(t *testing.T) { - assert := assert.New(t) - - r := &MarketHoursRange{ - Min: time.Date(2016, 07, 19, 9, 30, 0, 0, Date.Eastern()), - Max: time.Date(2016, 07, 22, 16, 00, 0, 0, Date.Eastern()), - MarketOpen: NYSEOpen, - MarketClose: NYSEClose, - HolidayProvider: Date.IsNYSEHoliday, - } - - assert.NotZero(r.GetDelta()) -} - -func TestMarketHoursRangeTranslate(t *testing.T) { - assert := assert.New(t) - - r := &MarketHoursRange{ - Min: time.Date(2016, 07, 18, 9, 30, 0, 0, Date.Eastern()), - Max: time.Date(2016, 07, 22, 16, 00, 0, 0, Date.Eastern()), - MarketOpen: NYSEOpen, - MarketClose: NYSEClose, - HolidayProvider: Date.IsNYSEHoliday, - Domain: 1000, - } - - weds := time.Date(2016, 07, 20, 9, 30, 0, 0, Date.Eastern()) - - assert.Equal(0, r.Translate(Time.ToFloat64(r.Min))) - assert.Equal(400, r.Translate(Time.ToFloat64(weds))) - assert.Equal(1000, r.Translate(Time.ToFloat64(r.Max))) -} - -func TestMarketHoursRangeGetTicks(t *testing.T) { - assert := assert.New(t) - - r, err := PNG(1024, 1024) - assert.Nil(err) - - f, err := GetDefaultFont() - assert.Nil(err) - - defaults := Style{ - Font: f, - FontSize: 10, - FontColor: ColorBlack, - } - - ra := &MarketHoursRange{ - Min: Date.On(NYSEOpen, Date.Date(2016, 07, 18, Date.Eastern())), - Max: Date.On(NYSEClose, Date.Date(2016, 07, 22, Date.Eastern())), - MarketOpen: NYSEOpen, - MarketClose: NYSEClose, - HolidayProvider: Date.IsNYSEHoliday, - Domain: 1024, - } - - ticks := ra.GetTicks(r, defaults, TimeValueFormatter) - assert.NotEmpty(ticks) - assert.Len(ticks, 5) - assert.NotEqual(Time.ToFloat64(ra.Min), ticks[0].Value) - assert.NotEmpty(ticks[0].Label) -} diff --git a/vendor/github.com/wcharczuk/go-chart/math_util.go b/vendor/github.com/wcharczuk/go-chart/math_util.go deleted file mode 100644 index 8c3f5da..0000000 --- a/vendor/github.com/wcharczuk/go-chart/math_util.go +++ /dev/null @@ -1,231 +0,0 @@ -package chart - -import ( - "math" - "time" -) - -const ( - _pi = math.Pi - _2pi = 2 * math.Pi - _3pi4 = (3 * math.Pi) / 4.0 - _4pi3 = (4 * math.Pi) / 3.0 - _3pi2 = (3 * math.Pi) / 2.0 - _5pi4 = (5 * math.Pi) / 4.0 - _7pi4 = (7 * math.Pi) / 4.0 - _pi2 = math.Pi / 2.0 - _pi4 = math.Pi / 4.0 - _d2r = (math.Pi / 180.0) - _r2d = (180.0 / math.Pi) -) - -var ( - // Math contains helper methods for common math operations. - Math = &mathUtil{} -) - -type mathUtil struct{} - -// MinAndMax returns both the min and max in one pass. -func (m mathUtil) MinAndMax(values ...float64) (min float64, max float64) { - if len(values) == 0 { - return - } - min = values[0] - max = values[0] - for _, v := range values { - if max < v { - max = v - } - if min > v { - min = v - } - } - return -} - -// MinAndMaxOfTime returns the min and max of a given set of times -// in one pass. -func (m mathUtil) MinAndMaxOfTime(values ...time.Time) (min time.Time, max time.Time) { - if len(values) == 0 { - return - } - - min = values[0] - max = values[0] - - for _, v := range values { - if max.Before(v) { - max = v - } - if min.After(v) { - min = v - } - } - return -} - -// GetRoundToForDelta returns a `roundTo` value for a given delta. -func (m mathUtil) GetRoundToForDelta(delta float64) float64 { - startingDeltaBound := math.Pow(10.0, 10.0) - for cursor := startingDeltaBound; cursor > 0; cursor /= 10.0 { - if delta > cursor { - return cursor / 10.0 - } - } - - return 0.0 -} - -// RoundUp rounds up to a given roundTo value. -func (m mathUtil) RoundUp(value, roundTo float64) float64 { - d1 := math.Ceil(value / roundTo) - return d1 * roundTo -} - -// RoundDown rounds down to a given roundTo value. -func (m mathUtil) RoundDown(value, roundTo float64) float64 { - d1 := math.Floor(value / roundTo) - return d1 * roundTo -} - -// Normalize returns a set of numbers on the interval [0,1] for a given set of inputs. -// An example: 4,3,2,1 => 0.4, 0.3, 0.2, 0.1 -// Caveat; the total may be < 1.0; there are going to be issues with irrational numbers etc. -func (m mathUtil) Normalize(values ...float64) []float64 { - var total float64 - for _, v := range values { - total += v - } - output := make([]float64, len(values)) - for x, v := range values { - output[x] = m.RoundDown(v/total, 0.0001) - } - return output -} - -// MinInt returns the minimum of a set of integers. -func (m mathUtil) MinInt(values ...int) int { - min := math.MaxInt32 - for _, v := range values { - if v < min { - min = v - } - } - return min -} - -// MaxInt returns the maximum of a set of integers. -func (m mathUtil) MaxInt(values ...int) int { - max := math.MinInt32 - for _, v := range values { - if v > max { - max = v - } - } - return max -} - -// AbsInt returns the absolute value of an integer. -func (m mathUtil) AbsInt(value int) int { - if value < 0 { - return -value - } - return value -} - -// Mean returns the mean of a set of values -func (m mathUtil) Mean(values ...float64) float64 { - return m.Sum(values...) / float64(len(values)) -} - -// MeanInt returns the mean of a set of integer values. -func (m mathUtil) MeanInt(values ...int) int { - return m.SumInt(values...) / len(values) -} - -// Sum sums a set of values. -func (m mathUtil) Sum(values ...float64) float64 { - var total float64 - for _, v := range values { - total += v - } - return total -} - -// SumInt sums a set of values. -func (m mathUtil) SumInt(values ...int) int { - var total int - for _, v := range values { - total += v - } - return total -} - -// PercentDifference computes the percentage difference between two values. -// The formula is (v2-v1)/v1. -func (m mathUtil) PercentDifference(v1, v2 float64) float64 { - if v1 == 0 { - return 0 - } - return (v2 - v1) / v1 -} - -// DegreesToRadians returns degrees as radians. -func (m mathUtil) DegreesToRadians(degrees float64) float64 { - return degrees * _d2r -} - -// RadiansToDegrees translates a radian value to a degree value. -func (m mathUtil) RadiansToDegrees(value float64) float64 { - return math.Mod(value, _2pi) * _r2d -} - -// PercentToRadians converts a normalized value (0,1) to radians. -func (m mathUtil) PercentToRadians(pct float64) float64 { - return m.DegreesToRadians(360.0 * pct) -} - -// RadianAdd adds a delta to a base in radians. -func (m mathUtil) RadianAdd(base, delta float64) float64 { - value := base + delta - if value > _2pi { - return math.Mod(value, _2pi) - } else if value < 0 { - return math.Mod(_2pi+value, _2pi) - } - return value -} - -// DegreesAdd adds a delta to a base in radians. -func (m mathUtil) DegreesAdd(baseDegrees, deltaDegrees float64) float64 { - value := baseDegrees + deltaDegrees - if value > _2pi { - return math.Mod(value, 360.0) - } else if value < 0 { - return math.Mod(360.0+value, 360.0) - } - return value -} - -// DegreesToCompass returns the degree value in compass / clock orientation. -func (m mathUtil) DegreesToCompass(deg float64) float64 { - return m.DegreesAdd(deg, -90.0) -} - -// CirclePoint returns the absolute position of a circle diameter point given -// by the radius and the theta. -func (m mathUtil) CirclePoint(cx, cy int, radius, thetaRadians float64) (x, y int) { - x = cx + int(radius*math.Sin(thetaRadians)) - y = cy - int(radius*math.Cos(thetaRadians)) - return -} - -func (m mathUtil) RotateCoordinate(cx, cy, x, y int, thetaRadians float64) (rx, ry int) { - tempX, tempY := float64(x-cx), float64(y-cy) - rotatedX := tempX*math.Cos(thetaRadians) - tempY*math.Sin(thetaRadians) - rotatedY := tempX*math.Sin(thetaRadians) + tempY*math.Cos(thetaRadians) - rx = int(rotatedX) + cx - ry = int(rotatedY) + cy - return -} diff --git a/vendor/github.com/wcharczuk/go-chart/math_util_test.go b/vendor/github.com/wcharczuk/go-chart/math_util_test.go deleted file mode 100644 index c629af4..0000000 --- a/vendor/github.com/wcharczuk/go-chart/math_util_test.go +++ /dev/null @@ -1,184 +0,0 @@ -package chart - -import ( - "testing" - "time" - - "github.com/blendlabs/go-assert" -) - -func TestMinAndMax(t *testing.T) { - assert := assert.New(t) - values := []float64{1.0, 2.0, 3.0, 4.0} - min, max := Math.MinAndMax(values...) - assert.Equal(1.0, min) - assert.Equal(4.0, max) -} - -func TestMinAndMaxReversed(t *testing.T) { - assert := assert.New(t) - values := []float64{4.0, 2.0, 3.0, 1.0} - min, max := Math.MinAndMax(values...) - assert.Equal(1.0, min) - assert.Equal(4.0, max) -} - -func TestMinAndMaxEmpty(t *testing.T) { - assert := assert.New(t) - values := []float64{} - min, max := Math.MinAndMax(values...) - assert.Equal(0.0, min) - assert.Equal(0.0, max) -} - -func TestMinAndMaxOfTime(t *testing.T) { - assert := assert.New(t) - values := []time.Time{ - time.Now().AddDate(0, 0, -1), - time.Now().AddDate(0, 0, -2), - time.Now().AddDate(0, 0, -3), - time.Now().AddDate(0, 0, -4), - } - min, max := Math.MinAndMaxOfTime(values...) - assert.Equal(values[3], min) - assert.Equal(values[0], max) -} - -func TestMinAndMaxOfTimeReversed(t *testing.T) { - assert := assert.New(t) - values := []time.Time{ - time.Now().AddDate(0, 0, -4), - time.Now().AddDate(0, 0, -2), - time.Now().AddDate(0, 0, -3), - time.Now().AddDate(0, 0, -1), - } - min, max := Math.MinAndMaxOfTime(values...) - assert.Equal(values[0], min) - assert.Equal(values[3], max) -} - -func TestMinAndMaxOfTimeEmpty(t *testing.T) { - assert := assert.New(t) - values := []time.Time{} - min, max := Math.MinAndMaxOfTime(values...) - assert.Equal(time.Time{}, min) - assert.Equal(time.Time{}, max) -} - -func TestGetRoundToForDelta(t *testing.T) { - assert := assert.New(t) - - assert.Equal(100.0, Math.GetRoundToForDelta(1001.00)) - assert.Equal(10.0, Math.GetRoundToForDelta(101.00)) - assert.Equal(1.0, Math.GetRoundToForDelta(11.00)) -} - -func TestRoundUp(t *testing.T) { - assert := assert.New(t) - assert.Equal(0.5, Math.RoundUp(0.49, 0.1)) - assert.Equal(1.0, Math.RoundUp(0.51, 1.0)) - assert.Equal(0.4999, Math.RoundUp(0.49988, 0.0001)) -} - -func TestRoundDown(t *testing.T) { - assert := assert.New(t) - assert.Equal(0.5, Math.RoundDown(0.51, 0.1)) - assert.Equal(1.0, Math.RoundDown(1.01, 1.0)) - assert.Equal(0.5001, Math.RoundDown(0.50011, 0.0001)) -} - -func TestPercentDifference(t *testing.T) { - assert := assert.New(t) - - assert.Equal(0.5, Math.PercentDifference(1.0, 1.5)) - assert.Equal(-0.5, Math.PercentDifference(2.0, 1.0)) -} - -func TestNormalize(t *testing.T) { - assert := assert.New(t) - - values := []float64{10, 9, 8, 7, 6} - normalized := Math.Normalize(values...) - assert.Len(normalized, 5) - assert.Equal(0.25, normalized[0]) - assert.Equal(0.1499, normalized[4]) -} - -var ( - _degreesToRadians = map[float64]float64{ - 0: 0, // !_2pi b/c no irrational nums in floats. - 45: _pi4, - 90: _pi2, - 135: _3pi4, - 180: _pi, - 225: _5pi4, - 270: _3pi2, - 315: _7pi4, - } - - _compassToRadians = map[float64]float64{ - 0: _pi2, - 45: _pi4, - 90: 0, // !_2pi b/c no irrational nums in floats. - 135: _7pi4, - 180: _3pi2, - 225: _5pi4, - 270: _pi, - 315: _3pi4, - } -) - -func TestDegreesToRadians(t *testing.T) { - assert := assert.New(t) - - for d, r := range _degreesToRadians { - assert.Equal(r, Math.DegreesToRadians(d)) - } -} - -func TestPercentToRadians(t *testing.T) { - assert := assert.New(t) - - for d, r := range _degreesToRadians { - assert.Equal(r, Math.PercentToRadians(d/360.0)) - } -} - -func TestRadiansToDegrees(t *testing.T) { - assert := assert.New(t) - - for d, r := range _degreesToRadians { - assert.Equal(d, Math.RadiansToDegrees(r)) - } -} - -func TestRadianAdd(t *testing.T) { - assert := assert.New(t) - - assert.Equal(_pi, Math.RadianAdd(_pi2, _pi2)) - assert.Equal(_3pi2, Math.RadianAdd(_pi2, _pi)) - assert.Equal(_pi, Math.RadianAdd(_pi, _2pi)) - assert.Equal(_pi, Math.RadianAdd(_pi, -_2pi)) -} - -func TestRotateCoordinate90(t *testing.T) { - assert := assert.New(t) - - cx, cy := 10, 10 - x, y := 5, 10 - - rx, ry := Math.RotateCoordinate(cx, cy, x, y, Math.DegreesToRadians(90)) - assert.Equal(10, rx) - assert.Equal(5, ry) -} - -func TestRotateCoordinate45(t *testing.T) { - assert := assert.New(t) - - cx, cy := 10, 10 - x, y := 5, 10 - - rx, ry := Math.RotateCoordinate(cx, cy, x, y, Math.DegreesToRadians(45)) - assert.Equal(7, rx) - assert.Equal(7, ry) -} diff --git a/vendor/github.com/wcharczuk/go-chart/min_max_series.go b/vendor/github.com/wcharczuk/go-chart/min_max_series.go deleted file mode 100644 index 4900c6d..0000000 --- a/vendor/github.com/wcharczuk/go-chart/min_max_series.go +++ /dev/null @@ -1,119 +0,0 @@ -package chart - -import "math" - -// MinSeries draws a horizontal line at the minimum value of the inner series. -type MinSeries struct { - Name string - Style Style - YAxis YAxisType - InnerSeries ValueProvider - - minValue *float64 -} - -// GetName returns the name of the time series. -func (ms MinSeries) GetName() string { - return ms.Name -} - -// GetStyle returns the line style. -func (ms MinSeries) GetStyle() Style { - return ms.Style -} - -// GetYAxis returns which YAxis the series draws on. -func (ms MinSeries) GetYAxis() YAxisType { - return ms.YAxis -} - -// Len returns the number of elements in the series. -func (ms MinSeries) Len() int { - return ms.InnerSeries.Len() -} - -// GetValue gets a value at a given index. -func (ms *MinSeries) GetValue(index int) (x, y float64) { - ms.ensureMinValue() - x, _ = ms.InnerSeries.GetValue(index) - y = *ms.minValue - return -} - -// Render renders the series. -func (ms *MinSeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - style := ms.Style.InheritFrom(defaults) - Draw.LineSeries(r, canvasBox, xrange, yrange, style, ms) -} - -func (ms *MinSeries) ensureMinValue() { - if ms.minValue == nil { - minValue := math.MaxFloat64 - var y float64 - for x := 0; x < ms.InnerSeries.Len(); x++ { - _, y = ms.InnerSeries.GetValue(x) - if y < minValue { - minValue = y - } - } - ms.minValue = &minValue - } -} - -// MaxSeries draws a horizontal line at the maximum value of the inner series. -type MaxSeries struct { - Name string - Style Style - YAxis YAxisType - InnerSeries ValueProvider - - maxValue *float64 -} - -// GetName returns the name of the time series. -func (ms MaxSeries) GetName() string { - return ms.Name -} - -// GetStyle returns the line style. -func (ms MaxSeries) GetStyle() Style { - return ms.Style -} - -// GetYAxis returns which YAxis the series draws on. -func (ms MaxSeries) GetYAxis() YAxisType { - return ms.YAxis -} - -// Len returns the number of elements in the series. -func (ms MaxSeries) Len() int { - return ms.InnerSeries.Len() -} - -// GetValue gets a value at a given index. -func (ms *MaxSeries) GetValue(index int) (x, y float64) { - ms.ensureMaxValue() - x, _ = ms.InnerSeries.GetValue(index) - y = *ms.maxValue - return -} - -// Render renders the series. -func (ms *MaxSeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - style := ms.Style.InheritFrom(defaults) - Draw.LineSeries(r, canvasBox, xrange, yrange, style, ms) -} - -func (ms *MaxSeries) ensureMaxValue() { - if ms.maxValue == nil { - maxValue := -math.MaxFloat64 - var y float64 - for x := 0; x < ms.InnerSeries.Len(); x++ { - _, y = ms.InnerSeries.GetValue(x) - if y > maxValue { - maxValue = y - } - } - ms.maxValue = &maxValue - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/pie_chart.go b/vendor/github.com/wcharczuk/go-chart/pie_chart.go deleted file mode 100644 index 720f61d..0000000 --- a/vendor/github.com/wcharczuk/go-chart/pie_chart.go +++ /dev/null @@ -1,279 +0,0 @@ -package chart - -import ( - "errors" - "io" - - "github.com/golang/freetype/truetype" -) - -// PieChart is a chart that draws sections of a circle based on percentages. -type PieChart struct { - Title string - TitleStyle Style - - Width int - Height int - DPI float64 - - Background Style - Canvas Style - SliceStyle Style - - Font *truetype.Font - defaultFont *truetype.Font - - Values []Value - Elements []Renderable -} - -// GetDPI returns the dpi for the chart. -func (pc PieChart) GetDPI(defaults ...float64) float64 { - if pc.DPI == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return DefaultDPI - } - return pc.DPI -} - -// GetFont returns the text font. -func (pc PieChart) GetFont() *truetype.Font { - if pc.Font == nil { - return pc.defaultFont - } - return pc.Font -} - -// GetWidth returns the chart width or the default value. -func (pc PieChart) GetWidth() int { - if pc.Width == 0 { - return DefaultChartWidth - } - return pc.Width -} - -// GetHeight returns the chart height or the default value. -func (pc PieChart) GetHeight() int { - if pc.Height == 0 { - return DefaultChartWidth - } - return pc.Height -} - -// Render renders the chart with the given renderer to the given io.Writer. -func (pc PieChart) Render(rp RendererProvider, w io.Writer) error { - if len(pc.Values) == 0 { - return errors.New("Please provide at least one value.") - } - - r, err := rp(pc.GetWidth(), pc.GetHeight()) - if err != nil { - return err - } - - if pc.Font == nil { - defaultFont, err := GetDefaultFont() - if err != nil { - return err - } - pc.defaultFont = defaultFont - } - r.SetDPI(pc.GetDPI(DefaultDPI)) - - canvasBox := pc.getDefaultCanvasBox() - canvasBox = pc.getCircleAdjustedCanvasBox(canvasBox) - - pc.drawBackground(r) - pc.drawCanvas(r, canvasBox) - - finalValues := pc.finalizeValues(pc.Values) - pc.drawSlices(r, canvasBox, finalValues) - pc.drawTitle(r) - for _, a := range pc.Elements { - a(r, canvasBox, pc.styleDefaultsElements()) - } - - return r.Save(w) -} - -func (pc PieChart) drawBackground(r Renderer) { - Draw.Box(r, Box{ - Right: pc.GetWidth(), - Bottom: pc.GetHeight(), - }, pc.getBackgroundStyle()) -} - -func (pc PieChart) drawCanvas(r Renderer, canvasBox Box) { - Draw.Box(r, canvasBox, pc.getCanvasStyle()) -} - -func (pc PieChart) drawTitle(r Renderer) { - if len(pc.Title) > 0 && pc.TitleStyle.Show { - Draw.TextWithin(r, pc.Title, pc.Box(), pc.styleDefaultsTitle()) - } -} - -func (pc PieChart) drawSlices(r Renderer, canvasBox Box, values []Value) { - cx, cy := canvasBox.Center() - diameter := Math.MinInt(canvasBox.Width(), canvasBox.Height()) - radius := float64(diameter >> 1) - labelRadius := (radius * 2.0) / 3.0 - - // draw the pie slices - var rads, delta, delta2, total float64 - var lx, ly int - for index, v := range values { - v.Style.InheritFrom(pc.stylePieChartValue(index)).WriteToRenderer(r) - - r.MoveTo(cx, cy) - rads = Math.PercentToRadians(total) - delta = Math.PercentToRadians(v.Value) - - r.ArcTo(cx, cy, radius, radius, rads, delta) - - r.LineTo(cx, cy) - r.Close() - r.FillStroke() - total = total + v.Value - } - - // draw the labels - total = 0 - for index, v := range values { - v.Style.InheritFrom(pc.stylePieChartValue(index)).WriteToRenderer(r) - if len(v.Label) > 0 { - delta2 = Math.PercentToRadians(total + (v.Value / 2.0)) - delta2 = Math.RadianAdd(delta2, _pi2) - lx, ly = Math.CirclePoint(cx, cy, labelRadius, delta2) - - tb := r.MeasureText(v.Label) - lx = lx - (tb.Width() >> 1) - ly = ly + (tb.Height() >> 1) - - r.Text(v.Label, lx, ly) - } - total = total + v.Value - } -} - -func (pc PieChart) finalizeValues(values []Value) []Value { - return Values(values).Normalize() -} - -func (pc PieChart) getDefaultCanvasBox() Box { - return pc.Box() -} - -func (pc PieChart) getCircleAdjustedCanvasBox(canvasBox Box) Box { - circleDiameter := Math.MinInt(canvasBox.Width(), canvasBox.Height()) - - square := Box{ - Right: circleDiameter, - Bottom: circleDiameter, - } - - return canvasBox.Fit(square) -} - -func (pc PieChart) getBackgroundStyle() Style { - return pc.Background.InheritFrom(pc.styleDefaultsBackground()) -} - -func (pc PieChart) getCanvasStyle() Style { - return pc.Canvas.InheritFrom(pc.styleDefaultsCanvas()) -} - -func (pc PieChart) styleDefaultsCanvas() Style { - return Style{ - FillColor: DefaultCanvasColor, - StrokeColor: DefaultCanvasStrokeColor, - StrokeWidth: DefaultStrokeWidth, - } -} - -func (pc PieChart) styleDefaultsPieChartValue() Style { - return Style{ - StrokeColor: ColorWhite, - StrokeWidth: 5.0, - FillColor: ColorWhite, - } -} - -func (pc PieChart) stylePieChartValue(index int) Style { - return pc.SliceStyle.InheritFrom(Style{ - StrokeColor: ColorWhite, - StrokeWidth: 5.0, - FillColor: GetAlternateColor(index), - FontSize: pc.getScaledFontSize(), - FontColor: ColorWhite, - Font: pc.GetFont(), - }) -} - -func (pc PieChart) getScaledFontSize() float64 { - effectiveDimension := Math.MinInt(pc.GetWidth(), pc.GetHeight()) - if effectiveDimension >= 2048 { - return 48.0 - } else if effectiveDimension >= 1024 { - return 24.0 - } else if effectiveDimension > 512 { - return 18.0 - } else if effectiveDimension > 256 { - return 12.0 - } - return 10.0 -} - -func (pc PieChart) styleDefaultsBackground() Style { - return Style{ - FillColor: DefaultBackgroundColor, - StrokeColor: DefaultBackgroundStrokeColor, - StrokeWidth: DefaultStrokeWidth, - } -} - -func (pc PieChart) styleDefaultsElements() Style { - return Style{ - Font: pc.GetFont(), - } -} - -func (pc PieChart) styleDefaultsTitle() Style { - return pc.TitleStyle.InheritFrom(Style{ - FontColor: ColorWhite, - Font: pc.GetFont(), - FontSize: pc.getTitleFontSize(), - TextHorizontalAlign: TextHorizontalAlignCenter, - TextVerticalAlign: TextVerticalAlignTop, - TextWrap: TextWrapWord, - }) -} - -func (pc PieChart) getTitleFontSize() float64 { - effectiveDimension := Math.MinInt(pc.GetWidth(), pc.GetHeight()) - if effectiveDimension >= 2048 { - return 48 - } else if effectiveDimension >= 1024 { - return 24 - } else if effectiveDimension >= 512 { - return 18 - } else if effectiveDimension >= 256 { - return 12 - } - return 10 -} - -// Box returns the chart bounds as a box. -func (pc PieChart) Box() Box { - dpr := pc.Background.Padding.GetRight(DefaultBackgroundPadding.Right) - dpb := pc.Background.Padding.GetBottom(DefaultBackgroundPadding.Bottom) - - return Box{ - Top: pc.Background.Padding.GetTop(DefaultBackgroundPadding.Top), - Left: pc.Background.Padding.GetLeft(DefaultBackgroundPadding.Left), - Right: pc.GetWidth() - dpr, - Bottom: pc.GetHeight() - dpb, - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/pie_chart_test.go b/vendor/github.com/wcharczuk/go-chart/pie_chart_test.go deleted file mode 100644 index 2f536cd..0000000 --- a/vendor/github.com/wcharczuk/go-chart/pie_chart_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package chart - -import ( - "bytes" - "testing" - - assert "github.com/blendlabs/go-assert" -) - -func TestPieChart(t *testing.T) { - assert := assert.New(t) - - pie := PieChart{ - Canvas: Style{ - FillColor: ColorLightGray, - }, - Values: []Value{ - {Value: 10, Label: "Blue"}, - {Value: 9, Label: "Green"}, - {Value: 8, Label: "Gray"}, - {Value: 7, Label: "Orange"}, - {Value: 6, Label: "HEANG"}, - {Value: 5, Label: "??"}, - {Value: 2, Label: "!!"}, - }, - } - - b := bytes.NewBuffer([]byte{}) - pie.Render(PNG, b) - assert.NotZero(b.Len()) -} diff --git a/vendor/github.com/wcharczuk/go-chart/range.go b/vendor/github.com/wcharczuk/go-chart/range.go deleted file mode 100644 index 9cea1fb..0000000 --- a/vendor/github.com/wcharczuk/go-chart/range.go +++ /dev/null @@ -1,41 +0,0 @@ -package chart - -// NameProvider is a type that returns a name. -type NameProvider interface { - GetName() string -} - -// StyleProvider is a type that returns a style. -type StyleProvider interface { - GetStyle() Style -} - -// IsZeroable is a type that returns if it's been set or not. -type IsZeroable interface { - IsZero() bool -} - -// Stringable is a type that has a string representation. -type Stringable interface { - String() string -} - -// Range is a -type Range interface { - Stringable - IsZeroable - - GetMin() float64 - SetMin(min float64) - - GetMax() float64 - SetMax(max float64) - - GetDelta() float64 - - GetDomain() int - SetDomain(domain int) - - // Translate the range to the domain. - Translate(value float64) int -} diff --git a/vendor/github.com/wcharczuk/go-chart/raster_renderer.go b/vendor/github.com/wcharczuk/go-chart/raster_renderer.go deleted file mode 100644 index 326dcb5..0000000 --- a/vendor/github.com/wcharczuk/go-chart/raster_renderer.go +++ /dev/null @@ -1,228 +0,0 @@ -package chart - -import ( - "image" - "image/png" - "io" - "math" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/drawing" -) - -// PNG returns a new png/raster renderer. -func PNG(width, height int) (Renderer, error) { - i := image.NewRGBA(image.Rect(0, 0, width, height)) - gc, err := drawing.NewRasterGraphicContext(i) - if err == nil { - return &rasterRenderer{ - i: i, - gc: gc, - }, nil - } - return nil, err -} - -// rasterRenderer renders chart commands to a bitmap. -type rasterRenderer struct { - i *image.RGBA - gc *drawing.RasterGraphicContext - - rotateRadians *float64 - - s Style -} - -func (rr *rasterRenderer) ResetStyle() { - rr.s = Style{Font: rr.s.Font} - rr.ClearTextRotation() -} - -// GetDPI returns the dpi. -func (rr *rasterRenderer) GetDPI() float64 { - return rr.gc.GetDPI() -} - -// SetDPI implements the interface method. -func (rr *rasterRenderer) SetDPI(dpi float64) { - rr.gc.SetDPI(dpi) -} - -// SetStrokeColor implements the interface method. -func (rr *rasterRenderer) SetStrokeColor(c drawing.Color) { - rr.s.StrokeColor = c -} - -// SetLineWidth implements the interface method. -func (rr *rasterRenderer) SetStrokeWidth(width float64) { - rr.s.StrokeWidth = width -} - -// StrokeDashArray sets the stroke dash array. -func (rr *rasterRenderer) SetStrokeDashArray(dashArray []float64) { - rr.s.StrokeDashArray = dashArray -} - -// SetFillColor implements the interface method. -func (rr *rasterRenderer) SetFillColor(c drawing.Color) { - rr.s.FillColor = c -} - -// MoveTo implements the interface method. -func (rr *rasterRenderer) MoveTo(x, y int) { - rr.gc.MoveTo(float64(x), float64(y)) -} - -// LineTo implements the interface method. -func (rr *rasterRenderer) LineTo(x, y int) { - rr.gc.LineTo(float64(x), float64(y)) -} - -// QuadCurveTo implements the interface method. -func (rr *rasterRenderer) QuadCurveTo(cx, cy, x, y int) { - rr.gc.QuadCurveTo(float64(cx), float64(cy), float64(x), float64(y)) -} - -// ArcTo implements the interface method. -func (rr *rasterRenderer) ArcTo(cx, cy int, rx, ry, startAngle, delta float64) { - rr.gc.ArcTo(float64(cx), float64(cy), rx, ry, startAngle, delta) -} - -// Close implements the interface method. -func (rr *rasterRenderer) Close() { - rr.gc.Close() -} - -// Stroke implements the interface method. -func (rr *rasterRenderer) Stroke() { - rr.gc.SetStrokeColor(rr.s.StrokeColor) - rr.gc.SetLineWidth(rr.s.StrokeWidth) - rr.gc.SetLineDash(rr.s.StrokeDashArray, 0) - rr.gc.Stroke() -} - -// Fill implements the interface method. -func (rr *rasterRenderer) Fill() { - rr.gc.SetFillColor(rr.s.FillColor) - rr.gc.Fill() -} - -// FillStroke implements the interface method. -func (rr *rasterRenderer) FillStroke() { - rr.gc.SetFillColor(rr.s.FillColor) - rr.gc.SetStrokeColor(rr.s.StrokeColor) - rr.gc.SetLineWidth(rr.s.StrokeWidth) - rr.gc.SetLineDash(rr.s.StrokeDashArray, 0) - rr.gc.FillStroke() -} - -// Circle implements the interface method. -func (rr *rasterRenderer) Circle(radius float64, x, y int) { - xf := float64(x) - yf := float64(y) - rr.gc.MoveTo(xf-radius, yf) //9 - rr.gc.QuadCurveTo(xf, yf, xf, yf-radius) //12 - rr.gc.QuadCurveTo(xf, yf, xf+radius, yf) //3 - rr.gc.QuadCurveTo(xf, yf, xf, yf+radius) //6 - rr.gc.QuadCurveTo(xf, yf, xf-radius, yf) //9 - rr.gc.Close() - rr.gc.FillStroke() -} - -// SetFont implements the interface method. -func (rr *rasterRenderer) SetFont(f *truetype.Font) { - rr.s.Font = f -} - -// SetFontSize implements the interface method. -func (rr *rasterRenderer) SetFontSize(size float64) { - rr.s.FontSize = size -} - -// SetFontColor implements the interface method. -func (rr *rasterRenderer) SetFontColor(c drawing.Color) { - rr.s.FontColor = c -} - -// Text implements the interface method. -func (rr *rasterRenderer) Text(body string, x, y int) { - xf, yf := rr.getCoords(x, y) - rr.gc.SetFont(rr.s.Font) - rr.gc.SetFontSize(rr.s.FontSize) - rr.gc.SetFillColor(rr.s.FontColor) - rr.gc.CreateStringPath(body, float64(xf), float64(yf)) - rr.gc.Fill() -} - -// MeasureText returns the height and width in pixels of a string. -func (rr *rasterRenderer) MeasureText(body string) Box { - rr.gc.SetFont(rr.s.Font) - rr.gc.SetFontSize(rr.s.FontSize) - rr.gc.SetFillColor(rr.s.FontColor) - l, t, r, b, err := rr.gc.GetStringBounds(body) - if err != nil { - return Box{} - } - if l < 0 { - r = r - l // equivalent to r+(-1*l) - l = 0 - } - if t < 0 { - b = b - t - t = 0 - } - - if l > 0 { - r = r + l - l = 0 - } - - if t > 0 { - b = b + t - t = 0 - } - - textBox := Box{ - Top: int(math.Ceil(t)), - Left: int(math.Ceil(l)), - Right: int(math.Ceil(r)), - Bottom: int(math.Ceil(b)), - } - if rr.rotateRadians == nil { - return textBox - } - - return textBox.Corners().Rotate(Math.RadiansToDegrees(*rr.rotateRadians)).Box() -} - -// SetTextRotation sets a text rotation. -func (rr *rasterRenderer) SetTextRotation(radians float64) { - rr.rotateRadians = &radians -} - -func (rr *rasterRenderer) getCoords(x, y int) (xf, yf int) { - if rr.rotateRadians == nil { - xf = x - yf = y - return - } - - rr.gc.Translate(float64(x), float64(y)) - rr.gc.Rotate(*rr.rotateRadians) - return -} - -// ClearTextRotation clears text rotation. -func (rr *rasterRenderer) ClearTextRotation() { - rr.gc.SetMatrixTransform(drawing.NewIdentityMatrix()) - rr.rotateRadians = nil -} - -// Save implements the interface method. -func (rr *rasterRenderer) Save(w io.Writer) error { - if typed, isTyped := w.(RGBACollector); isTyped { - typed.SetRGBA(rr.i) - return nil - } - return png.Encode(w, rr.i) -} diff --git a/vendor/github.com/wcharczuk/go-chart/renderable.go b/vendor/github.com/wcharczuk/go-chart/renderable.go deleted file mode 100644 index 6efb3ad..0000000 --- a/vendor/github.com/wcharczuk/go-chart/renderable.go +++ /dev/null @@ -1,4 +0,0 @@ -package chart - -// Renderable is a function that can be called to render custom elements on the chart. -type Renderable func(r Renderer, canvasBox Box, defaults Style) diff --git a/vendor/github.com/wcharczuk/go-chart/renderer.go b/vendor/github.com/wcharczuk/go-chart/renderer.go deleted file mode 100644 index 7eb06bb..0000000 --- a/vendor/github.com/wcharczuk/go-chart/renderer.go +++ /dev/null @@ -1,86 +0,0 @@ -package chart - -import ( - "io" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/drawing" -) - -// Renderer represents the basic methods required to draw a chart. -type Renderer interface { - // ResetStyle should reset any style related settings on the renderer. - ResetStyle() - - // GetDPI gets the DPI for the renderer. - GetDPI() float64 - - // SetDPI sets the DPI for the renderer. - SetDPI(dpi float64) - - // SetStrokeColor sets the current stroke color. - SetStrokeColor(drawing.Color) - - // SetFillColor sets the current fill color. - SetFillColor(drawing.Color) - - // SetStrokeWidth sets the stroke width. - SetStrokeWidth(width float64) - - // SetStrokeDashArray sets the stroke dash array. - SetStrokeDashArray(dashArray []float64) - - // MoveTo moves the cursor to a given point. - MoveTo(x, y int) - - // LineTo both starts a shape and draws a line to a given point - // from the previous point. - LineTo(x, y int) - - // QuadCurveTo draws a quad curve. - // cx and cy represent the bezier "control points". - QuadCurveTo(cx, cy, x, y int) - - // ArcTo draws an arc with a given center (cx,cy) - // a given set of radii (rx,ry), a startAngle and delta (in radians). - ArcTo(cx, cy int, rx, ry, startAngle, delta float64) - - // Close finalizes a shape as drawn by LineTo. - Close() - - // Stroke strokes the path. - Stroke() - - // Fill fills the path, but does not stroke. - Fill() - - // FillStroke fills and strokes a path. - FillStroke() - - // Circle draws a circle at the given coords with a given radius. - Circle(radius float64, x, y int) - - // SetFont sets a font for a text field. - SetFont(*truetype.Font) - - // SetFontColor sets a font's color - SetFontColor(drawing.Color) - - // SetFontSize sets the font size for a text field. - SetFontSize(size float64) - - // Text draws a text blob. - Text(body string, x, y int) - - // MeasureText measures text. - MeasureText(body string) Box - - // SetTextRotatation sets a rotation for drawing elements. - SetTextRotation(radians float64) - - // ClearTextRotation clears rotation. - ClearTextRotation() - - // Save writes the image to the given writer. - Save(w io.Writer) error -} diff --git a/vendor/github.com/wcharczuk/go-chart/renderer_provider.go b/vendor/github.com/wcharczuk/go-chart/renderer_provider.go deleted file mode 100644 index be961a8..0000000 --- a/vendor/github.com/wcharczuk/go-chart/renderer_provider.go +++ /dev/null @@ -1,4 +0,0 @@ -package chart - -// RendererProvider is a function that returns a renderer. -type RendererProvider func(int, int) (Renderer, error) diff --git a/vendor/github.com/wcharczuk/go-chart/ring_buffer.go b/vendor/github.com/wcharczuk/go-chart/ring_buffer.go deleted file mode 100644 index 6fb4288..0000000 --- a/vendor/github.com/wcharczuk/go-chart/ring_buffer.go +++ /dev/null @@ -1,252 +0,0 @@ -package chart - -import ( - "fmt" - "math" - "strings" -) - -const ( - ringBufferMinimumGrow = 4 - ringBufferShrinkThreshold = 32 - ringBufferGrowFactor = 200 - ringBufferDefaultCapacity = 4 -) - -var ( - emptyArray = make([]interface{}, 0) -) - -// NewRingBuffer creates a new, empty, RingBuffer. -func NewRingBuffer() *RingBuffer { - return &RingBuffer{ - array: make([]interface{}, ringBufferDefaultCapacity), - head: 0, - tail: 0, - size: 0, - } -} - -// NewRingBufferWithCapacity creates a new RingBuffer pre-allocated with the given capacity. -func NewRingBufferWithCapacity(capacity int) *RingBuffer { - return &RingBuffer{ - array: make([]interface{}, capacity), - head: 0, - tail: 0, - size: 0, - } -} - -// NewRingBufferFromSlice createsa ring buffer out of a slice. -func NewRingBufferFromSlice(values []interface{}) *RingBuffer { - return &RingBuffer{ - array: values, - head: 0, - tail: len(values) - 1, - size: len(values), - } -} - -// RingBuffer is a fifo buffer that is backed by a pre-allocated array, instead of allocating -// a whole new node object for each element (which saves GC churn). -// Enqueue can be O(n), Dequeue can be O(1). -type RingBuffer struct { - array []interface{} - head int - tail int - size int -} - -// Len returns the length of the ring buffer (as it is currently populated). -// Actual memory footprint may be different. -func (rb *RingBuffer) Len() int { - return rb.size -} - -// TotalLen returns the total size of the ring bufffer, including empty elements. -func (rb *RingBuffer) TotalLen() int { - return len(rb.array) -} - -// Clear removes all objects from the RingBuffer. -func (rb *RingBuffer) Clear() { - if rb.head < rb.tail { - arrayClear(rb.array, rb.head, rb.size) - } else { - arrayClear(rb.array, rb.head, len(rb.array)-rb.head) - arrayClear(rb.array, 0, rb.tail) - } - - rb.head = 0 - rb.tail = 0 - rb.size = 0 -} - -// Enqueue adds an element to the "back" of the RingBuffer. -func (rb *RingBuffer) Enqueue(object interface{}) { - if rb.size == len(rb.array) { - newCapacity := int(len(rb.array) * int(ringBufferGrowFactor/100)) - if newCapacity < (len(rb.array) + ringBufferMinimumGrow) { - newCapacity = len(rb.array) + ringBufferMinimumGrow - } - rb.setCapacity(newCapacity) - } - - rb.array[rb.tail] = object - rb.tail = (rb.tail + 1) % len(rb.array) - rb.size++ -} - -// Dequeue removes the first element from the RingBuffer. -func (rb *RingBuffer) Dequeue() interface{} { - if rb.size == 0 { - return nil - } - - removed := rb.array[rb.head] - rb.head = (rb.head + 1) % len(rb.array) - rb.size-- - return removed -} - -// Peek returns but does not remove the first element. -func (rb *RingBuffer) Peek() interface{} { - if rb.size == 0 { - return nil - } - return rb.array[rb.head] -} - -// PeekBack returns but does not remove the last element. -func (rb *RingBuffer) PeekBack() interface{} { - if rb.size == 0 { - return nil - } - if rb.tail == 0 { - return rb.array[len(rb.array)-1] - } - return rb.array[rb.tail-1] -} - -func (rb *RingBuffer) setCapacity(capacity int) { - newArray := make([]interface{}, capacity) - if rb.size > 0 { - if rb.head < rb.tail { - arrayCopy(rb.array, rb.head, newArray, 0, rb.size) - } else { - arrayCopy(rb.array, rb.head, newArray, 0, len(rb.array)-rb.head) - arrayCopy(rb.array, 0, newArray, len(rb.array)-rb.head, rb.tail) - } - } - rb.array = newArray - rb.head = 0 - if rb.size == capacity { - rb.tail = 0 - } else { - rb.tail = rb.size - } -} - -// TrimExcess resizes the buffer to better fit the contents. -func (rb *RingBuffer) TrimExcess() { - threshold := float64(len(rb.array)) * 0.9 - if rb.size < int(threshold) { - rb.setCapacity(rb.size) - } -} - -// AsSlice returns the ring buffer, in order, as a slice. -func (rb *RingBuffer) AsSlice() []interface{} { - newArray := make([]interface{}, rb.size) - - if rb.size == 0 { - return newArray - } - - if rb.head < rb.tail { - arrayCopy(rb.array, rb.head, newArray, 0, rb.size) - } else { - arrayCopy(rb.array, rb.head, newArray, 0, len(rb.array)-rb.head) - arrayCopy(rb.array, 0, newArray, len(rb.array)-rb.head, rb.tail) - } - - return newArray -} - -// Each calls the consumer for each element in the buffer. -func (rb *RingBuffer) Each(consumer func(value interface{})) { - if rb.size == 0 { - return - } - - if rb.head < rb.tail { - for cursor := rb.head; cursor < rb.tail; cursor++ { - consumer(rb.array[cursor]) - } - } else { - for cursor := rb.head; cursor < len(rb.array); cursor++ { - consumer(rb.array[cursor]) - } - for cursor := 0; cursor < rb.tail; cursor++ { - consumer(rb.array[cursor]) - } - } -} - -func (rb *RingBuffer) String() string { - var values []string - for _, elem := range rb.AsSlice() { - values = append(values, fmt.Sprintf("%v", elem)) - } - return strings.Join(values, " <= ") -} - -// Average returns the float average of the values in the buffer. -func (rb *RingBuffer) Average() float64 { - var accum float64 - rb.Each(func(v interface{}) { - if typed, isTyped := v.(float64); isTyped { - accum += typed - } - }) - return accum / float64(rb.Len()) -} - -// Variance computes the variance of the buffer. -func (rb *RingBuffer) Variance() float64 { - if rb.Len() == 0 { - return 0 - } - - var variance float64 - m := rb.Average() - - rb.Each(func(v interface{}) { - if n, isTyped := v.(float64); isTyped { - variance += (float64(n) - m) * (float64(n) - m) - } - }) - - return variance / float64(rb.Len()) -} - -// StdDev returns the standard deviation. -func (rb *RingBuffer) StdDev() float64 { - return math.Pow(rb.Variance(), 0.5) -} - -func arrayClear(source []interface{}, index, length int) { - for x := 0; x < length; x++ { - absoluteIndex := x + index - source[absoluteIndex] = nil - } -} - -func arrayCopy(source []interface{}, sourceIndex int, destination []interface{}, destinationIndex, length int) { - for x := 0; x < length; x++ { - from := sourceIndex + x - to := destinationIndex + x - - destination[to] = source[from] - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/ring_buffer_test.go b/vendor/github.com/wcharczuk/go-chart/ring_buffer_test.go deleted file mode 100644 index cc35074..0000000 --- a/vendor/github.com/wcharczuk/go-chart/ring_buffer_test.go +++ /dev/null @@ -1,162 +0,0 @@ -package chart - -import ( - "testing" - - "github.com/blendlabs/go-assert" -) - -func TestRingBuffer(t *testing.T) { - assert := assert.New(t) - - buffer := NewRingBuffer() - - buffer.Enqueue(1) - assert.Equal(1, buffer.Len()) - assert.Equal(1, buffer.Peek()) - assert.Equal(1, buffer.PeekBack()) - - buffer.Enqueue(2) - assert.Equal(2, buffer.Len()) - assert.Equal(1, buffer.Peek()) - assert.Equal(2, buffer.PeekBack()) - - buffer.Enqueue(3) - assert.Equal(3, buffer.Len()) - assert.Equal(1, buffer.Peek()) - assert.Equal(3, buffer.PeekBack()) - - buffer.Enqueue(4) - assert.Equal(4, buffer.Len()) - assert.Equal(1, buffer.Peek()) - assert.Equal(4, buffer.PeekBack()) - - buffer.Enqueue(5) - assert.Equal(5, buffer.Len()) - assert.Equal(1, buffer.Peek()) - assert.Equal(5, buffer.PeekBack()) - - buffer.Enqueue(6) - assert.Equal(6, buffer.Len()) - assert.Equal(1, buffer.Peek()) - assert.Equal(6, buffer.PeekBack()) - - buffer.Enqueue(7) - assert.Equal(7, buffer.Len()) - assert.Equal(1, buffer.Peek()) - assert.Equal(7, buffer.PeekBack()) - - buffer.Enqueue(8) - assert.Equal(8, buffer.Len()) - assert.Equal(1, buffer.Peek()) - assert.Equal(8, buffer.PeekBack()) - - value := buffer.Dequeue() - assert.Equal(1, value) - assert.Equal(7, buffer.Len()) - assert.Equal(2, buffer.Peek()) - assert.Equal(8, buffer.PeekBack()) - - value = buffer.Dequeue() - assert.Equal(2, value) - assert.Equal(6, buffer.Len()) - assert.Equal(3, buffer.Peek()) - assert.Equal(8, buffer.PeekBack()) - - value = buffer.Dequeue() - assert.Equal(3, value) - assert.Equal(5, buffer.Len()) - assert.Equal(4, buffer.Peek()) - assert.Equal(8, buffer.PeekBack()) - - value = buffer.Dequeue() - assert.Equal(4, value) - assert.Equal(4, buffer.Len()) - assert.Equal(5, buffer.Peek()) - assert.Equal(8, buffer.PeekBack()) - - value = buffer.Dequeue() - assert.Equal(5, value) - assert.Equal(3, buffer.Len()) - assert.Equal(6, buffer.Peek()) - assert.Equal(8, buffer.PeekBack()) - - value = buffer.Dequeue() - assert.Equal(6, value) - assert.Equal(2, buffer.Len()) - assert.Equal(7, buffer.Peek()) - assert.Equal(8, buffer.PeekBack()) - - value = buffer.Dequeue() - assert.Equal(7, value) - assert.Equal(1, buffer.Len()) - assert.Equal(8, buffer.Peek()) - assert.Equal(8, buffer.PeekBack()) - - value = buffer.Dequeue() - assert.Equal(8, value) - assert.Equal(0, buffer.Len()) - assert.Nil(buffer.Peek()) - assert.Nil(buffer.PeekBack()) -} - -func TestRingBufferClear(t *testing.T) { - assert := assert.New(t) - - buffer := NewRingBuffer() - buffer.Enqueue(1) - buffer.Enqueue(1) - buffer.Enqueue(1) - buffer.Enqueue(1) - buffer.Enqueue(1) - buffer.Enqueue(1) - buffer.Enqueue(1) - buffer.Enqueue(1) - - assert.Equal(8, buffer.Len()) - - buffer.Clear() - assert.Equal(0, buffer.Len()) - assert.Nil(buffer.Peek()) - assert.Nil(buffer.PeekBack()) -} - -func TestRingBufferAsSlice(t *testing.T) { - assert := assert.New(t) - - buffer := NewRingBuffer() - buffer.Enqueue(1) - buffer.Enqueue(2) - buffer.Enqueue(3) - buffer.Enqueue(4) - buffer.Enqueue(5) - - contents := buffer.AsSlice() - assert.Len(contents, 5) - assert.Equal(1, contents[0]) - assert.Equal(2, contents[1]) - assert.Equal(3, contents[2]) - assert.Equal(4, contents[3]) - assert.Equal(5, contents[4]) -} - -func TestRingBufferEach(t *testing.T) { - assert := assert.New(t) - - buffer := NewRingBuffer() - - for x := 1; x < 17; x++ { - buffer.Enqueue(x) - } - - called := 0 - buffer.Each(func(v interface{}) { - if typed, isTyped := v.(int); isTyped { - if typed == (called + 1) { - called++ - } - } - }) - - assert.Equal(16, called) -} diff --git a/vendor/github.com/wcharczuk/go-chart/roboto.go b/vendor/github.com/wcharczuk/go-chart/roboto.go deleted file mode 100644 index d3d1733..0000000 --- a/vendor/github.com/wcharczuk/go-chart/roboto.go +++ /dev/null @@ -1,5 +0,0 @@ -package chart - -// roboto is the .ttf of Roboto-Medium. -// yes it is inlined. -var roboto = []byte{0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0x0, 0x80, 0x0, 0x3, 0x0, 0x50, 0x47, 0x44, 0x45, 0x46, 0xE1, 0x72, 0xE4, 0x6D, 0x0, 0x3, 0x6A, 0x7C, 0x0, 0x0, 0x3, 0x76, 0x47, 0x50, 0x4F, 0x53, 0xE, 0xB6, 0x68, 0x58, 0x0, 0x3, 0x6D, 0xF4, 0x0, 0x1, 0x10, 0xC4, 0x47, 0x53, 0x55, 0x42, 0x72, 0xEB, 0xE7, 0x34, 0x0, 0x4, 0x7E, 0xB8, 0x0, 0x0, 0x2B, 0x68, 0x4F, 0x53, 0x2F, 0x32, 0x9B, 0x33, 0xB2, 0x3A, 0x0, 0x0, 0x1, 0x58, 0x0, 0x0, 0x0, 0x60, 0x63, 0x6D, 0x61, 0x70, 0x6A, 0x87, 0x43, 0x81, 0x0, 0x0, 0x36, 0x34, 0x0, 0x0, 0x18, 0xCC, 0x67, 0x6C, 0x79, 0x66, 0xEC, 0x38, 0xAB, 0xF4, 0x0, 0x0, 0x83, 0x80, 0x0, 0x2, 0xE3, 0xCD, 0x68, 0x65, 0x61, 0x64, 0x0, 0xD8, 0xDB, 0x29, 0x0, 0x0, 0x0, 0xDC, 0x0, 0x0, 0x0, 0x36, 0x68, 0x68, 0x65, 0x61, 0x10, 0x97, 0x17, 0xF0, 0x0, 0x0, 0x1, 0x14, 0x0, 0x0, 0x0, 0x24, 0x68, 0x6D, 0x74, 0x78, 0xC2, 0x6D, 0xF3, 0x5F, 0x0, 0x0, 0x1, 0xB8, 0x0, 0x0, 0x34, 0x7A, 0x6C, 0x6F, 0x63, 0x61, 0x16, 0x82, 0xFE, 0x88, 0x0, 0x0, 0x4F, 0x0, 0x0, 0x0, 0x34, 0x80, 0x6D, 0x61, 0x78, 0x70, 0xD, 0x43, 0x1, 0x29, 0x0, 0x0, 0x1, 0x38, 0x0, 0x0, 0x0, 0x20, 0x6E, 0x61, 0x6D, 0x65, 0x44, 0x5E, 0x77, 0xFC, 0x0, 0x3, 0x67, 0x50, 0x0, 0x0, 0x3, 0xC, 0x70, 0x6F, 0x73, 0x74, 0xFF, 0x6D, 0x0, 0x64, 0x0, 0x3, 0x6A, 0x5C, 0x0, 0x0, 0x0, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0x22, 0x4E, 0xAE, 0xA5, 0x79, 0xC3, 0x5F, 0xF, 0x3C, 0xF5, 0x0, 0x19, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xC4, 0xF0, 0x73, 0x9E, 0x0, 0x0, 0x0, 0x0, 0xD3, 0x91, 0xF9, 0xF6, 0xF8, 0xBE, 0xFD, 0xD5, 0x10, 0x6A, 0x8, 0x73, 0x0, 0x0, 0x0, 0x9, 0x0, 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x7, 0x6C, 0xFE, 0xC, 0x0, 0x0, 0x11, 0x2, 0xF8, 0xBE, 0xFB, 0xC3, 0x10, 0x6A, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xD, 0x1E, 0x0, 0x1, 0x0, 0x0, 0xD, 0x1F, 0x0, 0xD6, 0x0, 0x16, 0x0, 0x50, 0x0, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x2, 0x0, 0x4, 0x4, 0x99, 0x1, 0xF4, 0x0, 0x5, 0x0, 0x0, 0x5, 0x9A, 0x5, 0x33, 0x0, 0x0, 0x1, 0x1F, 0x5, 0x9A, 0x5, 0x33, 0x0, 0x0, 0x3, 0xD1, 0x0, 0x66, 0x2, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xE0, 0x0, 0x2, 0xFF, 0x50, 0x0, 0x21, 0x7F, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x47, 0x4F, 0x4F, 0x47, 0x0, 0x40, 0x0, 0x0, 0xFF, 0xFF, 0x8, 0x62, 0xFD, 0xD5, 0x0, 0x0, 0x8, 0x62, 0x2, 0x2B, 0x20, 0x0, 0x1, 0x9F, 0x0, 0x0, 0x0, 0x0, 0x4, 0x3A, 0x5, 0xB0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x3, 0x3, 0x8C, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xFE, 0x0, 0x0, 0x1, 0xFE, 0x0, 0x0, 0x1, 0xFE, 0x0, 0x0, 0x2, 0x25, 0x0, 0x90, 0x2, 0x98, 0x0, 0x65, 0x4, 0xE2, 0x0, 0x61, 0x4, 0x8C, 0x0, 0x65, 0x5, 0xE0, 0x0, 0x64, 0x5, 0x1D, 0x0, 0x55, 0x1, 0x5A, 0x0, 0x53, 0x2, 0xCB, 0x0, 0x80, 0x2, 0xD3, 0x0, 0x28, 0x3, 0x8A, 0x0, 0x1C, 0x4, 0x76, 0x0, 0x45, 0x1, 0xC3, 0x0, 0x1D, 0x2, 0xA1, 0x0, 0x47, 0x2, 0x3C, 0x0, 0x88, 0x3, 0x2B, 0x0, 0x2, 0x4, 0x8C, 0x0, 0x69, 0x4, 0x8C, 0x0, 0xA8, 0x4, 0x8C, 0x0, 0x51, 0x4, 0x8C, 0x0, 0x50, 0x4, 0x8C, 0x0, 0x35, 0x4, 0x8C, 0x0, 0x81, 0x4, 0x8C, 0x0, 0x76, 0x4, 0x8C, 0x0, 0x46, 0x4, 0x8C, 0x0, 0x69, 0x4, 0x8C, 0x0, 0x5E, 0x2, 0x1F, 0x0, 0x82, 0x1, 0xE7, 0x0, 0x2F, 0x4, 0x11, 0x0, 0x3F, 0x4, 0x7A, 0x0, 0x91, 0x4, 0x2A, 0x0, 0x81, 0x3, 0xE5, 0x0, 0x3C, 0x7, 0x29, 0x0, 0x52, 0x5, 0x53, 0x0, 0x12, 0x5, 0xD, 0x0, 0x95, 0x5, 0x39, 0x0, 0x66, 0x5, 0x3A, 0x0, 0x95, 0x4, 0x86, 0x0, 0x95, 0x4, 0x66, 0x0, 0x95, 0x5, 0x73, 0x0, 0x6A, 0x5, 0xB0, 0x0, 0x95, 0x2, 0x42, 0x0, 0xA4, 0x4, 0x71, 0x0, 0x2D, 0x5, 0xB, 0x0, 0x95, 0x4, 0x55, 0x0, 0x95, 0x7, 0x1, 0x0, 0x95, 0x5, 0xAF, 0x0, 0x95, 0x5, 0x86, 0x0, 0x66, 0x5, 0x1E, 0x0, 0x95, 0x5, 0x86, 0x0, 0x60, 0x4, 0xFF, 0x0, 0x95, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0xDC, 0x0, 0x2D, 0x5, 0x38, 0x0, 0x7E, 0x5, 0x2E, 0x0, 0x12, 0x7, 0xB, 0x0, 0x31, 0x5, 0x10, 0x0, 0x29, 0x4, 0xE0, 0x0, 0x8, 0x4, 0xD2, 0x0, 0x50, 0x2, 0x32, 0x0, 0x84, 0x3, 0x58, 0x0, 0x14, 0x2, 0x32, 0x0, 0xD, 0x3, 0x6C, 0x0, 0x35, 0x3, 0x9C, 0x0, 0x3, 0x2, 0x94, 0x0, 0x31, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x81, 0x0, 0x7D, 0x4, 0x31, 0x0, 0x50, 0x4, 0x85, 0x0, 0x50, 0x4, 0x4B, 0x0, 0x54, 0x2, 0xD6, 0x0, 0x2D, 0x4, 0x89, 0x0, 0x52, 0x4, 0x71, 0x0, 0x7A, 0x2, 0xC, 0x0, 0x7D, 0x2, 0x1, 0xFF, 0xB4, 0x4, 0x2D, 0x0, 0x7D, 0x2, 0xC, 0x0, 0x8C, 0x6, 0xF7, 0x0, 0x7D, 0x4, 0x73, 0x0, 0x7A, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x81, 0x0, 0x7D, 0x4, 0x8B, 0x0, 0x50, 0x2, 0xD0, 0x0, 0x7D, 0x4, 0x22, 0x0, 0x4C, 0x2, 0xAA, 0x0, 0x8, 0x4, 0x72, 0x0, 0x77, 0x3, 0xF6, 0x0, 0x17, 0x5, 0xF2, 0x0, 0x22, 0x4, 0x7, 0x0, 0x1F, 0x3, 0xE5, 0x0, 0xC, 0x4, 0x7, 0x0, 0x52, 0x2, 0xAF, 0x0, 0x38, 0x2, 0x2, 0x0, 0xAE, 0x2, 0xAF, 0x0, 0x1C, 0x5, 0x51, 0x0, 0x76, 0x2, 0x1F, 0x0, 0x86, 0x4, 0x7D, 0x0, 0x65, 0x4, 0xB6, 0x0, 0x5F, 0x5, 0x9E, 0x0, 0x5D, 0x4, 0x41, 0x0, 0xC, 0x1, 0xFD, 0x0, 0x89, 0x4, 0xF9, 0x0, 0x5A, 0x3, 0x85, 0x0, 0x5E, 0x6, 0x45, 0x0, 0x56, 0x3, 0x92, 0x0, 0x8E, 0x3, 0xE2, 0x0, 0x56, 0x4, 0x6E, 0x0, 0x7F, 0x6, 0x45, 0x0, 0x56, 0x3, 0xDC, 0x0, 0x9C, 0x3, 0xB, 0x0, 0x7F, 0x4, 0x4B, 0x0, 0x5F, 0x2, 0xF6, 0x0, 0x3C, 0x2, 0xF6, 0x0, 0x37, 0x2, 0x9C, 0x0, 0x71, 0x4, 0xBB, 0x0, 0x93, 0x3, 0xEE, 0x0, 0x46, 0x2, 0x42, 0x0, 0x8E, 0x2, 0x11, 0x0, 0x6E, 0x2, 0xF6, 0x0, 0x81, 0x3, 0xA7, 0x0, 0x77, 0x3, 0xE2, 0x0, 0x5E, 0x5, 0xD0, 0x0, 0x59, 0x6, 0x2B, 0x0, 0x50, 0x6, 0x57, 0x0, 0x67, 0x3, 0xE5, 0x0, 0x43, 0x7, 0x85, 0xFF, 0xF6, 0x4, 0x45, 0x0, 0x4D, 0x5, 0x85, 0x0, 0x6A, 0x4, 0xCB, 0x0, 0x95, 0x4, 0xE8, 0x0, 0x88, 0x6, 0xC1, 0x0, 0x48, 0x4, 0xA7, 0x0, 0x68, 0x4, 0x92, 0x0, 0x44, 0x4, 0x89, 0x0, 0x50, 0x4, 0x97, 0x0, 0x83, 0x4, 0xEE, 0x0, 0x50, 0x5, 0xB0, 0x0, 0x20, 0x2, 0x1B, 0x0, 0x90, 0x4, 0x98, 0x0, 0x8E, 0x4, 0x64, 0x0, 0x22, 0x2, 0x4F, 0x0, 0x22, 0x5, 0x94, 0x0, 0x90, 0x4, 0x89, 0x0, 0x7F, 0x7, 0xB4, 0x0, 0x65, 0x7, 0x3B, 0x0, 0x5B, 0x2, 0xD, 0x0, 0x8B, 0x4, 0xDA, 0x0, 0x1A, 0x6, 0xA, 0x0, 0x22, 0x5, 0x8, 0x0, 0x90, 0x4, 0x81, 0x0, 0x7D, 0x5, 0x78, 0x0, 0x55, 0x5, 0x0, 0x0, 0x4F, 0x5, 0x39, 0x0, 0x4D, 0x5, 0xB9, 0x0, 0x66, 0x4, 0xC7, 0x0, 0x50, 0x5, 0x86, 0x0, 0x21, 0x6, 0x39, 0x0, 0x22, 0x5, 0x8, 0x0, 0x4E, 0x4, 0x85, 0x0, 0x50, 0x4, 0x89, 0x0, 0x53, 0x4, 0x86, 0x0, 0x3A, 0x5, 0x89, 0x0, 0x51, 0x4, 0xD6, 0x0, 0x57, 0x4, 0xB9, 0x0, 0x0, 0x2, 0xD1, 0xFF, 0xE4, 0x5, 0xBC, 0x0, 0x6A, 0x5, 0x30, 0x0, 0x18, 0x6, 0xBD, 0x0, 0x7A, 0x2, 0xC6, 0x0, 0x14, 0x5, 0xB, 0x0, 0x95, 0x4, 0x2D, 0x0, 0x7D, 0x2, 0xC6, 0x0, 0x14, 0x4, 0x6A, 0x0, 0x16, 0x7, 0x3F, 0x0, 0x99, 0x6, 0x2, 0x0, 0x0, 0x5, 0x8A, 0x0, 0x58, 0x4, 0x9F, 0x0, 0x4F, 0x7, 0x1, 0x0, 0x66, 0x5, 0x9C, 0x0, 0x50, 0x6, 0x1C, 0x0, 0x22, 0x4, 0x81, 0x0, 0x7D, 0x5, 0x84, 0x0, 0x95, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x57, 0x4, 0x91, 0x0, 0x48, 0x3, 0xF4, 0x0, 0x1B, 0x2, 0xAA, 0x0, 0x8, 0x5, 0x50, 0x0, 0x1E, 0x2, 0xCA, 0x0, 0x13, 0x4, 0xDC, 0x0, 0x2D, 0x5, 0xA5, 0x0, 0x7E, 0x4, 0xF2, 0x0, 0x77, 0x5, 0x53, 0x0, 0x6F, 0x5, 0x3C, 0x0, 0x7E, 0x5, 0x59, 0x0, 0x8, 0x4, 0xC4, 0x0, 0xC, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x14, 0x0, 0x59, 0x5, 0x33, 0x0, 0x4A, 0x5, 0x33, 0x0, 0x64, 0x4, 0x8D, 0x0, 0x53, 0x4, 0x3F, 0x0, 0x45, 0x4, 0xA8, 0x0, 0x51, 0x4, 0xAF, 0x0, 0x3F, 0x4, 0x30, 0x0, 0x2E, 0x4, 0x22, 0x0, 0x4C, 0x4, 0x81, 0x0, 0x7D, 0x1, 0xF5, 0x0, 0xA7, 0x3, 0x3, 0x0, 0xA7, 0x2, 0xC6, 0x0, 0x14, 0x2, 0x25, 0x0, 0x90, 0x9, 0x6B, 0x0, 0x95, 0x8, 0xD6, 0x0, 0x95, 0x8, 0x18, 0x0, 0x50, 0x5, 0x8B, 0x0, 0x6A, 0x4, 0x89, 0x0, 0x25, 0x5, 0x33, 0x0, 0x4A, 0x4, 0xA7, 0x0, 0x5E, 0x8, 0xA0, 0x0, 0x95, 0x5, 0x4F, 0x0, 0x95, 0x4, 0xCF, 0x0, 0x4E, 0x4, 0xA, 0x0, 0x48, 0x5, 0x39, 0x0, 0x95, 0x5, 0xD2, 0x0, 0x50, 0x5, 0x36, 0x0, 0x67, 0x5, 0x9, 0x0, 0x55, 0x5, 0x4, 0x0, 0x50, 0x4, 0x4D, 0x0, 0x52, 0x3, 0xC8, 0x0, 0x14, 0x5, 0xC7, 0x0, 0x7A, 0x3, 0xC8, 0x0, 0x14, 0x2, 0x27, 0xFF, 0xB5, 0x7, 0x36, 0x0, 0x60, 0x7, 0x15, 0x0, 0x50, 0x5, 0x53, 0xFF, 0x49, 0x5, 0x39, 0x0, 0x66, 0x4, 0x31, 0x0, 0x50, 0x4, 0xA0, 0x0, 0x1A, 0x4, 0xDC, 0x0, 0x2D, 0x4, 0x1E, 0x0, 0x49, 0x4, 0x5E, 0x0, 0x52, 0x4, 0x47, 0x0, 0x37, 0x3, 0xF2, 0x0, 0x4C, 0x5, 0x5B, 0x0, 0x1A, 0x6, 0x43, 0x0, 0x22, 0x5, 0x2E, 0x0, 0x12, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0xCC, 0x0, 0x2D, 0x2, 0xDF, 0x0, 0x27, 0x5, 0xDC, 0x0, 0x66, 0x4, 0xD9, 0x0, 0x50, 0x5, 0x43, 0x0, 0x21, 0x3, 0x2D, 0x0, 0x1A, 0x5, 0x95, 0x0, 0x22, 0x4, 0x52, 0x0, 0x22, 0x4, 0x55, 0x0, 0x59, 0x4, 0xB8, 0x0, 0x56, 0x4, 0xB8, 0x0, 0x3E, 0x4, 0x82, 0x0, 0x7D, 0x4, 0x31, 0x0, 0x3B, 0x4, 0x47, 0x0, 0x2D, 0x4, 0xDA, 0x0, 0x50, 0x4, 0xDA, 0x0, 0x50, 0x4, 0x4B, 0x0, 0x40, 0x4, 0x3D, 0x0, 0x5A, 0x5, 0xC1, 0x0, 0x40, 0x4, 0x61, 0x0, 0x61, 0x4, 0x61, 0x0, 0x54, 0x5, 0xD6, 0x0, 0x54, 0x4, 0x43, 0x0, 0x53, 0x2, 0xBA, 0x0, 0x39, 0x4, 0xE4, 0x0, 0x52, 0x4, 0x89, 0x0, 0x52, 0x4, 0xDB, 0x0, 0x68, 0x4, 0x76, 0x0, 0x14, 0x5, 0x1B, 0x0, 0x1B, 0x4, 0x71, 0x0, 0x78, 0x4, 0x71, 0x0, 0x7A, 0x4, 0x71, 0x0, 0x7A, 0x2, 0xC6, 0x0, 0x14, 0x2, 0x78, 0x0, 0x77, 0x2, 0xD7, 0x0, 0x5D, 0x3, 0x6, 0x0, 0x14, 0x3, 0xD3, 0x0, 0x22, 0x2, 0xA6, 0x0, 0xB7, 0x4, 0xD5, 0x0, 0x8C, 0x6, 0xF7, 0x0, 0x7D, 0x6, 0xF7, 0x0, 0x7D, 0x6, 0xF7, 0x0, 0x7D, 0x4, 0xD0, 0xFF, 0xF9, 0x4, 0xCF, 0x0, 0x7A, 0x4, 0x86, 0x0, 0x7D, 0x6, 0xA8, 0x0, 0x66, 0x6, 0x93, 0x0, 0x66, 0x4, 0xD4, 0x0, 0x50, 0x2, 0xD0, 0x0, 0x1B, 0x2, 0xD0, 0x0, 0x1B, 0x3, 0x2A, 0x0, 0x1B, 0x2, 0xD0, 0x0, 0x7D, 0x2, 0xD0, 0x0, 0x7D, 0x2, 0x68, 0x0, 0x7D, 0x2, 0x68, 0x0, 0x1B, 0x4, 0x73, 0x0, 0x71, 0x4, 0x73, 0x0, 0x71, 0x4, 0x22, 0x0, 0x4C, 0x3, 0x4C, 0x0, 0x1B, 0x3, 0x4C, 0x0, 0x1B, 0x3, 0x4C, 0x0, 0x1B, 0x3, 0xF2, 0x0, 0x1E, 0x2, 0xAA, 0x0, 0x37, 0x2, 0xC1, 0x0, 0x8, 0x5, 0x3E, 0x0, 0x18, 0x4, 0xF0, 0x0, 0x62, 0x4, 0x60, 0x0, 0x77, 0x3, 0xF6, 0x0, 0x19, 0x5, 0xF0, 0x0, 0x22, 0x3, 0xE7, 0x0, 0xD, 0x4, 0x39, 0x0, 0x8, 0x4, 0x93, 0x0, 0x52, 0x5, 0x1, 0x0, 0x52, 0x4, 0x8D, 0x0, 0x51, 0x4, 0xA3, 0x0, 0x51, 0x4, 0x31, 0x0, 0x3B, 0x4, 0x31, 0x0, 0x50, 0x4, 0x31, 0x0, 0x3B, 0x4, 0x31, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x43, 0x0, 0x61, 0x5, 0x11, 0x0, 0x50, 0x3, 0xAD, 0x0, 0x1E, 0x4, 0x2D, 0xFF, 0xF6, 0x3, 0x8B, 0x0, 0x7A, 0x4, 0xDA, 0x0, 0x50, 0x4, 0x31, 0x0, 0x3B, 0x4, 0x31, 0x0, 0x50, 0x7, 0xB8, 0x0, 0x50, 0x7, 0x64, 0x0, 0x50, 0x8, 0xB2, 0x0, 0x50, 0x5, 0xDD, 0x0, 0x8, 0x4, 0x95, 0x0, 0x8, 0x6, 0x3D, 0x0, 0x8, 0x6, 0xD3, 0x0, 0x2D, 0x5, 0x75, 0x0, 0x8C, 0x5, 0x35, 0x0, 0x8C, 0x3, 0xC6, 0x0, 0x36, 0x3, 0xDD, 0x0, 0x57, 0x5, 0x17, 0x0, 0x1B, 0x5, 0x57, 0x0, 0x1B, 0x3, 0x5E, 0x0, 0x64, 0x3, 0x5E, 0x0, 0x64, 0x1, 0xEF, 0x0, 0x22, 0x2, 0x3A, 0x0, 0x64, 0x2, 0x3A, 0x0, 0x28, 0x2, 0x8A, 0x0, 0x28, 0x3, 0x73, 0x0, 0x64, 0x4, 0x7A, 0x0, 0x28, 0x3, 0x45, 0x0, 0x2F, 0x1, 0x94, 0x0, 0x23, 0x2, 0xE3, 0x0, 0x23, 0x1, 0xD6, 0x0, 0x50, 0x1, 0xD6, 0x0, 0x50, 0x1, 0x3C, 0x0, 0x36, 0x1, 0x3C, 0x0, 0x36, 0x2, 0xFD, 0x0, 0x1B, 0x2, 0xFD, 0x0, 0x3C, 0x3, 0x60, 0x0, 0x3D, 0x3, 0x60, 0x0, 0x3D, 0x3, 0x44, 0x0, 0x30, 0x3, 0x44, 0x0, 0x30, 0x3, 0xE7, 0x0, 0x95, 0x3, 0xB1, 0x0, 0x72, 0x1, 0x20, 0x0, 0x3D, 0x3, 0xDC, 0x0, 0x9C, 0x2, 0x74, 0x0, 0x48, 0x2, 0x6D, 0x0, 0x37, 0x1, 0x20, 0x0, 0x3D, 0x3, 0x50, 0x0, 0x51, 0x2, 0x6D, 0x0, 0x37, 0x2, 0x74, 0x0, 0x48, 0x1, 0xF4, 0x0, 0x5F, 0x1, 0xF4, 0x0, 0x5F, 0x1, 0x3C, 0x0, 0x36, 0x1, 0x3C, 0x0, 0x36, 0x2, 0x58, 0x0, 0x50, 0x2, 0x58, 0x0, 0x50, 0x2, 0x58, 0x0, 0x50, 0x2, 0x59, 0x0, 0x3D, 0x3, 0x7D, 0x0, 0x76, 0x2, 0xC, 0x0, 0x82, 0x2, 0xB2, 0x0, 0x79, 0x2, 0x4D, 0x0, 0x29, 0x3, 0xD8, 0x0, 0x7A, 0x3, 0x20, 0x0, 0x4A, 0x1, 0xDB, 0xFF, 0x3A, 0x2, 0xA5, 0x0, 0x50, 0x3, 0x6B, 0x0, 0x35, 0x1, 0x8D, 0x0, 0x64, 0x3, 0x1B, 0x0, 0x3C, 0x3, 0x48, 0x0, 0x2F, 0x3, 0x58, 0x0, 0x51, 0x2, 0xB2, 0x0, 0x1A, 0x2, 0xB2, 0x0, 0x1A, 0x2, 0xB2, 0x0, 0x1A, 0x2, 0xB2, 0x0, 0x1A, 0x2, 0xB2, 0x0, 0x1A, 0x3, 0x1E, 0x0, 0x84, 0x2, 0xF7, 0x0, 0x84, 0x3, 0x54, 0x0, 0x49, 0x3, 0x1C, 0x0, 0x43, 0x3, 0x29, 0x0, 0x50, 0x2, 0x80, 0x0, 0x3D, 0x2, 0x80, 0x0, 0x3D, 0x2, 0x81, 0x0, 0x3D, 0x2, 0x81, 0x0, 0x3D, 0x2, 0x6C, 0x0, 0x83, 0x2, 0x6D, 0x0, 0x37, 0x4, 0x13, 0x0, 0x37, 0x4, 0x1A, 0x0, 0x48, 0x3, 0x70, 0x0, 0x4A, 0x1, 0xBD, 0x0, 0x51, 0x2, 0x35, 0x0, 0x50, 0x2, 0x35, 0x0, 0x50, 0x2, 0x35, 0x0, 0x50, 0x2, 0x35, 0x0, 0x50, 0x3, 0x57, 0x0, 0x50, 0x3, 0x39, 0x0, 0x50, 0x3, 0x98, 0x0, 0x43, 0x0, 0x0, 0xFC, 0x8D, 0x0, 0x0, 0xFD, 0x5E, 0x0, 0x0, 0xFC, 0x60, 0x0, 0x0, 0xFC, 0x72, 0x0, 0x0, 0xFC, 0x60, 0x0, 0x0, 0xFB, 0xEE, 0x0, 0x0, 0xFC, 0x75, 0x0, 0x0, 0xFD, 0x2F, 0x0, 0x0, 0xFC, 0x4, 0x0, 0x0, 0xFD, 0x3D, 0x0, 0x0, 0xFC, 0xDC, 0x0, 0x0, 0xFB, 0xEE, 0x0, 0x0, 0xFC, 0x60, 0x0, 0x0, 0xFD, 0x65, 0x0, 0x0, 0xFC, 0xDD, 0x0, 0x0, 0xFC, 0xB, 0x0, 0x0, 0xFC, 0x75, 0x0, 0x0, 0xFC, 0x75, 0x0, 0x0, 0xFD, 0x47, 0x0, 0x0, 0xFD, 0x1E, 0x0, 0x0, 0xFD, 0x1D, 0x0, 0x0, 0xFF, 0x3A, 0x0, 0x0, 0xFC, 0xB8, 0x0, 0x0, 0xFC, 0xC7, 0x0, 0x0, 0xFC, 0xD4, 0x0, 0x0, 0xFC, 0xDC, 0x0, 0x0, 0xFC, 0xF3, 0x0, 0x0, 0xFE, 0x65, 0x0, 0x0, 0xFD, 0x71, 0x0, 0x0, 0xFC, 0xDB, 0x0, 0x0, 0xFC, 0xDC, 0x0, 0x0, 0xFC, 0xDC, 0x0, 0x0, 0xFC, 0xC2, 0x0, 0x0, 0xFD, 0xBD, 0x0, 0x0, 0xFE, 0xCE, 0x0, 0x0, 0xFD, 0x1B, 0x0, 0x0, 0xFC, 0x3, 0x0, 0x0, 0xFC, 0xDD, 0x0, 0x0, 0xFD, 0x32, 0x0, 0x0, 0xFD, 0x28, 0x0, 0x0, 0xFC, 0xCA, 0x0, 0x0, 0xFD, 0x65, 0x0, 0x0, 0xFC, 0x5B, 0x0, 0x0, 0xFC, 0x2B, 0x0, 0x0, 0xFC, 0x61, 0x0, 0x0, 0xFC, 0x61, 0x0, 0x0, 0xFC, 0x75, 0x0, 0x0, 0xFC, 0x75, 0x0, 0x0, 0xFC, 0x43, 0x0, 0x0, 0xFC, 0x62, 0x0, 0x0, 0xFB, 0xED, 0x0, 0x0, 0xFB, 0xED, 0x0, 0x0, 0xFC, 0x49, 0x0, 0x0, 0xFC, 0x69, 0x0, 0x0, 0xFB, 0x44, 0x0, 0x0, 0xFC, 0x1E, 0x0, 0x0, 0xFB, 0xA, 0x0, 0x0, 0xFD, 0x50, 0x0, 0x0, 0xFC, 0x5C, 0x0, 0x0, 0xFC, 0xE8, 0x0, 0x0, 0xFC, 0x2B, 0x0, 0x0, 0xFD, 0x4, 0x0, 0x0, 0xFD, 0x45, 0x0, 0x0, 0xFB, 0xED, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0xFF, 0xF, 0x0, 0x0, 0xFC, 0x49, 0x0, 0x0, 0xFD, 0x30, 0x0, 0x0, 0xFC, 0xB, 0x0, 0x0, 0xFD, 0x60, 0x0, 0x0, 0xFC, 0x5C, 0x0, 0x0, 0xFC, 0xC2, 0x0, 0x0, 0xFC, 0xCE, 0x0, 0x0, 0xFD, 0x9, 0x0, 0x0, 0xFC, 0x4A, 0x0, 0x0, 0xFC, 0x2A, 0x0, 0x0, 0xFC, 0x55, 0x0, 0x0, 0xFC, 0xD, 0x0, 0x0, 0xFC, 0xD1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFC, 0x7C, 0x0, 0x0, 0xFD, 0x6F, 0x0, 0x0, 0xFC, 0x75, 0x0, 0x0, 0xFD, 0x4, 0x0, 0x0, 0xFC, 0xBE, 0x0, 0x0, 0xFC, 0xCE, 0x0, 0x0, 0xFC, 0x17, 0x0, 0x0, 0xFD, 0x4F, 0x1, 0xC0, 0x0, 0x49, 0x0, 0x0, 0xFC, 0xD9, 0x0, 0x0, 0xFC, 0x41, 0x0, 0x0, 0xFC, 0xFC, 0x0, 0x0, 0xFD, 0x34, 0x0, 0x0, 0xFD, 0x34, 0x0, 0x0, 0xFD, 0xB6, 0x0, 0x0, 0xFD, 0xB6, 0x0, 0x0, 0xFC, 0x2E, 0x0, 0x0, 0xFD, 0x34, 0x0, 0x0, 0xFD, 0x27, 0x0, 0x0, 0xFC, 0xD0, 0x0, 0x0, 0xFC, 0xCE, 0x0, 0x0, 0xFD, 0x79, 0x0, 0x0, 0xFC, 0xC2, 0x0, 0x0, 0xFC, 0xD6, 0x0, 0x0, 0xFC, 0xCC, 0x0, 0x0, 0xFC, 0xC0, 0x0, 0x0, 0xFC, 0xD6, 0x0, 0x0, 0xFC, 0x33, 0x0, 0x0, 0xFD, 0x46, 0x0, 0x0, 0xFC, 0xFB, 0x0, 0x0, 0xFC, 0xC5, 0x0, 0x0, 0xFC, 0xE6, 0x4, 0x81, 0x0, 0x95, 0x3, 0xEB, 0x0, 0x1B, 0x4, 0xDB, 0x0, 0x2D, 0x4, 0x2D, 0x0, 0x36, 0x1, 0xEF, 0x0, 0x51, 0x1, 0xEF, 0x0, 0x50, 0x5, 0xA9, 0x0, 0x95, 0x4, 0xBD, 0x0, 0x86, 0x4, 0x31, 0x0, 0x3B, 0x4, 0x31, 0x0, 0x50, 0x4, 0x31, 0x0, 0x3B, 0x2, 0x20, 0x0, 0x47, 0x2, 0x5D, 0x0, 0xC7, 0x4, 0x3C, 0x0, 0x68, 0x2, 0x42, 0x0, 0x8E, 0x4, 0x75, 0x0, 0x9B, 0x5, 0xC0, 0x0, 0x19, 0x5, 0x7B, 0x0, 0x5C, 0x5, 0x39, 0x0, 0x20, 0x4, 0x91, 0x0, 0x6D, 0x5, 0xB1, 0x0, 0x9B, 0x4, 0x91, 0x0, 0x48, 0x5, 0xF0, 0x0, 0x4A, 0x5, 0xAB, 0x0, 0x44, 0x5, 0x5C, 0x0, 0x6B, 0x4, 0x85, 0x0, 0x56, 0x4, 0xC6, 0x0, 0x96, 0x4, 0xF, 0x0, 0x21, 0x4, 0x89, 0x0, 0x54, 0x4, 0x61, 0x0, 0x61, 0x4, 0x1B, 0x0, 0x61, 0x4, 0x89, 0x0, 0x7F, 0x4, 0xA2, 0x0, 0x74, 0x2, 0xAA, 0x0, 0xAA, 0x4, 0x6A, 0x0, 0x16, 0x4, 0x13, 0x0, 0x63, 0x4, 0xF4, 0x0, 0x2E, 0x4, 0x89, 0x0, 0x81, 0x4, 0x38, 0x0, 0x52, 0x4, 0x91, 0x0, 0x53, 0x4, 0x2E, 0x0, 0x40, 0x4, 0x61, 0x0, 0x80, 0x5, 0xD0, 0x0, 0x45, 0x5, 0xCA, 0x0, 0x50, 0x6, 0x95, 0x0, 0x66, 0x5, 0xB, 0x0, 0x95, 0x4, 0x81, 0x0, 0x50, 0x4, 0xB3, 0x0, 0x76, 0x4, 0x7B, 0xFF, 0xE1, 0x5, 0xD3, 0x0, 0x54, 0x6, 0x71, 0x0, 0x33, 0x5, 0x59, 0x0, 0x23, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x39, 0x0, 0x66, 0x4, 0x31, 0x0, 0x50, 0x4, 0x66, 0x0, 0x95, 0x4, 0x24, 0x0, 0x87, 0x5, 0x2C, 0x0, 0x23, 0x4, 0x66, 0x0, 0x52, 0x5, 0xFB, 0x0, 0x21, 0x5, 0x7B, 0x0, 0x21, 0x5, 0x36, 0x0, 0x23, 0x4, 0x82, 0x0, 0x50, 0x3, 0x95, 0x0, 0x50, 0x3, 0x95, 0x0, 0x28, 0x5, 0xD9, 0x0, 0x7D, 0x4, 0xD8, 0x0, 0x14, 0x5, 0x39, 0x0, 0x4D, 0x5, 0x39, 0x0, 0x66, 0x5, 0x39, 0x0, 0x4D, 0x5, 0xFF, 0x0, 0x23, 0x5, 0x5A, 0x0, 0x69, 0x8, 0x89, 0x0, 0x2D, 0x8, 0x90, 0x0, 0x9B, 0x6, 0x5C, 0x0, 0x31, 0x5, 0xAA, 0x0, 0x93, 0x5, 0x8, 0x0, 0x90, 0x6, 0x7, 0x0, 0x24, 0x7, 0xA2, 0x0, 0x17, 0x4, 0xD6, 0x0, 0x49, 0x5, 0xA9, 0x0, 0x95, 0x5, 0xAA, 0x0, 0x2D, 0x5, 0xA, 0x0, 0x3A, 0x6, 0x60, 0x0, 0x4F, 0x5, 0xF9, 0x0, 0x93, 0x5, 0x89, 0x0, 0x8E, 0x7, 0x9C, 0x0, 0x99, 0x7, 0xFA, 0x0, 0x99, 0x6, 0x1A, 0x0, 0x18, 0x6, 0xF9, 0x0, 0x9C, 0x5, 0x7, 0x0, 0x91, 0x5, 0x51, 0x0, 0x6B, 0x7, 0x54, 0x0, 0xA0, 0x4, 0xF7, 0x0, 0x21, 0x4, 0x7D, 0x0, 0x5B, 0x4, 0x90, 0x0, 0x8F, 0x3, 0x5B, 0x0, 0x85, 0x4, 0xF7, 0x0, 0x27, 0x6, 0x77, 0x0, 0x1E, 0x4, 0x17, 0x0, 0x4E, 0x4, 0x98, 0x0, 0x86, 0x4, 0x6F, 0x0, 0x8F, 0x4, 0x9A, 0x0, 0x22, 0x6, 0x3, 0x0, 0x8F, 0x4, 0x98, 0x0, 0x86, 0x4, 0x98, 0x0, 0x86, 0x3, 0xF6, 0x0, 0x24, 0x5, 0xD3, 0x0, 0x54, 0x4, 0xD4, 0x0, 0x86, 0x4, 0x66, 0x0, 0x5F, 0x6, 0x8F, 0x0, 0x86, 0x6, 0xEC, 0x0, 0x7F, 0x5, 0x18, 0x0, 0x1F, 0x6, 0x6F, 0x0, 0x8F, 0x4, 0x69, 0x0, 0x8F, 0x4, 0x3D, 0x0, 0x52, 0x6, 0x84, 0x0, 0x91, 0x4, 0x70, 0x0, 0x27, 0x4, 0x71, 0xFF, 0xDA, 0x4, 0x3D, 0x0, 0x54, 0x6, 0xD2, 0x0, 0x1F, 0x6, 0xE4, 0x0, 0x86, 0x4, 0x89, 0xFF, 0xEE, 0x4, 0x98, 0x0, 0x86, 0x7, 0x49, 0x0, 0x89, 0x6, 0x50, 0x0, 0x70, 0x4, 0x68, 0xFF, 0xDF, 0x7, 0x29, 0x0, 0x99, 0x6, 0x1, 0x0, 0x87, 0x5, 0xC, 0x0, 0x1D, 0x4, 0x61, 0x0, 0xA, 0x7, 0x42, 0x0, 0xAD, 0x6, 0x36, 0x0, 0x9E, 0x6, 0xEE, 0x0, 0x80, 0x5, 0xE7, 0x0, 0x83, 0x9, 0x33, 0x0, 0xA4, 0x7, 0xFA, 0x0, 0x90, 0x4, 0x21, 0x0, 0x29, 0x3, 0xF0, 0x0, 0x33, 0x5, 0x7B, 0x0, 0x5F, 0x4, 0x89, 0x0, 0x4F, 0x5, 0x1A, 0x0, 0x10, 0x4, 0xF, 0x0, 0x21, 0x5, 0x7B, 0x0, 0x5F, 0x4, 0x89, 0x0, 0x50, 0x7, 0x45, 0x0, 0x89, 0x6, 0x45, 0x0, 0x74, 0x7, 0x49, 0x0, 0x89, 0x6, 0x50, 0x0, 0x70, 0x5, 0x1B, 0x0, 0x67, 0x4, 0x4A, 0x0, 0x5C, 0x5, 0x0, 0x0, 0x6E, 0x0, 0x0, 0xFC, 0x65, 0x0, 0x0, 0xFC, 0x72, 0x0, 0x0, 0xFD, 0x7A, 0x0, 0x0, 0xFD, 0xA5, 0x0, 0x0, 0xFC, 0x2D, 0x0, 0x0, 0xFA, 0x24, 0x0, 0x0, 0xFA, 0x4C, 0x6, 0x2A, 0x0, 0x95, 0x5, 0x1B, 0x0, 0x86, 0x4, 0x68, 0xFF, 0xDF, 0x5, 0x14, 0x0, 0x95, 0x4, 0x87, 0x0, 0x7D, 0x4, 0x6A, 0x0, 0x90, 0x3, 0xA2, 0x0, 0x7F, 0x4, 0xF2, 0x0, 0x9B, 0x4, 0x21, 0x0, 0x7F, 0x8, 0x1C, 0x0, 0x17, 0x6, 0xD3, 0x0, 0x1E, 0x5, 0xCC, 0x0, 0x9B, 0x4, 0xFA, 0x0, 0x8F, 0x5, 0x2D, 0x0, 0x91, 0x4, 0xAB, 0x0, 0x8E, 0x6, 0x96, 0x0, 0x34, 0x5, 0xA4, 0x0, 0x3E, 0x6, 0x28, 0x0, 0x95, 0x5, 0xD, 0x0, 0x86, 0x7, 0xD1, 0x0, 0x95, 0x5, 0xAB, 0x0, 0x7F, 0x8, 0x47, 0x0, 0x9B, 0x6, 0xF5, 0x0, 0x7F, 0x6, 0x2B, 0x0, 0x67, 0x5, 0x0, 0x0, 0x61, 0x5, 0x39, 0x0, 0x29, 0x4, 0x46, 0x0, 0x1F, 0x7, 0x32, 0x0, 0x2E, 0x5, 0x71, 0x0, 0x26, 0x5, 0xFB, 0x0, 0x8E, 0x4, 0xDC, 0x0, 0x5F, 0x5, 0x75, 0x0, 0x81, 0x4, 0x73, 0x0, 0x74, 0x5, 0x87, 0x0, 0x85, 0x6, 0x24, 0x0, 0x17, 0x4, 0xC4, 0xFF, 0xCA, 0x5, 0x21, 0x0, 0x91, 0x4, 0x79, 0x0, 0x8E, 0x6, 0x28, 0x0, 0x2D, 0x5, 0x1D, 0x0, 0x22, 0x5, 0xB0, 0x0, 0x9B, 0x4, 0x89, 0x0, 0x7F, 0x6, 0x35, 0x0, 0x95, 0x5, 0x1A, 0x0, 0x86, 0x7, 0x7E, 0x0, 0x95, 0x6, 0x78, 0x0, 0x8F, 0x5, 0x89, 0x0, 0x51, 0x4, 0xA6, 0x0, 0x5C, 0x4, 0xA7, 0x0, 0x5E, 0x4, 0xC7, 0x0, 0x32, 0x3, 0xAF, 0x0, 0x2C, 0x5, 0x67, 0x0, 0x29, 0x4, 0x74, 0x0, 0x1F, 0x5, 0x7, 0x0, 0x52, 0x6, 0xF2, 0x0, 0x68, 0x6, 0xDE, 0x0, 0x5F, 0x6, 0x53, 0x0, 0x3C, 0x5, 0x29, 0x0, 0x30, 0x4, 0x7B, 0x0, 0x49, 0x4, 0x3F, 0x0, 0x75, 0x7, 0xBE, 0x0, 0x43, 0x6, 0x9E, 0x0, 0x41, 0x7, 0xFE, 0x0, 0x94, 0x6, 0x9F, 0x0, 0x77, 0x5, 0x4, 0x0, 0x5D, 0x4, 0x2D, 0x0, 0x55, 0x5, 0xAA, 0x0, 0x22, 0x5, 0x1E, 0x0, 0x45, 0x5, 0x56, 0x0, 0x82, 0x6, 0x49, 0x0, 0x2D, 0x5, 0x3E, 0x0, 0x22, 0x7, 0xAE, 0x0, 0x2D, 0x6, 0x1C, 0x0, 0x22, 0x7, 0x1F, 0x0, 0x95, 0x6, 0x37, 0x0, 0x7D, 0x7, 0x76, 0x0, 0x43, 0x6, 0xE5, 0x0, 0x27, 0x5, 0x27, 0x0, 0x9B, 0x4, 0x6F, 0x0, 0x8F, 0x8, 0xC6, 0x0, 0x2D, 0x7, 0x1C, 0x0, 0x22, 0x8, 0xD7, 0x0, 0x9B, 0x7, 0x19, 0x0, 0x86, 0x6, 0x23, 0x0, 0x9B, 0x5, 0xE, 0x0, 0x86, 0x5, 0xFD, 0x0, 0x85, 0x4, 0xF5, 0x0, 0x7A, 0x6, 0x10, 0x0, 0xD, 0x5, 0xB, 0x0, 0xD, 0xA, 0xC2, 0x0, 0x24, 0x9, 0x5, 0x0, 0x27, 0x6, 0x1C, 0x0, 0x3A, 0x4, 0xFA, 0x0, 0x2B, 0x6, 0x1B, 0x0, 0x2D, 0x5, 0x10, 0x0, 0x22, 0x0, 0x0, 0xFB, 0x6C, 0x0, 0x0, 0xFB, 0xAF, 0x0, 0x0, 0xFB, 0xD1, 0x0, 0x0, 0xFC, 0x8A, 0x0, 0x0, 0xFC, 0x25, 0x0, 0x0, 0xFB, 0xA6, 0x0, 0x0, 0xFB, 0x4C, 0x0, 0x0, 0xFD, 0x5B, 0x0, 0x0, 0xFC, 0x76, 0x0, 0x0, 0xFD, 0x5B, 0x0, 0x0, 0xFD, 0x57, 0x0, 0x0, 0xFB, 0xAA, 0x0, 0x0, 0xFA, 0xED, 0x0, 0x0, 0xFB, 0x9D, 0x0, 0x0, 0xFA, 0xEF, 0x4, 0xA0, 0x0, 0x8, 0x6, 0x47, 0xFF, 0xF0, 0x6, 0xC1, 0x0, 0x3D, 0x5, 0x17, 0x0, 0x1B, 0x4, 0x55, 0x0, 0x50, 0x4, 0x8A, 0x0, 0x86, 0x4, 0xEE, 0x0, 0x2D, 0x4, 0xA, 0x0, 0x86, 0x4, 0x17, 0x0, 0x4E, 0x2, 0x7, 0x0, 0x7A, 0x3, 0xF0, 0x0, 0x1A, 0x4, 0x6D, 0x0, 0x84, 0x3, 0xB4, 0x0, 0x2D, 0x5, 0xEB, 0x0, 0x86, 0x4, 0x98, 0x0, 0x85, 0x4, 0x9E, 0x0, 0x50, 0x4, 0x31, 0x0, 0x3B, 0x5, 0x2, 0x0, 0x50, 0x5, 0x2, 0x0, 0x50, 0x5, 0x8F, 0x0, 0x25, 0x7, 0x3E, 0x0, 0x4C, 0x3, 0xE6, 0x0, 0x4F, 0x4, 0x9B, 0x0, 0x4F, 0x4, 0x9B, 0x0, 0x4F, 0x4, 0x6C, 0x0, 0x8F, 0x4, 0x7A, 0x0, 0x31, 0x4, 0x7A, 0x0, 0x31, 0x3, 0xF6, 0x0, 0x25, 0x4, 0xF2, 0x0, 0x7A, 0x4, 0xF6, 0x0, 0x5B, 0x6, 0x5C, 0x0, 0x5B, 0x4, 0xF6, 0x0, 0x5B, 0x3, 0xF7, 0x0, 0x1A, 0x5, 0xF4, 0x0, 0x25, 0x4, 0x7, 0x0, 0x56, 0x4, 0x7, 0x0, 0x4E, 0x4, 0x25, 0x0, 0x56, 0x4, 0xCA, 0x0, 0x39, 0x3, 0x65, 0x0, 0x8F, 0x4, 0xA0, 0x0, 0x8, 0x4, 0xAB, 0x0, 0x8F, 0x4, 0x6C, 0x0, 0x8F, 0x5, 0x52, 0x0, 0x2D, 0x4, 0xA4, 0x0, 0x22, 0x4, 0x2F, 0x0, 0x1B, 0x5, 0xB2, 0x0, 0x1B, 0x3, 0xD1, 0x0, 0x64, 0x4, 0xA9, 0x0, 0x1B, 0x3, 0xE3, 0x0, 0x64, 0x3, 0x65, 0x0, 0x64, 0x3, 0x65, 0x0, 0x35, 0x3, 0xF9, 0x0, 0x3C, 0x4, 0x40, 0x0, 0x64, 0x1, 0xC1, 0x0, 0x7F, 0x3, 0x55, 0x0, 0x28, 0x3, 0xE1, 0x0, 0x64, 0x3, 0x33, 0x0, 0x64, 0x5, 0x38, 0x0, 0x64, 0x4, 0x3D, 0x0, 0x64, 0x4, 0x3D, 0x0, 0x64, 0x4, 0xC, 0x0, 0x3C, 0x3, 0x78, 0x0, 0x3C, 0x3, 0xC7, 0x0, 0x64, 0x3, 0xDA, 0x0, 0x64, 0x3, 0xA2, 0x0, 0x28, 0x3, 0xF5, 0x0, 0x64, 0x5, 0x74, 0x0, 0x35, 0x3, 0x56, 0x0, 0x3C, 0x3, 0x56, 0x0, 0x56, 0x3, 0xA6, 0x0, 0x3C, 0x5, 0x33, 0x0, 0x3C, 0x3, 0x79, 0x0, 0x64, 0x3, 0x79, 0x0, 0x3C, 0x3, 0x52, 0x0, 0x3C, 0x3, 0x52, 0x0, 0x3C, 0x3, 0x24, 0x0, 0x3C, 0x3, 0x24, 0x0, 0x3C, 0x3, 0x7A, 0x0, 0x3C, 0x1, 0xD4, 0x0, 0x78, 0x3, 0x52, 0x0, 0x64, 0x5, 0x30, 0x0, 0x64, 0x3, 0x5E, 0x0, 0x64, 0x3, 0x6E, 0x0, 0x3C, 0x2, 0xBF, 0x0, 0x28, 0x3, 0x46, 0x0, 0x28, 0x3, 0x46, 0x0, 0x28, 0x3, 0x79, 0x0, 0x64, 0x2, 0x2E, 0x0, 0x28, 0x3, 0x5E, 0x0, 0x64, 0x3, 0xA6, 0x0, 0x3C, 0x5, 0x30, 0x0, 0x64, 0x3, 0x33, 0x0, 0x28, 0x3, 0xA2, 0x0, 0x35, 0x3, 0xA9, 0x0, 0x64, 0x3, 0x5A, 0x0, 0x28, 0x3, 0x60, 0x0, 0x3C, 0x4, 0x68, 0x0, 0x3C, 0x3, 0x88, 0x0, 0x35, 0x1, 0xD4, 0x0, 0x78, 0x2, 0x3A, 0x0, 0x64, 0x3, 0x5E, 0x0, 0x64, 0x3, 0x33, 0x0, 0x28, 0x3, 0xA9, 0x0, 0x64, 0x3, 0x5A, 0x0, 0x28, 0x3, 0x75, 0x0, 0x64, 0x4, 0x68, 0x0, 0x3C, 0x3, 0xA2, 0x0, 0x42, 0x6, 0xFC, 0x0, 0x77, 0x5, 0xF, 0xFF, 0xEC, 0x4, 0xFF, 0x0, 0x50, 0x3, 0x56, 0x0, 0x13, 0x7, 0xD7, 0x0, 0x14, 0x5, 0x4D, 0x0, 0x14, 0x4, 0xF1, 0xFF, 0xE6, 0x3, 0x57, 0xFF, 0xDD, 0x3, 0x1D, 0xFF, 0xFC, 0x4, 0x51, 0x0, 0x27, 0x3, 0x1D, 0xFF, 0xE2, 0x4, 0x28, 0x0, 0x2D, 0x4, 0x89, 0x0, 0x7C, 0x4, 0x40, 0x0, 0x64, 0x4, 0x63, 0x0, 0x3D, 0x6, 0xE1, 0x0, 0x22, 0x2, 0xC6, 0x0, 0x14, 0x2, 0xE5, 0x0, 0x14, 0x5, 0x17, 0x0, 0x18, 0x5, 0x5F, 0x0, 0x18, 0x4, 0xF0, 0x0, 0x18, 0x4, 0x82, 0x0, 0x7D, 0x4, 0xCC, 0x0, 0x50, 0x2, 0xD6, 0x0, 0x2D, 0x5, 0xBB, 0x0, 0x51, 0x4, 0x64, 0x0, 0x7D, 0x2, 0x56, 0x0, 0x82, 0x7, 0x43, 0x0, 0x7D, 0x4, 0xC6, 0x0, 0x7D, 0x4, 0x81, 0x0, 0x7D, 0x2, 0xD0, 0x0, 0x64, 0x4, 0x22, 0x0, 0x4C, 0x3, 0xA4, 0x0, 0x1B, 0x3, 0xF6, 0x0, 0x17, 0x4, 0x1C, 0x0, 0x1F, 0x4, 0x7, 0x0, 0x52, 0x4, 0xD5, 0x0, 0x5B, 0x5, 0x2A, 0x0, 0x50, 0x4, 0xAE, 0x0, 0x4E, 0x4, 0x79, 0x0, 0x54, 0x4, 0x8C, 0x0, 0x61, 0x4, 0x5A, 0x0, 0x4D, 0x5, 0x77, 0x0, 0x47, 0x2, 0x8A, 0x0, 0x7D, 0x4, 0x38, 0x0, 0x3B, 0x3, 0x4C, 0x0, 0x1B, 0x5, 0xF, 0x0, 0x77, 0x4, 0xA7, 0x0, 0x5E, 0x3, 0xAC, 0x0, 0x41, 0x3, 0x31, 0x0, 0x3C, 0x3, 0x7C, 0x0, 0x3C, 0x3, 0x83, 0x0, 0x3C, 0x3, 0xF, 0x0, 0x32, 0x2, 0x5C, 0x0, 0x35, 0x2, 0x75, 0x0, 0x33, 0x3, 0x7A, 0x0, 0x3C, 0x3, 0x5E, 0x0, 0x64, 0x2, 0x6A, 0x0, 0x28, 0x2, 0x4, 0x0, 0x64, 0x2, 0x6A, 0x0, 0x3F, 0x2, 0x6A, 0x0, 0x28, 0x2, 0xB2, 0x0, 0x0, 0x1, 0xEA, 0x0, 0x64, 0x1, 0xF8, 0x0, 0x64, 0x2, 0xE7, 0x0, 0x65, 0x5, 0x2E, 0x0, 0x64, 0x5, 0x2E, 0x0, 0x64, 0x3, 0xA0, 0x0, 0x1A, 0x3, 0xAD, 0x0, 0x64, 0x3, 0xE7, 0x0, 0x64, 0x3, 0x6E, 0x0, 0x3C, 0x4, 0x6D, 0x0, 0x3C, 0x3, 0x1B, 0x0, 0x3C, 0x2, 0x1E, 0x0, 0x1A, 0x2, 0x47, 0x0, 0x28, 0x3, 0xB2, 0x0, 0x28, 0x3, 0xD0, 0x0, 0x4C, 0x3, 0xBA, 0x0, 0x5B, 0x3, 0x68, 0x0, 0x5B, 0x3, 0x23, 0x0, 0x1C, 0x2, 0xE4, 0x0, 0x2E, 0x3, 0x47, 0x0, 0x2E, 0x3, 0xAE, 0x0, 0x2E, 0x3, 0x67, 0x0, 0x33, 0x3, 0xA1, 0x0, 0x58, 0x0, 0x0, 0xFB, 0xCE, 0x0, 0x0, 0xFB, 0xCB, 0x0, 0x0, 0xFD, 0xA, 0x0, 0x0, 0xFC, 0xCB, 0x0, 0x0, 0xFC, 0xDE, 0x0, 0x0, 0xFC, 0x3C, 0x0, 0x0, 0xFC, 0xA4, 0x0, 0x0, 0xFC, 0x6E, 0x0, 0x0, 0xFC, 0x22, 0x0, 0x0, 0xFC, 0x60, 0x0, 0x0, 0xFD, 0x44, 0x0, 0x0, 0xFB, 0x61, 0x0, 0x0, 0xFB, 0x3D, 0x0, 0x0, 0xFC, 0x9F, 0x0, 0x0, 0xFD, 0x2F, 0x0, 0x0, 0xFC, 0xD6, 0x0, 0x0, 0xFC, 0xC9, 0x0, 0x0, 0xFC, 0x94, 0x0, 0x0, 0xFC, 0x9B, 0x0, 0x0, 0xFC, 0x3D, 0x0, 0x0, 0xFC, 0x1F, 0x0, 0x0, 0xFC, 0x19, 0x0, 0x0, 0xFC, 0x13, 0x0, 0x0, 0xFC, 0xCC, 0x0, 0x0, 0xFC, 0xAA, 0x0, 0x0, 0xFC, 0xAA, 0x0, 0x0, 0xFC, 0xB8, 0x0, 0x0, 0xFC, 0xAA, 0x0, 0x0, 0xFC, 0xD2, 0x0, 0x0, 0xFD, 0x71, 0x0, 0x0, 0xFD, 0xB, 0x0, 0x0, 0xFC, 0x65, 0x0, 0x0, 0xFC, 0xC9, 0x0, 0x0, 0xFC, 0x97, 0x0, 0x0, 0xFC, 0xBB, 0x0, 0x0, 0xFD, 0x1, 0x0, 0x0, 0xFC, 0xC3, 0x0, 0x0, 0xFD, 0x6B, 0x0, 0x0, 0xFC, 0xD8, 0x0, 0x0, 0xFC, 0x9B, 0x0, 0x0, 0xFC, 0xBA, 0x0, 0x0, 0xFC, 0xAD, 0x0, 0x0, 0xFC, 0xBF, 0x0, 0x0, 0xFD, 0xD, 0x0, 0x0, 0xFC, 0xFB, 0x0, 0x0, 0xFC, 0x75, 0x0, 0x0, 0xFC, 0xB9, 0x0, 0x0, 0xFC, 0xE5, 0x0, 0x0, 0xFC, 0x6E, 0x0, 0x0, 0xFC, 0x40, 0x0, 0x0, 0xFC, 0xD0, 0x0, 0x0, 0xFC, 0xB1, 0x0, 0x0, 0xFC, 0xC9, 0x0, 0x0, 0xFC, 0xDB, 0x0, 0x0, 0xFD, 0x23, 0x0, 0x0, 0xFC, 0x55, 0x0, 0x0, 0xFC, 0x46, 0x0, 0x0, 0xFA, 0xEF, 0x5, 0xB0, 0x0, 0x95, 0x4, 0x71, 0x0, 0x7A, 0x2, 0xF1, 0x0, 0xA, 0x2, 0xEB, 0x0, 0x6, 0x2, 0xE6, 0x0, 0x14, 0x2, 0xE1, 0x0, 0xE, 0x2, 0xD6, 0x0, 0xD2, 0x2, 0xEB, 0x0, 0x41, 0x2, 0xD6, 0x0, 0x2D, 0x5, 0x4B, 0x0, 0x74, 0x4, 0x89, 0x0, 0x54, 0x6, 0x1F, 0x0, 0x95, 0x4, 0x6B, 0x0, 0x1B, 0x4, 0x9A, 0x0, 0x66, 0x4, 0x5F, 0x0, 0x4E, 0x5, 0x73, 0x0, 0x1C, 0x4, 0xA9, 0x0, 0x1B, 0x1, 0xF1, 0x0, 0x5B, 0x1, 0xC4, 0x0, 0x73, 0x2, 0x2, 0x0, 0x5B, 0x3, 0x6D, 0x0, 0x4B, 0x3, 0xB4, 0x0, 0x6F, 0x3, 0x1F, 0x0, 0x5B, 0x3, 0xB, 0x0, 0x5B, 0x3, 0x15, 0x0, 0x6F, 0x2, 0xFA, 0x0, 0x68, 0x3, 0x2C, 0x0, 0x68, 0x3, 0x15, 0x0, 0x6F, 0x3, 0xB4, 0x0, 0x6F, 0x3, 0xB4, 0x0, 0x6F, 0x2, 0x0, 0x0, 0x66, 0x2, 0x0, 0x0, 0x64, 0x1, 0xF1, 0x0, 0x69, 0x4, 0x14, 0x0, 0x0, 0x8, 0x29, 0x0, 0x0, 0x4, 0x14, 0x0, 0x0, 0x8, 0x29, 0x0, 0x0, 0x2, 0xB9, 0x0, 0x0, 0x2, 0xA, 0x0, 0x0, 0x1, 0x5C, 0x0, 0x0, 0x4, 0x7F, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x1, 0xA2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xD1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFD, 0x68, 0x0, 0x0, 0xFC, 0x94, 0x0, 0x0, 0xFC, 0xAD, 0x0, 0x0, 0xFC, 0x5E, 0x2, 0xA1, 0x0, 0x47, 0x2, 0xA1, 0x0, 0x47, 0x4, 0x83, 0x0, 0x9F, 0x5, 0x29, 0x0, 0x9D, 0x6, 0x30, 0x0, 0x82, 0x3, 0x37, 0x0, 0xAB, 0x3, 0x9D, 0x0, 0x4, 0x1, 0xC0, 0x0, 0x64, 0x1, 0xBC, 0x0, 0x34, 0x1, 0xCE, 0x0, 0x32, 0x1, 0xA8, 0x0, 0x4B, 0x3, 0x14, 0x0, 0x6D, 0x3, 0x1C, 0x0, 0x41, 0x3, 0x8, 0x0, 0x32, 0x3, 0x35, 0x0, 0x4F, 0x4, 0x5D, 0x0, 0x41, 0x4, 0x9A, 0x0, 0x5D, 0x2, 0xCC, 0x0, 0x88, 0x4, 0x5E, 0x0, 0x98, 0x2, 0x2A, 0x0, 0x85, 0x3, 0xFA, 0x0, 0x8C, 0x5, 0xA6, 0x0, 0x8C, 0x1, 0xC8, 0x0, 0x5B, 0x7, 0xA8, 0x0, 0x4B, 0x9, 0x5F, 0x0, 0x4B, 0x4, 0xF7, 0x0, 0x4C, 0x2, 0x1B, 0x0, 0x4C, 0x3, 0x91, 0x0, 0x50, 0x4, 0xF8, 0x0, 0x50, 0x3, 0x79, 0x0, 0x30, 0x2, 0x73, 0x0, 0x6C, 0x2, 0x69, 0x0, 0x55, 0x5, 0x44, 0x0, 0x4A, 0x3, 0xC3, 0x0, 0x2C, 0x3, 0xB0, 0x0, 0xD, 0x6, 0x23, 0x0, 0xB, 0x6, 0x23, 0x0, 0xB, 0x3, 0x54, 0x0, 0x3B, 0x5, 0x58, 0x0, 0x50, 0x3, 0x6D, 0x0, 0x54, 0x3, 0x9C, 0x0, 0x2D, 0x2, 0x8F, 0x0, 0x99, 0x2, 0x90, 0x0, 0x5E, 0x3, 0xB2, 0x0, 0x3C, 0x4, 0x11, 0x0, 0x84, 0x4, 0xE7, 0x0, 0x66, 0x4, 0xE7, 0x0, 0x66, 0x3, 0xC3, 0x0, 0x3E, 0x2, 0x20, 0x0, 0x84, 0x6, 0x23, 0x0, 0xB, 0x3, 0xE7, 0x0, 0x50, 0x3, 0xD7, 0x0, 0x43, 0x5, 0x7E, 0x0, 0x50, 0x6, 0x23, 0x0, 0xB, 0x5, 0x24, 0x0, 0xC0, 0x3, 0xCA, 0x0, 0x43, 0x6, 0x63, 0x0, 0x50, 0x4, 0xFC, 0x0, 0x43, 0x4, 0x9F, 0x0, 0x43, 0x1, 0xB3, 0x0, 0x43, 0x4, 0x94, 0x0, 0x43, 0x4, 0xB8, 0x0, 0x43, 0x1, 0xB3, 0x0, 0x43, 0x1, 0xB3, 0x0, 0x43, 0x2, 0xF6, 0x0, 0x4C, 0x1, 0xD7, 0x0, 0x79, 0x2, 0xF6, 0x0, 0x35, 0x2, 0xF6, 0x0, 0x4F, 0x2, 0xF6, 0x0, 0x4E, 0x2, 0xF6, 0x0, 0x37, 0x2, 0xF6, 0x0, 0x4C, 0x2, 0xF6, 0x0, 0x47, 0x3, 0x3C, 0x0, 0x50, 0x2, 0xF9, 0x0, 0x50, 0x2, 0xF9, 0x0, 0x50, 0x2, 0x0, 0x0, 0x50, 0x2, 0x0, 0x0, 0x50, 0x3, 0x5D, 0x0, 0x6A, 0x2, 0xF6, 0x0, 0x4C, 0x2, 0xF6, 0x0, 0x81, 0x2, 0xF6, 0x0, 0x3C, 0x2, 0xF6, 0x0, 0x37, 0x2, 0xF6, 0x0, 0x35, 0x2, 0xF6, 0x0, 0x4F, 0x2, 0xF6, 0x0, 0x4E, 0x2, 0xF6, 0x0, 0x37, 0x2, 0xF6, 0x0, 0x4C, 0x2, 0xF6, 0x0, 0x47, 0x3, 0x3C, 0x0, 0x50, 0x2, 0xF9, 0x0, 0x50, 0x2, 0xF9, 0x0, 0x50, 0x2, 0x0, 0x0, 0x50, 0x2, 0x0, 0x0, 0x50, 0x3, 0x56, 0x0, 0x3C, 0x3, 0x52, 0x0, 0x3C, 0x3, 0x6E, 0x0, 0x3C, 0x3, 0x3A, 0x0, 0x28, 0x3, 0x52, 0x0, 0x3C, 0x3, 0x5E, 0x0, 0x64, 0x3, 0x52, 0x0, 0x64, 0x1, 0xB5, 0x0, 0x78, 0x5, 0x30, 0x0, 0x64, 0x3, 0x5E, 0x0, 0x64, 0x3, 0x79, 0x0, 0x64, 0x3, 0x1B, 0x0, 0x3C, 0x2, 0x2E, 0x0, 0x28, 0x5, 0x7B, 0x0, 0x58, 0x5, 0x39, 0x0, 0x66, 0x5, 0x39, 0x0, 0x66, 0x4, 0xB6, 0x0, 0x60, 0x6, 0xF7, 0x0, 0x7D, 0x6, 0x71, 0x0, 0x22, 0x6, 0xB8, 0x0, 0x99, 0x8, 0x94, 0x0, 0x95, 0x6, 0x29, 0x0, 0x22, 0x6, 0x8D, 0x0, 0x7D, 0x4, 0x8C, 0x0, 0x5E, 0x5, 0xA3, 0x0, 0x22, 0x4, 0xDC, 0x0, 0x2D, 0xA, 0x74, 0x0, 0x35, 0x5, 0x1F, 0x0, 0x22, 0x5, 0xF6, 0x0, 0x22, 0x5, 0x73, 0x0, 0x69, 0x5, 0x82, 0x0, 0x22, 0x4, 0xCF, 0x0, 0x43, 0x5, 0x39, 0x0, 0x65, 0x4, 0x56, 0x0, 0x22, 0x5, 0x29, 0x0, 0x35, 0x4, 0xDC, 0x0, 0x2D, 0x4, 0x34, 0x0, 0x28, 0x4, 0xA3, 0x0, 0x22, 0x6, 0x97, 0x0, 0x28, 0x5, 0x5F, 0x0, 0x50, 0x5, 0x7D, 0x0, 0x29, 0x5, 0x86, 0x0, 0x66, 0x0, 0x0, 0xFB, 0x5B, 0x0, 0x0, 0xFA, 0x85, 0x0, 0x0, 0xFB, 0x5B, 0x0, 0x0, 0xFC, 0x54, 0x6, 0x1C, 0x0, 0x6A, 0x6, 0xF, 0x0, 0x6A, 0x7, 0x20, 0x0, 0x28, 0x5, 0xE5, 0x0, 0x71, 0x6, 0x9, 0x0, 0x6A, 0x6, 0x8A, 0x0, 0x28, 0x3, 0xE3, 0x0, 0x4C, 0x8, 0x2F, 0x0, 0x90, 0x6, 0x38, 0x0, 0x56, 0x5, 0x87, 0x0, 0x95, 0x4, 0xFF, 0x0, 0x95, 0x5, 0x18, 0x0, 0x65, 0x5, 0xB0, 0x0, 0x65, 0x5, 0x9, 0x0, 0x6E, 0x5, 0x2D, 0x0, 0x12, 0x4, 0x9E, 0x0, 0x51, 0x5, 0x11, 0x0, 0x95, 0x5, 0x52, 0x0, 0x12, 0x5, 0x15, 0x0, 0x96, 0x4, 0x66, 0x0, 0x35, 0x6, 0x48, 0x0, 0x65, 0x8, 0xA, 0x0, 0x6A, 0x8, 0xF, 0x0, 0x57, 0x7, 0x6, 0x0, 0x93, 0x6, 0xF1, 0x0, 0x93, 0x8, 0xF5, 0x0, 0x93, 0x7, 0x4, 0x0, 0x93, 0x7, 0xCE, 0x0, 0x58, 0x6, 0xF3, 0x0, 0x93, 0x7, 0xA6, 0x0, 0x58, 0x7, 0x79, 0x0, 0x5B, 0x7, 0xE9, 0x0, 0x52, 0x6, 0xDC, 0x0, 0x93, 0x7, 0x2A, 0x0, 0x51, 0x6, 0x35, 0x0, 0x59, 0x6, 0xDD, 0x0, 0x54, 0x6, 0xD1, 0x0, 0x5B, 0x6, 0xA2, 0x0, 0x59, 0x5, 0x0, 0x0, 0x93, 0x2, 0x44, 0x0, 0xA4, 0x4, 0x61, 0x0, 0xA4, 0x6, 0x7E, 0x0, 0xA4, 0x7, 0x68, 0x0, 0xA4, 0x5, 0x2F, 0x0, 0x12, 0x7, 0x68, 0x0, 0x12, 0x9, 0x86, 0x0, 0x12, 0xB, 0xA3, 0x0, 0x12, 0x7, 0x59, 0x0, 0xA4, 0x5, 0x11, 0x0, 0x28, 0x7, 0x5F, 0x0, 0x28, 0x9, 0x7D, 0x0, 0x28, 0x4, 0x64, 0x0, 0xA4, 0x5, 0x38, 0x0, 0x65, 0x5, 0x42, 0x0, 0xA4, 0x7, 0x1D, 0x0, 0xA4, 0x2, 0xF, 0x0, 0x7E, 0x4, 0x1B, 0x0, 0x7E, 0x6, 0x27, 0x0, 0x7E, 0x6, 0x1, 0x0, 0x7E, 0x3, 0xF7, 0x0, 0x1A, 0x6, 0x7, 0x0, 0x1A, 0x8, 0x13, 0x0, 0x1A, 0xA, 0x1F, 0x0, 0x1A, 0x6, 0x18, 0x0, 0x7E, 0x4, 0xE, 0x0, 0x22, 0x6, 0x19, 0x0, 0x22, 0x8, 0x25, 0x0, 0x22, 0x1, 0xEF, 0x0, 0x7E, 0x4, 0x3E, 0x0, 0x50, 0x4, 0x82, 0x0, 0x50, 0x6, 0xF6, 0x0, 0x7E, 0x7, 0x34, 0x0, 0x68, 0x5, 0x5E, 0x0, 0x99, 0x7, 0xF1, 0x0, 0x6A, 0x5, 0x33, 0x0, 0x4D, 0x4, 0x31, 0x0, 0x3B, 0x5, 0x33, 0x0, 0x66, 0x6, 0x4C, 0x0, 0x3C, 0x5, 0x63, 0x0, 0x99, 0x8, 0xA1, 0x0, 0x6A, 0x6, 0xFE, 0x0, 0x46, 0x4, 0x91, 0x0, 0x62, 0x5, 0x96, 0x0, 0xA6, 0x4, 0xDA, 0x0, 0x41, 0x4, 0x83, 0x0, 0x9F, 0x4, 0xB3, 0x0, 0x3C, 0x8, 0x45, 0x0, 0x5E, 0x2, 0x2E, 0xFF, 0xAF, 0x4, 0x8F, 0x0, 0x65, 0x4, 0x7A, 0x0, 0x91, 0x4, 0x11, 0x0, 0x3C, 0x4, 0x2A, 0x0, 0x80, 0x5, 0x4F, 0x0, 0x45, 0x4, 0xD, 0x0, 0x24, 0x3, 0xFA, 0x0, 0x99, 0x3, 0xFA, 0x0, 0x52, 0x2, 0xFF, 0x0, 0x40, 0x2, 0xFF, 0x0, 0x67, 0x4, 0xB2, 0x0, 0x40, 0x4, 0xB2, 0x0, 0x67, 0x3, 0xC0, 0x0, 0x99, 0x3, 0xC0, 0x0, 0x5A, 0x2, 0x93, 0x0, 0x99, 0x2, 0x93, 0x0, 0x54, 0x3, 0x1A, 0x0, 0x50, 0x3, 0x1A, 0x0, 0x50, 0x5, 0x52, 0x0, 0x50, 0x5, 0xF, 0x0, 0x34, 0x4, 0xCF, 0x0, 0x50, 0x4, 0xCF, 0x0, 0x50, 0x4, 0xBC, 0x0, 0x50, 0x4, 0xBC, 0x0, 0x50, 0x4, 0xA8, 0x0, 0x21, 0x2, 0xE0, 0x0, 0x21, 0x4, 0xD6, 0x0, 0x5, 0x5, 0x5E, 0x0, 0x21, 0x4, 0xFF, 0x0, 0x95, 0x4, 0x55, 0x0, 0x5B, 0x2, 0xF5, 0x0, 0x8, 0x6, 0x28, 0x0, 0x95, 0x4, 0xF5, 0x0, 0x7A, 0x5, 0x62, 0x0, 0x95, 0x4, 0x9C, 0x0, 0x7D, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x20, 0x0, 0x52, 0x6, 0xD, 0x0, 0x66, 0x7, 0x1, 0x0, 0x95, 0x5, 0x55, 0x0, 0x12, 0x6, 0xD, 0x0, 0x11, 0x4, 0xA4, 0x0, 0x17, 0x7, 0xF4, 0x0, 0x30, 0x6, 0xAA, 0x0, 0x22, 0x4, 0xF, 0x0, 0x31, 0x4, 0x81, 0x0, 0x95, 0x3, 0x6D, 0x0, 0x7A, 0x5, 0xD3, 0x0, 0x49, 0x5, 0x54, 0x0, 0x54, 0x2, 0xF2, 0x0, 0x28, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x15, 0x0, 0x56, 0x1, 0xF5, 0x0, 0x29, 0x3, 0x4D, 0x0, 0x28, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0xD2, 0x0, 0x4F, 0x0, 0x0, 0xFC, 0xB4, 0x0, 0x0, 0xFC, 0xD1, 0x0, 0x0, 0xFD, 0x3, 0x0, 0x0, 0xFC, 0x87, 0x0, 0x0, 0xFC, 0x16, 0x0, 0x0, 0xFC, 0xD1, 0x0, 0x0, 0xFC, 0xD4, 0x0, 0x0, 0xFC, 0x9E, 0x0, 0x0, 0xFC, 0x66, 0x0, 0x0, 0xFC, 0xC1, 0x0, 0x0, 0xFC, 0xB1, 0x0, 0x0, 0xFC, 0xC1, 0x0, 0x0, 0xFC, 0xBF, 0x0, 0x0, 0xFC, 0xC2, 0x0, 0x0, 0xFC, 0xC5, 0x0, 0x0, 0xFC, 0xD4, 0x0, 0x0, 0xFC, 0xB1, 0x0, 0x0, 0xFC, 0xAB, 0x0, 0x0, 0xFC, 0x49, 0x0, 0x0, 0xFC, 0x34, 0x0, 0x0, 0xFC, 0xB1, 0x0, 0x0, 0xFC, 0x19, 0x0, 0x0, 0xFC, 0xBF, 0x0, 0x0, 0xFC, 0xBF, 0x0, 0x0, 0xFC, 0x9C, 0x0, 0x0, 0xFC, 0x93, 0x0, 0x0, 0xFC, 0x84, 0x0, 0x0, 0xFC, 0x78, 0x0, 0x0, 0xFC, 0x7F, 0x0, 0x0, 0xFC, 0x92, 0x0, 0x0, 0xFC, 0x6C, 0x0, 0x0, 0xFB, 0xCB, 0x3, 0x49, 0x0, 0x50, 0x3, 0x49, 0x0, 0x50, 0x2, 0x83, 0x0, 0x50, 0x2, 0x83, 0x0, 0x50, 0x2, 0xCE, 0x0, 0x50, 0x3, 0x37, 0x0, 0x50, 0x5, 0x17, 0x0, 0x50, 0x5, 0x1E, 0x0, 0x50, 0x4, 0x90, 0x0, 0x50, 0x4, 0x85, 0x0, 0x50, 0x4, 0x85, 0x0, 0x50, 0x3, 0xAB, 0x0, 0x50, 0x3, 0xE2, 0x0, 0x50, 0x3, 0xE2, 0x0, 0x50, 0x5, 0xF5, 0x0, 0x5F, 0x5, 0xBB, 0x0, 0x47, 0x5, 0xB8, 0x0, 0x47, 0x5, 0xB8, 0x0, 0x45, 0x1, 0xC3, 0x0, 0x50, 0x4, 0x98, 0x0, 0x50, 0x5, 0x51, 0x0, 0x37, 0x5, 0x51, 0x0, 0x3B, 0x3, 0x6, 0x0, 0x50, 0x2, 0xCD, 0x0, 0x50, 0x3, 0xE3, 0x0, 0x48, 0x5, 0x57, 0x0, 0x57, 0x3, 0x87, 0x0, 0x64, 0x3, 0x70, 0x0, 0x46, 0x3, 0x5C, 0x0, 0x50, 0x3, 0x5C, 0x0, 0x50, 0x3, 0x70, 0x0, 0x4A, 0x3, 0x70, 0x0, 0x4A, 0x3, 0xBD, 0x0, 0x99, 0x3, 0xBC, 0x0, 0x42, 0x2, 0x39, 0x0, 0x50, 0x2, 0x39, 0x0, 0x50, 0x2, 0x39, 0x0, 0x50, 0x2, 0x39, 0x0, 0x50, 0x4, 0xB1, 0x0, 0x57, 0x4, 0xB1, 0x0, 0x4E, 0x4, 0x62, 0x0, 0x80, 0x4, 0x69, 0x0, 0x28, 0x4, 0x9F, 0x0, 0x43, 0x4, 0x9F, 0x0, 0x43, 0x4, 0x9F, 0x0, 0x43, 0x4, 0xBB, 0x0, 0x43, 0x3, 0xE5, 0x0, 0x3D, 0x1, 0xC1, 0x0, 0x50, 0x2, 0x43, 0x0, 0x46, 0x1, 0xD7, 0x0, 0x5E, 0x1, 0xDD, 0x0, 0x57, 0x1, 0xBB, 0x0, 0x50, 0x1, 0xDD, 0x0, 0x46, 0x2, 0x20, 0x0, 0x84, 0x3, 0x4F, 0x0, 0x50, 0x3, 0x54, 0x0, 0x99, 0x4, 0x7E, 0x0, 0x50, 0x4, 0xEA, 0x0, 0x5B, 0xB, 0xCA, 0x0, 0xAE, 0x11, 0x2, 0x0, 0xAE, 0x2, 0x42, 0x0, 0x50, 0x1, 0xB3, 0x0, 0x43, 0x1, 0x97, 0x0, 0x50, 0x4, 0x94, 0x0, 0x41, 0x2, 0xD6, 0x0, 0x64, 0x1, 0xE3, 0x0, 0x5B, 0x3, 0x39, 0x0, 0x5B, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x7, 0x0, 0x52, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x7, 0x0, 0x52, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x57, 0x2, 0xA0, 0x0, 0xA7, 0x2, 0xA6, 0x0, 0xAA, 0x4, 0xDF, 0x0, 0x8, 0x4, 0x55, 0x0, 0x14, 0x4, 0xCB, 0x0, 0x47, 0x4, 0xD8, 0x0, 0x47, 0x8, 0x91, 0x0, 0x68, 0x6, 0xCB, 0x0, 0x4F, 0x6, 0x1A, 0x0, 0x18, 0x5, 0x1D, 0x0, 0x1F, 0x7, 0xAA, 0xFF, 0xCF, 0x7, 0xE, 0x0, 0x1F, 0x6, 0x85, 0x0, 0x96, 0x5, 0xB7, 0x0, 0x7D, 0x7, 0x64, 0x0, 0x66, 0x6, 0xC4, 0x0, 0x50, 0x7, 0x31, 0x0, 0x96, 0x6, 0x7, 0x0, 0x7D, 0x5, 0x53, 0x0, 0x12, 0x4, 0xC8, 0x0, 0x1C, 0x6, 0xEE, 0x0, 0x80, 0x5, 0x9A, 0x0, 0x5B, 0x7, 0x31, 0x0, 0x96, 0x6, 0x63, 0x0, 0x7D, 0x5, 0xAF, 0x0, 0x1E, 0x4, 0xDC, 0x0, 0x22, 0x5, 0xF6, 0x0, 0x3B, 0x4, 0xD4, 0x0, 0x2E, 0x7, 0x63, 0x0, 0x24, 0x6, 0x8, 0x0, 0x27, 0x7, 0x4E, 0x0, 0x2D, 0x5, 0xEC, 0x0, 0x22, 0x8, 0xAC, 0x0, 0x95, 0x7, 0x3E, 0x0, 0x88, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0xDC, 0x0, 0x66, 0x5, 0x76, 0x0, 0x50, 0x9, 0x41, 0x0, 0x66, 0x7, 0x8A, 0x0, 0x50, 0x9, 0xCA, 0x0, 0x54, 0x0, 0x0, 0xFB, 0x5D, 0x0, 0x0, 0xF9, 0x94, 0x0, 0x0, 0xFB, 0x5D, 0x0, 0x0, 0xF9, 0x7A, 0x3, 0xB6, 0x0, 0x50, 0x0, 0x0, 0xFC, 0xB8, 0x0, 0x0, 0xFC, 0xBC, 0x0, 0x0, 0xFC, 0xF9, 0x0, 0x0, 0xFC, 0xA5, 0x0, 0x0, 0xFC, 0x2E, 0x0, 0x0, 0xFC, 0x67, 0x0, 0x0, 0xFC, 0xE0, 0x0, 0x0, 0xFC, 0x32, 0x0, 0x0, 0xFC, 0x75, 0x0, 0x0, 0xFC, 0x99, 0x3, 0x26, 0x0, 0x50, 0x2, 0xD6, 0x0, 0x47, 0x6, 0x7, 0x0, 0x24, 0x4, 0xF7, 0x0, 0x27, 0x4, 0xD3, 0x0, 0x4D, 0x4, 0x22, 0x0, 0x4D, 0x9, 0x7B, 0x0, 0x49, 0x7, 0xFE, 0x0, 0x4E, 0x6, 0x6A, 0x0, 0x84, 0x5, 0x65, 0x0, 0x36, 0x7, 0x1A, 0x0, 0x24, 0x5, 0xFB, 0x0, 0x27, 0x5, 0xFC, 0x0, 0x2D, 0x5, 0x7A, 0x0, 0x24, 0x4, 0xDC, 0x0, 0x2D, 0x3, 0xF8, 0x0, 0x24, 0x6, 0x2A, 0x0, 0x93, 0x5, 0x1C, 0x0, 0x87, 0x4, 0xDA, 0x0, 0x2D, 0x3, 0xF6, 0x0, 0x24, 0x6, 0xCC, 0x0, 0x1B, 0x5, 0x69, 0x0, 0x11, 0x5, 0x8A, 0x0, 0x85, 0x4, 0x80, 0x0, 0x7E, 0x7, 0xFB, 0x0, 0x93, 0x7, 0x7, 0x0, 0x7D, 0x9, 0x47, 0x0, 0x66, 0x7, 0x8D, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x3, 0xD5, 0x0, 0x28, 0x3, 0x44, 0x0, 0x64, 0x0, 0x0, 0xFC, 0x78, 0x2, 0x58, 0x0, 0x50, 0x2, 0x58, 0x0, 0x50, 0x2, 0x58, 0x0, 0x50, 0x2, 0x58, 0x0, 0x50, 0x2, 0x58, 0x0, 0x50, 0x2, 0x5E, 0x0, 0x50, 0x2, 0x58, 0x0, 0x50, 0x2, 0x5E, 0x0, 0x50, 0x3, 0x5, 0x0, 0x32, 0x3, 0xF, 0x0, 0x3C, 0x3, 0xF, 0x0, 0x3C, 0x3, 0xF, 0x0, 0x3C, 0x3, 0xF, 0x0, 0x3C, 0x2, 0xF2, 0x0, 0x99, 0x2, 0xF2, 0x0, 0x99, 0x2, 0xF2, 0x0, 0x99, 0x2, 0xF2, 0x0, 0x99, 0x2, 0xF2, 0x0, 0x99, 0x3, 0x93, 0x0, 0x99, 0x3, 0x93, 0x0, 0x99, 0x3, 0x93, 0x0, 0x99, 0x3, 0x93, 0x0, 0x99, 0x3, 0x93, 0x0, 0x99, 0x2, 0xB7, 0x0, 0x50, 0x3, 0x5F, 0x0, 0x55, 0x3, 0xC5, 0x0, 0x50, 0x3, 0x49, 0x0, 0x50, 0x2, 0xFC, 0x0, 0x50, 0x2, 0xFC, 0x0, 0x50, 0x1, 0xA6, 0x0, 0x64, 0x1, 0xA6, 0x0, 0x64, 0x1, 0xA6, 0x0, 0x64, 0x4, 0xFE, 0x0, 0x50, 0x4, 0xFE, 0x0, 0x50, 0x2, 0xB6, 0x0, 0x65, 0x2, 0x37, 0x0, 0x50, 0x2, 0xAF, 0x0, 0x57, 0x2, 0x30, 0x0, 0x50, 0x5, 0xB0, 0x0, 0x95, 0x4, 0x80, 0x0, 0x7E, 0x6, 0x5F, 0x0, 0x2D, 0x5, 0xD3, 0x0, 0x8, 0x4, 0x5F, 0x0, 0x59, 0x4, 0x57, 0x0, 0x54, 0x4, 0x1D, 0x0, 0x35, 0x4, 0x1F, 0x0, 0x35, 0x5, 0x28, 0x0, 0x35, 0x5, 0x14, 0x0, 0x35, 0x3, 0x5B, 0x0, 0x85, 0x4, 0x22, 0x0, 0x4C, 0x8, 0x7C, 0x0, 0x12, 0x6, 0xDA, 0x0, 0x5B, 0x8, 0xAB, 0x0, 0x12, 0x7, 0x1E, 0x0, 0x5B, 0x8, 0x62, 0xFF, 0xF6, 0x6, 0xDA, 0x0, 0x5B, 0x7, 0x64, 0x0, 0x12, 0x6, 0x5E, 0x0, 0x5B, 0x7, 0x64, 0x0, 0x12, 0x6, 0x5E, 0x0, 0x5B, 0x7, 0x6D, 0x0, 0x12, 0x6, 0x69, 0x0, 0x5B, 0x5, 0x3A, 0x0, 0x4D, 0x4, 0x31, 0x0, 0x3B, 0x5, 0x5F, 0x0, 0x14, 0x4, 0x8F, 0x0, 0x14, 0x5, 0x11, 0x0, 0x95, 0x4, 0x43, 0x0, 0x7D, 0x5, 0x5F, 0x0, 0x14, 0x4, 0xA6, 0x0, 0x14, 0x4, 0xEE, 0x0, 0x95, 0x2, 0x7B, 0x0, 0x64, 0x4, 0xA4, 0x0, 0x14, 0x2, 0xC6, 0x0, 0x14, 0x6, 0x6A, 0x0, 0x14, 0x5, 0x4A, 0x0, 0x1B, 0x5, 0xF5, 0x0, 0x66, 0x5, 0x11, 0x0, 0x50, 0x9, 0x41, 0x0, 0x66, 0x7, 0x89, 0x0, 0x50, 0x5, 0x6A, 0x0, 0x14, 0x4, 0xE4, 0x0, 0xD, 0x6, 0x34, 0x0, 0x28, 0x5, 0xBC, 0x0, 0x22, 0x6, 0x3A, 0x0, 0x28, 0x5, 0xA4, 0x0, 0x2B, 0x5, 0x9B, 0x0, 0x60, 0x4, 0xE3, 0x0, 0x50, 0x6, 0xE8, 0x0, 0x60, 0x5, 0xB4, 0x0, 0x50, 0x4, 0x37, 0x0, 0x14, 0x3, 0x4A, 0x0, 0xD, 0x5, 0x2B, 0x0, 0x22, 0x5, 0x2E, 0x0, 0x22, 0x5, 0x2E, 0x0, 0x12, 0x3, 0xF6, 0x0, 0x17, 0x7, 0xB, 0x0, 0x31, 0x6, 0xB9, 0x0, 0x17, 0x4, 0x95, 0x0, 0x4A, 0x4, 0xA4, 0x0, 0x51, 0x5, 0x23, 0x0, 0x14, 0x4, 0xE9, 0x0, 0x14, 0x5, 0x23, 0x0, 0x14, 0x4, 0xE9, 0x0, 0x14, 0x4, 0x7E, 0x0, 0x95, 0x3, 0xE2, 0x0, 0x7D, 0x4, 0x33, 0x0, 0x25, 0x3, 0xBC, 0x0, 0x21, 0x4, 0x50, 0x0, 0x46, 0x4, 0x40, 0x0, 0x49, 0x4, 0xB2, 0x0, 0x4D, 0x4, 0xB4, 0x0, 0x40, 0x3, 0xA2, 0x0, 0x56, 0x5, 0xB8, 0x0, 0x50, 0x3, 0x31, 0x0, 0x8C, 0x8, 0x2C, 0x0, 0x7D, 0x5, 0xAA, 0x0, 0x7A, 0x3, 0xA2, 0x0, 0x7D, 0x5, 0x6F, 0x0, 0x76, 0x3, 0xC7, 0x0, 0x8, 0x4, 0x72, 0x0, 0x1B, 0x5, 0x86, 0x0, 0x69, 0x4, 0xB2, 0x0, 0x50, 0x4, 0xAC, 0x0, 0x99, 0x3, 0x55, 0x0, 0x7D, 0x5, 0x5, 0x0, 0x4A, 0x4, 0xEE, 0x0, 0x30, 0x4, 0x29, 0x0, 0x42, 0x4, 0x55, 0x0, 0x2E, 0x1, 0xFB, 0x0, 0x83, 0x5, 0x8A, 0x0, 0x95, 0x4, 0x76, 0x0, 0x7D, 0x3, 0x93, 0x0, 0x95, 0x2, 0xD0, 0x0, 0x7D, 0x5, 0x58, 0x0, 0x86, 0x4, 0x3F, 0x0, 0x50, 0x3, 0x41, 0x0, 0x49, 0x1, 0xBC, 0x0, 0x6B, 0x2, 0xD1, 0x0, 0x57, 0x1, 0x5D, 0x0, 0x50, 0x1, 0x5D, 0x0, 0x50, 0x5, 0x8C, 0x0, 0x8E, 0x3, 0xE3, 0x0, 0x28, 0x6, 0x27, 0x0, 0x95, 0x4, 0xF5, 0x0, 0x7A, 0x5, 0xAD, 0x0, 0x14, 0x4, 0xAD, 0x0, 0x14, 0x4, 0x31, 0x0, 0x50, 0x4, 0xD3, 0x0, 0x7A, 0x6, 0x23, 0x0, 0x28, 0x5, 0xA3, 0x0, 0x42, 0x5, 0x19, 0x0, 0x1B, 0x2, 0xD6, 0x0, 0x2D, 0x5, 0x25, 0x0, 0x58, 0x4, 0x78, 0x0, 0x53, 0x5, 0x41, 0x0, 0x58, 0x4, 0x3E, 0x0, 0x4F, 0x5, 0x0, 0x0, 0x44, 0x4, 0x5D, 0x0, 0x27, 0x6, 0x19, 0x0, 0x14, 0x5, 0x41, 0x0, 0x14, 0x5, 0x4F, 0x0, 0x14, 0x4, 0x8B, 0x0, 0x14, 0x6, 0x21, 0x0, 0x14, 0x5, 0x41, 0x0, 0x14, 0x5, 0x87, 0x0, 0x14, 0x3, 0x27, 0x0, 0x15, 0x5, 0x93, 0x0, 0x14, 0x4, 0xD3, 0x0, 0x14, 0x6, 0x8C, 0x0, 0x1B, 0x4, 0xD6, 0x0, 0x49, 0x5, 0x8D, 0x0, 0x66, 0x5, 0x93, 0x0, 0x28, 0x5, 0xB, 0xFF, 0xF3, 0x4, 0xDC, 0x0, 0x2D, 0x6, 0x29, 0x0, 0x3C, 0x4, 0xF9, 0x0, 0x35, 0x5, 0x83, 0x0, 0x3C, 0x6, 0x93, 0x0, 0x7D, 0x4, 0x66, 0x0, 0x34, 0x5, 0x1E, 0x0, 0x4A, 0x7, 0x1, 0x0, 0x95, 0x2, 0x42, 0x0, 0xA4, 0x9, 0x8F, 0x0, 0x75, 0x4, 0x61, 0x0, 0x18, 0x5, 0x49, 0x0, 0x1B, 0x6, 0xCE, 0x0, 0x5B, 0x3, 0x8A, 0x0, 0x7D, 0x5, 0x18, 0x0, 0x1B, 0x5, 0x7C, 0x0, 0x2F, 0x2, 0xD6, 0x0, 0x2D, 0x4, 0xE9, 0x0, 0x50, 0x3, 0xBD, 0x0, 0x35, 0x3, 0x61, 0x0, 0x24, 0x2, 0xA0, 0x0, 0x35, 0x7, 0x8A, 0x0, 0x7D, 0x5, 0x8, 0x0, 0x7D, 0x4, 0xF8, 0x0, 0x7D, 0x3, 0xFE, 0x0, 0x7D, 0x4, 0x31, 0x0, 0x86, 0x4, 0xB, 0x0, 0x25, 0x7, 0x4D, 0x0, 0x50, 0x7, 0x41, 0x0, 0x5D, 0x7, 0x41, 0x0, 0x5D, 0x6, 0xC4, 0x0, 0x50, 0x6, 0xC4, 0x0, 0x50, 0x4, 0x58, 0x0, 0x35, 0x4, 0xC6, 0x0, 0x99, 0x2, 0x21, 0x0, 0x7D, 0x3, 0xA1, 0x0, 0x7D, 0x4, 0xF, 0x0, 0x28, 0x4, 0xD9, 0x0, 0x28, 0x4, 0x7F, 0x0, 0x1F, 0x5, 0xEB, 0x0, 0x1F, 0x2, 0x6B, 0xFF, 0xD8, 0x4, 0x72, 0x0, 0x77, 0x5, 0x9, 0x0, 0x1B, 0x6, 0xEF, 0x0, 0x77, 0x6, 0xF7, 0x0, 0x7D, 0x4, 0xE1, 0x0, 0x14, 0x4, 0xA, 0x0, 0x1F, 0x4, 0xF5, 0x0, 0x1F, 0x4, 0xC, 0x0, 0xA, 0x4, 0xF2, 0x0, 0x1F, 0x4, 0xBD, 0xFF, 0xDE, 0x5, 0xA7, 0xFF, 0xDE, 0x4, 0xA7, 0xFF, 0xBE, 0x3, 0x90, 0x0, 0xD, 0x3, 0x26, 0x0, 0x50, 0x3, 0x5E, 0x0, 0x64, 0x2, 0xDE, 0x0, 0x35, 0x2, 0x7F, 0x0, 0x35, 0x3, 0xAE, 0x0, 0x28, 0x4, 0x85, 0x0, 0x56, 0x4, 0xF7, 0x0, 0x68, 0x2, 0x5B, 0x0, 0xA2, 0x2, 0x98, 0x0, 0x64, 0x1, 0xF1, 0x0, 0x46, 0x5, 0x1B, 0x0, 0x2D, 0x4, 0xA8, 0x0, 0x19, 0x4, 0xBD, 0x0, 0x2D, 0x7, 0x24, 0x0, 0x2D, 0x7, 0x24, 0x0, 0x2D, 0x5, 0x12, 0x0, 0x2D, 0x6, 0xB7, 0x0, 0x4C, 0x0, 0x0, 0xFC, 0xF4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFB, 0xC3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFD, 0xB8, 0x0, 0x0, 0xFB, 0x9C, 0x0, 0x0, 0xFB, 0x9C, 0x0, 0x0, 0xFC, 0xEE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFB, 0xC3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFD, 0xB8, 0x0, 0x0, 0xFB, 0x9C, 0x0, 0x0, 0xFB, 0x9C, 0x0, 0x0, 0x0, 0x0, 0x8, 0x31, 0x0, 0x5A, 0x8, 0x35, 0x0, 0x5C, 0x5, 0x38, 0x0, 0x74, 0x5, 0x3F, 0x0, 0x74, 0x4, 0xD8, 0x0, 0x25, 0x2, 0xF6, 0x0, 0x3C, 0x2, 0xF6, 0x0, 0x81, 0x2, 0xF6, 0x0, 0x4C, 0x4, 0x1D, 0x0, 0x50, 0x4, 0x1D, 0x0, 0x58, 0x4, 0x1D, 0x0, 0x3A, 0x4, 0x1D, 0x0, 0x61, 0x4, 0x1D, 0x0, 0x67, 0x4, 0x1D, 0x0, 0x31, 0x4, 0x1D, 0x0, 0x3F, 0x4, 0x1D, 0x0, 0x43, 0x4, 0x1D, 0x0, 0x96, 0x4, 0x1D, 0x0, 0x59, 0x4, 0x2A, 0x0, 0x41, 0x4, 0x3D, 0x0, 0x5, 0x4, 0x5F, 0x0, 0x16, 0x6, 0x8, 0x0, 0x29, 0x4, 0x7C, 0x0, 0x9, 0x4, 0x84, 0x0, 0x67, 0x4, 0x3C, 0x0, 0x25, 0x4, 0x35, 0x0, 0x3F, 0x4, 0x5D, 0x0, 0x76, 0x4, 0xC0, 0x0, 0x4D, 0x4, 0x6D, 0x0, 0x76, 0x4, 0xC0, 0x0, 0x50, 0x4, 0xDD, 0x0, 0x76, 0x6, 0x6, 0x0, 0x76, 0x3, 0xBA, 0x0, 0x76, 0x4, 0x5C, 0x0, 0x76, 0x3, 0xD6, 0x0, 0x25, 0x1, 0xFD, 0x0, 0x85, 0x4, 0xDE, 0x0, 0x76, 0x4, 0xA7, 0x0, 0x55, 0x3, 0xC6, 0x0, 0x76, 0x4, 0x35, 0x0, 0x3F, 0x4, 0x67, 0x0, 0x39, 0x3, 0xA4, 0x0, 0xA, 0x3, 0xBA, 0x0, 0x76, 0x4, 0x7C, 0x0, 0x9, 0x4, 0xC0, 0x0, 0x50, 0x4, 0x7C, 0x0, 0x9, 0x3, 0x99, 0x0, 0x43, 0x4, 0xD8, 0x0, 0x76, 0x4, 0x19, 0x0, 0x45, 0x5, 0x9E, 0x0, 0x51, 0x5, 0x55, 0x0, 0x51, 0x4, 0xE4, 0x0, 0x5F, 0x5, 0x92, 0x0, 0x25, 0x4, 0x80, 0x0, 0x50, 0x7, 0x54, 0x0, 0x25, 0x7, 0x58, 0x0, 0x76, 0x5, 0x98, 0x0, 0x25, 0x4, 0xD8, 0x0, 0x76, 0x4, 0x72, 0x0, 0x76, 0x5, 0x59, 0x0, 0x27, 0x6, 0x3A, 0x0, 0x1B, 0x4, 0x46, 0x0, 0x43, 0x4, 0xE4, 0x0, 0x76, 0x4, 0x5D, 0x0, 0x76, 0x4, 0xCC, 0x0, 0x25, 0x4, 0x47, 0x0, 0x20, 0x5, 0x5E, 0x0, 0x76, 0x4, 0x8C, 0x0, 0x41, 0x6, 0x85, 0x0, 0x76, 0x7, 0xB, 0x0, 0x76, 0x5, 0x5A, 0x0, 0xA, 0x6, 0x20, 0x0, 0x76, 0x4, 0x68, 0x0, 0x76, 0x4, 0x80, 0x0, 0x3D, 0x6, 0x92, 0x0, 0x76, 0x4, 0x88, 0x0, 0x44, 0x4, 0x23, 0x0, 0xA, 0x6, 0x92, 0x0, 0x1B, 0x4, 0x9E, 0x0, 0x76, 0x5, 0x1B, 0x0, 0x76, 0x5, 0x6E, 0x0, 0x25, 0x5, 0xF1, 0x0, 0x50, 0x4, 0x5A, 0x0, 0x5, 0x4, 0xC5, 0x0, 0x16, 0x6, 0x95, 0x0, 0x25, 0x4, 0x8C, 0x0, 0x41, 0x4, 0x8C, 0x0, 0x76, 0x5, 0xFE, 0x0, 0xB, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x47, 0x0, 0x43, 0x4, 0xC0, 0x0, 0x50, 0x4, 0x67, 0x0, 0x39, 0x3, 0xF7, 0x0, 0x47, 0x8, 0x37, 0x0, 0x76, 0x4, 0x9D, 0x0, 0x4D, 0x4, 0xEB, 0x0, 0x28, 0x3, 0xF7, 0x0, 0x25, 0x2, 0xF6, 0x0, 0x37, 0x2, 0xF6, 0x0, 0x35, 0x2, 0xF6, 0x0, 0x4F, 0x2, 0xF6, 0x0, 0x4E, 0x2, 0xF6, 0x0, 0x37, 0x2, 0xF6, 0x0, 0x4C, 0x2, 0xF6, 0x0, 0x47, 0x3, 0xBA, 0x0, 0x90, 0x2, 0xB2, 0x0, 0x96, 0x3, 0xE1, 0x0, 0x76, 0x4, 0x3B, 0x0, 0x9, 0x4, 0xBC, 0x0, 0x56, 0x5, 0x44, 0x0, 0x9B, 0x5, 0x28, 0x0, 0x9B, 0x4, 0x31, 0x0, 0x81, 0x5, 0x3A, 0x0, 0x9B, 0x4, 0x2E, 0x0, 0x81, 0x4, 0x7B, 0x0, 0x76, 0x4, 0x80, 0x0, 0x50, 0x4, 0x61, 0x0, 0x76, 0x4, 0x9E, 0x0, 0x9, 0x2, 0x6, 0x0, 0x94, 0x3, 0xA2, 0x0, 0x76, 0x0, 0x0, 0xFC, 0x5A, 0x0, 0x0, 0xFC, 0x5A, 0x0, 0x0, 0xFC, 0x5A, 0x0, 0x0, 0xFC, 0x5A, 0x0, 0x0, 0xFC, 0x61, 0x0, 0x0, 0xFC, 0x9C, 0x0, 0x0, 0xFC, 0x61, 0x0, 0x0, 0xFC, 0x61, 0x0, 0x0, 0xFC, 0x5A, 0x0, 0x0, 0xFC, 0xAA, 0x0, 0x0, 0xFC, 0x5E, 0x4, 0xC, 0x0, 0x7B, 0x4, 0xC, 0xFF, 0x4B, 0x4, 0xC, 0x0, 0x76, 0x4, 0xC, 0x0, 0x76, 0x0, 0x0, 0xFC, 0x61, 0x3, 0xBA, 0x0, 0x76, 0x3, 0xA2, 0x0, 0x76, 0x3, 0xA2, 0x0, 0x76, 0x0, 0x0, 0xFC, 0x5A, 0x2, 0xF6, 0x0, 0x4C, 0x2, 0xF6, 0x0, 0x35, 0x2, 0xF6, 0x0, 0x4F, 0x2, 0xF6, 0x0, 0x4E, 0x2, 0xF6, 0x0, 0x37, 0x2, 0xF6, 0x0, 0x4C, 0x2, 0xF6, 0x0, 0x47, 0x5, 0x7B, 0x0, 0x6C, 0x5, 0xA3, 0x0, 0x6C, 0x5, 0x86, 0x0, 0x9B, 0x5, 0xE1, 0x0, 0x6B, 0x5, 0xE3, 0x0, 0x6B, 0x4, 0x1C, 0x0, 0x98, 0x4, 0x82, 0x0, 0x6F, 0x4, 0x57, 0x0, 0xF, 0x4, 0xBF, 0x0, 0x36, 0x4, 0x6B, 0x0, 0x67, 0x4, 0x2E, 0x0, 0x43, 0x3, 0xA2, 0x0, 0x76, 0x1, 0xB4, 0x0, 0x5D, 0x6, 0x99, 0x0, 0x50, 0x4, 0xB4, 0x0, 0x74, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0x75, 0x0, 0x66, 0x5, 0x98, 0x0, 0x64, 0x8, 0xAC, 0x0, 0x95, 0x2, 0x10, 0xFF, 0xAF, 0x4, 0x8C, 0x0, 0x39, 0x4, 0x8C, 0x0, 0x6B, 0x4, 0x8C, 0x0, 0x2C, 0x4, 0x8C, 0x0, 0x66, 0x4, 0x8C, 0x0, 0x63, 0x4, 0x8C, 0x0, 0x35, 0x4, 0x8C, 0x0, 0x6F, 0x4, 0x8C, 0x0, 0x59, 0x4, 0x8C, 0x0, 0x69, 0x4, 0x8C, 0x0, 0xE4, 0x2, 0x27, 0xFF, 0xB5, 0x2, 0x42, 0x0, 0x90, 0x2, 0xE6, 0x0, 0x1E, 0x2, 0xD3, 0x0, 0x1A, 0x2, 0x27, 0xFF, 0xB5, 0x3, 0xAD, 0x0, 0x1E, 0x1, 0xD7, 0x0, 0x8D, 0x2, 0x1B, 0x0, 0x90, 0x2, 0x6A, 0x0, 0x28, 0x2, 0x1B, 0xFF, 0xFA, 0x2, 0x1B, 0x0, 0x90, 0x1, 0xD4, 0x0, 0x88, 0x2, 0x27, 0xFF, 0xB5, 0x2, 0xB2, 0x0, 0x0, 0x1, 0xEF, 0x0, 0x22, 0x1, 0xEF, 0x0, 0x22, 0x4, 0x61, 0x0, 0x76, 0x4, 0xD8, 0x0, 0x25, 0x4, 0xD8, 0x0, 0x2D, 0x4, 0xD8, 0x0, 0xA, 0x4, 0xD8, 0x0, 0x8D, 0x4, 0xD8, 0x0, 0x18, 0x4, 0xD8, 0x0, 0x9D, 0x4, 0xD8, 0x0, 0x87, 0x4, 0xD8, 0x0, 0x2D, 0x4, 0xD8, 0x0, 0xA7, 0x4, 0xD8, 0x0, 0x98, 0x4, 0xD8, 0x0, 0x90, 0x4, 0xD8, 0x0, 0x24, 0x4, 0xD8, 0x0, 0x99, 0x4, 0xD8, 0x0, 0x8E, 0x4, 0xD8, 0x0, 0x7A, 0x4, 0xD8, 0x0, 0x18, 0x4, 0xD8, 0x0, 0x8D, 0x4, 0xD8, 0x0, 0x84, 0x4, 0xD8, 0x0, 0x86, 0x4, 0xD8, 0x0, 0x96, 0x4, 0xD8, 0x0, 0x8D, 0x4, 0xD8, 0x0, 0x9D, 0x4, 0xD8, 0x0, 0x31, 0x4, 0xD8, 0x0, 0x7E, 0x4, 0xD8, 0x0, 0x9E, 0x4, 0xD8, 0x0, 0xA7, 0x4, 0xD8, 0x0, 0xB7, 0x4, 0xD8, 0x0, 0x8E, 0x4, 0xD8, 0x0, 0x33, 0x4, 0xD8, 0x0, 0xA8, 0x4, 0xD8, 0x0, 0x38, 0x4, 0xD8, 0x0, 0x39, 0x4, 0xD8, 0x0, 0x94, 0x4, 0xD8, 0x0, 0xA8, 0x4, 0xD8, 0x0, 0x37, 0x3, 0xAC, 0x0, 0x78, 0x3, 0xAC, 0x0, 0x93, 0x4, 0xD8, 0x0, 0xBA, 0x3, 0xAC, 0x0, 0x71, 0x3, 0xAC, 0x0, 0x84, 0x4, 0xD8, 0x0, 0x33, 0x4, 0xD8, 0x0, 0x39, 0x4, 0xD8, 0x0, 0x38, 0x4, 0xD8, 0x0, 0x90, 0x4, 0xD8, 0x0, 0xAB, 0x4, 0xD8, 0x0, 0xAB, 0x4, 0xD8, 0x0, 0xB2, 0x4, 0xD8, 0x0, 0xBC, 0x4, 0xD8, 0x0, 0xA7, 0x4, 0xD8, 0x0, 0x99, 0x4, 0xD8, 0x0, 0xB7, 0x4, 0xD8, 0x0, 0xA, 0x4, 0xD8, 0x0, 0xBC, 0x4, 0xD8, 0x0, 0xAB, 0x4, 0xD8, 0x0, 0xAB, 0x4, 0xD8, 0x0, 0xB2, 0x4, 0xD8, 0x0, 0x47, 0x4, 0xD8, 0x0, 0x37, 0x4, 0xD8, 0x0, 0xA8, 0x4, 0xD8, 0x0, 0xA7, 0x4, 0xD8, 0x0, 0x99, 0x4, 0xD8, 0x0, 0x1D, 0x4, 0xD8, 0x0, 0x67, 0x4, 0xD8, 0x0, 0x49, 0x3, 0xAC, 0x0, 0x78, 0x3, 0xAC, 0x0, 0x93, 0x3, 0xAC, 0x0, 0x84, 0x3, 0xAC, 0x0, 0x93, 0x4, 0xD8, 0x0, 0xBC, 0x4, 0xD8, 0x0, 0x9D, 0x4, 0xD8, 0x0, 0x8D, 0x4, 0xD8, 0x0, 0x18, 0x4, 0xD8, 0x0, 0x8E, 0x4, 0xD8, 0x0, 0x23, 0x4, 0xD8, 0x0, 0xA8, 0x4, 0xD8, 0x0, 0x18, 0x4, 0xD8, 0x0, 0xA7, 0x4, 0xD8, 0x0, 0x96, 0x4, 0xD8, 0x0, 0x86, 0x4, 0xD8, 0x0, 0x7E, 0x4, 0xD8, 0x0, 0x3C, 0x4, 0xD8, 0x0, 0x2C, 0x4, 0xD8, 0x0, 0x98, 0x4, 0xD8, 0x0, 0x24, 0x3, 0xAC, 0x0, 0x78, 0x3, 0xAC, 0x0, 0x93, 0x4, 0xD8, 0x0, 0x94, 0x4, 0xD8, 0x0, 0xA7, 0x3, 0xAC, 0x0, 0x78, 0x4, 0xD8, 0x0, 0xA8, 0x4, 0xD8, 0x0, 0x87, 0x3, 0xAC, 0x0, 0x93, 0x4, 0xD8, 0x0, 0xAB, 0x4, 0xD8, 0x0, 0xA8, 0x4, 0xD8, 0x0, 0xAB, 0x4, 0xD8, 0x0, 0xBA, 0x4, 0xD8, 0x0, 0xAB, 0x4, 0xD8, 0x0, 0x18, 0x4, 0xD8, 0x0, 0x8D, 0x4, 0xD8, 0x0, 0x7A, 0x4, 0xD8, 0x0, 0x84, 0x4, 0xD8, 0x0, 0x94, 0x4, 0xD8, 0x0, 0xAB, 0x4, 0xD8, 0x0, 0x98, 0x4, 0xD8, 0x0, 0x99, 0x4, 0xD8, 0x0, 0xA7, 0x4, 0xD8, 0x0, 0x18, 0x4, 0xD8, 0x0, 0x23, 0x4, 0xD8, 0x0, 0x9D, 0x4, 0xD8, 0x0, 0x8E, 0x4, 0xD8, 0x0, 0x8D, 0x4, 0xD8, 0x0, 0x31, 0x4, 0xD8, 0x0, 0x1D, 0x3, 0xAC, 0x0, 0x93, 0x4, 0xD8, 0x0, 0x9E, 0x3, 0xAC, 0x0, 0x78, 0x3, 0xAC, 0x0, 0x84, 0x3, 0xAC, 0x0, 0x71, 0x4, 0xD8, 0x0, 0xA8, 0x4, 0xD8, 0x0, 0x37, 0x4, 0xD8, 0x0, 0x67, 0x4, 0xD8, 0x0, 0x47, 0x4, 0xD8, 0x0, 0x49, 0x4, 0xD8, 0x0, 0x37, 0x4, 0xD8, 0x0, 0x98, 0x4, 0xD8, 0x0, 0xAB, 0x4, 0xD8, 0x0, 0x3C, 0x4, 0xD8, 0x0, 0xA8, 0x4, 0xD8, 0x0, 0x2C, 0x4, 0xD8, 0x0, 0xA7, 0x4, 0xD8, 0x0, 0x94, 0x4, 0xD8, 0x0, 0xAB, 0x4, 0xD8, 0x0, 0xBC, 0x4, 0xD8, 0x0, 0xB2, 0x3, 0xAC, 0x0, 0x78, 0x3, 0xAC, 0x0, 0x84, 0x4, 0xD8, 0x0, 0xB2, 0x3, 0xAC, 0x0, 0x93, 0x3, 0xAC, 0x0, 0x93, 0x0, 0x0, 0xFB, 0x8F, 0x0, 0x0, 0xFA, 0xC2, 0x0, 0x0, 0xFB, 0x5E, 0x0, 0x0, 0xFB, 0x1B, 0x0, 0x0, 0xFB, 0x6A, 0x0, 0x0, 0xFB, 0xD6, 0x0, 0x0, 0xFB, 0xE, 0x0, 0x0, 0xFB, 0x9A, 0x0, 0x0, 0xFB, 0xA0, 0x0, 0x0, 0xFB, 0xA6, 0x0, 0x0, 0xFB, 0x78, 0x0, 0x0, 0xFB, 0x50, 0x0, 0x0, 0xFC, 0x2C, 0x0, 0x0, 0xFC, 0x19, 0x0, 0x0, 0xFB, 0x6D, 0x4, 0xEB, 0x0, 0x63, 0x0, 0x0, 0xFC, 0x11, 0x0, 0x0, 0xFB, 0x5E, 0x0, 0x0, 0xFA, 0x4E, 0x0, 0x0, 0xFA, 0x81, 0x0, 0x0, 0xF9, 0xCE, 0x0, 0x0, 0xF8, 0xBE, 0x4, 0x34, 0x0, 0x3A, 0x4, 0x89, 0x0, 0x7D, 0x4, 0x3D, 0x0, 0x51, 0x4, 0x99, 0x0, 0x50, 0x4, 0x93, 0x0, 0x50, 0x4, 0xA1, 0x0, 0x4C, 0x4, 0x94, 0x0, 0x7D, 0x4, 0x9F, 0x0, 0x50, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x89, 0x0, 0x51, 0x4, 0x63, 0x0, 0x3E, 0x3, 0xA4, 0x0, 0x5A, 0x4, 0xC6, 0x0, 0x5, 0x5, 0x90, 0x0, 0x50, 0x5, 0xA, 0x0, 0x7A, 0x5, 0xBC, 0x0, 0x5, 0x5, 0x9D, 0x0, 0x5, 0x3, 0xF9, 0x0, 0x5, 0x5, 0x3, 0x0, 0x5D, 0x3, 0xC4, 0x0, 0x4, 0x6, 0x47, 0xFF, 0xF0, 0x4, 0x9, 0x0, 0x76, 0x4, 0xC0, 0x0, 0x50, 0x5, 0x9, 0x0, 0x32, 0x4, 0xDD, 0x0, 0x76, 0x0, 0x0, 0xFD, 0x40, 0x0, 0x0, 0xFC, 0x4A, 0x0, 0x0, 0xFC, 0x57, 0x0, 0x0, 0xFC, 0x57, 0x0, 0x0, 0xFC, 0x65, 0x0, 0x0, 0xFC, 0x5F, 0x0, 0x0, 0xFC, 0x57, 0x0, 0x0, 0xFC, 0x57, 0x0, 0x0, 0xFC, 0x65, 0x0, 0x0, 0xFC, 0x4A, 0x0, 0x0, 0xFC, 0x57, 0x0, 0x0, 0xFC, 0x50, 0x0, 0x0, 0xFC, 0x57, 0x1, 0xFE, 0x0, 0x0, 0x2, 0xA1, 0x0, 0x47, 0x5, 0x58, 0x0, 0x15, 0x5, 0x58, 0x0, 0x15, 0x4, 0x8F, 0xFF, 0xF2, 0x4, 0xDC, 0x0, 0x2D, 0x2, 0xAA, 0xFF, 0xE8, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0x0, 0x12, 0x5, 0x39, 0x0, 0x66, 0x4, 0x86, 0x0, 0x95, 0x4, 0x86, 0x0, 0x95, 0x4, 0x86, 0x0, 0x95, 0x4, 0x86, 0x0, 0x95, 0x2, 0x42, 0xFF, 0xC7, 0x2, 0x42, 0x0, 0xA4, 0x2, 0x42, 0xFF, 0xCB, 0x2, 0x42, 0xFF, 0xC0, 0x5, 0xAF, 0x0, 0x95, 0x5, 0x86, 0x0, 0x66, 0x5, 0x86, 0x0, 0x66, 0x5, 0x86, 0x0, 0x66, 0x5, 0x86, 0x0, 0x66, 0x5, 0x86, 0x0, 0x66, 0x5, 0x38, 0x0, 0x7E, 0x5, 0x38, 0x0, 0x7E, 0x5, 0x38, 0x0, 0x7E, 0x5, 0x38, 0x0, 0x7E, 0x4, 0xE0, 0x0, 0x8, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x31, 0x0, 0x50, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x4B, 0x0, 0x54, 0x2, 0x1B, 0xFF, 0xB2, 0x2, 0x1B, 0x0, 0x90, 0x2, 0x1B, 0xFF, 0xB6, 0x2, 0x1B, 0xFF, 0xAB, 0x4, 0x73, 0x0, 0x7A, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x72, 0x0, 0x77, 0x4, 0x72, 0x0, 0x77, 0x4, 0x72, 0x0, 0x77, 0x4, 0x72, 0x0, 0x77, 0x3, 0xE5, 0x0, 0xC, 0x3, 0xE5, 0x0, 0xC, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x39, 0x0, 0x66, 0x4, 0x31, 0x0, 0x50, 0x5, 0x39, 0x0, 0x66, 0x4, 0x31, 0x0, 0x50, 0x5, 0x39, 0x0, 0x66, 0x4, 0x31, 0x0, 0x50, 0x5, 0x39, 0x0, 0x66, 0x4, 0x31, 0x0, 0x50, 0x5, 0x3A, 0x0, 0x95, 0x5, 0x1B, 0x0, 0x50, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x5, 0x73, 0x0, 0x6A, 0x4, 0x89, 0x0, 0x52, 0x5, 0x73, 0x0, 0x6A, 0x4, 0x89, 0x0, 0x52, 0x5, 0x73, 0x0, 0x6A, 0x4, 0x89, 0x0, 0x52, 0x5, 0x73, 0x0, 0x6A, 0x4, 0x89, 0x0, 0x52, 0x5, 0xB0, 0x0, 0x95, 0x4, 0x71, 0x0, 0x7A, 0x2, 0x42, 0xFF, 0xB2, 0x2, 0x1B, 0xFF, 0x9D, 0x2, 0x42, 0xFF, 0xCE, 0x2, 0x1B, 0xFF, 0xB9, 0x2, 0x42, 0xFF, 0xDF, 0x2, 0x1B, 0xFF, 0xCA, 0x2, 0x42, 0x0, 0x15, 0x2, 0xC, 0xFF, 0xFE, 0x2, 0x42, 0x0, 0x9E, 0x6, 0xB3, 0x0, 0xA4, 0x4, 0xD, 0x0, 0x7D, 0x4, 0x71, 0x0, 0x2D, 0x2, 0x27, 0xFF, 0xB5, 0x5, 0xB, 0x0, 0x95, 0x4, 0x2D, 0x0, 0x7D, 0x4, 0x55, 0x0, 0x95, 0x2, 0xC, 0x0, 0x8B, 0x4, 0x55, 0x0, 0x95, 0x2, 0xC, 0x0, 0x57, 0x4, 0x55, 0x0, 0x95, 0x2, 0xA2, 0x0, 0x8C, 0x4, 0x55, 0x0, 0x95, 0x2, 0xE8, 0x0, 0x8C, 0x5, 0xAF, 0x0, 0x95, 0x4, 0x73, 0x0, 0x7A, 0x5, 0xAF, 0x0, 0x95, 0x4, 0x73, 0x0, 0x7A, 0x5, 0xAF, 0x0, 0x95, 0x4, 0x73, 0x0, 0x7A, 0x4, 0x73, 0xFF, 0xA4, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x4, 0xFF, 0x0, 0x95, 0x2, 0xD0, 0x0, 0x7D, 0x4, 0xFF, 0x0, 0x95, 0x2, 0xD0, 0x0, 0x51, 0x4, 0xFF, 0x0, 0x95, 0x2, 0xD0, 0x0, 0x38, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x4C, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x4C, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x4C, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x4C, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x4C, 0x4, 0xDC, 0x0, 0x2D, 0x2, 0xAA, 0x0, 0x8, 0x4, 0xDC, 0x0, 0x2D, 0x2, 0xAA, 0x0, 0x8, 0x4, 0xDC, 0x0, 0x2D, 0x2, 0xD2, 0x0, 0x8, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x7, 0xB, 0x0, 0x31, 0x5, 0xF2, 0x0, 0x22, 0x4, 0xE0, 0x0, 0x8, 0x3, 0xE5, 0x0, 0xC, 0x4, 0xE0, 0x0, 0x8, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x7, 0x0, 0x52, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x7, 0x0, 0x52, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x7, 0x0, 0x52, 0x7, 0x85, 0xFF, 0xF6, 0x6, 0xC1, 0x0, 0x48, 0x5, 0x85, 0x0, 0x6A, 0x4, 0x89, 0x0, 0x50, 0x4, 0x7B, 0xFF, 0xA6, 0x4, 0x7B, 0xFF, 0xA6, 0x4, 0x3C, 0x0, 0x25, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x80, 0x0, 0x50, 0x3, 0xE1, 0x0, 0x76, 0x3, 0xE1, 0x0, 0x76, 0x3, 0xE1, 0x0, 0x76, 0x3, 0xE1, 0x0, 0x76, 0x1, 0xFD, 0xFF, 0xA5, 0x1, 0xFD, 0x0, 0x84, 0x1, 0xFD, 0xFF, 0xA9, 0x1, 0xFD, 0xFF, 0x9E, 0x4, 0xDD, 0x0, 0x76, 0x4, 0xC0, 0x0, 0x50, 0x4, 0xC0, 0x0, 0x50, 0x4, 0xC0, 0x0, 0x50, 0x4, 0xC0, 0x0, 0x50, 0x4, 0xC0, 0x0, 0x50, 0x4, 0x84, 0x0, 0x67, 0x4, 0x84, 0x0, 0x67, 0x4, 0x84, 0x0, 0x67, 0x4, 0x84, 0x0, 0x67, 0x4, 0x3D, 0x0, 0x5, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x80, 0x0, 0x50, 0x4, 0x80, 0x0, 0x50, 0x4, 0x80, 0x0, 0x50, 0x4, 0x80, 0x0, 0x50, 0x4, 0x7B, 0x0, 0x6A, 0x3, 0xE1, 0x0, 0x76, 0x3, 0xE1, 0x0, 0x76, 0x3, 0xE1, 0x0, 0x76, 0x3, 0xE1, 0x0, 0x76, 0x3, 0xE1, 0x0, 0x76, 0x4, 0xA7, 0x0, 0x55, 0x4, 0xA7, 0x0, 0x55, 0x4, 0xA7, 0x0, 0x55, 0x4, 0xA7, 0x0, 0x55, 0x4, 0xDE, 0x0, 0x76, 0x1, 0xFD, 0xFF, 0x90, 0x1, 0xFD, 0xFF, 0xAC, 0x1, 0xFD, 0xFF, 0xBD, 0x1, 0xFD, 0x0, 0x14, 0x1, 0xFD, 0x0, 0x7C, 0x3, 0xD6, 0x0, 0x25, 0x4, 0x5C, 0x0, 0x76, 0x3, 0xBA, 0x0, 0x76, 0x3, 0xBA, 0x0, 0x76, 0x3, 0xBA, 0x0, 0x76, 0x3, 0xBA, 0x0, 0x76, 0x4, 0xDD, 0x0, 0x76, 0x4, 0xDD, 0x0, 0x76, 0x4, 0xDD, 0x0, 0x76, 0x4, 0xC0, 0x0, 0x50, 0x4, 0xC0, 0x0, 0x50, 0x4, 0xC0, 0x0, 0x50, 0x4, 0xC0, 0x0, 0x50, 0x4, 0x5D, 0x0, 0x76, 0x4, 0x5D, 0x0, 0x76, 0x4, 0x5D, 0x0, 0x76, 0x4, 0x35, 0x0, 0x3F, 0x4, 0x35, 0x0, 0x3F, 0x4, 0x35, 0x0, 0x3F, 0x4, 0x35, 0x0, 0x3F, 0x4, 0x3C, 0x0, 0x25, 0x4, 0x3C, 0x0, 0x25, 0x4, 0x3C, 0x0, 0x25, 0x4, 0x84, 0x0, 0x67, 0x4, 0x84, 0x0, 0x67, 0x4, 0x84, 0x0, 0x67, 0x4, 0x84, 0x0, 0x67, 0x4, 0x84, 0x0, 0x67, 0x4, 0x84, 0x0, 0x67, 0x6, 0x8, 0x0, 0x29, 0x4, 0x3D, 0x0, 0x5, 0x4, 0x3D, 0x0, 0x5, 0x4, 0x2A, 0x0, 0x41, 0x4, 0x2A, 0x0, 0x41, 0x4, 0x2A, 0x0, 0x41, 0x5, 0x53, 0x0, 0x12, 0x4, 0x86, 0xFE, 0xE7, 0x5, 0xB0, 0xFE, 0xF0, 0x2, 0x42, 0xFE, 0xF2, 0x5, 0x9A, 0xFF, 0xBC, 0x5, 0x44, 0xFF, 0x45, 0x5, 0x70, 0xFF, 0xC6, 0x2, 0xAA, 0xFF, 0x87, 0x5, 0x53, 0x0, 0x12, 0x5, 0xD, 0x0, 0x95, 0x4, 0x86, 0x0, 0x95, 0x4, 0xD2, 0x0, 0x50, 0x5, 0xB0, 0x0, 0x95, 0x2, 0x42, 0x0, 0xA4, 0x5, 0xB, 0x0, 0x95, 0x7, 0x1, 0x0, 0x95, 0x5, 0xAF, 0x0, 0x95, 0x5, 0x86, 0x0, 0x66, 0x5, 0x1E, 0x0, 0x95, 0x4, 0xDC, 0x0, 0x2D, 0x4, 0xE0, 0x0, 0x8, 0x5, 0x10, 0x0, 0x29, 0x2, 0x42, 0xFF, 0xC0, 0x4, 0xE0, 0x0, 0x8, 0x4, 0x85, 0x0, 0x56, 0x4, 0x61, 0x0, 0x61, 0x4, 0x89, 0x0, 0x7F, 0x2, 0xAA, 0x0, 0xAA, 0x4, 0x61, 0x0, 0x80, 0x4, 0x98, 0x0, 0x8E, 0x4, 0x8E, 0x0, 0x50, 0x4, 0xBB, 0x0, 0x93, 0x3, 0xF6, 0x0, 0x17, 0x4, 0x63, 0x0, 0x3E, 0x2, 0xAA, 0xFF, 0xCD, 0x4, 0x61, 0x0, 0x80, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x61, 0x0, 0x80, 0x6, 0x95, 0x0, 0x66, 0x4, 0x86, 0x0, 0x95, 0x4, 0x75, 0x0, 0x9B, 0x4, 0xD5, 0x0, 0x4A, 0x2, 0x42, 0x0, 0xA4, 0x2, 0x42, 0xFF, 0xC0, 0x4, 0x71, 0x0, 0x2D, 0x5, 0x28, 0x0, 0x9B, 0x5, 0xB, 0x0, 0x95, 0x5, 0xA, 0x0, 0x3A, 0x5, 0x53, 0x0, 0x12, 0x5, 0xD, 0x0, 0x95, 0x4, 0x75, 0x0, 0x9B, 0x4, 0x86, 0x0, 0x95, 0x5, 0xA9, 0x0, 0x95, 0x7, 0x1, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0x86, 0x0, 0x66, 0x5, 0xB1, 0x0, 0x9B, 0x5, 0x1E, 0x0, 0x95, 0x5, 0x39, 0x0, 0x66, 0x4, 0xDC, 0x0, 0x2D, 0x5, 0x10, 0x0, 0x29, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x98, 0x0, 0x86, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x81, 0x0, 0x7D, 0x4, 0x31, 0x0, 0x50, 0x3, 0xE5, 0x0, 0xC, 0x4, 0x7, 0x0, 0x1F, 0x4, 0x4B, 0x0, 0x54, 0x3, 0x5B, 0x0, 0x85, 0x4, 0x22, 0x0, 0x4C, 0x2, 0xC, 0x0, 0x7D, 0x2, 0x1B, 0xFF, 0xAB, 0x2, 0x1, 0xFF, 0xB4, 0x4, 0x6F, 0x0, 0x8F, 0x3, 0xE5, 0x0, 0xC, 0x7, 0xB, 0x0, 0x31, 0x5, 0xF2, 0x0, 0x22, 0x7, 0xB, 0x0, 0x31, 0x5, 0xF2, 0x0, 0x22, 0x7, 0xB, 0x0, 0x31, 0x5, 0xF2, 0x0, 0x22, 0x4, 0xE0, 0x0, 0x8, 0x3, 0xE5, 0x0, 0xC, 0x1, 0x5A, 0x0, 0x53, 0x2, 0x98, 0x0, 0x65, 0x4, 0x4A, 0x0, 0x90, 0x2, 0x27, 0xFF, 0xB0, 0x1, 0xBC, 0x0, 0x34, 0x7, 0x1, 0x0, 0x95, 0x6, 0xF7, 0x0, 0x7D, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x86, 0x0, 0x95, 0x5, 0xA9, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x98, 0x0, 0x86, 0x5, 0xAB, 0x0, 0x44, 0x5, 0xCA, 0x0, 0x50, 0x5, 0x1A, 0x0, 0x10, 0x4, 0xF, 0xFF, 0xF2, 0x8, 0x73, 0x0, 0x50, 0x9, 0x6B, 0x0, 0x66, 0x4, 0xD6, 0x0, 0x49, 0x4, 0x17, 0x0, 0x4E, 0x5, 0x39, 0x0, 0x66, 0x4, 0x31, 0x0, 0x50, 0x4, 0xE0, 0x0, 0x8, 0x4, 0xF, 0x0, 0x21, 0x2, 0x42, 0x0, 0xA4, 0x7, 0xA2, 0x0, 0x17, 0x6, 0x77, 0x0, 0x1E, 0x2, 0x42, 0x0, 0xA4, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x7, 0x85, 0xFF, 0xF6, 0x6, 0xC1, 0x0, 0x48, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x5, 0x89, 0x0, 0x51, 0x4, 0x3D, 0x0, 0x5A, 0x4, 0x3D, 0x0, 0x5A, 0x7, 0xA2, 0x0, 0x17, 0x6, 0x77, 0x0, 0x1E, 0x4, 0xD6, 0x0, 0x49, 0x4, 0x17, 0x0, 0x4E, 0x5, 0xA9, 0x0, 0x95, 0x4, 0x98, 0x0, 0x86, 0x5, 0xA9, 0x0, 0x95, 0x4, 0x98, 0x0, 0x86, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x7B, 0x0, 0x5F, 0x4, 0x89, 0x0, 0x4F, 0x5, 0x7B, 0x0, 0x5F, 0x5, 0x7B, 0x0, 0x5F, 0x4, 0x89, 0x0, 0x4F, 0x5, 0x51, 0x0, 0x6B, 0x4, 0x3D, 0x0, 0x52, 0x5, 0xA, 0x0, 0x3A, 0x3, 0xE5, 0x0, 0xC, 0x5, 0xA, 0x0, 0x3A, 0x3, 0xE5, 0x0, 0xC, 0x5, 0xA, 0x0, 0x3A, 0x3, 0xE5, 0x0, 0xC, 0x5, 0x89, 0x0, 0x8E, 0x4, 0x66, 0x0, 0x5F, 0x6, 0xF9, 0x0, 0x9C, 0x6, 0x6F, 0x0, 0x8F, 0x4, 0x85, 0x0, 0x50, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0xE, 0x4, 0x55, 0xFF, 0x98, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0xFF, 0xD4, 0x4, 0x4B, 0xFF, 0x8C, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x2, 0x42, 0x0, 0xA4, 0x2, 0x1B, 0x0, 0x90, 0x2, 0x42, 0x0, 0x94, 0x2, 0xC, 0x0, 0x79, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x25, 0x4, 0x8E, 0xFF, 0xA1, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x8A, 0x0, 0x58, 0x4, 0x9F, 0x0, 0x4F, 0x5, 0x8A, 0x0, 0x58, 0x4, 0x9F, 0x0, 0x4F, 0x5, 0x8A, 0x0, 0x58, 0x4, 0x9F, 0x0, 0x4F, 0x5, 0x8A, 0x0, 0x58, 0x4, 0x9F, 0x0, 0x4F, 0x5, 0x8A, 0x0, 0x58, 0x4, 0x9F, 0x0, 0x4F, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0xA5, 0x0, 0x7E, 0x4, 0xF2, 0x0, 0x77, 0x5, 0xA5, 0x0, 0x7E, 0x4, 0xF2, 0x0, 0x77, 0x5, 0xA5, 0x0, 0x7E, 0x4, 0xF2, 0x0, 0x77, 0x5, 0xA5, 0x0, 0x7E, 0x4, 0xF2, 0x0, 0x77, 0x5, 0xA5, 0x0, 0x7E, 0x4, 0xF2, 0x0, 0x77, 0x4, 0xE0, 0x0, 0x8, 0x3, 0xE5, 0x0, 0xC, 0x4, 0xE0, 0x0, 0x8, 0x3, 0xE5, 0x0, 0xC, 0x4, 0xE0, 0x0, 0x8, 0x3, 0xE5, 0x0, 0xC, 0x4, 0xA3, 0x0, 0x50, 0x4, 0xDC, 0x0, 0x2D, 0x3, 0xF6, 0x0, 0x24, 0x5, 0x89, 0x0, 0x8E, 0x4, 0x66, 0x0, 0x5F, 0x4, 0x75, 0x0, 0x9B, 0x3, 0x5B, 0x0, 0x85, 0x6, 0x24, 0x0, 0x17, 0x4, 0xC4, 0xFF, 0xCA, 0x4, 0x71, 0x0, 0x7A, 0x5, 0x7, 0xFF, 0xD0, 0x5, 0x7, 0xFF, 0xD0, 0x4, 0x75, 0xFF, 0xF0, 0x3, 0x5B, 0xFF, 0xE2, 0x5, 0x3C, 0xFF, 0xF7, 0x4, 0x45, 0xFF, 0xC2, 0x4, 0xE0, 0x0, 0x8, 0x4, 0xF, 0x0, 0x21, 0x5, 0x10, 0x0, 0x29, 0x4, 0x7, 0x0, 0x1F, 0x4, 0x61, 0x0, 0x61, 0x4, 0x66, 0x0, 0x2, 0x6, 0x30, 0x0, 0x82, 0x4, 0x8C, 0x0, 0x51, 0x4, 0x8C, 0x0, 0x50, 0x4, 0x8C, 0x0, 0x35, 0x4, 0x8C, 0x0, 0x81, 0x4, 0xA0, 0x0, 0x8A, 0x4, 0xB4, 0x0, 0x7D, 0x4, 0xA0, 0x0, 0x5E, 0x4, 0xB4, 0x0, 0x7D, 0x1, 0xC4, 0x0, 0x73, 0x2, 0xB6, 0x0, 0x90, 0x4, 0x89, 0x0, 0x7F, 0x8, 0xC6, 0x0, 0x95, 0x6, 0x56, 0x0, 0x95, 0x4, 0xD, 0x0, 0x8C, 0xA, 0x20, 0x0, 0x95, 0x7, 0xB0, 0x0, 0x95, 0x6, 0x74, 0x0, 0x7A, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x2, 0x42, 0xFF, 0xC0, 0x2, 0x1B, 0xFF, 0xAB, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x4, 0x3D, 0x0, 0x5A, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x7, 0x85, 0xFF, 0xF6, 0x6, 0xC1, 0x0, 0x48, 0x5, 0x73, 0x0, 0x6A, 0x4, 0x89, 0x0, 0x52, 0x5, 0xB, 0x0, 0x95, 0x4, 0x2D, 0x0, 0x7D, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0xA, 0xC, 0x0, 0x95, 0x9, 0x41, 0x0, 0x95, 0x8, 0x8C, 0x0, 0x50, 0x5, 0x73, 0x0, 0x6A, 0x4, 0x89, 0x0, 0x52, 0x5, 0xAF, 0x0, 0x95, 0x4, 0x73, 0x0, 0x7A, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0xD, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x86, 0x0, 0x49, 0x4, 0x4B, 0x0, 0x1, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x2, 0x42, 0xFE, 0xF7, 0x2, 0x1B, 0xFE, 0xE2, 0x2, 0x42, 0xFF, 0xDE, 0x2, 0x1B, 0xFF, 0xC9, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x16, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x4, 0xFF, 0x0, 0x32, 0x2, 0xD0, 0xFF, 0x6F, 0x4, 0xFF, 0x0, 0x95, 0x2, 0xD0, 0x0, 0x56, 0x5, 0x38, 0x0, 0x71, 0x4, 0x72, 0x0, 0xF, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0xB0, 0x0, 0x95, 0x4, 0x71, 0x0, 0x7A, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x4, 0xE0, 0x0, 0x8, 0x3, 0xE5, 0x0, 0xC, 0x4, 0x89, 0x0, 0x4F, 0x4, 0x90, 0x0, 0x8F, 0x4, 0x98, 0x0, 0x86, 0x4, 0x71, 0x0, 0x2D, 0x4, 0xDF, 0xFF, 0xF, 0x4, 0x7B, 0xFF, 0xE1, 0x4, 0x31, 0x0, 0x50, 0x2, 0x1, 0xFF, 0xB4, 0x5, 0x7B, 0x0, 0x5F, 0x4, 0xCB, 0x0, 0x95, 0x4, 0x97, 0x0, 0x83, 0x5, 0x39, 0x0, 0x66, 0x7, 0x1, 0x0, 0x95, 0x5, 0x86, 0x0, 0x60, 0x4, 0x8B, 0x0, 0x50, 0x7, 0xB, 0x0, 0x31, 0x5, 0xF2, 0x0, 0x22, 0x5, 0xD, 0x0, 0x95, 0x4, 0x81, 0x0, 0x7D, 0x5, 0xD, 0x0, 0x95, 0x4, 0x81, 0x0, 0x7D, 0x5, 0xD, 0x0, 0x95, 0x4, 0x81, 0x0, 0x7D, 0x5, 0x39, 0x0, 0x66, 0x4, 0x31, 0x0, 0x50, 0x5, 0x3A, 0x0, 0x95, 0x4, 0x85, 0x0, 0x50, 0x5, 0x3A, 0x0, 0x95, 0x4, 0x85, 0x0, 0x50, 0x5, 0x3A, 0x0, 0x95, 0x4, 0x85, 0x0, 0x50, 0x5, 0x3A, 0x0, 0x95, 0x4, 0x85, 0x0, 0x50, 0x5, 0x3A, 0x0, 0x95, 0x4, 0x85, 0x0, 0x50, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x4, 0x66, 0x0, 0x95, 0x2, 0xD6, 0x0, 0x2D, 0x5, 0x73, 0x0, 0x6A, 0x4, 0x89, 0x0, 0x52, 0x5, 0xB0, 0x0, 0x95, 0x4, 0x71, 0x0, 0x7A, 0x5, 0xB0, 0x0, 0x95, 0x4, 0x71, 0x0, 0x7A, 0x5, 0xB0, 0x0, 0x95, 0x4, 0x71, 0x0, 0x7A, 0x5, 0xB0, 0x0, 0x95, 0x4, 0x71, 0x0, 0x7A, 0x5, 0xB, 0x0, 0x95, 0x4, 0x2D, 0x0, 0x7D, 0x5, 0xB, 0x0, 0x95, 0x4, 0x2D, 0x0, 0x7D, 0x5, 0xB, 0x0, 0x95, 0x4, 0x2D, 0x0, 0x7D, 0x4, 0x55, 0x0, 0x95, 0x2, 0xC, 0x0, 0x79, 0x4, 0x55, 0xFF, 0xC1, 0x2, 0xC, 0xFF, 0xB3, 0x4, 0x55, 0x0, 0x95, 0x2, 0xC, 0xFF, 0xB0, 0x4, 0x55, 0x0, 0x95, 0x2, 0xC, 0xFF, 0xAF, 0x7, 0x1, 0x0, 0x95, 0x6, 0xF7, 0x0, 0x7D, 0x7, 0x1, 0x0, 0x95, 0x6, 0xF7, 0x0, 0x7D, 0x5, 0xAF, 0x0, 0x95, 0x4, 0x73, 0x0, 0x7A, 0x5, 0xAF, 0x0, 0x95, 0x4, 0x73, 0x0, 0x7A, 0x5, 0xAF, 0x0, 0x95, 0x4, 0x73, 0x0, 0x7A, 0x5, 0xAF, 0x0, 0x95, 0x4, 0x73, 0x0, 0x7A, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x1E, 0x0, 0x95, 0x4, 0x81, 0x0, 0x7D, 0x5, 0x1E, 0x0, 0x95, 0x4, 0x81, 0x0, 0x7D, 0x4, 0xFF, 0x0, 0x95, 0x2, 0xD0, 0x0, 0x7D, 0x4, 0xFF, 0x0, 0x95, 0x2, 0xD0, 0x0, 0x73, 0x4, 0xFF, 0x0, 0x95, 0x2, 0xD0, 0x0, 0x46, 0x4, 0xFF, 0x0, 0x95, 0x2, 0xD0, 0xFF, 0xAA, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x4C, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x4C, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x4C, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x4C, 0x4, 0xD5, 0x0, 0x4A, 0x4, 0x22, 0x0, 0x4C, 0x4, 0xDC, 0x0, 0x2D, 0x2, 0xAA, 0x0, 0x8, 0x4, 0xDC, 0x0, 0x2D, 0x2, 0xAA, 0x0, 0x8, 0x4, 0xDC, 0x0, 0x2D, 0x2, 0xAA, 0x0, 0x8, 0x4, 0xDC, 0x0, 0x2D, 0x2, 0xAA, 0x0, 0x8, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x38, 0x0, 0x7E, 0x4, 0x72, 0x0, 0x77, 0x5, 0x2E, 0x0, 0x12, 0x3, 0xF6, 0x0, 0x17, 0x5, 0x2E, 0x0, 0x12, 0x3, 0xF6, 0x0, 0x17, 0x7, 0xB, 0x0, 0x31, 0x5, 0xF2, 0x0, 0x22, 0x7, 0xB, 0x0, 0x31, 0x5, 0xF2, 0x0, 0x22, 0x5, 0x10, 0x0, 0x29, 0x4, 0x7, 0x0, 0x1F, 0x5, 0x10, 0x0, 0x29, 0x4, 0x7, 0x0, 0x1F, 0x4, 0xE0, 0x0, 0x8, 0x3, 0xE5, 0x0, 0xC, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x7, 0x0, 0x52, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x7, 0x0, 0x52, 0x4, 0xD2, 0x0, 0x50, 0x4, 0x7, 0x0, 0x52, 0x4, 0x71, 0x0, 0x7A, 0x2, 0xAA, 0xFF, 0xE5, 0x5, 0xF2, 0x0, 0x22, 0x3, 0xE5, 0x0, 0xC, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0xFE, 0xAF, 0x5, 0x53, 0xFE, 0xE5, 0x5, 0x53, 0xFF, 0xA, 0x5, 0x53, 0xFE, 0xF9, 0x5, 0x53, 0xFF, 0x67, 0x5, 0x53, 0xFF, 0x54, 0x4, 0x61, 0x0, 0x61, 0x4, 0x61, 0x0, 0x61, 0x4, 0x61, 0x0, 0x61, 0x4, 0x61, 0x0, 0x61, 0x4, 0x61, 0x0, 0x61, 0x4, 0x61, 0x0, 0x61, 0x4, 0x86, 0xFE, 0x96, 0x4, 0x86, 0xFE, 0x9D, 0x4, 0x86, 0xFD, 0x11, 0x4, 0x86, 0xFD, 0x47, 0x4, 0x86, 0xFD, 0x6C, 0x4, 0x86, 0xFD, 0x5B, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x5, 0xB0, 0xFE, 0x9F, 0x5, 0xB0, 0xFE, 0xA6, 0x5, 0xB0, 0xFD, 0x1A, 0x5, 0xB0, 0xFD, 0x50, 0x5, 0xB0, 0xFD, 0x75, 0x5, 0xB0, 0xFD, 0x64, 0x5, 0xB0, 0xFD, 0xD2, 0x5, 0xB0, 0xFD, 0xBF, 0x2, 0xAA, 0x0, 0xAA, 0x2, 0xAA, 0x0, 0xA2, 0x2, 0xAA, 0xFF, 0xF5, 0x2, 0xAA, 0xFF, 0xE9, 0x2, 0xAA, 0x0, 0x49, 0x2, 0xAA, 0x0, 0x20, 0x2, 0xAA, 0x0, 0x2D, 0x2, 0xAA, 0x0, 0x6, 0x2, 0x42, 0xFE, 0xA1, 0x2, 0x42, 0xFE, 0xA8, 0x2, 0x42, 0xFD, 0x1C, 0x2, 0x42, 0xFD, 0x52, 0x2, 0x42, 0xFD, 0x77, 0x2, 0x42, 0xFD, 0x66, 0x2, 0x42, 0xFD, 0xD4, 0x2, 0x42, 0xFD, 0xC1, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x8E, 0x0, 0x50, 0x5, 0x9A, 0xFF, 0x6B, 0x5, 0x9A, 0xFF, 0x72, 0x5, 0xCC, 0xFE, 0x18, 0x5, 0xCC, 0xFE, 0x4E, 0x5, 0xCC, 0xFE, 0x73, 0x5, 0xCC, 0xFE, 0x62, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0xE0, 0xFE, 0x97, 0x4, 0xE0, 0xFD, 0x41, 0x4, 0xE0, 0xFD, 0x55, 0x4, 0xE0, 0xFD, 0xB0, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x5, 0x70, 0xFF, 0x75, 0x5, 0x70, 0xFF, 0x7C, 0x5, 0xA2, 0xFE, 0x22, 0x5, 0xA2, 0xFE, 0x58, 0x5, 0xA2, 0xFE, 0x7D, 0x5, 0xA2, 0xFE, 0x6C, 0x5, 0xA2, 0xFE, 0xDA, 0x5, 0xA2, 0xFE, 0xC7, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x61, 0x0, 0x61, 0x4, 0x61, 0x0, 0x61, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x2, 0xAA, 0x0, 0x3A, 0x2, 0xAA, 0x0, 0xAA, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0xFE, 0xAF, 0x5, 0x53, 0xFE, 0xE5, 0x5, 0x53, 0xFF, 0xA, 0x5, 0x53, 0xFE, 0xF9, 0x5, 0x53, 0xFF, 0x67, 0x5, 0x53, 0xFF, 0x54, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x5, 0xB0, 0xFE, 0x9F, 0x5, 0xB0, 0xFE, 0xA6, 0x5, 0xB0, 0xFD, 0x1A, 0x5, 0xB0, 0xFD, 0x50, 0x5, 0xB0, 0xFD, 0x75, 0x5, 0xB0, 0xFD, 0x64, 0x5, 0xB0, 0xFD, 0xD2, 0x5, 0xB0, 0xFD, 0xBF, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x5, 0x70, 0xFF, 0x75, 0x5, 0x70, 0xFF, 0x7C, 0x5, 0xA2, 0xFE, 0x22, 0x5, 0xA2, 0xFE, 0x58, 0x5, 0xA2, 0xFE, 0x7D, 0x5, 0xA2, 0xFE, 0x6C, 0x5, 0xA2, 0xFE, 0xDA, 0x5, 0xA2, 0xFE, 0xC7, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x4, 0x85, 0x0, 0x56, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0xFF, 0xD7, 0x5, 0x53, 0x0, 0x12, 0x5, 0x53, 0x0, 0x12, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x89, 0x0, 0x7F, 0x4, 0x86, 0xFE, 0x39, 0x4, 0x86, 0xFE, 0x82, 0x5, 0xB0, 0xFE, 0x42, 0x5, 0xB0, 0xFE, 0x8B, 0x5, 0xB0, 0x0, 0x95, 0x2, 0xAA, 0xFF, 0xEC, 0x2, 0xAA, 0xFF, 0xDB, 0x2, 0xAA, 0xFF, 0xC2, 0x2, 0xAA, 0xFF, 0xD0, 0x2, 0xAA, 0xFF, 0xED, 0x2, 0xAA, 0xFF, 0xC6, 0x2, 0x42, 0xFF, 0xDF, 0x2, 0x42, 0xFF, 0xCE, 0x2, 0x42, 0x0, 0x2D, 0x2, 0x42, 0x0, 0xA4, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0x89, 0x0, 0x81, 0x4, 0x89, 0x0, 0x81, 0x4, 0x61, 0x0, 0x80, 0x4, 0x61, 0x0, 0x80, 0x4, 0xE0, 0x0, 0x8, 0x4, 0xE0, 0x0, 0x8, 0x4, 0xE0, 0xFE, 0x33, 0x4, 0xE0, 0xFE, 0x7C, 0x5, 0x1E, 0xFE, 0xD8, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x6, 0x95, 0x0, 0x66, 0x5, 0x9A, 0xFF, 0xE, 0x5, 0x9A, 0xFF, 0x57, 0x5, 0x70, 0xFF, 0x18, 0x5, 0x70, 0xFF, 0x61, 0x5, 0x5C, 0x0, 0x6B, 0x1, 0xFE, 0x0, 0x0, 0x7, 0xCA, 0x0, 0x3C, 0x6, 0xA, 0x0, 0x3C, 0x6, 0xA, 0x0, 0x90, 0x1, 0xFE, 0x0, 0x0, 0x2, 0xCC, 0x0, 0x88, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x1D, 0xFF, 0x66, 0x5, 0x1A, 0xFF, 0x73, 0x2, 0x39, 0xFF, 0x75, 0x4, 0xCA, 0xFF, 0x9E, 0x4, 0x79, 0xFF, 0x24, 0x4, 0xEE, 0xFF, 0xAE, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x61, 0x0, 0x76, 0x3, 0xE1, 0x0, 0x76, 0x4, 0x2A, 0x0, 0x41, 0x4, 0xDE, 0x0, 0x76, 0x1, 0xFD, 0x0, 0x85, 0x4, 0x5C, 0x0, 0x76, 0x6, 0x6, 0x0, 0x76, 0x4, 0xDD, 0x0, 0x76, 0x4, 0xC0, 0x0, 0x50, 0x4, 0x6D, 0x0, 0x76, 0x4, 0x3C, 0x0, 0x25, 0x4, 0x3D, 0x0, 0x5, 0x4, 0x5F, 0x0, 0x16, 0x1, 0xFD, 0xFF, 0x9E, 0x4, 0x3D, 0x0, 0x5, 0x3, 0xE1, 0x0, 0x76, 0x3, 0xBA, 0x0, 0x76, 0x4, 0x35, 0x0, 0x3F, 0x1, 0xFD, 0x0, 0x85, 0x1, 0xFD, 0xFF, 0x9E, 0x3, 0xD6, 0x0, 0x25, 0x4, 0x5C, 0x0, 0x76, 0x4, 0x47, 0x0, 0x20, 0x4, 0x9E, 0x0, 0x9, 0x4, 0x61, 0x0, 0x76, 0x3, 0xBA, 0x0, 0x76, 0x3, 0xE1, 0x0, 0x76, 0x4, 0xE4, 0x0, 0x76, 0x6, 0x6, 0x0, 0x76, 0x4, 0xDE, 0x0, 0x76, 0x4, 0xC0, 0x0, 0x50, 0x4, 0xD8, 0x0, 0x76, 0x4, 0x6D, 0x0, 0x76, 0x4, 0x80, 0x0, 0x50, 0x4, 0x3C, 0x0, 0x25, 0x4, 0x5F, 0x0, 0x16, 0x4, 0x46, 0x0, 0x43, 0x4, 0xDE, 0x0, 0x76, 0x4, 0x80, 0x0, 0x50, 0x4, 0x3D, 0x0, 0x5, 0x5, 0xFE, 0x0, 0xB, 0x4, 0xE4, 0x0, 0x76, 0x4, 0x47, 0x0, 0x20, 0x5, 0x9E, 0x0, 0x51, 0x3, 0xD6, 0x0, 0x25, 0x5, 0xD3, 0x0, 0x85, 0x6, 0x47, 0xFF, 0xF0, 0x4, 0xC0, 0x0, 0x50, 0x4, 0x35, 0x0, 0x3F, 0x6, 0x8, 0x0, 0x29, 0x6, 0x8, 0x0, 0x29, 0x6, 0x8, 0x0, 0x29, 0x4, 0x3D, 0x0, 0x5, 0x5, 0x53, 0x0, 0x12, 0x4, 0x55, 0x0, 0x5B, 0x4, 0x86, 0x0, 0x95, 0x4, 0x4B, 0x0, 0x54, 0x5, 0x86, 0x0, 0x66, 0x4, 0x8E, 0x0, 0x50, 0x4, 0x9E, 0x0, 0x9, 0x3, 0xE1, 0x0, 0x76, 0x4, 0xC0, 0x0, 0x50, 0x5, 0x75, 0x0, 0x66, 0x5, 0x75, 0x0, 0x66, 0x5, 0x75, 0x0, 0x66, 0x5, 0x75, 0x0, 0x66, 0x5, 0x75, 0x0, 0x66, 0x5, 0x75, 0x0, 0x66, 0x5, 0x75, 0x0, 0x66, 0x5, 0x75, 0x0, 0x66, 0x5, 0x75, 0x0, 0x66, 0x5, 0x75, 0x0, 0x66, 0x5, 0x98, 0x0, 0x64, 0x5, 0x98, 0x0, 0x64, 0x5, 0x98, 0x0, 0x64, 0x5, 0x98, 0x0, 0x64, 0x5, 0x98, 0x0, 0x64, 0x5, 0x98, 0x0, 0x64, 0x5, 0x98, 0x0, 0x64, 0x5, 0x98, 0x0, 0x64, 0x5, 0x98, 0x0, 0x64, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x5, 0xB0, 0x0, 0x95, 0x2, 0x1B, 0xFF, 0x91, 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x9, 0x2C, 0x0, 0x3, 0x0, 0x1, 0x0, 0x0, 0x0, 0x24, 0x0, 0x3, 0x0, 0xA, 0x0, 0x0, 0x9, 0x2C, 0x0, 0x4, 0x9, 0x8, 0x0, 0x0, 0x1, 0x4C, 0x1, 0x0, 0x0, 0x7, 0x0, 0x4C, 0x0, 0x0, 0x0, 0x2, 0x0, 0x9, 0x0, 0xD, 0x0, 0x7E, 0x0, 0xA0, 0x0, 0xAC, 0x0, 0xAD, 0x0, 0xBF, 0x0, 0xC6, 0x0, 0xCF, 0x0, 0xE6, 0x0, 0xEF, 0x0, 0xFE, 0x1, 0xF, 0x1, 0x11, 0x1, 0x25, 0x1, 0x27, 0x1, 0x30, 0x1, 0x53, 0x1, 0x5F, 0x1, 0x67, 0x1, 0x7E, 0x1, 0x95, 0x1, 0x9F, 0x1, 0xC6, 0x1, 0xE3, 0x1, 0xFF, 0x2, 0x17, 0x2, 0x25, 0x2, 0x33, 0x2, 0x74, 0x2, 0x75, 0x2, 0x98, 0x2, 0x9C, 0x2, 0xBB, 0x2, 0xBC, 0x3, 0x77, 0x3, 0x7F, 0x3, 0x8A, 0x3, 0x8C, 0x3, 0x92, 0x3, 0xA1, 0x3, 0xB0, 0x3, 0xB9, 0x3, 0xD4, 0x3, 0xE1, 0x4, 0x25, 0x4, 0x2F, 0x4, 0x45, 0x4, 0x4F, 0x4, 0x62, 0x4, 0x6F, 0x4, 0x79, 0x4, 0x8B, 0x4, 0x9F, 0x4, 0xA9, 0x4, 0xB1, 0x4, 0xBA, 0x4, 0xCE, 0x4, 0xD7, 0x4, 0xE9, 0x4, 0xF5, 0x5, 0x1, 0x5, 0x10, 0x5, 0x1D, 0x5, 0x2F, 0x1A, 0xBE, 0x1D, 0xF5, 0x1E, 0x1, 0x1E, 0x27, 0x1E, 0x2F, 0x1E, 0x3D, 0x1E, 0x3F, 0x1E, 0x7F, 0x1E, 0x85, 0x1E, 0x9A, 0x1E, 0x9F, 0x1E, 0xF1, 0x1E, 0xFF, 0x1F, 0x15, 0x1F, 0x1D, 0x1F, 0x45, 0x1F, 0x4D, 0x1F, 0x57, 0x1F, 0x59, 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x7D, 0x1F, 0xB4, 0x1F, 0xBC, 0x1F, 0xC4, 0x1F, 0xCC, 0x1F, 0xD3, 0x1F, 0xDB, 0x1F, 0xDF, 0x1F, 0xEC, 0x1F, 0xEF, 0x1F, 0xF4, 0x1F, 0xFC, 0x1F, 0xFE, 0x20, 0x9, 0x20, 0x14, 0x20, 0x15, 0x20, 0x27, 0x20, 0x3C, 0x20, 0x46, 0x20, 0x49, 0x20, 0x5E, 0x20, 0x5F, 0x20, 0x71, 0x20, 0x8E, 0x20, 0x9C, 0x20, 0xAB, 0x20, 0xBE, 0x20, 0xDC, 0x20, 0xE8, 0x20, 0xF0, 0x21, 0x1, 0x21, 0x3, 0x21, 0x6, 0x21, 0x9, 0x21, 0x13, 0x21, 0x17, 0x21, 0x23, 0x21, 0x26, 0x21, 0x2B, 0x21, 0x2E, 0x21, 0x32, 0x21, 0x3B, 0x21, 0x4D, 0x21, 0x89, 0x22, 0x2, 0x22, 0x6, 0x22, 0xF, 0x22, 0x12, 0x22, 0x1A, 0x22, 0x1E, 0x22, 0x2B, 0x22, 0x48, 0x22, 0x60, 0x22, 0x65, 0x24, 0x23, 0x25, 0xCA, 0x27, 0xEF, 0x2B, 0x4F, 0x2B, 0x5F, 0x2C, 0x7F, 0x2E, 0x42, 0xA6, 0x9D, 0xA6, 0x9F, 0xA7, 0x8E, 0xA7, 0x8F, 0xA7, 0xAD, 0xA7, 0xB1, 0xA7, 0xFF, 0xA9, 0x2E, 0xAB, 0x5F, 0xAB, 0x65, 0xEE, 0x2, 0xF6, 0xC3, 0xFB, 0x6, 0xFE, 0x2D, 0xFE, 0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x9, 0x0, 0xD, 0x0, 0x20, 0x0, 0xA0, 0x0, 0xA1, 0x0, 0xAD, 0x0, 0xAE, 0x0, 0xC0, 0x0, 0xC7, 0x0, 0xD0, 0x0, 0xE7, 0x0, 0xF0, 0x0, 0xFF, 0x1, 0x10, 0x1, 0x12, 0x1, 0x26, 0x1, 0x28, 0x1, 0x31, 0x1, 0x54, 0x1, 0x60, 0x1, 0x68, 0x1, 0x7F, 0x1, 0x96, 0x1, 0xA0, 0x1, 0xC7, 0x1, 0xE4, 0x2, 0x0, 0x2, 0x18, 0x2, 0x26, 0x2, 0x34, 0x2, 0x75, 0x2, 0x76, 0x2, 0x99, 0x2, 0x9D, 0x2, 0xBC, 0x2, 0xBD, 0x3, 0x7A, 0x3, 0x84, 0x3, 0x8C, 0x3, 0x8E, 0x3, 0x93, 0x3, 0xA3, 0x3, 0xB1, 0x3, 0xBA, 0x3, 0xD5, 0x3, 0xF0, 0x4, 0x26, 0x4, 0x30, 0x4, 0x46, 0x4, 0x50, 0x4, 0x63, 0x4, 0x70, 0x4, 0x7A, 0x4, 0x8C, 0x4, 0xA0, 0x4, 0xAA, 0x4, 0xB2, 0x4, 0xBB, 0x4, 0xCF, 0x4, 0xD8, 0x4, 0xEA, 0x4, 0xF6, 0x5, 0x2, 0x5, 0x11, 0x5, 0x1E, 0x1A, 0xB0, 0x1D, 0x0, 0x1D, 0xFC, 0x1E, 0x2, 0x1E, 0x28, 0x1E, 0x30, 0x1E, 0x3E, 0x1E, 0x40, 0x1E, 0x80, 0x1E, 0x86, 0x1E, 0x9B, 0x1E, 0xA0, 0x1E, 0xF2, 0x1F, 0x0, 0x1F, 0x18, 0x1F, 0x20, 0x1F, 0x48, 0x1F, 0x50, 0x1F, 0x59, 0x1F, 0x5B, 0x1F, 0x5D, 0x1F, 0x5F, 0x1F, 0x80, 0x1F, 0xB6, 0x1F, 0xBD, 0x1F, 0xC6, 0x1F, 0xCD, 0x1F, 0xD6, 0x1F, 0xDD, 0x1F, 0xE0, 0x1F, 0xED, 0x1F, 0xF2, 0x1F, 0xF6, 0x1F, 0xFD, 0x20, 0x0, 0x20, 0xA, 0x20, 0x15, 0x20, 0x16, 0x20, 0x2F, 0x20, 0x3D, 0x20, 0x47, 0x20, 0x4A, 0x20, 0x5F, 0x20, 0x70, 0x20, 0x74, 0x20, 0x90, 0x20, 0xA0, 0x20, 0xAC, 0x20, 0xDB, 0x20, 0xE8, 0x20, 0xF0, 0x21, 0x0, 0x21, 0x3, 0x21, 0x5, 0x21, 0x9, 0x21, 0x13, 0x21, 0x16, 0x21, 0x1E, 0x21, 0x25, 0x21, 0x2A, 0x21, 0x2E, 0x21, 0x32, 0x21, 0x3B, 0x21, 0x4D, 0x21, 0x4F, 0x22, 0x2, 0x22, 0x6, 0x22, 0xF, 0x22, 0x11, 0x22, 0x1A, 0x22, 0x1E, 0x22, 0x2B, 0x22, 0x48, 0x22, 0x60, 0x22, 0x64, 0x24, 0x23, 0x25, 0xCA, 0x27, 0xE6, 0x2B, 0x4E, 0x2B, 0x5A, 0x2C, 0x60, 0x2D, 0xE0, 0xA6, 0x40, 0xA6, 0x9F, 0xA7, 0x0, 0xA7, 0x8F, 0xA7, 0x90, 0xA7, 0xB0, 0xA7, 0xF7, 0xA9, 0x2E, 0xAB, 0x30, 0xAB, 0x64, 0xEE, 0x1, 0xF6, 0xC3, 0xFB, 0x0, 0xFE, 0x20, 0xFE, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0x0, 0x1, 0x0, 0x0, 0xFF, 0xFA, 0xFF, 0xF7, 0xFF, 0xE5, 0x8, 0x26, 0xFF, 0xC3, 0x8, 0x1A, 0xFF, 0xC2, 0x0, 0x0, 0x8, 0xD, 0x0, 0x0, 0x8, 0x8, 0x0, 0x0, 0x8, 0x4, 0x0, 0x0, 0x8, 0x2, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x7, 0xF8, 0x0, 0x0, 0x7, 0xFA, 0xFF, 0x17, 0x0, 0x0, 0xFF, 0x14, 0x9, 0x21, 0x0, 0x0, 0x9, 0x14, 0x0, 0x0, 0x9, 0x8, 0xFE, 0xB5, 0x8, 0xC7, 0xFE, 0xB4, 0x0, 0x0, 0xFE, 0xB2, 0x7, 0x72, 0xFE, 0xB1, 0x0, 0x0, 0x0, 0x0, 0x6, 0x4D, 0x6, 0x4C, 0x0, 0x0, 0x0, 0x0, 0xFE, 0x89, 0x0, 0x0, 0xFE, 0x7D, 0x0, 0x0, 0xFE, 0x50, 0x0, 0x0, 0xFE, 0x48, 0x0, 0x0, 0xFE, 0x3D, 0x0, 0x0, 0xFE, 0x37, 0x0, 0x0, 0xFE, 0x30, 0x0, 0x0, 0xFE, 0x28, 0x0, 0x0, 0x5, 0x77, 0x0, 0x0, 0x5, 0x75, 0x0, 0x0, 0xFD, 0xF5, 0x0, 0x0, 0xFD, 0xF0, 0xE8, 0x70, 0xE6, 0x2F, 0x0, 0x0, 0xED, 0x4B, 0x0, 0x0, 0xED, 0x45, 0xEB, 0xF1, 0xED, 0x43, 0xEB, 0xA2, 0xED, 0x3D, 0xE5, 0x94, 0xEB, 0xCE, 0x0, 0x0, 0xEC, 0xD8, 0xEC, 0xD6, 0xEC, 0xD4, 0xEC, 0xD2, 0xEC, 0xD0, 0xEC, 0xCF, 0xEC, 0xCE, 0xEC, 0xCD, 0xEC, 0xCC, 0xEC, 0xCA, 0xEC, 0xC9, 0x0, 0x0, 0xEC, 0xC3, 0x0, 0x0, 0xEC, 0xBE, 0xE4, 0x65, 0xEC, 0xBA, 0xE4, 0x58, 0xEC, 0xB5, 0xEC, 0xB4, 0xE4, 0x4B, 0xE4, 0x4A, 0xE4, 0x4B, 0xEA, 0xC7, 0xE4, 0x4A, 0x0, 0x0, 0xE4, 0x3F, 0xEC, 0x6B, 0xE4, 0x3C, 0xEC, 0x56, 0xE4, 0x2B, 0xE4, 0x29, 0xE4, 0x28, 0x0, 0x0, 0xE4, 0x23, 0xE4, 0x7, 0xE3, 0xFC, 0xE3, 0xF5, 0xE3, 0xE6, 0xE3, 0xE5, 0xE3, 0xE4, 0xE3, 0xE2, 0xE3, 0xD9, 0xE3, 0xD7, 0xE3, 0xD1, 0x0, 0x0, 0xE3, 0xCC, 0xE3, 0xCA, 0xE3, 0xC7, 0xE3, 0xBF, 0xE3, 0xAE, 0xE3, 0xAD, 0xE3, 0x35, 0xE0, 0x2B, 0xE3, 0x29, 0xE3, 0x28, 0xE3, 0x21, 0xE3, 0x1E, 0xE3, 0x12, 0xE2, 0xF6, 0xE2, 0xDF, 0xE2, 0xDC, 0xE1, 0x1F, 0xDF, 0x79, 0xDD, 0x5E, 0xDA, 0x0, 0xD9, 0xF6, 0xD8, 0xF6, 0xD7, 0x96, 0x5F, 0x99, 0x5F, 0x98, 0x5F, 0x38, 0x65, 0x27, 0x5F, 0x37, 0x5F, 0x35, 0x5E, 0xF0, 0x5D, 0xC2, 0x5B, 0xC1, 0x5B, 0xBD, 0x19, 0x22, 0x10, 0x62, 0xC, 0x26, 0x9, 0xD, 0x8, 0x3C, 0x7, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3A, 0x0, 0x0, 0x1, 0x44, 0x0, 0x0, 0x1, 0x6E, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0xCA, 0x0, 0x0, 0x0, 0x0, 0x1, 0xD4, 0x0, 0x0, 0x0, 0x0, 0x1, 0xE2, 0x0, 0x0, 0x2, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x28, 0x2, 0x32, 0x0, 0x0, 0x0, 0x0, 0x2, 0x3A, 0x2, 0x56, 0x0, 0x0, 0x2, 0x6E, 0x0, 0x0, 0x2, 0xA0, 0x0, 0x0, 0x3, 0x8, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x3, 0x52, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, 0x3, 0x86, 0x0, 0x0, 0x3, 0x92, 0x0, 0x0, 0x3, 0xB6, 0x0, 0x0, 0x3, 0xD6, 0x0, 0x0, 0x3, 0xEA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xFC, 0x0, 0x0, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8, 0x0, 0x0, 0x4, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xCD, 0x8, 0xCE, 0x8, 0xCF, 0x8, 0xD0, 0x8, 0xD1, 0x8, 0xD2, 0x0, 0x82, 0x8, 0xC9, 0x8, 0xDD, 0x8, 0xDE, 0x8, 0xDF, 0x8, 0xE0, 0x8, 0xE1, 0x8, 0xE2, 0x0, 0x83, 0x0, 0x84, 0x8, 0xE3, 0x8, 0xE4, 0x8, 0xE5, 0x8, 0xE6, 0x8, 0xE7, 0x0, 0x85, 0x0, 0x86, 0x8, 0xE8, 0x8, 0xE9, 0x8, 0xEA, 0x8, 0xEB, 0x8, 0xEC, 0x8, 0xED, 0x0, 0x87, 0x0, 0x88, 0x8, 0xF8, 0x8, 0xF9, 0x8, 0xFA, 0x8, 0xFB, 0x8, 0xFC, 0x8, 0xFD, 0x0, 0x89, 0x0, 0x8A, 0x8, 0xFE, 0x8, 0xFF, 0x9, 0x0, 0x9, 0x1, 0x9, 0x2, 0x0, 0x8B, 0x8, 0xC8, 0x0, 0x8C, 0x0, 0x8D, 0x8, 0xCA, 0x0, 0x8E, 0x9, 0x31, 0x9, 0x32, 0x9, 0x33, 0x9, 0x34, 0x9, 0x35, 0x9, 0x36, 0x0, 0x8F, 0x9, 0x37, 0x9, 0x38, 0x9, 0x39, 0x9, 0x3A, 0x9, 0x3B, 0x9, 0x3C, 0x9, 0x3D, 0x9, 0x3E, 0x0, 0x90, 0x0, 0x91, 0x9, 0x3F, 0x9, 0x40, 0x9, 0x41, 0x9, 0x42, 0x9, 0x43, 0x9, 0x44, 0x9, 0x45, 0x0, 0x92, 0x0, 0x93, 0x9, 0x46, 0x9, 0x47, 0x9, 0x48, 0x9, 0x49, 0x9, 0x4A, 0x9, 0x4B, 0x0, 0x94, 0x0, 0x95, 0x9, 0x5A, 0x9, 0x5B, 0x9, 0x5E, 0x9, 0x5F, 0x9, 0x60, 0x9, 0x61, 0x8, 0xCB, 0x8, 0xCC, 0xA, 0xE6, 0x0, 0xAD, 0x0, 0xAE, 0x0, 0xAF, 0x0, 0xB0, 0x0, 0xB1, 0x0, 0xB2, 0x0, 0xB3, 0xA, 0xE7, 0xA, 0x5E, 0x0, 0xDB, 0x0, 0xDC, 0xB, 0x5, 0xB, 0x6, 0xB, 0x7, 0xB, 0x8, 0xB, 0x9, 0xB, 0xA, 0xB, 0xB, 0xB, 0xC, 0x0, 0xDD, 0x0, 0xDE, 0xA, 0x2D, 0xB, 0xD, 0xB, 0xE, 0xB, 0xF, 0xB, 0x10, 0xB, 0x11, 0x0, 0xDF, 0x0, 0xE0, 0xB, 0x12, 0xB, 0x13, 0x8, 0xD3, 0x8, 0xEE, 0x9, 0x79, 0x9, 0x7A, 0x9, 0x7B, 0x9, 0x7C, 0x9, 0x58, 0x9, 0x59, 0x9, 0x5C, 0x9, 0x5D, 0x0, 0xE1, 0x0, 0xE2, 0xB, 0x2C, 0xB, 0x2D, 0x0, 0xE3, 0x0, 0xE4, 0x0, 0xE5, 0x0, 0xE6, 0x0, 0xE7, 0x0, 0xE8, 0xB, 0x3D, 0x1, 0x4D, 0x1, 0x4E, 0xB, 0x3E, 0xA, 0xE5, 0x2, 0x29, 0x2, 0x2A, 0x2, 0x2B, 0x2, 0x2C, 0xB, 0x3F, 0x2, 0x2D, 0x2, 0x2E, 0x9, 0xD5, 0x2, 0x2F, 0x9, 0xD6, 0x9, 0xD7, 0x9, 0xD8, 0x2, 0x30, 0x2, 0x31, 0x9, 0xDF, 0x9, 0xE0, 0x9, 0xE1, 0x2, 0x32, 0x9, 0xE2, 0x9, 0xE3, 0x2, 0x33, 0x9, 0xE4, 0x9, 0xE5, 0x2, 0x34, 0x9, 0xE6, 0x2, 0x35, 0x9, 0xE7, 0x2, 0x36, 0x9, 0xE8, 0x9, 0xE9, 0x2, 0x37, 0x9, 0xEA, 0x2, 0x38, 0x2, 0x39, 0x9, 0xEB, 0x9, 0xEC, 0x9, 0xED, 0x9, 0xEE, 0x9, 0xEF, 0x9, 0xF0, 0x9, 0xF1, 0x9, 0xF2, 0x2, 0x43, 0x9, 0xF4, 0x9, 0xF5, 0x2, 0x44, 0x9, 0xF3, 0x2, 0x45, 0x2, 0x46, 0x2, 0x47, 0x2, 0x48, 0x2, 0x49, 0x2, 0x4A, 0x2, 0x4B, 0x9, 0xF6, 0x2, 0x4C, 0x2, 0x4D, 0x9, 0xF7, 0x9, 0xF8, 0x9, 0xF9, 0x9, 0xFA, 0x9, 0xFB, 0x2, 0x4E, 0x2, 0x4F, 0x2, 0x50, 0x2, 0x51, 0xB, 0x40, 0xB, 0x41, 0x2, 0x5F, 0x2, 0x60, 0xB, 0x42, 0xB, 0x43, 0xB, 0x44, 0x2, 0x61, 0x2, 0x62, 0xB, 0x45, 0xB, 0x46, 0xB, 0x47, 0xB, 0x48, 0x2, 0x63, 0x2, 0x64, 0x2, 0x65, 0x2, 0x66, 0x2, 0x67, 0xA, 0x33, 0x9, 0xFC, 0x2, 0x68, 0x9, 0xFD, 0x2, 0x69, 0x9, 0xFE, 0x9, 0xFF, 0xA, 0x0, 0xA, 0x1, 0x2, 0x6A, 0x2, 0x6B, 0x2, 0x6C, 0xA, 0x3, 0xA, 0x34, 0xA, 0x4, 0x2, 0x6D, 0xA, 0x5, 0x2, 0x6E, 0xA, 0x6, 0xA, 0x7, 0x2, 0x6F, 0xA, 0x8, 0x2, 0x70, 0x2, 0x71, 0x2, 0x72, 0xA, 0x9, 0xA, 0x2, 0x2, 0x73, 0xA, 0xA, 0xA, 0xB, 0xA, 0xC, 0xA, 0xD, 0xA, 0xE, 0xA, 0xF, 0xA, 0x10, 0x2, 0x74, 0x2, 0x75, 0xA, 0x11, 0xA, 0x12, 0x2, 0x80, 0x2, 0x81, 0x2, 0x82, 0x2, 0x83, 0xA, 0x13, 0x2, 0x84, 0x2, 0x85, 0x2, 0x86, 0xA, 0x14, 0x2, 0x87, 0x2, 0x88, 0x2, 0x89, 0x2, 0x8A, 0xA, 0x15, 0x2, 0x8B, 0xA, 0x16, 0xA, 0x17, 0x2, 0x8C, 0xA, 0x18, 0x2, 0x8D, 0xA, 0x19, 0xA, 0x35, 0xA, 0x1A, 0x2, 0x98, 0xA, 0x1B, 0x2, 0x99, 0xA, 0x1C, 0xA, 0x1D, 0xA, 0x1E, 0xA, 0x1F, 0x2, 0x9A, 0x2, 0x9B, 0x2, 0x9C, 0xA, 0x20, 0xA, 0x36, 0xA, 0x21, 0x2, 0x9D, 0x2, 0x9E, 0x2, 0x9F, 0xA, 0xD1, 0xA, 0x37, 0xA, 0x38, 0x2, 0xAD, 0x2, 0xAE, 0x2, 0xAF, 0x2, 0xB0, 0xA, 0x39, 0xA, 0x3A, 0xA, 0x3C, 0xA, 0x3B, 0xA, 0xD0, 0x2, 0xC3, 0x2, 0xC4, 0x2, 0xC5, 0x2, 0xC6, 0x2, 0xC7, 0xA, 0xD2, 0xA, 0xD3, 0x2, 0xC8, 0x2, 0xC9, 0x2, 0xCA, 0x2, 0xCB, 0xA, 0x3D, 0xA, 0x3E, 0x2, 0xCC, 0x2, 0xCD, 0x2, 0xCE, 0x2, 0xCF, 0xA, 0xD4, 0xA, 0xD5, 0xA, 0x3F, 0xA, 0x40, 0xA, 0xC7, 0xA, 0xC8, 0xA, 0x41, 0xA, 0x42, 0xA, 0xD6, 0xA, 0xD7, 0xA, 0xCF, 0x2, 0xE3, 0x2, 0xE4, 0xA, 0xCD, 0xA, 0xCE, 0xA, 0x43, 0xA, 0x44, 0xA, 0x45, 0x2, 0xE5, 0x2, 0xE6, 0x2, 0xE7, 0x2, 0xE8, 0x2, 0xE9, 0x2, 0xEA, 0x2, 0xEB, 0x2, 0xEC, 0xA, 0xC9, 0xA, 0xCA, 0x2, 0xED, 0x2, 0xEE, 0x2, 0xEF, 0xA, 0x50, 0xA, 0x4F, 0xA, 0x51, 0xA, 0x52, 0xA, 0x53, 0xA, 0x54, 0xA, 0x55, 0x2, 0xF0, 0x2, 0xF1, 0xA, 0x56, 0xA, 0x57, 0xA, 0x58, 0xA, 0x59, 0xA, 0x5A, 0xA, 0x5B, 0xA, 0x5C, 0xA, 0x5D, 0xA, 0xCB, 0xA, 0xCC, 0xA, 0x6B, 0xA, 0x6C, 0x2, 0xF2, 0x2, 0xF3, 0x2, 0xF4, 0x2, 0xF5, 0xA, 0xD8, 0xA, 0xD9, 0x2, 0xF6, 0xA, 0x6D, 0xA, 0xDA, 0x3, 0x6, 0x3, 0x7, 0x3, 0x8, 0x3, 0x9, 0x3, 0xA, 0x3, 0xB, 0x3, 0xC, 0x3, 0xD, 0xB, 0x49, 0xB, 0x4A, 0xB, 0x4B, 0xB, 0x4C, 0x4, 0x25, 0x4, 0x26, 0x4, 0x27, 0x4, 0x28, 0xA, 0x31, 0xA, 0x32, 0x4, 0x29, 0x4, 0x2A, 0xB, 0x73, 0xB, 0x74, 0x4, 0x2B, 0x4, 0x2C, 0x4, 0x2D, 0x4, 0x2E, 0xA, 0x28, 0xA, 0x29, 0xA, 0xC0, 0xA, 0xC1, 0xA, 0xC2, 0xA, 0xC3, 0xA, 0xC4, 0xA, 0xC5, 0x4, 0x34, 0x4, 0x35, 0x4, 0x36, 0x4, 0x37, 0x4, 0x38, 0x4, 0x39, 0x4, 0x3A, 0x4, 0x3B, 0x4, 0x3C, 0x4, 0x3D, 0x4, 0x3E, 0xC, 0x86, 0xC, 0x87, 0xC, 0x88, 0x4, 0x3F, 0x4, 0x40, 0x4, 0x41, 0xC, 0x90, 0xC, 0x91, 0xC, 0x92, 0xC, 0x93, 0xC, 0xB1, 0x4, 0x72, 0x4, 0x73, 0xA, 0x2A, 0xA, 0x2B, 0x4, 0x74, 0x4, 0x75, 0x4, 0x76, 0x4, 0x77, 0x4, 0x78, 0x4, 0x79, 0x4, 0x7A, 0x4, 0x7B, 0xA, 0x2C, 0x4, 0xC5, 0x4, 0xC6, 0x4, 0xC7, 0xA, 0xDB, 0x4, 0xC8, 0x4, 0xC9, 0x4, 0xCA, 0x4, 0xCB, 0x4, 0xCC, 0x4, 0xCD, 0x4, 0xCE, 0xA, 0xC6, 0x4, 0xF5, 0x2, 0x39, 0x0, 0xC, 0x0, 0x0, 0x0, 0x0, 0xF, 0xA0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4C, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0xD, 0x0, 0x0, 0x0, 0xD, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x7E, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0xA0, 0x0, 0x0, 0x0, 0xA0, 0x0, 0x0, 0x8, 0xC6, 0x0, 0x0, 0x0, 0xA1, 0x0, 0x0, 0x0, 0xAC, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0xAD, 0x0, 0x0, 0x0, 0xAD, 0x0, 0x0, 0x8, 0xC7, 0x0, 0x0, 0x0, 0xAE, 0x0, 0x0, 0x0, 0xBF, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0xC0, 0x0, 0x0, 0x0, 0xC5, 0x0, 0x0, 0x8, 0xCD, 0x0, 0x0, 0x0, 0xC6, 0x0, 0x0, 0x0, 0xC6, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0xC7, 0x0, 0x0, 0x0, 0xCF, 0x0, 0x0, 0x8, 0xD4, 0x0, 0x0, 0x0, 0xD0, 0x0, 0x0, 0x0, 0xD0, 0x0, 0x0, 0x8, 0xC9, 0x0, 0x0, 0x0, 0xD1, 0x0, 0x0, 0x0, 0xD6, 0x0, 0x0, 0x8, 0xDD, 0x0, 0x0, 0x0, 0xD7, 0x0, 0x0, 0x0, 0xD8, 0x0, 0x0, 0x0, 0x83, 0x0, 0x0, 0x0, 0xD9, 0x0, 0x0, 0x0, 0xDD, 0x0, 0x0, 0x8, 0xE3, 0x0, 0x0, 0x0, 0xDE, 0x0, 0x0, 0x0, 0xDF, 0x0, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0xE0, 0x0, 0x0, 0x0, 0xE5, 0x0, 0x0, 0x8, 0xE8, 0x0, 0x0, 0x0, 0xE6, 0x0, 0x0, 0x0, 0xE6, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0xE7, 0x0, 0x0, 0x0, 0xEF, 0x0, 0x0, 0x8, 0xEF, 0x0, 0x0, 0x0, 0xF0, 0x0, 0x0, 0x0, 0xF0, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0xF1, 0x0, 0x0, 0x0, 0xF6, 0x0, 0x0, 0x8, 0xF8, 0x0, 0x0, 0x0, 0xF7, 0x0, 0x0, 0x0, 0xF8, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, 0xF9, 0x0, 0x0, 0x0, 0xFD, 0x0, 0x0, 0x8, 0xFE, 0x0, 0x0, 0x0, 0xFE, 0x0, 0x0, 0x0, 0xFE, 0x0, 0x0, 0x0, 0x8B, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x1, 0xF, 0x0, 0x0, 0x9, 0x3, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x8, 0xC8, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, 0x0, 0x8C, 0x0, 0x0, 0x1, 0x12, 0x0, 0x0, 0x1, 0x25, 0x0, 0x0, 0x9, 0x14, 0x0, 0x0, 0x1, 0x26, 0x0, 0x0, 0x1, 0x26, 0x0, 0x0, 0x0, 0x8D, 0x0, 0x0, 0x1, 0x27, 0x0, 0x0, 0x1, 0x27, 0x0, 0x0, 0x8, 0xCA, 0x0, 0x0, 0x1, 0x28, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x9, 0x28, 0x0, 0x0, 0x1, 0x31, 0x0, 0x0, 0x1, 0x31, 0x0, 0x0, 0x0, 0x8E, 0x0, 0x0, 0x1, 0x32, 0x0, 0x0, 0x1, 0x37, 0x0, 0x0, 0x9, 0x31, 0x0, 0x0, 0x1, 0x38, 0x0, 0x0, 0x1, 0x38, 0x0, 0x0, 0x0, 0x8F, 0x0, 0x0, 0x1, 0x39, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x9, 0x37, 0x0, 0x0, 0x1, 0x41, 0x0, 0x0, 0x1, 0x42, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x1, 0x43, 0x0, 0x0, 0x1, 0x49, 0x0, 0x0, 0x9, 0x3F, 0x0, 0x0, 0x1, 0x4A, 0x0, 0x0, 0x1, 0x4B, 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x1, 0x4C, 0x0, 0x0, 0x1, 0x51, 0x0, 0x0, 0x9, 0x46, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, 0x1, 0x53, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x1, 0x54, 0x0, 0x0, 0x1, 0x5F, 0x0, 0x0, 0x9, 0x4C, 0x0, 0x0, 0x1, 0x60, 0x0, 0x0, 0x1, 0x61, 0x0, 0x0, 0x9, 0x5A, 0x0, 0x0, 0x1, 0x62, 0x0, 0x0, 0x1, 0x65, 0x0, 0x0, 0x9, 0x5E, 0x0, 0x0, 0x1, 0x66, 0x0, 0x0, 0x1, 0x67, 0x0, 0x0, 0x8, 0xCB, 0x0, 0x0, 0x1, 0x68, 0x0, 0x0, 0x1, 0x7E, 0x0, 0x0, 0x9, 0x62, 0x0, 0x0, 0x1, 0x7F, 0x0, 0x0, 0x1, 0x95, 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, 0x1, 0x96, 0x0, 0x0, 0x1, 0x96, 0x0, 0x0, 0xA, 0xE6, 0x0, 0x0, 0x1, 0x97, 0x0, 0x0, 0x1, 0x9D, 0x0, 0x0, 0x0, 0xAD, 0x0, 0x0, 0x1, 0x9E, 0x0, 0x0, 0x1, 0x9E, 0x0, 0x0, 0xA, 0xE7, 0x0, 0x0, 0x1, 0x9F, 0x0, 0x0, 0x1, 0x9F, 0x0, 0x0, 0xA, 0x5E, 0x0, 0x0, 0x1, 0xA0, 0x0, 0x0, 0x1, 0xC6, 0x0, 0x0, 0x0, 0xB4, 0x0, 0x0, 0x1, 0xC7, 0x0, 0x0, 0x1, 0xE3, 0x0, 0x0, 0xA, 0xE8, 0x0, 0x0, 0x1, 0xE4, 0x0, 0x0, 0x1, 0xE5, 0x0, 0x0, 0x0, 0xDB, 0x0, 0x0, 0x1, 0xE6, 0x0, 0x0, 0x1, 0xED, 0x0, 0x0, 0xB, 0x5, 0x0, 0x0, 0x1, 0xEE, 0x0, 0x0, 0x1, 0xEF, 0x0, 0x0, 0x0, 0xDD, 0x0, 0x0, 0x1, 0xF0, 0x0, 0x0, 0x1, 0xF0, 0x0, 0x0, 0xA, 0x2D, 0x0, 0x0, 0x1, 0xF1, 0x0, 0x0, 0x1, 0xF5, 0x0, 0x0, 0xB, 0xD, 0x0, 0x0, 0x1, 0xF6, 0x0, 0x0, 0x1, 0xF7, 0x0, 0x0, 0x0, 0xDF, 0x0, 0x0, 0x1, 0xF8, 0x0, 0x0, 0x1, 0xF9, 0x0, 0x0, 0xB, 0x12, 0x0, 0x0, 0x1, 0xFA, 0x0, 0x0, 0x1, 0xFA, 0x0, 0x0, 0x8, 0xD3, 0x0, 0x0, 0x1, 0xFB, 0x0, 0x0, 0x1, 0xFB, 0x0, 0x0, 0x8, 0xEE, 0x0, 0x0, 0x1, 0xFC, 0x0, 0x0, 0x1, 0xFF, 0x0, 0x0, 0x9, 0x79, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x17, 0x0, 0x0, 0xB, 0x14, 0x0, 0x0, 0x2, 0x18, 0x0, 0x0, 0x2, 0x19, 0x0, 0x0, 0x9, 0x58, 0x0, 0x0, 0x2, 0x1A, 0x0, 0x0, 0x2, 0x1B, 0x0, 0x0, 0x9, 0x5C, 0x0, 0x0, 0x2, 0x1C, 0x0, 0x0, 0x2, 0x1D, 0x0, 0x0, 0x0, 0xE1, 0x0, 0x0, 0x2, 0x1E, 0x0, 0x0, 0x2, 0x1F, 0x0, 0x0, 0xB, 0x2C, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x2, 0x25, 0x0, 0x0, 0x0, 0xE3, 0x0, 0x0, 0x2, 0x26, 0x0, 0x0, 0x2, 0x33, 0x0, 0x0, 0xB, 0x2E, 0x0, 0x0, 0x2, 0x34, 0x0, 0x0, 0x2, 0x74, 0x0, 0x0, 0x0, 0xE9, 0x0, 0x0, 0x2, 0x75, 0x0, 0x0, 0x2, 0x75, 0x0, 0x0, 0xB, 0x3C, 0x0, 0x0, 0x2, 0x76, 0x0, 0x0, 0x2, 0x98, 0x0, 0x0, 0x1, 0x2A, 0x0, 0x0, 0x2, 0x99, 0x0, 0x0, 0x2, 0x99, 0x0, 0x0, 0xB, 0x3D, 0x0, 0x0, 0x2, 0x9A, 0x0, 0x0, 0x2, 0x9B, 0x0, 0x0, 0x1, 0x4D, 0x0, 0x0, 0x2, 0x9C, 0x0, 0x0, 0x2, 0x9C, 0x0, 0x0, 0xB, 0x3E, 0x0, 0x0, 0x2, 0x9D, 0x0, 0x0, 0x2, 0xBB, 0x0, 0x0, 0x1, 0x4F, 0x0, 0x0, 0x2, 0xBC, 0x0, 0x0, 0x2, 0xBC, 0x0, 0x0, 0xA, 0x2E, 0x0, 0x0, 0x2, 0xBD, 0x0, 0x0, 0x3, 0x77, 0x0, 0x0, 0x1, 0x6E, 0x0, 0x0, 0x3, 0x7A, 0x0, 0x0, 0x3, 0x7A, 0x0, 0x0, 0xA, 0xE5, 0x0, 0x0, 0x3, 0x7B, 0x0, 0x0, 0x3, 0x7E, 0x0, 0x0, 0x2, 0x29, 0x0, 0x0, 0x3, 0x7F, 0x0, 0x0, 0x3, 0x7F, 0x0, 0x0, 0xB, 0x3F, 0x0, 0x0, 0x3, 0x84, 0x0, 0x0, 0x3, 0x85, 0x0, 0x0, 0x2, 0x2D, 0x0, 0x0, 0x3, 0x86, 0x0, 0x0, 0x3, 0x86, 0x0, 0x0, 0x9, 0xD5, 0x0, 0x0, 0x3, 0x87, 0x0, 0x0, 0x3, 0x87, 0x0, 0x0, 0x2, 0x2F, 0x0, 0x0, 0x3, 0x88, 0x0, 0x0, 0x3, 0x8A, 0x0, 0x0, 0x9, 0xD6, 0x0, 0x0, 0x3, 0x8C, 0x0, 0x0, 0x3, 0x8C, 0x0, 0x0, 0x9, 0xD9, 0x0, 0x0, 0x3, 0x8E, 0x0, 0x0, 0x3, 0x92, 0x0, 0x0, 0x9, 0xDA, 0x0, 0x0, 0x3, 0x93, 0x0, 0x0, 0x3, 0x94, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x3, 0x95, 0x0, 0x0, 0x3, 0x97, 0x0, 0x0, 0x9, 0xDF, 0x0, 0x0, 0x3, 0x98, 0x0, 0x0, 0x3, 0x98, 0x0, 0x0, 0x2, 0x32, 0x0, 0x0, 0x3, 0x99, 0x0, 0x0, 0x3, 0x9A, 0x0, 0x0, 0x9, 0xE2, 0x0, 0x0, 0x3, 0x9B, 0x0, 0x0, 0x3, 0x9B, 0x0, 0x0, 0x2, 0x33, 0x0, 0x0, 0x3, 0x9C, 0x0, 0x0, 0x3, 0x9D, 0x0, 0x0, 0x9, 0xE4, 0x0, 0x0, 0x3, 0x9E, 0x0, 0x0, 0x3, 0x9E, 0x0, 0x0, 0x2, 0x34, 0x0, 0x0, 0x3, 0x9F, 0x0, 0x0, 0x3, 0x9F, 0x0, 0x0, 0x9, 0xE6, 0x0, 0x0, 0x3, 0xA0, 0x0, 0x0, 0x3, 0xA0, 0x0, 0x0, 0x2, 0x35, 0x0, 0x0, 0x3, 0xA1, 0x0, 0x0, 0x3, 0xA1, 0x0, 0x0, 0x9, 0xE7, 0x0, 0x0, 0x3, 0xA3, 0x0, 0x0, 0x3, 0xA3, 0x0, 0x0, 0x2, 0x36, 0x0, 0x0, 0x3, 0xA4, 0x0, 0x0, 0x3, 0xA5, 0x0, 0x0, 0x9, 0xE8, 0x0, 0x0, 0x3, 0xA6, 0x0, 0x0, 0x3, 0xA6, 0x0, 0x0, 0x2, 0x37, 0x0, 0x0, 0x3, 0xA7, 0x0, 0x0, 0x3, 0xA7, 0x0, 0x0, 0x9, 0xEA, 0x0, 0x0, 0x3, 0xA8, 0x0, 0x0, 0x3, 0xA9, 0x0, 0x0, 0x2, 0x38, 0x0, 0x0, 0x3, 0xAA, 0x0, 0x0, 0x3, 0xB0, 0x0, 0x0, 0x9, 0xEB, 0x0, 0x0, 0x3, 0xB1, 0x0, 0x0, 0x3, 0xB9, 0x0, 0x0, 0x2, 0x3A, 0x0, 0x0, 0x3, 0xBA, 0x0, 0x0, 0x3, 0xBA, 0x0, 0x0, 0x9, 0xF2, 0x0, 0x0, 0x3, 0xBB, 0x0, 0x0, 0x3, 0xBB, 0x0, 0x0, 0x2, 0x43, 0x0, 0x0, 0x3, 0xBC, 0x0, 0x0, 0x3, 0xBD, 0x0, 0x0, 0x9, 0xF4, 0x0, 0x0, 0x3, 0xBE, 0x0, 0x0, 0x3, 0xBE, 0x0, 0x0, 0x2, 0x44, 0x0, 0x0, 0x3, 0xBF, 0x0, 0x0, 0x3, 0xBF, 0x0, 0x0, 0x9, 0xF3, 0x0, 0x0, 0x3, 0xC0, 0x0, 0x0, 0x3, 0xC6, 0x0, 0x0, 0x2, 0x45, 0x0, 0x0, 0x3, 0xC7, 0x0, 0x0, 0x3, 0xC7, 0x0, 0x0, 0x9, 0xF6, 0x0, 0x0, 0x3, 0xC8, 0x0, 0x0, 0x3, 0xC9, 0x0, 0x0, 0x2, 0x4C, 0x0, 0x0, 0x3, 0xCA, 0x0, 0x0, 0x3, 0xCE, 0x0, 0x0, 0x9, 0xF7, 0x0, 0x0, 0x3, 0xCF, 0x0, 0x0, 0x3, 0xD2, 0x0, 0x0, 0x2, 0x4E, 0x0, 0x0, 0x3, 0xD3, 0x0, 0x0, 0x3, 0xD4, 0x0, 0x0, 0xB, 0x40, 0x0, 0x0, 0x3, 0xD5, 0x0, 0x0, 0x3, 0xE1, 0x0, 0x0, 0x2, 0x52, 0x0, 0x0, 0x3, 0xF0, 0x0, 0x0, 0x3, 0xF1, 0x0, 0x0, 0x2, 0x5F, 0x0, 0x0, 0x3, 0xF2, 0x0, 0x0, 0x3, 0xF4, 0x0, 0x0, 0xB, 0x42, 0x0, 0x0, 0x3, 0xF5, 0x0, 0x0, 0x3, 0xF6, 0x0, 0x0, 0x2, 0x61, 0x0, 0x0, 0x3, 0xF7, 0x0, 0x0, 0x3, 0xFA, 0x0, 0x0, 0xB, 0x45, 0x0, 0x0, 0x3, 0xFB, 0x0, 0x0, 0x3, 0xFF, 0x0, 0x0, 0x2, 0x63, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xA, 0x33, 0x0, 0x0, 0x4, 0x1, 0x0, 0x0, 0x4, 0x1, 0x0, 0x0, 0x9, 0xFC, 0x0, 0x0, 0x4, 0x2, 0x0, 0x0, 0x4, 0x2, 0x0, 0x0, 0x2, 0x68, 0x0, 0x0, 0x4, 0x3, 0x0, 0x0, 0x4, 0x3, 0x0, 0x0, 0x9, 0xFD, 0x0, 0x0, 0x4, 0x4, 0x0, 0x0, 0x4, 0x4, 0x0, 0x0, 0x2, 0x69, 0x0, 0x0, 0x4, 0x5, 0x0, 0x0, 0x4, 0x8, 0x0, 0x0, 0x9, 0xFE, 0x0, 0x0, 0x4, 0x9, 0x0, 0x0, 0x4, 0xB, 0x0, 0x0, 0x2, 0x6A, 0x0, 0x0, 0x4, 0xC, 0x0, 0x0, 0x4, 0xC, 0x0, 0x0, 0xA, 0x3, 0x0, 0x0, 0x4, 0xD, 0x0, 0x0, 0x4, 0xD, 0x0, 0x0, 0xA, 0x34, 0x0, 0x0, 0x4, 0xE, 0x0, 0x0, 0x4, 0xE, 0x0, 0x0, 0xA, 0x4, 0x0, 0x0, 0x4, 0xF, 0x0, 0x0, 0x4, 0xF, 0x0, 0x0, 0x2, 0x6D, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0xA, 0x5, 0x0, 0x0, 0x4, 0x11, 0x0, 0x0, 0x4, 0x11, 0x0, 0x0, 0x2, 0x6E, 0x0, 0x0, 0x4, 0x12, 0x0, 0x0, 0x4, 0x13, 0x0, 0x0, 0xA, 0x6, 0x0, 0x0, 0x4, 0x14, 0x0, 0x0, 0x4, 0x14, 0x0, 0x0, 0x2, 0x6F, 0x0, 0x0, 0x4, 0x15, 0x0, 0x0, 0x4, 0x15, 0x0, 0x0, 0xA, 0x8, 0x0, 0x0, 0x4, 0x16, 0x0, 0x0, 0x4, 0x18, 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, 0x4, 0x19, 0x0, 0x0, 0x4, 0x19, 0x0, 0x0, 0xA, 0x9, 0x0, 0x0, 0x4, 0x1A, 0x0, 0x0, 0x4, 0x1A, 0x0, 0x0, 0xA, 0x2, 0x0, 0x0, 0x4, 0x1B, 0x0, 0x0, 0x4, 0x1B, 0x0, 0x0, 0x2, 0x73, 0x0, 0x0, 0x4, 0x1C, 0x0, 0x0, 0x4, 0x22, 0x0, 0x0, 0xA, 0xA, 0x0, 0x0, 0x4, 0x23, 0x0, 0x0, 0x4, 0x24, 0x0, 0x0, 0x2, 0x74, 0x0, 0x0, 0x4, 0x25, 0x0, 0x0, 0x4, 0x25, 0x0, 0x0, 0xA, 0x11, 0x0, 0x0, 0x4, 0x26, 0x0, 0x0, 0x4, 0x2F, 0x0, 0x0, 0x2, 0x76, 0x0, 0x0, 0x4, 0x30, 0x0, 0x0, 0x4, 0x30, 0x0, 0x0, 0xA, 0x12, 0x0, 0x0, 0x4, 0x31, 0x0, 0x0, 0x4, 0x34, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x4, 0x35, 0x0, 0x0, 0x4, 0x35, 0x0, 0x0, 0xA, 0x13, 0x0, 0x0, 0x4, 0x36, 0x0, 0x0, 0x4, 0x38, 0x0, 0x0, 0x2, 0x84, 0x0, 0x0, 0x4, 0x39, 0x0, 0x0, 0x4, 0x39, 0x0, 0x0, 0xA, 0x14, 0x0, 0x0, 0x4, 0x3A, 0x0, 0x0, 0x4, 0x3D, 0x0, 0x0, 0x2, 0x87, 0x0, 0x0, 0x4, 0x3E, 0x0, 0x0, 0x4, 0x3E, 0x0, 0x0, 0xA, 0x15, 0x0, 0x0, 0x4, 0x3F, 0x0, 0x0, 0x4, 0x3F, 0x0, 0x0, 0x2, 0x8B, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, 0x4, 0x41, 0x0, 0x0, 0xA, 0x16, 0x0, 0x0, 0x4, 0x42, 0x0, 0x0, 0x4, 0x42, 0x0, 0x0, 0x2, 0x8C, 0x0, 0x0, 0x4, 0x43, 0x0, 0x0, 0x4, 0x43, 0x0, 0x0, 0xA, 0x18, 0x0, 0x0, 0x4, 0x44, 0x0, 0x0, 0x4, 0x44, 0x0, 0x0, 0x2, 0x8D, 0x0, 0x0, 0x4, 0x45, 0x0, 0x0, 0x4, 0x45, 0x0, 0x0, 0xA, 0x19, 0x0, 0x0, 0x4, 0x46, 0x0, 0x0, 0x4, 0x4F, 0x0, 0x0, 0x2, 0x8E, 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, 0xA, 0x35, 0x0, 0x0, 0x4, 0x51, 0x0, 0x0, 0x4, 0x51, 0x0, 0x0, 0xA, 0x1A, 0x0, 0x0, 0x4, 0x52, 0x0, 0x0, 0x4, 0x52, 0x0, 0x0, 0x2, 0x98, 0x0, 0x0, 0x4, 0x53, 0x0, 0x0, 0x4, 0x53, 0x0, 0x0, 0xA, 0x1B, 0x0, 0x0, 0x4, 0x54, 0x0, 0x0, 0x4, 0x54, 0x0, 0x0, 0x2, 0x99, 0x0, 0x0, 0x4, 0x55, 0x0, 0x0, 0x4, 0x58, 0x0, 0x0, 0xA, 0x1C, 0x0, 0x0, 0x4, 0x59, 0x0, 0x0, 0x4, 0x5B, 0x0, 0x0, 0x2, 0x9A, 0x0, 0x0, 0x4, 0x5C, 0x0, 0x0, 0x4, 0x5C, 0x0, 0x0, 0xA, 0x20, 0x0, 0x0, 0x4, 0x5D, 0x0, 0x0, 0x4, 0x5D, 0x0, 0x0, 0xA, 0x36, 0x0, 0x0, 0x4, 0x5E, 0x0, 0x0, 0x4, 0x5E, 0x0, 0x0, 0xA, 0x21, 0x0, 0x0, 0x4, 0x5F, 0x0, 0x0, 0x4, 0x61, 0x0, 0x0, 0x2, 0x9D, 0x0, 0x0, 0x4, 0x62, 0x0, 0x0, 0x4, 0x62, 0x0, 0x0, 0xA, 0xD1, 0x0, 0x0, 0x4, 0x63, 0x0, 0x0, 0x4, 0x6F, 0x0, 0x0, 0x2, 0xA0, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x4, 0x71, 0x0, 0x0, 0xA, 0x37, 0x0, 0x0, 0x4, 0x72, 0x0, 0x0, 0x4, 0x75, 0x0, 0x0, 0x2, 0xAD, 0x0, 0x0, 0x4, 0x76, 0x0, 0x0, 0x4, 0x77, 0x0, 0x0, 0xA, 0x39, 0x0, 0x0, 0x4, 0x78, 0x0, 0x0, 0x4, 0x78, 0x0, 0x0, 0xA, 0x3C, 0x0, 0x0, 0x4, 0x79, 0x0, 0x0, 0x4, 0x79, 0x0, 0x0, 0xA, 0x3B, 0x0, 0x0, 0x4, 0x7A, 0x0, 0x0, 0x4, 0x8B, 0x0, 0x0, 0x2, 0xB1, 0x0, 0x0, 0x4, 0x8C, 0x0, 0x0, 0x4, 0x8C, 0x0, 0x0, 0xA, 0xD0, 0x0, 0x0, 0x4, 0x8D, 0x0, 0x0, 0x4, 0x91, 0x0, 0x0, 0x2, 0xC3, 0x0, 0x0, 0x4, 0x92, 0x0, 0x0, 0x4, 0x93, 0x0, 0x0, 0xA, 0xD2, 0x0, 0x0, 0x4, 0x94, 0x0, 0x0, 0x4, 0x97, 0x0, 0x0, 0x2, 0xC8, 0x0, 0x0, 0x4, 0x98, 0x0, 0x0, 0x4, 0x99, 0x0, 0x0, 0xA, 0x3D, 0x0, 0x0, 0x4, 0x9A, 0x0, 0x0, 0x4, 0x9D, 0x0, 0x0, 0x2, 0xCC, 0x0, 0x0, 0x4, 0x9E, 0x0, 0x0, 0x4, 0x9F, 0x0, 0x0, 0xA, 0xD4, 0x0, 0x0, 0x4, 0xA0, 0x0, 0x0, 0x4, 0xA9, 0x0, 0x0, 0x2, 0xD0, 0x0, 0x0, 0x4, 0xAA, 0x0, 0x0, 0x4, 0xAB, 0x0, 0x0, 0xA, 0x3F, 0x0, 0x0, 0x4, 0xAC, 0x0, 0x0, 0x4, 0xAD, 0x0, 0x0, 0xA, 0xC7, 0x0, 0x0, 0x4, 0xAE, 0x0, 0x0, 0x4, 0xAF, 0x0, 0x0, 0xA, 0x41, 0x0, 0x0, 0x4, 0xB0, 0x0, 0x0, 0x4, 0xB1, 0x0, 0x0, 0xA, 0xD6, 0x0, 0x0, 0x4, 0xB2, 0x0, 0x0, 0x4, 0xBA, 0x0, 0x0, 0x2, 0xDA, 0x0, 0x0, 0x4, 0xBB, 0x0, 0x0, 0x4, 0xBB, 0x0, 0x0, 0xA, 0xCF, 0x0, 0x0, 0x4, 0xBC, 0x0, 0x0, 0x4, 0xBD, 0x0, 0x0, 0x2, 0xE3, 0x0, 0x0, 0x4, 0xBE, 0x0, 0x0, 0x4, 0xBF, 0x0, 0x0, 0xA, 0xCD, 0x0, 0x0, 0x4, 0xC0, 0x0, 0x0, 0x4, 0xC2, 0x0, 0x0, 0xA, 0x43, 0x0, 0x0, 0x4, 0xC3, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x2, 0xE5, 0x0, 0x0, 0x4, 0xCB, 0x0, 0x0, 0x4, 0xCC, 0x0, 0x0, 0xA, 0xC9, 0x0, 0x0, 0x4, 0xCD, 0x0, 0x0, 0x4, 0xCE, 0x0, 0x0, 0x2, 0xED, 0x0, 0x0, 0x4, 0xCF, 0x0, 0x0, 0x4, 0xD7, 0x0, 0x0, 0xA, 0x46, 0x0, 0x0, 0x4, 0xD8, 0x0, 0x0, 0x4, 0xD8, 0x0, 0x0, 0x2, 0xEF, 0x0, 0x0, 0x4, 0xD9, 0x0, 0x0, 0x4, 0xD9, 0x0, 0x0, 0xA, 0x50, 0x0, 0x0, 0x4, 0xDA, 0x0, 0x0, 0x4, 0xDA, 0x0, 0x0, 0xA, 0x4F, 0x0, 0x0, 0x4, 0xDB, 0x0, 0x0, 0x4, 0xDF, 0x0, 0x0, 0xA, 0x51, 0x0, 0x0, 0x4, 0xE0, 0x0, 0x0, 0x4, 0xE1, 0x0, 0x0, 0x2, 0xF0, 0x0, 0x0, 0x4, 0xE2, 0x0, 0x0, 0x4, 0xE9, 0x0, 0x0, 0xA, 0x56, 0x0, 0x0, 0x4, 0xEA, 0x0, 0x0, 0x4, 0xF5, 0x0, 0x0, 0xA, 0x5F, 0x0, 0x0, 0x4, 0xF6, 0x0, 0x0, 0x4, 0xF7, 0x0, 0x0, 0xA, 0xCB, 0x0, 0x0, 0x4, 0xF8, 0x0, 0x0, 0x4, 0xF9, 0x0, 0x0, 0xA, 0x6B, 0x0, 0x0, 0x4, 0xFA, 0x0, 0x0, 0x4, 0xFD, 0x0, 0x0, 0x2, 0xF2, 0x0, 0x0, 0x4, 0xFE, 0x0, 0x0, 0x4, 0xFF, 0x0, 0x0, 0xA, 0xD8, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x2, 0xF6, 0x0, 0x0, 0x5, 0x1, 0x0, 0x0, 0x5, 0x1, 0x0, 0x0, 0xA, 0x6D, 0x0, 0x0, 0x5, 0x2, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x2, 0xF7, 0x0, 0x0, 0x5, 0x11, 0x0, 0x0, 0x5, 0x11, 0x0, 0x0, 0xA, 0xDA, 0x0, 0x0, 0x5, 0x12, 0x0, 0x0, 0x5, 0x19, 0x0, 0x0, 0x3, 0x6, 0x0, 0x0, 0x5, 0x1A, 0x0, 0x0, 0x5, 0x1D, 0x0, 0x0, 0xB, 0x49, 0x0, 0x0, 0x5, 0x1E, 0x0, 0x0, 0x5, 0x2F, 0x0, 0x0, 0x3, 0xE, 0x0, 0x0, 0x1A, 0xB0, 0x0, 0x0, 0x1A, 0xBE, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x1D, 0x0, 0x0, 0x0, 0x1D, 0xF5, 0x0, 0x0, 0x3, 0x2F, 0x0, 0x0, 0x1D, 0xFC, 0x0, 0x0, 0x1D, 0xFF, 0x0, 0x0, 0x4, 0x25, 0x0, 0x0, 0x1E, 0x0, 0x0, 0x0, 0x1E, 0x1, 0x0, 0x0, 0xA, 0x31, 0x0, 0x0, 0x1E, 0x2, 0x0, 0x0, 0x1E, 0x27, 0x0, 0x0, 0xB, 0x4D, 0x0, 0x0, 0x1E, 0x28, 0x0, 0x0, 0x1E, 0x29, 0x0, 0x0, 0x4, 0x29, 0x0, 0x0, 0x1E, 0x2A, 0x0, 0x0, 0x1E, 0x2B, 0x0, 0x0, 0xB, 0x73, 0x0, 0x0, 0x1E, 0x2C, 0x0, 0x0, 0x1E, 0x2F, 0x0, 0x0, 0x4, 0x2B, 0x0, 0x0, 0x1E, 0x30, 0x0, 0x0, 0x1E, 0x3D, 0x0, 0x0, 0xB, 0x75, 0x0, 0x0, 0x1E, 0x3E, 0x0, 0x0, 0x1E, 0x3F, 0x0, 0x0, 0xA, 0x2F, 0x0, 0x0, 0x1E, 0x40, 0x0, 0x0, 0x1E, 0x7F, 0x0, 0x0, 0xB, 0x83, 0x0, 0x0, 0x1E, 0x80, 0x0, 0x0, 0x1E, 0x85, 0x0, 0x0, 0xA, 0x22, 0x0, 0x0, 0x1E, 0x86, 0x0, 0x0, 0x1E, 0x9A, 0x0, 0x0, 0xB, 0xC3, 0x0, 0x0, 0x1E, 0x9B, 0x0, 0x0, 0x1E, 0x9F, 0x0, 0x0, 0x4, 0x2F, 0x0, 0x0, 0x1E, 0xA0, 0x0, 0x0, 0x1E, 0xF1, 0x0, 0x0, 0xA, 0x6E, 0x0, 0x0, 0x1E, 0xF2, 0x0, 0x0, 0x1E, 0xF3, 0x0, 0x0, 0xA, 0x28, 0x0, 0x0, 0x1E, 0xF4, 0x0, 0x0, 0x1E, 0xF9, 0x0, 0x0, 0xA, 0xC0, 0x0, 0x0, 0x1E, 0xFA, 0x0, 0x0, 0x1E, 0xFF, 0x0, 0x0, 0x4, 0x34, 0x0, 0x0, 0x1F, 0x0, 0x0, 0x0, 0x1F, 0x15, 0x0, 0x0, 0xB, 0xD8, 0x0, 0x0, 0x1F, 0x18, 0x0, 0x0, 0x1F, 0x1D, 0x0, 0x0, 0xB, 0xEE, 0x0, 0x0, 0x1F, 0x20, 0x0, 0x0, 0x1F, 0x45, 0x0, 0x0, 0xB, 0xF4, 0x0, 0x0, 0x1F, 0x48, 0x0, 0x0, 0x1F, 0x4D, 0x0, 0x0, 0xC, 0x1A, 0x0, 0x0, 0x1F, 0x50, 0x0, 0x0, 0x1F, 0x57, 0x0, 0x0, 0xC, 0x20, 0x0, 0x0, 0x1F, 0x59, 0x0, 0x0, 0x1F, 0x59, 0x0, 0x0, 0xC, 0x28, 0x0, 0x0, 0x1F, 0x5B, 0x0, 0x0, 0x1F, 0x5B, 0x0, 0x0, 0xC, 0x29, 0x0, 0x0, 0x1F, 0x5D, 0x0, 0x0, 0x1F, 0x5D, 0x0, 0x0, 0xC, 0x2A, 0x0, 0x0, 0x1F, 0x5F, 0x0, 0x0, 0x1F, 0x7D, 0x0, 0x0, 0xC, 0x2B, 0x0, 0x0, 0x1F, 0x80, 0x0, 0x0, 0x1F, 0xB4, 0x0, 0x0, 0xC, 0x4A, 0x0, 0x0, 0x1F, 0xB6, 0x0, 0x0, 0x1F, 0xBC, 0x0, 0x0, 0xC, 0x7F, 0x0, 0x0, 0x1F, 0xBD, 0x0, 0x0, 0x1F, 0xC1, 0x0, 0x0, 0x4, 0x3A, 0x0, 0x0, 0x1F, 0xC2, 0x0, 0x0, 0x1F, 0xC4, 0x0, 0x0, 0xC, 0x86, 0x0, 0x0, 0x1F, 0xC6, 0x0, 0x0, 0x1F, 0xCC, 0x0, 0x0, 0xC, 0x89, 0x0, 0x0, 0x1F, 0xCD, 0x0, 0x0, 0x1F, 0xCF, 0x0, 0x0, 0x4, 0x3F, 0x0, 0x0, 0x1F, 0xD0, 0x0, 0x0, 0x1F, 0xD3, 0x0, 0x0, 0xC, 0x90, 0x0, 0x0, 0x1F, 0xD6, 0x0, 0x0, 0x1F, 0xDB, 0x0, 0x0, 0xC, 0x94, 0x0, 0x0, 0x1F, 0xDD, 0x0, 0x0, 0x1F, 0xDF, 0x0, 0x0, 0x4, 0x42, 0x0, 0x0, 0x1F, 0xE0, 0x0, 0x0, 0x1F, 0xEC, 0x0, 0x0, 0xC, 0x9A, 0x0, 0x0, 0x1F, 0xED, 0x0, 0x0, 0x1F, 0xEF, 0x0, 0x0, 0x4, 0x45, 0x0, 0x0, 0x1F, 0xF2, 0x0, 0x0, 0x1F, 0xF4, 0x0, 0x0, 0xC, 0xA7, 0x0, 0x0, 0x1F, 0xF6, 0x0, 0x0, 0x1F, 0xFC, 0x0, 0x0, 0xC, 0xAA, 0x0, 0x0, 0x1F, 0xFD, 0x0, 0x0, 0x1F, 0xFE, 0x0, 0x0, 0x4, 0x48, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x20, 0x9, 0x0, 0x0, 0x4, 0x4A, 0x0, 0x0, 0x20, 0xA, 0x0, 0x0, 0x20, 0x14, 0x0, 0x0, 0x4, 0x55, 0x0, 0x0, 0x20, 0x15, 0x0, 0x0, 0x20, 0x15, 0x0, 0x0, 0xA, 0xDC, 0x0, 0x0, 0x20, 0x16, 0x0, 0x0, 0x20, 0x27, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0x20, 0x2F, 0x0, 0x0, 0x20, 0x2F, 0x0, 0x0, 0xC, 0xB1, 0x0, 0x0, 0x20, 0x30, 0x0, 0x0, 0x20, 0x31, 0x0, 0x0, 0x4, 0x72, 0x0, 0x0, 0x20, 0x32, 0x0, 0x0, 0x20, 0x33, 0x0, 0x0, 0xA, 0x2A, 0x0, 0x0, 0x20, 0x34, 0x0, 0x0, 0x20, 0x3B, 0x0, 0x0, 0x4, 0x74, 0x0, 0x0, 0x20, 0x3C, 0x0, 0x0, 0x20, 0x3C, 0x0, 0x0, 0xA, 0x2C, 0x0, 0x0, 0x20, 0x3D, 0x0, 0x0, 0x20, 0x46, 0x0, 0x0, 0x4, 0x7C, 0x0, 0x0, 0x20, 0x47, 0x0, 0x0, 0x20, 0x49, 0x0, 0x0, 0xC, 0xB2, 0x0, 0x0, 0x20, 0x4A, 0x0, 0x0, 0x20, 0x5E, 0x0, 0x0, 0x4, 0x86, 0x0, 0x0, 0x20, 0x5F, 0x0, 0x0, 0x20, 0x5F, 0x0, 0x0, 0xC, 0xB5, 0x0, 0x0, 0x20, 0x70, 0x0, 0x0, 0x20, 0x71, 0x0, 0x0, 0x4, 0x9B, 0x0, 0x0, 0x20, 0x74, 0x0, 0x0, 0x20, 0x8E, 0x0, 0x0, 0x4, 0x9D, 0x0, 0x0, 0x20, 0x90, 0x0, 0x0, 0x20, 0x9C, 0x0, 0x0, 0x4, 0xB8, 0x0, 0x0, 0x20, 0xA0, 0x0, 0x0, 0x20, 0xA2, 0x0, 0x0, 0x4, 0xC5, 0x0, 0x0, 0x20, 0xA3, 0x0, 0x0, 0x20, 0xA3, 0x0, 0x0, 0xA, 0xDB, 0x0, 0x0, 0x20, 0xA4, 0x0, 0x0, 0x20, 0xAA, 0x0, 0x0, 0x4, 0xC8, 0x0, 0x0, 0x20, 0xAB, 0x0, 0x0, 0x20, 0xAB, 0x0, 0x0, 0xA, 0xC6, 0x0, 0x0, 0x20, 0xAC, 0x0, 0x0, 0x20, 0xBE, 0x0, 0x0, 0x4, 0xCF, 0x0, 0x0, 0x20, 0xDB, 0x0, 0x0, 0x20, 0xDC, 0x0, 0x0, 0x4, 0xE2, 0x0, 0x0, 0x20, 0xE8, 0x0, 0x0, 0x20, 0xE8, 0x0, 0x0, 0x4, 0xE4, 0x0, 0x0, 0x20, 0xF0, 0x0, 0x0, 0x20, 0xF0, 0x0, 0x0, 0x4, 0xE5, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x21, 0x1, 0x0, 0x0, 0x4, 0xE6, 0x0, 0x0, 0x21, 0x3, 0x0, 0x0, 0x21, 0x3, 0x0, 0x0, 0x4, 0xE8, 0x0, 0x0, 0x21, 0x5, 0x0, 0x0, 0x21, 0x6, 0x0, 0x0, 0x4, 0xE9, 0x0, 0x0, 0x21, 0x9, 0x0, 0x0, 0x21, 0x9, 0x0, 0x0, 0x4, 0xEB, 0x0, 0x0, 0x21, 0x13, 0x0, 0x0, 0x21, 0x13, 0x0, 0x0, 0x4, 0xEC, 0x0, 0x0, 0x21, 0x16, 0x0, 0x0, 0x21, 0x17, 0x0, 0x0, 0x4, 0xED, 0x0, 0x0, 0x21, 0x1E, 0x0, 0x0, 0x21, 0x23, 0x0, 0x0, 0x4, 0xEF, 0x0, 0x0, 0x21, 0x25, 0x0, 0x0, 0x21, 0x25, 0x0, 0x0, 0x4, 0xF5, 0x0, 0x0, 0x21, 0x26, 0x0, 0x0, 0x21, 0x26, 0x0, 0x0, 0x2, 0x39, 0x0, 0x0, 0x21, 0x2A, 0x0, 0x0, 0x21, 0x2B, 0x0, 0x0, 0x4, 0xF6, 0x0, 0x0, 0x21, 0x2E, 0x0, 0x0, 0x21, 0x2E, 0x0, 0x0, 0x4, 0xF8, 0x0, 0x0, 0x21, 0x32, 0x0, 0x0, 0x21, 0x32, 0x0, 0x0, 0x4, 0xF9, 0x0, 0x0, 0x21, 0x3B, 0x0, 0x0, 0x21, 0x3B, 0x0, 0x0, 0x4, 0xFA, 0x0, 0x0, 0x21, 0x4D, 0x0, 0x0, 0x21, 0x4D, 0x0, 0x0, 0x4, 0xFB, 0x0, 0x0, 0x21, 0x4F, 0x0, 0x0, 0x21, 0x89, 0x0, 0x0, 0x4, 0xFC, 0x0, 0x0, 0x22, 0x2, 0x0, 0x0, 0x22, 0x2, 0x0, 0x0, 0x5, 0x37, 0x0, 0x0, 0x22, 0x6, 0x0, 0x0, 0x22, 0x6, 0x0, 0x0, 0x2, 0x31, 0x0, 0x0, 0x22, 0xF, 0x0, 0x0, 0x22, 0xF, 0x0, 0x0, 0x5, 0x38, 0x0, 0x0, 0x22, 0x11, 0x0, 0x0, 0x22, 0x12, 0x0, 0x0, 0x5, 0x39, 0x0, 0x0, 0x22, 0x1A, 0x0, 0x0, 0x22, 0x1A, 0x0, 0x0, 0x5, 0x3B, 0x0, 0x0, 0x22, 0x1E, 0x0, 0x0, 0x22, 0x1E, 0x0, 0x0, 0x5, 0x3C, 0x0, 0x0, 0x22, 0x2B, 0x0, 0x0, 0x22, 0x2B, 0x0, 0x0, 0x5, 0x3D, 0x0, 0x0, 0x22, 0x48, 0x0, 0x0, 0x22, 0x48, 0x0, 0x0, 0x5, 0x3E, 0x0, 0x0, 0x22, 0x60, 0x0, 0x0, 0x22, 0x60, 0x0, 0x0, 0x5, 0x3F, 0x0, 0x0, 0x22, 0x64, 0x0, 0x0, 0x22, 0x65, 0x0, 0x0, 0x5, 0x40, 0x0, 0x0, 0x24, 0x23, 0x0, 0x0, 0x24, 0x23, 0x0, 0x0, 0x5, 0x42, 0x0, 0x0, 0x25, 0xCA, 0x0, 0x0, 0x25, 0xCA, 0x0, 0x0, 0x5, 0x43, 0x0, 0x0, 0x27, 0xE6, 0x0, 0x0, 0x27, 0xEF, 0x0, 0x0, 0x5, 0x44, 0x0, 0x0, 0x2B, 0x4E, 0x0, 0x0, 0x2B, 0x4F, 0x0, 0x0, 0x5, 0x4E, 0x0, 0x0, 0x2B, 0x5A, 0x0, 0x0, 0x2B, 0x5F, 0x0, 0x0, 0x5, 0x50, 0x0, 0x0, 0x2C, 0x60, 0x0, 0x0, 0x2C, 0x7F, 0x0, 0x0, 0x5, 0x56, 0x0, 0x0, 0x2D, 0xE0, 0x0, 0x0, 0x2E, 0x42, 0x0, 0x0, 0x5, 0x76, 0x0, 0x0, 0xA6, 0x40, 0x0, 0x0, 0xA6, 0x9D, 0x0, 0x0, 0x5, 0xD9, 0x0, 0x0, 0xA6, 0x9F, 0x0, 0x0, 0xA6, 0x9F, 0x0, 0x0, 0x6, 0x37, 0x0, 0x0, 0xA7, 0x0, 0x0, 0x0, 0xA7, 0x8E, 0x0, 0x0, 0x6, 0x38, 0x0, 0x0, 0xA7, 0x8F, 0x0, 0x0, 0xA7, 0x8F, 0x0, 0x0, 0xC, 0xB6, 0x0, 0x0, 0xA7, 0x90, 0x0, 0x0, 0xA7, 0xAD, 0x0, 0x0, 0x6, 0xC7, 0x0, 0x0, 0xA7, 0xB0, 0x0, 0x0, 0xA7, 0xB1, 0x0, 0x0, 0x6, 0xE5, 0x0, 0x0, 0xA7, 0xF7, 0x0, 0x0, 0xA7, 0xFF, 0x0, 0x0, 0x6, 0xE7, 0x0, 0x0, 0xA9, 0x2E, 0x0, 0x0, 0xA9, 0x2E, 0x0, 0x0, 0x6, 0xF0, 0x0, 0x0, 0xAB, 0x30, 0x0, 0x0, 0xAB, 0x5F, 0x0, 0x0, 0x6, 0xF1, 0x0, 0x0, 0xAB, 0x64, 0x0, 0x0, 0xAB, 0x65, 0x0, 0x0, 0x7, 0x21, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x0, 0xEE, 0x2, 0x0, 0x0, 0x7, 0x23, 0x0, 0x0, 0xF6, 0xC3, 0x0, 0x0, 0xF6, 0xC3, 0x0, 0x0, 0x7, 0x25, 0x0, 0x0, 0xFB, 0x0, 0x0, 0x0, 0xFB, 0x6, 0x0, 0x0, 0x7, 0x26, 0x0, 0x0, 0xFE, 0x20, 0x0, 0x0, 0xFE, 0x2D, 0x0, 0x0, 0x7, 0x2D, 0x0, 0x0, 0xFE, 0xFF, 0x0, 0x0, 0xFE, 0xFF, 0x0, 0x0, 0x7, 0x3B, 0x0, 0x0, 0xFF, 0xFC, 0x0, 0x0, 0xFF, 0xFD, 0x0, 0x0, 0x7, 0x3C, 0x0, 0x1, 0xF1, 0x6A, 0x0, 0x1, 0xF1, 0x6B, 0x0, 0x0, 0x7, 0x3E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x8E, 0x0, 0x0, 0x0, 0xBA, 0x0, 0x0, 0x1, 0x29, 0x0, 0x0, 0x1, 0xA5, 0x0, 0x0, 0x2, 0x4B, 0x0, 0x0, 0x2, 0xEE, 0x0, 0x0, 0x3, 0x9, 0x0, 0x0, 0x3, 0x51, 0x0, 0x0, 0x3, 0x9B, 0x0, 0x0, 0x3, 0xE0, 0x0, 0x0, 0x4, 0x11, 0x0, 0x0, 0x4, 0x3A, 0x0, 0x0, 0x4, 0x54, 0x0, 0x0, 0x4, 0x77, 0x0, 0x0, 0x4, 0x96, 0x0, 0x0, 0x4, 0xFA, 0x0, 0x0, 0x5, 0x1F, 0x0, 0x0, 0x5, 0x73, 0x0, 0x0, 0x5, 0xE2, 0x0, 0x0, 0x6, 0x21, 0x0, 0x0, 0x6, 0x7F, 0x0, 0x0, 0x6, 0xEE, 0x0, 0x0, 0x7, 0x15, 0x0, 0x0, 0x7, 0x9F, 0x0, 0x0, 0x8, 0xD, 0x0, 0x0, 0x8, 0x25, 0x0, 0x0, 0x8, 0x3D, 0x0, 0x0, 0x8, 0x65, 0x0, 0x0, 0x8, 0x8D, 0x0, 0x0, 0x8, 0xB1, 0x0, 0x0, 0x9, 0x19, 0x0, 0x0, 0x9, 0xE8, 0x0, 0x0, 0xA, 0x24, 0x0, 0x0, 0xA, 0x8E, 0x0, 0x0, 0xA, 0xF2, 0x0, 0x0, 0xB, 0x41, 0x0, 0x0, 0xB, 0x6F, 0x0, 0x0, 0xB, 0x9B, 0x0, 0x0, 0xC, 0x8, 0x0, 0x0, 0xC, 0x37, 0x0, 0x0, 0xC, 0x52, 0x0, 0x0, 0xC, 0x8A, 0x0, 0x0, 0xC, 0xC5, 0x0, 0x0, 0xC, 0xE2, 0x0, 0x0, 0xD, 0x25, 0x0, 0x0, 0xD, 0x54, 0x0, 0x0, 0xD, 0xBC, 0x0, 0x0, 0xE, 0x6, 0x0, 0x0, 0xE, 0x7A, 0x0, 0x0, 0xE, 0xD3, 0x0, 0x0, 0xF, 0x47, 0x0, 0x0, 0xF, 0x6D, 0x0, 0x0, 0xF, 0xAB, 0x0, 0x0, 0xF, 0xD6, 0x0, 0x0, 0x10, 0x15, 0x0, 0x0, 0x10, 0x58, 0x0, 0x0, 0x10, 0x89, 0x0, 0x0, 0x10, 0xB4, 0x0, 0x0, 0x10, 0xD8, 0x0, 0x0, 0x10, 0xF6, 0x0, 0x0, 0x11, 0x1A, 0x0, 0x0, 0x11, 0x43, 0x0, 0x0, 0x11, 0x5B, 0x0, 0x0, 0x11, 0x79, 0x0, 0x0, 0x11, 0xEB, 0x0, 0x0, 0x12, 0x43, 0x0, 0x0, 0x12, 0x9A, 0x0, 0x0, 0x12, 0xF4, 0x0, 0x0, 0x13, 0x58, 0x0, 0x0, 0x13, 0x9A, 0x0, 0x0, 0x14, 0x11, 0x0, 0x0, 0x14, 0x50, 0x0, 0x0, 0x14, 0x86, 0x0, 0x0, 0x14, 0xCE, 0x0, 0x0, 0x15, 0x9, 0x0, 0x0, 0x15, 0x24, 0x0, 0x0, 0x15, 0x84, 0x0, 0x0, 0x15, 0xC3, 0x0, 0x0, 0x16, 0x1F, 0x0, 0x0, 0x16, 0x78, 0x0, 0x0, 0x16, 0xD3, 0x0, 0x0, 0x17, 0x8, 0x0, 0x0, 0x17, 0x74, 0x0, 0x0, 0x17, 0xB8, 0x0, 0x0, 0x17, 0xF5, 0x0, 0x0, 0x18, 0x1C, 0x0, 0x0, 0x18, 0x57, 0x0, 0x0, 0x18, 0x97, 0x0, 0x0, 0x18, 0xDD, 0x0, 0x0, 0x19, 0x8, 0x0, 0x0, 0x19, 0x5A, 0x0, 0x0, 0x19, 0x75, 0x0, 0x0, 0x19, 0xC6, 0x0, 0x0, 0x1A, 0x11, 0x0, 0x0, 0x1A, 0x4B, 0x0, 0x0, 0x1A, 0xB2, 0x0, 0x0, 0x1B, 0x12, 0x0, 0x0, 0x1B, 0x92, 0x0, 0x0, 0x1B, 0xE7, 0x0, 0x0, 0x1C, 0xF, 0x0, 0x0, 0x1C, 0xBE, 0x0, 0x0, 0x1D, 0xA, 0x0, 0x0, 0x1D, 0xBE, 0x0, 0x0, 0x1E, 0x29, 0x0, 0x0, 0x1E, 0x41, 0x0, 0x0, 0x1E, 0x61, 0x0, 0x0, 0x1F, 0x25, 0x0, 0x0, 0x1F, 0x3F, 0x0, 0x0, 0x1F, 0x82, 0x0, 0x0, 0x1F, 0xC0, 0x0, 0x0, 0x20, 0x9, 0x0, 0x0, 0x20, 0x70, 0x0, 0x0, 0x20, 0x8E, 0x0, 0x0, 0x20, 0xCF, 0x0, 0x0, 0x20, 0xFA, 0x0, 0x0, 0x21, 0x22, 0x0, 0x0, 0x21, 0x56, 0x0, 0x0, 0x21, 0x7A, 0x0, 0x0, 0x21, 0xCB, 0x0, 0x0, 0x21, 0xE3, 0x0, 0x0, 0x22, 0x5, 0x0, 0x0, 0x22, 0x27, 0x0, 0x0, 0x22, 0x49, 0x0, 0x0, 0x22, 0xB1, 0x0, 0x0, 0x23, 0x4, 0x0, 0x0, 0x23, 0x47, 0x0, 0x0, 0x23, 0xD4, 0x0, 0x0, 0x24, 0x20, 0x0, 0x0, 0x24, 0x9D, 0x0, 0x0, 0x25, 0x4E, 0x0, 0x0, 0x25, 0xD5, 0x0, 0x0, 0x26, 0x28, 0x0, 0x0, 0x26, 0xAF, 0x0, 0x0, 0x27, 0x8, 0x0, 0x0, 0x27, 0x71, 0x0, 0x0, 0x27, 0xC2, 0x0, 0x0, 0x27, 0xDD, 0x0, 0x0, 0x28, 0x16, 0x0, 0x0, 0x28, 0x49, 0x0, 0x0, 0x28, 0x77, 0x0, 0x0, 0x28, 0xBF, 0x0, 0x0, 0x29, 0x15, 0x0, 0x0, 0x29, 0x87, 0x0, 0x0, 0x2A, 0x33, 0x0, 0x0, 0x2A, 0x61, 0x0, 0x0, 0x2A, 0x79, 0x0, 0x0, 0x2A, 0xFF, 0x0, 0x0, 0x2B, 0x15, 0x0, 0x0, 0x2B, 0x75, 0x0, 0x0, 0x2B, 0xC2, 0x0, 0x0, 0x2C, 0x23, 0x0, 0x0, 0x2C, 0x87, 0x0, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x2D, 0x6F, 0x0, 0x0, 0x2D, 0x85, 0x0, 0x0, 0x2D, 0xEF, 0x0, 0x0, 0x2E, 0x3A, 0x0, 0x0, 0x2E, 0x9A, 0x0, 0x0, 0x2F, 0x15, 0x0, 0x0, 0x2F, 0x43, 0x0, 0x0, 0x2F, 0xAF, 0x0, 0x0, 0x30, 0x23, 0x0, 0x0, 0x30, 0x64, 0x0, 0x0, 0x30, 0xC1, 0x0, 0x0, 0x31, 0x41, 0x0, 0x0, 0x31, 0x9D, 0x0, 0x0, 0x31, 0xFD, 0x0, 0x0, 0x32, 0x13, 0x0, 0x0, 0x32, 0x66, 0x0, 0x0, 0x32, 0xB9, 0x0, 0x0, 0x32, 0xCF, 0x0, 0x0, 0x33, 0x3A, 0x0, 0x0, 0x33, 0x99, 0x0, 0x0, 0x33, 0xDD, 0x0, 0x0, 0x34, 0x54, 0x0, 0x0, 0x34, 0xC3, 0x0, 0x0, 0x35, 0x38, 0x0, 0x0, 0x35, 0x9F, 0x0, 0x0, 0x36, 0x5, 0x0, 0x0, 0x36, 0x77, 0x0, 0x0, 0x36, 0xD6, 0x0, 0x0, 0x37, 0x49, 0x0, 0x0, 0x37, 0xB7, 0x0, 0x0, 0x37, 0xC7, 0x0, 0x0, 0x38, 0x2C, 0x0, 0x0, 0x38, 0x89, 0x0, 0x0, 0x38, 0xC6, 0x0, 0x0, 0x39, 0x21, 0x0, 0x0, 0x39, 0x5C, 0x0, 0x0, 0x39, 0xAE, 0x0, 0x0, 0x39, 0xFF, 0x0, 0x0, 0x3A, 0x6E, 0x0, 0x0, 0x3A, 0xC4, 0x0, 0x0, 0x3B, 0xC, 0x0, 0x0, 0x3B, 0x71, 0x0, 0x0, 0x3B, 0xB6, 0x0, 0x0, 0x3B, 0xF4, 0x0, 0x0, 0x3C, 0x52, 0x0, 0x0, 0x3C, 0xB0, 0x0, 0x0, 0x3D, 0xB, 0x0, 0x0, 0x3D, 0x7E, 0x0, 0x0, 0x3D, 0xE0, 0x0, 0x0, 0x3E, 0x42, 0x0, 0x0, 0x3E, 0xA8, 0x0, 0x0, 0x3F, 0x8, 0x0, 0x0, 0x3F, 0x60, 0x0, 0x0, 0x3F, 0x7B, 0x0, 0x0, 0x3F, 0x93, 0x0, 0x0, 0x3F, 0xB3, 0x0, 0x0, 0x3F, 0xC3, 0x0, 0x0, 0x3F, 0xE3, 0x0, 0x0, 0x40, 0x6F, 0x0, 0x0, 0x41, 0x6, 0x0, 0x0, 0x41, 0x84, 0x0, 0x0, 0x42, 0x7, 0x0, 0x0, 0x42, 0x1F, 0x0, 0x0, 0x42, 0x97, 0x0, 0x0, 0x42, 0xEE, 0x0, 0x0, 0x43, 0x4A, 0x0, 0x0, 0x43, 0xB6, 0x0, 0x0, 0x44, 0x1B, 0x0, 0x0, 0x44, 0x58, 0x0, 0x0, 0x44, 0xEE, 0x0, 0x0, 0x45, 0x79, 0x0, 0x0, 0x46, 0x7, 0x0, 0x0, 0x46, 0x4E, 0x0, 0x0, 0x46, 0x93, 0x0, 0x0, 0x46, 0xEC, 0x0, 0x0, 0x47, 0x69, 0x0, 0x0, 0x47, 0xD1, 0x0, 0x0, 0x48, 0x1, 0x0, 0x0, 0x48, 0x97, 0x0, 0x0, 0x49, 0x2F, 0x0, 0x0, 0x49, 0x93, 0x0, 0x0, 0x4A, 0x22, 0x0, 0x0, 0x4A, 0xA4, 0x0, 0x0, 0x4A, 0xBA, 0x0, 0x0, 0x4B, 0x6, 0x0, 0x0, 0x4B, 0x94, 0x0, 0x0, 0x4B, 0xE8, 0x0, 0x0, 0x4C, 0x35, 0x0, 0x0, 0x4C, 0x7A, 0x0, 0x0, 0x4C, 0x92, 0x0, 0x0, 0x4C, 0xED, 0x0, 0x0, 0x4D, 0x17, 0x0, 0x0, 0x4D, 0x7C, 0x0, 0x0, 0x4E, 0x15, 0x0, 0x0, 0x4E, 0x2D, 0x0, 0x0, 0x4E, 0x45, 0x0, 0x0, 0x4E, 0xC5, 0x0, 0x0, 0x4F, 0x37, 0x0, 0x0, 0x4F, 0x99, 0x0, 0x0, 0x4F, 0xB1, 0x0, 0x0, 0x50, 0x6, 0x0, 0x0, 0x50, 0x6E, 0x0, 0x0, 0x50, 0xE5, 0x0, 0x0, 0x51, 0x4F, 0x0, 0x0, 0x51, 0xB9, 0x0, 0x0, 0x52, 0x2B, 0x0, 0x0, 0x52, 0x82, 0x0, 0x0, 0x53, 0x2, 0x0, 0x0, 0x53, 0x74, 0x0, 0x0, 0x53, 0xE6, 0x0, 0x0, 0x54, 0x4A, 0x0, 0x0, 0x54, 0xB1, 0x0, 0x0, 0x55, 0x33, 0x0, 0x0, 0x55, 0x43, 0x0, 0x0, 0x55, 0xB0, 0x0, 0x0, 0x56, 0x40, 0x0, 0x0, 0x56, 0xB0, 0x0, 0x0, 0x56, 0xEF, 0x0, 0x0, 0x57, 0x7E, 0x0, 0x0, 0x57, 0x8E, 0x0, 0x0, 0x57, 0xED, 0x0, 0x0, 0x58, 0x4B, 0x0, 0x0, 0x58, 0xCC, 0x0, 0x0, 0x59, 0x9, 0x0, 0x0, 0x59, 0x60, 0x0, 0x0, 0x59, 0xCF, 0x0, 0x0, 0x59, 0xE7, 0x0, 0x0, 0x5A, 0x18, 0x0, 0x0, 0x5A, 0x43, 0x0, 0x0, 0x5A, 0x5B, 0x0, 0x0, 0x5A, 0xAE, 0x0, 0x0, 0x5A, 0xDF, 0x0, 0x0, 0x5B, 0x42, 0x0, 0x0, 0x5B, 0xA3, 0x0, 0x0, 0x5C, 0x5, 0x0, 0x0, 0x5C, 0x7C, 0x0, 0x0, 0x5C, 0xD2, 0x0, 0x0, 0x5D, 0x29, 0x0, 0x0, 0x5D, 0x55, 0x0, 0x0, 0x5D, 0xC5, 0x0, 0x0, 0x5E, 0x49, 0x0, 0x0, 0x5E, 0xBB, 0x0, 0x0, 0x5E, 0xEE, 0x0, 0x0, 0x5F, 0x21, 0x0, 0x0, 0x5F, 0x6D, 0x0, 0x0, 0x5F, 0xA2, 0x0, 0x0, 0x5F, 0xEF, 0x0, 0x0, 0x60, 0x1F, 0x0, 0x0, 0x60, 0x51, 0x0, 0x0, 0x60, 0x9E, 0x0, 0x0, 0x60, 0xE5, 0x0, 0x0, 0x61, 0x6E, 0x0, 0x0, 0x61, 0xB4, 0x0, 0x0, 0x61, 0xCC, 0x0, 0x0, 0x62, 0x14, 0x0, 0x0, 0x62, 0x81, 0x0, 0x0, 0x62, 0xC6, 0x0, 0x0, 0x63, 0xB, 0x0, 0x0, 0x63, 0x68, 0x0, 0x0, 0x63, 0xEE, 0x0, 0x0, 0x64, 0x3D, 0x0, 0x0, 0x64, 0x64, 0x0, 0x0, 0x64, 0xB2, 0x0, 0x0, 0x64, 0xF7, 0x0, 0x0, 0x65, 0x27, 0x0, 0x0, 0x65, 0x73, 0x0, 0x0, 0x65, 0xDA, 0x0, 0x0, 0x66, 0x38, 0x0, 0x0, 0x66, 0xBD, 0x0, 0x0, 0x67, 0xB, 0x0, 0x0, 0x67, 0x5C, 0x0, 0x0, 0x67, 0xAC, 0x0, 0x0, 0x68, 0x5, 0x0, 0x0, 0x68, 0x8D, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0x69, 0x75, 0x0, 0x0, 0x69, 0xDF, 0x0, 0x0, 0x6A, 0x1C, 0x0, 0x0, 0x6A, 0x39, 0x0, 0x0, 0x6A, 0xAB, 0x0, 0x0, 0x6B, 0x9, 0x0, 0x0, 0x6B, 0x21, 0x0, 0x0, 0x6B, 0x98, 0x0, 0x0, 0x6C, 0x3E, 0x0, 0x0, 0x6C, 0xEF, 0x0, 0x0, 0x6D, 0x7C, 0x0, 0x0, 0x6D, 0xFB, 0x0, 0x0, 0x6E, 0xA6, 0x0, 0x0, 0x6F, 0x2A, 0x0, 0x0, 0x6F, 0x9E, 0x0, 0x0, 0x6F, 0xD5, 0x0, 0x0, 0x70, 0x3B, 0x0, 0x0, 0x70, 0x7C, 0x0, 0x0, 0x70, 0xD3, 0x0, 0x0, 0x71, 0x44, 0x0, 0x0, 0x71, 0x80, 0x0, 0x0, 0x71, 0xCC, 0x0, 0x0, 0x72, 0x15, 0x0, 0x0, 0x72, 0x49, 0x0, 0x0, 0x72, 0x7D, 0x0, 0x0, 0x72, 0xC3, 0x0, 0x0, 0x73, 0xC, 0x0, 0x0, 0x73, 0x4D, 0x0, 0x0, 0x73, 0x90, 0x0, 0x0, 0x73, 0xAC, 0x0, 0x0, 0x73, 0xC4, 0x0, 0x0, 0x73, 0xEB, 0x0, 0x0, 0x74, 0x12, 0x0, 0x0, 0x74, 0x40, 0x0, 0x0, 0x74, 0x6F, 0x0, 0x0, 0x74, 0xBC, 0x0, 0x0, 0x75, 0x4, 0x0, 0x0, 0x75, 0x33, 0x0, 0x0, 0x75, 0x5E, 0x0, 0x0, 0x75, 0x8C, 0x0, 0x0, 0x75, 0xBB, 0x0, 0x0, 0x75, 0xE6, 0x0, 0x0, 0x76, 0x11, 0x0, 0x0, 0x76, 0x2B, 0x0, 0x0, 0x76, 0x3B, 0x0, 0x0, 0x76, 0x4B, 0x0, 0x0, 0x76, 0x5B, 0x0, 0x0, 0x76, 0x74, 0x0, 0x0, 0x76, 0x86, 0x0, 0x0, 0x76, 0x98, 0x0, 0x0, 0x76, 0xAA, 0x0, 0x0, 0x76, 0xD2, 0x0, 0x0, 0x76, 0xEC, 0x0, 0x0, 0x76, 0xFE, 0x0, 0x0, 0x77, 0x2E, 0x0, 0x0, 0x77, 0x4F, 0x0, 0x0, 0x77, 0x6F, 0x0, 0x0, 0x77, 0x98, 0x0, 0x0, 0x77, 0xB2, 0x0, 0x0, 0x77, 0xE2, 0x0, 0x0, 0x78, 0xA, 0x0, 0x0, 0x78, 0x4D, 0x0, 0x0, 0x78, 0x87, 0x0, 0x0, 0x78, 0xCB, 0x0, 0x0, 0x78, 0xF6, 0x0, 0x0, 0x79, 0x29, 0x0, 0x0, 0x79, 0x5D, 0x0, 0x0, 0x79, 0xBA, 0x0, 0x0, 0x79, 0xD5, 0x0, 0x0, 0x7A, 0x38, 0x0, 0x0, 0x7A, 0x71, 0x0, 0x0, 0x7A, 0xB6, 0x0, 0x0, 0x7A, 0xD4, 0x0, 0x0, 0x7A, 0xF7, 0x0, 0x0, 0x7B, 0x1A, 0x0, 0x0, 0x7B, 0x3D, 0x0, 0x0, 0x7B, 0x5A, 0x0, 0x0, 0x7B, 0x77, 0x0, 0x0, 0x7B, 0x9D, 0x0, 0x0, 0x7B, 0xC7, 0x0, 0x0, 0x7B, 0xEE, 0x0, 0x0, 0x7C, 0x2F, 0x0, 0x0, 0x7C, 0x5C, 0x0, 0x0, 0x7C, 0x88, 0x0, 0x0, 0x7C, 0xB5, 0x0, 0x0, 0x7C, 0xDF, 0x0, 0x0, 0x7D, 0x21, 0x0, 0x0, 0x7D, 0x33, 0x0, 0x0, 0x7D, 0x4D, 0x0, 0x0, 0x7D, 0x67, 0x0, 0x0, 0x7D, 0xAA, 0x0, 0x0, 0x7D, 0xC4, 0x0, 0x0, 0x7D, 0xE3, 0x0, 0x0, 0x7E, 0x2, 0x0, 0x0, 0x7E, 0x1F, 0x0, 0x0, 0x7E, 0x3D, 0x0, 0x0, 0x7E, 0x60, 0x0, 0x0, 0x7E, 0x7E, 0x0, 0x0, 0x7E, 0xAA, 0x0, 0x0, 0x7E, 0xC8, 0x0, 0x0, 0x7E, 0xE7, 0x0, 0x0, 0x7E, 0xF9, 0x0, 0x0, 0x7F, 0xB, 0x0, 0x0, 0x7F, 0x24, 0x0, 0x0, 0x7F, 0x36, 0x0, 0x0, 0x7F, 0x66, 0x0, 0x0, 0x7F, 0x8F, 0x0, 0x0, 0x7F, 0xDC, 0x0, 0x0, 0x80, 0xF, 0x0, 0x0, 0x80, 0x21, 0x0, 0x0, 0x80, 0x3B, 0x0, 0x0, 0x80, 0x65, 0x0, 0x0, 0x80, 0x77, 0x0, 0x0, 0x80, 0x91, 0x0, 0x0, 0x80, 0xBD, 0x0, 0x0, 0x81, 0x9, 0x0, 0x0, 0x81, 0x3A, 0x0, 0x0, 0x81, 0x62, 0x0, 0x0, 0x81, 0x76, 0x0, 0x0, 0x81, 0x9E, 0x0, 0x0, 0x81, 0xB2, 0x0, 0x0, 0x81, 0xCF, 0x0, 0x0, 0x81, 0xEE, 0x0, 0x0, 0x82, 0x11, 0x0, 0x0, 0x82, 0x35, 0x0, 0x0, 0x82, 0x53, 0x0, 0x0, 0x82, 0x7B, 0x0, 0x0, 0x82, 0xAA, 0x0, 0x0, 0x82, 0xCC, 0x0, 0x0, 0x82, 0xEE, 0x0, 0x0, 0x83, 0x17, 0x0, 0x0, 0x83, 0x31, 0x0, 0x0, 0x83, 0x61, 0x0, 0x0, 0x83, 0x92, 0x0, 0x0, 0x83, 0xB6, 0x0, 0x0, 0x83, 0xF2, 0x0, 0x0, 0x84, 0x35, 0x0, 0x0, 0x84, 0x5C, 0x0, 0x0, 0x84, 0x91, 0x0, 0x0, 0x84, 0xCB, 0x0, 0x0, 0x84, 0xE5, 0x0, 0x0, 0x85, 0xA, 0x0, 0x0, 0x85, 0x4F, 0x0, 0x0, 0x85, 0x78, 0x0, 0x0, 0x85, 0xA2, 0x0, 0x0, 0x85, 0xD1, 0x0, 0x0, 0x86, 0x1, 0x0, 0x0, 0x86, 0x44, 0x0, 0x0, 0x86, 0x5C, 0x0, 0x0, 0x86, 0x6E, 0x0, 0x0, 0x86, 0x94, 0x0, 0x0, 0x86, 0xA6, 0x0, 0x0, 0x86, 0xB8, 0x0, 0x0, 0x86, 0xD1, 0x0, 0x0, 0x86, 0xEF, 0x0, 0x0, 0x87, 0xD, 0x0, 0x0, 0x87, 0x3C, 0x0, 0x0, 0x87, 0x60, 0x0, 0x0, 0x87, 0x89, 0x0, 0x0, 0x87, 0xCE, 0x0, 0x0, 0x88, 0x2, 0x0, 0x0, 0x88, 0x3E, 0x0, 0x0, 0x88, 0x65, 0x0, 0x0, 0x88, 0x77, 0x0, 0x0, 0x88, 0x89, 0x0, 0x0, 0x88, 0x9B, 0x0, 0x0, 0x88, 0xAD, 0x0, 0x0, 0x88, 0xBF, 0x0, 0x0, 0x88, 0xEB, 0x0, 0x0, 0x89, 0x10, 0x0, 0x0, 0x89, 0x36, 0x0, 0x0, 0x89, 0x50, 0x0, 0x0, 0x89, 0x6F, 0x0, 0x0, 0x89, 0xC6, 0x0, 0x0, 0x8A, 0x43, 0x0, 0x0, 0x8A, 0xB9, 0x0, 0x0, 0x8A, 0xF0, 0x0, 0x0, 0x8B, 0x19, 0x0, 0x0, 0x8B, 0x19, 0x0, 0x0, 0x8B, 0x44, 0x0, 0x0, 0x8B, 0x73, 0x0, 0x0, 0x8B, 0xC5, 0x0, 0x0, 0x8B, 0xF9, 0x0, 0x0, 0x8C, 0xB, 0x0, 0x0, 0x8C, 0x1D, 0x0, 0x0, 0x8C, 0x37, 0x0, 0x0, 0x8C, 0x49, 0x0, 0x0, 0x8C, 0x5B, 0x0, 0x0, 0x8C, 0x97, 0x0, 0x0, 0x8D, 0xB, 0x0, 0x0, 0x8D, 0x30, 0x0, 0x0, 0x8D, 0x42, 0x0, 0x0, 0x8D, 0x79, 0x0, 0x0, 0x8D, 0x93, 0x0, 0x0, 0x8D, 0xA5, 0x0, 0x0, 0x8D, 0xF3, 0x0, 0x0, 0x8E, 0x2A, 0x0, 0x0, 0x8E, 0x53, 0x0, 0x0, 0x8E, 0xBB, 0x0, 0x0, 0x8F, 0xE, 0x0, 0x0, 0x8F, 0x38, 0x0, 0x0, 0x8F, 0x76, 0x0, 0x0, 0x8F, 0xB1, 0x0, 0x0, 0x8F, 0xFE, 0x0, 0x0, 0x90, 0x4E, 0x0, 0x0, 0x90, 0x89, 0x0, 0x0, 0x90, 0xE2, 0x0, 0x0, 0x91, 0x16, 0x0, 0x0, 0x91, 0x52, 0x0, 0x0, 0x91, 0x7F, 0x0, 0x0, 0x91, 0xB4, 0x0, 0x0, 0x91, 0xDA, 0x0, 0x0, 0x92, 0x17, 0x0, 0x0, 0x92, 0x47, 0x0, 0x0, 0x92, 0x77, 0x0, 0x0, 0x92, 0x87, 0x0, 0x0, 0x92, 0xA3, 0x0, 0x0, 0x92, 0xB3, 0x0, 0x0, 0x92, 0xF8, 0x0, 0x0, 0x93, 0x4F, 0x0, 0x0, 0x93, 0xBF, 0x0, 0x0, 0x94, 0x2F, 0x0, 0x0, 0x94, 0x47, 0x0, 0x0, 0x94, 0x63, 0x0, 0x0, 0x94, 0xC0, 0x0, 0x0, 0x94, 0xD0, 0x0, 0x0, 0x94, 0xF0, 0x0, 0x0, 0x95, 0x1E, 0x0, 0x0, 0x95, 0x92, 0x0, 0x0, 0x95, 0xBC, 0x0, 0x0, 0x95, 0xF1, 0x0, 0x0, 0x96, 0x17, 0x0, 0x0, 0x96, 0x4E, 0x0, 0x0, 0x96, 0xC0, 0x0, 0x0, 0x97, 0x14, 0x0, 0x0, 0x97, 0x84, 0x0, 0x0, 0x97, 0xEE, 0x0, 0x0, 0x98, 0x60, 0x0, 0x0, 0x98, 0x8E, 0x0, 0x0, 0x99, 0x16, 0x0, 0x0, 0x99, 0x84, 0x0, 0x0, 0x99, 0xEE, 0x0, 0x0, 0x9A, 0x2C, 0x0, 0x0, 0x9A, 0x98, 0x0, 0x0, 0x9A, 0xCA, 0x0, 0x0, 0x9B, 0x22, 0x0, 0x0, 0x9B, 0xA8, 0x0, 0x0, 0x9B, 0xEF, 0x0, 0x0, 0x9C, 0x49, 0x0, 0x0, 0x9C, 0xB1, 0x0, 0x0, 0x9D, 0x12, 0x0, 0x0, 0x9D, 0x4F, 0x0, 0x0, 0x9D, 0x99, 0x0, 0x0, 0x9E, 0xF, 0x0, 0x0, 0x9E, 0x70, 0x0, 0x0, 0x9E, 0xE9, 0x0, 0x0, 0x9F, 0x2C, 0x0, 0x0, 0x9F, 0xBC, 0x0, 0x0, 0xA0, 0x3D, 0x0, 0x0, 0xA0, 0x99, 0x0, 0x0, 0xA0, 0xA9, 0x0, 0x0, 0xA1, 0x25, 0x0, 0x0, 0xA1, 0x9D, 0x0, 0x0, 0xA2, 0xD, 0x0, 0x0, 0xA2, 0x72, 0x0, 0x0, 0xA2, 0xE2, 0x0, 0x0, 0xA3, 0x4A, 0x0, 0x0, 0xA3, 0x7B, 0x0, 0x0, 0xA3, 0xAB, 0x0, 0x0, 0xA4, 0x15, 0x0, 0x0, 0xA4, 0x43, 0x0, 0x0, 0xA4, 0xB4, 0x0, 0x0, 0xA5, 0xB, 0x0, 0x0, 0xA5, 0x6F, 0x0, 0x0, 0xA5, 0xEE, 0x0, 0x0, 0xA6, 0x38, 0x0, 0x0, 0xA6, 0x82, 0x0, 0x0, 0xA6, 0xBD, 0x0, 0x0, 0xA6, 0xD5, 0x0, 0x0, 0xA7, 0x39, 0x0, 0x0, 0xA7, 0xBA, 0x0, 0x0, 0xA8, 0x3B, 0x0, 0x0, 0xA8, 0x91, 0x0, 0x0, 0xA8, 0xFC, 0x0, 0x0, 0xA9, 0x6B, 0x0, 0x0, 0xA9, 0xCA, 0x0, 0x0, 0xAA, 0x14, 0x0, 0x0, 0xAA, 0x43, 0x0, 0x0, 0xAA, 0x8F, 0x0, 0x0, 0xAA, 0xE5, 0x0, 0x0, 0xAB, 0x40, 0x0, 0x0, 0xAB, 0xB2, 0x0, 0x0, 0xAB, 0xE0, 0x0, 0x0, 0xAC, 0x20, 0x0, 0x0, 0xAC, 0x66, 0x0, 0x0, 0xAC, 0xE9, 0x0, 0x0, 0xAD, 0x19, 0x0, 0x0, 0xAD, 0x56, 0x0, 0x0, 0xAD, 0x86, 0x0, 0x0, 0xAD, 0xC1, 0x0, 0x0, 0xAE, 0xC, 0x0, 0x0, 0xAE, 0x62, 0x0, 0x0, 0xAE, 0xA6, 0x0, 0x0, 0xAF, 0x10, 0x0, 0x0, 0xAF, 0x87, 0x0, 0x0, 0xAF, 0xDA, 0x0, 0x0, 0xB0, 0x58, 0x0, 0x0, 0xB0, 0xB5, 0x0, 0x0, 0xB0, 0xD5, 0x0, 0x0, 0xB1, 0x25, 0x0, 0x0, 0xB1, 0x7C, 0x0, 0x0, 0xB1, 0xE5, 0x0, 0x0, 0xB2, 0x13, 0x0, 0x0, 0xB2, 0x4C, 0x0, 0x0, 0xB2, 0x8B, 0x0, 0x0, 0xB2, 0xC6, 0x0, 0x0, 0xB2, 0xF5, 0x0, 0x0, 0xB3, 0x1A, 0x0, 0x0, 0xB3, 0x40, 0x0, 0x0, 0xB3, 0xD6, 0x0, 0x0, 0xB4, 0x6, 0x0, 0x0, 0xB4, 0x41, 0x0, 0x0, 0xB4, 0x71, 0x0, 0x0, 0xB4, 0xAC, 0x0, 0x0, 0xB4, 0xF1, 0x0, 0x0, 0xB5, 0x41, 0x0, 0x0, 0xB5, 0x7F, 0x0, 0x0, 0xB5, 0xDA, 0x0, 0x0, 0xB6, 0x49, 0x0, 0x0, 0xB6, 0x96, 0x0, 0x0, 0xB6, 0xFD, 0x0, 0x0, 0xB7, 0x5E, 0x0, 0x0, 0xB7, 0xCA, 0x0, 0x0, 0xB8, 0x23, 0x0, 0x0, 0xB8, 0x73, 0x0, 0x0, 0xB8, 0xA2, 0x0, 0x0, 0xB8, 0xFF, 0x0, 0x0, 0xB9, 0x59, 0x0, 0x0, 0xB9, 0xB0, 0x0, 0x0, 0xBA, 0x2D, 0x0, 0x0, 0xBA, 0x9E, 0x0, 0x0, 0xBA, 0xE3, 0x0, 0x0, 0xBB, 0x2B, 0x0, 0x0, 0xBB, 0x87, 0x0, 0x0, 0xBB, 0xE4, 0x0, 0x0, 0xBC, 0x4E, 0x0, 0x0, 0xBC, 0xBD, 0x0, 0x0, 0xBD, 0x36, 0x0, 0x0, 0xBD, 0xB4, 0x0, 0x0, 0xBE, 0x4E, 0x0, 0x0, 0xBE, 0xE0, 0x0, 0x0, 0xBF, 0x4F, 0x0, 0x0, 0xBF, 0xB7, 0x0, 0x0, 0xBF, 0xFA, 0x0, 0x0, 0xC0, 0x40, 0x0, 0x0, 0xC0, 0xBF, 0x0, 0x0, 0xC1, 0x2E, 0x0, 0x0, 0xC1, 0xF2, 0x0, 0x0, 0xC2, 0xB1, 0x0, 0x0, 0xC3, 0x28, 0x0, 0x0, 0xC3, 0x9C, 0x0, 0x0, 0xC3, 0xEE, 0x0, 0x0, 0xC4, 0x3B, 0x0, 0x0, 0xC4, 0x92, 0x0, 0x0, 0xC4, 0xB8, 0x0, 0x0, 0xC4, 0xF6, 0x0, 0x0, 0xC5, 0x16, 0x0, 0x0, 0xC5, 0x37, 0x0, 0x0, 0xC5, 0x75, 0x0, 0x0, 0xC6, 0xA6, 0x0, 0x0, 0xC7, 0x48, 0x0, 0x0, 0xC7, 0x68, 0x0, 0x0, 0xC7, 0x88, 0x0, 0x0, 0xC7, 0xDD, 0x0, 0x0, 0xC8, 0x3B, 0x0, 0x0, 0xC8, 0xA9, 0x0, 0x0, 0xC8, 0xD3, 0x0, 0x0, 0xC8, 0xF7, 0x0, 0x0, 0xC9, 0x46, 0x0, 0x0, 0xC9, 0x91, 0x0, 0x0, 0xC9, 0xA9, 0x0, 0x0, 0xC9, 0xC1, 0x0, 0x0, 0xC9, 0xD9, 0x0, 0x0, 0xC9, 0xF1, 0x0, 0x0, 0xCA, 0x3D, 0x0, 0x0, 0xCA, 0x86, 0x0, 0x0, 0xCA, 0xC5, 0x0, 0x0, 0xCB, 0x4, 0x0, 0x0, 0xCB, 0x1C, 0x0, 0x0, 0xCB, 0x34, 0x0, 0x0, 0xCB, 0x69, 0x0, 0x0, 0xCB, 0x9E, 0x0, 0x0, 0xCB, 0xF2, 0x0, 0x0, 0xCC, 0x43, 0x0, 0x0, 0xCC, 0xD4, 0x0, 0x0, 0xCD, 0x5C, 0x0, 0x0, 0xCD, 0x74, 0x0, 0x0, 0xCD, 0x8C, 0x0, 0x0, 0xCD, 0xC8, 0x0, 0x0, 0xCE, 0x2, 0x0, 0x0, 0xCE, 0x1A, 0x0, 0x0, 0xCE, 0x32, 0x0, 0x0, 0xCE, 0x80, 0x0, 0x0, 0xCE, 0xCA, 0x0, 0x0, 0xCF, 0xA, 0x0, 0x0, 0xCF, 0x88, 0x0, 0x0, 0xCF, 0xF9, 0x0, 0x0, 0xD0, 0x54, 0x0, 0x0, 0xD0, 0xA4, 0x0, 0x0, 0xD0, 0xBC, 0x0, 0x0, 0xD0, 0xD4, 0x0, 0x0, 0xD1, 0x1A, 0x0, 0x0, 0xD1, 0x60, 0x0, 0x0, 0xD1, 0x78, 0x0, 0x0, 0xD1, 0x90, 0x0, 0x0, 0xD1, 0xA8, 0x0, 0x0, 0xD1, 0xC0, 0x0, 0x0, 0xD2, 0x30, 0x0, 0x0, 0xD2, 0x8A, 0x0, 0x0, 0xD2, 0xE5, 0x0, 0x0, 0xD3, 0x3, 0x0, 0x0, 0xD3, 0x23, 0x0, 0x0, 0xD3, 0x3B, 0x0, 0x0, 0xD3, 0x53, 0x0, 0x0, 0xD3, 0x99, 0x0, 0x0, 0xD4, 0x6, 0x0, 0x0, 0xD4, 0x8E, 0x0, 0x0, 0xD5, 0x12, 0x0, 0x0, 0xD5, 0x8A, 0x0, 0x0, 0xD5, 0xFD, 0x0, 0x0, 0xD6, 0x67, 0x0, 0x0, 0xD6, 0xDB, 0x0, 0x0, 0xD7, 0x4D, 0x0, 0x0, 0xD7, 0xAF, 0x0, 0x0, 0xD8, 0x10, 0x0, 0x0, 0xD8, 0x7A, 0x0, 0x0, 0xD8, 0xD9, 0x0, 0x0, 0xD9, 0x32, 0x0, 0x0, 0xD9, 0x89, 0x0, 0x0, 0xDA, 0x0, 0x0, 0x0, 0xDA, 0x18, 0x0, 0x0, 0xDA, 0x30, 0x0, 0x0, 0xDA, 0x98, 0x0, 0x0, 0xDA, 0xFA, 0x0, 0x0, 0xDB, 0x5A, 0x0, 0x0, 0xDB, 0xC9, 0x0, 0x0, 0xDC, 0x31, 0x0, 0x0, 0xDC, 0xC5, 0x0, 0x0, 0xDD, 0x15, 0x0, 0x0, 0xDD, 0x62, 0x0, 0x0, 0xDD, 0xDF, 0x0, 0x0, 0xDE, 0x5B, 0x0, 0x0, 0xDE, 0xC6, 0x0, 0x0, 0xDF, 0x31, 0x0, 0x0, 0xDF, 0x61, 0x0, 0x0, 0xDF, 0x91, 0x0, 0x0, 0xDF, 0xD9, 0x0, 0x0, 0xE0, 0x21, 0x0, 0x0, 0xE0, 0x67, 0x0, 0x0, 0xE0, 0xAF, 0x0, 0x0, 0xE1, 0x3C, 0x0, 0x0, 0xE1, 0xBF, 0x0, 0x0, 0xE2, 0x2B, 0x0, 0x0, 0xE2, 0x92, 0x0, 0x0, 0xE2, 0xDD, 0x0, 0x0, 0xE3, 0x27, 0x0, 0x0, 0xE3, 0x61, 0x0, 0x0, 0xE3, 0xE5, 0x0, 0x0, 0xE4, 0x76, 0x0, 0x0, 0xE4, 0xA0, 0x0, 0x0, 0xE4, 0xC2, 0x0, 0x0, 0xE5, 0x15, 0x0, 0x0, 0xE5, 0x88, 0x0, 0x0, 0xE5, 0xB5, 0x0, 0x0, 0xE5, 0xCF, 0x0, 0x0, 0xE5, 0xED, 0x0, 0x0, 0xE6, 0x24, 0x0, 0x0, 0xE6, 0x82, 0x0, 0x0, 0xE7, 0x31, 0x0, 0x0, 0xE7, 0x8F, 0x0, 0x0, 0xE7, 0xE8, 0x0, 0x0, 0xE8, 0x21, 0x0, 0x0, 0xE8, 0x71, 0x0, 0x0, 0xE9, 0x23, 0x0, 0x0, 0xE9, 0x8C, 0x0, 0x0, 0xE9, 0xE0, 0x0, 0x0, 0xEA, 0x29, 0x0, 0x0, 0xEA, 0x41, 0x0, 0x0, 0xEA, 0x6E, 0x0, 0x0, 0xEA, 0x7E, 0x0, 0x0, 0xEA, 0xB9, 0x0, 0x0, 0xEA, 0xEF, 0x0, 0x0, 0xEB, 0x28, 0x0, 0x0, 0xEB, 0x5B, 0x0, 0x0, 0xEB, 0x96, 0x0, 0x0, 0xEB, 0xA6, 0x0, 0x0, 0xEC, 0x0, 0x0, 0x0, 0xEC, 0x57, 0x0, 0x0, 0xEC, 0xB4, 0x0, 0x0, 0xED, 0xD, 0x0, 0x0, 0xED, 0x95, 0x0, 0x0, 0xEE, 0x40, 0x0, 0x0, 0xEE, 0xA2, 0x0, 0x0, 0xEE, 0xE1, 0x0, 0x0, 0xEF, 0x1E, 0x0, 0x0, 0xEF, 0x63, 0x0, 0x0, 0xEF, 0xB1, 0x0, 0x0, 0xEF, 0xFC, 0x0, 0x0, 0xF0, 0xC, 0x0, 0x0, 0xF0, 0x4A, 0x0, 0x0, 0xF0, 0x86, 0x0, 0x0, 0xF0, 0xFC, 0x0, 0x0, 0xF1, 0x5B, 0x0, 0x0, 0xF1, 0x6B, 0x0, 0x0, 0xF1, 0x7B, 0x0, 0x0, 0xF1, 0x8B, 0x0, 0x0, 0xF1, 0xE1, 0x0, 0x0, 0xF2, 0x52, 0x0, 0x0, 0xF2, 0xB7, 0x0, 0x0, 0xF2, 0xC7, 0x0, 0x0, 0xF2, 0xF0, 0x0, 0x0, 0xF3, 0x0, 0x0, 0x0, 0xF3, 0x10, 0x0, 0x0, 0xF3, 0x61, 0x0, 0x0, 0xF3, 0x71, 0x0, 0x0, 0xF3, 0xAA, 0x0, 0x0, 0xF3, 0xF9, 0x0, 0x0, 0xF4, 0x5B, 0x0, 0x0, 0xF4, 0xC9, 0x0, 0x0, 0xF5, 0x12, 0x0, 0x0, 0xF5, 0x42, 0x0, 0x0, 0xF5, 0x72, 0x0, 0x0, 0xF5, 0xD3, 0x0, 0x0, 0xF6, 0x4, 0x0, 0x0, 0xF6, 0x1F, 0x0, 0x0, 0xF6, 0x53, 0x0, 0x0, 0xF6, 0x8C, 0x0, 0x0, 0xF6, 0xAB, 0x0, 0x0, 0xF6, 0xEC, 0x0, 0x0, 0xF7, 0x1F, 0x0, 0x0, 0xF7, 0x50, 0x0, 0x0, 0xF7, 0xA8, 0x0, 0x0, 0xF8, 0x12, 0x0, 0x0, 0xF8, 0x54, 0x0, 0x0, 0xF8, 0x9E, 0x0, 0x0, 0xF8, 0xC4, 0x0, 0x0, 0xF8, 0xFC, 0x0, 0x0, 0xF9, 0x37, 0x0, 0x0, 0xF9, 0xA3, 0x0, 0x0, 0xFA, 0xF, 0x0, 0x0, 0xFA, 0x76, 0x0, 0x0, 0xFB, 0x15, 0x0, 0x0, 0xFB, 0x6B, 0x0, 0x0, 0xFB, 0xBF, 0x0, 0x0, 0xFC, 0x1C, 0x0, 0x0, 0xFC, 0x75, 0x0, 0x0, 0xFC, 0xD2, 0x0, 0x0, 0xFD, 0x2F, 0x0, 0x0, 0xFD, 0x9F, 0x0, 0x0, 0xFD, 0xD6, 0x0, 0x0, 0xFE, 0xE, 0x0, 0x0, 0xFE, 0x69, 0x0, 0x0, 0xFE, 0xB9, 0x0, 0x0, 0xFF, 0x2, 0x0, 0x0, 0xFF, 0x47, 0x0, 0x0, 0xFF, 0x78, 0x0, 0x0, 0xFF, 0xAA, 0x0, 0x0, 0xFF, 0xFD, 0x0, 0x1, 0x0, 0x40, 0x0, 0x1, 0x0, 0x7C, 0x0, 0x1, 0x0, 0xB6, 0x0, 0x1, 0x1, 0x11, 0x0, 0x1, 0x1, 0x40, 0x0, 0x1, 0x1, 0xA0, 0x0, 0x1, 0x2, 0x7, 0x0, 0x1, 0x2, 0x3B, 0x0, 0x1, 0x2, 0xB1, 0x0, 0x1, 0x3, 0x1A, 0x0, 0x1, 0x3, 0x87, 0x0, 0x1, 0x3, 0xC0, 0x0, 0x1, 0x3, 0xD2, 0x0, 0x1, 0x3, 0xE4, 0x0, 0x1, 0x3, 0xF6, 0x0, 0x1, 0x4, 0x8, 0x0, 0x1, 0x4, 0x1A, 0x0, 0x1, 0x4, 0x6E, 0x0, 0x1, 0x4, 0x80, 0x0, 0x1, 0x4, 0x92, 0x0, 0x1, 0x5, 0x18, 0x0, 0x1, 0x5, 0xA5, 0x0, 0x1, 0x6, 0x30, 0x0, 0x1, 0x6, 0xA2, 0x0, 0x1, 0x7, 0x51, 0x0, 0x1, 0x7, 0xC5, 0x0, 0x1, 0x8, 0x50, 0x0, 0x1, 0x8, 0xB7, 0x0, 0x1, 0x9, 0x15, 0x0, 0x1, 0x9, 0xAE, 0x0, 0x1, 0xA, 0x22, 0x0, 0x1, 0xA, 0x88, 0x0, 0x1, 0xB, 0x0, 0x0, 0x1, 0xB, 0x10, 0x0, 0x1, 0xB, 0x82, 0x0, 0x1, 0xC, 0x14, 0x0, 0x1, 0xC, 0x2C, 0x0, 0x1, 0xC, 0x44, 0x0, 0x1, 0xC, 0xB6, 0x0, 0x1, 0xD, 0x11, 0x0, 0x1, 0xD, 0xB5, 0x0, 0x1, 0xE, 0x2E, 0x0, 0x1, 0xE, 0xAA, 0x0, 0x1, 0xF, 0xD, 0x0, 0x1, 0xF, 0xAA, 0x0, 0x1, 0x10, 0x8, 0x0, 0x1, 0x10, 0x43, 0x0, 0x1, 0x10, 0xC4, 0x0, 0x1, 0x11, 0x24, 0x0, 0x1, 0x11, 0xA0, 0x0, 0x1, 0x11, 0xF5, 0x0, 0x1, 0x12, 0x7E, 0x0, 0x1, 0x12, 0xEB, 0x0, 0x1, 0x13, 0x36, 0x0, 0x1, 0x13, 0x96, 0x0, 0x1, 0x13, 0xE2, 0x0, 0x1, 0x14, 0x73, 0x0, 0x1, 0x14, 0xF5, 0x0, 0x1, 0x15, 0x7F, 0x0, 0x1, 0x16, 0x0, 0x0, 0x1, 0x16, 0x88, 0x0, 0x1, 0x17, 0x10, 0x0, 0x1, 0x17, 0x97, 0x0, 0x1, 0x17, 0xEF, 0x0, 0x1, 0x18, 0x63, 0x0, 0x1, 0x18, 0xC6, 0x0, 0x1, 0x19, 0x26, 0x0, 0x1, 0x19, 0x9B, 0x0, 0x1, 0x1A, 0x1, 0x0, 0x1, 0x1A, 0x50, 0x0, 0x1, 0x1A, 0xC5, 0x0, 0x1, 0x1B, 0x3D, 0x0, 0x1, 0x1B, 0x9A, 0x0, 0x1, 0x1B, 0xDC, 0x0, 0x1, 0x1C, 0x20, 0x0, 0x1, 0x1C, 0x30, 0x0, 0x1, 0x1C, 0x6B, 0x0, 0x1, 0x1C, 0xB4, 0x0, 0x1, 0x1C, 0xE4, 0x0, 0x1, 0x1D, 0x11, 0x0, 0x1, 0x1D, 0x4C, 0x0, 0x1, 0x1D, 0xB0, 0x0, 0x1, 0x1D, 0xDE, 0x0, 0x1, 0x1E, 0x13, 0x0, 0x1, 0x1E, 0x32, 0x0, 0x1, 0x1E, 0xA1, 0x0, 0x1, 0x1E, 0xFB, 0x0, 0x1, 0x1F, 0x49, 0x0, 0x1, 0x1F, 0x98, 0x0, 0x1, 0x1F, 0xC7, 0x0, 0x1, 0x20, 0x1A, 0x0, 0x1, 0x20, 0xA2, 0x0, 0x1, 0x21, 0x20, 0x0, 0x1, 0x21, 0x60, 0x0, 0x1, 0x21, 0xB1, 0x0, 0x1, 0x22, 0xB, 0x0, 0x1, 0x22, 0x8F, 0x0, 0x1, 0x22, 0xC7, 0x0, 0x1, 0x23, 0x14, 0x0, 0x1, 0x23, 0x42, 0x0, 0x1, 0x23, 0x6F, 0x0, 0x1, 0x23, 0xB5, 0x0, 0x1, 0x24, 0x16, 0x0, 0x1, 0x24, 0x6C, 0x0, 0x1, 0x24, 0xCC, 0x0, 0x1, 0x25, 0x22, 0x0, 0x1, 0x25, 0x79, 0x0, 0x1, 0x25, 0xF5, 0x0, 0x1, 0x26, 0x19, 0x0, 0x1, 0x26, 0x3B, 0x0, 0x1, 0x26, 0x5D, 0x0, 0x1, 0x26, 0x7E, 0x0, 0x1, 0x26, 0xA0, 0x0, 0x1, 0x26, 0xCE, 0x0, 0x1, 0x26, 0xFC, 0x0, 0x1, 0x27, 0x2E, 0x0, 0x1, 0x27, 0x62, 0x0, 0x1, 0x27, 0x97, 0x0, 0x1, 0x27, 0xC3, 0x0, 0x1, 0x27, 0xD7, 0x0, 0x1, 0x27, 0xFE, 0x0, 0x1, 0x28, 0x40, 0x0, 0x1, 0x28, 0xA0, 0x0, 0x1, 0x28, 0xFB, 0x0, 0x1, 0x29, 0x3A, 0x0, 0x1, 0x29, 0xD3, 0x0, 0x1, 0x2A, 0x5A, 0x0, 0x1, 0x2A, 0xCA, 0x0, 0x1, 0x2B, 0x36, 0x0, 0x1, 0x2B, 0x94, 0x0, 0x1, 0x2C, 0xA, 0x0, 0x1, 0x2C, 0x71, 0x0, 0x1, 0x2C, 0xC2, 0x0, 0x1, 0x2C, 0xF6, 0x0, 0x1, 0x2D, 0x10, 0x0, 0x1, 0x2D, 0x30, 0x0, 0x1, 0x2D, 0x67, 0x0, 0x1, 0x2D, 0x7B, 0x0, 0x1, 0x2D, 0xAA, 0x0, 0x1, 0x2D, 0xFD, 0x0, 0x1, 0x2E, 0x3D, 0x0, 0x1, 0x2E, 0x99, 0x0, 0x1, 0x2E, 0xC9, 0x0, 0x1, 0x2E, 0xF7, 0x0, 0x1, 0x2F, 0x54, 0x0, 0x1, 0x2F, 0xA4, 0x0, 0x1, 0x30, 0xA, 0x0, 0x1, 0x30, 0x5D, 0x0, 0x1, 0x30, 0x9F, 0x0, 0x1, 0x31, 0x5, 0x0, 0x1, 0x31, 0x54, 0x0, 0x1, 0x31, 0x68, 0x0, 0x1, 0x31, 0xAF, 0x0, 0x1, 0x31, 0xF4, 0x0, 0x1, 0x32, 0x37, 0x0, 0x1, 0x32, 0xBE, 0x0, 0x1, 0x33, 0x1E, 0x0, 0x1, 0x33, 0x71, 0x0, 0x1, 0x33, 0x83, 0x0, 0x1, 0x33, 0xBA, 0x0, 0x1, 0x34, 0x2F, 0x0, 0x1, 0x34, 0x41, 0x0, 0x1, 0x34, 0x88, 0x0, 0x1, 0x34, 0x9E, 0x0, 0x1, 0x34, 0xB4, 0x0, 0x1, 0x34, 0xCC, 0x0, 0x1, 0x34, 0xE4, 0x0, 0x1, 0x34, 0xFC, 0x0, 0x1, 0x35, 0x14, 0x0, 0x1, 0x35, 0x60, 0x0, 0x1, 0x35, 0xA8, 0x0, 0x1, 0x35, 0xE7, 0x0, 0x1, 0x36, 0x5B, 0x0, 0x1, 0x36, 0x6B, 0x0, 0x1, 0x36, 0x83, 0x0, 0x1, 0x36, 0xBE, 0x0, 0x1, 0x37, 0x1E, 0x0, 0x1, 0x37, 0x7F, 0x0, 0x1, 0x37, 0xE2, 0x0, 0x1, 0x38, 0x48, 0x0, 0x1, 0x38, 0x6D, 0x0, 0x1, 0x38, 0x97, 0x0, 0x1, 0x38, 0xBC, 0x0, 0x1, 0x39, 0x0, 0x0, 0x1, 0x39, 0x82, 0x0, 0x1, 0x39, 0xBA, 0x0, 0x1, 0x39, 0xF3, 0x0, 0x1, 0x3A, 0x4D, 0x0, 0x1, 0x3A, 0x85, 0x0, 0x1, 0x3A, 0xBF, 0x0, 0x1, 0x3B, 0x19, 0x0, 0x1, 0x3B, 0x74, 0x0, 0x1, 0x3B, 0xCF, 0x0, 0x1, 0x3B, 0xF0, 0x0, 0x1, 0x3C, 0x10, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x36, 0x0, 0x1, 0x3C, 0x50, 0x0, 0x1, 0x3C, 0x8C, 0x0, 0x1, 0x3C, 0xBA, 0x0, 0x1, 0x3C, 0xE7, 0x0, 0x1, 0x3C, 0xF7, 0x0, 0x1, 0x3D, 0x7, 0x0, 0x1, 0x3D, 0x17, 0x0, 0x1, 0x3D, 0x2B, 0x0, 0x1, 0x3D, 0x3F, 0x0, 0x1, 0x3D, 0x57, 0x0, 0x1, 0x3D, 0x7D, 0x0, 0x1, 0x3D, 0xA4, 0x0, 0x1, 0x3D, 0xCC, 0x0, 0x1, 0x3D, 0xF5, 0x0, 0x1, 0x3E, 0x1C, 0x0, 0x1, 0x3E, 0x34, 0x0, 0x1, 0x3E, 0x4C, 0x0, 0x1, 0x3E, 0x8E, 0x0, 0x1, 0x3E, 0xD1, 0x0, 0x1, 0x3F, 0x2, 0x0, 0x1, 0x3F, 0x47, 0x0, 0x1, 0x3F, 0x75, 0x0, 0x1, 0x3F, 0x91, 0x0, 0x1, 0x3F, 0xA1, 0x0, 0x1, 0x3F, 0xB9, 0x0, 0x1, 0x3F, 0xD9, 0x0, 0x1, 0x40, 0x1, 0x0, 0x1, 0x40, 0xE2, 0x0, 0x1, 0x41, 0xF7, 0x0, 0x1, 0x42, 0x32, 0x0, 0x1, 0x42, 0x4F, 0x0, 0x1, 0x42, 0x7B, 0x0, 0x1, 0x42, 0xB6, 0x0, 0x1, 0x42, 0xE4, 0x0, 0x1, 0x43, 0xA, 0x0, 0x1, 0x43, 0x2E, 0x0, 0x1, 0x43, 0xE7, 0x0, 0x1, 0x44, 0x62, 0x0, 0x1, 0x44, 0x74, 0x0, 0x1, 0x44, 0xB0, 0x0, 0x1, 0x44, 0xED, 0x0, 0x1, 0x45, 0x1C, 0x0, 0x1, 0x45, 0xE7, 0x0, 0x1, 0x46, 0x3, 0x0, 0x1, 0x46, 0x23, 0x0, 0x1, 0x46, 0x50, 0x0, 0x1, 0x46, 0x7D, 0x0, 0x1, 0x46, 0x9C, 0x0, 0x1, 0x46, 0xC7, 0x0, 0x1, 0x46, 0xFA, 0x0, 0x1, 0x47, 0x2D, 0x0, 0x1, 0x47, 0x3F, 0x0, 0x1, 0x47, 0x82, 0x0, 0x1, 0x47, 0xED, 0x0, 0x1, 0x48, 0x5, 0x0, 0x1, 0x48, 0x62, 0x0, 0x1, 0x48, 0xAF, 0x0, 0x1, 0x48, 0xEA, 0x0, 0x1, 0x49, 0x35, 0x0, 0x1, 0x49, 0x57, 0x0, 0x1, 0x49, 0xA1, 0x0, 0x1, 0x49, 0xCB, 0x0, 0x1, 0x49, 0xFD, 0x0, 0x1, 0x4A, 0x17, 0x0, 0x1, 0x4A, 0x41, 0x0, 0x1, 0x4A, 0xF0, 0x0, 0x1, 0x4B, 0x12, 0x0, 0x1, 0x4B, 0x3C, 0x0, 0x1, 0x4B, 0x4E, 0x0, 0x1, 0x4B, 0x87, 0x0, 0x1, 0x4B, 0x99, 0x0, 0x1, 0x4B, 0xAB, 0x0, 0x1, 0x4B, 0xBD, 0x0, 0x1, 0x4B, 0xCF, 0x0, 0x1, 0x4B, 0xE1, 0x0, 0x1, 0x4B, 0xF3, 0x0, 0x1, 0x4C, 0x20, 0x0, 0x1, 0x4C, 0x3A, 0x0, 0x1, 0x4C, 0x62, 0x0, 0x1, 0x4C, 0x9C, 0x0, 0x1, 0x4C, 0xD7, 0x0, 0x1, 0x4D, 0x13, 0x0, 0x1, 0x4D, 0x25, 0x0, 0x1, 0x4D, 0x37, 0x0, 0x1, 0x4D, 0x49, 0x0, 0x1, 0x4D, 0x5B, 0x0, 0x1, 0x4D, 0x6D, 0x0, 0x1, 0x4D, 0x7F, 0x0, 0x1, 0x4D, 0x91, 0x0, 0x1, 0x4D, 0xA3, 0x0, 0x1, 0x4D, 0xB5, 0x0, 0x1, 0x4D, 0xC7, 0x0, 0x1, 0x4D, 0xD9, 0x0, 0x1, 0x4D, 0xEB, 0x0, 0x1, 0x4D, 0xFD, 0x0, 0x1, 0x4E, 0x36, 0x0, 0x1, 0x4E, 0x70, 0x0, 0x1, 0x4E, 0x82, 0x0, 0x1, 0x4E, 0x94, 0x0, 0x1, 0x4E, 0xA6, 0x0, 0x1, 0x4E, 0xB8, 0x0, 0x1, 0x4E, 0xCC, 0x0, 0x1, 0x4E, 0xDE, 0x0, 0x1, 0x4E, 0xF0, 0x0, 0x1, 0x4F, 0x2, 0x0, 0x1, 0x4F, 0x14, 0x0, 0x1, 0x4F, 0x4F, 0x0, 0x1, 0x4F, 0xA0, 0x0, 0x1, 0x4F, 0xB2, 0x0, 0x1, 0x4F, 0xC4, 0x0, 0x1, 0x50, 0x29, 0x0, 0x1, 0x50, 0xCF, 0x0, 0x1, 0x51, 0x57, 0x0, 0x1, 0x51, 0xCB, 0x0, 0x1, 0x52, 0x3E, 0x0, 0x1, 0x52, 0xC2, 0x0, 0x1, 0x53, 0x3C, 0x0, 0x1, 0x53, 0x54, 0x0, 0x1, 0x53, 0xFB, 0x0, 0x1, 0x54, 0x56, 0x0, 0x1, 0x54, 0xC5, 0x0, 0x1, 0x55, 0xF, 0x0, 0x1, 0x55, 0x5E, 0x0, 0x1, 0x56, 0x4E, 0x0, 0x1, 0x56, 0xE9, 0x0, 0x1, 0x57, 0x6A, 0x0, 0x1, 0x57, 0xED, 0x0, 0x1, 0x58, 0x5F, 0x0, 0x1, 0x58, 0xDB, 0x0, 0x1, 0x59, 0x54, 0x0, 0x1, 0x59, 0xAC, 0x0, 0x1, 0x5A, 0x77, 0x0, 0x1, 0x5A, 0xAB, 0x0, 0x1, 0x5B, 0x7, 0x0, 0x1, 0x5B, 0x67, 0x0, 0x1, 0x5C, 0x14, 0x0, 0x1, 0x5C, 0x65, 0x0, 0x1, 0x5C, 0xC8, 0x0, 0x1, 0x5D, 0x3A, 0x0, 0x1, 0x5D, 0x5C, 0x0, 0x1, 0x5D, 0x86, 0x0, 0x1, 0x5D, 0xA8, 0x0, 0x1, 0x5D, 0xED, 0x0, 0x1, 0x5E, 0xAC, 0x0, 0x1, 0x5F, 0x76, 0x0, 0x1, 0x60, 0x15, 0x0, 0x1, 0x60, 0xB9, 0x0, 0x1, 0x61, 0x4B, 0x0, 0x1, 0x61, 0xB2, 0x0, 0x1, 0x62, 0x14, 0x0, 0x1, 0x62, 0x99, 0x0, 0x1, 0x63, 0x3C, 0x0, 0x1, 0x63, 0xAF, 0x0, 0x1, 0x64, 0x3A, 0x0, 0x1, 0x64, 0xBD, 0x0, 0x1, 0x65, 0x11, 0x0, 0x1, 0x65, 0x5F, 0x0, 0x1, 0x65, 0xAD, 0x0, 0x1, 0x66, 0x1F, 0x0, 0x1, 0x66, 0x2F, 0x0, 0x1, 0x66, 0xA2, 0x0, 0x1, 0x66, 0xFF, 0x0, 0x1, 0x67, 0x27, 0x0, 0x1, 0x67, 0x9B, 0x0, 0x1, 0x68, 0x45, 0x0, 0x1, 0x69, 0x2C, 0x0, 0x1, 0x69, 0x4E, 0x0, 0x1, 0x69, 0x70, 0x0, 0x1, 0x69, 0x9A, 0x0, 0x1, 0x69, 0xBC, 0x0, 0x1, 0x69, 0xDE, 0x0, 0x1, 0x6A, 0x0, 0x0, 0x1, 0x6A, 0x22, 0x0, 0x1, 0x6A, 0x44, 0x0, 0x1, 0x6A, 0x66, 0x0, 0x1, 0x6A, 0x88, 0x0, 0x1, 0x6A, 0xAA, 0x0, 0x1, 0x6A, 0xCC, 0x0, 0x1, 0x6A, 0xEE, 0x0, 0x1, 0x6B, 0x10, 0x0, 0x1, 0x6B, 0x32, 0x0, 0x1, 0x6B, 0x4C, 0x0, 0x1, 0x6B, 0x5C, 0x0, 0x1, 0x6B, 0x74, 0x0, 0x1, 0x6B, 0x94, 0x0, 0x1, 0x6B, 0xAC, 0x0, 0x1, 0x6B, 0xBC, 0x0, 0x1, 0x6B, 0xD4, 0x0, 0x1, 0x6B, 0xF4, 0x0, 0x1, 0x6C, 0x1C, 0x0, 0x1, 0x6C, 0x34, 0x0, 0x1, 0x6C, 0x44, 0x0, 0x1, 0x6C, 0x5C, 0x0, 0x1, 0x6C, 0x7C, 0x0, 0x1, 0x6C, 0x8C, 0x0, 0x1, 0x6C, 0x9C, 0x0, 0x1, 0x6C, 0xAC, 0x0, 0x1, 0x6C, 0xBC, 0x0, 0x1, 0x6C, 0xCC, 0x0, 0x1, 0x6C, 0xE4, 0x0, 0x1, 0x6D, 0x4, 0x0, 0x1, 0x6D, 0x1C, 0x0, 0x1, 0x6D, 0x2C, 0x0, 0x1, 0x6D, 0x44, 0x0, 0x1, 0x6D, 0x64, 0x0, 0x1, 0x6D, 0x8C, 0x0, 0x1, 0x6D, 0xA4, 0x0, 0x1, 0x6D, 0xB4, 0x0, 0x1, 0x6D, 0xCC, 0x0, 0x1, 0x6D, 0xEC, 0x0, 0x1, 0x6D, 0xFC, 0x0, 0x1, 0x6E, 0xC, 0x0, 0x1, 0x6E, 0x1C, 0x0, 0x1, 0x6E, 0x2C, 0x0, 0x1, 0x6E, 0xAE, 0x0, 0x1, 0x6F, 0x2F, 0x0, 0x1, 0x70, 0x10, 0x0, 0x1, 0x70, 0x71, 0x0, 0x1, 0x70, 0xC8, 0x0, 0x1, 0x71, 0x2E, 0x0, 0x1, 0x71, 0x61, 0x0, 0x1, 0x72, 0xC, 0x0, 0x1, 0x73, 0x49, 0x0, 0x1, 0x73, 0x6B, 0x0, 0x1, 0x73, 0xEB, 0x0, 0x1, 0x74, 0x11, 0x0, 0x1, 0x74, 0x4A, 0x0, 0x1, 0x74, 0x64, 0x0, 0x1, 0x74, 0x91, 0x0, 0x1, 0x75, 0x3F, 0x0, 0x1, 0x75, 0x85, 0x0, 0x1, 0x75, 0xFE, 0x0, 0x1, 0x76, 0x45, 0x0, 0x1, 0x76, 0x67, 0x0, 0x1, 0x76, 0x89, 0x0, 0x1, 0x76, 0xAD, 0x0, 0x1, 0x76, 0xE8, 0x0, 0x1, 0x77, 0x18, 0x0, 0x1, 0x77, 0x49, 0x0, 0x1, 0x77, 0x71, 0x0, 0x1, 0x77, 0x98, 0x0, 0x1, 0x77, 0xB0, 0x0, 0x1, 0x77, 0xF4, 0x0, 0x1, 0x78, 0x30, 0x0, 0x1, 0x78, 0x68, 0x0, 0x1, 0x78, 0x94, 0x0, 0x1, 0x78, 0xBE, 0x0, 0x1, 0x78, 0xEE, 0x0, 0x1, 0x79, 0x1C, 0x0, 0x1, 0x79, 0x72, 0x0, 0x1, 0x79, 0xCC, 0x0, 0x1, 0x7A, 0x1, 0x0, 0x1, 0x7A, 0x37, 0x0, 0x1, 0x7A, 0x75, 0x0, 0x1, 0x7A, 0xB2, 0x0, 0x1, 0x7A, 0xD0, 0x0, 0x1, 0x7A, 0xEE, 0x0, 0x1, 0x7B, 0x3F, 0x0, 0x1, 0x7B, 0x57, 0x0, 0x1, 0x7B, 0xC9, 0x0, 0x1, 0x7C, 0x67, 0x0, 0x1, 0x7C, 0xC6, 0x0, 0x1, 0x7C, 0xDE, 0x0, 0x1, 0x7C, 0xF6, 0x0, 0x1, 0x7D, 0x3C, 0x0, 0x1, 0x7D, 0x82, 0x0, 0x1, 0x7D, 0xB6, 0x0, 0x1, 0x7D, 0xEA, 0x0, 0x1, 0x7E, 0x5F, 0x0, 0x1, 0x7E, 0xBA, 0x0, 0x1, 0x7E, 0xF5, 0x0, 0x1, 0x7F, 0x6A, 0x0, 0x1, 0x7F, 0xAF, 0x0, 0x1, 0x80, 0x17, 0x0, 0x1, 0x80, 0x7B, 0x0, 0x1, 0x80, 0xE0, 0x0, 0x1, 0x81, 0x6, 0x0, 0x1, 0x81, 0x2C, 0x0, 0x1, 0x81, 0x9C, 0x0, 0x1, 0x82, 0x17, 0x0, 0x1, 0x82, 0x62, 0x0, 0x1, 0x82, 0xED, 0x0, 0x1, 0x83, 0x1A, 0x0, 0x1, 0x83, 0x2C, 0x0, 0x1, 0x83, 0x5B, 0x0, 0x1, 0x83, 0xE8, 0x0, 0x1, 0x84, 0x36, 0x0, 0x1, 0x84, 0xA0, 0x0, 0x1, 0x84, 0xF3, 0x0, 0x1, 0x85, 0x12, 0x0, 0x1, 0x85, 0x5C, 0x0, 0x1, 0x85, 0xA5, 0x0, 0x1, 0x85, 0xFE, 0x0, 0x1, 0x86, 0x30, 0x0, 0x1, 0x86, 0x6D, 0x0, 0x1, 0x86, 0xA4, 0x0, 0x1, 0x86, 0xCF, 0x0, 0x1, 0x86, 0xDF, 0x0, 0x1, 0x87, 0x5, 0x0, 0x1, 0x87, 0x19, 0x0, 0x1, 0x87, 0x29, 0x0, 0x1, 0x87, 0x4D, 0x0, 0x1, 0x87, 0x5D, 0x0, 0x1, 0x87, 0x8B, 0x0, 0x1, 0x87, 0xC4, 0x0, 0x1, 0x87, 0xF3, 0x0, 0x1, 0x88, 0x2A, 0x0, 0x1, 0x88, 0x75, 0x0, 0x1, 0x88, 0xC4, 0x0, 0x1, 0x89, 0x2C, 0x0, 0x1, 0x89, 0x7F, 0x0, 0x1, 0x89, 0xB6, 0x0, 0x1, 0x8A, 0x24, 0x0, 0x1, 0x8A, 0x70, 0x0, 0x1, 0x8A, 0xC1, 0x0, 0x1, 0x8B, 0x38, 0x0, 0x1, 0x8B, 0x78, 0x0, 0x1, 0x8B, 0xCD, 0x0, 0x1, 0x8C, 0x2E, 0x0, 0x1, 0x8C, 0x4F, 0x0, 0x1, 0x8C, 0x8D, 0x0, 0x1, 0x8C, 0xB2, 0x0, 0x1, 0x8C, 0xD8, 0x0, 0x1, 0x8D, 0x1C, 0x0, 0x1, 0x8D, 0x63, 0x0, 0x1, 0x8D, 0x89, 0x0, 0x1, 0x8D, 0xCC, 0x0, 0x1, 0x8E, 0x39, 0x0, 0x1, 0x8E, 0x89, 0x0, 0x1, 0x8E, 0xD8, 0x0, 0x1, 0x8F, 0x2, 0x0, 0x1, 0x8F, 0x1F, 0x0, 0x1, 0x8F, 0x35, 0x0, 0x1, 0x8F, 0xD4, 0x0, 0x1, 0x8F, 0xED, 0x0, 0x1, 0x90, 0x14, 0x0, 0x1, 0x90, 0x3A, 0x0, 0x1, 0x90, 0x63, 0x0, 0x1, 0x90, 0xBD, 0x0, 0x1, 0x91, 0x1, 0x0, 0x1, 0x91, 0x15, 0x0, 0x1, 0x91, 0x73, 0x0, 0x1, 0x91, 0xA0, 0x0, 0x1, 0x92, 0x12, 0x0, 0x1, 0x92, 0x99, 0x0, 0x1, 0x92, 0xF2, 0x0, 0x1, 0x93, 0x69, 0x0, 0x1, 0x93, 0x86, 0x0, 0x1, 0x93, 0x9C, 0x0, 0x1, 0x93, 0xFC, 0x0, 0x1, 0x94, 0x5D, 0x0, 0x1, 0x94, 0x75, 0x0, 0x1, 0x94, 0x8F, 0x0, 0x1, 0x94, 0xAE, 0x0, 0x1, 0x94, 0xCD, 0x0, 0x1, 0x94, 0xEC, 0x0, 0x1, 0x95, 0xA, 0x0, 0x1, 0x95, 0x46, 0x0, 0x1, 0x95, 0x80, 0x0, 0x1, 0x95, 0x98, 0x0, 0x1, 0x95, 0xB0, 0x0, 0x1, 0x95, 0xD2, 0x0, 0x1, 0x95, 0xF4, 0x0, 0x1, 0x96, 0x1E, 0x0, 0x1, 0x96, 0x50, 0x0, 0x1, 0x96, 0xBD, 0x0, 0x1, 0x96, 0xFD, 0x0, 0x1, 0x97, 0xF, 0x0, 0x1, 0x97, 0x21, 0x0, 0x1, 0x97, 0x35, 0x0, 0x1, 0x97, 0x47, 0x0, 0x1, 0x97, 0x59, 0x0, 0x1, 0x97, 0x9B, 0x0, 0x1, 0x97, 0xBE, 0x0, 0x1, 0x97, 0xE4, 0x0, 0x1, 0x98, 0x13, 0x0, 0x1, 0x98, 0x90, 0x0, 0x1, 0x98, 0xB0, 0x0, 0x1, 0x98, 0xDC, 0x0, 0x1, 0x99, 0xF, 0x0, 0x1, 0x99, 0x49, 0x0, 0x1, 0x99, 0xFD, 0x0, 0x1, 0x9A, 0x92, 0x0, 0x1, 0x9A, 0xAC, 0x0, 0x1, 0x9A, 0xD3, 0x0, 0x1, 0x9B, 0x16, 0x0, 0x1, 0x9B, 0x73, 0x0, 0x1, 0x9B, 0xD2, 0x0, 0x1, 0x9B, 0xEA, 0x0, 0x1, 0x9C, 0x2, 0x0, 0x1, 0x9C, 0x74, 0x0, 0x1, 0x9C, 0xE1, 0x0, 0x1, 0x9D, 0x12, 0x0, 0x1, 0x9D, 0x22, 0x0, 0x1, 0x9D, 0x5E, 0x0, 0x1, 0x9D, 0x98, 0x0, 0x1, 0x9E, 0x1E, 0x0, 0x1, 0x9E, 0x9F, 0x0, 0x1, 0x9F, 0x2C, 0x0, 0x1, 0x9F, 0xA9, 0x0, 0x1, 0x9F, 0xF4, 0x0, 0x1, 0xA0, 0x39, 0x0, 0x1, 0xA0, 0x51, 0x0, 0x1, 0xA0, 0x69, 0x0, 0x1, 0xA0, 0xC9, 0x0, 0x1, 0xA1, 0x27, 0x0, 0x1, 0xA1, 0x9F, 0x0, 0x1, 0xA2, 0x11, 0x0, 0x1, 0xA2, 0x63, 0x0, 0x1, 0xA2, 0xE9, 0x0, 0x1, 0xA3, 0x26, 0x0, 0x1, 0xA3, 0x63, 0x0, 0x1, 0xA3, 0xDC, 0x0, 0x1, 0xA4, 0x53, 0x0, 0x1, 0xA4, 0xA6, 0x0, 0x1, 0xA4, 0xF9, 0x0, 0x1, 0xA5, 0x3A, 0x0, 0x1, 0xA5, 0x76, 0x0, 0x1, 0xA5, 0xA7, 0x0, 0x1, 0xA5, 0xD8, 0x0, 0x1, 0xA6, 0x33, 0x0, 0x1, 0xA6, 0x88, 0x0, 0x1, 0xA6, 0xCD, 0x0, 0x1, 0xA7, 0x11, 0x0, 0x1, 0xA7, 0x59, 0x0, 0x1, 0xA7, 0x99, 0x0, 0x1, 0xA7, 0xB1, 0x0, 0x1, 0xA8, 0x29, 0x0, 0x1, 0xA8, 0xC6, 0x0, 0x1, 0xA9, 0x59, 0x0, 0x1, 0xA9, 0x81, 0x0, 0x1, 0xA9, 0x99, 0x0, 0x1, 0xAB, 0xDB, 0x0, 0x1, 0xAC, 0x1, 0x0, 0x1, 0xAD, 0x2D, 0x0, 0x1, 0xAD, 0x6C, 0x0, 0x1, 0xAE, 0xD, 0x0, 0x1, 0xAE, 0x61, 0x0, 0x1, 0xAE, 0xAE, 0x0, 0x1, 0xAE, 0xD9, 0x0, 0x1, 0xAF, 0x13, 0x0, 0x1, 0xAF, 0x55, 0x0, 0x1, 0xAF, 0x93, 0x0, 0x1, 0xAF, 0xDD, 0x0, 0x1, 0xB0, 0x16, 0x0, 0x1, 0xB0, 0x61, 0x0, 0x1, 0xB0, 0x73, 0x0, 0x1, 0xB0, 0xAC, 0x0, 0x1, 0xB0, 0xBC, 0x0, 0x1, 0xB0, 0xCE, 0x0, 0x1, 0xB1, 0x2A, 0x0, 0x1, 0xB1, 0x7F, 0x0, 0x1, 0xB1, 0xF2, 0x0, 0x1, 0xB2, 0x5D, 0x0, 0x1, 0xB2, 0xFF, 0x0, 0x1, 0xB3, 0x9B, 0x0, 0x1, 0xB3, 0xFD, 0x0, 0x1, 0xB4, 0x5B, 0x0, 0x1, 0xB4, 0xEC, 0x0, 0x1, 0xB5, 0x7C, 0x0, 0x1, 0xB5, 0xDD, 0x0, 0x1, 0xB6, 0x3F, 0x0, 0x1, 0xB6, 0x7B, 0x0, 0x1, 0xB6, 0xB7, 0x0, 0x1, 0xB7, 0x12, 0x0, 0x1, 0xB7, 0x6B, 0x0, 0x1, 0xB7, 0xB6, 0x0, 0x1, 0xB8, 0x3, 0x0, 0x1, 0xB8, 0x4D, 0x0, 0x1, 0xB8, 0x94, 0x0, 0x1, 0xB8, 0xEC, 0x0, 0x1, 0xB9, 0x42, 0x0, 0x1, 0xB9, 0xA8, 0x0, 0x1, 0xBA, 0xC, 0x0, 0x1, 0xBA, 0x24, 0x0, 0x1, 0xBA, 0xBE, 0x0, 0x1, 0xBB, 0x42, 0x0, 0x1, 0xBB, 0xBF, 0x0, 0x1, 0xBC, 0x3, 0x0, 0x1, 0xBC, 0x42, 0x0, 0x1, 0xBC, 0x9D, 0x0, 0x1, 0xBC, 0xD5, 0x0, 0x1, 0xBD, 0x17, 0x0, 0x1, 0xBD, 0x29, 0x0, 0x1, 0xBD, 0x6C, 0x0, 0x1, 0xBD, 0xA3, 0x0, 0x1, 0xBD, 0xE6, 0x0, 0x1, 0xBE, 0x1E, 0x0, 0x1, 0xBE, 0x61, 0x0, 0x1, 0xBE, 0x97, 0x0, 0x1, 0xBE, 0xD3, 0x0, 0x1, 0xBF, 0xF, 0x0, 0x1, 0xBF, 0x4B, 0x0, 0x1, 0xBF, 0x83, 0x0, 0x1, 0xBF, 0xB9, 0x0, 0x1, 0xBF, 0xF0, 0x0, 0x1, 0xC0, 0x27, 0x0, 0x1, 0xC0, 0x5E, 0x0, 0x1, 0xC0, 0x91, 0x0, 0x1, 0xC0, 0xB2, 0x0, 0x1, 0xC0, 0xD8, 0x0, 0x1, 0xC0, 0xFE, 0x0, 0x1, 0xC1, 0x23, 0x0, 0x1, 0xC1, 0x42, 0x0, 0x1, 0xC1, 0x79, 0x0, 0x1, 0xC1, 0xAF, 0x0, 0x1, 0xC1, 0xE5, 0x0, 0x1, 0xC2, 0x3, 0x0, 0x1, 0xC2, 0x30, 0x0, 0x1, 0xC2, 0x5A, 0x0, 0x1, 0xC2, 0x93, 0x0, 0x1, 0xC2, 0xCA, 0x0, 0x1, 0xC3, 0x1, 0x0, 0x1, 0xC3, 0x2F, 0x0, 0x1, 0xC3, 0x5D, 0x0, 0x1, 0xC3, 0xC5, 0x0, 0x1, 0xC4, 0x27, 0x0, 0x1, 0xC4, 0x5E, 0x0, 0x1, 0xC4, 0x95, 0x0, 0x1, 0xC4, 0xDE, 0x0, 0x1, 0xC5, 0x35, 0x0, 0x1, 0xC5, 0xA8, 0x0, 0x1, 0xC6, 0x30, 0x0, 0x1, 0xC6, 0xA0, 0x0, 0x1, 0xC6, 0xF5, 0x0, 0x1, 0xC7, 0x3F, 0x0, 0x1, 0xC7, 0x8A, 0x0, 0x1, 0xC7, 0xF7, 0x0, 0x1, 0xC8, 0x68, 0x0, 0x1, 0xC8, 0x94, 0x0, 0x1, 0xC8, 0xA4, 0x0, 0x1, 0xC9, 0x4, 0x0, 0x1, 0xC9, 0xCB, 0x0, 0x1, 0xCA, 0x4F, 0x0, 0x1, 0xCA, 0xFD, 0x0, 0x1, 0xCB, 0x58, 0x0, 0x1, 0xCB, 0xE6, 0x0, 0x1, 0xCC, 0x2F, 0x0, 0x1, 0xCC, 0xA9, 0x0, 0x1, 0xCC, 0xFF, 0x0, 0x1, 0xCD, 0x85, 0x0, 0x1, 0xCD, 0xE9, 0x0, 0x1, 0xCE, 0x74, 0x0, 0x1, 0xCE, 0xF8, 0x0, 0x1, 0xCF, 0x70, 0x0, 0x1, 0xCF, 0x88, 0x0, 0x1, 0xCF, 0xA0, 0x0, 0x1, 0xCF, 0xF4, 0x0, 0x1, 0xD0, 0x45, 0x0, 0x1, 0xD0, 0xA9, 0x0, 0x1, 0xD1, 0xA, 0x0, 0x1, 0xD1, 0x34, 0x0, 0x1, 0xD1, 0x58, 0x0, 0x1, 0xD1, 0x70, 0x0, 0x1, 0xD1, 0x88, 0x0, 0x1, 0xD2, 0x1, 0x0, 0x1, 0xD2, 0x75, 0x0, 0x1, 0xD3, 0xA, 0x0, 0x1, 0xD3, 0x96, 0x0, 0x1, 0xD3, 0xAE, 0x0, 0x1, 0xD3, 0xC6, 0x0, 0x1, 0xD3, 0xDE, 0x0, 0x1, 0xD3, 0xF6, 0x0, 0x1, 0xD4, 0x5F, 0x0, 0x1, 0xD4, 0xDF, 0x0, 0x1, 0xD5, 0x59, 0x0, 0x1, 0xD5, 0xE8, 0x0, 0x1, 0xD6, 0x74, 0x0, 0x1, 0xD6, 0x8C, 0x0, 0x1, 0xD7, 0x36, 0x0, 0x1, 0xD7, 0xBF, 0x0, 0x1, 0xD8, 0xC, 0x0, 0x1, 0xD8, 0x5B, 0x0, 0x1, 0xD8, 0xBA, 0x0, 0x1, 0xD9, 0x18, 0x0, 0x1, 0xD9, 0x5D, 0x0, 0x1, 0xD9, 0x9C, 0x0, 0x1, 0xD9, 0xF8, 0x0, 0x1, 0xDA, 0x10, 0x0, 0x1, 0xDA, 0x98, 0x0, 0x1, 0xDB, 0x21, 0x0, 0x1, 0xDB, 0x7D, 0x0, 0x1, 0xDB, 0xE5, 0x0, 0x1, 0xDC, 0x40, 0x0, 0x1, 0xDC, 0xA9, 0x0, 0x1, 0xDC, 0xD3, 0x0, 0x1, 0xDC, 0xFC, 0x0, 0x1, 0xDD, 0x60, 0x0, 0x1, 0xDD, 0xC8, 0x0, 0x1, 0xDE, 0x2F, 0x0, 0x1, 0xDE, 0x9E, 0x0, 0x1, 0xDF, 0xF, 0x0, 0x1, 0xDF, 0x80, 0x0, 0x1, 0xDF, 0xE0, 0x0, 0x1, 0xE0, 0x66, 0x0, 0x1, 0xE0, 0xAB, 0x0, 0x1, 0xE1, 0x36, 0x0, 0x1, 0xE1, 0xA0, 0x0, 0x1, 0xE1, 0xEB, 0x0, 0x1, 0xE2, 0x51, 0x0, 0x1, 0xE2, 0xAB, 0x0, 0x1, 0xE3, 0x2D, 0x0, 0x1, 0xE3, 0xA2, 0x0, 0x1, 0xE4, 0x11, 0x0, 0x1, 0xE4, 0x52, 0x0, 0x1, 0xE4, 0x90, 0x0, 0x1, 0xE4, 0xF8, 0x0, 0x1, 0xE5, 0x5F, 0x0, 0x1, 0xE5, 0xC2, 0x0, 0x1, 0xE5, 0xD6, 0x0, 0x1, 0xE5, 0xE8, 0x0, 0x1, 0xE6, 0x26, 0x0, 0x1, 0xE6, 0x65, 0x0, 0x1, 0xE6, 0x98, 0x0, 0x1, 0xE6, 0xCD, 0x0, 0x1, 0xE7, 0x24, 0x0, 0x1, 0xE7, 0x76, 0x0, 0x1, 0xE7, 0x88, 0x0, 0x1, 0xE7, 0xD3, 0x0, 0x1, 0xE7, 0xFB, 0x0, 0x1, 0xE8, 0x1C, 0x0, 0x1, 0xE8, 0x3D, 0x0, 0x1, 0xE8, 0x66, 0x0, 0x1, 0xE8, 0xD5, 0x0, 0x1, 0xE8, 0xED, 0x0, 0x1, 0xE9, 0x5, 0x0, 0x1, 0xE9, 0x74, 0x0, 0x1, 0xE9, 0xD8, 0x0, 0x1, 0xEA, 0x4B, 0x0, 0x1, 0xEA, 0xA9, 0x0, 0x1, 0xEB, 0x32, 0x0, 0x1, 0xEB, 0xAD, 0x0, 0x1, 0xEB, 0xF9, 0x0, 0x1, 0xEC, 0x4B, 0x0, 0x1, 0xEC, 0xD4, 0x0, 0x1, 0xED, 0x58, 0x0, 0x1, 0xED, 0xD3, 0x0, 0x1, 0xEE, 0x40, 0x0, 0x1, 0xEE, 0x9C, 0x0, 0x1, 0xEE, 0xED, 0x0, 0x1, 0xEF, 0x6C, 0x0, 0x1, 0xF0, 0x7, 0x0, 0x1, 0xF0, 0x6C, 0x0, 0x1, 0xF0, 0xCC, 0x0, 0x1, 0xF1, 0x31, 0x0, 0x1, 0xF1, 0x93, 0x0, 0x1, 0xF2, 0xA, 0x0, 0x1, 0xF2, 0x56, 0x0, 0x1, 0xF2, 0xE2, 0x0, 0x1, 0xF3, 0x60, 0x0, 0x1, 0xF3, 0xAD, 0x0, 0x1, 0xF3, 0xBD, 0x0, 0x1, 0xF4, 0x3D, 0x0, 0x1, 0xF4, 0x95, 0x0, 0x1, 0xF4, 0xCE, 0x0, 0x1, 0xF4, 0xF2, 0x0, 0x1, 0xF5, 0xC, 0x0, 0x1, 0xF5, 0x59, 0x0, 0x1, 0xF5, 0x71, 0x0, 0x1, 0xF5, 0xA9, 0x0, 0x1, 0xF5, 0xD3, 0x0, 0x1, 0xF6, 0x1B, 0x0, 0x1, 0xF6, 0x5C, 0x0, 0x1, 0xF6, 0x77, 0x0, 0x1, 0xF6, 0xC7, 0x0, 0x1, 0xF6, 0xFC, 0x0, 0x1, 0xF7, 0x7F, 0x0, 0x1, 0xF8, 0x26, 0x0, 0x1, 0xF8, 0x60, 0x0, 0x1, 0xF8, 0xD1, 0x0, 0x1, 0xF9, 0x4F, 0x0, 0x1, 0xF9, 0x5F, 0x0, 0x1, 0xF9, 0xDC, 0x0, 0x1, 0xFA, 0x49, 0x0, 0x1, 0xFA, 0xC8, 0x0, 0x1, 0xFB, 0x24, 0x0, 0x1, 0xFB, 0xB4, 0x0, 0x1, 0xFC, 0x23, 0x0, 0x1, 0xFC, 0x95, 0x0, 0x1, 0xFC, 0xC9, 0x0, 0x1, 0xFD, 0x1A, 0x0, 0x1, 0xFD, 0x82, 0x0, 0x1, 0xFE, 0x25, 0x0, 0x1, 0xFE, 0xF1, 0x0, 0x1, 0xFF, 0xA4, 0x0, 0x2, 0x0, 0x33, 0x0, 0x2, 0x0, 0xE7, 0x0, 0x2, 0x1, 0x2A, 0x0, 0x2, 0x1, 0x89, 0x0, 0x2, 0x1, 0xB2, 0x0, 0x2, 0x1, 0xFF, 0x0, 0x2, 0x2, 0x61, 0x0, 0x2, 0x2, 0xDB, 0x0, 0x2, 0x3, 0x24, 0x0, 0x2, 0x3, 0x8D, 0x0, 0x2, 0x3, 0xD4, 0x0, 0x2, 0x4, 0x11, 0x0, 0x2, 0x4, 0x6C, 0x0, 0x2, 0x4, 0xE9, 0x0, 0x2, 0x4, 0xFD, 0x0, 0x2, 0x5, 0x4F, 0x0, 0x2, 0x5, 0x8F, 0x0, 0x2, 0x5, 0xFD, 0x0, 0x2, 0x6, 0x45, 0x0, 0x2, 0x6, 0xB9, 0x0, 0x2, 0x6, 0xFA, 0x0, 0x2, 0x7, 0x70, 0x0, 0x2, 0x7, 0xBA, 0x0, 0x2, 0x8, 0x3, 0x0, 0x2, 0x8, 0x51, 0x0, 0x2, 0x8, 0xA1, 0x0, 0x2, 0x9, 0x8, 0x0, 0x2, 0x9, 0x50, 0x0, 0x2, 0x9, 0x9D, 0x0, 0x2, 0xA, 0x7, 0x0, 0x2, 0xA, 0x66, 0x0, 0x2, 0xA, 0x80, 0x0, 0x2, 0xA, 0xA7, 0x0, 0x2, 0xA, 0xCF, 0x0, 0x2, 0xA, 0xE7, 0x0, 0x2, 0xB, 0x37, 0x0, 0x2, 0xB, 0x80, 0x0, 0x2, 0xB, 0xFD, 0x0, 0x2, 0xC, 0x6F, 0x0, 0x2, 0xC, 0xD9, 0x0, 0x2, 0xD, 0x9E, 0x0, 0x2, 0xD, 0xC4, 0x0, 0x2, 0xD, 0xEA, 0x0, 0x2, 0xD, 0xFC, 0x0, 0x2, 0xE, 0xE, 0x0, 0x2, 0xE, 0x27, 0x0, 0x2, 0xE, 0x41, 0x0, 0x2, 0xE, 0x5A, 0x0, 0x2, 0xE, 0x80, 0x0, 0x2, 0xE, 0xA6, 0x0, 0x2, 0xE, 0xD9, 0x0, 0x2, 0xF, 0xE, 0x0, 0x2, 0xF, 0x20, 0x0, 0x2, 0xF, 0x32, 0x0, 0x2, 0xF, 0x44, 0x0, 0x2, 0xF, 0x44, 0x0, 0x2, 0x10, 0xD9, 0x0, 0x2, 0x11, 0x5E, 0x0, 0x2, 0x11, 0xDA, 0x0, 0x2, 0x12, 0x47, 0x0, 0x2, 0x12, 0x77, 0x0, 0x2, 0x12, 0xBF, 0x0, 0x2, 0x12, 0xE3, 0x0, 0x2, 0x13, 0x2D, 0x0, 0x2, 0x13, 0x93, 0x0, 0x2, 0x14, 0x12, 0x0, 0x2, 0x14, 0x39, 0x0, 0x2, 0x14, 0x9F, 0x0, 0x2, 0x14, 0xFA, 0x0, 0x2, 0x15, 0x37, 0x0, 0x2, 0x15, 0xA4, 0x0, 0x2, 0x15, 0xF1, 0x0, 0x2, 0x16, 0x16, 0x0, 0x2, 0x16, 0x68, 0x0, 0x2, 0x16, 0x93, 0x0, 0x2, 0x16, 0xC3, 0x0, 0x2, 0x17, 0x3, 0x0, 0x2, 0x17, 0x3E, 0x0, 0x2, 0x17, 0x6F, 0x0, 0x2, 0x17, 0xAB, 0x0, 0x2, 0x17, 0xD1, 0x0, 0x2, 0x18, 0x41, 0x0, 0x2, 0x18, 0x94, 0x0, 0x2, 0x19, 0x0, 0x0, 0x2, 0x19, 0x45, 0x0, 0x2, 0x19, 0xA5, 0x0, 0x2, 0x19, 0xD4, 0x0, 0x2, 0x1A, 0x17, 0x0, 0x2, 0x1A, 0x34, 0x0, 0x2, 0x1A, 0x6F, 0x0, 0x2, 0x1A, 0xA0, 0x0, 0x2, 0x1A, 0xBB, 0x0, 0x2, 0x1A, 0xEA, 0x0, 0x2, 0x1B, 0x4E, 0x0, 0x2, 0x1B, 0x7A, 0x0, 0x2, 0x1B, 0xF6, 0x0, 0x2, 0x1C, 0x56, 0x0, 0x2, 0x1C, 0xAB, 0x0, 0x2, 0x1C, 0xCC, 0x0, 0x2, 0x1C, 0xFD, 0x0, 0x2, 0x1D, 0x69, 0x0, 0x2, 0x1D, 0x97, 0x0, 0x2, 0x1D, 0xCD, 0x0, 0x2, 0x1D, 0xF2, 0x0, 0x2, 0x1E, 0x2A, 0x0, 0x2, 0x1E, 0x99, 0x0, 0x2, 0x1E, 0xEA, 0x0, 0x2, 0x1F, 0x4D, 0x0, 0x2, 0x1F, 0x9B, 0x0, 0x2, 0x1F, 0xFC, 0x0, 0x2, 0x20, 0x68, 0x0, 0x2, 0x20, 0xC4, 0x0, 0x2, 0x21, 0xC, 0x0, 0x2, 0x21, 0x3B, 0x0, 0x2, 0x21, 0x7F, 0x0, 0x2, 0x21, 0xD0, 0x0, 0x2, 0x22, 0x27, 0x0, 0x2, 0x22, 0x98, 0x0, 0x2, 0x22, 0xC2, 0x0, 0x2, 0x22, 0xFB, 0x0, 0x2, 0x23, 0x3A, 0x0, 0x2, 0x23, 0x7E, 0x0, 0x2, 0x23, 0xAE, 0x0, 0x2, 0x23, 0xEA, 0x0, 0x2, 0x24, 0x18, 0x0, 0x2, 0x24, 0x53, 0x0, 0x2, 0x24, 0x9D, 0x0, 0x2, 0x24, 0xB5, 0x0, 0x2, 0x24, 0xF8, 0x0, 0x2, 0x25, 0x58, 0x0, 0x2, 0x25, 0xC7, 0x0, 0x2, 0x26, 0x14, 0x0, 0x2, 0x26, 0x47, 0x0, 0x2, 0x26, 0xA7, 0x0, 0x2, 0x26, 0xEB, 0x0, 0x2, 0x27, 0x37, 0x0, 0x2, 0x27, 0x76, 0x0, 0x2, 0x28, 0x6, 0x0, 0x2, 0x28, 0x1E, 0x0, 0x2, 0x28, 0x67, 0x0, 0x2, 0x28, 0xA3, 0x0, 0x2, 0x28, 0xEB, 0x0, 0x2, 0x29, 0x2A, 0x0, 0x2, 0x29, 0xA5, 0x0, 0x2, 0x2A, 0xC, 0x0, 0x2, 0x2A, 0x62, 0x0, 0x2, 0x2A, 0xC8, 0x0, 0x2, 0x2B, 0x3C, 0x0, 0x2, 0x2B, 0xA1, 0x0, 0x2, 0x2C, 0x24, 0x0, 0x2, 0x2C, 0x9B, 0x0, 0x2, 0x2C, 0xF9, 0x0, 0x2, 0x2D, 0x2D, 0x0, 0x2, 0x2D, 0x93, 0x0, 0x2, 0x2D, 0xCD, 0x0, 0x2, 0x2E, 0x23, 0x0, 0x2, 0x2E, 0x7E, 0x0, 0x2, 0x2E, 0xA4, 0x0, 0x2, 0x2F, 0xC, 0x0, 0x2, 0x2F, 0x65, 0x0, 0x2, 0x2F, 0x7F, 0x0, 0x2, 0x2F, 0xD0, 0x0, 0x2, 0x2F, 0xFE, 0x0, 0x2, 0x30, 0xC3, 0x0, 0x2, 0x31, 0x27, 0x0, 0x2, 0x31, 0x8D, 0x0, 0x2, 0x31, 0xC6, 0x0, 0x2, 0x31, 0xFF, 0x0, 0x2, 0x32, 0x36, 0x0, 0x2, 0x32, 0x6B, 0x0, 0x2, 0x32, 0xB5, 0x0, 0x2, 0x33, 0xF, 0x0, 0x2, 0x33, 0x72, 0x0, 0x2, 0x33, 0xAB, 0x0, 0x2, 0x33, 0xD2, 0x0, 0x2, 0x34, 0xF, 0x0, 0x2, 0x34, 0x60, 0x0, 0x2, 0x34, 0xB3, 0x0, 0x2, 0x35, 0x14, 0x0, 0x2, 0x35, 0x67, 0x0, 0x2, 0x35, 0x9C, 0x0, 0x2, 0x35, 0xEA, 0x0, 0x2, 0x36, 0x13, 0x0, 0x2, 0x36, 0x3B, 0x0, 0x2, 0x36, 0x8C, 0x0, 0x2, 0x36, 0xC4, 0x0, 0x2, 0x37, 0x4, 0x0, 0x2, 0x37, 0x39, 0x0, 0x2, 0x37, 0x6D, 0x0, 0x2, 0x37, 0xB6, 0x0, 0x2, 0x38, 0xE, 0x0, 0x2, 0x38, 0x5C, 0x0, 0x2, 0x38, 0x82, 0x0, 0x2, 0x38, 0xBF, 0x0, 0x2, 0x39, 0x13, 0x0, 0x2, 0x39, 0x87, 0x0, 0x2, 0x39, 0x99, 0x0, 0x2, 0x39, 0xAB, 0x0, 0x2, 0x39, 0xBD, 0x0, 0x2, 0x39, 0xCF, 0x0, 0x2, 0x39, 0xE1, 0x0, 0x2, 0x39, 0xF3, 0x0, 0x2, 0x3A, 0x5, 0x0, 0x2, 0x3A, 0x69, 0x0, 0x2, 0x3A, 0xD8, 0x0, 0x2, 0x3B, 0x28, 0x0, 0x2, 0x3B, 0x94, 0x0, 0x2, 0x3C, 0xB, 0x0, 0x2, 0x3C, 0x30, 0x0, 0x2, 0x3C, 0x82, 0x0, 0x2, 0x3C, 0xD9, 0x0, 0x2, 0x3D, 0x17, 0x0, 0x2, 0x3D, 0x76, 0x0, 0x2, 0x3D, 0x9C, 0x0, 0x2, 0x3E, 0x1, 0x0, 0x2, 0x3E, 0x1B, 0x0, 0x2, 0x3E, 0x89, 0x0, 0x2, 0x3E, 0xFF, 0x0, 0x2, 0x3F, 0x45, 0x0, 0x2, 0x3F, 0x89, 0x0, 0x2, 0x40, 0xB, 0x0, 0x2, 0x40, 0x7C, 0x0, 0x2, 0x40, 0xE8, 0x0, 0x2, 0x41, 0x17, 0x0, 0x2, 0x41, 0x27, 0x0, 0x2, 0x41, 0x37, 0x0, 0x2, 0x41, 0x47, 0x0, 0x2, 0x41, 0x57, 0x0, 0x2, 0x41, 0x67, 0x0, 0x2, 0x41, 0x77, 0x0, 0x2, 0x41, 0x87, 0x0, 0x2, 0x41, 0x97, 0x0, 0x2, 0x41, 0xA7, 0x0, 0x2, 0x41, 0xB7, 0x0, 0x2, 0x41, 0xC7, 0x0, 0x2, 0x42, 0x3, 0x0, 0x2, 0x42, 0x19, 0x0, 0x2, 0x42, 0x2F, 0x0, 0x2, 0x42, 0x3F, 0x0, 0x2, 0x42, 0x8D, 0x0, 0x2, 0x42, 0xA8, 0x0, 0x2, 0x42, 0xB8, 0x0, 0x2, 0x42, 0xE5, 0x0, 0x2, 0x42, 0xFB, 0x0, 0x2, 0x43, 0xB, 0x0, 0x2, 0x43, 0x26, 0x0, 0x2, 0x43, 0x36, 0x0, 0x2, 0x43, 0x81, 0x0, 0x2, 0x43, 0xAF, 0x0, 0x2, 0x43, 0xDD, 0x0, 0x2, 0x44, 0x45, 0x0, 0x2, 0x44, 0x78, 0x0, 0x2, 0x44, 0x9D, 0x0, 0x2, 0x44, 0xC8, 0x0, 0x2, 0x44, 0xF8, 0x0, 0x2, 0x45, 0x28, 0x0, 0x2, 0x45, 0x57, 0x0, 0x2, 0x45, 0x85, 0x0, 0x2, 0x45, 0xAD, 0x0, 0x2, 0x45, 0xDE, 0x0, 0x2, 0x46, 0xF, 0x0, 0x2, 0x46, 0x3D, 0x0, 0x2, 0x46, 0x67, 0x0, 0x2, 0x46, 0x98, 0x0, 0x2, 0x46, 0xC8, 0x0, 0x2, 0x46, 0xFA, 0x0, 0x2, 0x47, 0x25, 0x0, 0x2, 0x47, 0x56, 0x0, 0x2, 0x47, 0x84, 0x0, 0x2, 0x47, 0xB5, 0x0, 0x2, 0x47, 0xE6, 0x0, 0x2, 0x48, 0x19, 0x0, 0x2, 0x48, 0x4B, 0x0, 0x2, 0x48, 0x7B, 0x0, 0x2, 0x48, 0xAA, 0x0, 0x2, 0x48, 0xD7, 0x0, 0x2, 0x49, 0x7, 0x0, 0x2, 0x49, 0x34, 0x0, 0x2, 0x49, 0x67, 0x0, 0x2, 0x49, 0x97, 0x0, 0x2, 0x49, 0xC9, 0x0, 0x2, 0x49, 0xF8, 0x0, 0x2, 0x4A, 0x22, 0x0, 0x2, 0x4A, 0x52, 0x0, 0x2, 0x4A, 0x82, 0x0, 0x2, 0x4A, 0xAD, 0x0, 0x2, 0x4A, 0xD5, 0x0, 0x2, 0x4A, 0xFB, 0x0, 0x2, 0x4B, 0x28, 0x0, 0x2, 0x4B, 0x4C, 0x0, 0x2, 0x4B, 0x73, 0x0, 0x2, 0x4B, 0xA3, 0x0, 0x2, 0x4B, 0xCB, 0x0, 0x2, 0x4B, 0xFD, 0x0, 0x2, 0x4C, 0x2E, 0x0, 0x2, 0x4C, 0x57, 0x0, 0x2, 0x4C, 0x83, 0x0, 0x2, 0x4C, 0xB0, 0x0, 0x2, 0x4C, 0xD9, 0x0, 0x2, 0x4D, 0xD, 0x0, 0x2, 0x4D, 0x3F, 0x0, 0x2, 0x4D, 0x6F, 0x0, 0x2, 0x4D, 0x99, 0x0, 0x2, 0x4D, 0xC5, 0x0, 0x2, 0x4D, 0xEE, 0x0, 0x2, 0x4E, 0x19, 0x0, 0x2, 0x4E, 0x46, 0x0, 0x2, 0x4E, 0x6E, 0x0, 0x2, 0x4E, 0x9E, 0x0, 0x2, 0x4E, 0xCD, 0x0, 0x2, 0x4F, 0x1, 0x0, 0x2, 0x4F, 0x34, 0x0, 0x2, 0x4F, 0x64, 0x0, 0x2, 0x4F, 0x92, 0x0, 0x2, 0x4F, 0xC3, 0x0, 0x2, 0x4F, 0xEE, 0x0, 0x2, 0x50, 0x18, 0x0, 0x2, 0x50, 0x3F, 0x0, 0x2, 0x50, 0x67, 0x0, 0x2, 0x50, 0x93, 0x0, 0x2, 0x50, 0xC8, 0x0, 0x2, 0x50, 0xF9, 0x0, 0x2, 0x51, 0x29, 0x0, 0x2, 0x51, 0x5C, 0x0, 0x2, 0x51, 0x8C, 0x0, 0x2, 0x51, 0xC0, 0x0, 0x2, 0x51, 0xF0, 0x0, 0x2, 0x52, 0x20, 0x0, 0x2, 0x52, 0x54, 0x0, 0x2, 0x52, 0x88, 0x0, 0x2, 0x52, 0xBA, 0x0, 0x2, 0x52, 0xDF, 0x0, 0x2, 0x53, 0xF, 0x0, 0x2, 0x53, 0x43, 0x0, 0x2, 0x53, 0x6E, 0x0, 0x2, 0x53, 0x96, 0x0, 0x2, 0x53, 0xC0, 0x0, 0x2, 0x53, 0xF3, 0x0, 0x2, 0x54, 0x26, 0x0, 0x2, 0x54, 0x4B, 0x0, 0x2, 0x54, 0x7E, 0x0, 0x2, 0x54, 0xAE, 0x0, 0x2, 0x54, 0xD5, 0x0, 0x2, 0x55, 0x4, 0x0, 0x2, 0x55, 0x39, 0x0, 0x2, 0x55, 0x68, 0x0, 0x2, 0x55, 0x92, 0x0, 0x2, 0x55, 0xBE, 0x0, 0x2, 0x55, 0xE7, 0x0, 0x2, 0x56, 0x1B, 0x0, 0x2, 0x56, 0x50, 0x0, 0x2, 0x56, 0x81, 0x0, 0x2, 0x56, 0xB4, 0x0, 0x2, 0x56, 0xE1, 0x0, 0x2, 0x57, 0xF, 0x0, 0x2, 0x57, 0x3F, 0x0, 0x2, 0x57, 0x70, 0x0, 0x2, 0x57, 0xA0, 0x0, 0x2, 0x57, 0xCD, 0x0, 0x2, 0x57, 0xFF, 0x0, 0x2, 0x58, 0x2F, 0x0, 0x2, 0x58, 0x5D, 0x0, 0x2, 0x58, 0x8A, 0x0, 0x2, 0x58, 0xBA, 0x0, 0x2, 0x58, 0xE3, 0x0, 0x2, 0x59, 0x13, 0x0, 0x2, 0x59, 0x3E, 0x0, 0x2, 0x59, 0x68, 0x0, 0x2, 0x59, 0x8F, 0x0, 0x2, 0x59, 0xC1, 0x0, 0x2, 0x59, 0xF1, 0x0, 0x2, 0x5A, 0x22, 0x0, 0x2, 0x5A, 0x4D, 0x0, 0x2, 0x5A, 0x81, 0x0, 0x2, 0x5A, 0xAA, 0x0, 0x2, 0x5A, 0xDB, 0x0, 0x2, 0x5B, 0x9, 0x0, 0x2, 0x5B, 0x30, 0x0, 0x2, 0x5B, 0x61, 0x0, 0x2, 0x5B, 0x91, 0x0, 0x2, 0x5B, 0xBE, 0x0, 0x2, 0x5B, 0xEE, 0x0, 0x2, 0x5C, 0x1A, 0x0, 0x2, 0x5C, 0x49, 0x0, 0x2, 0x5C, 0x79, 0x0, 0x2, 0x5C, 0xA1, 0x0, 0x2, 0x5C, 0xC5, 0x0, 0x2, 0x5C, 0xF5, 0x0, 0x2, 0x5D, 0x19, 0x0, 0x2, 0x5D, 0x40, 0x0, 0x2, 0x5D, 0xD6, 0x0, 0x2, 0x5E, 0xBD, 0x0, 0x2, 0x5F, 0x28, 0x0, 0x2, 0x5F, 0xC6, 0x0, 0x2, 0x60, 0x40, 0x0, 0x2, 0x60, 0xBE, 0x0, 0x2, 0x61, 0x4B, 0x0, 0x2, 0x61, 0xC0, 0x0, 0x2, 0x62, 0x54, 0x0, 0x2, 0x62, 0xC1, 0x0, 0x2, 0x63, 0x42, 0x0, 0x2, 0x63, 0xD8, 0x0, 0x2, 0x64, 0x48, 0x0, 0x2, 0x64, 0xD1, 0x0, 0x2, 0x65, 0x70, 0x0, 0x2, 0x65, 0xD2, 0x0, 0x2, 0x66, 0x2E, 0x0, 0x2, 0x66, 0x8A, 0x0, 0x2, 0x66, 0xE6, 0x0, 0x2, 0x67, 0x94, 0x0, 0x2, 0x68, 0x42, 0x0, 0x2, 0x68, 0xF0, 0x0, 0x2, 0x69, 0x16, 0x0, 0x2, 0x69, 0x71, 0x0, 0x2, 0x69, 0xC8, 0x0, 0x2, 0x6A, 0x22, 0x0, 0x2, 0x6A, 0x9D, 0x0, 0x2, 0x6A, 0xF8, 0x0, 0x2, 0x6B, 0x51, 0x0, 0x2, 0x6B, 0xAC, 0x0, 0x2, 0x6C, 0x11, 0x0, 0x2, 0x6C, 0x88, 0x0, 0x2, 0x6C, 0xF8, 0x0, 0x2, 0x6D, 0x8, 0x0, 0x2, 0x6D, 0xA5, 0x0, 0x2, 0x6E, 0x5A, 0x0, 0x2, 0x6F, 0x1, 0x0, 0x2, 0x6F, 0x1B, 0x0, 0x2, 0x6F, 0xD1, 0x0, 0x2, 0x70, 0x70, 0x0, 0x2, 0x71, 0x6, 0x0, 0x2, 0x71, 0x39, 0x0, 0x2, 0x71, 0x8C, 0x0, 0x2, 0x71, 0xD4, 0x0, 0x2, 0x72, 0x5B, 0x0, 0x2, 0x72, 0xA8, 0x0, 0x2, 0x72, 0xF0, 0x0, 0x2, 0x73, 0x2B, 0x0, 0x2, 0x73, 0xAE, 0x0, 0x2, 0x74, 0xD, 0x0, 0x2, 0x74, 0x53, 0x0, 0x2, 0x74, 0x88, 0x0, 0x2, 0x74, 0xB4, 0x0, 0x2, 0x75, 0xD, 0x0, 0x2, 0x75, 0x6B, 0x0, 0x2, 0x75, 0x97, 0x0, 0x2, 0x75, 0xE8, 0x0, 0x2, 0x76, 0x41, 0x0, 0x2, 0x76, 0x96, 0x0, 0x2, 0x77, 0x0, 0x0, 0x2, 0x77, 0x0, 0x0, 0x2, 0x77, 0x10, 0x0, 0x2, 0x77, 0x73, 0x0, 0x2, 0x77, 0xD6, 0x0, 0x2, 0x78, 0x27, 0x0, 0x2, 0x78, 0x5F, 0x0, 0x2, 0x78, 0xB3, 0x0, 0x2, 0x78, 0xCB, 0x0, 0x2, 0x78, 0xE3, 0x0, 0x2, 0x78, 0xFB, 0x0, 0x2, 0x79, 0x13, 0x0, 0x2, 0x79, 0x2B, 0x0, 0x2, 0x79, 0x43, 0x0, 0x2, 0x79, 0x5B, 0x0, 0x2, 0x79, 0x73, 0x0, 0x2, 0x79, 0x8B, 0x0, 0x2, 0x79, 0xA3, 0x0, 0x2, 0x79, 0xBB, 0x0, 0x2, 0x79, 0xD3, 0x0, 0x2, 0x79, 0xEB, 0x0, 0x2, 0x7A, 0x3, 0x0, 0x2, 0x7A, 0x1B, 0x0, 0x2, 0x7A, 0x33, 0x0, 0x2, 0x7A, 0x4B, 0x0, 0x2, 0x7A, 0x63, 0x0, 0x2, 0x7A, 0x7B, 0x0, 0x2, 0x7A, 0x93, 0x0, 0x2, 0x7A, 0xAB, 0x0, 0x2, 0x7A, 0xC3, 0x0, 0x2, 0x7A, 0xDB, 0x0, 0x2, 0x7A, 0xF3, 0x0, 0x2, 0x7B, 0xB, 0x0, 0x2, 0x7B, 0x23, 0x0, 0x2, 0x7B, 0x3B, 0x0, 0x2, 0x7B, 0x53, 0x0, 0x2, 0x7B, 0x6B, 0x0, 0x2, 0x7B, 0x81, 0x0, 0x2, 0x7B, 0x97, 0x0, 0x2, 0x7B, 0xAD, 0x0, 0x2, 0x7B, 0xC5, 0x0, 0x2, 0x7B, 0xDD, 0x0, 0x2, 0x7B, 0xF5, 0x0, 0x2, 0x7C, 0xD, 0x0, 0x2, 0x7C, 0x25, 0x0, 0x2, 0x7C, 0x3B, 0x0, 0x2, 0x7C, 0x51, 0x0, 0x2, 0x7C, 0x67, 0x0, 0x2, 0x7C, 0x7D, 0x0, 0x2, 0x7C, 0x95, 0x0, 0x2, 0x7C, 0xAD, 0x0, 0x2, 0x7C, 0xC3, 0x0, 0x2, 0x7C, 0xDB, 0x0, 0x2, 0x7C, 0xF3, 0x0, 0x2, 0x7D, 0x9, 0x0, 0x2, 0x7D, 0x1F, 0x0, 0x2, 0x7D, 0x37, 0x0, 0x2, 0x7D, 0x4F, 0x0, 0x2, 0x7D, 0x67, 0x0, 0x2, 0x7D, 0x7D, 0x0, 0x2, 0x7D, 0x93, 0x0, 0x2, 0x7D, 0xAB, 0x0, 0x2, 0x7D, 0xC1, 0x0, 0x2, 0x7D, 0xD9, 0x0, 0x2, 0x7D, 0xEF, 0x0, 0x2, 0x7E, 0x7, 0x0, 0x2, 0x7E, 0x1D, 0x0, 0x2, 0x7E, 0x7D, 0x0, 0x2, 0x7F, 0x14, 0x0, 0x2, 0x7F, 0x2C, 0x0, 0x2, 0x7F, 0x44, 0x0, 0x2, 0x7F, 0x5C, 0x0, 0x2, 0x7F, 0x72, 0x0, 0x2, 0x7F, 0x8A, 0x0, 0x2, 0x7F, 0xA2, 0x0, 0x2, 0x7F, 0xBA, 0x0, 0x2, 0x7F, 0xD0, 0x0, 0x2, 0x7F, 0xE8, 0x0, 0x2, 0x80, 0x0, 0x0, 0x2, 0x80, 0x18, 0x0, 0x2, 0x80, 0x2E, 0x0, 0x2, 0x80, 0x46, 0x0, 0x2, 0x80, 0x5C, 0x0, 0x2, 0x80, 0x74, 0x0, 0x2, 0x80, 0x8C, 0x0, 0x2, 0x80, 0xE4, 0x0, 0x2, 0x81, 0x6B, 0x0, 0x2, 0x81, 0x83, 0x0, 0x2, 0x81, 0x99, 0x0, 0x2, 0x81, 0xB1, 0x0, 0x2, 0x81, 0xC7, 0x0, 0x2, 0x81, 0xDF, 0x0, 0x2, 0x81, 0xF5, 0x0, 0x2, 0x82, 0xD, 0x0, 0x2, 0x82, 0x25, 0x0, 0x2, 0x82, 0x3D, 0x0, 0x2, 0x82, 0x55, 0x0, 0x2, 0x82, 0x6D, 0x0, 0x2, 0x82, 0x85, 0x0, 0x2, 0x82, 0x9D, 0x0, 0x2, 0x82, 0xB5, 0x0, 0x2, 0x82, 0xCD, 0x0, 0x2, 0x82, 0xE5, 0x0, 0x2, 0x82, 0xFD, 0x0, 0x2, 0x83, 0x15, 0x0, 0x2, 0x83, 0x2B, 0x0, 0x2, 0x83, 0x41, 0x0, 0x2, 0x83, 0x59, 0x0, 0x2, 0x83, 0x71, 0x0, 0x2, 0x83, 0x89, 0x0, 0x2, 0x83, 0xA1, 0x0, 0x2, 0x83, 0xB9, 0x0, 0x2, 0x83, 0xD1, 0x0, 0x2, 0x83, 0xE9, 0x0, 0x2, 0x84, 0x1, 0x0, 0x2, 0x84, 0x19, 0x0, 0x2, 0x84, 0x31, 0x0, 0x2, 0x84, 0x49, 0x0, 0x2, 0x84, 0x61, 0x0, 0x2, 0x84, 0x79, 0x0, 0x2, 0x84, 0x91, 0x0, 0x2, 0x84, 0xA9, 0x0, 0x2, 0x84, 0xC1, 0x0, 0x2, 0x84, 0xD9, 0x0, 0x2, 0x84, 0xF1, 0x0, 0x2, 0x85, 0x9, 0x0, 0x2, 0x85, 0x21, 0x0, 0x2, 0x85, 0x37, 0x0, 0x2, 0x85, 0x4F, 0x0, 0x2, 0x85, 0x67, 0x0, 0x2, 0x85, 0x7D, 0x0, 0x2, 0x85, 0x95, 0x0, 0x2, 0x85, 0xAD, 0x0, 0x2, 0x85, 0xC5, 0x0, 0x2, 0x85, 0xDD, 0x0, 0x2, 0x85, 0xF5, 0x0, 0x2, 0x86, 0xD, 0x0, 0x2, 0x86, 0x25, 0x0, 0x2, 0x86, 0x3D, 0x0, 0x2, 0x86, 0x55, 0x0, 0x2, 0x86, 0x6B, 0x0, 0x2, 0x86, 0x83, 0x0, 0x2, 0x86, 0x9B, 0x0, 0x2, 0x86, 0xB3, 0x0, 0x2, 0x86, 0xC9, 0x0, 0x2, 0x86, 0xE1, 0x0, 0x2, 0x86, 0xF9, 0x0, 0x2, 0x87, 0x11, 0x0, 0x2, 0x87, 0x29, 0x0, 0x2, 0x87, 0x41, 0x0, 0x2, 0x87, 0x57, 0x0, 0x2, 0x87, 0x6F, 0x0, 0x2, 0x87, 0x87, 0x0, 0x2, 0x87, 0x9F, 0x0, 0x2, 0x87, 0xB7, 0x0, 0x2, 0x87, 0xCF, 0x0, 0x2, 0x87, 0xE7, 0x0, 0x2, 0x87, 0xFF, 0x0, 0x2, 0x88, 0x15, 0x0, 0x2, 0x88, 0x2D, 0x0, 0x2, 0x88, 0x43, 0x0, 0x2, 0x88, 0x5B, 0x0, 0x2, 0x88, 0x73, 0x0, 0x2, 0x88, 0x8B, 0x0, 0x2, 0x88, 0xA3, 0x0, 0x2, 0x88, 0xBB, 0x0, 0x2, 0x88, 0xD3, 0x0, 0x2, 0x89, 0x38, 0x0, 0x2, 0x89, 0x9B, 0x0, 0x2, 0x89, 0xB3, 0x0, 0x2, 0x89, 0xCB, 0x0, 0x2, 0x89, 0xE3, 0x0, 0x2, 0x89, 0xF9, 0x0, 0x2, 0x8A, 0x11, 0x0, 0x2, 0x8A, 0x29, 0x0, 0x2, 0x8A, 0x41, 0x0, 0x2, 0x8A, 0x59, 0x0, 0x2, 0x8A, 0x71, 0x0, 0x2, 0x8A, 0x89, 0x0, 0x2, 0x8A, 0x9F, 0x0, 0x2, 0x8A, 0xB7, 0x0, 0x2, 0x8A, 0xCF, 0x0, 0x2, 0x8A, 0xE7, 0x0, 0x2, 0x8A, 0xFF, 0x0, 0x2, 0x8B, 0x17, 0x0, 0x2, 0x8B, 0x2F, 0x0, 0x2, 0x8B, 0x45, 0x0, 0x2, 0x8B, 0x5D, 0x0, 0x2, 0x8B, 0x75, 0x0, 0x2, 0x8B, 0x8B, 0x0, 0x2, 0x8B, 0xA1, 0x0, 0x2, 0x8B, 0xB9, 0x0, 0x2, 0x8B, 0xD1, 0x0, 0x2, 0x8B, 0xE9, 0x0, 0x2, 0x8C, 0x1, 0x0, 0x2, 0x8C, 0x19, 0x0, 0x2, 0x8C, 0x31, 0x0, 0x2, 0x8C, 0x47, 0x0, 0x2, 0x8C, 0x5D, 0x0, 0x2, 0x8C, 0x75, 0x0, 0x2, 0x8C, 0x8B, 0x0, 0x2, 0x8C, 0xA3, 0x0, 0x2, 0x8C, 0xBB, 0x0, 0x2, 0x8C, 0xD3, 0x0, 0x2, 0x8C, 0xEB, 0x0, 0x2, 0x8D, 0x3, 0x0, 0x2, 0x8D, 0x19, 0x0, 0x2, 0x8D, 0x2F, 0x0, 0x2, 0x8D, 0x47, 0x0, 0x2, 0x8D, 0x5F, 0x0, 0x2, 0x8D, 0x77, 0x0, 0x2, 0x8D, 0x8D, 0x0, 0x2, 0x8D, 0xA5, 0x0, 0x2, 0x8D, 0xBD, 0x0, 0x2, 0x8D, 0xD3, 0x0, 0x2, 0x8D, 0xEB, 0x0, 0x2, 0x8E, 0x48, 0x0, 0x2, 0x8E, 0x60, 0x0, 0x2, 0x8E, 0x76, 0x0, 0x2, 0x8E, 0x8E, 0x0, 0x2, 0x8E, 0xA4, 0x0, 0x2, 0x8E, 0xBA, 0x0, 0x2, 0x8E, 0xD0, 0x0, 0x2, 0x8E, 0xE6, 0x0, 0x2, 0x8E, 0xFE, 0x0, 0x2, 0x8F, 0x56, 0x0, 0x2, 0x8F, 0x6C, 0x0, 0x2, 0x8F, 0x82, 0x0, 0x2, 0x8F, 0x9A, 0x0, 0x2, 0x8F, 0xB2, 0x0, 0x2, 0x8F, 0xCA, 0x0, 0x2, 0x8F, 0xE0, 0x0, 0x2, 0x8F, 0xF8, 0x0, 0x2, 0x90, 0x10, 0x0, 0x2, 0x90, 0x28, 0x0, 0x2, 0x90, 0x3E, 0x0, 0x2, 0x90, 0x54, 0x0, 0x2, 0x90, 0x6C, 0x0, 0x2, 0x90, 0x84, 0x0, 0x2, 0x90, 0x9A, 0x0, 0x2, 0x90, 0xB2, 0x0, 0x2, 0x90, 0xCA, 0x0, 0x2, 0x90, 0xE2, 0x0, 0x2, 0x90, 0xFA, 0x0, 0x2, 0x91, 0x12, 0x0, 0x2, 0x91, 0x2A, 0x0, 0x2, 0x91, 0x40, 0x0, 0x2, 0x91, 0x58, 0x0, 0x2, 0x91, 0x70, 0x0, 0x2, 0x91, 0x88, 0x0, 0x2, 0x91, 0xA0, 0x0, 0x2, 0x91, 0xB8, 0x0, 0x2, 0x91, 0xCE, 0x0, 0x2, 0x91, 0xE6, 0x0, 0x2, 0x91, 0xFC, 0x0, 0x2, 0x92, 0x14, 0x0, 0x2, 0x92, 0x2A, 0x0, 0x2, 0x92, 0x42, 0x0, 0x2, 0x92, 0x58, 0x0, 0x2, 0x92, 0x70, 0x0, 0x2, 0x92, 0x86, 0x0, 0x2, 0x92, 0x9C, 0x0, 0x2, 0x92, 0xB4, 0x0, 0x2, 0x92, 0xCC, 0x0, 0x2, 0x92, 0xE4, 0x0, 0x2, 0x93, 0x46, 0x0, 0x2, 0x93, 0x5E, 0x0, 0x2, 0x93, 0x74, 0x0, 0x2, 0x93, 0x8A, 0x0, 0x2, 0x93, 0xA2, 0x0, 0x2, 0x93, 0xBA, 0x0, 0x2, 0x93, 0xD0, 0x0, 0x2, 0x93, 0xE6, 0x0, 0x2, 0x93, 0xFE, 0x0, 0x2, 0x94, 0x16, 0x0, 0x2, 0x94, 0x2E, 0x0, 0x2, 0x94, 0x46, 0x0, 0x2, 0x94, 0x5E, 0x0, 0x2, 0x94, 0x76, 0x0, 0x2, 0x94, 0x8E, 0x0, 0x2, 0x94, 0x9E, 0x0, 0x2, 0x94, 0xAE, 0x0, 0x2, 0x94, 0xBE, 0x0, 0x2, 0x94, 0xCE, 0x0, 0x2, 0x94, 0xDE, 0x0, 0x2, 0x94, 0xEE, 0x0, 0x2, 0x94, 0xFE, 0x0, 0x2, 0x95, 0xE, 0x0, 0x2, 0x95, 0x1E, 0x0, 0x2, 0x95, 0x2E, 0x0, 0x2, 0x95, 0x3E, 0x0, 0x2, 0x95, 0x4E, 0x0, 0x2, 0x95, 0x5E, 0x0, 0x2, 0x95, 0x6E, 0x0, 0x2, 0x95, 0x86, 0x0, 0x2, 0x95, 0x9E, 0x0, 0x2, 0x95, 0xB6, 0x0, 0x2, 0x95, 0xCE, 0x0, 0x2, 0x95, 0xE6, 0x0, 0x2, 0x95, 0xFC, 0x0, 0x2, 0x96, 0x12, 0x0, 0x2, 0x96, 0x22, 0x0, 0x2, 0x96, 0x32, 0x0, 0x2, 0x96, 0x42, 0x0, 0x2, 0x96, 0x52, 0x0, 0x2, 0x96, 0x62, 0x0, 0x2, 0x96, 0x7A, 0x0, 0x2, 0x96, 0x90, 0x0, 0x2, 0x96, 0xA8, 0x0, 0x2, 0x96, 0xC0, 0x0, 0x2, 0x96, 0xD8, 0x0, 0x2, 0x96, 0xF0, 0x0, 0x2, 0x97, 0x8, 0x0, 0x2, 0x97, 0x7C, 0x0, 0x2, 0x97, 0x8C, 0x0, 0x2, 0x97, 0xA4, 0x0, 0x2, 0x97, 0xB4, 0x0, 0x2, 0x97, 0xC4, 0x0, 0x2, 0x97, 0xDC, 0x0, 0x2, 0x97, 0xF4, 0x0, 0x2, 0x98, 0x4, 0x0, 0x2, 0x98, 0x14, 0x0, 0x2, 0x98, 0x24, 0x0, 0x2, 0x98, 0x34, 0x0, 0x2, 0x98, 0x4C, 0x0, 0x2, 0x98, 0x5C, 0x0, 0x2, 0x98, 0x6C, 0x0, 0x2, 0x98, 0x7C, 0x0, 0x2, 0x98, 0x8C, 0x0, 0x2, 0x98, 0x9C, 0x0, 0x2, 0x98, 0xAC, 0x0, 0x2, 0x98, 0xBC, 0x0, 0x2, 0x98, 0xCC, 0x0, 0x2, 0x98, 0xDC, 0x0, 0x2, 0x98, 0xEC, 0x0, 0x2, 0x99, 0x4, 0x0, 0x2, 0x99, 0x14, 0x0, 0x2, 0x99, 0x24, 0x0, 0x2, 0x99, 0x7B, 0x0, 0x2, 0x99, 0x8B, 0x0, 0x2, 0x99, 0x9B, 0x0, 0x2, 0x99, 0xB1, 0x0, 0x2, 0x99, 0xC9, 0x0, 0x2, 0x99, 0xD9, 0x0, 0x2, 0x99, 0xE9, 0x0, 0x2, 0x9A, 0x1, 0x0, 0x2, 0x9A, 0x11, 0x0, 0x2, 0x9A, 0x29, 0x0, 0x2, 0x9A, 0x3F, 0x0, 0x2, 0x9A, 0x57, 0x0, 0x2, 0x9A, 0x6F, 0x0, 0x2, 0x9A, 0x87, 0x0, 0x2, 0x9A, 0x9F, 0x0, 0x2, 0x9A, 0xB7, 0x0, 0x2, 0x9A, 0xCF, 0x0, 0x2, 0x9A, 0xE7, 0x0, 0x2, 0x9A, 0xFD, 0x0, 0x2, 0x9B, 0xD, 0x0, 0x2, 0x9B, 0x1D, 0x0, 0x2, 0x9B, 0x35, 0x0, 0x2, 0x9B, 0x4D, 0x0, 0x2, 0x9B, 0x5D, 0x0, 0x2, 0x9B, 0x75, 0x0, 0x2, 0x9B, 0x8D, 0x0, 0x2, 0x9B, 0xA5, 0x0, 0x2, 0x9B, 0xBD, 0x0, 0x2, 0x9B, 0xD5, 0x0, 0x2, 0x9B, 0xED, 0x0, 0x2, 0x9C, 0x5, 0x0, 0x2, 0x9C, 0x1D, 0x0, 0x2, 0x9C, 0x2D, 0x0, 0x2, 0x9C, 0x3D, 0x0, 0x2, 0x9C, 0x55, 0x0, 0x2, 0x9C, 0x6D, 0x0, 0x2, 0x9C, 0x85, 0x0, 0x2, 0x9C, 0x9D, 0x0, 0x2, 0x9C, 0xB5, 0x0, 0x2, 0x9C, 0xCD, 0x0, 0x2, 0x9C, 0xE5, 0x0, 0x2, 0x9C, 0xFD, 0x0, 0x2, 0x9D, 0xD, 0x0, 0x2, 0x9D, 0x1D, 0x0, 0x2, 0x9D, 0x2D, 0x0, 0x2, 0x9D, 0x45, 0x0, 0x2, 0x9D, 0x5D, 0x0, 0x2, 0x9D, 0x6D, 0x0, 0x2, 0x9D, 0x85, 0x0, 0x2, 0x9D, 0x9B, 0x0, 0x2, 0x9D, 0xB3, 0x0, 0x2, 0x9D, 0xC9, 0x0, 0x2, 0x9D, 0xD9, 0x0, 0x2, 0x9D, 0xE9, 0x0, 0x2, 0x9E, 0x1, 0x0, 0x2, 0x9E, 0x17, 0x0, 0x2, 0x9E, 0x2F, 0x0, 0x2, 0x9E, 0x3F, 0x0, 0x2, 0x9E, 0x55, 0x0, 0x2, 0x9E, 0x6D, 0x0, 0x2, 0x9E, 0x85, 0x0, 0x2, 0x9E, 0x9D, 0x0, 0x2, 0x9E, 0xB3, 0x0, 0x2, 0x9E, 0xCB, 0x0, 0x2, 0x9E, 0xE1, 0x0, 0x2, 0x9E, 0xF9, 0x0, 0x2, 0x9F, 0x11, 0x0, 0x2, 0x9F, 0x29, 0x0, 0x2, 0x9F, 0x41, 0x0, 0x2, 0x9F, 0x51, 0x0, 0x2, 0x9F, 0x61, 0x0, 0x2, 0x9F, 0x71, 0x0, 0x2, 0x9F, 0x89, 0x0, 0x2, 0x9F, 0x9F, 0x0, 0x2, 0x9F, 0xB7, 0x0, 0x2, 0x9F, 0xCD, 0x0, 0x2, 0x9F, 0xE5, 0x0, 0x2, 0x9F, 0xFB, 0x0, 0x2, 0xA0, 0x13, 0x0, 0x2, 0xA0, 0x29, 0x0, 0x2, 0xA0, 0x41, 0x0, 0x2, 0xA0, 0x59, 0x0, 0x2, 0xA0, 0x71, 0x0, 0x2, 0xA0, 0x87, 0x0, 0x2, 0xA0, 0x9F, 0x0, 0x2, 0xA0, 0xB7, 0x0, 0x2, 0xA0, 0xC7, 0x0, 0x2, 0xA0, 0xDF, 0x0, 0x2, 0xA0, 0xF7, 0x0, 0x2, 0xA1, 0xF, 0x0, 0x2, 0xA1, 0x27, 0x0, 0x2, 0xA1, 0x3F, 0x0, 0x2, 0xA1, 0x55, 0x0, 0x2, 0xA1, 0x6D, 0x0, 0x2, 0xA1, 0x83, 0x0, 0x2, 0xA1, 0x9B, 0x0, 0x2, 0xA1, 0xB1, 0x0, 0x2, 0xA1, 0xC9, 0x0, 0x2, 0xA1, 0xDF, 0x0, 0x2, 0xA1, 0xFF, 0x0, 0x2, 0xA2, 0x1D, 0x0, 0x2, 0xA2, 0x35, 0x0, 0x2, 0xA2, 0x4B, 0x0, 0x2, 0xA2, 0x63, 0x0, 0x2, 0xA2, 0x79, 0x0, 0x2, 0xA2, 0x91, 0x0, 0x2, 0xA2, 0xA7, 0x0, 0x2, 0xA2, 0xBF, 0x0, 0x2, 0xA2, 0xD5, 0x0, 0x2, 0xA2, 0xF5, 0x0, 0x2, 0xA3, 0x13, 0x0, 0x2, 0xA3, 0x2B, 0x0, 0x2, 0xA3, 0x43, 0x0, 0x2, 0xA3, 0x5B, 0x0, 0x2, 0xA3, 0x73, 0x0, 0x2, 0xA3, 0x8B, 0x0, 0x2, 0xA3, 0xA1, 0x0, 0x2, 0xA3, 0xB9, 0x0, 0x2, 0xA3, 0xCF, 0x0, 0x2, 0xA3, 0xE7, 0x0, 0x2, 0xA3, 0xFD, 0x0, 0x2, 0xA4, 0x15, 0x0, 0x2, 0xA4, 0x2B, 0x0, 0x2, 0xA4, 0x43, 0x0, 0x2, 0xA4, 0x59, 0x0, 0x2, 0xA4, 0x79, 0x0, 0x2, 0xA4, 0x97, 0x0, 0x2, 0xA4, 0xAF, 0x0, 0x2, 0xA4, 0xC7, 0x0, 0x2, 0xA4, 0xDF, 0x0, 0x2, 0xA4, 0xF7, 0x0, 0x2, 0xA5, 0xF, 0x0, 0x2, 0xA5, 0x27, 0x0, 0x2, 0xA5, 0x3F, 0x0, 0x2, 0xA5, 0x57, 0x0, 0x2, 0xA5, 0x6F, 0x0, 0x2, 0xA5, 0x85, 0x0, 0x2, 0xA5, 0x9D, 0x0, 0x2, 0xA5, 0xB3, 0x0, 0x2, 0xA5, 0xCB, 0x0, 0x2, 0xA5, 0xE1, 0x0, 0x2, 0xA5, 0xF9, 0x0, 0x2, 0xA6, 0xF, 0x0, 0x2, 0xA6, 0x2F, 0x0, 0x2, 0xA6, 0x4D, 0x0, 0x2, 0xA6, 0x65, 0x0, 0x2, 0xA6, 0x7D, 0x0, 0x2, 0xA6, 0x95, 0x0, 0x2, 0xA6, 0xAD, 0x0, 0x2, 0xA6, 0xC5, 0x0, 0x2, 0xA6, 0xDD, 0x0, 0x2, 0xA6, 0xF5, 0x0, 0x2, 0xA7, 0xB, 0x0, 0x2, 0xA7, 0x23, 0x0, 0x2, 0xA7, 0x3B, 0x0, 0x2, 0xA7, 0x53, 0x0, 0x2, 0xA7, 0x6B, 0x0, 0x2, 0xA7, 0x83, 0x0, 0x2, 0xA7, 0x9B, 0x0, 0x2, 0xA7, 0xB3, 0x0, 0x2, 0xA7, 0xCB, 0x0, 0x2, 0xA7, 0xE3, 0x0, 0x2, 0xA7, 0xFB, 0x0, 0x2, 0xA8, 0x13, 0x0, 0x2, 0xA8, 0x2B, 0x0, 0x2, 0xA8, 0x43, 0x0, 0x2, 0xA8, 0x59, 0x0, 0x2, 0xA8, 0x71, 0x0, 0x2, 0xA8, 0x89, 0x0, 0x2, 0xA8, 0xA1, 0x0, 0x2, 0xA8, 0xB9, 0x0, 0x2, 0xA8, 0xD1, 0x0, 0x2, 0xA8, 0xE9, 0x0, 0x2, 0xA9, 0x1, 0x0, 0x2, 0xA9, 0x17, 0x0, 0x2, 0xA9, 0x37, 0x0, 0x2, 0xA9, 0x4F, 0x0, 0x2, 0xA9, 0x67, 0x0, 0x2, 0xA9, 0x7F, 0x0, 0x2, 0xA9, 0x97, 0x0, 0x2, 0xA9, 0xAF, 0x0, 0x2, 0xA9, 0xC7, 0x0, 0x2, 0xA9, 0xDF, 0x0, 0x2, 0xA9, 0xF7, 0x0, 0x2, 0xAA, 0x7, 0x0, 0x2, 0xAA, 0x5F, 0x0, 0x2, 0xAA, 0xB7, 0x0, 0x2, 0xAA, 0xEA, 0x0, 0x2, 0xAB, 0x1E, 0x0, 0x2, 0xAB, 0x66, 0x0, 0x2, 0xAB, 0xAF, 0x0, 0x2, 0xAB, 0xEE, 0x0, 0x2, 0xAC, 0x28, 0x0, 0x2, 0xAC, 0x76, 0x0, 0x2, 0xAC, 0xC1, 0x0, 0x2, 0xAC, 0xD1, 0x0, 0x2, 0xAC, 0xE9, 0x0, 0x2, 0xAC, 0xF9, 0x0, 0x2, 0xAD, 0x9, 0x0, 0x2, 0xAD, 0x19, 0x0, 0x2, 0xAD, 0x29, 0x0, 0x2, 0xAD, 0x39, 0x0, 0x2, 0xAD, 0x49, 0x0, 0x2, 0xAD, 0x59, 0x0, 0x2, 0xAD, 0x69, 0x0, 0x2, 0xAD, 0x79, 0x0, 0x2, 0xAD, 0x89, 0x0, 0x2, 0xAD, 0xBB, 0x0, 0x2, 0xAD, 0xCB, 0x0, 0x2, 0xAD, 0xE3, 0x0, 0x2, 0xAD, 0xFB, 0x0, 0x2, 0xAE, 0x13, 0x0, 0x2, 0xAE, 0x2B, 0x0, 0x2, 0xAE, 0x43, 0x0, 0x2, 0xAE, 0x5B, 0x0, 0x2, 0xAE, 0x73, 0x0, 0x2, 0xAE, 0x89, 0x0, 0x2, 0xAE, 0xA1, 0x0, 0x2, 0xAE, 0xB9, 0x0, 0x2, 0xAE, 0xD1, 0x0, 0x2, 0xAE, 0xE7, 0x0, 0x2, 0xAE, 0xFF, 0x0, 0x2, 0xAF, 0x15, 0x0, 0x2, 0xAF, 0x2D, 0x0, 0x2, 0xAF, 0x45, 0x0, 0x2, 0xAF, 0x5D, 0x0, 0x2, 0xAF, 0x75, 0x0, 0x2, 0xAF, 0x8D, 0x0, 0x2, 0xAF, 0xA5, 0x0, 0x2, 0xAF, 0xBD, 0x0, 0x2, 0xAF, 0xD5, 0x0, 0x2, 0xAF, 0xE5, 0x0, 0x2, 0xAF, 0xFD, 0x0, 0x2, 0xB0, 0x15, 0x0, 0x2, 0xB0, 0x2D, 0x0, 0x2, 0xB0, 0x45, 0x0, 0x2, 0xB0, 0x5D, 0x0, 0x2, 0xB0, 0x75, 0x0, 0x2, 0xB0, 0x8D, 0x0, 0x2, 0xB0, 0xA3, 0x0, 0x2, 0xB0, 0xBB, 0x0, 0x2, 0xB0, 0xD3, 0x0, 0x2, 0xB0, 0xEB, 0x0, 0x2, 0xB1, 0x3, 0x0, 0x2, 0xB1, 0x23, 0x0, 0x2, 0xB1, 0x41, 0x0, 0x2, 0xB1, 0x59, 0x0, 0x2, 0xB1, 0x71, 0x0, 0x2, 0xB1, 0x89, 0x0, 0x2, 0xB1, 0xA1, 0x0, 0x2, 0xB1, 0xB9, 0x0, 0x2, 0xB1, 0xD1, 0x0, 0x2, 0xB1, 0xE9, 0x0, 0x2, 0xB2, 0x1, 0x0, 0x2, 0xB2, 0x19, 0x0, 0x2, 0xB2, 0x31, 0x0, 0x2, 0xB2, 0x49, 0x0, 0x2, 0xB2, 0x61, 0x0, 0x2, 0xB2, 0x79, 0x0, 0x2, 0xB2, 0x91, 0x0, 0x2, 0xB2, 0xA9, 0x0, 0x2, 0xB2, 0xC1, 0x0, 0x2, 0xB2, 0xD9, 0x0, 0x2, 0xB2, 0xF1, 0x0, 0x2, 0xB3, 0x9, 0x0, 0x2, 0xB3, 0x21, 0x0, 0x2, 0xB3, 0x39, 0x0, 0x2, 0xB3, 0x51, 0x0, 0x2, 0xB3, 0x69, 0x0, 0x2, 0xB3, 0x81, 0x0, 0x2, 0xB3, 0x99, 0x0, 0x2, 0xB3, 0xB1, 0x0, 0x2, 0xB3, 0xC9, 0x0, 0x2, 0xB3, 0xE1, 0x0, 0x2, 0xB3, 0xF9, 0x0, 0x2, 0xB4, 0x11, 0x0, 0x2, 0xB4, 0x29, 0x0, 0x2, 0xB4, 0x41, 0x0, 0x2, 0xB4, 0x59, 0x0, 0x2, 0xB4, 0x71, 0x0, 0x2, 0xB4, 0x89, 0x0, 0x2, 0xB4, 0xA1, 0x0, 0x2, 0xB4, 0xB9, 0x0, 0x2, 0xB4, 0xD1, 0x0, 0x2, 0xB4, 0xE9, 0x0, 0x2, 0xB5, 0x1, 0x0, 0x2, 0xB5, 0x19, 0x0, 0x2, 0xB5, 0x31, 0x0, 0x2, 0xB5, 0x49, 0x0, 0x2, 0xB5, 0x61, 0x0, 0x2, 0xB5, 0x79, 0x0, 0x2, 0xB5, 0x91, 0x0, 0x2, 0xB5, 0xA7, 0x0, 0x2, 0xB5, 0xB7, 0x0, 0x2, 0xB5, 0xC7, 0x0, 0x2, 0xB5, 0xD7, 0x0, 0x2, 0xB5, 0xE7, 0x0, 0x2, 0xB5, 0xFF, 0x0, 0x2, 0xB6, 0x17, 0x0, 0x2, 0xB6, 0x27, 0x0, 0x2, 0xB6, 0x37, 0x0, 0x2, 0xB6, 0x47, 0x0, 0x2, 0xB6, 0x57, 0x0, 0x2, 0xB6, 0x67, 0x0, 0x2, 0xB6, 0x77, 0x0, 0x2, 0xB6, 0x87, 0x0, 0x2, 0xB6, 0x97, 0x0, 0x2, 0xB6, 0xA7, 0x0, 0x2, 0xB6, 0xB7, 0x0, 0x2, 0xB6, 0xC7, 0x0, 0x2, 0xB6, 0xDF, 0x0, 0x2, 0xB6, 0xF7, 0x0, 0x2, 0xB7, 0xF, 0x0, 0x2, 0xB7, 0x27, 0x0, 0x2, 0xB7, 0x3F, 0x0, 0x2, 0xB7, 0x57, 0x0, 0x2, 0xB7, 0x77, 0x0, 0x2, 0xB7, 0x97, 0x0, 0x2, 0xB7, 0xAF, 0x0, 0x2, 0xB7, 0xC7, 0x0, 0x2, 0xB7, 0xDF, 0x0, 0x2, 0xB7, 0xF7, 0x0, 0x2, 0xB8, 0xF, 0x0, 0x2, 0xB8, 0x27, 0x0, 0x2, 0xB8, 0x3F, 0x0, 0x2, 0xB8, 0x57, 0x0, 0x2, 0xB8, 0x6F, 0x0, 0x2, 0xB8, 0x87, 0x0, 0x2, 0xB8, 0x9F, 0x0, 0x2, 0xB8, 0xB7, 0x0, 0x2, 0xB8, 0xCF, 0x0, 0x2, 0xB8, 0xE7, 0x0, 0x2, 0xB8, 0xFF, 0x0, 0x2, 0xB9, 0x17, 0x0, 0x2, 0xB9, 0x2F, 0x0, 0x2, 0xB9, 0x47, 0x0, 0x2, 0xB9, 0x67, 0x0, 0x2, 0xB9, 0x85, 0x0, 0x2, 0xB9, 0x9D, 0x0, 0x2, 0xB9, 0xB5, 0x0, 0x2, 0xB9, 0xCD, 0x0, 0x2, 0xB9, 0xE3, 0x0, 0x2, 0xB9, 0xFB, 0x0, 0x2, 0xBA, 0x13, 0x0, 0x2, 0xBA, 0x2B, 0x0, 0x2, 0xBA, 0x43, 0x0, 0x2, 0xBA, 0x5B, 0x0, 0x2, 0xBA, 0x73, 0x0, 0x2, 0xBA, 0x8B, 0x0, 0x2, 0xBA, 0xA3, 0x0, 0x2, 0xBA, 0xBB, 0x0, 0x2, 0xBA, 0xD3, 0x0, 0x2, 0xBA, 0xEB, 0x0, 0x2, 0xBB, 0x3, 0x0, 0x2, 0xBB, 0x1B, 0x0, 0x2, 0xBB, 0x33, 0x0, 0x2, 0xBB, 0x4B, 0x0, 0x2, 0xBB, 0x63, 0x0, 0x2, 0xBB, 0x83, 0x0, 0x2, 0xBB, 0xA3, 0x0, 0x2, 0xBB, 0xBB, 0x0, 0x2, 0xBB, 0xD3, 0x0, 0x2, 0xBB, 0xEB, 0x0, 0x2, 0xBC, 0x3, 0x0, 0x2, 0xBC, 0x1B, 0x0, 0x2, 0xBC, 0x33, 0x0, 0x2, 0xBC, 0x4B, 0x0, 0x2, 0xBC, 0x63, 0x0, 0x2, 0xBC, 0x7B, 0x0, 0x2, 0xBC, 0x93, 0x0, 0x2, 0xBC, 0xAB, 0x0, 0x2, 0xBC, 0xC3, 0x0, 0x2, 0xBC, 0xDB, 0x0, 0x2, 0xBC, 0xF3, 0x0, 0x2, 0xBD, 0xB, 0x0, 0x2, 0xBD, 0x23, 0x0, 0x2, 0xBD, 0x3B, 0x0, 0x2, 0xBD, 0x53, 0x0, 0x2, 0xBD, 0x6B, 0x0, 0x2, 0xBD, 0x83, 0x0, 0x2, 0xBD, 0x9B, 0x0, 0x2, 0xBD, 0xB3, 0x0, 0x2, 0xBD, 0xCB, 0x0, 0x2, 0xBD, 0xE3, 0x0, 0x2, 0xBD, 0xFB, 0x0, 0x2, 0xBE, 0x13, 0x0, 0x2, 0xBE, 0x2B, 0x0, 0x2, 0xBE, 0x43, 0x0, 0x2, 0xBE, 0x5B, 0x0, 0x2, 0xBE, 0x73, 0x0, 0x2, 0xBE, 0x8B, 0x0, 0x2, 0xBE, 0xA3, 0x0, 0x2, 0xBE, 0xC3, 0x0, 0x2, 0xBE, 0xE1, 0x0, 0x2, 0xBE, 0xF9, 0x0, 0x2, 0xBF, 0x11, 0x0, 0x2, 0xBF, 0x29, 0x0, 0x2, 0xBF, 0x41, 0x0, 0x2, 0xBF, 0x59, 0x0, 0x2, 0xBF, 0x71, 0x0, 0x2, 0xBF, 0x89, 0x0, 0x2, 0xBF, 0xA1, 0x0, 0x2, 0xBF, 0xB9, 0x0, 0x2, 0xBF, 0xD1, 0x0, 0x2, 0xBF, 0xF1, 0x0, 0x2, 0xC0, 0x11, 0x0, 0x2, 0xC0, 0x29, 0x0, 0x2, 0xC0, 0x41, 0x0, 0x2, 0xC0, 0x59, 0x0, 0x2, 0xC0, 0x71, 0x0, 0x2, 0xC0, 0x89, 0x0, 0x2, 0xC0, 0xA1, 0x0, 0x2, 0xC0, 0xB9, 0x0, 0x2, 0xC0, 0xD1, 0x0, 0x2, 0xC0, 0xE9, 0x0, 0x2, 0xC1, 0x1, 0x0, 0x2, 0xC1, 0x19, 0x0, 0x2, 0xC1, 0x31, 0x0, 0x2, 0xC1, 0x49, 0x0, 0x2, 0xC1, 0x61, 0x0, 0x2, 0xC1, 0x79, 0x0, 0x2, 0xC1, 0x91, 0x0, 0x2, 0xC1, 0xA9, 0x0, 0x2, 0xC1, 0xC1, 0x0, 0x2, 0xC1, 0xD9, 0x0, 0x2, 0xC1, 0xEF, 0x0, 0x2, 0xC2, 0x7, 0x0, 0x2, 0xC2, 0x1F, 0x0, 0x2, 0xC2, 0x37, 0x0, 0x2, 0xC2, 0x4F, 0x0, 0x2, 0xC2, 0x67, 0x0, 0x2, 0xC2, 0x7F, 0x0, 0x2, 0xC2, 0x97, 0x0, 0x2, 0xC2, 0xAF, 0x0, 0x2, 0xC2, 0xC7, 0x0, 0x2, 0xC2, 0xDD, 0x0, 0x2, 0xC2, 0xF5, 0x0, 0x2, 0xC3, 0xD, 0x0, 0x2, 0xC3, 0x25, 0x0, 0x2, 0xC3, 0x3B, 0x0, 0x2, 0xC3, 0x53, 0x0, 0x2, 0xC3, 0x6B, 0x0, 0x2, 0xC3, 0x83, 0x0, 0x2, 0xC3, 0x9B, 0x0, 0x2, 0xC3, 0xB3, 0x0, 0x2, 0xC3, 0xCB, 0x0, 0x2, 0xC3, 0xE3, 0x0, 0x2, 0xC3, 0xFB, 0x0, 0x2, 0xC4, 0x13, 0x0, 0x2, 0xC4, 0x2B, 0x0, 0x2, 0xC4, 0x43, 0x0, 0x2, 0xC4, 0x5B, 0x0, 0x2, 0xC4, 0x73, 0x0, 0x2, 0xC4, 0x8B, 0x0, 0x2, 0xC4, 0xA3, 0x0, 0x2, 0xC4, 0xBB, 0x0, 0x2, 0xC4, 0xD3, 0x0, 0x2, 0xC4, 0xE9, 0x0, 0x2, 0xC4, 0xFF, 0x0, 0x2, 0xC5, 0x17, 0x0, 0x2, 0xC5, 0x2F, 0x0, 0x2, 0xC5, 0x47, 0x0, 0x2, 0xC5, 0x5F, 0x0, 0x2, 0xC5, 0x77, 0x0, 0x2, 0xC5, 0x8F, 0x0, 0x2, 0xC5, 0xA7, 0x0, 0x2, 0xC5, 0xBF, 0x0, 0x2, 0xC5, 0xD7, 0x0, 0x2, 0xC5, 0xEF, 0x0, 0x2, 0xC6, 0x7, 0x0, 0x2, 0xC6, 0x1F, 0x0, 0x2, 0xC6, 0x37, 0x0, 0x2, 0xC6, 0x4F, 0x0, 0x2, 0xC6, 0x67, 0x0, 0x2, 0xC6, 0x7F, 0x0, 0x2, 0xC6, 0x97, 0x0, 0x2, 0xC6, 0xAF, 0x0, 0x2, 0xC6, 0xC7, 0x0, 0x2, 0xC6, 0xDF, 0x0, 0x2, 0xC6, 0xF7, 0x0, 0x2, 0xC7, 0xF, 0x0, 0x2, 0xC7, 0x27, 0x0, 0x2, 0xC7, 0x3F, 0x0, 0x2, 0xC7, 0x57, 0x0, 0x2, 0xC7, 0x6F, 0x0, 0x2, 0xC7, 0x87, 0x0, 0x2, 0xC7, 0x9F, 0x0, 0x2, 0xC7, 0xB7, 0x0, 0x2, 0xC7, 0xCF, 0x0, 0x2, 0xC7, 0xE7, 0x0, 0x2, 0xC7, 0xFF, 0x0, 0x2, 0xC8, 0x17, 0x0, 0x2, 0xC8, 0x2F, 0x0, 0x2, 0xC8, 0x45, 0x0, 0x2, 0xC8, 0x5B, 0x0, 0x2, 0xC8, 0x71, 0x0, 0x2, 0xC8, 0x87, 0x0, 0x2, 0xC8, 0x9D, 0x0, 0x2, 0xC8, 0xB3, 0x0, 0x2, 0xC8, 0xC9, 0x0, 0x2, 0xC8, 0xDF, 0x0, 0x2, 0xC8, 0xF7, 0x0, 0x2, 0xC9, 0xF, 0x0, 0x2, 0xC9, 0x27, 0x0, 0x2, 0xC9, 0x3F, 0x0, 0x2, 0xC9, 0x57, 0x0, 0x2, 0xC9, 0x6F, 0x0, 0x2, 0xC9, 0x87, 0x0, 0x2, 0xC9, 0x9F, 0x0, 0x2, 0xC9, 0xB7, 0x0, 0x2, 0xC9, 0xCF, 0x0, 0x2, 0xC9, 0xE7, 0x0, 0x2, 0xC9, 0xFF, 0x0, 0x2, 0xCA, 0x17, 0x0, 0x2, 0xCA, 0x2F, 0x0, 0x2, 0xCA, 0x47, 0x0, 0x2, 0xCA, 0x5F, 0x0, 0x2, 0xCA, 0x77, 0x0, 0x2, 0xCA, 0x8F, 0x0, 0x2, 0xCA, 0xA7, 0x0, 0x2, 0xCA, 0xBF, 0x0, 0x2, 0xCA, 0xD7, 0x0, 0x2, 0xCA, 0xEF, 0x0, 0x2, 0xCB, 0x7, 0x0, 0x2, 0xCB, 0x1D, 0x0, 0x2, 0xCB, 0x35, 0x0, 0x2, 0xCB, 0x4D, 0x0, 0x2, 0xCB, 0x65, 0x0, 0x2, 0xCB, 0x7D, 0x0, 0x2, 0xCB, 0x95, 0x0, 0x2, 0xCB, 0xAD, 0x0, 0x2, 0xCB, 0xC5, 0x0, 0x2, 0xCB, 0xDD, 0x0, 0x2, 0xCB, 0xF5, 0x0, 0x2, 0xCC, 0xD, 0x0, 0x2, 0xCC, 0x25, 0x0, 0x2, 0xCC, 0x3D, 0x0, 0x2, 0xCC, 0x55, 0x0, 0x2, 0xCC, 0x6D, 0x0, 0x2, 0xCC, 0x85, 0x0, 0x2, 0xCC, 0x9D, 0x0, 0x2, 0xCC, 0xB5, 0x0, 0x2, 0xCC, 0xCD, 0x0, 0x2, 0xCC, 0xE5, 0x0, 0x2, 0xCC, 0xFD, 0x0, 0x2, 0xCD, 0x15, 0x0, 0x2, 0xCD, 0x2D, 0x0, 0x2, 0xCD, 0x45, 0x0, 0x2, 0xCD, 0x5D, 0x0, 0x2, 0xCD, 0x75, 0x0, 0x2, 0xCD, 0x8D, 0x0, 0x2, 0xCD, 0xA5, 0x0, 0x2, 0xCD, 0xBD, 0x0, 0x2, 0xCD, 0xD5, 0x0, 0x2, 0xCD, 0xED, 0x0, 0x2, 0xCE, 0x3, 0x0, 0x2, 0xCE, 0x1B, 0x0, 0x2, 0xCE, 0x33, 0x0, 0x2, 0xCE, 0x4B, 0x0, 0x2, 0xCE, 0x63, 0x0, 0x2, 0xCE, 0x7B, 0x0, 0x2, 0xCE, 0x93, 0x0, 0x2, 0xCE, 0xAB, 0x0, 0x2, 0xCE, 0xCB, 0x0, 0x2, 0xCE, 0xEB, 0x0, 0x2, 0xCF, 0xB, 0x0, 0x2, 0xCF, 0x2B, 0x0, 0x2, 0xCF, 0x4B, 0x0, 0x2, 0xCF, 0x6B, 0x0, 0x2, 0xCF, 0x8B, 0x0, 0x2, 0xCF, 0xAB, 0x0, 0x2, 0xCF, 0xC9, 0x0, 0x2, 0xCF, 0xE7, 0x0, 0x2, 0xD0, 0x7, 0x0, 0x2, 0xD0, 0x27, 0x0, 0x2, 0xD0, 0x47, 0x0, 0x2, 0xD0, 0x67, 0x0, 0x2, 0xD0, 0x87, 0x0, 0x2, 0xD0, 0xA7, 0x0, 0x2, 0xD0, 0xC5, 0x0, 0x2, 0xD0, 0xE3, 0x0, 0x2, 0xD1, 0x1, 0x0, 0x2, 0xD1, 0x1F, 0x0, 0x2, 0xD1, 0x3D, 0x0, 0x2, 0xD1, 0x5B, 0x0, 0x2, 0xD1, 0x79, 0x0, 0x2, 0xD1, 0x97, 0x0, 0x2, 0xD1, 0xB7, 0x0, 0x2, 0xD1, 0xD7, 0x0, 0x2, 0xD1, 0xF7, 0x0, 0x2, 0xD2, 0x17, 0x0, 0x2, 0xD2, 0x37, 0x0, 0x2, 0xD2, 0x57, 0x0, 0x2, 0xD2, 0x77, 0x0, 0x2, 0xD2, 0x97, 0x0, 0x2, 0xD2, 0xB7, 0x0, 0x2, 0xD2, 0xD7, 0x0, 0x2, 0xD2, 0xF7, 0x0, 0x2, 0xD3, 0x17, 0x0, 0x2, 0xD3, 0x37, 0x0, 0x2, 0xD3, 0x57, 0x0, 0x2, 0xD3, 0x77, 0x0, 0x2, 0xD3, 0x97, 0x0, 0x2, 0xD3, 0xB7, 0x0, 0x2, 0xD3, 0xD7, 0x0, 0x2, 0xD3, 0xF7, 0x0, 0x2, 0xD4, 0x17, 0x0, 0x2, 0xD4, 0x37, 0x0, 0x2, 0xD4, 0x57, 0x0, 0x2, 0xD4, 0x77, 0x0, 0x2, 0xD4, 0x97, 0x0, 0x2, 0xD4, 0xAF, 0x0, 0x2, 0xD4, 0xC7, 0x0, 0x2, 0xD4, 0xE7, 0x0, 0x2, 0xD4, 0xFF, 0x0, 0x2, 0xD5, 0x1F, 0x0, 0x2, 0xD5, 0x37, 0x0, 0x2, 0xD5, 0x57, 0x0, 0x2, 0xD5, 0x6F, 0x0, 0x2, 0xD5, 0x87, 0x0, 0x2, 0xD5, 0x9F, 0x0, 0x2, 0xD5, 0xB5, 0x0, 0x2, 0xD5, 0xCD, 0x0, 0x2, 0xD5, 0xEB, 0x0, 0x2, 0xD6, 0x1, 0x0, 0x2, 0xD6, 0x1F, 0x0, 0x2, 0xD6, 0x37, 0x0, 0x2, 0xD6, 0x55, 0x0, 0x2, 0xD6, 0x6D, 0x0, 0x2, 0xD6, 0x85, 0x0, 0x2, 0xD6, 0x9D, 0x0, 0x2, 0xD6, 0xB5, 0x0, 0x2, 0xD6, 0xCD, 0x0, 0x2, 0xD6, 0xE5, 0x0, 0x2, 0xD6, 0xFD, 0x0, 0x2, 0xD7, 0x15, 0x0, 0x2, 0xD7, 0x2D, 0x0, 0x2, 0xD7, 0x43, 0x0, 0x2, 0xD7, 0x5B, 0x0, 0x2, 0xD7, 0x73, 0x0, 0x2, 0xD7, 0x8B, 0x0, 0x2, 0xD7, 0xA3, 0x0, 0x2, 0xD7, 0xBB, 0x0, 0x2, 0xD7, 0xD1, 0x0, 0x2, 0xD7, 0xE7, 0x0, 0x2, 0xD7, 0xFD, 0x0, 0x2, 0xD8, 0x13, 0x0, 0x2, 0xD8, 0x2B, 0x0, 0x2, 0xD8, 0x43, 0x0, 0x2, 0xD8, 0x5B, 0x0, 0x2, 0xD8, 0x71, 0x0, 0x2, 0xD8, 0x89, 0x0, 0x2, 0xD8, 0xA1, 0x0, 0x2, 0xD8, 0xB9, 0x0, 0x2, 0xD8, 0xD1, 0x0, 0x2, 0xD8, 0xE9, 0x0, 0x2, 0xD9, 0x9, 0x0, 0x2, 0xD9, 0x21, 0x0, 0x2, 0xD9, 0x41, 0x0, 0x2, 0xD9, 0x59, 0x0, 0x2, 0xD9, 0x79, 0x0, 0x2, 0xD9, 0x91, 0x0, 0x2, 0xD9, 0xA9, 0x0, 0x2, 0xD9, 0xC1, 0x0, 0x2, 0xD9, 0xD9, 0x0, 0x2, 0xD9, 0xF1, 0x0, 0x2, 0xD9, 0xF1, 0x0, 0x2, 0xDA, 0x9, 0x0, 0x2, 0xDA, 0x21, 0x0, 0x2, 0xDA, 0x39, 0x0, 0x2, 0xDA, 0x39, 0x0, 0x2, 0xDA, 0x49, 0x0, 0x2, 0xDA, 0x61, 0x0, 0x2, 0xDA, 0x79, 0x0, 0x2, 0xDA, 0x91, 0x0, 0x2, 0xDA, 0xA9, 0x0, 0x2, 0xDA, 0xC1, 0x0, 0x2, 0xDA, 0xD9, 0x0, 0x2, 0xDA, 0xF1, 0x0, 0x2, 0xDB, 0x1, 0x0, 0x2, 0xDB, 0x11, 0x0, 0x2, 0xDB, 0x21, 0x0, 0x2, 0xDB, 0x31, 0x0, 0x2, 0xDB, 0x41, 0x0, 0x2, 0xDB, 0x51, 0x0, 0x2, 0xDB, 0x61, 0x0, 0x2, 0xDB, 0x71, 0x0, 0x2, 0xDB, 0x81, 0x0, 0x2, 0xDB, 0x91, 0x0, 0x2, 0xDB, 0xA1, 0x0, 0x2, 0xDB, 0xB1, 0x0, 0x2, 0xDB, 0xC1, 0x0, 0x2, 0xDB, 0xD1, 0x0, 0x2, 0xDB, 0xE9, 0x0, 0x2, 0xDB, 0xFF, 0x0, 0x2, 0xDC, 0x15, 0x0, 0x2, 0xDC, 0x2D, 0x0, 0x2, 0xDC, 0x3D, 0x0, 0x2, 0xDC, 0x4D, 0x0, 0x2, 0xDC, 0x65, 0x0, 0x2, 0xDC, 0x75, 0x0, 0x2, 0xDC, 0x8D, 0x0, 0x2, 0xDC, 0xA3, 0x0, 0x2, 0xDC, 0xB3, 0x0, 0x2, 0xDC, 0xC3, 0x0, 0x2, 0xDC, 0xD3, 0x0, 0x2, 0xDC, 0xE3, 0x0, 0x2, 0xDC, 0xFB, 0x0, 0x2, 0xDD, 0xB, 0x0, 0x2, 0xDD, 0x1B, 0x0, 0x2, 0xDD, 0x2B, 0x0, 0x2, 0xDD, 0x3B, 0x0, 0x2, 0xDD, 0x4B, 0x0, 0x2, 0xDD, 0x5B, 0x0, 0x2, 0xDD, 0x6B, 0x0, 0x2, 0xDD, 0x7B, 0x0, 0x2, 0xDD, 0xF2, 0x0, 0x2, 0xDE, 0x2C, 0x0, 0x2, 0xDE, 0x8F, 0x0, 0x2, 0xDE, 0x9F, 0x0, 0x2, 0xDE, 0xB7, 0x0, 0x2, 0xDE, 0xCF, 0x0, 0x2, 0xDE, 0xE5, 0x0, 0x2, 0xDE, 0xF5, 0x0, 0x2, 0xDF, 0x5, 0x0, 0x2, 0xDF, 0x1D, 0x0, 0x2, 0xDF, 0x35, 0x0, 0x2, 0xDF, 0x4D, 0x0, 0x2, 0xDF, 0x65, 0x0, 0x2, 0xDF, 0x7D, 0x0, 0x2, 0xDF, 0x95, 0x0, 0x2, 0xDF, 0xAD, 0x0, 0x2, 0xDF, 0xC5, 0x0, 0x2, 0xDF, 0xDD, 0x0, 0x2, 0xDF, 0xF5, 0x0, 0x2, 0xE0, 0xD, 0x0, 0x2, 0xE0, 0x25, 0x0, 0x2, 0xE0, 0x3D, 0x0, 0x2, 0xE0, 0x55, 0x0, 0x2, 0xE0, 0x6D, 0x0, 0x2, 0xE0, 0x85, 0x0, 0x2, 0xE0, 0x9D, 0x0, 0x2, 0xE0, 0xB5, 0x0, 0x2, 0xE0, 0xCD, 0x0, 0x2, 0xE0, 0xE5, 0x0, 0x2, 0xE0, 0xFD, 0x0, 0x2, 0xE1, 0x15, 0x0, 0x2, 0xE1, 0x2D, 0x0, 0x2, 0xE1, 0x45, 0x0, 0x2, 0xE1, 0x5D, 0x0, 0x2, 0xE1, 0x75, 0x0, 0x2, 0xE1, 0x8D, 0x0, 0x2, 0xE1, 0xA5, 0x0, 0x2, 0xE1, 0xBD, 0x0, 0x2, 0xE1, 0xD5, 0x0, 0x2, 0xE1, 0xED, 0x0, 0x2, 0xE2, 0x5, 0x0, 0x2, 0xE2, 0x1D, 0x0, 0x2, 0xE2, 0x35, 0x0, 0x2, 0xE2, 0x4D, 0x0, 0x2, 0xE2, 0x65, 0x0, 0x2, 0xE2, 0x7D, 0x0, 0x2, 0xE2, 0x95, 0x0, 0x2, 0xE2, 0xAD, 0x0, 0x2, 0xE2, 0xC5, 0x0, 0x2, 0xE2, 0xDD, 0x0, 0x2, 0xE2, 0xF5, 0x0, 0x2, 0xE3, 0xD, 0x0, 0x2, 0xE3, 0x25, 0x0, 0x2, 0xE3, 0x3D, 0x0, 0x2, 0xE3, 0x55, 0x0, 0x2, 0xE3, 0x6D, 0x0, 0x2, 0xE3, 0x85, 0x0, 0x2, 0xE3, 0x9D, 0x0, 0x2, 0xE3, 0xB5, 0x0, 0x2, 0xE3, 0xCD, 0x0, 0x5, 0x0, 0x64, 0x0, 0x0, 0x3, 0x28, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x5, 0x0, 0x8, 0x0, 0xB, 0x0, 0xF, 0x0, 0x0, 0x1, 0x1, 0x21, 0x1, 0x11, 0x9, 0x6, 0x7, 0x11, 0x21, 0x11, 0x1, 0xC4, 0x1, 0x1, 0xFD, 0xFD, 0x2, 0x30, 0xFE, 0xEF, 0xFE, 0xB9, 0x1, 0xD, 0xFE, 0xF3, 0x2, 0x2B, 0xFE, 0xFF, 0xFE, 0xFE, 0x5E, 0x2, 0xC4, 0x3, 0x1C, 0x2, 0x5E, 0xFA, 0xDA, 0x5, 0x8, 0xFD, 0x7C, 0xFD, 0x88, 0x2, 0x78, 0x2, 0x78, 0xFA, 0xE6, 0x2, 0x5E, 0xFD, 0xA2, 0x36, 0x5, 0xB0, 0xFA, 0x50, 0x0, 0x2, 0x0, 0x90, 0xFF, 0xF2, 0x1, 0xA3, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xD, 0x0, 0x0, 0x1, 0x3, 0x23, 0x3, 0x3, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x97, 0x18, 0xD1, 0x18, 0x6, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x5, 0xB0, 0xFB, 0xFD, 0x4, 0x3, 0xFA, 0xC4, 0x38, 0x4B, 0x4B, 0x38, 0x37, 0x4B, 0x4B, 0x0, 0x2, 0x0, 0x65, 0x3, 0xF5, 0x2, 0x41, 0x6, 0x0, 0x0, 0x4, 0x0, 0x9, 0x0, 0x0, 0x1, 0x23, 0x11, 0x33, 0x15, 0x1, 0x23, 0x11, 0x33, 0x15, 0x2, 0x1D, 0x8B, 0xAF, 0xFE, 0xAF, 0x8B, 0xAF, 0x3, 0xF5, 0x2, 0xB, 0x88, 0xFE, 0x7D, 0x2, 0xB, 0x88, 0x0, 0x2, 0x0, 0x61, 0x0, 0x0, 0x4, 0xBD, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x13, 0x23, 0x3, 0x13, 0x13, 0x23, 0x3, 0x23, 0x13, 0x23, 0x35, 0x21, 0x13, 0x23, 0x35, 0x21, 0x13, 0x33, 0x3, 0x33, 0x13, 0x33, 0x3, 0x33, 0x15, 0x23, 0x3, 0x33, 0x15, 0x23, 0x3, 0x2, 0xEE, 0x3A, 0xE0, 0x3B, 0x77, 0x4C, 0xE0, 0x4D, 0xA7, 0x4D, 0xE8, 0x1, 0x5, 0x3B, 0xF4, 0x1, 0x11, 0x4E, 0xA7, 0x4E, 0xE1, 0x4D, 0xA8, 0x4E, 0xD0, 0xED, 0x3B, 0xDD, 0xFA, 0x4D, 0x2, 0x38, 0x1, 0x39, 0xFE, 0xC7, 0xFD, 0xC8, 0x1, 0x9A, 0xFE, 0x66, 0x1, 0x9A, 0x9E, 0x1, 0x39, 0x9F, 0x1, 0xA0, 0xFE, 0x60, 0x1, 0xA0, 0xFE, 0x60, 0x9F, 0xFE, 0xC7, 0x9E, 0xFE, 0x66, 0x0, 0x1, 0x0, 0x65, 0xFF, 0x2C, 0x4, 0x26, 0x6, 0x9C, 0x0, 0x2B, 0x0, 0x0, 0x5, 0x23, 0x35, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x2, 0x9F, 0x9F, 0x9F, 0xFC, 0xF3, 0x9B, 0x58, 0x71, 0x77, 0x70, 0x87, 0xC3, 0xDC, 0xCC, 0xAB, 0x9F, 0xAA, 0xC2, 0xF2, 0x6E, 0x63, 0x6A, 0x62, 0x6A, 0x8B, 0xC2, 0xDF, 0xD4, 0xB3, 0xD4, 0xC3, 0x11, 0xD2, 0xEA, 0x9A, 0x6F, 0x6F, 0x5B, 0x55, 0x72, 0x2E, 0x43, 0xC5, 0xB8, 0xA9, 0xD3, 0x13, 0xDB, 0xDD, 0x18, 0xF0, 0xCA, 0x7E, 0x92, 0x71, 0x59, 0x55, 0x6B, 0x32, 0x46, 0xC3, 0xB9, 0xAF, 0xCD, 0x14, 0x0, 0x5, 0x0, 0x64, 0xFF, 0xEB, 0x5, 0x89, 0x5, 0xC5, 0x0, 0xC, 0x0, 0x1A, 0x0, 0x1E, 0x0, 0x2B, 0x0, 0x38, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x25, 0x1, 0x27, 0x1, 0x3, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x64, 0xA1, 0x93, 0x95, 0xA0, 0x9F, 0xFE, 0xD8, 0xA2, 0xA9, 0x46, 0x47, 0x46, 0x43, 0x44, 0x47, 0x46, 0x45, 0x3, 0x85, 0xFD, 0x39, 0x7D, 0x2, 0xC7, 0xF5, 0xA2, 0x92, 0x95, 0xA0, 0x9F, 0xFE, 0xD8, 0xA2, 0xA9, 0x49, 0x44, 0x8A, 0x45, 0x47, 0x46, 0x45, 0x4, 0x98, 0x7C, 0xB1, 0xB1, 0x7C, 0x4D, 0x7A, 0xB1, 0xB1, 0x7A, 0x3B, 0x5E, 0x5D, 0x3C, 0x4D, 0x3D, 0x5E, 0x5E, 0x3D, 0x47, 0xFB, 0x8E, 0x49, 0x4, 0x72, 0xFC, 0x3D, 0x7B, 0xB1, 0xB1, 0x7B, 0x4E, 0x7B, 0xB1, 0xB1, 0x7B, 0x3C, 0x5E, 0xA9, 0x3F, 0x3C, 0x5E, 0x5E, 0x3C, 0x0, 0x3, 0x0, 0x56, 0xFF, 0xEC, 0x5, 0x11, 0x5, 0xC4, 0x0, 0xB, 0x0, 0x15, 0x0, 0x33, 0x0, 0x0, 0x1, 0x14, 0x17, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x13, 0x32, 0x37, 0x1, 0x7, 0x6, 0x6, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x7, 0x1, 0x36, 0x35, 0x33, 0x10, 0x7, 0x17, 0x1, 0xB3, 0x67, 0x57, 0x3F, 0x36, 0x50, 0x49, 0x4C, 0x4E, 0x86, 0x7A, 0x6B, 0xFE, 0xC3, 0x1F, 0x51, 0x28, 0x7C, 0x2, 0x32, 0x52, 0x9D, 0xD6, 0xDC, 0xFF, 0x0, 0x98, 0x78, 0x45, 0x52, 0xD2, 0xAD, 0xA7, 0xC4, 0x68, 0x59, 0x67, 0x1, 0x18, 0x3D, 0xD3, 0x7E, 0xD6, 0x4, 0x58, 0x53, 0x7F, 0x3B, 0x29, 0x50, 0x3D, 0x34, 0x56, 0x64, 0xFC, 0x12, 0x52, 0x1, 0x77, 0x16, 0x3F, 0x6E, 0x23, 0x60, 0x83, 0xAF, 0x61, 0x75, 0xE9, 0xB5, 0x80, 0xAD, 0x55, 0x57, 0x9C, 0x54, 0xAD, 0xC4, 0xC1, 0x83, 0x66, 0x96, 0x41, 0x4B, 0xFE, 0xB3, 0x79, 0x92, 0xFE, 0xEF, 0xA7, 0xFE, 0x0, 0x1, 0x0, 0x53, 0x3, 0xFC, 0x1, 0xB, 0x6, 0x0, 0x0, 0x4, 0x0, 0x0, 0x13, 0x23, 0x11, 0x33, 0x15, 0xF2, 0x9F, 0xB8, 0x3, 0xFC, 0x2, 0x4, 0x7D, 0x0, 0x1, 0x0, 0x81, 0xFE, 0x31, 0x2, 0xA3, 0x6, 0x5F, 0x0, 0x10, 0x0, 0x0, 0x13, 0x10, 0x12, 0x12, 0x37, 0x17, 0x6, 0x2, 0x3, 0x15, 0x10, 0x12, 0x17, 0x7, 0x26, 0x2, 0x2, 0x81, 0xA4, 0xE8, 0x66, 0x30, 0x70, 0xD3, 0x2, 0xD4, 0x71, 0x30, 0x66, 0xE8, 0xA4, 0x2, 0x50, 0x1, 0x21, 0x1, 0xAD, 0x1, 0xF, 0x32, 0x8E, 0x55, 0xFE, 0x53, 0xFE, 0x93, 0x24, 0xFE, 0x88, 0xFE, 0x4D, 0x5B, 0x87, 0x32, 0x1, 0xF, 0x1, 0xAC, 0x0, 0x1, 0x0, 0x28, 0xFE, 0x31, 0x2, 0x52, 0x6, 0x5F, 0x0, 0x11, 0x0, 0x0, 0x1, 0x10, 0x2, 0x2, 0x7, 0x27, 0x36, 0x12, 0x11, 0x35, 0x34, 0x2, 0x26, 0x27, 0x37, 0x16, 0x12, 0x12, 0x2, 0x52, 0xA6, 0xEB, 0x69, 0x30, 0x71, 0xD4, 0x68, 0x97, 0x46, 0x30, 0x69, 0xEB, 0xA6, 0x2, 0x40, 0xFE, 0xE4, 0xFE, 0x51, 0xFE, 0xEE, 0x32, 0x87, 0x56, 0x1, 0xB8, 0x1, 0x78, 0x14, 0xFB, 0x1, 0x69, 0xE9, 0x39, 0x87, 0x32, 0xFE, 0xEE, 0xFE, 0x53, 0x0, 0x1, 0x0, 0x1C, 0x2, 0x4E, 0x3, 0x75, 0x5, 0xB1, 0x0, 0xE, 0x0, 0x0, 0x13, 0x13, 0x25, 0x37, 0x5, 0x3, 0x33, 0x3, 0x25, 0x17, 0x5, 0x13, 0x7, 0x3, 0x3, 0x7E, 0xCE, 0xFE, 0xD0, 0x36, 0x1, 0x2F, 0xF, 0xB3, 0xF, 0x1, 0x29, 0x36, 0xFE, 0xCA, 0xC8, 0x91, 0xB5, 0xB1, 0x2, 0xBC, 0x1, 0x10, 0x58, 0xAA, 0x76, 0x1, 0x59, 0xFE, 0xA1, 0x73, 0xAB, 0x58, 0xFE, 0xF5, 0x69, 0x1, 0x20, 0xFE, 0xE8, 0x0, 0x1, 0x0, 0x45, 0x0, 0x92, 0x4, 0x2B, 0x4, 0xB6, 0x0, 0xB, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x4, 0x2B, 0xFE, 0x83, 0xEB, 0xFE, 0x82, 0x1, 0x7E, 0xEB, 0x1, 0x7D, 0x2, 0x44, 0xFE, 0x4E, 0x1, 0xB2, 0xDD, 0x1, 0x95, 0xFE, 0x6B, 0x0, 0x1, 0x0, 0x1D, 0xFE, 0xB8, 0x1, 0x5D, 0x0, 0xEB, 0x0, 0x9, 0x0, 0x0, 0x25, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x36, 0x35, 0x35, 0x1, 0x5D, 0x67, 0x56, 0x83, 0x2A, 0x3C, 0xEB, 0xAC, 0x66, 0xDA, 0x47, 0x4D, 0x43, 0x8F, 0x5F, 0xB5, 0x0, 0x1, 0x0, 0x47, 0x2, 0xA, 0x2, 0x54, 0x2, 0xCD, 0x0, 0x3, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x2, 0x54, 0xFD, 0xF3, 0x2, 0xCD, 0xC3, 0xC3, 0x0, 0x1, 0x0, 0x88, 0xFF, 0xF4, 0x1, 0xA3, 0x1, 0x1, 0x0, 0x7, 0x0, 0x0, 0x36, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x88, 0x4A, 0x86, 0x4B, 0x4B, 0x86, 0x4A, 0xB3, 0x4E, 0x4E, 0x72, 0x4D, 0x4D, 0x0, 0x1, 0x0, 0x2, 0xFF, 0x83, 0x2, 0xFF, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x1, 0x23, 0x1, 0x2, 0xFF, 0xFD, 0xC3, 0xC0, 0x2, 0x3E, 0x5, 0xB0, 0xF9, 0xD3, 0x6, 0x2D, 0x0, 0x2, 0x0, 0x69, 0xFF, 0xEC, 0x4, 0x22, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x10, 0x0, 0x23, 0x22, 0x0, 0x3, 0x11, 0x10, 0x0, 0x33, 0x32, 0x0, 0x13, 0x27, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x11, 0x14, 0x16, 0x32, 0x36, 0x37, 0x4, 0x22, 0xFE, 0xFD, 0xD8, 0xD3, 0xFE, 0xF9, 0x4, 0x1, 0x6, 0xD6, 0xD7, 0x1, 0x5, 0x1, 0xF2, 0x7A, 0x71, 0x6E, 0x7A, 0x1, 0x7B, 0xE0, 0x78, 0x1, 0x2, 0x66, 0xFE, 0xA6, 0xFE, 0xE0, 0x1, 0x18, 0x1, 0x4D, 0x1, 0x0, 0x1, 0x5B, 0x1, 0x18, 0xFE, 0xEA, 0xFE, 0xA9, 0x1F, 0xDD, 0xAE, 0xAB, 0xD8, 0xFE, 0xC5, 0xDD, 0xB7, 0xB4, 0xD8, 0x0, 0x1, 0x0, 0xA8, 0x0, 0x0, 0x3, 0x0, 0x5, 0xB5, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x5, 0x35, 0x25, 0x3, 0x0, 0xF3, 0xFE, 0x9B, 0x2, 0x39, 0x5, 0xB5, 0xFA, 0x4B, 0x4, 0x92, 0x7A, 0xCD, 0xD0, 0x0, 0x1, 0x0, 0x51, 0x0, 0x0, 0x4, 0x41, 0x5, 0xC4, 0x0, 0x18, 0x0, 0x0, 0x25, 0x15, 0x21, 0x35, 0x1, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x0, 0x33, 0x32, 0x16, 0x15, 0x14, 0x2, 0x7, 0x1, 0x4, 0x41, 0xFC, 0x2C, 0x1, 0xDA, 0x78, 0x56, 0x71, 0x68, 0x7C, 0x7C, 0xF3, 0x1, 0x2, 0xEC, 0xDA, 0xEF, 0xA3, 0x82, 0xFE, 0xB9, 0xC3, 0xC3, 0xA8, 0x2, 0x4, 0x85, 0x9F, 0x4A, 0x64, 0x83, 0x97, 0x75, 0xBF, 0x1, 0x10, 0xDA, 0xB6, 0x86, 0xFE, 0xFD, 0x8A, 0xFE, 0xA2, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x16, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x0, 0x5, 0x22, 0x24, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x21, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x33, 0x32, 0x4, 0x15, 0x14, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x2D, 0xBD, 0xFE, 0xE0, 0xF3, 0x82, 0x6C, 0x71, 0x81, 0xFE, 0xED, 0x89, 0x8F, 0x7D, 0x7B, 0xDD, 0x61, 0x80, 0xF2, 0x1, 0x5, 0xCA, 0xD1, 0x1, 0x2, 0x6F, 0x71, 0x86, 0x70, 0xFE, 0xE8, 0x14, 0xD0, 0xCB, 0x60, 0x78, 0x79, 0x70, 0xEF, 0xC0, 0x7D, 0x62, 0xDB, 0x6E, 0x5E, 0xAD, 0xE2, 0xD1, 0xCD, 0x56, 0xB1, 0x33, 0x2D, 0xBB, 0x6C, 0xCD, 0xDF, 0x0, 0x2, 0x0, 0x35, 0x0, 0x0, 0x4, 0x59, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xE, 0x0, 0x0, 0x1, 0x21, 0x11, 0x7, 0x1, 0x23, 0x11, 0x23, 0x11, 0x21, 0x27, 0x1, 0x33, 0x11, 0x33, 0x1, 0x33, 0x1, 0x7D, 0x11, 0x1, 0xBA, 0xB6, 0xF3, 0xFD, 0x8B, 0x6, 0x2, 0x74, 0xFA, 0xB6, 0x2, 0x8, 0x2, 0x5D, 0x1E, 0xFC, 0xFE, 0xFE, 0xBB, 0x1, 0x45, 0x93, 0x3, 0xD8, 0xFC, 0x58, 0x0, 0x1, 0x0, 0x81, 0xFF, 0xEC, 0x4, 0x3A, 0x5, 0xB0, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x27, 0x13, 0x21, 0x15, 0x21, 0x3, 0x36, 0x33, 0x32, 0x12, 0x15, 0x14, 0x2, 0x23, 0x22, 0x24, 0x27, 0x33, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x1, 0x70, 0xC1, 0x4E, 0x3, 0xE, 0xFD, 0xBC, 0x27, 0x64, 0x7F, 0xCF, 0xE8, 0xEC, 0xF3, 0xB6, 0xFE, 0xE9, 0xD, 0xEC, 0x1C, 0xD2, 0x76, 0x77, 0x83, 0x80, 0x55, 0x58, 0x2, 0xA2, 0x30, 0x2, 0xDE, 0xD1, 0xFE, 0xA4, 0x39, 0xFE, 0xF9, 0xE3, 0xCA, 0xFE, 0xE4, 0xD3, 0xCB, 0xDB, 0xA7, 0x83, 0x7D, 0xA2, 0x31, 0x0, 0x2, 0x0, 0x76, 0xFF, 0xEC, 0x4, 0x37, 0x5, 0xB7, 0x0, 0x15, 0x0, 0x22, 0x0, 0x0, 0x5, 0x22, 0x0, 0x11, 0x35, 0x34, 0x12, 0x24, 0x21, 0x33, 0x15, 0x23, 0x6, 0x6, 0x7, 0x36, 0x33, 0x32, 0x12, 0x15, 0x14, 0x2, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x16, 0x2, 0x5F, 0xDC, 0xFE, 0xF3, 0x8C, 0x1, 0x3C, 0x1, 0x7, 0x1C, 0x19, 0xE8, 0xDF, 0x13, 0x72, 0xB8, 0xD5, 0xCA, 0xF7, 0xE4, 0x6E, 0x7D, 0x77, 0x73, 0x55, 0x83, 0x1C, 0x90, 0x14, 0x1, 0x43, 0x1, 0x8, 0x4F, 0xD8, 0x1, 0x74, 0xE5, 0xC8, 0x2, 0xF5, 0xAD, 0x79, 0xFE, 0xD7, 0xBE, 0xD1, 0xFE, 0xE0, 0xC4, 0xA6, 0x81, 0x7A, 0xB0, 0x60, 0x44, 0x4B, 0xAF, 0xB3, 0x0, 0x1, 0x0, 0x46, 0x0, 0x0, 0x4, 0x37, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x15, 0x1, 0x21, 0x1, 0x21, 0x35, 0x4, 0x37, 0xFD, 0xBA, 0xFF, 0x0, 0x2, 0x46, 0xFD, 0xF, 0x5, 0xB0, 0x86, 0xFA, 0xD6, 0x4, 0xED, 0xC3, 0x0, 0x3, 0x0, 0x69, 0xFF, 0xEC, 0x4, 0x23, 0x5, 0xC4, 0x0, 0x16, 0x0, 0x22, 0x0, 0x2D, 0x0, 0x0, 0x4, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x4, 0x3, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x13, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x32, 0x36, 0x1, 0x7C, 0xFE, 0xED, 0x7F, 0x6C, 0x5E, 0x6D, 0xFC, 0xC1, 0xC2, 0xFB, 0x6E, 0x5E, 0x6C, 0x80, 0xFE, 0xEF, 0x2, 0x6D, 0x5D, 0x5C, 0x6E, 0x6D, 0x5E, 0x5D, 0x6C, 0x20, 0x81, 0x6A, 0x6B, 0x7E, 0x7E, 0xDA, 0x7C, 0x14, 0xD7, 0xCA, 0x79, 0xB8, 0x31, 0x30, 0xA8, 0x6A, 0xC2, 0xD1, 0xD1, 0xC2, 0x6A, 0xA8, 0x30, 0x32, 0xB7, 0x79, 0xCA, 0xD7, 0x4, 0x3C, 0x60, 0x79, 0x74, 0x65, 0x62, 0x78, 0x78, 0xFD, 0xD4, 0x6C, 0x85, 0x85, 0x6C, 0x6E, 0x7D, 0x7D, 0x0, 0x2, 0x0, 0x5E, 0xFF, 0xF9, 0x4, 0x13, 0x5, 0xC4, 0x0, 0x15, 0x0, 0x22, 0x0, 0x0, 0x5, 0x35, 0x33, 0x36, 0x36, 0x37, 0x6, 0x23, 0x22, 0x2, 0x35, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x4, 0x21, 0x13, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x1, 0x31, 0x1F, 0xFC, 0xC7, 0xC, 0x7A, 0xA4, 0xD4, 0xCF, 0xF6, 0xE0, 0xF0, 0xEF, 0x7D, 0xFE, 0xC8, 0xFE, 0xE7, 0xEF, 0x4F, 0x7F, 0x1F, 0x8F, 0x5F, 0x6D, 0x78, 0x71, 0x7, 0xCA, 0x3, 0xEC, 0xB0, 0x81, 0x1, 0x27, 0xC0, 0xD2, 0x1, 0x2A, 0xFE, 0xA1, 0xF1, 0x4F, 0xD2, 0xFE, 0x8D, 0xE7, 0x2, 0xA6, 0x5B, 0x43, 0x5F, 0xAF, 0xB5, 0xB3, 0x7E, 0x76, 0xBA, 0xFF, 0xFF, 0x0, 0x82, 0xFF, 0xF4, 0x1, 0x9D, 0x4, 0x52, 0x0, 0x26, 0x0, 0x13, 0xFA, 0x0, 0x0, 0x7, 0x0, 0x13, 0xFF, 0xFA, 0x3, 0x51, 0xFF, 0xFF, 0x0, 0x2F, 0xFE, 0xB8, 0x1, 0x88, 0x4, 0x52, 0x0, 0x27, 0x0, 0x13, 0xFF, 0xE5, 0x3, 0x51, 0x0, 0x6, 0x0, 0x11, 0x12, 0x0, 0x0, 0x1, 0x0, 0x3F, 0x0, 0xA5, 0x3, 0x85, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x0, 0x25, 0x1, 0x35, 0x1, 0x15, 0x5, 0x5, 0x3, 0x85, 0xFC, 0xBA, 0x3, 0x46, 0xFD, 0xB1, 0x2, 0x4F, 0xA5, 0x1, 0x74, 0xC1, 0x1, 0x74, 0xF2, 0xE4, 0xE1, 0x0, 0x2, 0x0, 0x91, 0x1, 0x64, 0x3, 0xF0, 0x3, 0xD6, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x3, 0xF0, 0xFC, 0xA1, 0x3, 0x5F, 0xFC, 0xA1, 0x3, 0xD6, 0xC9, 0xC9, 0xFE, 0x58, 0xCA, 0xCA, 0x0, 0x1, 0x0, 0x81, 0x0, 0xA5, 0x3, 0xE0, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x0, 0x37, 0x35, 0x25, 0x25, 0x35, 0x1, 0x15, 0x81, 0x2, 0x6A, 0xFD, 0x96, 0x3, 0x5F, 0xA5, 0xEF, 0xE8, 0xE4, 0xEE, 0xFE, 0x8D, 0xC2, 0x0, 0x2, 0x0, 0x3C, 0xFF, 0xF4, 0x3, 0x98, 0x5, 0xC4, 0x0, 0x17, 0x0, 0x21, 0x0, 0x0, 0x1, 0x23, 0x3E, 0x3, 0x35, 0x34, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x6, 0x6, 0x3, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x2, 0x41, 0xE3, 0x2, 0x42, 0xD7, 0x2C, 0xB6, 0x48, 0x77, 0x1, 0xF3, 0x2, 0xFA, 0xB7, 0xC9, 0xE0, 0x5B, 0xA1, 0x35, 0x25, 0xF5, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x1, 0xAD, 0x89, 0x9A, 0xD3, 0x5B, 0x3B, 0xC1, 0x55, 0x60, 0xBD, 0xC2, 0xCC, 0xB6, 0x65, 0xA4, 0x9A, 0x33, 0x76, 0xFE, 0x80, 0x38, 0x4B, 0x4B, 0x38, 0x37, 0x4B, 0x4B, 0x0, 0x2, 0x0, 0x53, 0xFE, 0x3B, 0x6, 0xDC, 0x5, 0x91, 0x0, 0x30, 0x0, 0x3A, 0x0, 0x0, 0x1, 0x20, 0x0, 0x13, 0x12, 0x12, 0x24, 0x33, 0x20, 0x0, 0x3, 0xE, 0x2, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x37, 0x12, 0x0, 0x33, 0x32, 0x16, 0x17, 0x3, 0x6, 0x16, 0x33, 0x32, 0x36, 0x37, 0x12, 0x0, 0x21, 0x20, 0x0, 0x3, 0x2, 0x0, 0x21, 0x32, 0x37, 0x17, 0x6, 0x6, 0x3, 0x32, 0x36, 0x37, 0x13, 0x26, 0x23, 0x22, 0x3, 0x2, 0x3, 0x7B, 0xFE, 0x7C, 0xFE, 0x5C, 0x11, 0xC, 0xDA, 0x1, 0x7C, 0xFF, 0x1, 0x82, 0x1, 0x95, 0x11, 0x5, 0x57, 0xB7, 0x96, 0xB5, 0x3C, 0x68, 0x9D, 0x94, 0x95, 0x13, 0x1A, 0x1, 0x2, 0xA3, 0x71, 0x81, 0x3A, 0x33, 0xB, 0x4F, 0x2E, 0x6C, 0x7C, 0x6, 0x11, 0xFE, 0xD1, 0xFE, 0xB1, 0xFE, 0xCA, 0xFE, 0x97, 0xF, 0x11, 0x1, 0x47, 0x1, 0x36, 0xC1, 0x8A, 0x27, 0x46, 0xD2, 0x72, 0x2B, 0x65, 0x24, 0x2D, 0x2E, 0x32, 0xE9, 0x26, 0x19, 0xFE, 0x3B, 0x1, 0xE7, 0x1, 0xB5, 0x1, 0x11, 0x1, 0xB0, 0xF9, 0xFE, 0x12, 0xFE, 0x63, 0x81, 0xF8, 0xA2, 0x9A, 0x99, 0xF4, 0xC7, 0x1, 0x4, 0x1, 0x33, 0x40, 0x2B, 0xFD, 0xCC, 0x7B, 0x4A, 0xE4, 0xA5, 0x1, 0x60, 0x1, 0x98, 0xFE, 0x3D, 0xFE, 0x9F, 0xFE, 0x8F, 0xFE, 0x6D, 0x49, 0x88, 0x2D, 0x2C, 0x2, 0x57, 0x4F, 0x62, 0x1, 0xEE, 0x12, 0xFE, 0x64, 0xFE, 0xEB, 0x0, 0x2, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x5, 0xB0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x3, 0x21, 0x3, 0x21, 0x1, 0x33, 0x1, 0x3, 0x7E, 0xD4, 0xD3, 0x2, 0x64, 0x77, 0xFD, 0xCC, 0x76, 0xFE, 0xF8, 0x2, 0x26, 0xE3, 0x2, 0x28, 0x2, 0x1F, 0x2, 0x5E, 0xFD, 0xA2, 0xFD, 0xE1, 0x1, 0x54, 0xFE, 0xAC, 0x5, 0xB0, 0xFA, 0x50, 0x0, 0x3, 0x0, 0x95, 0x0, 0x0, 0x4, 0xA3, 0x5, 0xB0, 0x0, 0x7, 0x0, 0xF, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x27, 0x1, 0x11, 0x21, 0x32, 0x4, 0x15, 0x14, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x4, 0x23, 0x1, 0x91, 0xF8, 0x77, 0x84, 0xF1, 0xFE, 0xFE, 0x1, 0x1A, 0x7C, 0x80, 0xE3, 0xFD, 0xD1, 0x1, 0xF2, 0xEE, 0x1, 0xC, 0x6C, 0x68, 0x7D, 0x79, 0xFE, 0xF4, 0xEC, 0x4, 0xE5, 0xFE, 0x67, 0x6B, 0x61, 0xC8, 0x5, 0xFD, 0xAC, 0xFE, 0x39, 0x7C, 0x64, 0xE0, 0x7, 0xFD, 0x6F, 0x5, 0xB0, 0xBE, 0xCC, 0x63, 0xA1, 0x2B, 0x21, 0xBB, 0x72, 0xD0, 0xD9, 0x0, 0x1, 0x0, 0x66, 0xFF, 0xEC, 0x4, 0xEC, 0x5, 0xC4, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x33, 0x6, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x3, 0xEF, 0xFC, 0x13, 0xFE, 0xE5, 0xFE, 0xF4, 0xFE, 0xF3, 0xFE, 0xC2, 0x1, 0x44, 0x1, 0x13, 0x1, 0x5, 0x1, 0x14, 0x16, 0xFC, 0x10, 0x87, 0x9C, 0xAB, 0xAC, 0x1, 0x9B, 0xB1, 0xA3, 0x89, 0x1, 0xDA, 0xD4, 0xFE, 0xE6, 0x1, 0x76, 0x1, 0x3B, 0x76, 0x1, 0x3A, 0x1, 0x77, 0xFE, 0xE5, 0xDA, 0x8C, 0x9D, 0xFA, 0xE4, 0x7D, 0xDA, 0xFE, 0xF5, 0x97, 0x0, 0x2, 0x0, 0x95, 0x0, 0x0, 0x4, 0xD2, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x13, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x12, 0x37, 0x35, 0x34, 0x26, 0x23, 0x1, 0x11, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x1, 0x91, 0xA6, 0xCC, 0xD0, 0x2, 0xCF, 0xC4, 0xFE, 0x53, 0x1, 0xAD, 0x1, 0x25, 0x1, 0x6B, 0xFE, 0x93, 0xFE, 0xD2, 0x4, 0xE5, 0xFB, 0xE5, 0x1, 0x0, 0xE1, 0x53, 0xEC, 0xFB, 0xFB, 0x1B, 0x5, 0xB0, 0xFE, 0x87, 0xFE, 0xC5, 0x49, 0xFE, 0xC5, 0xFE, 0x88, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x95, 0x3, 0xB1, 0xFD, 0x4B, 0x2, 0x56, 0xFD, 0xAA, 0x2, 0xBC, 0x5, 0xB0, 0xCB, 0xFE, 0x6D, 0xC7, 0xFE, 0x3F, 0xCA, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x4, 0x31, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x3, 0xDB, 0xFD, 0xB6, 0xFC, 0x3, 0x9C, 0xFD, 0x60, 0x2, 0x4A, 0x2, 0x69, 0xFD, 0x97, 0x5, 0xB0, 0xCB, 0xFE, 0x4E, 0x0, 0x1, 0x0, 0x6A, 0xFF, 0xEC, 0x4, 0xF0, 0x5, 0xC4, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x11, 0x6, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x37, 0x11, 0x21, 0x35, 0x4, 0xF0, 0x2E, 0xF5, 0xF5, 0xFE, 0xED, 0xFE, 0xA5, 0x1, 0x3E, 0x1, 0x1A, 0x1, 0xB, 0x1, 0x9, 0x1A, 0xF8, 0x13, 0x8A, 0x95, 0xB0, 0xAB, 0x2, 0xC8, 0xAF, 0x83, 0x77, 0x1A, 0xFE, 0xD5, 0x2, 0xEB, 0xFD, 0xD3, 0x3D, 0x95, 0x1, 0x6E, 0x1, 0x4E, 0x5F, 0x1, 0x4E, 0x1, 0x6F, 0xFE, 0xFA, 0xCB, 0x71, 0x95, 0xFE, 0xE8, 0x6B, 0xF0, 0xFE, 0xFE, 0x3C, 0x1C, 0x1, 0x1E, 0xBF, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x4, 0x1C, 0xFD, 0x75, 0xFC, 0xFC, 0x2, 0x8B, 0xFD, 0x2, 0x88, 0xFD, 0x78, 0x5, 0xB0, 0xFD, 0xA2, 0x2, 0x5E, 0xFA, 0x50, 0x0, 0x1, 0x0, 0xA4, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0xA0, 0xFC, 0x5, 0xB0, 0xFA, 0x50, 0x5, 0xB0, 0x0, 0x1, 0x0, 0x2D, 0xFF, 0xEC, 0x3, 0xE5, 0x5, 0xB0, 0x0, 0xF, 0x0, 0x0, 0x1, 0x33, 0x11, 0x14, 0x4, 0x23, 0x22, 0x24, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x2, 0xE9, 0xFC, 0xFE, 0xF2, 0xCE, 0xCF, 0xFE, 0xF3, 0xFD, 0x7C, 0x63, 0x62, 0x7E, 0x5, 0xB0, 0xFC, 0x4, 0xD9, 0xEF, 0xD5, 0xDF, 0x7E, 0x6C, 0x83, 0x7B, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x1, 0x3, 0xEC, 0xFE, 0x4B, 0xA6, 0xFC, 0xFC, 0x8D, 0x1, 0xAA, 0x1, 0x32, 0xFD, 0xE3, 0x2, 0x3B, 0x2, 0x76, 0xB0, 0xFE, 0x3A, 0x5, 0xB0, 0xFD, 0x54, 0xAE, 0x1, 0xFE, 0xFD, 0x7C, 0xFC, 0xD4, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x4, 0x27, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x0, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x95, 0xFC, 0x2, 0x96, 0x5, 0xB0, 0xFB, 0x1A, 0xCA, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x6, 0x6B, 0x5, 0xB0, 0x0, 0xE, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x21, 0x1, 0x1, 0x21, 0x11, 0x23, 0x11, 0x13, 0x1, 0x23, 0x1, 0x1, 0x91, 0xFC, 0x1, 0x47, 0x1, 0xA4, 0x1, 0xA3, 0x1, 0x48, 0xFC, 0x18, 0xFE, 0x53, 0xB5, 0xFE, 0x53, 0x1, 0xE0, 0xFE, 0x20, 0x5, 0xB0, 0xFB, 0xA4, 0x4, 0x5C, 0xFA, 0x50, 0x1, 0xE0, 0x2, 0x80, 0xFB, 0xA0, 0x4, 0x61, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x11, 0x23, 0x11, 0x33, 0x1, 0x11, 0x5, 0x18, 0xFD, 0xFD, 0x76, 0xFC, 0xFC, 0x2, 0x8C, 0x5, 0xB0, 0xFA, 0x50, 0x4, 0x9, 0xFB, 0xF7, 0x5, 0xB0, 0xFB, 0xF4, 0x4, 0xC, 0x0, 0x2, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x27, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x5, 0x1F, 0xFE, 0xB5, 0xFE, 0xF0, 0xFE, 0xF6, 0xFE, 0xAC, 0x1, 0x52, 0x1, 0xA, 0x1, 0x10, 0x1, 0x4D, 0xFD, 0xB9, 0xA7, 0xA2, 0xBD, 0xBF, 0xA2, 0xA8, 0xB6, 0x2, 0xB3, 0xFE, 0xB4, 0xFE, 0x85, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xFE, 0x84, 0xFE, 0xB4, 0x2, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0x0, 0x2, 0x0, 0x95, 0x0, 0x0, 0x4, 0xD4, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x13, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x1, 0x11, 0x23, 0x11, 0x21, 0x32, 0x0, 0x15, 0x14, 0x4, 0x23, 0x1, 0x91, 0x1, 0x31, 0x93, 0x81, 0x81, 0x93, 0xFE, 0xCF, 0xFC, 0x2, 0x2D, 0xFD, 0x1, 0x15, 0xFE, 0xEB, 0xFD, 0x4, 0xE5, 0xFE, 0x3, 0x8A, 0x6D, 0x66, 0xA0, 0xFD, 0x38, 0xFD, 0xE3, 0x5, 0xB0, 0xFE, 0xFA, 0xC9, 0xD3, 0xF1, 0x0, 0x2, 0x0, 0x60, 0xFF, 0x4, 0x5, 0x1B, 0x5, 0xC4, 0x0, 0x12, 0x0, 0x20, 0x0, 0x0, 0x5, 0x25, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x15, 0x14, 0x2, 0x7, 0x17, 0x3, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x4, 0x76, 0xFE, 0xCB, 0x3F, 0x44, 0xFE, 0xF6, 0xFE, 0xAC, 0x1, 0x52, 0x1, 0xA, 0x1, 0x10, 0x1, 0x4D, 0x84, 0x75, 0xFB, 0xFF, 0xB9, 0xA7, 0xA2, 0xBC, 0xBE, 0xA2, 0xA8, 0xB6, 0xFC, 0xF5, 0xD, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xFE, 0x84, 0xFE, 0xB4, 0x49, 0xCE, 0xFE, 0xCF, 0x59, 0xC4, 0x3, 0x67, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0x0, 0x2, 0x0, 0x95, 0x0, 0x0, 0x4, 0xDE, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x17, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x1, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x32, 0x4, 0x15, 0x14, 0x6, 0x7, 0x1, 0x15, 0x1, 0x91, 0x1, 0x4, 0x88, 0x89, 0x80, 0x8D, 0x1, 0x37, 0xFE, 0xDC, 0xFE, 0xE5, 0xFC, 0x2, 0x0, 0xFB, 0x1, 0x12, 0x8E, 0x7D, 0x1, 0x47, 0x4, 0xE5, 0xFE, 0x17, 0x89, 0x68, 0x70, 0x87, 0x1, 0xFB, 0x1B, 0x2, 0x31, 0xFD, 0xCF, 0x5, 0xB0, 0xE0, 0xD7, 0x92, 0xC6, 0x34, 0xFD, 0xA0, 0xD, 0x0, 0x1, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0x8A, 0x5, 0xC4, 0x0, 0x25, 0x0, 0x0, 0x1, 0x34, 0x26, 0x24, 0x24, 0x35, 0x34, 0x24, 0x33, 0x32, 0x0, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x4, 0x23, 0x22, 0x24, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3, 0x8D, 0x72, 0xFE, 0x60, 0xFE, 0xFD, 0x1, 0x1D, 0xE7, 0xF7, 0x1, 0x16, 0xFC, 0x86, 0x8E, 0x85, 0x7F, 0x98, 0x99, 0xF7, 0xED, 0xFE, 0xE7, 0xED, 0x8B, 0xFE, 0xFA, 0xA9, 0xFD, 0xB8, 0x85, 0x84, 0x85, 0x1, 0x78, 0x57, 0x69, 0x81, 0xCA, 0xAE, 0xB0, 0xE3, 0xFE, 0xF9, 0xB6, 0x6B, 0x89, 0x73, 0x56, 0x52, 0x6B, 0x2D, 0x48, 0xD8, 0xAE, 0xB8, 0xD6, 0x66, 0xCD, 0x99, 0x8A, 0x7A, 0x6C, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x4, 0xB0, 0xFE, 0x3B, 0xFC, 0xFE, 0x3E, 0x4, 0x83, 0x4, 0xE5, 0xFB, 0x1B, 0x4, 0xE5, 0xCB, 0x0, 0x1, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x5, 0xB0, 0x0, 0x11, 0x0, 0x0, 0x1, 0x33, 0x11, 0x14, 0x4, 0x23, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x3, 0xC1, 0xFD, 0xFE, 0xC2, 0xE3, 0xE9, 0xFE, 0xCA, 0xFB, 0x9F, 0x85, 0x87, 0x9D, 0x5, 0xB0, 0xFC, 0x33, 0xFA, 0xFD, 0xFD, 0xFA, 0x3, 0xCD, 0xFC, 0x33, 0x9C, 0x91, 0x91, 0x9C, 0x0, 0x1, 0x0, 0x12, 0x0, 0x0, 0x5, 0x1D, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x21, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x2, 0x1C, 0xFD, 0xF6, 0x1, 0x15, 0x1, 0x6F, 0x1, 0x71, 0x1, 0x16, 0xFD, 0xF4, 0x5, 0xB0, 0xFB, 0x8E, 0x4, 0x72, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x31, 0x0, 0x0, 0x6, 0xE5, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x33, 0x13, 0x1, 0x33, 0x1, 0x13, 0x33, 0x1, 0x23, 0x1, 0x1, 0x1, 0x81, 0xFE, 0xB0, 0xFB, 0xE2, 0x1, 0x16, 0xD4, 0x1, 0x13, 0xDF, 0xFB, 0xFE, 0xB1, 0xF3, 0xFE, 0xEB, 0xFE, 0xE5, 0x5, 0xB0, 0xFB, 0xBD, 0x4, 0x43, 0xFB, 0xB9, 0x4, 0x47, 0xFA, 0x50, 0x4, 0x26, 0xFB, 0xDA, 0x0, 0x1, 0x0, 0x29, 0x0, 0x0, 0x4, 0xEA, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x9, 0x2, 0x21, 0x1, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x1, 0x1, 0x58, 0x1, 0x32, 0x1, 0x31, 0x1, 0x24, 0xFE, 0x48, 0x1, 0xC3, 0xFE, 0xD9, 0xFE, 0xC7, 0xFE, 0xC6, 0xFE, 0xD9, 0x1, 0xC3, 0xFE, 0x48, 0x5, 0xB0, 0xFD, 0xF2, 0x2, 0xE, 0xFD, 0x2E, 0xFD, 0x22, 0x2, 0x17, 0xFD, 0xE9, 0x2, 0xDE, 0x2, 0xD2, 0x0, 0x1, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x9, 0x2, 0x21, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x21, 0x1, 0x4E, 0x1, 0x4F, 0x1, 0x18, 0xFE, 0x18, 0xFE, 0xFE, 0x18, 0x5, 0xB0, 0xFD, 0x4F, 0x2, 0xB1, 0xFC, 0x68, 0xFD, 0xE8, 0x2, 0x18, 0x3, 0x98, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x4, 0x8C, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x33, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0x50, 0x2, 0xF2, 0xFD, 0x14, 0x4, 0x1E, 0xFD, 0xE, 0x3, 0xA, 0xA4, 0x4, 0x41, 0xCB, 0xA0, 0xFB, 0xBA, 0xCA, 0x0, 0x1, 0x0, 0x84, 0xFE, 0xBB, 0x2, 0x1D, 0x6, 0x8F, 0x0, 0x7, 0x0, 0x0, 0x1, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x11, 0x2, 0x1D, 0xA6, 0xA6, 0xFE, 0x67, 0x6, 0x8F, 0xBE, 0xF9, 0xA8, 0xBE, 0x7, 0xD4, 0x0, 0x1, 0x0, 0x14, 0xFF, 0x83, 0x3, 0x64, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x0, 0x5, 0x1, 0x33, 0x1, 0x2, 0x74, 0xFD, 0xA0, 0xF0, 0x2, 0x60, 0x7D, 0x6, 0x2D, 0xF9, 0xD3, 0x0, 0x1, 0x0, 0xD, 0xFE, 0xBB, 0x1, 0xA6, 0x6, 0x8F, 0x0, 0x7, 0x0, 0x0, 0x13, 0x35, 0x21, 0x11, 0x21, 0x35, 0x33, 0x11, 0xD, 0x1, 0x99, 0xFE, 0x67, 0xA6, 0x5, 0xD1, 0xBE, 0xF8, 0x2C, 0xBE, 0x6, 0x58, 0x0, 0x1, 0x0, 0x35, 0x2, 0xD9, 0x3, 0x36, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x3, 0x3, 0x23, 0x1, 0x33, 0x1, 0x2, 0x68, 0xB2, 0xB2, 0xCF, 0x1, 0x2B, 0xAC, 0x1, 0x2A, 0x2, 0xD9, 0x1, 0xCF, 0xFE, 0x31, 0x2, 0xD7, 0xFD, 0x29, 0x0, 0x1, 0x0, 0x3, 0xFF, 0x40, 0x3, 0x99, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x21, 0x15, 0x21, 0x35, 0x3, 0x99, 0xFC, 0x6A, 0xC0, 0xC0, 0x0, 0x1, 0x0, 0x31, 0x4, 0xD2, 0x2, 0xA, 0x6, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x13, 0x23, 0x1, 0x1, 0x46, 0xC4, 0xCA, 0xFE, 0xF1, 0x6, 0x0, 0xFE, 0xD2, 0x1, 0x2E, 0x0, 0x2, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x4, 0x4E, 0x0, 0x8, 0x0, 0x26, 0x0, 0x0, 0x24, 0x36, 0x37, 0x35, 0x23, 0x6, 0x15, 0x14, 0x16, 0x5, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x24, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x17, 0x15, 0x2, 0x4D, 0x7A, 0x19, 0x94, 0xFF, 0x58, 0x1, 0x5F, 0x12, 0xA, 0x73, 0xAA, 0xA2, 0xCE, 0x1, 0x2, 0xEA, 0x99, 0x5F, 0x5F, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0xB6, 0xED, 0x29, 0xAF, 0x51, 0x31, 0xCC, 0x6, 0xAF, 0x41, 0x58, 0xAF, 0x25, 0x41, 0x7A, 0xBA, 0x8A, 0xAD, 0xB8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0xBA, 0xBA, 0xFE, 0x20, 0x92, 0x57, 0x11, 0x0, 0x2, 0x0, 0x7D, 0xFF, 0xEC, 0x4, 0x32, 0x6, 0x0, 0x0, 0xF, 0x0, 0x1A, 0x0, 0x0, 0x5, 0x22, 0x27, 0x7, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x2, 0x8D, 0xBD, 0x6C, 0xB, 0xDC, 0xF2, 0x6A, 0xB2, 0xD1, 0xD6, 0xD7, 0xFE, 0xF4, 0x87, 0x6A, 0x67, 0x8C, 0x9B, 0x43, 0x44, 0x14, 0x8A, 0x76, 0x6, 0x0, 0xFD, 0xD2, 0x7C, 0xFE, 0xCD, 0xF4, 0x15, 0xEF, 0xFE, 0xC9, 0xC7, 0xCA, 0xAA, 0x8F, 0xD2, 0x8C, 0xFE, 0x44, 0x8D, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xEC, 0x3, 0xF5, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x32, 0x36, 0x37, 0x33, 0x6, 0x4, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x2, 0x3A, 0x58, 0x7A, 0x5, 0xE4, 0x4, 0xFF, 0x0, 0xB5, 0xFA, 0xF2, 0xF3, 0xF9, 0xC5, 0xF0, 0x4, 0xE4, 0x5, 0x70, 0x63, 0x94, 0x63, 0x62, 0xAF, 0x68, 0x4F, 0x9D, 0xDD, 0x1, 0x40, 0xDF, 0x24, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x83, 0xD9, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x4, 0x6, 0x0, 0x0, 0xB, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x2, 0x37, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x1, 0x73, 0xB, 0x6C, 0xB7, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xF3, 0xB3, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xB3, 0x70, 0x84, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x2, 0x29, 0xFA, 0x0, 0x0, 0x2, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x26, 0x26, 0x1, 0x6, 0x6, 0x23, 0x22, 0x0, 0x35, 0x35, 0x10, 0x0, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x2, 0x3D, 0x64, 0x7A, 0x12, 0x1, 0xCE, 0x4, 0x61, 0x1, 0x44, 0x34, 0xCB, 0xA2, 0xF1, 0xFE, 0xEC, 0x1, 0x1B, 0xCE, 0xEC, 0xE3, 0xFD, 0x3D, 0xA, 0x95, 0x80, 0xA7, 0x68, 0x3, 0x8B, 0x8C, 0x7C, 0x12, 0x5F, 0x97, 0xFD, 0x2D, 0x4C, 0x80, 0x1, 0x2C, 0xDF, 0x29, 0x1, 0x1, 0x1, 0x2D, 0xFE, 0xD4, 0xEA, 0x67, 0x7D, 0xA5, 0x86, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x2, 0xD7, 0x6, 0x15, 0x0, 0x14, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x2, 0xA1, 0xDB, 0xF4, 0xA5, 0xA5, 0xCC, 0xB0, 0x43, 0x46, 0x6, 0x2A, 0x34, 0xAB, 0x2, 0xDB, 0x3, 0x87, 0xFC, 0x79, 0x3, 0x87, 0xB3, 0x67, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xA8, 0x6B, 0x0, 0x2, 0x0, 0x52, 0xFE, 0x56, 0x4, 0xD, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x26, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x6, 0x23, 0x22, 0x2, 0x27, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x14, 0x4, 0x2, 0x40, 0x96, 0x44, 0x43, 0x95, 0x84, 0x79, 0x78, 0x65, 0x59, 0xF4, 0x48, 0x73, 0x70, 0xA4, 0x79, 0x8D, 0x6A, 0xAE, 0xC6, 0xE8, 0x2, 0xE9, 0xC9, 0xBA, 0x69, 0xA, 0xDC, 0xFE, 0xEF, 0xB3, 0x80, 0x1, 0xD9, 0x7C, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xFD, 0xA3, 0x51, 0x62, 0x91, 0x85, 0x85, 0x7F, 0x49, 0x76, 0x1, 0x35, 0xE8, 0x1D, 0xF7, 0x1, 0x31, 0x7F, 0x6B, 0xFB, 0xE4, 0xDB, 0xED, 0x0, 0x1, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x6, 0x0, 0x0, 0x11, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0x47, 0x93, 0x48, 0xF2, 0xF2, 0x76, 0xB7, 0x9F, 0xC0, 0x1, 0xF3, 0x62, 0x3, 0x88, 0x83, 0xFC, 0xFB, 0x6, 0x0, 0xFD, 0xC3, 0x8B, 0xB6, 0xDA, 0xFD, 0x42, 0x2, 0xBB, 0x71, 0x5C, 0x0, 0x2, 0x0, 0x7D, 0x0, 0x0, 0x1, 0x91, 0x5, 0xD5, 0x0, 0x9, 0x0, 0xD, 0x0, 0x0, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x5, 0x11, 0x23, 0x11, 0x7D, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x1, 0x2, 0xF3, 0x5, 0x54, 0x38, 0x49, 0x49, 0x38, 0x37, 0x4A, 0x4A, 0xE3, 0xFB, 0xC6, 0x4, 0x3A, 0x0, 0x2, 0xFF, 0xB4, 0xFE, 0x4B, 0x1, 0x86, 0x5, 0xD5, 0x0, 0x9, 0x0, 0x15, 0x0, 0x0, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x17, 0x33, 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x72, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x15, 0xF3, 0xFE, 0xBC, 0x44, 0x3E, 0x2E, 0x2A, 0x7B, 0x5, 0x54, 0x38, 0x49, 0x49, 0x38, 0x37, 0x4A, 0x4A, 0xE3, 0xFB, 0x66, 0xFE, 0xAB, 0x11, 0xBF, 0x8, 0x8D, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x4, 0x37, 0x6, 0x0, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x1, 0x3, 0x1E, 0xFE, 0xBF, 0x6D, 0xF3, 0xF3, 0x4D, 0x1, 0x2B, 0x1, 0x24, 0xFE, 0x6D, 0x1, 0xBE, 0x1, 0xD2, 0x70, 0xFE, 0x9E, 0x6, 0x0, 0xFC, 0x8A, 0x60, 0x1, 0x50, 0xFE, 0x3E, 0xFD, 0x88, 0x0, 0x1, 0x0, 0x8C, 0x0, 0x0, 0x1, 0x7F, 0x6, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x7F, 0xF3, 0x6, 0x0, 0xFA, 0x0, 0x6, 0x0, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x6, 0x7A, 0x4, 0x4E, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0x3F, 0x93, 0x3D, 0xF2, 0xE4, 0x7, 0x73, 0xC6, 0xD7, 0x51, 0x77, 0xD6, 0xA6, 0xBD, 0x1, 0xF3, 0x69, 0x5A, 0x53, 0x69, 0x14, 0xF3, 0x68, 0x3, 0x88, 0x78, 0xFC, 0xF0, 0x4, 0x3A, 0x71, 0x85, 0xA5, 0xA5, 0xB8, 0xD4, 0xFD, 0x3E, 0x2, 0xBE, 0x78, 0x52, 0x5A, 0x48, 0xFD, 0x1A, 0x2, 0xBC, 0x72, 0x5A, 0x0, 0x1, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x4, 0x4E, 0x0, 0x11, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0x47, 0x91, 0x49, 0xF3, 0xE5, 0x8, 0x77, 0xC2, 0x9C, 0xBC, 0x1, 0xF3, 0x61, 0x3, 0x88, 0x84, 0xFC, 0xFC, 0x4, 0x3A, 0x7C, 0x90, 0xB3, 0xDA, 0xFD, 0x3F, 0x2, 0xBE, 0x70, 0x5A, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x34, 0x0, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x23, 0x22, 0x0, 0x27, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x50, 0x1, 0xA, 0xEC, 0xEF, 0x1, 0x9, 0xFE, 0xF7, 0xED, 0xEB, 0xFE, 0xF7, 0x4, 0xF2, 0x7D, 0x89, 0x86, 0x7D, 0x7C, 0x89, 0x87, 0x7D, 0x2, 0x27, 0xEC, 0x1, 0x3B, 0xFE, 0xC5, 0xEC, 0x15, 0xEB, 0xFE, 0xC5, 0x1, 0x33, 0xE6, 0xD, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x0, 0x2, 0x0, 0x7D, 0xFE, 0x60, 0x4, 0x31, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x2, 0x48, 0x83, 0x73, 0x75, 0x83, 0x96, 0x41, 0x43, 0xDA, 0xB1, 0x6C, 0xF2, 0xDF, 0xA, 0x6D, 0xB7, 0xCE, 0xD9, 0xDA, 0xAF, 0xD3, 0x90, 0x15, 0x92, 0xCF, 0x7D, 0xFE, 0x23, 0x7F, 0xC3, 0x75, 0xFD, 0xFF, 0x5, 0xDA, 0x6D, 0x81, 0xFE, 0xD0, 0xF8, 0x14, 0xEC, 0xFE, 0xC6, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x60, 0x4, 0x3, 0x4, 0x4E, 0x0, 0xF, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x23, 0x11, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x1, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x4, 0x3, 0xF3, 0x6A, 0xAA, 0xCA, 0xE2, 0xE1, 0xCD, 0xB4, 0x6B, 0xD, 0xD9, 0xFE, 0x36, 0x92, 0x45, 0x46, 0x8F, 0x83, 0x76, 0x74, 0xFE, 0x60, 0x1, 0xFD, 0x71, 0x1, 0x3A, 0xED, 0x14, 0xF7, 0x1, 0x30, 0x7E, 0x6A, 0xFC, 0x75, 0x7C, 0x1, 0xEA, 0x76, 0xD2, 0x92, 0x15, 0x91, 0xD2, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x2, 0xB5, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x2, 0x51, 0xA9, 0x39, 0xF2, 0xE8, 0x6, 0x56, 0x9E, 0x31, 0x25, 0x2, 0x32, 0x3, 0x64, 0x80, 0xFD, 0x1C, 0x4, 0x3A, 0x7A, 0x8E, 0xD, 0xE5, 0x8, 0x0, 0x1, 0x0, 0x4C, 0xFF, 0xEC, 0x3, 0xCA, 0x4, 0x4E, 0x0, 0x24, 0x0, 0x0, 0x1, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x2, 0xDC, 0x55, 0x8E, 0xB0, 0xD9, 0xE0, 0xC1, 0xCB, 0xE7, 0xF3, 0x60, 0x5F, 0x5C, 0x58, 0x5F, 0x7F, 0xBC, 0xD3, 0xEE, 0xC7, 0xDF, 0xEA, 0xEC, 0x5, 0x8A, 0x50, 0x60, 0x65, 0x1, 0x26, 0x35, 0x4C, 0x1E, 0x25, 0x93, 0x89, 0x85, 0xC3, 0xC6, 0x92, 0x3F, 0x63, 0x52, 0x6C, 0x40, 0x1B, 0x28, 0x92, 0x91, 0x90, 0xB8, 0xE4, 0x86, 0x64, 0x50, 0x4A, 0x0, 0x1, 0x0, 0x8, 0xFF, 0xEC, 0x2, 0x73, 0x5, 0x41, 0x0, 0x15, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x73, 0x46, 0x5A, 0x79, 0x9F, 0xB3, 0xB3, 0xF2, 0xBF, 0xBF, 0x40, 0x31, 0x2A, 0x2B, 0x4, 0x18, 0x89, 0xA7, 0x2, 0x6B, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0xFD, 0xA3, 0x49, 0x2B, 0xA, 0x0, 0x1, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x0, 0x21, 0x27, 0x6, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x3, 0x12, 0x6, 0x6A, 0xC6, 0x9E, 0xC6, 0x1, 0xF3, 0x67, 0x45, 0xAE, 0x40, 0xF3, 0x6A, 0x7E, 0xBA, 0xD5, 0x2, 0xBF, 0xFD, 0x43, 0x75, 0x55, 0x7D, 0x3, 0xA, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x17, 0x0, 0x0, 0x3, 0xDB, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x0, 0x21, 0x1, 0x33, 0x13, 0x13, 0x33, 0x1, 0x1, 0x91, 0xFE, 0x86, 0xFB, 0xEA, 0xE4, 0xFB, 0xFE, 0x89, 0x4, 0x3A, 0xFC, 0xFB, 0x3, 0x5, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x5, 0xCD, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x1, 0x23, 0x3, 0x3, 0x1, 0x4A, 0xFE, 0xD8, 0xED, 0xAF, 0xDD, 0xB8, 0xE1, 0xAC, 0xED, 0xFE, 0xD8, 0xC8, 0xE8, 0xE4, 0x4, 0x3A, 0xFD, 0x1E, 0x2, 0xE2, 0xFD, 0x14, 0x2, 0xEC, 0xFB, 0xC6, 0x2, 0xE6, 0xFD, 0x1A, 0x0, 0x1, 0x0, 0x1F, 0x0, 0x0, 0x3, 0xE9, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x1, 0x13, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x3, 0x21, 0x1, 0x1, 0x1, 0x38, 0xCA, 0xCE, 0x1, 0xD, 0xFE, 0xB6, 0x1, 0x56, 0xFE, 0xF3, 0xD8, 0xD7, 0xFE, 0xF2, 0x1, 0x56, 0xFE, 0xB6, 0x4, 0x3A, 0xFE, 0x9C, 0x1, 0x64, 0xFD, 0xEC, 0xFD, 0xDA, 0x1, 0x72, 0xFE, 0x8E, 0x2, 0x26, 0x2, 0x14, 0x0, 0x1, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x4, 0x3A, 0x0, 0x10, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x37, 0x37, 0x1, 0x21, 0x13, 0x13, 0x21, 0x1, 0x2, 0x7, 0xD9, 0x31, 0x44, 0x2E, 0x5A, 0x5E, 0x1B, 0x23, 0xFE, 0x84, 0x1, 0x7, 0xE5, 0xDC, 0x1, 0x3, 0xFE, 0x54, 0x5A, 0xCB, 0xFE, 0x4B, 0x11, 0xBC, 0x3, 0x41, 0x51, 0x5E, 0x4, 0x35, 0xFD, 0x21, 0x2, 0xDF, 0xFB, 0x2B, 0xFE, 0xFD, 0x15, 0x0, 0x1, 0x0, 0x52, 0x0, 0x0, 0x3, 0xC0, 0x4, 0x3A, 0x0, 0x9, 0x0, 0x0, 0x33, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0x52, 0x2, 0x26, 0xFD, 0xE5, 0x3, 0x4E, 0xFD, 0xD6, 0x2, 0x3F, 0x9F, 0x2, 0xD7, 0xC4, 0x99, 0xFD, 0x22, 0xC3, 0x0, 0x1, 0x0, 0x38, 0xFE, 0x98, 0x2, 0x92, 0x6, 0x3D, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x26, 0x26, 0x35, 0x35, 0x34, 0x23, 0x35, 0x32, 0x35, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x15, 0x14, 0x7, 0x16, 0x15, 0x15, 0x14, 0x16, 0x17, 0x2, 0x62, 0xCE, 0x9A, 0xC2, 0xC2, 0x9A, 0xCE, 0x30, 0x68, 0x4C, 0xAC, 0xAC, 0x4C, 0x68, 0xFE, 0x98, 0x3A, 0xFA, 0x9E, 0xC6, 0xE2, 0xB2, 0xE2, 0xC6, 0x9E, 0xF9, 0x3A, 0x8C, 0x22, 0xB1, 0x72, 0xC2, 0xE5, 0x5A, 0x5A, 0xE5, 0xC2, 0x72, 0xB1, 0x22, 0x0, 0x1, 0x0, 0xAE, 0xFE, 0xF2, 0x1, 0x56, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x56, 0xA8, 0x5, 0xB0, 0xF9, 0x42, 0x6, 0xBE, 0x0, 0x1, 0x0, 0x1C, 0xFE, 0x98, 0x2, 0x76, 0x6, 0x3D, 0x0, 0x1A, 0x0, 0x0, 0x13, 0x27, 0x36, 0x36, 0x35, 0x35, 0x34, 0x37, 0x26, 0x35, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x15, 0x14, 0x33, 0x15, 0x22, 0x15, 0x15, 0x14, 0x6, 0x4C, 0x30, 0x68, 0x4B, 0xB6, 0xB6, 0x4B, 0x68, 0x30, 0xCF, 0x99, 0xC2, 0xC2, 0x99, 0xFE, 0x98, 0x8D, 0x22, 0xB1, 0x72, 0xC3, 0xE8, 0x56, 0x56, 0xE8, 0xC3, 0x72, 0xB1, 0x22, 0x8C, 0x3A, 0xF9, 0x9E, 0xC6, 0xE2, 0xB2, 0xE2, 0xC6, 0x9E, 0xFA, 0x0, 0x1, 0x0, 0x76, 0x1, 0x84, 0x4, 0xDC, 0x3, 0x30, 0x0, 0x17, 0x0, 0x0, 0x1, 0x37, 0x14, 0x6, 0x23, 0x22, 0x2E, 0x2, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x4, 0x21, 0xBB, 0xBB, 0x90, 0x4E, 0x7B, 0x97, 0x44, 0x26, 0x43, 0x4D, 0xC1, 0xB9, 0x91, 0x55, 0x8C, 0x43, 0x5E, 0x48, 0x43, 0x54, 0x3, 0x12, 0x1, 0xAC, 0xE3, 0x39, 0x86, 0x22, 0x68, 0x54, 0xAF, 0xD8, 0x4A, 0x3F, 0x58, 0x6E, 0x0, 0x2, 0x0, 0x86, 0xFE, 0x93, 0x1, 0x9A, 0x4, 0x4D, 0x0, 0x9, 0x0, 0xD, 0x0, 0x0, 0x1, 0x14, 0x6, 0x22, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x1, 0x13, 0x33, 0x13, 0x1, 0x9A, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0xFE, 0xF9, 0x17, 0xD1, 0x18, 0x3, 0xCB, 0x37, 0x4C, 0x4C, 0x37, 0x38, 0x4A, 0x4A, 0xFA, 0x90, 0x4, 0x3, 0xFB, 0xFD, 0x0, 0x1, 0x0, 0x65, 0xFF, 0xB, 0x4, 0xB, 0x5, 0x26, 0x0, 0x21, 0x0, 0x0, 0x1, 0x6, 0x6, 0x7, 0x15, 0x23, 0x35, 0x26, 0x2, 0x35, 0x35, 0x34, 0x12, 0x37, 0x35, 0x33, 0x15, 0x16, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x4, 0xB, 0x5, 0xC4, 0x92, 0xC8, 0xC4, 0xBF, 0xBF, 0xC4, 0xC8, 0x9C, 0xBA, 0x5, 0xE5, 0x4, 0x70, 0x64, 0x94, 0x62, 0x61, 0x96, 0x59, 0x7A, 0x4, 0x1, 0x66, 0x88, 0xCD, 0x1C, 0xEA, 0xEA, 0x23, 0x1, 0x2D, 0xC6, 0x24, 0xC5, 0x1, 0x2E, 0x23, 0xE1, 0xE0, 0x1B, 0xD7, 0x9D, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x83, 0xD9, 0x68, 0x4F, 0x0, 0x1, 0x0, 0x5F, 0x0, 0x0, 0x4, 0x7C, 0x5, 0xC4, 0x0, 0x20, 0x0, 0x0, 0x21, 0x21, 0x35, 0x33, 0x36, 0x36, 0x35, 0x27, 0x23, 0x35, 0x33, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x17, 0x21, 0x15, 0x21, 0x17, 0x14, 0x7, 0x21, 0x4, 0x7C, 0xFB, 0xE7, 0x51, 0x32, 0x21, 0x6, 0xA2, 0x9B, 0x8, 0xFF, 0xC6, 0xD0, 0xE3, 0xF5, 0x79, 0x4F, 0x50, 0x6F, 0x9, 0x1, 0x37, 0xFE, 0xD0, 0x7, 0x41, 0x2, 0xB8, 0xCA, 0xD, 0x8A, 0x3D, 0xB9, 0xC7, 0xF1, 0xCF, 0xE6, 0xDE, 0xB5, 0x6E, 0x5A, 0x78, 0x72, 0xF1, 0xC7, 0xB1, 0x88, 0x54, 0x0, 0x2, 0x0, 0x5D, 0xFF, 0xE5, 0x5, 0x4F, 0x4, 0xF1, 0x0, 0x1B, 0x0, 0x27, 0x0, 0x0, 0x5, 0x27, 0x6, 0x23, 0x22, 0x27, 0x7, 0x27, 0x37, 0x26, 0x35, 0x34, 0x37, 0x27, 0x37, 0x17, 0x36, 0x33, 0x32, 0x17, 0x37, 0x17, 0x7, 0x16, 0x15, 0x14, 0x7, 0x17, 0x1, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x34, 0x2, 0x23, 0x22, 0x2, 0x4, 0xC1, 0x83, 0x9F, 0xCB, 0xCA, 0x9F, 0x81, 0x8D, 0x88, 0x65, 0x6D, 0x90, 0x8D, 0x8E, 0x9B, 0xC1, 0xC2, 0x9B, 0x90, 0x8E, 0x93, 0x6A, 0x62, 0x8B, 0xFB, 0xEB, 0xEF, 0xAB, 0xAA, 0xEF, 0xEF, 0xAA, 0xAB, 0xEF, 0x1B, 0x87, 0x80, 0x7E, 0x84, 0x90, 0x8A, 0x9D, 0xC3, 0xCC, 0xA1, 0x93, 0x90, 0x91, 0x73, 0x75, 0x94, 0x91, 0x96, 0xA1, 0xC9, 0xC0, 0x9D, 0x8D, 0x1, 0xEA, 0xB8, 0xFE, 0xFE, 0x1, 0x2, 0xB8, 0xB9, 0x1, 0x0, 0xFF, 0x0, 0x0, 0x1, 0x0, 0xC, 0x0, 0x0, 0x4, 0x35, 0x5, 0xB0, 0x0, 0x16, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x33, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x33, 0x15, 0x21, 0x15, 0x21, 0x3, 0xCA, 0xFE, 0xD1, 0xFC, 0xFE, 0xCC, 0x1, 0x34, 0xFE, 0xCC, 0xF7, 0xFE, 0xAA, 0x1, 0x10, 0x1, 0x6, 0x1, 0x5, 0x1, 0xE, 0xFE, 0xAA, 0xEB, 0xFE, 0xD1, 0x1, 0x2F, 0x1, 0x2D, 0xFE, 0xD3, 0x1, 0x2D, 0x97, 0x8A, 0x98, 0x2, 0xCA, 0xFD, 0xA0, 0x2, 0x60, 0xFD, 0x36, 0x98, 0x8A, 0x0, 0x2, 0x0, 0x89, 0xFE, 0xF2, 0x1, 0x6E, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x13, 0x23, 0x11, 0x33, 0x1, 0x6E, 0xE5, 0xE5, 0xE5, 0xE5, 0x5, 0xB0, 0xFD, 0xA, 0x2, 0xF6, 0xF9, 0x42, 0x3, 0x1B, 0x0, 0x2, 0x0, 0x5A, 0xFE, 0x25, 0x4, 0x8D, 0x5, 0xC5, 0x0, 0xC, 0x0, 0x3A, 0x0, 0x0, 0x1, 0x36, 0x35, 0x34, 0x26, 0x24, 0x27, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x3, 0x22, 0x26, 0x26, 0x35, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x10, 0x37, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x4, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x4, 0x17, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x4, 0x3, 0x2B, 0x71, 0x76, 0xFE, 0xA5, 0xF, 0x6B, 0x89, 0xC6, 0x51, 0x80, 0x84, 0xF6, 0x9D, 0xF3, 0xBC, 0x68, 0x7E, 0x87, 0x88, 0xB9, 0xDD, 0xFA, 0xAA, 0x86, 0x1, 0x14, 0xE6, 0xEC, 0x1, 0xF, 0xF3, 0x86, 0x82, 0x89, 0x7E, 0x77, 0x1, 0xAE, 0x77, 0x7C, 0xAA, 0x86, 0xFE, 0xED, 0x1, 0x13, 0x2F, 0x76, 0x4B, 0x5F, 0x6B, 0x6, 0x2A, 0x7B, 0x5C, 0x5C, 0x37, 0x17, 0xFC, 0xFD, 0x4E, 0xB9, 0xA2, 0x1, 0x86, 0x60, 0x61, 0x4C, 0x4F, 0x5A, 0x37, 0x3B, 0xB6, 0x1, 0x70, 0x59, 0x67, 0xB7, 0xAA, 0xCD, 0xDE, 0xCF, 0x61, 0x89, 0x69, 0x49, 0x53, 0x56, 0x77, 0x56, 0x5A, 0xB9, 0xB8, 0x58, 0x67, 0xB8, 0xB2, 0xC1, 0x0, 0x2, 0x0, 0x5E, 0x4, 0xE0, 0x3, 0x24, 0x5, 0xCD, 0x0, 0xB, 0x0, 0x17, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x5E, 0x44, 0x3A, 0x3B, 0x44, 0x44, 0x3B, 0x3A, 0x44, 0x1, 0xC9, 0x44, 0x3A, 0x3B, 0x44, 0x44, 0x3B, 0x3A, 0x44, 0x5, 0x56, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x30, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x0, 0x3, 0x0, 0x57, 0xFF, 0xEB, 0x5, 0xE3, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x37, 0x0, 0x0, 0x13, 0x34, 0x12, 0x24, 0x20, 0x4, 0x12, 0x15, 0x14, 0x2, 0x4, 0x20, 0x24, 0x2, 0x37, 0x14, 0x12, 0x4, 0x20, 0x24, 0x12, 0x35, 0x34, 0x2, 0x24, 0x20, 0x4, 0x2, 0x1, 0x33, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x57, 0xC0, 0x1, 0x42, 0x1, 0x88, 0x1, 0x42, 0xC0, 0xC0, 0xFE, 0xBE, 0xFE, 0x78, 0xFE, 0xBE, 0xC0, 0x7A, 0x9F, 0x1, 0xB, 0x1, 0x44, 0x1, 0xB, 0x9E, 0x9E, 0xFE, 0xF5, 0xFE, 0xBC, 0xFE, 0xF5, 0x9F, 0x2, 0xF1, 0x9C, 0xB4, 0x9B, 0xA1, 0xBC, 0xBC, 0xA1, 0x9B, 0xB5, 0x9C, 0x5B, 0x59, 0x60, 0x62, 0x62, 0x60, 0x59, 0x5A, 0x2, 0xD9, 0xD4, 0x1, 0x52, 0xC5, 0xC5, 0xFE, 0xAE, 0xD4, 0xD3, 0xFE, 0xAC, 0xC7, 0xC7, 0x1, 0x54, 0xD3, 0xB0, 0xFE, 0xE4, 0xA5, 0xA5, 0x1, 0x1C, 0xB0, 0xB1, 0x1, 0x19, 0xA4, 0xA4, 0xFE, 0xE7, 0xFE, 0xCA, 0x9D, 0x9D, 0xD7, 0xAC, 0x77, 0xAC, 0xD7, 0x9C, 0x9D, 0x60, 0x52, 0x8D, 0x6E, 0x78, 0x70, 0x8C, 0x52, 0x0, 0x2, 0x0, 0x8E, 0x2, 0xB4, 0x3, 0x12, 0x5, 0xC5, 0x0, 0x9, 0x0, 0x23, 0x0, 0x0, 0x1, 0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x6, 0x15, 0x14, 0x5, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x25, 0x33, 0x35, 0x34, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x17, 0x1, 0xB2, 0x28, 0x54, 0x1B, 0x65, 0x57, 0x50, 0x1, 0x24, 0xB, 0x6, 0x4D, 0x7C, 0x78, 0x81, 0x1, 0x44, 0x77, 0x74, 0x8A, 0xAD, 0xAA, 0x8D, 0x83, 0xA0, 0x1A, 0x3, 0x44, 0x25, 0x19, 0x88, 0x42, 0x2C, 0x58, 0x82, 0x20, 0x24, 0x52, 0x7D, 0x67, 0xE1, 0x6, 0x33, 0x7F, 0x63, 0xE, 0x65, 0x84, 0x8B, 0x89, 0xFE, 0xC6, 0x66, 0x4F, 0xFF, 0xFF, 0x0, 0x56, 0x0, 0x8B, 0x3, 0x86, 0x3, 0xAA, 0x0, 0x26, 0x4, 0x79, 0xEA, 0x0, 0x0, 0x7, 0x4, 0x79, 0x1, 0x52, 0x0, 0x0, 0x0, 0x1, 0x0, 0x7F, 0x1, 0x76, 0x3, 0xC2, 0x3, 0x25, 0x0, 0x5, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x35, 0x21, 0x3, 0xC2, 0xC8, 0xFD, 0x85, 0x3, 0x43, 0x1, 0x76, 0x1, 0x4, 0xAB, 0x0, 0x4, 0x0, 0x57, 0xFF, 0xEB, 0x5, 0xE3, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x24, 0x0, 0x3A, 0x0, 0x0, 0x13, 0x34, 0x12, 0x24, 0x20, 0x4, 0x12, 0x15, 0x14, 0x2, 0x4, 0x20, 0x24, 0x2, 0x37, 0x14, 0x12, 0x4, 0x20, 0x24, 0x12, 0x35, 0x34, 0x2, 0x24, 0x20, 0x4, 0x2, 0x25, 0x15, 0x33, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x16, 0x14, 0x16, 0x17, 0x15, 0x23, 0x26, 0x26, 0x34, 0x26, 0x23, 0x57, 0xC0, 0x1, 0x42, 0x1, 0x88, 0x1, 0x42, 0xC0, 0xC0, 0xFE, 0xBE, 0xFE, 0x78, 0xFE, 0xBE, 0xC0, 0x7A, 0x9F, 0x1, 0xB, 0x1, 0x44, 0x1, 0xB, 0x9E, 0x9E, 0xFE, 0xF5, 0xFE, 0xBC, 0xFE, 0xF5, 0x9F, 0x1, 0xBC, 0x90, 0x40, 0x61, 0x4D, 0x62, 0x82, 0x97, 0x1, 0x19, 0x95, 0xB0, 0x77, 0x40, 0x34, 0x7, 0xA, 0x9B, 0xA, 0x3, 0x48, 0x47, 0x2, 0xD9, 0xD4, 0x1, 0x52, 0xC5, 0xC5, 0xFE, 0xAE, 0xD4, 0xD3, 0xFE, 0xAC, 0xC7, 0xC7, 0x1, 0x54, 0xD3, 0xB0, 0xFE, 0xE4, 0xA5, 0xA5, 0x1, 0x1C, 0xB0, 0xB1, 0x1, 0x19, 0xA4, 0xA4, 0xFE, 0xE7, 0x7F, 0xF6, 0x1, 0x3A, 0x39, 0x49, 0x39, 0xFE, 0x84, 0xFE, 0xAF, 0x3, 0x52, 0x82, 0x81, 0x75, 0x40, 0x1D, 0x6E, 0xA3, 0x45, 0x17, 0x10, 0x1A, 0x60, 0x92, 0x45, 0x0, 0x1, 0x0, 0x9C, 0x5, 0xC, 0x3, 0x4A, 0x5, 0xAA, 0x0, 0x3, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x3, 0x4A, 0xFD, 0x52, 0x5, 0xAA, 0x9E, 0x9E, 0x0, 0x2, 0x0, 0x7F, 0x3, 0xAF, 0x2, 0x8C, 0x5, 0xC5, 0x0, 0x9, 0x0, 0x13, 0x0, 0x0, 0x12, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x6, 0x7F, 0x9C, 0x6D, 0x6B, 0x99, 0x99, 0x6B, 0x6D, 0x9C, 0x8B, 0x4B, 0x66, 0x46, 0x46, 0x66, 0x4B, 0x5, 0x26, 0x9F, 0x9F, 0xDC, 0x9B, 0x9B, 0x6E, 0x35, 0x47, 0x47, 0x35, 0x37, 0x49, 0x49, 0x0, 0x2, 0x0, 0x5F, 0x0, 0x1, 0x3, 0xF3, 0x4, 0xFC, 0x0, 0xB, 0x0, 0xF, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x3, 0x15, 0x21, 0x35, 0x3, 0xF3, 0xFE, 0xA9, 0xD7, 0xFE, 0x9A, 0x1, 0x66, 0xD7, 0x1, 0x57, 0x25, 0xFC, 0xB0, 0x2, 0xBC, 0xFE, 0x7C, 0x1, 0x84, 0xC7, 0x1, 0x79, 0xFE, 0x87, 0xFD, 0x42, 0xC4, 0xC4, 0x0, 0x1, 0x0, 0x3C, 0x2, 0x9B, 0x2, 0xB2, 0x5, 0xBB, 0x0, 0x15, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x1, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x20, 0x16, 0x15, 0x14, 0x6, 0x7, 0x7, 0x2, 0xB2, 0xFD, 0x9C, 0x1, 0x2C, 0x63, 0x6A, 0x40, 0x3C, 0xBB, 0xA2, 0x1, 0x1C, 0x9E, 0x67, 0x61, 0x91, 0x3, 0x30, 0x95, 0x7E, 0x1, 0x13, 0x5C, 0x3F, 0x5F, 0x45, 0x32, 0x6E, 0x9E, 0x81, 0x72, 0x52, 0x80, 0x51, 0x75, 0x0, 0x1, 0x0, 0x37, 0x2, 0x90, 0x2, 0xA9, 0x5, 0xBB, 0x0, 0x24, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x1, 0x69, 0x70, 0xC2, 0xBB, 0x45, 0x3B, 0x3F, 0x3E, 0x86, 0x5C, 0x5C, 0x78, 0x36, 0x3E, 0x2F, 0x41, 0xBA, 0xAD, 0x79, 0x89, 0xAA, 0x87, 0x94, 0xB7, 0x2, 0x90, 0x70, 0x80, 0x25, 0x36, 0x38, 0x2A, 0x64, 0x2, 0x80, 0x2, 0x5F, 0x23, 0x35, 0x27, 0x23, 0x6B, 0x74, 0x73, 0x6E, 0x77, 0x33, 0x29, 0x8F, 0x6F, 0x79, 0x0, 0x1, 0x0, 0x71, 0x4, 0xD2, 0x2, 0x49, 0x6, 0x0, 0x0, 0x3, 0x0, 0x0, 0x13, 0x13, 0x21, 0x1, 0x71, 0xC3, 0x1, 0x15, 0xFE, 0xEB, 0x4, 0xD2, 0x1, 0x2E, 0xFE, 0xD2, 0x0, 0x1, 0x0, 0x93, 0xFE, 0x60, 0x4, 0x1F, 0x4, 0x3A, 0x0, 0x12, 0x0, 0x0, 0x5, 0x22, 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x16, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, 0x27, 0x6, 0x2, 0x4A, 0x79, 0x4C, 0xF2, 0xF2, 0x1, 0x6F, 0x54, 0xA8, 0x3C, 0xF2, 0xDE, 0x7, 0x5A, 0x15, 0x38, 0xFE, 0x3D, 0x5, 0xDA, 0xFD, 0x8D, 0xAE, 0x6A, 0x7A, 0x3, 0x11, 0xFB, 0xC6, 0x57, 0x6C, 0x0, 0x1, 0x0, 0x46, 0x0, 0x0, 0x3, 0x56, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x23, 0x26, 0x2, 0x10, 0x12, 0x33, 0x21, 0x3, 0x56, 0xD1, 0x5A, 0xEA, 0xFB, 0xFE, 0xEE, 0x1, 0x24, 0x2, 0x8, 0x2, 0x1, 0x9, 0x1, 0x92, 0x1, 0xB, 0x0, 0x1, 0x0, 0x8E, 0x2, 0x46, 0x1, 0xAA, 0x3, 0x52, 0x0, 0x9, 0x0, 0x0, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x8E, 0x4B, 0x86, 0x4B, 0x4B, 0x86, 0x4B, 0x2, 0xCB, 0x39, 0x4E, 0x4E, 0x39, 0x38, 0x4D, 0x4D, 0x0, 0x1, 0x0, 0x6E, 0xFE, 0x40, 0x1, 0xC9, 0x0, 0x4, 0x0, 0xE, 0x0, 0x0, 0x37, 0x33, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x27, 0x32, 0x35, 0x34, 0x26, 0x27, 0x8D, 0xB2, 0xC, 0x38, 0x5E, 0xA5, 0xA1, 0x7, 0x88, 0x46, 0x50, 0x4, 0x37, 0xA, 0x4D, 0x56, 0x65, 0x7B, 0x8A, 0x59, 0x2D, 0x22, 0x6, 0x0, 0x1, 0x0, 0x81, 0x2, 0x9B, 0x2, 0x3, 0x5, 0xAF, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x7, 0x35, 0x25, 0x2, 0x3, 0xBA, 0xC8, 0x1, 0x6F, 0x5, 0xAF, 0xFC, 0xEC, 0x2, 0x3B, 0x31, 0x93, 0x77, 0x0, 0x2, 0x0, 0x77, 0x2, 0xB3, 0x3, 0x2C, 0x5, 0xC5, 0x0, 0xC, 0x0, 0x1A, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x77, 0xBB, 0x9F, 0xA1, 0xBA, 0xB9, 0xFE, 0xC0, 0xBC, 0xAF, 0x55, 0x58, 0x56, 0x54, 0x55, 0x57, 0x56, 0x55, 0x4, 0x62, 0x9B, 0xC8, 0xC8, 0x9B, 0x4D, 0x9B, 0xC7, 0xC7, 0x9B, 0x59, 0x77, 0x77, 0x59, 0x4D, 0x58, 0x77, 0x77, 0x58, 0xFF, 0xFF, 0x0, 0x5E, 0x0, 0x8A, 0x3, 0x9A, 0x3, 0xA9, 0x0, 0x26, 0x4, 0x7A, 0x9, 0x0, 0x0, 0x7, 0x4, 0x7A, 0x1, 0x7E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x59, 0x0, 0x0, 0x5, 0x84, 0x5, 0xAC, 0x0, 0x27, 0x7, 0x42, 0xFF, 0xD8, 0x2, 0x98, 0x0, 0x27, 0x4, 0x83, 0x1, 0x1B, 0x0, 0x8, 0x0, 0x7, 0x7, 0x9E, 0x2, 0xC5, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0x0, 0x0, 0x5, 0xCC, 0x5, 0xAF, 0x0, 0x27, 0x4, 0x83, 0x0, 0xF0, 0x0, 0x8, 0x0, 0x27, 0x7, 0x42, 0xFF, 0xCF, 0x2, 0x9B, 0x0, 0x7, 0x7, 0x41, 0x3, 0x1A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x67, 0x0, 0x0, 0x5, 0xFD, 0x5, 0xBB, 0x0, 0x27, 0x4, 0x83, 0x1, 0xA8, 0x0, 0x8, 0x0, 0x27, 0x7, 0x9E, 0x3, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x7, 0x9D, 0x0, 0x30, 0x2, 0x9B, 0x0, 0x2, 0x0, 0x43, 0xFE, 0x7E, 0x3, 0xA5, 0x4, 0x4E, 0x0, 0x9, 0x0, 0x21, 0x0, 0x0, 0x1, 0x14, 0x6, 0x22, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x3, 0x33, 0xE, 0x3, 0x15, 0x14, 0x33, 0x32, 0x36, 0x37, 0x33, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x36, 0x2, 0x8B, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0xF8, 0xE3, 0x1, 0x40, 0xD4, 0x2B, 0xBA, 0x4B, 0x76, 0x1, 0xF3, 0x2, 0xF9, 0xB7, 0xCD, 0xE3, 0x5C, 0x9E, 0x33, 0x22, 0x3, 0xCC, 0x37, 0x4C, 0x4C, 0x37, 0x38, 0x4A, 0x4A, 0xFE, 0x92, 0x87, 0x96, 0xDA, 0x5C, 0x3E, 0xBD, 0x58, 0x60, 0xBC, 0xC6, 0xC9, 0xBA, 0x66, 0xA5, 0x9C, 0x32, 0x72, 0x0, 0x2, 0xFF, 0xF6, 0x0, 0x0, 0x7, 0x57, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x12, 0x0, 0x0, 0x1, 0x3, 0x1, 0x1, 0x3, 0x21, 0x3, 0x21, 0x1, 0x21, 0x15, 0x21, 0x13, 0x21, 0x15, 0x21, 0x13, 0x21, 0x15, 0x3, 0xBF, 0x1B, 0xFE, 0xA0, 0x1, 0x92, 0xE, 0xFE, 0x8, 0xB8, 0xFE, 0xDE, 0x3, 0x43, 0x3, 0xE1, 0xFD, 0x79, 0x11, 0x2, 0x25, 0xFD, 0xE4, 0x13, 0x2, 0x97, 0x2, 0x2B, 0x2, 0x8A, 0xFD, 0x76, 0xFD, 0xD5, 0x1, 0x55, 0xFE, 0xAB, 0x5, 0xB0, 0xC4, 0xFE, 0x67, 0xC4, 0xFE, 0x35, 0xC4, 0x0, 0x1, 0x0, 0x4D, 0x0, 0xD7, 0x3, 0xEC, 0x4, 0x86, 0x0, 0xB, 0x0, 0x0, 0x25, 0x1, 0x1, 0x27, 0x1, 0x1, 0x37, 0x1, 0x1, 0x17, 0x1, 0x1, 0x3, 0x58, 0xFE, 0xC5, 0xFE, 0xC4, 0x94, 0x1, 0x3C, 0xFE, 0xC4, 0x94, 0x1, 0x3C, 0x1, 0x3B, 0x94, 0xFE, 0xC4, 0x1, 0x3C, 0xD7, 0x1, 0x42, 0xFE, 0xBE, 0x95, 0x1, 0x43, 0x1, 0x42, 0x95, 0xFE, 0xBE, 0x1, 0x42, 0x95, 0xFE, 0xBE, 0xFE, 0xBD, 0x0, 0x3, 0x0, 0x6A, 0xFF, 0xA1, 0x5, 0x22, 0x5, 0xEE, 0x0, 0x8, 0x0, 0x11, 0x0, 0x28, 0x0, 0x0, 0x1, 0x14, 0x17, 0x1, 0x26, 0x23, 0x22, 0x2, 0x15, 0x1, 0x32, 0x12, 0x35, 0x35, 0x34, 0x27, 0x1, 0x16, 0x17, 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x2, 0x35, 0x35, 0x10, 0x0, 0x21, 0x32, 0x17, 0x37, 0x33, 0x7, 0x16, 0x11, 0x15, 0x10, 0x0, 0x1, 0x67, 0x47, 0x1, 0xF6, 0x56, 0x88, 0xA3, 0xBC, 0x1, 0x61, 0xA7, 0xB6, 0x2C, 0xFE, 0x18, 0x4D, 0x6A, 0xA6, 0x83, 0x5B, 0xA8, 0x90, 0x5B, 0x67, 0x1, 0x51, 0x1, 0xB, 0xC3, 0x90, 0x57, 0xA7, 0x93, 0x9E, 0xFE, 0xB5, 0x2, 0xB3, 0xCF, 0x80, 0x3, 0x3A, 0x55, 0xFF, 0x0, 0xF5, 0xFD, 0xBE, 0x1, 0x2, 0xF5, 0x4B, 0xA6, 0x73, 0xFC, 0xDB, 0x36, 0xD0, 0x4B, 0x96, 0xEE, 0x5C, 0x1, 0x15, 0xB3, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0x65, 0x8F, 0xF2, 0xC0, 0xFE, 0xC0, 0x49, 0xFE, 0xB4, 0xFE, 0x85, 0x0, 0x2, 0x0, 0x95, 0x0, 0x0, 0x4, 0x7F, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x15, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x16, 0x4, 0x15, 0x14, 0x4, 0x23, 0x1, 0x88, 0xF5, 0x91, 0x7E, 0x7E, 0x91, 0xF5, 0xF3, 0xF3, 0xFD, 0xF5, 0x1, 0x5, 0xFE, 0xF7, 0xF9, 0x3, 0xD6, 0xFE, 0x19, 0x95, 0x5C, 0x5F, 0x97, 0xFD, 0x56, 0xFE, 0xD4, 0x5, 0xB0, 0xFE, 0xE9, 0x2, 0xF8, 0xBD, 0xBE, 0xF8, 0x0, 0x1, 0x0, 0x88, 0xFF, 0xEC, 0x4, 0x9C, 0x6, 0x16, 0x0, 0x2C, 0x0, 0x0, 0x21, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x6, 0x15, 0x14, 0x1E, 0x2, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2E, 0x2, 0x35, 0x34, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x1, 0x7A, 0xF2, 0xEF, 0xC5, 0xAB, 0xE7, 0x3B, 0x3C, 0x62, 0x82, 0x61, 0xDF, 0xC0, 0x50, 0xAA, 0x27, 0x31, 0x20, 0x7C, 0x46, 0x62, 0x58, 0x62, 0x80, 0x62, 0x3F, 0x3F, 0x61, 0x4B, 0xB9, 0x4, 0x4, 0x52, 0xE0, 0xE4, 0xAF, 0xB5, 0x66, 0x71, 0x5A, 0x48, 0x3C, 0x61, 0x68, 0x85, 0x5F, 0xAF, 0xB5, 0x26, 0x1A, 0xC3, 0x13, 0x2D, 0x56, 0x43, 0x42, 0x61, 0x62, 0x83, 0x64, 0x53, 0x6A, 0x65, 0x4C, 0x56, 0x5B, 0xF9, 0x0, 0x3, 0x0, 0x48, 0xFF, 0xEB, 0x6, 0x85, 0x4, 0x4F, 0x0, 0x7, 0x0, 0x12, 0x0, 0x3C, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x34, 0x26, 0x1, 0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x5, 0x6, 0x6, 0x23, 0x22, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x17, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x4, 0xC3, 0x6B, 0x78, 0xF, 0x1, 0xC3, 0x60, 0xFC, 0xBC, 0x3F, 0x84, 0x2B, 0xBC, 0x72, 0x75, 0x58, 0x4, 0xDB, 0x28, 0xC7, 0x98, 0xFC, 0x8D, 0x35, 0xCD, 0x9C, 0xB6, 0xC2, 0xF0, 0xE8, 0xBE, 0x5E, 0x58, 0x5F, 0x70, 0xF2, 0xF8, 0xCA, 0xE2, 0x6D, 0x82, 0xC9, 0xD8, 0xEA, 0xFD, 0x48, 0x9, 0x8D, 0x92, 0x71, 0x8B, 0x35, 0x3, 0x8B, 0x95, 0x73, 0x1D, 0x63, 0x88, 0xFD, 0x1A, 0x3D, 0x28, 0xD2, 0x66, 0x42, 0x3D, 0x52, 0x41, 0x1F, 0x5A, 0xA2, 0x3E, 0x64, 0xB6, 0x97, 0x9E, 0xAD, 0x46, 0x5A, 0x68, 0x5C, 0x3F, 0x13, 0x90, 0xBB, 0x84, 0x85, 0x1, 0xFE, 0xF8, 0xE2, 0x8D, 0x7E, 0xAB, 0x3D, 0x1F, 0x0, 0x2, 0x0, 0x68, 0xFF, 0xEC, 0x4, 0x41, 0x6, 0x2C, 0x0, 0x1B, 0x0, 0x29, 0x0, 0x0, 0x5, 0x22, 0x0, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x26, 0x27, 0x7, 0x27, 0x37, 0x26, 0x27, 0x37, 0x16, 0x17, 0x37, 0x17, 0x7, 0x16, 0x12, 0x15, 0x15, 0x10, 0x0, 0x27, 0x32, 0x36, 0x35, 0x35, 0x27, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x2, 0x51, 0xD9, 0xFE, 0xF0, 0xF9, 0xCA, 0x93, 0x70, 0x34, 0x7B, 0xCD, 0x4E, 0xAD, 0x7D, 0xA4, 0x4B, 0xEE, 0xB2, 0xB4, 0x4D, 0x99, 0x77, 0x87, 0xFE, 0xE7, 0xD3, 0x77, 0x82, 0x1, 0x1B, 0x75, 0x5A, 0x7F, 0x8A, 0x83, 0x14, 0x1, 0x1C, 0xCC, 0xE4, 0x1, 0x15, 0x5A, 0xAC, 0x77, 0x88, 0x6D, 0x73, 0x52, 0x29, 0xC3, 0x31, 0x87, 0x77, 0x6D, 0x66, 0x7B, 0xFE, 0xB0, 0xCB, 0x57, 0xFF, 0x0, 0xFE, 0xC1, 0xC3, 0xD1, 0x9D, 0x67, 0x24, 0x2A, 0x3F, 0xAA, 0x93, 0x70, 0xB5, 0x0, 0x3, 0x0, 0x44, 0x0, 0x93, 0x4, 0x38, 0x4, 0xCD, 0x0, 0x9, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x5, 0x15, 0x21, 0x35, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0xB3, 0x4B, 0x86, 0x4B, 0x4B, 0x86, 0x4B, 0x2, 0x85, 0xFC, 0xC, 0x1, 0x6F, 0x4B, 0x86, 0x4B, 0x4B, 0x86, 0x4B, 0x4, 0x47, 0x3A, 0x4C, 0x4C, 0x3A, 0x38, 0x4B, 0x4B, 0xF4, 0xD4, 0xD4, 0xFD, 0xFC, 0x39, 0x4C, 0x4C, 0x39, 0x38, 0x4C, 0x4C, 0x0, 0x3, 0x0, 0x50, 0xFF, 0x76, 0x4, 0x3E, 0x4, 0xBC, 0x0, 0x8, 0x0, 0x11, 0x0, 0x27, 0x0, 0x0, 0x1, 0x14, 0x17, 0x1, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x32, 0x36, 0x35, 0x35, 0x34, 0x27, 0x1, 0x16, 0x17, 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x3, 0x35, 0x34, 0x0, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, 0x16, 0x13, 0x15, 0x14, 0x0, 0x1, 0x42, 0x41, 0x1, 0x2B, 0x2E, 0x3A, 0x87, 0x7D, 0x1, 0x6, 0x86, 0x7D, 0x3A, 0xFE, 0xD9, 0x2B, 0x33, 0x63, 0x54, 0x49, 0x90, 0x66, 0xCB, 0x3, 0x1, 0xA, 0xEC, 0x69, 0x59, 0x47, 0x90, 0x66, 0xC1, 0x4, 0xFE, 0xF7, 0x2, 0x12, 0xA0, 0x5E, 0x2, 0x61, 0x16, 0xD5, 0x8F, 0xFE, 0x88, 0xD2, 0x91, 0x15, 0x94, 0x5E, 0xFD, 0xA7, 0x11, 0xC3, 0x1E, 0x94, 0xD0, 0x94, 0x1, 0x2F, 0x1E, 0xEC, 0x1, 0x3B, 0x22, 0x90, 0xCF, 0x95, 0xFE, 0xDB, 0x21, 0xEB, 0xFE, 0xC5, 0x0, 0x2, 0x0, 0x83, 0xFE, 0x60, 0x4, 0x37, 0x6, 0x0, 0x0, 0xB, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x2, 0x4E, 0x83, 0x73, 0x75, 0x83, 0x95, 0x41, 0x43, 0xD9, 0xB0, 0x6C, 0xF3, 0xF3, 0x6B, 0xAF, 0xCE, 0xD9, 0xDA, 0xAF, 0xD3, 0x90, 0x15, 0x92, 0xCF, 0x7B, 0xFE, 0x1F, 0x7D, 0xC3, 0x74, 0xFE, 0x0, 0x7, 0xA0, 0xFD, 0xD8, 0x76, 0xFE, 0xD0, 0xF8, 0x14, 0xEC, 0xFE, 0xC6, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0xB3, 0x6, 0x0, 0x0, 0xB, 0x0, 0x23, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x2, 0x37, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x1, 0x73, 0xB, 0x6C, 0xB7, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xFC, 0xFC, 0xF3, 0xAF, 0xAF, 0xB3, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xB3, 0x70, 0x84, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0xF1, 0xAB, 0x8D, 0x8D, 0xAB, 0xFB, 0x38, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, 0x5, 0x9E, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x17, 0x0, 0x0, 0x1, 0x35, 0x21, 0x15, 0x1, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x4, 0x23, 0xFD, 0x75, 0x2, 0x8B, 0xFD, 0x75, 0xFD, 0x7B, 0x7B, 0xFD, 0x2, 0x8B, 0xFC, 0x7F, 0x7F, 0x3, 0x52, 0xBB, 0xBB, 0xFC, 0xAE, 0x2, 0x88, 0xFD, 0x78, 0x4, 0xD, 0xA1, 0x1, 0x2, 0xFE, 0xFE, 0x1, 0x2, 0xFE, 0xFE, 0xA1, 0xFB, 0xF3, 0x0, 0x1, 0x0, 0x90, 0x0, 0x0, 0x1, 0x83, 0x4, 0x3A, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x83, 0xF3, 0x4, 0x3A, 0xFB, 0xC6, 0x4, 0x3A, 0x0, 0x1, 0x0, 0x8E, 0x0, 0x0, 0x4, 0x6B, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x3, 0x36, 0xFE, 0xB8, 0x6D, 0xF3, 0xF3, 0x54, 0x1, 0x50, 0x1, 0x2D, 0xFE, 0x61, 0x1, 0xB8, 0x1, 0xAD, 0xFE, 0x53, 0x4, 0x3A, 0xFE, 0x51, 0x1, 0xAF, 0xFD, 0xF4, 0xFD, 0xD2, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x4, 0x36, 0x5, 0xB0, 0x0, 0xD, 0x0, 0x0, 0x33, 0x11, 0x7, 0x35, 0x37, 0x11, 0x33, 0x11, 0x37, 0x15, 0x7, 0x11, 0x21, 0x15, 0xA5, 0x83, 0x83, 0xFC, 0xEB, 0xEB, 0x2, 0x95, 0x2, 0x89, 0x28, 0x93, 0x28, 0x2, 0x94, 0xFD, 0xB8, 0x47, 0x93, 0x47, 0xFD, 0xF5, 0xCA, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x2, 0x2F, 0x6, 0x0, 0x0, 0xB, 0x0, 0x0, 0x21, 0x23, 0x11, 0x7, 0x35, 0x37, 0x11, 0x33, 0x11, 0x37, 0x15, 0x7, 0x1, 0x9B, 0xF3, 0x86, 0x86, 0xF3, 0x94, 0x94, 0x2, 0x92, 0x30, 0x92, 0x30, 0x2, 0xDC, 0xFD, 0x7A, 0x35, 0x92, 0x35, 0x0, 0x1, 0x0, 0x90, 0xFE, 0x4B, 0x5, 0x9, 0x5, 0xB0, 0x0, 0x13, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x35, 0x1, 0x11, 0x23, 0x11, 0x33, 0x1, 0x11, 0x33, 0x11, 0x14, 0x6, 0x3, 0xA2, 0x46, 0x3C, 0xE, 0x2A, 0x39, 0x78, 0x3, 0xFD, 0x80, 0xFC, 0xFC, 0x2, 0x80, 0xFD, 0xBF, 0xFE, 0x4B, 0x11, 0xC7, 0xD, 0xA9, 0x41, 0x4, 0x17, 0xFB, 0xE9, 0x5, 0xB0, 0xFB, 0xEC, 0x4, 0x14, 0xFA, 0x17, 0xB9, 0xC3, 0x0, 0x1, 0x0, 0x7F, 0xFE, 0x4B, 0x4, 0x6, 0x4, 0x4E, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x6, 0x2, 0xA6, 0x45, 0x3A, 0xE, 0x26, 0x3D, 0x7A, 0x1, 0x65, 0x60, 0x93, 0x4A, 0xF2, 0xDE, 0xD, 0x71, 0xC6, 0xA1, 0xC3, 0x1, 0xBB, 0xFE, 0x4B, 0x11, 0xC5, 0xC, 0xA9, 0x2, 0xE2, 0x83, 0x65, 0x68, 0xFC, 0xE0, 0x4, 0x3A, 0x96, 0xAA, 0xC4, 0xE3, 0xFD, 0x1A, 0xB6, 0xC0, 0x0, 0x2, 0x0, 0x65, 0xFF, 0xEB, 0x7, 0x2D, 0x5, 0xC5, 0x0, 0xB, 0x0, 0x21, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x14, 0x16, 0x5, 0x6, 0x23, 0x20, 0x0, 0x11, 0x11, 0x10, 0x0, 0x21, 0x32, 0x17, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x2, 0xAB, 0x5B, 0x70, 0x70, 0x5D, 0x9C, 0xB6, 0xB8, 0x1, 0xBC, 0xB0, 0x70, 0xFE, 0xFD, 0xFE, 0xBD, 0x1, 0x41, 0x1, 0x3, 0x72, 0xB0, 0x3, 0x5C, 0xFD, 0x4B, 0x2, 0x56, 0xFD, 0xAA, 0x2, 0xBB, 0xAE, 0xE, 0x4, 0x38, 0xE, 0xC9, 0xC7, 0xFE, 0xCE, 0xC7, 0xCB, 0xAE, 0x15, 0x1, 0x4C, 0x1, 0x9, 0x1, 0x30, 0x1, 0x9, 0x1, 0x4C, 0x15, 0xCB, 0xFE, 0x6D, 0xC7, 0xFE, 0x3F, 0xCA, 0x0, 0x3, 0x0, 0x5B, 0xFF, 0xEB, 0x6, 0xF3, 0x4, 0x4F, 0x0, 0xD, 0x0, 0x15, 0x0, 0x37, 0x0, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x34, 0x26, 0x1, 0x6, 0x6, 0x23, 0x22, 0x26, 0x27, 0x6, 0x6, 0x23, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x17, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x1, 0x4E, 0x76, 0x88, 0x87, 0x76, 0x76, 0x89, 0x87, 0x75, 0x3, 0xE1, 0x5C, 0x74, 0x11, 0x1, 0xB4, 0x63, 0x1, 0x39, 0x35, 0xC6, 0x91, 0x7E, 0xC4, 0x42, 0x3F, 0xC0, 0x7D, 0xEB, 0xFE, 0xFD, 0x3, 0x1, 0x4, 0xEB, 0x7E, 0xC2, 0x3F, 0x40, 0xB9, 0x6D, 0xE2, 0xE2, 0xFD, 0x56, 0xA, 0x87, 0x80, 0x6B, 0x8D, 0x37, 0x2, 0x12, 0x91, 0xD3, 0xD3, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x1, 0x64, 0x93, 0x6F, 0x1A, 0x5F, 0x89, 0xFC, 0xE1, 0x2E, 0x53, 0x5D, 0x52, 0x52, 0x5D, 0x1, 0x36, 0xE7, 0x1F, 0xEC, 0x1, 0x3B, 0x5E, 0x52, 0x53, 0x5E, 0x1, 0xFE, 0xF2, 0xD9, 0x90, 0x7C, 0xAD, 0x37, 0x26, 0x0, 0x1, 0x0, 0x8B, 0x0, 0x0, 0x2, 0x96, 0x6, 0x15, 0x0, 0xC, 0x0, 0x0, 0x21, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x1, 0x7E, 0xF3, 0xC5, 0xAE, 0x3D, 0x5B, 0x19, 0x2A, 0x32, 0xA3, 0x4, 0xA1, 0xB5, 0xBF, 0x15, 0xB9, 0xB, 0xB1, 0xFF, 0xFF, 0x0, 0x1A, 0xFF, 0xEC, 0x4, 0x8B, 0x6, 0x0, 0x0, 0x26, 0x0, 0x47, 0x59, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x8A, 0x2, 0x39, 0x0, 0x3, 0x0, 0x22, 0x0, 0x0, 0x5, 0xA1, 0x5, 0xB0, 0x0, 0x7, 0x0, 0xF, 0x0, 0x2A, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x27, 0x1, 0x11, 0x6, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x34, 0x36, 0x33, 0x31, 0x21, 0x32, 0x4, 0x15, 0x14, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x4, 0x23, 0x2, 0x90, 0xF8, 0x76, 0x85, 0xF2, 0xFE, 0xFF, 0x1, 0x19, 0x7D, 0x7F, 0xE3, 0xFD, 0xD1, 0x5B, 0x48, 0x9, 0xC6, 0x11, 0xBF, 0xB2, 0x1, 0xF2, 0xEE, 0x1, 0xC, 0x6C, 0x67, 0x7D, 0x78, 0xFE, 0xF4, 0xEC, 0x4, 0xE5, 0xFE, 0x67, 0x6B, 0x61, 0xC8, 0x5, 0xFD, 0xAC, 0xFE, 0x39, 0x7C, 0x64, 0xE0, 0x7, 0xFD, 0x6F, 0x4, 0xE5, 0x1, 0x63, 0x4C, 0x25, 0x26, 0x39, 0x49, 0x9E, 0xA6, 0xBE, 0xCC, 0x63, 0xA1, 0x2B, 0x21, 0xBB, 0x72, 0xD0, 0xD9, 0xFF, 0xFF, 0x0, 0x90, 0x0, 0x0, 0x4, 0xC1, 0x5, 0xB0, 0x0, 0x26, 0x2, 0x30, 0xF5, 0x0, 0x0, 0x6, 0x2, 0x7C, 0xFF, 0x0, 0x0, 0x2, 0x0, 0x7D, 0xFF, 0xEC, 0x4, 0x32, 0x6, 0x0, 0x0, 0x11, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x14, 0x2, 0x23, 0x22, 0x27, 0x7, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x36, 0x33, 0x32, 0x12, 0x15, 0x1, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x4, 0x32, 0xD7, 0xCE, 0xBD, 0x6C, 0xB, 0xDC, 0x2, 0xDE, 0xFE, 0x14, 0x6A, 0xB2, 0xD1, 0xD6, 0xFE, 0x1D, 0x87, 0x6A, 0x67, 0x8C, 0x9B, 0x43, 0x44, 0x2, 0x12, 0xEF, 0xFE, 0xC9, 0x8A, 0x76, 0x6, 0x0, 0xAB, 0xFE, 0x7D, 0x7C, 0xFE, 0xCD, 0xF4, 0xFE, 0x8C, 0xCA, 0xAA, 0x8F, 0xD2, 0x8C, 0xFE, 0x44, 0x8D, 0x0, 0x2, 0x0, 0x55, 0x0, 0x0, 0x5, 0x33, 0x5, 0xB0, 0x0, 0xD, 0x0, 0x15, 0x0, 0x0, 0x21, 0x11, 0x27, 0x35, 0x37, 0x33, 0x11, 0x21, 0x16, 0x4, 0x15, 0x14, 0x4, 0x23, 0x25, 0x21, 0x32, 0x36, 0x34, 0x26, 0x23, 0x21, 0x1, 0x2, 0xAD, 0xAD, 0xFD, 0x1, 0x2C, 0xF6, 0x1, 0x12, 0xFE, 0xEC, 0xF8, 0xFE, 0xD8, 0x1, 0x28, 0x8D, 0x82, 0x82, 0x8D, 0xFE, 0xD8, 0x3, 0xC7, 0xBE, 0x6C, 0xBF, 0xFD, 0xD3, 0x1, 0xF3, 0xC9, 0xC8, 0xFE, 0xCA, 0x99, 0xCA, 0x8B, 0x0, 0x2, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0xB2, 0x6, 0x0, 0x0, 0x12, 0x0, 0x1D, 0x0, 0x0, 0x5, 0x22, 0x27, 0x7, 0x23, 0x11, 0x27, 0x35, 0x37, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x2, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x3, 0xC, 0xBC, 0x6C, 0xC, 0xDC, 0xAD, 0xAD, 0xF3, 0x6A, 0xB1, 0xD0, 0xD7, 0x1, 0xD8, 0xFE, 0xF5, 0x86, 0x6A, 0x66, 0x8C, 0x9C, 0x42, 0x43, 0x14, 0x89, 0x75, 0x4, 0x17, 0xBE, 0x6C, 0xBF, 0xFD, 0xD3, 0x7B, 0xFE, 0xD0, 0xF3, 0x19, 0xEF, 0xFE, 0xC9, 0xC7, 0xCA, 0xAA, 0x8F, 0xD2, 0x8B, 0xFE, 0x43, 0x8D, 0x0, 0x1, 0x0, 0x4D, 0xFF, 0xEC, 0x4, 0xD3, 0x5, 0xC4, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x34, 0x2, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x0, 0x21, 0x20, 0x0, 0x13, 0x15, 0x10, 0x0, 0x21, 0x20, 0x0, 0x4D, 0xFC, 0x11, 0x86, 0x9D, 0xAB, 0xAC, 0x1, 0x9C, 0xB1, 0xA3, 0x89, 0x12, 0xFC, 0x14, 0x1, 0x1A, 0x1, 0xC, 0x1, 0xA, 0x1, 0x3D, 0x4, 0xFE, 0xBD, 0xFE, 0xED, 0xFE, 0xFA, 0xFE, 0xEC, 0x1, 0xE1, 0x8B, 0x9E, 0xFB, 0xE4, 0x7D, 0xDA, 0x1, 0xA, 0x96, 0x8C, 0xD4, 0x1, 0x1A, 0xFE, 0x92, 0xFE, 0xCD, 0x85, 0xFE, 0xC5, 0xFE, 0x89, 0x1, 0x1B, 0x0, 0x1, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xEF, 0x6, 0x4, 0x0, 0x25, 0x0, 0x0, 0x1, 0x6, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x37, 0x4, 0xEB, 0x13, 0xFE, 0xE5, 0xFE, 0xF4, 0xFE, 0xF3, 0xFE, 0xC2, 0x1, 0x44, 0x1, 0x13, 0xF1, 0x90, 0x4A, 0xE5, 0x44, 0x3E, 0x21, 0x2A, 0x4C, 0x6C, 0xFC, 0x10, 0x87, 0x9C, 0xAB, 0xAC, 0x1, 0x9B, 0xB1, 0xA3, 0x89, 0x12, 0x1, 0xDA, 0xD4, 0xFE, 0xE6, 0x1, 0x76, 0x1, 0x3B, 0x76, 0x1, 0x3A, 0x1, 0x77, 0x81, 0xC1, 0x11, 0xC9, 0x8, 0x40, 0x64, 0xBF, 0x8C, 0x9D, 0xFA, 0xE4, 0x7D, 0xDA, 0xFE, 0xF5, 0x97, 0x8B, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0xD3, 0x4, 0x99, 0x0, 0x25, 0x0, 0x0, 0x1, 0x6, 0x4, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x3, 0xF5, 0x4, 0xFF, 0x0, 0xB5, 0xFA, 0xF2, 0xF3, 0xF9, 0xB2, 0x76, 0x3A, 0xC6, 0x3C, 0x33, 0x1D, 0x23, 0x41, 0x5D, 0xE4, 0x5, 0x70, 0x63, 0x94, 0x63, 0x62, 0x96, 0x58, 0x7A, 0x5, 0x1, 0x66, 0x9D, 0xDD, 0x1, 0x40, 0xDF, 0x24, 0xDE, 0x1, 0x41, 0x60, 0xAB, 0xF, 0xA3, 0x7, 0x3E, 0x56, 0xA3, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x83, 0xD9, 0x68, 0x4F, 0xFF, 0xFF, 0x0, 0x21, 0x0, 0x0, 0x5, 0x1E, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x29, 0x4C, 0x0, 0x0, 0x6, 0x7, 0xA4, 0x91, 0x0, 0x0, 0x2, 0x0, 0x22, 0x0, 0x0, 0x5, 0xD1, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x12, 0x37, 0x35, 0x34, 0x26, 0x23, 0x1, 0x11, 0x6, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x10, 0x21, 0x31, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x2, 0x90, 0xA6, 0xCC, 0xD0, 0x2, 0xCF, 0xC4, 0xFE, 0x53, 0x5C, 0x48, 0x9, 0xC6, 0x11, 0x1, 0x72, 0x1, 0xAD, 0x1, 0x25, 0x1, 0x6B, 0xFE, 0x93, 0xFE, 0xD2, 0x4, 0xE5, 0xFB, 0xE5, 0x1, 0x0, 0xE1, 0x53, 0xEC, 0xFB, 0xFB, 0x1B, 0x4, 0xE5, 0x1, 0x62, 0x4D, 0x25, 0x26, 0x39, 0x49, 0x1, 0x44, 0xFE, 0x87, 0xFE, 0xC5, 0x49, 0xFE, 0xC5, 0xFE, 0x88, 0x0, 0x2, 0x0, 0x4E, 0x0, 0x0, 0x4, 0x7F, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x14, 0x0, 0x0, 0x21, 0x21, 0x26, 0x24, 0x35, 0x34, 0x24, 0x33, 0x21, 0x11, 0x21, 0x35, 0x21, 0x3, 0x11, 0x21, 0x22, 0x6, 0x14, 0x16, 0x33, 0x4, 0x7F, 0xFD, 0xD7, 0xF6, 0xFE, 0xEE, 0x1, 0x14, 0xF8, 0x1, 0x29, 0xFD, 0x60, 0x3, 0x9C, 0xFC, 0xFE, 0xD7, 0x8D, 0x82, 0x82, 0x8D, 0x1, 0xFE, 0xC7, 0xCA, 0xF3, 0x1, 0x62, 0xCB, 0xFB, 0x1A, 0x1, 0xEE, 0x8B, 0xCA, 0x99, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x4, 0x6, 0x0, 0x0, 0xB, 0x0, 0x1D, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x21, 0x35, 0x21, 0x11, 0x2, 0x37, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x1, 0x73, 0xB, 0x6C, 0xB7, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xFE, 0x15, 0x2, 0xDE, 0xB3, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xB3, 0x70, 0x84, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x1, 0x7E, 0xAB, 0xFA, 0x0, 0x0, 0x2, 0x0, 0x53, 0xFE, 0x88, 0x4, 0x34, 0x4, 0x4D, 0x0, 0x15, 0x0, 0x25, 0x0, 0x0, 0x1, 0x21, 0x35, 0x21, 0x26, 0x27, 0x26, 0x2, 0x35, 0x35, 0x34, 0x0, 0x20, 0x0, 0x15, 0x15, 0x14, 0x2, 0x7, 0x7, 0x16, 0x17, 0x3, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x3, 0xB0, 0xFD, 0x14, 0x1, 0xAC, 0x31, 0x8A, 0x99, 0xC9, 0x1, 0x3, 0x1, 0xDA, 0x1, 0x4, 0xE9, 0xC4, 0x21, 0xEA, 0x60, 0x6F, 0x75, 0x89, 0x87, 0x76, 0x66, 0x42, 0x1D, 0x2D, 0x8E, 0x7B, 0xFE, 0x88, 0xC1, 0x31, 0x70, 0x82, 0x1, 0x10, 0xA9, 0x15, 0xE3, 0x1, 0x30, 0xFE, 0xD8, 0xDD, 0x15, 0xBE, 0xFE, 0xF3, 0x1B, 0x2, 0xCF, 0x6B, 0x3, 0x29, 0x8A, 0xC6, 0xC6, 0x8A, 0x15, 0x73, 0xA9, 0x2B, 0x8, 0xC8, 0x87, 0x0, 0x1, 0x0, 0x3A, 0x0, 0x0, 0x3, 0xF2, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x33, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x41, 0x2, 0xB4, 0xFD, 0xAA, 0x2, 0x56, 0xFD, 0x45, 0x3, 0xB8, 0xCB, 0x1, 0x93, 0xC7, 0x1, 0xC1, 0xCA, 0xFA, 0x50, 0x0, 0x2, 0x0, 0x51, 0xFF, 0xEC, 0x5, 0x1E, 0x5, 0xC4, 0x0, 0x16, 0x0, 0x1E, 0x0, 0x0, 0x5, 0x20, 0x0, 0x11, 0x35, 0x21, 0x26, 0x2, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x20, 0x0, 0x11, 0x15, 0x14, 0x2, 0x4, 0x27, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, 0x16, 0x2, 0xB8, 0xFE, 0xD0, 0xFE, 0xC9, 0x3, 0xD1, 0x3, 0xC6, 0xE7, 0x83, 0xB6, 0x39, 0x31, 0x20, 0xE4, 0xA6, 0x1, 0x49, 0x1, 0x5C, 0xA4, 0xFE, 0xEA, 0xAC, 0xA1, 0xB7, 0xF, 0xFD, 0x2F, 0xA0, 0x14, 0x1, 0x6E, 0x1, 0x36, 0x8E, 0xC1, 0x1, 0xF, 0x30, 0x16, 0xC5, 0x13, 0x44, 0xFE, 0x7D, 0xFE, 0xCF, 0x75, 0xCB, 0xFE, 0xCA, 0xAE, 0xD5, 0xEB, 0xAC, 0x1F, 0x9D, 0xDB, 0x0, 0x1, 0x0, 0x57, 0xFF, 0xEB, 0x4, 0x8D, 0x5, 0xC5, 0x0, 0x28, 0x0, 0x0, 0x1, 0x14, 0x6, 0x6, 0x23, 0x22, 0x24, 0x35, 0x34, 0x37, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x4, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x4, 0x8D, 0x9C, 0xF2, 0x80, 0xEE, 0xFE, 0xC6, 0xF9, 0x69, 0x7A, 0x1, 0x23, 0xEF, 0xCE, 0x1, 0x2B, 0xFC, 0x8F, 0x6E, 0x92, 0x83, 0x77, 0x8E, 0xAA, 0xAA, 0x8D, 0x8E, 0xA3, 0x88, 0x7F, 0x93, 0x1, 0x94, 0x95, 0xBC, 0x58, 0xCA, 0xE3, 0xF9, 0x59, 0x2C, 0xA1, 0x6E, 0xCC, 0xD4, 0xDA, 0xBD, 0x5D, 0x6E, 0x7A, 0x5A, 0x62, 0x79, 0xC7, 0x6E, 0x7D, 0x75, 0x6D, 0x80, 0x5E, 0x0, 0x1, 0x0, 0x0, 0xFE, 0x4B, 0x4, 0x84, 0x5, 0xB0, 0x0, 0x12, 0x0, 0x0, 0x13, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x6, 0x7F, 0x45, 0x3A, 0xE, 0x32, 0x2D, 0x7B, 0x3, 0x9C, 0xFD, 0x60, 0x2, 0x4A, 0xFD, 0xB6, 0xC0, 0xFE, 0x4B, 0x11, 0xCD, 0xD, 0xA5, 0x5, 0xEF, 0xCB, 0xFE, 0x4E, 0xCA, 0xFD, 0x58, 0xB6, 0xC0, 0x0, 0x1, 0xFF, 0xE4, 0xFE, 0x4B, 0x2, 0xD3, 0x6, 0x15, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x15, 0x23, 0x11, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x23, 0x35, 0x33, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x2, 0x84, 0xC8, 0xB8, 0xA1, 0x45, 0x3A, 0xE, 0x21, 0x3E, 0x77, 0x1, 0xA5, 0xA5, 0x2, 0x5B, 0x63, 0xB2, 0x3F, 0x59, 0x18, 0x2B, 0x37, 0x9B, 0x2, 0x4, 0x3A, 0xB3, 0xFC, 0x33, 0xB2, 0xBD, 0x11, 0xBF, 0xD, 0xA9, 0x3, 0xD0, 0xB3, 0x6E, 0xAB, 0x5D, 0x65, 0x15, 0xBC, 0xA, 0xA9, 0x6B, 0x0, 0x1, 0x0, 0x6A, 0xFF, 0xEC, 0x5, 0xF3, 0x6, 0x4, 0x0, 0x29, 0x0, 0x0, 0x25, 0x6, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x37, 0x11, 0x21, 0x35, 0x21, 0x4, 0xF0, 0x2E, 0xF5, 0xF5, 0xFE, 0xED, 0xFE, 0xA5, 0x1, 0x3E, 0x1, 0x1A, 0xF6, 0x8F, 0x4A, 0xE0, 0x46, 0x3C, 0x24, 0x26, 0x4C, 0x6C, 0xF9, 0x13, 0x8A, 0x95, 0xB0, 0xAB, 0x2, 0xC8, 0xAF, 0x83, 0x77, 0x1A, 0xFE, 0xD5, 0x2, 0x27, 0xBE, 0x3D, 0x95, 0x1, 0x6E, 0x1, 0x4E, 0x5F, 0x1, 0x4E, 0x1, 0x6F, 0x7A, 0xBA, 0x11, 0xC5, 0x9, 0x45, 0x64, 0x9B, 0x71, 0x95, 0xFE, 0xE8, 0x6B, 0xF0, 0xFE, 0xFE, 0x3C, 0x1C, 0x1, 0x1E, 0xBF, 0x0, 0x2, 0x0, 0x18, 0xFE, 0x4B, 0x5, 0x19, 0x5, 0xB0, 0x0, 0x11, 0x0, 0x18, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x16, 0x16, 0x15, 0x14, 0x6, 0x26, 0x35, 0x34, 0x27, 0x6, 0x15, 0x14, 0x2, 0x98, 0x88, 0xAE, 0x74, 0x49, 0xFD, 0xF9, 0x1, 0x1D, 0x1, 0x61, 0x1, 0x65, 0x1, 0x1E, 0xFD, 0xF7, 0x47, 0x73, 0xAB, 0x48, 0x3F, 0x3F, 0xFE, 0x4B, 0x81, 0x81, 0x42, 0xF8, 0xAA, 0x4, 0x7F, 0xFC, 0xA2, 0x3, 0x5E, 0xFB, 0x7C, 0xA7, 0xF6, 0x42, 0x81, 0x81, 0xBC, 0x4B, 0x3E, 0x92, 0x93, 0x3D, 0x4B, 0x0, 0x1, 0x0, 0x7A, 0xFF, 0xEC, 0x6, 0x43, 0x6, 0x0, 0x0, 0x1E, 0x0, 0x0, 0x5, 0x22, 0x26, 0x27, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x16, 0x16, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x6, 0x6, 0x4, 0xA5, 0xCA, 0xD3, 0x2, 0x4A, 0x75, 0x93, 0x48, 0xF2, 0xF2, 0x76, 0xB7, 0xD0, 0x90, 0x1, 0x67, 0x88, 0x67, 0xF3, 0x2, 0xD3, 0x14, 0xD1, 0xEE, 0x1, 0x7, 0x5F, 0x77, 0x83, 0xFC, 0xFB, 0x6, 0x0, 0xFD, 0xC3, 0x8B, 0xF2, 0xAA, 0xFE, 0xFA, 0x90, 0x69, 0x6B, 0x94, 0x2, 0x88, 0xFD, 0x71, 0xEE, 0xD1, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x2, 0xB2, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2E, 0x3F, 0x0, 0x0, 0x6, 0x7, 0xA4, 0x84, 0x0, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x5, 0xC4, 0x0, 0x16, 0x0, 0x0, 0x21, 0x1, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x13, 0x36, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, 0x3, 0x1, 0x3, 0xEC, 0xFE, 0x4D, 0xA8, 0xFC, 0xFC, 0x8D, 0xE8, 0x4C, 0x83, 0x6A, 0x6F, 0x68, 0x59, 0x2C, 0x32, 0x20, 0x33, 0x3A, 0xF7, 0x2, 0x3D, 0x2, 0x72, 0xBC, 0xFE, 0x4A, 0x5, 0xB0, 0xFD, 0x45, 0xBD, 0x1, 0x2D, 0x67, 0x7E, 0x45, 0xB1, 0x1B, 0x26, 0x4D, 0xFE, 0xB9, 0xFC, 0xD1, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x4, 0x37, 0x6, 0x15, 0x0, 0x16, 0x0, 0x0, 0x21, 0x1, 0x7, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x37, 0x1, 0x21, 0x1, 0x1, 0x3, 0x1E, 0xFE, 0xBF, 0x6D, 0xF3, 0xBB, 0x9A, 0x4C, 0x2F, 0x1D, 0x23, 0x40, 0x5D, 0x4D, 0x1, 0x2B, 0x1, 0x24, 0xFE, 0x6D, 0x1, 0xBE, 0x1, 0xD2, 0x70, 0xFE, 0x9E, 0x4, 0xD6, 0x9D, 0xA2, 0xF, 0xA3, 0x7, 0x3E, 0x56, 0xFD, 0xB4, 0x60, 0x1, 0x50, 0xFE, 0x3E, 0xFD, 0x88, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x2, 0xB2, 0x6, 0x0, 0x0, 0x26, 0x0, 0x51, 0x5C, 0x0, 0x0, 0x6, 0x7, 0xA4, 0x84, 0x4A, 0x0, 0x1, 0x0, 0x16, 0xFF, 0xEE, 0x4, 0x4A, 0x5, 0xFC, 0x0, 0x1E, 0x0, 0x0, 0x5, 0x22, 0x26, 0x27, 0x3, 0x3, 0x21, 0x1, 0x27, 0x7, 0x35, 0x37, 0x26, 0x23, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x17, 0x17, 0x37, 0x15, 0x7, 0x1, 0x16, 0x33, 0x37, 0x17, 0x6, 0x3, 0xEC, 0x65, 0x79, 0x2D, 0xCA, 0xF8, 0xFE, 0xF7, 0x1, 0x82, 0x17, 0xBC, 0x79, 0x26, 0x4F, 0x35, 0x3, 0x31, 0x51, 0x6B, 0x77, 0x1F, 0xD, 0xB1, 0x72, 0x1, 0x61, 0x26, 0x3D, 0x23, 0x3, 0x28, 0x12, 0x51, 0x73, 0x2, 0x18, 0xFD, 0x36, 0x4, 0x11, 0x38, 0x43, 0xB6, 0x2B, 0x51, 0x2, 0xB5, 0x11, 0x54, 0x4E, 0x22, 0x3F, 0xB6, 0x29, 0xFC, 0x7D, 0x5E, 0x2, 0xC2, 0x9, 0x0, 0x1, 0x0, 0x99, 0xFF, 0xEC, 0x6, 0xA6, 0x5, 0xB0, 0x0, 0x1E, 0x0, 0x0, 0x21, 0x27, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x3, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x5, 0xC7, 0xA, 0x6C, 0xC6, 0xE8, 0x4F, 0x6C, 0xEA, 0xA1, 0xC3, 0x1, 0xF3, 0x67, 0x44, 0xBA, 0x39, 0x4, 0xF3, 0x67, 0x44, 0xB6, 0x39, 0xF3, 0x74, 0x88, 0xB9, 0xB9, 0xC1, 0x1, 0x1, 0x4, 0x2, 0xFC, 0x2, 0x94, 0x6B, 0xA7, 0x43, 0x4, 0x13, 0xFC, 0x2, 0x94, 0x6B, 0x9C, 0x4, 0x61, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x0, 0xFE, 0x4B, 0x5, 0x6B, 0x5, 0xB0, 0x0, 0x12, 0x0, 0x0, 0x13, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x33, 0x1, 0x11, 0x33, 0x11, 0x23, 0x1, 0x11, 0x14, 0x6, 0x7F, 0x45, 0x3A, 0xE, 0x32, 0x2D, 0x7B, 0xFC, 0x2, 0x8C, 0xFB, 0xFD, 0xFD, 0x76, 0xC0, 0xFE, 0x4B, 0x11, 0xCD, 0xD, 0xA5, 0x5, 0xEF, 0xFB, 0xF4, 0x4, 0xC, 0xFA, 0x50, 0x4, 0x9, 0xFB, 0xB8, 0xB6, 0xC0, 0x0, 0x2, 0x0, 0x58, 0xFF, 0xEC, 0x5, 0xAA, 0x6, 0x2E, 0x0, 0x14, 0x0, 0x22, 0x0, 0x0, 0x5, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x32, 0x17, 0x36, 0x36, 0x35, 0x33, 0x10, 0x7, 0x16, 0x17, 0x15, 0x10, 0x0, 0x13, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x2, 0xB6, 0xFE, 0xF6, 0xFE, 0xAC, 0x1, 0x52, 0x1, 0xA, 0xFF, 0xA2, 0x55, 0x45, 0xBB, 0xF4, 0x59, 0x1, 0xFE, 0xB5, 0x4F, 0xB9, 0xA7, 0xA3, 0xBC, 0xBE, 0xA3, 0xA7, 0xB7, 0x14, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xA7, 0xD, 0x8F, 0x75, 0xFE, 0xAF, 0x47, 0xAA, 0xEB, 0x4E, 0xFE, 0xB4, 0xFE, 0x85, 0x3, 0x12, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0x0, 0x2, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0xBC, 0x4, 0xA9, 0x0, 0x14, 0x0, 0x22, 0x0, 0x0, 0x5, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x32, 0x17, 0x36, 0x36, 0x35, 0x33, 0x10, 0x7, 0x16, 0x15, 0x15, 0x14, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x2, 0x47, 0xEB, 0xFE, 0xF7, 0x4, 0x1, 0xA, 0xEC, 0xE3, 0x87, 0x3F, 0x26, 0xA8, 0xC0, 0x41, 0xFE, 0xF7, 0xFE, 0xE, 0x7D, 0x88, 0x87, 0x7D, 0x7D, 0x89, 0x87, 0x7C, 0x14, 0x1, 0x33, 0xE6, 0x22, 0xEC, 0x1, 0x3B, 0x94, 0x16, 0x7D, 0x5C, 0xFE, 0xE5, 0x43, 0x7F, 0xA5, 0x15, 0xEB, 0xFE, 0xC5, 0x2, 0x26, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x0, 0x2, 0x0, 0x66, 0xFE, 0x60, 0x6, 0x69, 0x5, 0xC4, 0x0, 0x13, 0x0, 0x21, 0x0, 0x0, 0x1, 0x23, 0x11, 0x7, 0x11, 0x6, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x32, 0x16, 0x17, 0x25, 0x33, 0x1, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x12, 0x6, 0x69, 0xF2, 0x91, 0x2E, 0xF1, 0xF5, 0xFE, 0xF0, 0xFE, 0xA4, 0x1, 0x5B, 0x1, 0x11, 0xB3, 0xDD, 0x3E, 0x1, 0x10, 0xB9, 0xFC, 0x76, 0x83, 0x77, 0x1B, 0x1E, 0x7A, 0x83, 0xB1, 0xC5, 0xBE, 0xFE, 0x60, 0x6, 0x46, 0x3B, 0xFC, 0x54, 0x3D, 0x96, 0x1, 0x68, 0x1, 0x54, 0x61, 0x1, 0x4C, 0x1, 0x6F, 0x56, 0x34, 0x76, 0xFB, 0x6, 0x3F, 0x1C, 0x3, 0x8E, 0x20, 0x3B, 0xFF, 0xF2, 0x61, 0xE5, 0xFE, 0xF3, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x60, 0x5, 0x1B, 0x4, 0x4E, 0x0, 0x13, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x23, 0x11, 0x7, 0x11, 0x6, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x37, 0x33, 0x1, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x1B, 0xF3, 0x70, 0x3A, 0xBC, 0x86, 0xFA, 0xF2, 0xF3, 0xF9, 0x6B, 0xA6, 0x38, 0xE4, 0xB2, 0xFD, 0x1F, 0x53, 0x38, 0x38, 0x54, 0x94, 0x63, 0x78, 0xFE, 0x60, 0x4, 0xB3, 0x39, 0xFD, 0xCA, 0x4F, 0x69, 0x1, 0x40, 0xDF, 0x24, 0xDE, 0x1, 0x41, 0x4C, 0x37, 0x6F, 0xFC, 0x75, 0x2D, 0x2, 0x7C, 0x33, 0xDB, 0x81, 0x24, 0x9F, 0xBD, 0x0, 0x2, 0x0, 0x22, 0x0, 0x0, 0x5, 0xD2, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x1, 0x11, 0x23, 0x11, 0x6, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x34, 0x36, 0x33, 0x31, 0x21, 0x32, 0x0, 0x15, 0x14, 0x4, 0x23, 0x2, 0x90, 0x1, 0x30, 0x93, 0x81, 0x81, 0x93, 0xFE, 0xD0, 0xFD, 0x5B, 0x48, 0x9, 0xC6, 0x11, 0xBF, 0xB2, 0x2, 0x2D, 0xFE, 0x1, 0x14, 0xFE, 0xEC, 0xFE, 0x4, 0xE5, 0xFE, 0x3, 0x8A, 0x6D, 0x66, 0xA0, 0xFD, 0x38, 0xFD, 0xE3, 0x4, 0xE5, 0x1, 0x63, 0x4C, 0x25, 0x26, 0x39, 0x49, 0x9E, 0xA6, 0xFE, 0xFA, 0xC9, 0xD3, 0xF1, 0x0, 0x2, 0x0, 0x7D, 0xFE, 0x60, 0x4, 0x31, 0x5, 0x72, 0x0, 0xB, 0x0, 0x26, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x31, 0x36, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x2, 0x48, 0x83, 0x73, 0x75, 0x83, 0x96, 0x41, 0x43, 0xDA, 0xB1, 0x6C, 0xF2, 0x3, 0xD4, 0x7D, 0x49, 0x33, 0x25, 0x1B, 0x41, 0x5D, 0x6B, 0xB0, 0xCE, 0xD9, 0xDA, 0xAF, 0xD3, 0x90, 0x15, 0x92, 0xCF, 0x7D, 0xFE, 0x23, 0x7F, 0xC3, 0x75, 0xFD, 0xFF, 0x5, 0xDA, 0xAF, 0x89, 0xF, 0xA2, 0x7, 0x3F, 0x56, 0x5C, 0x77, 0xFE, 0xD0, 0xF8, 0x14, 0xEC, 0xFE, 0xC6, 0x0, 0x2, 0x0, 0x95, 0xFE, 0x9C, 0x5, 0x9A, 0x6, 0x18, 0x0, 0x10, 0x0, 0x19, 0x0, 0x0, 0x1, 0x21, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x15, 0x21, 0x16, 0x4, 0x15, 0x14, 0x6, 0x7, 0x1, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x5, 0x9A, 0xFE, 0xF1, 0xFE, 0x22, 0xFE, 0xE4, 0xFC, 0xFC, 0x1, 0x11, 0xF5, 0x1, 0xB, 0x8E, 0x7D, 0x2, 0x3, 0xFB, 0xF7, 0x1, 0x4, 0x88, 0x89, 0x80, 0x8D, 0xFE, 0x9C, 0x3, 0x95, 0xFD, 0xCF, 0x6, 0x18, 0x68, 0x3, 0xE0, 0xD4, 0x92, 0xC6, 0x34, 0xFC, 0x3C, 0x6, 0x3C, 0xFE, 0x17, 0x89, 0x68, 0x70, 0x87, 0x1, 0x0, 0x1, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0x8A, 0x5, 0xC4, 0x0, 0x24, 0x0, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x14, 0x6, 0x4, 0x23, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x0, 0x33, 0x32, 0x4, 0x10, 0x4, 0x4, 0x6, 0x1, 0x47, 0x86, 0x83, 0x86, 0xB7, 0xFD, 0xA8, 0xFE, 0xFA, 0x8C, 0xEC, 0xFE, 0xE6, 0xEC, 0xFB, 0x9A, 0x95, 0x7F, 0x86, 0x8D, 0x86, 0xFC, 0x1, 0x16, 0xF7, 0xE7, 0x1, 0x1D, 0xFE, 0xF7, 0xFE, 0x66, 0x73, 0x1, 0x78, 0x58, 0x6C, 0x7A, 0x8A, 0x99, 0xCD, 0x66, 0xD6, 0xB8, 0xAD, 0xD9, 0x49, 0x2D, 0x6B, 0x51, 0x56, 0x73, 0x89, 0x6B, 0xB6, 0x1, 0x7, 0xE3, 0xFE, 0xA0, 0xCA, 0x7F, 0x69, 0x0, 0x1, 0x0, 0x57, 0xFF, 0xEC, 0x3, 0xD6, 0x4, 0x4E, 0x0, 0x25, 0x0, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x6, 0x6, 0x1, 0x46, 0x65, 0x5F, 0x51, 0x8A, 0x5, 0xEC, 0xEA, 0xDF, 0xC7, 0xEF, 0xD4, 0xBC, 0x83, 0x5B, 0x58, 0x5C, 0x5F, 0x60, 0xF3, 0xE7, 0xCA, 0xC1, 0xE1, 0xD8, 0xB2, 0x8E, 0x54, 0x1, 0x26, 0x3A, 0x4A, 0x50, 0x64, 0x86, 0xE4, 0xB8, 0x90, 0x91, 0x92, 0x28, 0x1C, 0x40, 0x35, 0x36, 0x52, 0x63, 0x3F, 0x92, 0xC6, 0xC3, 0x85, 0x88, 0x94, 0x25, 0x1E, 0x4C, 0xFF, 0xFF, 0x0, 0x48, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0x6, 0x2, 0x36, 0x0, 0x0, 0x0, 0x2, 0x0, 0x1B, 0xFE, 0x5E, 0x3, 0xD0, 0x6, 0x1F, 0x0, 0x15, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x20, 0x3, 0x11, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x33, 0x32, 0x37, 0x15, 0x6, 0x1, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x6, 0x14, 0x16, 0x3, 0x4F, 0xFE, 0xC4, 0x8, 0x3D, 0x42, 0x99, 0xD8, 0xD8, 0x99, 0x98, 0xDA, 0x88, 0x26, 0x24, 0x3C, 0xFD, 0xF9, 0x3E, 0x56, 0x56, 0x3E, 0x40, 0x57, 0x57, 0xFE, 0x5E, 0x1, 0x64, 0x3, 0x91, 0x16, 0xD8, 0x98, 0x99, 0xD9, 0xD9, 0x99, 0xFB, 0x27, 0xAE, 0x9, 0xC0, 0x11, 0x5, 0xB4, 0x4F, 0x9C, 0x50, 0x50, 0x9C, 0x4F, 0x0, 0x1, 0x0, 0x8, 0xFE, 0x84, 0x2, 0x73, 0x5, 0x41, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x26, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x2, 0x1, 0x5E, 0x3C, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0x77, 0x9A, 0xB3, 0xB3, 0xF2, 0xBF, 0xBF, 0x40, 0x31, 0x2A, 0x2B, 0x6, 0xFE, 0x84, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x28, 0x2, 0x89, 0xA5, 0x2, 0x6B, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0xFD, 0xA3, 0x49, 0x2B, 0xA, 0xFE, 0xF7, 0xFE, 0xCD, 0x0, 0x1, 0x0, 0x1E, 0x0, 0x0, 0x5, 0x25, 0x5, 0xB0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x10, 0x25, 0x21, 0x5, 0x25, 0xFE, 0x3A, 0xFB, 0xD0, 0x5E, 0x49, 0x8, 0xC6, 0x11, 0x1, 0x64, 0x3, 0xA3, 0x4, 0xE5, 0xFB, 0x1B, 0x4, 0xE5, 0x63, 0x4D, 0x23, 0x28, 0x3E, 0x44, 0x1, 0x3C, 0x8, 0x0, 0x1, 0x0, 0x13, 0xFF, 0xEC, 0x2, 0x95, 0x6, 0x1F, 0x0, 0x1F, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x7D, 0x43, 0x5D, 0x79, 0x9F, 0xB2, 0xB2, 0x1, 0xD5, 0x7E, 0x49, 0x33, 0x25, 0x1B, 0x40, 0x5D, 0xBF, 0xBF, 0x3F, 0x31, 0x2A, 0x2B, 0x4, 0x18, 0x95, 0xAF, 0x2, 0x57, 0xB3, 0xA9, 0xB1, 0x8B, 0xF, 0xA2, 0x7, 0x3F, 0x56, 0xA6, 0xB3, 0xFD, 0xB7, 0x51, 0x37, 0xA, 0x0, 0x1, 0x0, 0x2D, 0xFE, 0x4B, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x14, 0x33, 0x32, 0x37, 0x3, 0xCF, 0x3A, 0x45, 0xA4, 0xBD, 0xFE, 0x3E, 0x4, 0x83, 0xFE, 0x3B, 0x74, 0x31, 0x31, 0xFE, 0x5C, 0x11, 0xC0, 0xB6, 0x5, 0x24, 0xCB, 0xCB, 0xFA, 0xDC, 0xA9, 0xD, 0x0, 0x1, 0x0, 0x7E, 0xFF, 0xEC, 0x6, 0x3D, 0x6, 0x1, 0x0, 0x19, 0x0, 0x0, 0x5, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x15, 0x36, 0x36, 0x35, 0x33, 0x14, 0x6, 0x7, 0x11, 0x14, 0x4, 0x2, 0x9D, 0xE9, 0xFE, 0xCA, 0xFB, 0x9F, 0x85, 0x87, 0x9D, 0xFD, 0x7F, 0x4C, 0xB4, 0xAA, 0xD5, 0xFE, 0xC2, 0x14, 0xFD, 0xFA, 0x3, 0xCD, 0xFC, 0x33, 0x9C, 0x91, 0x91, 0x9C, 0x3, 0xCD, 0xDB, 0xB, 0x9B, 0x86, 0xD0, 0xE8, 0xB, 0xFD, 0xA5, 0xFA, 0xFD, 0x0, 0x1, 0x0, 0x77, 0xFF, 0xEC, 0x5, 0x29, 0x4, 0x94, 0x0, 0x19, 0x0, 0x0, 0x21, 0x27, 0x6, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x15, 0x36, 0x36, 0x35, 0x33, 0x14, 0x6, 0x7, 0x11, 0x3, 0x12, 0x6, 0x6A, 0xC6, 0x9E, 0xC6, 0x1, 0xF3, 0x67, 0x45, 0xAE, 0x40, 0xF3, 0x65, 0x2B, 0xA2, 0x82, 0xB0, 0x6A, 0x7E, 0xBA, 0xD5, 0x2, 0xBF, 0xFD, 0x43, 0x75, 0x55, 0x7D, 0x3, 0xA, 0x88, 0xB, 0x6E, 0x69, 0xA4, 0xB2, 0xB, 0xFC, 0xCD, 0x0, 0x1, 0x0, 0x70, 0xFF, 0xEB, 0x4, 0xE2, 0x5, 0xB0, 0x0, 0x22, 0x0, 0x0, 0x4, 0x0, 0x11, 0x35, 0x34, 0x12, 0x37, 0x23, 0x35, 0x21, 0x15, 0x6, 0x2, 0x7, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x2, 0x27, 0x35, 0x21, 0x15, 0x23, 0x16, 0x12, 0x15, 0x15, 0x10, 0x0, 0x1, 0xAE, 0xFE, 0xC2, 0x7D, 0x67, 0xD6, 0x1, 0xF1, 0x6D, 0x81, 0x2, 0xA1, 0x8B, 0x89, 0xA0, 0x85, 0x71, 0x1, 0xF9, 0xD9, 0x66, 0x7E, 0xFE, 0xC6, 0x15, 0x1, 0x5E, 0x1, 0x15, 0x63, 0xA1, 0x1, 0x21, 0x62, 0xCB, 0xD1, 0x1D, 0xFE, 0xFD, 0xEE, 0x75, 0xD0, 0xD5, 0xD5, 0xD0, 0x65, 0xFA, 0x1, 0x8, 0x1C, 0xD1, 0xCB, 0x62, 0xFE, 0xDF, 0xA1, 0x63, 0xFE, 0xEB, 0xFE, 0xA2, 0x0, 0x1, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x5, 0xC4, 0x0, 0x1B, 0x0, 0x0, 0x5, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x4, 0x2, 0x9E, 0xEA, 0xFE, 0xCA, 0xFC, 0x9E, 0x86, 0x87, 0x9C, 0x4B, 0x4D, 0x23, 0x28, 0x3E, 0x44, 0x9E, 0xC0, 0xFE, 0xC2, 0x14, 0xFD, 0xFA, 0x3, 0xCD, 0xFC, 0x33, 0x9C, 0x91, 0x91, 0x9C, 0x2, 0x6B, 0x5F, 0x48, 0x8, 0xC6, 0x11, 0xC0, 0xB6, 0xFD, 0x95, 0xFA, 0xFD, 0x0, 0x1, 0x0, 0x8, 0x0, 0x0, 0x5, 0x6D, 0x5, 0xC4, 0x0, 0x12, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x21, 0x1, 0x13, 0x36, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, 0x3, 0x2, 0xEF, 0xFE, 0xFE, 0x17, 0x1, 0x1A, 0x1, 0x4E, 0xA4, 0x71, 0x8F, 0x72, 0x82, 0x65, 0x59, 0x2C, 0x32, 0x3F, 0x4C, 0x41, 0xFB, 0x2, 0x18, 0x3, 0x98, 0xFD, 0x4D, 0x1, 0x51, 0xE8, 0x8E, 0x45, 0xB1, 0x1B, 0x7D, 0x7C, 0xFE, 0x27, 0x0, 0x1, 0x0, 0xC, 0xFE, 0x4B, 0x4, 0xDD, 0x5, 0x52, 0x0, 0x1C, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x37, 0x37, 0x1, 0x21, 0x13, 0x17, 0x13, 0x3E, 0x2, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, 0x1, 0x2, 0x7, 0xD9, 0x23, 0x52, 0x2E, 0x56, 0x5D, 0x1F, 0x25, 0xFE, 0x83, 0x1, 0x7, 0xD1, 0x11, 0xD0, 0x19, 0x43, 0x7B, 0x6B, 0x77, 0x5F, 0x37, 0x3E, 0x2E, 0x38, 0x44, 0x27, 0xFE, 0x95, 0x59, 0xD8, 0xFE, 0x4B, 0x11, 0xBC, 0x3, 0x3D, 0x51, 0x62, 0x4, 0x35, 0xFD, 0x63, 0x4E, 0x2, 0xA9, 0x50, 0xA0, 0x6A, 0x4E, 0x95, 0x20, 0x6B, 0x76, 0xFB, 0xBA, 0xFE, 0xF4, 0x10, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x4, 0x8C, 0x5, 0xB0, 0x0, 0x11, 0x0, 0x0, 0x33, 0x35, 0x1, 0x21, 0x35, 0x21, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0x21, 0x1, 0x21, 0x15, 0x50, 0x1, 0x53, 0xFE, 0xDD, 0x1, 0x99, 0x1, 0x29, 0xFD, 0x14, 0x4, 0x1E, 0xFE, 0xBB, 0x1, 0x1A, 0xFE, 0x71, 0xFE, 0xC8, 0x3, 0xA, 0xA4, 0x1, 0xEA, 0xAA, 0x1, 0xAD, 0xCB, 0xA0, 0xFE, 0x28, 0xAA, 0xFE, 0x3C, 0xCA, 0x0, 0x1, 0x0, 0x59, 0x0, 0x0, 0x3, 0xC7, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x0, 0x33, 0x35, 0x13, 0x23, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x15, 0x3, 0x33, 0x15, 0x21, 0x3, 0x21, 0x15, 0x59, 0xE7, 0xB3, 0x1, 0x33, 0xBF, 0xFD, 0xE5, 0x3, 0x4E, 0xDF, 0xAB, 0xFE, 0xD5, 0xCB, 0x2, 0x3F, 0x9F, 0x1, 0x31, 0xAA, 0xFC, 0xC4, 0x99, 0xFE, 0xD9, 0xAA, 0xFE, 0xF3, 0xC3, 0x0, 0x1, 0x0, 0x4A, 0xFE, 0x59, 0x4, 0xCF, 0x5, 0xB0, 0x0, 0x19, 0x0, 0x0, 0x0, 0x0, 0x27, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x16, 0x0, 0x11, 0x10, 0x0, 0x1, 0x78, 0xFE, 0xE6, 0x14, 0xFD, 0x13, 0x86, 0xA3, 0xB3, 0x9D, 0xAD, 0xB0, 0xF3, 0x1, 0xC0, 0xFD, 0x1E, 0x4, 0x18, 0xFE, 0x36, 0xFA, 0x1, 0x26, 0xFE, 0xBF, 0xFE, 0x59, 0x1, 0x1A, 0xD3, 0x8F, 0x94, 0xC4, 0xCB, 0xE0, 0xB6, 0xA2, 0x1, 0xFB, 0xCB, 0x9C, 0xFD, 0xF5, 0xE, 0xFE, 0xD9, 0xFE, 0xDE, 0xFE, 0xCE, 0xFE, 0xD9, 0x0, 0x1, 0x0, 0x64, 0xFE, 0x59, 0x4, 0xE9, 0x5, 0xB0, 0x0, 0x19, 0x0, 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, 0x37, 0x1, 0x35, 0x21, 0x15, 0x21, 0x1, 0x15, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x6, 0x0, 0x1, 0xA5, 0xFE, 0xBF, 0x1, 0x27, 0xFB, 0xFE, 0x36, 0x4, 0x16, 0xFD, 0x20, 0x1, 0xC0, 0xF4, 0xB2, 0xAC, 0x9E, 0xB2, 0xA4, 0x86, 0x13, 0xFC, 0x14, 0xFE, 0xE6, 0xFE, 0x59, 0x1, 0x27, 0x1, 0x32, 0x1, 0x22, 0x1, 0x27, 0xE, 0x2, 0xB, 0x9C, 0xCB, 0xFE, 0x5, 0xA2, 0xB7, 0xDF, 0xCB, 0xC4, 0x94, 0x8F, 0xD3, 0xFE, 0xE6, 0x0, 0x1, 0x0, 0x53, 0xFE, 0x75, 0x4, 0x3C, 0x4, 0x3A, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x14, 0x6, 0x6, 0x23, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x1, 0x37, 0x21, 0x15, 0x21, 0x1, 0x15, 0x23, 0x6, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x4, 0x3C, 0x90, 0xE0, 0x78, 0xDF, 0xFE, 0xDE, 0xDA, 0xC7, 0xFE, 0x89, 0x1, 0x3, 0x8C, 0xFD, 0x9C, 0x1, 0x5C, 0x96, 0x91, 0x95, 0x8E, 0x80, 0x6F, 0x86, 0x1D, 0x95, 0xBB, 0x58, 0xE0, 0xCC, 0xC3, 0xE7, 0x18, 0x1, 0xBC, 0x9B, 0xC4, 0xFE, 0x6F, 0xAB, 0x2, 0x82, 0x95, 0x64, 0x85, 0x87, 0x5E, 0x0, 0x1, 0x0, 0x45, 0xFE, 0x4B, 0x3, 0xE3, 0x4, 0x3A, 0x0, 0x24, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x36, 0x37, 0x33, 0x14, 0x6, 0x1, 0xFB, 0xC7, 0xEF, 0xC9, 0xC8, 0x7E, 0x5F, 0xAC, 0xD3, 0x1, 0x41, 0xFE, 0x4, 0x3, 0x69, 0x1, 0xFE, 0xBA, 0x7A, 0x89, 0xE2, 0xAF, 0x88, 0x53, 0xC4, 0x4D, 0x8E, 0x5, 0xEC, 0xEB, 0xFE, 0x4B, 0xB8, 0x90, 0x88, 0x97, 0x29, 0x1A, 0x3E, 0x3D, 0x71, 0x3, 0x93, 0x1, 0x0, 0xC3, 0x8F, 0xFE, 0xDC, 0x20, 0x9B, 0x66, 0x92, 0x90, 0x25, 0x1D, 0x4A, 0x32, 0x85, 0x4F, 0x65, 0x86, 0xE4, 0x0, 0x1, 0x0, 0x51, 0x0, 0x0, 0x4, 0x58, 0x5, 0xC4, 0x0, 0x1E, 0x0, 0x0, 0x25, 0x15, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x0, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x33, 0x15, 0x21, 0x7, 0x1, 0x4, 0x41, 0xFC, 0x2C, 0x1, 0xB8, 0xFE, 0xF1, 0x1, 0xA1, 0x35, 0x29, 0x71, 0x68, 0x7C, 0x7C, 0xF3, 0x1, 0x2, 0xEC, 0xDA, 0xEF, 0x4E, 0x9E, 0xFE, 0xE7, 0x33, 0xFE, 0x90, 0xC3, 0xC3, 0xA8, 0x1, 0xDF, 0xAB, 0x48, 0x6B, 0x35, 0x64, 0x83, 0x97, 0x75, 0xBF, 0x1, 0x10, 0xDA, 0xB6, 0x7B, 0x87, 0xAB, 0x3A, 0xFE, 0x76, 0x0, 0x1, 0x0, 0x3F, 0xFF, 0xEC, 0x4, 0x60, 0x5, 0xB0, 0x0, 0x1E, 0x0, 0x0, 0x5, 0x22, 0x24, 0x27, 0x33, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x13, 0x23, 0x35, 0x21, 0x15, 0x21, 0x3, 0x36, 0x33, 0x32, 0x12, 0x15, 0x14, 0x2, 0x2, 0x81, 0xB6, 0xFE, 0xE9, 0xD, 0xEB, 0x1C, 0xD2, 0x77, 0x76, 0x83, 0x80, 0x55, 0x58, 0x27, 0xC2, 0x39, 0xCE, 0x3, 0xF2, 0xFD, 0xBC, 0x28, 0x64, 0x80, 0xCF, 0xE8, 0xED, 0x14, 0xD3, 0xCB, 0xDB, 0xA7, 0x83, 0x7D, 0xA2, 0x31, 0x25, 0x30, 0x2, 0xD, 0xD1, 0xD1, 0xFE, 0xA4, 0x39, 0xFE, 0xF9, 0xE3, 0xCA, 0xFE, 0xE4, 0x0, 0x1, 0x0, 0x2E, 0xFF, 0xF0, 0x3, 0xF2, 0x4, 0x3A, 0x0, 0x20, 0x0, 0x0, 0x5, 0x22, 0x26, 0x26, 0x35, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x27, 0x13, 0x23, 0x35, 0x21, 0x15, 0x21, 0x7, 0x36, 0x36, 0x37, 0x36, 0x16, 0x15, 0x14, 0x6, 0x2, 0x33, 0x68, 0xCC, 0x86, 0xED, 0x2, 0x70, 0x5B, 0x6B, 0x61, 0x67, 0x62, 0x81, 0x3C, 0xD5, 0x31, 0xA7, 0x3, 0x84, 0xFE, 0x4, 0x1D, 0x23, 0x75, 0x3D, 0xB7, 0xCD, 0xD1, 0x10, 0x46, 0x91, 0x71, 0x11, 0x46, 0x50, 0x66, 0x52, 0x53, 0x67, 0x53, 0xD, 0x1, 0x94, 0xC7, 0xC7, 0xD5, 0x14, 0x23, 0x1, 0x2, 0xC3, 0xB1, 0xA0, 0xD4, 0x0, 0x1, 0x0, 0x4C, 0xFF, 0xEC, 0x3, 0xCA, 0x5, 0x41, 0x0, 0x21, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2E, 0x2, 0x27, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x1E, 0x2, 0x15, 0x14, 0x6, 0x2, 0x15, 0xDF, 0xEA, 0xEC, 0x5, 0x8D, 0x4D, 0x5E, 0x67, 0x6E, 0x91, 0x6C, 0x1, 0xB3, 0xB3, 0xF2, 0xC0, 0xC0, 0x6D, 0x8E, 0x6D, 0xEE, 0x14, 0xE4, 0x86, 0x65, 0x4F, 0x49, 0x3B, 0x45, 0x4E, 0x53, 0x8C, 0x81, 0x6E, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0x66, 0x63, 0x5E, 0x46, 0x71, 0x75, 0x90, 0xB8, 0x0, 0x2, 0x0, 0x7D, 0xFE, 0x60, 0x4, 0x31, 0x4, 0x4E, 0x0, 0xE, 0x0, 0x18, 0x0, 0x0, 0x1, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x4, 0x7, 0x13, 0x22, 0x7, 0x11, 0x36, 0x24, 0x37, 0x35, 0x34, 0x26, 0x1, 0x6F, 0xF2, 0xDE, 0xB, 0x6C, 0xB8, 0xCE, 0xD9, 0xAE, 0xFE, 0xC3, 0xD7, 0xD7, 0x96, 0x41, 0xCB, 0x1, 0x2, 0x2, 0x75, 0xFE, 0x60, 0x5, 0xDA, 0x6E, 0x82, 0xFE, 0xD0, 0xF8, 0x14, 0xCB, 0xFE, 0xFA, 0xA9, 0x3E, 0x4, 0x2E, 0x7D, 0xFD, 0xF, 0x37, 0xEB, 0xD0, 0x1B, 0x92, 0xCF, 0x0, 0x1, 0x0, 0xA7, 0x0, 0x0, 0x1, 0x4E, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x4E, 0xA7, 0x5, 0xB0, 0xFA, 0x50, 0x5, 0xB0, 0xFF, 0xFF, 0x0, 0xA7, 0x0, 0x0, 0x2, 0x5C, 0x5, 0xB0, 0x0, 0x26, 0x0, 0xD4, 0x0, 0x0, 0x0, 0x7, 0x0, 0xD4, 0x1, 0xE, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x2, 0xB2, 0x5, 0xB0, 0x0, 0x26, 0x0, 0xD4, 0x6D, 0x0, 0x0, 0x27, 0x7, 0xA4, 0xFF, 0x84, 0x1, 0x7, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x84, 0xFF, 0x27, 0xFF, 0xFF, 0x0, 0x90, 0xFF, 0xF2, 0x1, 0xA3, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x6, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x9, 0x25, 0x7, 0x41, 0x0, 0x26, 0x0, 0x29, 0x0, 0x0, 0x0, 0x27, 0x0, 0x3F, 0x4, 0x99, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x5, 0x34, 0x1, 0x3F, 0x0, 0x4, 0x0, 0x95, 0x0, 0x0, 0x8, 0x8F, 0x5, 0xF2, 0x0, 0x8, 0x0, 0x12, 0x0, 0x1C, 0x0, 0x26, 0x0, 0x0, 0x1, 0x17, 0x37, 0x33, 0x15, 0x5, 0x23, 0x25, 0x35, 0x1, 0x11, 0x33, 0x32, 0x12, 0x37, 0x35, 0x34, 0x26, 0x23, 0x1, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0x21, 0x11, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x6, 0x4D, 0x8C, 0x8B, 0xD0, 0xFE, 0xF3, 0x9D, 0xFE, 0xF5, 0xFC, 0x12, 0xA6, 0xCC, 0xD0, 0x2, 0xCF, 0xC4, 0x2, 0xDF, 0x2, 0x25, 0xFD, 0xE5, 0x3, 0x4F, 0xFD, 0xD6, 0x2, 0x3F, 0xF8, 0x6, 0x1, 0xAD, 0x1, 0x25, 0x1, 0x6B, 0xFE, 0x93, 0xFE, 0xD2, 0x5, 0xF2, 0x8F, 0x8F, 0x12, 0xFC, 0xFB, 0x13, 0xFE, 0xF3, 0xFB, 0xE5, 0x1, 0x0, 0xE1, 0x53, 0xEC, 0xFB, 0xFB, 0x1B, 0x9F, 0x2, 0xD7, 0xC4, 0x99, 0xFD, 0x22, 0xC3, 0x5, 0xB0, 0xFE, 0x87, 0xFE, 0xC5, 0x49, 0xFE, 0xC5, 0xFE, 0x88, 0x0, 0x4, 0x0, 0x50, 0xFF, 0xEC, 0x7, 0xD1, 0x6, 0x18, 0x0, 0x8, 0x0, 0x14, 0x0, 0x24, 0x0, 0x2E, 0x0, 0x0, 0x1, 0x17, 0x37, 0x33, 0x15, 0x5, 0x23, 0x25, 0x35, 0x1, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x33, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0x5, 0x8F, 0x8C, 0x8B, 0xD0, 0xFE, 0xF3, 0x9D, 0xFE, 0xF5, 0xFD, 0x76, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x1, 0x7D, 0x11, 0x6D, 0xBA, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xF3, 0x5F, 0x2, 0x25, 0xFD, 0xE5, 0x3, 0x4F, 0xFD, 0xD6, 0x2, 0x3F, 0x5, 0xF2, 0x8F, 0x8F, 0x12, 0xFC, 0xFB, 0x13, 0xFA, 0xC1, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xB3, 0x75, 0x89, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x2, 0x41, 0xF9, 0xE8, 0x9F, 0x2, 0xD7, 0xC4, 0x99, 0xFD, 0x22, 0xC3, 0x0, 0x1, 0x0, 0x6A, 0xFF, 0xEC, 0x5, 0x89, 0x5, 0xC4, 0x0, 0x27, 0x0, 0x0, 0x25, 0x6, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x23, 0x4, 0xF0, 0x2E, 0xF5, 0xF5, 0xFE, 0xED, 0xFE, 0xA5, 0x1, 0x3E, 0x1, 0x1A, 0x1, 0xB, 0x1, 0x9, 0x1A, 0xF8, 0x13, 0x8A, 0x95, 0xB0, 0xAB, 0x2, 0xC8, 0xAF, 0x83, 0x77, 0x1A, 0xFE, 0xF8, 0x1, 0x8, 0xFE, 0xD5, 0x2, 0x27, 0x99, 0x99, 0xBE, 0x3D, 0x95, 0x1, 0x6E, 0x1, 0x4E, 0x5F, 0x1, 0x4E, 0x1, 0x6F, 0xFE, 0xFA, 0xCB, 0x71, 0x95, 0xFE, 0xE8, 0x6B, 0xF0, 0xFE, 0xFE, 0x3C, 0x1C, 0x38, 0x9E, 0x48, 0xBF, 0xFE, 0xF9, 0x9E, 0x0, 0x2, 0x0, 0x25, 0xFD, 0xFF, 0x4, 0x7D, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x2B, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x21, 0x35, 0x21, 0x35, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x33, 0x15, 0x23, 0x6, 0x4, 0x2, 0x49, 0x95, 0x45, 0x43, 0x95, 0x84, 0x79, 0x78, 0x65, 0x58, 0xEB, 0x52, 0x6C, 0x6E, 0xAD, 0xBB, 0x38, 0xFD, 0x15, 0x2, 0xFE, 0x6A, 0xAE, 0xC6, 0xEA, 0xE9, 0xC9, 0xBA, 0x69, 0xA, 0xDC, 0x67, 0x74, 0x24, 0xFF, 0x0, 0xB3, 0x7F, 0x1, 0xDA, 0x7C, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xFD, 0x4C, 0x45, 0x63, 0x8E, 0x77, 0x8F, 0x7F, 0x96, 0x76, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x7F, 0x6B, 0xFB, 0x92, 0x7F, 0xA1, 0xAD, 0xFF, 0xFF, 0x0, 0x4A, 0xFE, 0x59, 0x4, 0xCF, 0x7, 0x29, 0x0, 0x26, 0x0, 0xCB, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0x90, 0x1, 0x27, 0x0, 0x2, 0x0, 0x5E, 0xFE, 0x75, 0x4, 0x46, 0x5, 0xF2, 0x0, 0x8, 0x0, 0x24, 0x0, 0x0, 0x1, 0x17, 0x37, 0x33, 0x15, 0x5, 0x23, 0x25, 0x35, 0x1, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x1, 0xB4, 0x8B, 0x8C, 0xCF, 0xFE, 0xF4, 0x9D, 0xFE, 0xF5, 0x1, 0x60, 0x77, 0xE1, 0x90, 0xF3, 0x85, 0x70, 0x80, 0x8E, 0x9B, 0x93, 0x8E, 0x1, 0x5C, 0xFD, 0x9B, 0x3, 0x8D, 0x1, 0xFE, 0x89, 0xC7, 0xD9, 0xFE, 0xDF, 0x5, 0xF2, 0x8F, 0x8F, 0x12, 0xFC, 0xFB, 0x13, 0xF8, 0x83, 0x58, 0xBB, 0x95, 0x5E, 0x87, 0x85, 0x64, 0x97, 0x82, 0xAB, 0x1, 0x91, 0xC4, 0x9B, 0xFE, 0x44, 0x18, 0xE7, 0xC3, 0xCC, 0xE0, 0x0, 0x1, 0x0, 0x95, 0xFF, 0xEC, 0x8, 0x26, 0x5, 0xB0, 0x0, 0x18, 0x0, 0x0, 0x5, 0x22, 0x24, 0x35, 0x35, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x12, 0x21, 0x20, 0x13, 0x11, 0x33, 0x11, 0x6, 0x4, 0x7, 0x6, 0x20, 0xE9, 0xFE, 0xE5, 0xFD, 0x75, 0xFC, 0xFC, 0x2, 0x8B, 0xFD, 0x4, 0x1, 0x3, 0x1, 0x5, 0x5, 0xFC, 0x1, 0xFE, 0xDF, 0xE0, 0x14, 0xFD, 0xFA, 0xA5, 0xFD, 0x78, 0x5, 0xB0, 0xFD, 0xA2, 0x2, 0x5E, 0xFC, 0x2A, 0xFE, 0xDC, 0x1, 0x22, 0x2, 0x61, 0xFD, 0xA7, 0xF8, 0xFB, 0x1, 0x0, 0x2, 0x0, 0x95, 0xFE, 0x60, 0x4, 0xE7, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x1, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x20, 0x0, 0x13, 0x15, 0x10, 0x0, 0x5, 0x1, 0x22, 0x7, 0x11, 0x24, 0x0, 0x35, 0x35, 0x34, 0x26, 0x1, 0x91, 0xFC, 0xFC, 0x6C, 0x94, 0x1, 0x11, 0x1, 0x43, 0x2, 0xFE, 0x2D, 0xFE, 0x7D, 0x1, 0x0, 0xA7, 0x59, 0x1, 0x32, 0x1, 0x27, 0x9F, 0xFE, 0x60, 0x7, 0x50, 0x23, 0x37, 0xFE, 0xCC, 0xFE, 0xCE, 0x3B, 0xFE, 0xB3, 0xFD, 0xF5, 0x67, 0x5, 0x95, 0x72, 0xFB, 0xAE, 0x61, 0x1, 0xAC, 0xE1, 0x36, 0xCE, 0xD2, 0x0, 0x1, 0x0, 0x4E, 0xFE, 0x4B, 0x4, 0x6F, 0x5, 0xC4, 0x0, 0x20, 0x0, 0x0, 0x13, 0x35, 0x24, 0x0, 0x35, 0x34, 0x27, 0x6, 0x5, 0x27, 0x24, 0x24, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x33, 0x32, 0x4, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x2, 0x4, 0xB0, 0x1, 0x52, 0x1, 0x70, 0x53, 0xE6, 0xFE, 0x77, 0x1, 0x1, 0x64, 0x1, 0x4B, 0x82, 0x94, 0x66, 0x98, 0xFC, 0x1, 0x2E, 0xCC, 0xF2, 0x1, 0x1F, 0xA1, 0xB7, 0xF9, 0xFE, 0x4F, 0xFE, 0x4B, 0xCA, 0x44, 0x1, 0x9, 0xEF, 0xAA, 0x38, 0x97, 0x61, 0xBB, 0x6B, 0xE7, 0xCE, 0x5F, 0x84, 0x6E, 0x5F, 0xBF, 0xD9, 0xD3, 0xCC, 0xD1, 0xA5, 0x6B, 0xF7, 0xE7, 0xFE, 0xCE, 0xB8, 0x0, 0x1, 0x0, 0x48, 0xFE, 0x4B, 0x3, 0xAE, 0x4, 0x4D, 0x0, 0x20, 0x0, 0x0, 0x13, 0x35, 0x36, 0x24, 0x35, 0x34, 0x27, 0x6, 0x5, 0x35, 0x3E, 0x2, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x10, 0x0, 0xAC, 0xFB, 0x1, 0x13, 0x31, 0xB5, 0xFE, 0xD8, 0x86, 0xE7, 0x8E, 0x4D, 0x62, 0x51, 0x6D, 0xF2, 0xFA, 0xAF, 0xC5, 0xE4, 0x81, 0x95, 0xFE, 0x68, 0xFE, 0x4B, 0xBA, 0x45, 0xBE, 0xBE, 0x6B, 0x42, 0x74, 0x45, 0xB2, 0x26, 0x68, 0x98, 0x6D, 0x3A, 0x59, 0x4D, 0x3E, 0x98, 0xAE, 0xA1, 0x9A, 0xA6, 0x86, 0x61, 0xC9, 0xFE, 0xF3, 0xFE, 0xD7, 0x0, 0x1, 0x0, 0x95, 0xFE, 0x60, 0x4, 0xBB, 0x5, 0xC4, 0x0, 0x11, 0x0, 0x0, 0x1, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x4, 0x15, 0x4, 0xBB, 0xF4, 0x96, 0x86, 0xA2, 0x81, 0xF3, 0xF3, 0x91, 0xA1, 0xCF, 0x1, 0x32, 0xFE, 0x60, 0x5, 0x8B, 0x8F, 0x84, 0x4E, 0xFB, 0x50, 0x5, 0xB0, 0x3A, 0x4E, 0xF0, 0xE9, 0x0, 0x3, 0x0, 0x50, 0xFE, 0x4B, 0x5, 0xB4, 0x6, 0x0, 0x0, 0x1C, 0x0, 0x28, 0x0, 0x31, 0x0, 0x0, 0x1, 0x22, 0x26, 0x27, 0x7, 0x27, 0x37, 0x35, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x1, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0x32, 0x34, 0x23, 0x22, 0x7, 0x15, 0x14, 0x16, 0x4, 0x6C, 0x86, 0x97, 0x20, 0x95, 0x7C, 0xF3, 0x6B, 0xAD, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xF3, 0x3C, 0x40, 0x8B, 0xA9, 0xAE, 0xFD, 0x31, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x2, 0xBB, 0x61, 0x6B, 0x2F, 0x32, 0x33, 0xFE, 0x4B, 0x65, 0x4D, 0x8F, 0x93, 0xE0, 0x82, 0x77, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x2, 0x29, 0xFA, 0x5C, 0xE, 0x8E, 0x80, 0x78, 0x99, 0x2, 0x68, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xFE, 0x47, 0xBC, 0x16, 0x37, 0x30, 0x3F, 0x0, 0x2, 0x0, 0x67, 0xFF, 0xEB, 0x4, 0xD0, 0x5, 0xC4, 0x0, 0x23, 0x0, 0x2F, 0x0, 0x0, 0x5, 0x22, 0x24, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x37, 0x15, 0x6, 0x6, 0x15, 0x14, 0x16, 0x33, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x35, 0x16, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x4, 0x23, 0x3, 0x22, 0x6, 0x15, 0x10, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x2, 0x90, 0xEC, 0xFE, 0xC3, 0xBB, 0xBB, 0xEB, 0xAF, 0x4E, 0x4F, 0xA6, 0x80, 0x23, 0x80, 0xA6, 0x50, 0x4E, 0xB0, 0xEB, 0xBC, 0xBB, 0xFE, 0xC3, 0xED, 0x15, 0x8A, 0xA2, 0x1, 0x41, 0x8B, 0xA2, 0xA2, 0x8B, 0x15, 0xEA, 0xE8, 0xF1, 0x78, 0x60, 0xD2, 0xB9, 0xAF, 0x4, 0xC1, 0x13, 0x48, 0x50, 0x6F, 0x4F, 0x4F, 0x6F, 0x50, 0x48, 0x13, 0xC1, 0x4, 0xAF, 0xB9, 0xD2, 0x60, 0x78, 0xEF, 0xE9, 0xEB, 0x2, 0xDE, 0x86, 0x86, 0xFE, 0xFD, 0x80, 0x85, 0x84, 0x86, 0x0, 0x2, 0x0, 0x55, 0xFF, 0xEB, 0x4, 0xB4, 0x6, 0x15, 0x0, 0x23, 0x0, 0x31, 0x0, 0x0, 0x5, 0x22, 0x24, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x37, 0x15, 0x6, 0x6, 0x15, 0x14, 0x16, 0x33, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x35, 0x16, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x4, 0x23, 0x3, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x2, 0x7A, 0xEC, 0xFE, 0xC7, 0xBF, 0xBF, 0xE7, 0xAF, 0x4D, 0x56, 0xA9, 0x82, 0x23, 0x83, 0xA8, 0x55, 0x4D, 0xAF, 0xE6, 0xBF, 0xBF, 0xFE, 0xC7, 0xEC, 0x15, 0x8C, 0xA6, 0xA6, 0x8C, 0x15, 0x8C, 0xA6, 0xA6, 0x8C, 0x15, 0xE8, 0xE8, 0xF3, 0x76, 0x66, 0xEE, 0xC5, 0xD4, 0x4, 0xB9, 0x1E, 0x66, 0x62, 0x86, 0x65, 0x65, 0x86, 0x62, 0x66, 0x1E, 0xB9, 0x4, 0xD4, 0xC5, 0xEE, 0x66, 0x76, 0xF1, 0xE9, 0xE9, 0x2, 0xDD, 0x89, 0x84, 0x82, 0x8B, 0x8A, 0x85, 0x83, 0x88, 0x0, 0x1, 0x0, 0x50, 0xFE, 0xFD, 0x4, 0xE4, 0x5, 0xB0, 0x0, 0x13, 0x0, 0x0, 0x1, 0x23, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x16, 0x16, 0x15, 0x14, 0x4, 0xD3, 0xC9, 0x9, 0x40, 0x65, 0xFC, 0xE2, 0x2, 0xF2, 0xFD, 0x14, 0x4, 0x1E, 0xFD, 0xE, 0x1, 0xF3, 0xB3, 0xBC, 0xFE, 0xFD, 0x25, 0x26, 0x4C, 0x6C, 0xA4, 0x4, 0x41, 0xCB, 0xA0, 0xFB, 0xBA, 0x2, 0xAC, 0x9D, 0x44, 0x0, 0x1, 0x0, 0x52, 0xFF, 0x11, 0x4, 0x25, 0x4, 0x3A, 0x0, 0x12, 0x0, 0x0, 0x5, 0x23, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x4, 0x11, 0x14, 0x4, 0x14, 0xBF, 0x8, 0x49, 0x65, 0xFD, 0xA3, 0x2, 0x26, 0xFD, 0xE5, 0x3, 0x4E, 0xFD, 0xD6, 0x1, 0x41, 0x1, 0x63, 0xEF, 0x20, 0x2A, 0x47, 0x5E, 0x9F, 0x2, 0xD7, 0xC4, 0x99, 0xFD, 0x22, 0x8, 0xFE, 0xD8, 0x46, 0x0, 0x2, 0x0, 0x14, 0xFE, 0x4B, 0x3, 0xAA, 0x6, 0x0, 0x0, 0x10, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x22, 0x26, 0x27, 0x7, 0x27, 0x37, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x15, 0x14, 0x16, 0x2, 0x63, 0x85, 0x98, 0x21, 0x95, 0x7C, 0xF3, 0xF3, 0x3C, 0x41, 0x8A, 0xA9, 0xAD, 0x97, 0x29, 0x38, 0x6B, 0x30, 0x32, 0x34, 0xFE, 0x4B, 0x64, 0x4E, 0x8F, 0x93, 0xDF, 0x6, 0x20, 0xFA, 0x5C, 0xE, 0x8E, 0x80, 0x78, 0x99, 0xAF, 0x32, 0x2C, 0x5E, 0x17, 0x36, 0x30, 0x3F, 0x0, 0x2, 0x0, 0x7A, 0xFE, 0x4B, 0x5, 0xA9, 0x4, 0x4E, 0x0, 0x1E, 0x0, 0x29, 0x0, 0x0, 0x1, 0x22, 0x26, 0x27, 0x7, 0x27, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x15, 0x14, 0x16, 0x4, 0x62, 0x86, 0x97, 0x21, 0x95, 0x7C, 0xF3, 0x61, 0x5E, 0x91, 0x49, 0xF3, 0xE5, 0x8, 0x77, 0xC2, 0x9C, 0xBC, 0x1, 0x3C, 0x41, 0x8A, 0xA9, 0xAD, 0x97, 0x29, 0x38, 0x6B, 0x30, 0x32, 0x34, 0xFE, 0x4B, 0x65, 0x4E, 0x90, 0x93, 0xDF, 0x2, 0xDE, 0x70, 0x5A, 0x84, 0xFC, 0xFC, 0x4, 0x3A, 0x7C, 0x90, 0xB3, 0xDA, 0xFD, 0x9B, 0xE, 0x8E, 0x80, 0x78, 0x99, 0xAF, 0x32, 0x2C, 0x5E, 0x17, 0x36, 0x30, 0x3F, 0x0, 0x2, 0x0, 0x14, 0xFF, 0xEC, 0x3, 0xAA, 0x5, 0x41, 0x0, 0x18, 0x0, 0x22, 0x0, 0x0, 0x25, 0x14, 0x6, 0x23, 0x22, 0x26, 0x27, 0x7, 0x27, 0x37, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x36, 0x33, 0x32, 0x16, 0x5, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x15, 0x14, 0x3, 0xAA, 0xAD, 0x9A, 0x85, 0x98, 0x21, 0x95, 0x7C, 0xF3, 0xB2, 0xB2, 0xF3, 0xBF, 0xBF, 0x3F, 0x3E, 0x8A, 0xA9, 0xFE, 0xBC, 0x29, 0x38, 0x6B, 0x30, 0x32, 0xFC, 0x78, 0x98, 0x64, 0x4E, 0x8F, 0x92, 0xDF, 0x2, 0x7, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0xFE, 0x75, 0xF, 0x8F, 0xE1, 0x33, 0x2B, 0x5E, 0x17, 0x36, 0x6F, 0x0, 0x1, 0xFF, 0xB5, 0xFE, 0x4B, 0x1, 0x94, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x0, 0x13, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0xA1, 0xF3, 0xBB, 0xA5, 0x45, 0x3A, 0xE, 0x27, 0x3C, 0x7A, 0x1, 0x4, 0x3A, 0xFB, 0x87, 0xB6, 0xC0, 0x11, 0xBF, 0xD, 0xB0, 0x0, 0x3, 0x0, 0x60, 0xFF, 0xEC, 0x6, 0xD6, 0x6, 0x0, 0x0, 0x1B, 0x0, 0x27, 0x0, 0x32, 0x0, 0x0, 0x5, 0x22, 0x27, 0x15, 0x23, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x5, 0x31, 0xB4, 0x6A, 0xDC, 0xC, 0x6C, 0xB6, 0xC4, 0xE5, 0xE5, 0xC6, 0xAB, 0x6A, 0xF3, 0x6A, 0xB2, 0xD1, 0xD6, 0xD7, 0xFC, 0x48, 0x94, 0x45, 0x43, 0x94, 0x84, 0x73, 0x72, 0x3, 0x2F, 0x87, 0x69, 0x66, 0x8C, 0x9B, 0x43, 0x44, 0x14, 0x7C, 0x68, 0x70, 0x84, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x76, 0x2, 0x28, 0xFD, 0xD2, 0x7C, 0xFE, 0xCD, 0xF4, 0x15, 0xEF, 0xFE, 0xC9, 0xC7, 0x84, 0x1, 0xD1, 0x80, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xCA, 0xAA, 0x8F, 0xD2, 0x8C, 0xFE, 0x44, 0x8D, 0x0, 0x3, 0x0, 0x50, 0xFE, 0x60, 0x6, 0xC5, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x17, 0x0, 0x33, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x21, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x17, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x2, 0x39, 0x92, 0x45, 0x46, 0x8F, 0x83, 0x76, 0x74, 0x3, 0x26, 0x83, 0x73, 0x75, 0x83, 0x96, 0x41, 0x43, 0xDA, 0xB1, 0x6C, 0xF3, 0x6A, 0xAA, 0xCA, 0xE2, 0xE1, 0xCD, 0xB4, 0x6B, 0xD, 0xC6, 0xA, 0x6D, 0xB7, 0xCE, 0xD9, 0xDA, 0xAF, 0x7C, 0x1, 0xEA, 0x76, 0xD2, 0x92, 0x15, 0x91, 0xD2, 0xD3, 0x90, 0x15, 0x92, 0xCF, 0x7D, 0xFE, 0x23, 0x7F, 0xC3, 0x76, 0xFD, 0xFE, 0x1, 0xFD, 0x71, 0x1, 0x3A, 0xED, 0x14, 0xF7, 0x1, 0x30, 0x7E, 0x6A, 0x6D, 0x81, 0xFE, 0xD0, 0xF8, 0x14, 0xEC, 0xFE, 0xC6, 0x0, 0x3, 0xFF, 0x49, 0xFF, 0x60, 0x5, 0x6A, 0x5, 0xFC, 0x0, 0x2, 0x0, 0x5, 0x0, 0x15, 0x0, 0x0, 0x1, 0x13, 0x27, 0x13, 0x3, 0x3, 0x1, 0x23, 0x7, 0x23, 0x1, 0x1, 0x33, 0x13, 0x1, 0x33, 0x1, 0x1, 0x21, 0x3, 0x21, 0x7, 0x2, 0x11, 0xD7, 0x3E, 0xD4, 0x5F, 0xDE, 0xFE, 0xD9, 0x95, 0x83, 0xB9, 0x1, 0x5, 0x1, 0xEA, 0xE3, 0x6D, 0x1, 0x2A, 0xB8, 0xFE, 0x58, 0x1, 0x81, 0xFE, 0xF8, 0x77, 0xFD, 0xD7, 0x13, 0x2, 0xC6, 0x1, 0x6, 0xB1, 0xFD, 0xA2, 0x1, 0xF, 0xFE, 0xF1, 0xFD, 0xE1, 0xA0, 0x1, 0x3F, 0x5, 0x11, 0xFE, 0xE0, 0x1, 0x6C, 0xFD, 0xFA, 0xFC, 0xA, 0x1, 0x54, 0x17, 0x0, 0x2, 0x0, 0x66, 0xFF, 0x83, 0x4, 0xEC, 0x6, 0x1F, 0x0, 0x8, 0x0, 0x29, 0x0, 0x0, 0x1, 0x10, 0x17, 0x1, 0x26, 0x23, 0x22, 0x6, 0x7, 0x1, 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x2, 0x35, 0x35, 0x10, 0x0, 0x21, 0x32, 0x17, 0x37, 0x33, 0x7, 0x16, 0x16, 0x17, 0x23, 0x26, 0x27, 0x1, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x6, 0x0, 0x1, 0x65, 0x64, 0x1, 0x62, 0x30, 0x3E, 0xAB, 0xAC, 0x1, 0x1, 0x4C, 0x60, 0x54, 0x2F, 0x9A, 0x45, 0x82, 0x91, 0x1, 0x44, 0x1, 0x13, 0x62, 0x53, 0x29, 0x9A, 0x3D, 0x6D, 0x79, 0xE, 0xFC, 0x10, 0x38, 0xFE, 0x9C, 0x31, 0x3C, 0xA3, 0x89, 0x12, 0xFC, 0x13, 0xFE, 0xE5, 0x2, 0x9D, 0xFE, 0xFA, 0x79, 0x3, 0xCD, 0xD, 0xFA, 0xE4, 0xFC, 0xD2, 0x19, 0x82, 0xBE, 0x53, 0x1, 0x37, 0xD2, 0x76, 0x1, 0x3A, 0x1, 0x77, 0x16, 0x71, 0xA8, 0x41, 0xDC, 0x8B, 0x87, 0x46, 0xFC, 0x2C, 0x10, 0x97, 0x8B, 0xD4, 0xFE, 0xE6, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x60, 0x3, 0xF5, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x26, 0x0, 0x0, 0x1, 0x14, 0x17, 0x13, 0x27, 0x22, 0x6, 0x15, 0x13, 0x22, 0x27, 0x3, 0x23, 0x13, 0x26, 0x11, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x13, 0x33, 0x3, 0x16, 0x17, 0x23, 0x26, 0x27, 0x3, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x6, 0x4, 0x1, 0x42, 0x2D, 0xE8, 0x1E, 0x94, 0x63, 0xFA, 0x56, 0x4A, 0x9E, 0x9A, 0xB6, 0xCA, 0xF3, 0xF9, 0x33, 0x2F, 0x89, 0x9A, 0x9B, 0xC9, 0x6, 0xE4, 0x5, 0x34, 0xF6, 0x27, 0x31, 0x58, 0x7A, 0x5, 0xE4, 0x4, 0xFF, 0x0, 0x2, 0xB, 0x92, 0x56, 0x2, 0x66, 0x2, 0xDB, 0x81, 0xFD, 0xBD, 0x16, 0xFE, 0x5E, 0x1, 0xE1, 0x91, 0x1, 0x4B, 0x12, 0xDE, 0x1, 0x41, 0x8, 0x1, 0x6A, 0xFE, 0x67, 0x6C, 0xF4, 0x57, 0x3A, 0xFD, 0x75, 0xE, 0x68, 0x4F, 0x9D, 0xDD, 0xFF, 0xFF, 0x0, 0x1A, 0x0, 0x0, 0x4, 0x72, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x4B, 0x0, 0x0, 0x6, 0x7, 0xA4, 0x8A, 0x0, 0x0, 0x2, 0x0, 0x2D, 0xFF, 0x83, 0x4, 0xB0, 0x6, 0x1F, 0x0, 0x2, 0x0, 0x13, 0x0, 0x0, 0x1, 0x37, 0x23, 0x3, 0x35, 0x3, 0x23, 0x1, 0x11, 0x21, 0x35, 0x21, 0x37, 0x33, 0x7, 0x33, 0x15, 0x23, 0x1, 0x11, 0x2, 0xEB, 0x7A, 0x7A, 0xFC, 0xAF, 0xA0, 0x1, 0x4F, 0xFE, 0x3E, 0x3, 0xA0, 0x39, 0x9F, 0x39, 0x44, 0xAC, 0xFE, 0xE7, 0x3, 0xF9, 0xEC, 0xFB, 0x1B, 0xD8, 0xFE, 0xAB, 0x2, 0x8C, 0x2, 0xD6, 0xCB, 0x6F, 0x6F, 0xCB, 0xFD, 0xDD, 0xFD, 0x3E, 0x0, 0x1, 0x0, 0x49, 0xFE, 0x4B, 0x3, 0xC9, 0x4, 0x4E, 0x0, 0x30, 0x0, 0x0, 0x1, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x16, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x6, 0x23, 0x22, 0x26, 0x27, 0x3, 0x37, 0x16, 0x33, 0x32, 0x36, 0x2, 0xDA, 0x5B, 0x84, 0xAB, 0xE2, 0xE1, 0xC1, 0xCB, 0xE6, 0xF3, 0x60, 0x5F, 0x5C, 0x58, 0x8E, 0x60, 0xB5, 0xCB, 0xEF, 0xC7, 0x35, 0x30, 0x3B, 0x52, 0x3D, 0x4B, 0x4B, 0x51, 0x28, 0x7B, 0x4A, 0x70, 0x93, 0x3D, 0xE9, 0xC0, 0x53, 0xBA, 0x60, 0x64, 0x1, 0x26, 0x38, 0x4A, 0x1C, 0x24, 0x91, 0x8D, 0x85, 0xC3, 0xC6, 0x92, 0x3F, 0x63, 0x52, 0x36, 0x49, 0x37, 0x15, 0x27, 0x96, 0x8A, 0x90, 0xB8, 0x8, 0x71, 0x7E, 0x43, 0x8C, 0x27, 0x4A, 0x90, 0x6C, 0x1, 0xA4, 0x5E, 0xA7, 0x4A, 0x0, 0x1, 0x0, 0x52, 0xFE, 0x4B, 0x4, 0xB8, 0x4, 0x3A, 0x0, 0x18, 0x0, 0x0, 0x1, 0x22, 0x2E, 0x2, 0x23, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x33, 0x32, 0x1E, 0x2, 0x33, 0x32, 0x37, 0x17, 0x6, 0x6, 0x3, 0xC3, 0x77, 0x83, 0x60, 0x7F, 0x73, 0xFE, 0xDB, 0x2, 0x26, 0xFD, 0xE5, 0x3, 0x4E, 0xFD, 0xD6, 0x43, 0x80, 0x9A, 0x64, 0x57, 0x3D, 0x44, 0x4C, 0x52, 0x28, 0x80, 0xFE, 0x4B, 0x84, 0xAD, 0x84, 0x9F, 0x2, 0xD7, 0xC4, 0x99, 0xFD, 0x22, 0x87, 0xB2, 0x85, 0x43, 0x8C, 0x27, 0x4A, 0x0, 0x1, 0x0, 0x37, 0x0, 0x0, 0x3, 0xF1, 0x5, 0xC4, 0x0, 0x18, 0x0, 0x0, 0x21, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x7, 0x2, 0x86, 0xFC, 0x73, 0x96, 0x61, 0x62, 0x94, 0x63, 0x70, 0x5, 0xEF, 0x5, 0xFB, 0xC4, 0xF9, 0xFD, 0xB6, 0xB5, 0x1, 0xDE, 0xCF, 0x7F, 0x79, 0x7D, 0xD1, 0x76, 0x5E, 0xBB, 0xEA, 0xFE, 0xBF, 0xDE, 0x79, 0xBC, 0xFE, 0xDA, 0x2D, 0x0, 0x1, 0x0, 0x4C, 0x0, 0x0, 0x3, 0xA4, 0x4, 0x4E, 0x0, 0x16, 0x0, 0x0, 0x21, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x2, 0x79, 0xF3, 0x66, 0x72, 0x54, 0x53, 0x71, 0x50, 0x60, 0xF2, 0xEA, 0xB8, 0xDB, 0xDB, 0x93, 0x98, 0x1, 0xD1, 0x82, 0x5C, 0x59, 0x83, 0x77, 0x5D, 0xB5, 0xE2, 0xE1, 0xBF, 0x8C, 0xBF, 0x19, 0xFF, 0xFF, 0x0, 0x1A, 0x0, 0x0, 0x4, 0xF1, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x27, 0x4E, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x8A, 0xFE, 0xD3, 0x0, 0x2, 0x0, 0x22, 0xFF, 0xEC, 0x6, 0x21, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1D, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x21, 0x15, 0x14, 0x16, 0x17, 0x22, 0x24, 0x35, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x4, 0x3, 0x23, 0x87, 0x9D, 0xFD, 0xB9, 0x9E, 0x85, 0xE9, 0xFE, 0xCA, 0xE2, 0xE2, 0xFC, 0x2, 0x47, 0xFD, 0xDD, 0xDD, 0xFE, 0xC2, 0xB6, 0x91, 0x9C, 0xB5, 0xB5, 0x9C, 0x91, 0xCA, 0xFD, 0xFA, 0xB5, 0xAB, 0x2, 0x6D, 0xFD, 0x93, 0x2, 0x6D, 0xFD, 0x93, 0xAB, 0xB5, 0xFA, 0xFD, 0x0, 0x1, 0x0, 0x12, 0x0, 0x0, 0x5, 0x1C, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x21, 0x1, 0x1, 0x21, 0x1, 0x33, 0x1, 0x4, 0x7, 0xFE, 0x8E, 0xFE, 0x92, 0xFE, 0xEB, 0x2, 0xA, 0xF4, 0x2, 0xC, 0x4, 0x73, 0xFB, 0x8D, 0x5, 0xB0, 0xFA, 0x50, 0x0, 0x3, 0x0, 0x95, 0xFF, 0x83, 0x4, 0x4D, 0x6, 0x1F, 0x0, 0x3, 0x0, 0x7, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x13, 0x21, 0x11, 0x13, 0x13, 0x23, 0x11, 0x5, 0x21, 0x7, 0x23, 0x37, 0x21, 0x11, 0x21, 0x37, 0x33, 0x7, 0x33, 0x15, 0x23, 0x3, 0x33, 0x15, 0x23, 0x3, 0x21, 0x2, 0x8C, 0x71, 0xFE, 0x94, 0x47, 0x7D, 0xC4, 0x2, 0xBC, 0xFD, 0xEE, 0x23, 0x9B, 0x23, 0xFE, 0xF5, 0x2, 0xA0, 0x1F, 0x9A, 0x1F, 0x77, 0xAF, 0x70, 0xC0, 0xF7, 0x7D, 0x1, 0xDA, 0x3, 0x52, 0x1, 0x93, 0xFE, 0x6D, 0xFD, 0x78, 0x1, 0xC1, 0xFE, 0x3F, 0xCA, 0x7D, 0x7D, 0x5, 0xB0, 0x6F, 0x6F, 0xCB, 0xFE, 0x6D, 0xC7, 0xFE, 0x3F, 0x0, 0x4, 0x0, 0x54, 0xFE, 0x60, 0x4, 0xC, 0x5, 0xB0, 0x0, 0x5, 0x0, 0xA, 0x0, 0xE, 0x0, 0x2B, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x33, 0x13, 0x17, 0x34, 0x27, 0x7, 0x33, 0x1, 0x37, 0x23, 0x16, 0x1, 0x22, 0x27, 0x3, 0x23, 0x13, 0x26, 0x3, 0x35, 0x10, 0x0, 0x33, 0x32, 0x17, 0x13, 0x33, 0x3, 0x16, 0x11, 0x15, 0x21, 0x3, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x6, 0x2, 0x36, 0x66, 0x82, 0xE, 0xBF, 0x63, 0xC0, 0x3E, 0x4A, 0x88, 0xFE, 0x56, 0x44, 0x80, 0x5, 0x1, 0x18, 0x5E, 0x52, 0x9F, 0x9B, 0xB7, 0xCF, 0x3, 0x1, 0x1B, 0xCE, 0x39, 0x33, 0x89, 0x9B, 0x9C, 0xDB, 0xFE, 0x4B, 0x66, 0x35, 0x3E, 0xAB, 0x68, 0x83, 0x34, 0xCB, 0x3, 0x8B, 0x8C, 0x7C, 0x1, 0x5, 0xF3, 0x71, 0x42, 0xC5, 0xFE, 0x9B, 0xB3, 0x68, 0xFE, 0x83, 0x1A, 0xFE, 0x5A, 0x1, 0xE5, 0x8E, 0x1, 0x1C, 0x31, 0x1, 0x1, 0x1, 0x2D, 0xA, 0x1, 0x6C, 0xFE, 0x63, 0x80, 0xFE, 0x97, 0x59, 0xFE, 0xF2, 0x14, 0x86, 0x7D, 0x4C, 0x80, 0xFF, 0xFF, 0x0, 0x2D, 0xFF, 0xEC, 0x4, 0xB1, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2F, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0x1, 0x83, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x27, 0xFE, 0x4B, 0x2, 0xC5, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x4F, 0x7C, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x97, 0xFF, 0x74, 0x0, 0x2, 0x0, 0x66, 0xFE, 0x4B, 0x5, 0xD2, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x27, 0x0, 0x0, 0x25, 0x32, 0x36, 0x37, 0x11, 0x26, 0x26, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x32, 0x17, 0x37, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0xDE, 0x88, 0x73, 0x1B, 0x1B, 0x73, 0x88, 0xD3, 0xA8, 0xB0, 0x3, 0xBF, 0x3E, 0x44, 0x9D, 0xBF, 0x80, 0x9D, 0xFE, 0xCE, 0xFE, 0xC1, 0x1, 0x49, 0x1, 0x28, 0xC1, 0x91, 0xA, 0xBD, 0x56, 0x41, 0x2A, 0x21, 0xBC, 0x3F, 0x1C, 0x3, 0x82, 0x1C, 0x3F, 0xFE, 0xDD, 0xC8, 0x61, 0xD6, 0xFE, 0xEA, 0xFD, 0xA0, 0x11, 0xC0, 0xB6, 0x54, 0x29, 0x1, 0x92, 0x1, 0x2A, 0x61, 0x1, 0x32, 0x1, 0x89, 0x3D, 0x29, 0xFA, 0x11, 0x62, 0x45, 0x8, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x4B, 0x4, 0xE0, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x25, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x39, 0x92, 0x45, 0x46, 0x8F, 0x83, 0x76, 0x74, 0x3, 0x2A, 0x37, 0x45, 0x7E, 0xD6, 0x6A, 0xAA, 0xCA, 0xE2, 0xE1, 0xCD, 0xB4, 0x6B, 0xD, 0xD9, 0x5D, 0x40, 0x22, 0x1E, 0xAF, 0x7C, 0x1, 0xEA, 0x76, 0xD2, 0x92, 0x15, 0x91, 0xD2, 0xFD, 0xA9, 0xD, 0x8D, 0xB3, 0xD2, 0x71, 0x1, 0x3A, 0xED, 0x14, 0xF7, 0x1, 0x30, 0x7E, 0x6A, 0xFB, 0x51, 0x56, 0x40, 0x6, 0x0, 0x2, 0x0, 0x21, 0x0, 0x0, 0x5, 0x23, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x1, 0x1, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x4, 0x15, 0x14, 0x6, 0x7, 0x1, 0x15, 0x1, 0xD6, 0x1, 0x4, 0x88, 0x88, 0x80, 0x8D, 0x1, 0x37, 0xFE, 0xDC, 0xFE, 0xE6, 0xFD, 0xB8, 0xB8, 0x2, 0x0, 0xFB, 0x1, 0x12, 0x8D, 0x7D, 0x1, 0x47, 0x4, 0xE5, 0xFE, 0x17, 0x89, 0x68, 0x70, 0x87, 0x1, 0xFB, 0x1B, 0x2, 0x31, 0xFD, 0xCF, 0x2, 0x31, 0xCB, 0x2, 0xB4, 0xE0, 0xD7, 0x92, 0xC6, 0x34, 0xFD, 0xA0, 0xD, 0xFF, 0xFF, 0x0, 0x1A, 0x0, 0x0, 0x3, 0x11, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x57, 0x5C, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x8A, 0xFF, 0x47, 0x0, 0x2, 0x0, 0x22, 0x0, 0x0, 0x5, 0x73, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x14, 0x0, 0x0, 0x1, 0x13, 0x21, 0x1, 0x11, 0x23, 0x11, 0x1, 0x21, 0x35, 0x33, 0x3, 0x21, 0x13, 0x21, 0x13, 0x21, 0x3, 0x33, 0x15, 0x21, 0x2, 0xCA, 0x87, 0xFE, 0xF2, 0x1, 0x6, 0xFE, 0xFE, 0xF2, 0xFE, 0xE5, 0xD2, 0x91, 0x1, 0x19, 0x84, 0x1, 0x94, 0x85, 0x1, 0x18, 0x91, 0xD3, 0xFE, 0xE4, 0x2, 0xFF, 0x1, 0x16, 0xFE, 0x3, 0xFD, 0xE8, 0x2, 0x18, 0x1, 0xFD, 0x8A, 0x1, 0x11, 0xFE, 0xEF, 0x1, 0x11, 0xFE, 0xEF, 0x8A, 0x0, 0x2, 0x0, 0x22, 0xFE, 0x4B, 0x4, 0x30, 0x4, 0x3A, 0x0, 0x2, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x13, 0x23, 0x3, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x37, 0x37, 0x3, 0x23, 0x35, 0x33, 0x3, 0x21, 0x13, 0x33, 0x13, 0x21, 0x3, 0x33, 0x15, 0x23, 0x1, 0x2, 0x7, 0x2, 0x36, 0x53, 0xA9, 0xC9, 0x2E, 0x47, 0x2E, 0x5A, 0x5E, 0x1C, 0x23, 0xDB, 0xCA, 0x9B, 0x72, 0x1, 0x6, 0x65, 0xFB, 0x61, 0x1, 0x3, 0x70, 0x8B, 0xB9, 0xFE, 0xF2, 0x5A, 0xCB, 0x1, 0x5C, 0x1, 0x14, 0xFB, 0xDB, 0x11, 0xBC, 0x3, 0x41, 0x51, 0x5D, 0x2, 0x6C, 0x86, 0x1, 0x44, 0xFE, 0xBC, 0x1, 0x44, 0xFE, 0xBC, 0x86, 0xFC, 0xF5, 0xFE, 0xFD, 0x15, 0x0, 0x2, 0x0, 0x59, 0xFF, 0xEC, 0x3, 0xFA, 0x4, 0x4E, 0x0, 0x9, 0x0, 0x27, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x15, 0x33, 0x24, 0x35, 0x34, 0x26, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x27, 0x35, 0x33, 0x16, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x4, 0x23, 0x23, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x2, 0x5C, 0x54, 0x7A, 0x19, 0x91, 0x1, 0x1, 0x58, 0x1, 0x34, 0xF2, 0xCC, 0xB6, 0xED, 0x29, 0xF8, 0x12, 0xA, 0x72, 0xAB, 0xA1, 0xCF, 0xFE, 0xFD, 0xE9, 0x99, 0x5E, 0x60, 0x56, 0x67, 0x3, 0x8B, 0x51, 0x31, 0xCC, 0x5, 0xB0, 0x41, 0x58, 0xFD, 0xAD, 0x7F, 0xCD, 0xBA, 0xBA, 0x1, 0xE0, 0x92, 0x57, 0x11, 0x25, 0x40, 0x79, 0xB9, 0x8B, 0xAD, 0xB8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x0, 0x2, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x4, 0x4E, 0x0, 0x16, 0x0, 0x21, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x3, 0xFB, 0xA3, 0x35, 0x68, 0xBF, 0xCA, 0xDC, 0xDB, 0xCD, 0xB6, 0x66, 0x14, 0xD0, 0x3, 0x46, 0x10, 0xA, 0x19, 0x33, 0xFD, 0xF3, 0x8D, 0x44, 0x44, 0x8B, 0x84, 0x6E, 0x6D, 0x15, 0xA1, 0xA1, 0x1, 0x28, 0xE7, 0x15, 0xFC, 0x1, 0x43, 0x97, 0x83, 0xFC, 0xFA, 0x7B, 0x4, 0xB3, 0x1F, 0xC3, 0x88, 0x1, 0xC9, 0x8C, 0xE0, 0xB1, 0x8B, 0xC1, 0x0, 0x2, 0x0, 0x3E, 0xFF, 0xEB, 0x4, 0x61, 0x4, 0x4E, 0x0, 0x16, 0x0, 0x21, 0x0, 0x0, 0x5, 0x22, 0x27, 0x7, 0x23, 0x11, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x2, 0xB9, 0xB6, 0x66, 0x13, 0xD0, 0x3, 0x46, 0xC, 0xF, 0x18, 0x32, 0x4D, 0xA3, 0x34, 0x68, 0xBF, 0xCB, 0xDB, 0xDA, 0xFE, 0xF5, 0x83, 0x6F, 0x6D, 0x83, 0x8D, 0x45, 0x44, 0x15, 0x97, 0x83, 0x3, 0x7, 0x7A, 0x5, 0xB4, 0x1F, 0xA2, 0xA1, 0xFE, 0xD8, 0xE7, 0x14, 0xFD, 0xFE, 0xBE, 0xC3, 0xE0, 0xB1, 0x8B, 0xC0, 0x88, 0xFE, 0x39, 0x8D, 0x0, 0x2, 0x0, 0x7D, 0xFF, 0xEC, 0x4, 0x32, 0x6, 0x1F, 0x0, 0x19, 0x0, 0x24, 0x0, 0x0, 0x1, 0x14, 0x2, 0x23, 0x22, 0x27, 0x7, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x36, 0x33, 0x32, 0x12, 0x15, 0x1, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x4, 0x32, 0xD7, 0xCE, 0xBD, 0x6C, 0xB, 0xDC, 0xD6, 0x7E, 0x49, 0x33, 0x25, 0x1B, 0x41, 0x5D, 0x6A, 0xB2, 0xD1, 0xD6, 0xFE, 0x1D, 0x87, 0x6A, 0x67, 0x8C, 0x9B, 0x43, 0x44, 0x2, 0x12, 0xEF, 0xFE, 0xC9, 0x8A, 0x76, 0x4, 0xE0, 0xB3, 0x8C, 0xF, 0xA2, 0x7, 0x3F, 0x56, 0xFE, 0xF2, 0x7C, 0xFE, 0xCD, 0xF4, 0xFE, 0x8C, 0xCA, 0xAA, 0x8F, 0xD2, 0x8C, 0xFE, 0x44, 0x8D, 0x0, 0x1, 0x0, 0x3B, 0xFF, 0xEC, 0x3, 0xE1, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x2, 0x23, 0x22, 0x24, 0x3B, 0xE5, 0x5, 0x7A, 0x58, 0x95, 0x62, 0x62, 0x95, 0x63, 0x6F, 0x5, 0xE5, 0x5, 0xF1, 0xC4, 0xF7, 0xF3, 0x2, 0xF3, 0xFA, 0xB4, 0xFF, 0x0, 0x1, 0x66, 0x4F, 0x68, 0xD9, 0x83, 0x24, 0x81, 0xDB, 0x7D, 0x57, 0xB3, 0xE4, 0xFE, 0xC4, 0xDD, 0x2A, 0xDF, 0xFE, 0xC0, 0xDD, 0x0, 0x2, 0x0, 0x2D, 0xFF, 0x7A, 0x4, 0x9, 0x4, 0x4E, 0x0, 0x9, 0x0, 0x2B, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x16, 0x7, 0x7, 0x27, 0x37, 0x26, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x2, 0x5B, 0x4E, 0x7B, 0x36, 0x20, 0x63, 0x99, 0x38, 0xC7, 0x78, 0x9E, 0x93, 0x5C, 0xF3, 0xF9, 0xC5, 0xF0, 0x4, 0xE4, 0x5, 0x70, 0x63, 0x94, 0x63, 0xF, 0x63, 0xB2, 0x6B, 0x99, 0x8B, 0xF7, 0xC2, 0x95, 0x6D, 0xAF, 0x44, 0x3C, 0x2D, 0x22, 0xAE, 0x21, 0x91, 0xA4, 0x79, 0xC1, 0x8C, 0xCB, 0x24, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x55, 0x3F, 0x69, 0x5E, 0x93, 0x67, 0x94, 0xC4, 0x40, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x4B, 0x4, 0xE0, 0x6, 0x0, 0x0, 0xB, 0x0, 0x25, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x37, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x3, 0x2C, 0x36, 0x45, 0x7E, 0xD6, 0x6B, 0xAD, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xF3, 0x5C, 0x41, 0x23, 0x1C, 0xB3, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xFD, 0xA5, 0xD, 0x8D, 0xB3, 0xD8, 0x77, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x2, 0x29, 0xF9, 0x8B, 0x56, 0x40, 0x6, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0xE0, 0x6, 0x1F, 0x0, 0xB, 0x0, 0x25, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x2, 0x37, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x1, 0x7D, 0x11, 0x6D, 0xBA, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xD6, 0x7E, 0x48, 0x33, 0x23, 0x1C, 0x41, 0x5C, 0xB3, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xB3, 0x75, 0x89, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x1, 0x9, 0xB3, 0x8C, 0xF, 0xA2, 0x7, 0x3F, 0x56, 0xFB, 0x20, 0x0, 0x2, 0x0, 0x40, 0xFF, 0xEC, 0x3, 0xF8, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x21, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x37, 0x21, 0x35, 0x34, 0x12, 0x33, 0x32, 0x0, 0x11, 0x15, 0x14, 0x0, 0x1, 0x30, 0x1, 0xCE, 0x11, 0x7B, 0x63, 0x79, 0x61, 0x5, 0xC2, 0xA1, 0xCC, 0x34, 0x83, 0x68, 0xA8, 0x80, 0x95, 0xA, 0xFD, 0x3D, 0xE2, 0xEC, 0xCE, 0x1, 0x1C, 0xFE, 0xEB, 0x2, 0x83, 0x7C, 0x8C, 0x97, 0x5F, 0xFD, 0x57, 0x80, 0x4C, 0x7D, 0x86, 0xA5, 0x7D, 0x67, 0xEA, 0x1, 0x2C, 0xFE, 0xD3, 0xFE, 0xFF, 0x29, 0xDF, 0xFE, 0xD4, 0x0, 0x2, 0x0, 0x5A, 0xFF, 0xEB, 0x3, 0xF8, 0x4, 0x50, 0x0, 0x15, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x14, 0x0, 0x27, 0x22, 0x2, 0x35, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x0, 0x15, 0x1, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, 0x16, 0x3, 0xF8, 0xFE, 0xF1, 0xCB, 0xE2, 0xE2, 0x2, 0xA9, 0xA, 0x87, 0x80, 0x6B, 0x8C, 0x38, 0x4E, 0x35, 0xC6, 0x91, 0xEA, 0x1, 0xD, 0xFE, 0x26, 0x5B, 0x74, 0x11, 0xFE, 0x4C, 0x64, 0x2, 0xE, 0xED, 0xFE, 0xCA, 0x2, 0x1, 0xE, 0xD9, 0x90, 0x7C, 0xAD, 0x37, 0x26, 0x9F, 0x2F, 0x52, 0xFE, 0xCE, 0xE8, 0xFE, 0x7A, 0x93, 0x6F, 0x1A, 0x5F, 0x89, 0x0, 0x2, 0x0, 0x40, 0xFF, 0xEC, 0x5, 0xAD, 0x4, 0x4E, 0x0, 0x20, 0x0, 0x28, 0x0, 0x0, 0x5, 0x22, 0x2, 0x35, 0x35, 0x25, 0x26, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x37, 0x16, 0x16, 0x33, 0x37, 0x17, 0x6, 0x23, 0x22, 0x26, 0x27, 0x7, 0x15, 0x6, 0x0, 0x27, 0x32, 0x36, 0x35, 0x5, 0x15, 0x14, 0x16, 0x2, 0xE, 0xEC, 0xE2, 0x2, 0xAD, 0x1E, 0x88, 0x63, 0xA8, 0x68, 0x83, 0x34, 0xCC, 0xA1, 0xBA, 0xFC, 0x32, 0xDD, 0x15, 0x35, 0x52, 0x3B, 0x1F, 0x41, 0x4C, 0x85, 0x63, 0x1A, 0x26, 0x1, 0xFE, 0xE5, 0xCD, 0x76, 0x80, 0xFE, 0x2B, 0x66, 0x14, 0x1, 0x2C, 0xEA, 0x3E, 0x91, 0x54, 0x66, 0x86, 0x7D, 0x4D, 0x7F, 0xB8, 0x95, 0x2D, 0x8B, 0xA5, 0x3, 0x95, 0x24, 0xA2, 0x70, 0x8, 0x3C, 0xFD, 0xFE, 0xD3, 0xC3, 0xC3, 0xAD, 0x5F, 0x1B, 0x5E, 0x98, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x4, 0x4D, 0x0, 0x6, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x1, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0x0, 0x4, 0x4D, 0x0, 0x26, 0x0, 0x0, 0x5, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x4, 0x2, 0x23, 0x71, 0xD5, 0x89, 0xF2, 0x7A, 0x6A, 0x6E, 0x75, 0xD1, 0xD2, 0xC7, 0x68, 0x61, 0x63, 0x6D, 0x59, 0x7A, 0xF2, 0x1, 0x8, 0xB6, 0xCD, 0xFD, 0xB8, 0xCB, 0xFE, 0xF0, 0x14, 0x48, 0x97, 0x76, 0x3D, 0x5D, 0x5C, 0x3A, 0x91, 0x4, 0xAD, 0x4C, 0x3C, 0x34, 0x57, 0x4D, 0x3E, 0x98, 0xAE, 0xA1, 0x9A, 0x98, 0x4D, 0x42, 0xB9, 0x9A, 0xAC, 0x0, 0x1, 0x0, 0x54, 0xFF, 0xEC, 0x5, 0xC2, 0x4, 0x4D, 0x0, 0x32, 0x0, 0x0, 0x5, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x33, 0x32, 0x16, 0x17, 0x37, 0x16, 0x16, 0x33, 0x37, 0x17, 0x6, 0x23, 0x22, 0x26, 0x27, 0x7, 0x6, 0x7, 0x16, 0x15, 0x14, 0x4, 0x2, 0x23, 0x71, 0xD5, 0x89, 0xF2, 0x7A, 0x6A, 0x6E, 0x75, 0xD1, 0xD2, 0xC7, 0x68, 0x61, 0x63, 0x6D, 0x59, 0x7A, 0xF2, 0x1, 0x8, 0xB6, 0xA3, 0xE6, 0x2B, 0xF4, 0x16, 0x34, 0x52, 0x3C, 0x1F, 0x43, 0x4B, 0x84, 0x63, 0x1A, 0x51, 0x26, 0x87, 0xCB, 0xFE, 0xF0, 0x14, 0x48, 0x97, 0x76, 0x3D, 0x5D, 0x5C, 0x3A, 0x91, 0x4, 0xAD, 0x4C, 0x3C, 0x34, 0x57, 0x4D, 0x3E, 0x98, 0xAE, 0x67, 0x63, 0x32, 0x8A, 0xA6, 0x4, 0x96, 0x24, 0xA3, 0x70, 0x12, 0x6A, 0x39, 0x42, 0xB9, 0x9A, 0xAC, 0x0, 0x2, 0x0, 0x53, 0xFF, 0xEC, 0x3, 0xE2, 0x4, 0x4D, 0x0, 0x12, 0x0, 0x28, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x22, 0x26, 0x26, 0x35, 0x31, 0x35, 0x31, 0x31, 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x2, 0x2D, 0x64, 0x5E, 0xB7, 0x58, 0x62, 0x9A, 0x4D, 0x62, 0x5B, 0x8D, 0x7D, 0x64, 0x6D, 0xD7, 0x8F, 0x89, 0xD6, 0x74, 0xC4, 0xE5, 0xA6, 0xB9, 0xF8, 0xA6, 0x5D, 0x3A, 0x92, 0x2, 0xB0, 0x5, 0x81, 0x34, 0x57, 0x97, 0xD4, 0xD2, 0xAF, 0xBA, 0x60, 0xF8, 0xE3, 0x1, 0xD3, 0xEF, 0x63, 0xA1, 0x9A, 0x99, 0x4C, 0x41, 0xBA, 0x9A, 0xAC, 0x0, 0x1, 0x0, 0x39, 0xFE, 0x4B, 0x2, 0xB2, 0x4, 0x3A, 0x0, 0x13, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x2, 0xBA, 0x45, 0x3C, 0x2D, 0x2A, 0x7A, 0x1, 0xCD, 0xCD, 0xF3, 0xB4, 0xB4, 0x8, 0xFE, 0x4B, 0x11, 0xBF, 0x8, 0x8B, 0x62, 0xAB, 0x3, 0x8F, 0xFC, 0x71, 0xAB, 0x70, 0xFE, 0xBB, 0x0, 0x2, 0x0, 0x52, 0xFE, 0x56, 0x4, 0xEA, 0x5, 0x72, 0x0, 0xB, 0x0, 0x30, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x6, 0x23, 0x22, 0x2, 0x27, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x35, 0x36, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x14, 0x4, 0x2, 0x40, 0x96, 0x44, 0x43, 0x95, 0x84, 0x79, 0x78, 0x65, 0x59, 0xF4, 0x48, 0x73, 0x70, 0xA4, 0x79, 0x8D, 0x6A, 0xAE, 0xC6, 0xE8, 0x2, 0xE9, 0xC9, 0xAF, 0x67, 0x1, 0xD5, 0x7E, 0x49, 0x33, 0x25, 0x1B, 0x40, 0x5D, 0xFE, 0xEF, 0xB3, 0x80, 0x1, 0xD9, 0x7C, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xFD, 0xA3, 0x51, 0x62, 0x91, 0x85, 0x85, 0x7F, 0x49, 0x76, 0x1, 0x35, 0xE8, 0x1D, 0xF7, 0x1, 0x31, 0x70, 0x58, 0xB1, 0x8B, 0xF, 0xA2, 0x7, 0x3F, 0x56, 0xFB, 0xEB, 0xDB, 0xED, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0x56, 0x4, 0xD, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x4C, 0x0, 0x0, 0x0, 0x1, 0x0, 0x68, 0xFF, 0xED, 0x4, 0x66, 0x4, 0x4E, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x11, 0x6, 0x6, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x23, 0x35, 0x4, 0x66, 0x2C, 0xF0, 0xD1, 0xEA, 0xFE, 0xD9, 0x1, 0x26, 0xE2, 0xE4, 0xED, 0x12, 0xF2, 0x1C, 0xD5, 0x7C, 0x99, 0x98, 0x86, 0x6C, 0x71, 0x18, 0xEF, 0x2, 0x36, 0xFE, 0x6A, 0x38, 0x7B, 0x1, 0xC, 0xD4, 0xA4, 0xD4, 0x1, 0x9, 0xCA, 0xAC, 0xB6, 0xA2, 0x7A, 0xA5, 0x79, 0xA6, 0x27, 0x11, 0x9E, 0xB2, 0x0, 0x2, 0x0, 0x14, 0xFE, 0x4B, 0x4, 0x63, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x18, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x37, 0x13, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x13, 0x16, 0x15, 0x14, 0x6, 0x26, 0x35, 0x34, 0x27, 0x6, 0x15, 0x14, 0x2, 0x3B, 0x88, 0xAD, 0x33, 0x87, 0xFE, 0x54, 0x1, 0x3, 0x1, 0x25, 0x1, 0x25, 0x1, 0x2, 0xFE, 0x56, 0x82, 0x31, 0xAA, 0x48, 0x3C, 0x42, 0xFE, 0x4B, 0x7F, 0x7C, 0x4D, 0x65, 0x1, 0xC, 0x3, 0x36, 0xFD, 0xBD, 0x2, 0x43, 0xFC, 0xC5, 0xFE, 0xFE, 0x63, 0x54, 0x7C, 0x7F, 0xBB, 0x4B, 0x41, 0x7D, 0x87, 0x37, 0x4B, 0x0, 0x2, 0x0, 0x1B, 0xFF, 0xEC, 0x5, 0x1, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x2A, 0x0, 0x0, 0x25, 0x32, 0x35, 0x34, 0x27, 0x6, 0x15, 0x14, 0x6, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x2, 0x8E, 0x3C, 0x3C, 0x3D, 0x48, 0x9C, 0x57, 0x46, 0x5F, 0x60, 0x38, 0x34, 0x3F, 0x85, 0x32, 0x83, 0x65, 0x6A, 0xA4, 0x4B, 0x4B, 0xA4, 0x69, 0x66, 0x83, 0x32, 0x86, 0x3F, 0x34, 0x38, 0x60, 0x5F, 0x46, 0x57, 0x9B, 0xA7, 0x40, 0x2B, 0x67, 0x69, 0x29, 0x40, 0xBB, 0x7E, 0x75, 0x50, 0xB1, 0x79, 0xA4, 0x6F, 0x49, 0x93, 0x3B, 0x5D, 0x9B, 0x77, 0x77, 0x9B, 0x5D, 0x3B, 0x93, 0x49, 0x6F, 0xA4, 0x7A, 0xB0, 0x50, 0x75, 0x7E, 0x0, 0x1, 0x0, 0x78, 0xFE, 0x60, 0x3, 0xF8, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x0, 0x1, 0x23, 0x11, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x3, 0xF8, 0xF3, 0x76, 0xB7, 0x9F, 0xC1, 0xF3, 0x62, 0x5E, 0x92, 0x48, 0xF3, 0xFE, 0x60, 0x2, 0x16, 0x8A, 0xB9, 0xDC, 0x2, 0xB9, 0xFD, 0x45, 0x70, 0x5D, 0x81, 0x3, 0x7, 0x0, 0x1, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x6, 0x1F, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0x47, 0x93, 0x48, 0xF2, 0xD6, 0x7E, 0x48, 0x33, 0x23, 0x1C, 0x41, 0x5D, 0x76, 0xB7, 0x9F, 0xC0, 0x1, 0xF3, 0x62, 0x3, 0x88, 0x83, 0xFC, 0xFB, 0x4, 0xE0, 0xB3, 0x8C, 0xF, 0xA2, 0x7, 0x3F, 0x56, 0xFE, 0xE3, 0x8B, 0xB6, 0xDA, 0xFD, 0x42, 0x2, 0xBB, 0x71, 0x5C, 0x0, 0x1, 0x0, 0x7A, 0xFE, 0x7D, 0x3, 0xF9, 0x6, 0x1F, 0x0, 0x25, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x6, 0x2, 0xA5, 0x43, 0x39, 0x1D, 0x23, 0x41, 0x5C, 0x62, 0x5D, 0x93, 0x48, 0xF2, 0xD6, 0x7E, 0x48, 0x33, 0x23, 0x1C, 0x41, 0x5D, 0x76, 0xB7, 0x9F, 0xC0, 0x1, 0xD6, 0xFE, 0x7D, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x2, 0xFE, 0x71, 0x5C, 0x83, 0xFC, 0xFB, 0x4, 0xE0, 0xB3, 0x8C, 0xF, 0xA2, 0x7, 0x3F, 0x56, 0xFE, 0xE3, 0x8B, 0xB6, 0xDA, 0xFC, 0xFF, 0xB3, 0x8D, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x2, 0xB2, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x4E, 0x5D, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x84, 0xFF, 0x74, 0x0, 0x1, 0x0, 0x77, 0xFF, 0xEC, 0x2, 0x47, 0x4, 0x3A, 0x0, 0xD, 0x0, 0x0, 0x13, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x23, 0x22, 0x26, 0x35, 0x77, 0xF3, 0x5D, 0x40, 0x1F, 0x21, 0x36, 0x46, 0x7D, 0xD7, 0x4, 0x3A, 0xFC, 0xF1, 0x55, 0x41, 0x7, 0xA3, 0xD, 0x8D, 0xB2, 0x0, 0x1, 0x0, 0x5D, 0x0, 0x0, 0x2, 0x7A, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x21, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x2, 0x7A, 0xFD, 0xE3, 0x93, 0x93, 0x2, 0x1D, 0x97, 0x97, 0xC4, 0x2, 0xB3, 0xC3, 0xC3, 0xFD, 0x4D, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x2, 0xF2, 0x6, 0x0, 0x0, 0x26, 0x0, 0x51, 0x79, 0x0, 0x0, 0x7, 0x1, 0x8D, 0xFF, 0x9A, 0xFD, 0xB9, 0x0, 0x2, 0x0, 0x22, 0x0, 0x0, 0x3, 0xB8, 0x6, 0x0, 0x0, 0x8, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x35, 0x34, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x5, 0x23, 0x11, 0x23, 0x11, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x33, 0x1, 0xD1, 0x33, 0x38, 0x61, 0x6B, 0x2, 0x48, 0xF4, 0xF3, 0x7C, 0x8B, 0xA8, 0xAD, 0x9A, 0x38, 0x30, 0xF3, 0xF4, 0x2, 0xE4, 0x4C, 0x30, 0x3F, 0x5E, 0x5D, 0xB5, 0xFD, 0xD1, 0x2, 0x2F, 0x8E, 0x80, 0x78, 0x99, 0xA, 0x1, 0xBC, 0xFC, 0xE4, 0x0, 0x1, 0x0, 0xB7, 0xFE, 0x4B, 0x2, 0x87, 0x6, 0x0, 0x0, 0xD, 0x0, 0x0, 0x13, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x23, 0x22, 0x26, 0x35, 0xB7, 0xF3, 0x5D, 0x40, 0x24, 0x1C, 0x36, 0x46, 0x7D, 0xD7, 0x6, 0x0, 0xF9, 0x8B, 0x56, 0x40, 0x6, 0xA3, 0xD, 0x8D, 0xB3, 0x0, 0x1, 0x0, 0x8C, 0xFE, 0x4B, 0x4, 0x75, 0x6, 0x0, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x22, 0x24, 0x27, 0x33, 0x16, 0x33, 0x32, 0x36, 0x35, 0x10, 0x25, 0x23, 0x35, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x74, 0xB3, 0xFE, 0xED, 0x22, 0xF3, 0x26, 0xCF, 0x80, 0x8E, 0xFE, 0xE0, 0x7F, 0x1, 0x4E, 0xFE, 0x4E, 0xF3, 0xF3, 0x2, 0xCB, 0x1, 0xFE, 0x8E, 0xC5, 0xD7, 0xFE, 0xDF, 0xFE, 0x4B, 0x9D, 0xC3, 0x9D, 0x8A, 0x6E, 0x1, 0x5, 0x6, 0xAC, 0x1, 0xBA, 0xFC, 0x89, 0x6, 0x0, 0xFE, 0x3A, 0x9B, 0xFE, 0x1A, 0x19, 0xE6, 0xC2, 0xCD, 0xE0, 0x0, 0x1, 0x0, 0x7D, 0xFF, 0xEC, 0x6, 0x7A, 0x4, 0x3A, 0x0, 0x1F, 0x0, 0x0, 0x21, 0x27, 0x6, 0x23, 0x22, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x5, 0x95, 0x7, 0x73, 0xC5, 0xD8, 0x51, 0x35, 0xA7, 0x70, 0xA5, 0xBE, 0x1, 0xF3, 0x69, 0x59, 0x52, 0x69, 0x15, 0xF3, 0x69, 0x5A, 0x93, 0x3C, 0xF3, 0x71, 0x85, 0xA5, 0x4B, 0x5A, 0xB8, 0xD4, 0x2, 0xC2, 0xFD, 0x42, 0x78, 0x52, 0x58, 0x47, 0x2, 0xE9, 0xFD, 0x44, 0x72, 0x5A, 0x78, 0x3, 0x10, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x60, 0x6, 0x7A, 0x4, 0x3A, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x23, 0x11, 0x6, 0x23, 0x22, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x6, 0x7A, 0xF3, 0x72, 0xBF, 0xD8, 0x51, 0x35, 0xA7, 0x70, 0xA5, 0xBE, 0x1, 0xF3, 0x69, 0x59, 0x52, 0x69, 0x15, 0xF3, 0x69, 0x5A, 0x93, 0x3C, 0xF3, 0xFE, 0x60, 0x2, 0x9, 0x7D, 0xA5, 0x4B, 0x5A, 0xB8, 0xD4, 0x2, 0xC2, 0xFD, 0x42, 0x78, 0x52, 0x58, 0x47, 0x2, 0xE9, 0xFD, 0x44, 0x72, 0x5A, 0x78, 0x3, 0x10, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x4B, 0x6, 0x7A, 0x4, 0x4E, 0x0, 0x28, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x6, 0x5, 0x26, 0x43, 0x39, 0x1D, 0x23, 0x41, 0x5C, 0x69, 0x5A, 0x53, 0x69, 0x14, 0xF3, 0x68, 0x5A, 0x93, 0x3D, 0xF2, 0xE4, 0x7, 0x73, 0xC6, 0xD7, 0x51, 0x77, 0xD6, 0xA7, 0xBD, 0xD7, 0xFE, 0x4B, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x3, 0x33, 0x78, 0x52, 0x5A, 0x48, 0xFD, 0x1A, 0x2, 0xBC, 0x72, 0x5A, 0x78, 0xFC, 0xF0, 0x4, 0x3A, 0x71, 0x85, 0xA5, 0xA5, 0xBA, 0xD7, 0xFC, 0xCE, 0xB3, 0x8D, 0x0, 0x1, 0xFF, 0xF9, 0xFE, 0x4B, 0x4, 0x56, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x14, 0x6, 0x75, 0x42, 0x3A, 0x1D, 0x23, 0x41, 0x5D, 0xE4, 0x8, 0x77, 0xC3, 0x9C, 0xBC, 0x1, 0xF3, 0x62, 0x5D, 0x92, 0x49, 0xD6, 0xFE, 0x4B, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x4, 0xAF, 0x7D, 0x91, 0xB3, 0xDA, 0xFD, 0x3F, 0x2, 0xBE, 0x70, 0x5A, 0x86, 0xFC, 0x89, 0xB3, 0x8D, 0x0, 0x1, 0x0, 0x7A, 0xFE, 0x4B, 0x4, 0xD6, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x4, 0xD6, 0x37, 0x45, 0x7E, 0xD6, 0x61, 0x5E, 0x91, 0x49, 0xF3, 0xE5, 0x8, 0x77, 0xC2, 0x9C, 0xBC, 0x1, 0x5D, 0x40, 0x22, 0x1E, 0xFE, 0x58, 0xD, 0x8D, 0xB3, 0x3, 0x33, 0x70, 0x5A, 0x84, 0xFC, 0xFC, 0x4, 0x3A, 0x7C, 0x90, 0xB3, 0xDA, 0xFC, 0xCA, 0x56, 0x40, 0x6, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x4, 0x9, 0x4, 0x3A, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x33, 0x1, 0x11, 0x33, 0x11, 0x23, 0x1, 0x1, 0x6F, 0xF2, 0xF2, 0x1, 0xA8, 0xF2, 0xF2, 0xFE, 0x58, 0x4, 0x3A, 0xFD, 0x28, 0x2, 0xD8, 0xFB, 0xC6, 0x2, 0xDA, 0x0, 0x2, 0x0, 0x66, 0xFF, 0xEC, 0x6, 0x4B, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x23, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x17, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x32, 0x16, 0x33, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x22, 0x6, 0x2, 0x5D, 0x28, 0xAB, 0xAB, 0x2A, 0x87, 0x7C, 0x7D, 0x88, 0xEA, 0xFE, 0xF7, 0x4, 0x1, 0xA, 0xEB, 0x5B, 0x9E, 0x7D, 0x2, 0x7A, 0xFD, 0xD7, 0x1, 0xD3, 0xFE, 0x2D, 0x2, 0x29, 0xFD, 0x85, 0x7D, 0x9D, 0xAF, 0xC, 0x2, 0xC4, 0xC, 0xD5, 0x8F, 0x15, 0x91, 0xD2, 0xC3, 0x1, 0x33, 0xE6, 0x22, 0xEC, 0x1, 0x3B, 0x14, 0xC1, 0xF6, 0xC2, 0xFF, 0x0, 0xC1, 0x14, 0x0, 0x2, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2D, 0x4, 0x4E, 0x0, 0x17, 0x0, 0x2D, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x26, 0x35, 0x34, 0x12, 0x24, 0x33, 0x31, 0x33, 0x31, 0x31, 0x32, 0x4, 0x12, 0x15, 0x14, 0x6, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x21, 0x20, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x4, 0x8C, 0xE6, 0x5C, 0x5D, 0xE6, 0x9B, 0xB7, 0x4F, 0x9F, 0x1, 0x47, 0xFD, 0x1, 0xFD, 0x1, 0x47, 0x9F, 0x4F, 0xB6, 0xA6, 0x67, 0x51, 0xDA, 0xFE, 0xE9, 0xFE, 0xEA, 0xDA, 0x51, 0x67, 0x50, 0x6B, 0xFB, 0x1, 0x35, 0x36, 0x15, 0xDF, 0xDF, 0x9B, 0xEC, 0x79, 0xA2, 0x1, 0x16, 0xAB, 0xAB, 0xFE, 0xEA, 0xA0, 0x7A, 0xED, 0x9B, 0xC3, 0xC5, 0x7A, 0xA6, 0xF8, 0xF8, 0xA6, 0x7A, 0xC5, 0x8A, 0xA9, 0xBE, 0xC5, 0xA3, 0x44, 0x45, 0x0, 0x3, 0x0, 0x50, 0xFE, 0x60, 0x4, 0x84, 0x6, 0x0, 0x0, 0x13, 0x0, 0x19, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x23, 0x11, 0x26, 0x2, 0x35, 0x35, 0x34, 0x12, 0x37, 0x11, 0x33, 0x11, 0x16, 0x12, 0x15, 0x15, 0x14, 0x2, 0x7, 0x1, 0x10, 0x17, 0x11, 0x6, 0x7, 0x5, 0x34, 0x27, 0x11, 0x36, 0x37, 0x2, 0xE3, 0xF2, 0xBC, 0xE5, 0xE6, 0xBB, 0xF2, 0xBC, 0xE5, 0xE5, 0xBC, 0xFE, 0x60, 0xAE, 0xAA, 0x4, 0x2, 0x4F, 0xAF, 0xAB, 0x4, 0xFE, 0x60, 0x1, 0x97, 0x22, 0x1, 0x16, 0xE3, 0x15, 0xE3, 0x1, 0x17, 0x22, 0x1, 0xBD, 0xFE, 0x43, 0x22, 0xFE, 0xE9, 0xE4, 0x14, 0xE3, 0xFE, 0xE9, 0x22, 0x2, 0x1C, 0xFF, 0x0, 0x4B, 0x2, 0xAC, 0x4B, 0xF6, 0xB, 0xFE, 0x4E, 0xFD, 0x53, 0x4A, 0xF7, 0x0, 0x1, 0x0, 0x1B, 0xFF, 0xEC, 0x2, 0x53, 0x4, 0x3A, 0x0, 0xD, 0x0, 0x0, 0x21, 0x27, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x1, 0x6C, 0x7, 0x57, 0x9D, 0x31, 0x25, 0x2, 0x32, 0x31, 0xA7, 0x3A, 0xF2, 0x79, 0x8D, 0xD, 0xE5, 0x8, 0x7F, 0x2, 0xE5, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x1B, 0xFF, 0xEC, 0x2, 0x53, 0x6, 0x0, 0x0, 0xD, 0x0, 0x0, 0x21, 0x27, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x1, 0x6C, 0x7, 0x57, 0x9D, 0x31, 0x25, 0x2, 0x32, 0x31, 0xA7, 0x3A, 0xF2, 0x79, 0x8D, 0xD, 0xE5, 0x8, 0x7F, 0x4, 0xAB, 0xFA, 0x0, 0x0, 0x1, 0x0, 0x1B, 0xFE, 0x4B, 0x3, 0x30, 0x4, 0x3A, 0x0, 0x17, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x3, 0x30, 0x36, 0x46, 0x7D, 0xD7, 0x56, 0x99, 0x31, 0x25, 0x2, 0x32, 0x31, 0xA7, 0x3A, 0xF2, 0x5D, 0x40, 0x24, 0x1C, 0xFE, 0x58, 0xD, 0x8D, 0xB3, 0xE6, 0x85, 0xD, 0xE5, 0x8, 0x7F, 0x2, 0xE5, 0xFB, 0x51, 0x56, 0x40, 0x6, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x60, 0x2, 0xB5, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x2, 0x51, 0xA9, 0x39, 0xF2, 0xE8, 0x6, 0x56, 0x9E, 0x31, 0x25, 0x2, 0x32, 0x3, 0x64, 0x80, 0xFB, 0x7C, 0x5, 0xDA, 0x7A, 0x8E, 0xD, 0xE5, 0x8, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x4B, 0x2, 0xB5, 0x4, 0x4E, 0x0, 0x17, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x4C, 0x36, 0x46, 0x7D, 0xD6, 0xE8, 0x6, 0x56, 0x9E, 0x31, 0x25, 0x2, 0x32, 0x30, 0xA9, 0x39, 0x5D, 0x40, 0x24, 0x1C, 0xFE, 0x58, 0xD, 0x8D, 0xB3, 0x4, 0xAF, 0x7A, 0x8E, 0xD, 0xE5, 0x8, 0x80, 0xFC, 0xA7, 0x56, 0x40, 0x6, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x2, 0x4D, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x0, 0x21, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x70, 0xF3, 0xD6, 0x7E, 0x43, 0x39, 0x1D, 0x22, 0x41, 0x5D, 0x3, 0xF, 0xB2, 0x8D, 0xF, 0xA3, 0x7, 0x3E, 0x56, 0x0, 0x1, 0x0, 0x1B, 0xFE, 0x60, 0x1, 0xEB, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x0, 0x1, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x1, 0xEB, 0xF3, 0x5C, 0x41, 0x1D, 0x23, 0x37, 0x45, 0x7E, 0xD6, 0xFE, 0x60, 0x4, 0xAF, 0x56, 0x40, 0x7, 0xA3, 0xD, 0x8D, 0xB2, 0x0, 0x2, 0x0, 0x71, 0x0, 0x0, 0x4, 0x2A, 0x4, 0x3A, 0x0, 0x8, 0x0, 0x15, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x13, 0x3, 0x23, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x7, 0x13, 0x1, 0x63, 0xEE, 0x5F, 0x56, 0x5D, 0x65, 0xE9, 0xE8, 0xE2, 0xF2, 0x1, 0xD3, 0xCE, 0xE8, 0xCF, 0xFF, 0x3, 0x79, 0xFE, 0xC9, 0x5F, 0x3A, 0x3B, 0x63, 0xFC, 0x87, 0x1, 0x8E, 0xFE, 0x72, 0x4, 0x3A, 0xC5, 0x95, 0xD4, 0x56, 0xFE, 0x4A, 0x0, 0x2, 0x0, 0x71, 0x0, 0x0, 0x4, 0x2A, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x15, 0x0, 0x0, 0x33, 0x11, 0x33, 0x11, 0x33, 0x13, 0x33, 0x3, 0x16, 0x15, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x71, 0xF2, 0xE2, 0xE8, 0xFD, 0xFF, 0xCF, 0xE8, 0xCE, 0xE1, 0xE1, 0x65, 0x5D, 0x56, 0x5F, 0xEE, 0x4, 0x3A, 0xFE, 0x72, 0x1, 0x8E, 0xFE, 0x4A, 0x56, 0xD4, 0x95, 0xC5, 0xC1, 0x65, 0x39, 0x38, 0x61, 0x0, 0x1, 0x0, 0x4C, 0xFE, 0x52, 0x3, 0xCA, 0x4, 0x4E, 0x0, 0x30, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x1, 0xF8, 0x33, 0x3B, 0x88, 0xB6, 0xEC, 0x5, 0x8A, 0x50, 0x60, 0x65, 0x55, 0x8E, 0xB0, 0xD9, 0xE0, 0xC1, 0xCB, 0xE7, 0xF3, 0x60, 0x5F, 0x5C, 0x58, 0x5F, 0x7F, 0xBC, 0xD3, 0xEE, 0xC7, 0x8E, 0x6C, 0x5D, 0x41, 0x22, 0x1D, 0xFE, 0x61, 0xF, 0xA5, 0x9B, 0x1, 0xC4, 0x64, 0x50, 0x4A, 0x3A, 0x35, 0x4C, 0x1E, 0x25, 0x93, 0x89, 0x85, 0xC3, 0xC6, 0x92, 0x3F, 0x63, 0x52, 0x6C, 0x40, 0x1B, 0x28, 0x92, 0x91, 0x90, 0xB8, 0x36, 0x90, 0x56, 0x3F, 0x7, 0x0, 0x1, 0x0, 0x1B, 0xFE, 0x4B, 0x3, 0x31, 0x6, 0x15, 0x0, 0x15, 0x0, 0x0, 0x13, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x11, 0x14, 0x6, 0xA4, 0x43, 0x46, 0x7, 0x28, 0x35, 0xAD, 0xCD, 0xAF, 0x43, 0x46, 0x7, 0x28, 0x35, 0xAD, 0xCC, 0xFE, 0x4B, 0x12, 0xBE, 0x8, 0xAC, 0x4, 0xE2, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xAC, 0xFB, 0x1E, 0xB4, 0xC0, 0xFF, 0xFF, 0x0, 0x1B, 0xFE, 0x4B, 0x3, 0x31, 0x6, 0x15, 0x0, 0x26, 0x1, 0x37, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0xC7, 0xFD, 0x78, 0x0, 0x1, 0x0, 0x1B, 0xFE, 0x4B, 0x3, 0x31, 0x4, 0x4E, 0x0, 0x15, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x16, 0x33, 0x32, 0x37, 0x3, 0x31, 0x46, 0x43, 0xAF, 0xCC, 0x1, 0xAD, 0x33, 0x2A, 0x7, 0x48, 0x41, 0xB0, 0xCC, 0x1, 0xAC, 0x34, 0x2A, 0xFE, 0x5D, 0x12, 0xBF, 0xB5, 0x3, 0x1D, 0xAA, 0x8, 0xBE, 0x12, 0xBF, 0xB5, 0xFC, 0xE3, 0xAA, 0x8, 0x0, 0x2, 0x0, 0x1E, 0xFE, 0x4B, 0x3, 0xD2, 0x6, 0x15, 0x0, 0x9, 0x0, 0x23, 0x0, 0x0, 0x1, 0x32, 0x35, 0x35, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x17, 0x1, 0x62, 0x6C, 0x32, 0x30, 0x6B, 0x38, 0x1, 0xFF, 0x95, 0x21, 0x98, 0x85, 0x9A, 0xAD, 0xA9, 0x8A, 0x41, 0x3C, 0xCC, 0xB0, 0x42, 0x46, 0x6, 0x2A, 0x33, 0xAD, 0x1, 0xF3, 0xFE, 0xFA, 0x77, 0x2E, 0x17, 0x5E, 0x2C, 0x32, 0x8C, 0x8E, 0x4D, 0x64, 0x99, 0x78, 0x80, 0x8E, 0xE, 0x4, 0x45, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xAA, 0xFB, 0x3B, 0xDD, 0x0, 0x1, 0x0, 0x37, 0x0, 0x0, 0x2, 0xA2, 0x5, 0x55, 0x0, 0x15, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x33, 0x2, 0xA2, 0xB3, 0xF2, 0xBF, 0xBF, 0x3F, 0x32, 0x26, 0x2F, 0x46, 0x5A, 0x7A, 0x9E, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0x1, 0x7, 0xB4, 0x2, 0x5C, 0x49, 0x2C, 0xA, 0xBB, 0x18, 0x89, 0xA7, 0xFD, 0x96, 0x0, 0x1, 0x0, 0x8, 0xFE, 0x4B, 0x2, 0x8A, 0x5, 0x41, 0x0, 0x15, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x8A, 0x36, 0x46, 0x7D, 0xD6, 0xB3, 0xB3, 0xF2, 0xBF, 0xBF, 0x5D, 0x40, 0x22, 0x1E, 0xFE, 0x58, 0xD, 0x8D, 0xB3, 0x3, 0xFC, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0xFC, 0x4, 0x56, 0x40, 0x6, 0x0, 0x2, 0x0, 0x18, 0xFF, 0xEC, 0x5, 0x27, 0x4, 0x3A, 0x0, 0x7, 0x0, 0x1D, 0x0, 0x0, 0x25, 0x32, 0x37, 0x35, 0x21, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x26, 0x27, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x2, 0x7D, 0xAF, 0x40, 0xFE, 0x66, 0x67, 0x1, 0x41, 0x6, 0x6A, 0xC6, 0x9F, 0xC5, 0x1, 0xC7, 0xC7, 0xF3, 0x1, 0x9A, 0xF3, 0xC8, 0xC8, 0xB3, 0x7F, 0xAF, 0x64, 0x75, 0x55, 0xB3, 0x6A, 0x7E, 0xBA, 0xD5, 0x66, 0xAB, 0x1, 0xAE, 0xFE, 0x52, 0x1, 0xAE, 0xFE, 0x52, 0xAB, 0xFE, 0x1F, 0x0, 0x1, 0x0, 0x62, 0xFF, 0xEB, 0x4, 0x8E, 0x4, 0x4E, 0x0, 0x2F, 0x0, 0x0, 0x25, 0x32, 0x36, 0x36, 0x35, 0x34, 0x26, 0x26, 0x35, 0x34, 0x36, 0x36, 0x33, 0x15, 0x22, 0x6, 0x15, 0x14, 0x16, 0x16, 0x15, 0x14, 0x6, 0x6, 0x23, 0x22, 0x26, 0x26, 0x35, 0x34, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x16, 0x16, 0x15, 0x14, 0x6, 0x6, 0x15, 0x14, 0x16, 0x16, 0x2, 0x77, 0x7A, 0x7E, 0x2D, 0x3B, 0x3E, 0x31, 0x99, 0x9C, 0x22, 0x4F, 0x3B, 0x3B, 0x59, 0xE7, 0xD7, 0xD4, 0xE7, 0x5A, 0x3B, 0x3B, 0x4F, 0x22, 0x9D, 0x98, 0x31, 0x3D, 0x3C, 0x2D, 0x7D, 0xAE, 0x57, 0x7C, 0x36, 0x56, 0x8E, 0x87, 0x41, 0x2F, 0x6E, 0x4E, 0xBD, 0x21, 0x39, 0x37, 0x71, 0x9B, 0x75, 0x5C, 0xBB, 0x7D, 0x7C, 0xBB, 0x5D, 0x75, 0x9B, 0x71, 0x37, 0x39, 0x21, 0xBD, 0x4E, 0x6E, 0x2F, 0x41, 0x87, 0x8E, 0x56, 0x36, 0x7C, 0x57, 0x0, 0x1, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xE9, 0x4, 0x4E, 0x0, 0x18, 0x0, 0x0, 0x24, 0x36, 0x35, 0x11, 0x34, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x6, 0x20, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x2, 0x89, 0x6D, 0x63, 0x25, 0x3A, 0x1C, 0x82, 0x64, 0x93, 0x58, 0xF6, 0xFE, 0x7A, 0xF6, 0xF3, 0x6D, 0xB3, 0x6B, 0x94, 0x1, 0x48, 0x83, 0xE, 0xB3, 0x2C, 0xC1, 0x80, 0xFE, 0xA7, 0xF3, 0xD5, 0xD5, 0xF3, 0x2, 0x86, 0xFD, 0x77, 0x92, 0x6C, 0x0, 0x1, 0x0, 0x19, 0x0, 0x0, 0x3, 0xDD, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x0, 0x21, 0x3, 0x3, 0x23, 0x1, 0x33, 0x1, 0x2, 0xE1, 0xE9, 0xE4, 0xFB, 0x1, 0x77, 0xD3, 0x1, 0x7A, 0x3, 0x5, 0xFC, 0xFB, 0x4, 0x3A, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x5, 0xCD, 0x4, 0x3A, 0x0, 0x12, 0x0, 0x0, 0x1, 0x3, 0x23, 0x1, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x1, 0x23, 0x3, 0x27, 0x7, 0x3, 0x23, 0x3, 0x27, 0x1, 0xB4, 0xA5, 0xED, 0x1, 0x28, 0xC8, 0xCD, 0x17, 0x18, 0xD0, 0xC7, 0x1, 0x28, 0xED, 0x9D, 0xC, 0xE, 0xD5, 0xB8, 0xD6, 0xA, 0x2, 0xBE, 0xFD, 0x42, 0x4, 0x3A, 0xFD, 0x64, 0x6D, 0x6D, 0x2, 0x9C, 0xFB, 0xC6, 0x2, 0xC4, 0x51, 0x4F, 0xFD, 0x3A, 0x2, 0xC5, 0x39, 0x0, 0x1, 0x0, 0xD, 0x0, 0x0, 0x3, 0xD8, 0x5, 0xEF, 0x0, 0x10, 0x0, 0x0, 0x21, 0x3, 0x3, 0x21, 0x1, 0x12, 0x37, 0x37, 0x32, 0x17, 0x15, 0x27, 0x22, 0x6, 0x7, 0x7, 0x1, 0x2, 0xD1, 0xE5, 0xDC, 0xFE, 0xFD, 0x1, 0xAB, 0x5B, 0xCB, 0x2D, 0x2E, 0x47, 0x2E, 0x5A, 0x5E, 0x1C, 0x23, 0x1, 0x7D, 0x2, 0xDF, 0xFD, 0x21, 0x4, 0xD2, 0x1, 0x6, 0x15, 0x2, 0x11, 0xBC, 0x3, 0x41, 0x51, 0x5D, 0xFB, 0xCA, 0x0, 0x1, 0x0, 0x8, 0x0, 0x0, 0x4, 0x31, 0x4, 0x39, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x2, 0x93, 0xF3, 0xFE, 0x68, 0x1, 0xB, 0x1, 0xA, 0x1, 0x9, 0x1, 0xB, 0xFE, 0x62, 0x1, 0x6D, 0x2, 0xCC, 0xFD, 0xFE, 0x2, 0x2, 0xFD, 0x2B, 0x0, 0x1, 0x0, 0x52, 0xFE, 0x4B, 0x4, 0x99, 0x4, 0x3A, 0x0, 0x14, 0x0, 0x0, 0x1, 0x20, 0x3, 0x35, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x4, 0x2B, 0xFE, 0xF1, 0x6, 0xFD, 0x3C, 0x2, 0x26, 0xFD, 0xE5, 0x3, 0x4E, 0xFD, 0xD6, 0x2, 0x3C, 0x5C, 0x40, 0x23, 0x1D, 0x33, 0xFE, 0x4B, 0x1, 0x33, 0x82, 0x9F, 0x2, 0xD7, 0xC4, 0x99, 0xFD, 0x22, 0xFE, 0xC8, 0x56, 0x3F, 0x7, 0xA3, 0xF, 0x0, 0x2, 0x0, 0x52, 0xFF, 0x1B, 0x4, 0xE3, 0x4, 0x3A, 0x0, 0x8, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x33, 0x32, 0x36, 0x35, 0x34, 0x1, 0x7, 0x27, 0x37, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x33, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x3, 0xCA, 0x32, 0x66, 0x4C, 0x69, 0x56, 0x72, 0xFE, 0x4D, 0x9B, 0x9C, 0x52, 0xFE, 0xD3, 0x2, 0x26, 0xFD, 0xE5, 0x3, 0x4E, 0xFD, 0xD6, 0x87, 0x8E, 0xC8, 0x83, 0x80, 0x82, 0xF0, 0xAC, 0x1, 0x9E, 0x6C, 0x6F, 0x4C, 0x3D, 0x52, 0xFE, 0x62, 0xE5, 0x71, 0x74, 0x9F, 0x2, 0xD7, 0xC4, 0x99, 0xFD, 0x22, 0xC8, 0xC7, 0x89, 0x72, 0x9A, 0xBD, 0x0, 0x1, 0x0, 0x51, 0xFE, 0x4B, 0x4, 0x39, 0x4, 0x3A, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x22, 0x24, 0x27, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x17, 0x1, 0x17, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x39, 0xB3, 0xFE, 0xE8, 0x1D, 0xF3, 0xF, 0x76, 0x70, 0x80, 0x8E, 0x9B, 0x93, 0x8D, 0x1, 0x69, 0xFD, 0x91, 0x3, 0x89, 0x1, 0xFE, 0x78, 0x16, 0xC5, 0xD6, 0xFE, 0xDF, 0xFE, 0x4B, 0xAB, 0xDE, 0x56, 0x70, 0x89, 0x6B, 0x8F, 0x80, 0xAC, 0x1, 0xBA, 0xC3, 0x9B, 0xFE, 0x1A, 0x2, 0x13, 0xEA, 0xBF, 0xCF, 0xE1, 0x0, 0x2, 0x0, 0x51, 0xFE, 0x4B, 0x4, 0x8F, 0x4, 0x3A, 0x0, 0x1F, 0x0, 0x29, 0x0, 0x0, 0x1, 0x22, 0x24, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x37, 0x26, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x17, 0x1, 0x17, 0x16, 0x16, 0x15, 0x14, 0x7, 0x17, 0x7, 0x27, 0x6, 0x27, 0x32, 0x37, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x2, 0x20, 0xC1, 0xFE, 0xF2, 0xBE, 0x92, 0x79, 0xC8, 0x5F, 0x2, 0x9, 0x98, 0x89, 0x8D, 0x1, 0x69, 0xFD, 0x91, 0x3, 0x89, 0x1, 0xFE, 0x78, 0x18, 0xC5, 0xD4, 0x23, 0x79, 0x86, 0x70, 0x8E, 0xE0, 0x79, 0x4B, 0x54, 0xA4, 0x4D, 0x6D, 0x89, 0xFE, 0x4B, 0xA8, 0x9B, 0x78, 0x99, 0x5A, 0x49, 0x22, 0x81, 0x72, 0xAC, 0x1, 0xBA, 0xC3, 0x9B, 0xFE, 0x1A, 0x3, 0x12, 0xEC, 0xC0, 0x5F, 0x4C, 0x6E, 0x94, 0x68, 0x68, 0xC3, 0x38, 0x46, 0x5D, 0x5B, 0x47, 0x39, 0x0, 0x1, 0x0, 0x3B, 0x0, 0x0, 0x3, 0xE1, 0x6, 0x15, 0x0, 0x18, 0x0, 0x0, 0x21, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x24, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x7, 0x2, 0x74, 0xF9, 0x7C, 0x95, 0x62, 0x62, 0x95, 0x58, 0x7A, 0x5, 0xE5, 0x5, 0x1, 0x0, 0xB4, 0xFA, 0xF3, 0xB5, 0xB8, 0x2, 0x2B, 0xDC, 0x81, 0x6E, 0x83, 0xD9, 0x67, 0x50, 0x9D, 0xDD, 0xFE, 0xC0, 0xDF, 0x6E, 0xC1, 0xFE, 0xD7, 0x29, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x3, 0xF5, 0x6, 0x15, 0x0, 0x18, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x26, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x17, 0x2, 0xAC, 0xF3, 0xB7, 0xB2, 0xF3, 0xF9, 0xC5, 0xF0, 0x4, 0xE4, 0x5, 0x70, 0x63, 0x94, 0x63, 0x55, 0x7F, 0x2, 0x2B, 0xFD, 0xD5, 0x1, 0x74, 0x2B, 0x1, 0x28, 0xBF, 0x70, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0x70, 0x7B, 0xD1, 0xF, 0x0, 0x1, 0x0, 0x3B, 0xFF, 0xEC, 0x3, 0xE1, 0x5, 0xFF, 0x0, 0x18, 0x0, 0x0, 0x5, 0x22, 0x26, 0x27, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x27, 0x23, 0x11, 0x33, 0x11, 0x16, 0x12, 0x15, 0x15, 0x14, 0x2, 0x1, 0xF5, 0xC4, 0xF1, 0x5, 0xE5, 0x5, 0x6F, 0x63, 0x95, 0x62, 0x55, 0x7F, 0x95, 0xF3, 0xB7, 0xB2, 0xF3, 0x14, 0xE4, 0xB3, 0x56, 0x7E, 0xDB, 0x82, 0x70, 0x7A, 0xD1, 0xF, 0x2, 0x29, 0xFE, 0x8D, 0x2A, 0xFE, 0xD8, 0xBE, 0x70, 0xDF, 0xFE, 0xBF, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x4B, 0x3, 0xF5, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x5, 0x32, 0x36, 0x37, 0x33, 0x6, 0x4, 0x23, 0x22, 0x2, 0x35, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x14, 0x16, 0x2, 0x3A, 0x58, 0x7A, 0x5, 0xE4, 0x4, 0xFF, 0x0, 0xB5, 0xFA, 0xF2, 0xF3, 0xF9, 0xC5, 0xF0, 0x4, 0xE4, 0x5, 0x70, 0x63, 0x94, 0x63, 0x62, 0xF2, 0x67, 0x50, 0x9D, 0xDD, 0x1, 0x41, 0xDF, 0x1, 0xC4, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0xFE, 0x3C, 0x83, 0xDA, 0x0, 0x3, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x27, 0x0, 0x0, 0x1, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x27, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x5, 0x1F, 0xFE, 0xB5, 0xFE, 0xF0, 0xFE, 0xF6, 0xFE, 0xAC, 0x1, 0x52, 0x1, 0xA, 0x1, 0x10, 0x1, 0x4D, 0xFD, 0xB9, 0xA7, 0xA2, 0xBD, 0xBF, 0xA2, 0xA8, 0xB6, 0xFE, 0x13, 0x4A, 0x43, 0x44, 0x4A, 0x4A, 0x44, 0x43, 0x4A, 0x2, 0xB3, 0xFE, 0xB4, 0xFE, 0x85, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xFE, 0x84, 0xFE, 0xB4, 0x2, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0x29, 0x3A, 0x4D, 0x4D, 0x3A, 0x38, 0x4D, 0x4D, 0x0, 0x2, 0x0, 0x61, 0xFF, 0xEC, 0x3, 0xF0, 0x4, 0x4D, 0x0, 0x15, 0x0, 0x27, 0x0, 0x0, 0x1, 0x31, 0x14, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x15, 0x31, 0x15, 0x1, 0x32, 0x36, 0x10, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x33, 0x15, 0x23, 0x6, 0x15, 0x14, 0x16, 0x3, 0xF0, 0x8F, 0xD7, 0x6D, 0xC4, 0xF8, 0xB9, 0xA6, 0xE5, 0xC4, 0x75, 0xD6, 0x88, 0xFE, 0x26, 0x6B, 0x7D, 0x8D, 0x5B, 0x62, 0x4D, 0x9A, 0x62, 0x58, 0xB7, 0x5E, 0x2, 0x27, 0xE4, 0xF7, 0x60, 0xAC, 0x9A, 0xBA, 0x41, 0x4C, 0x99, 0x9A, 0xA1, 0x63, 0xEF, 0xD3, 0x1, 0xFE, 0x7F, 0xAF, 0x1, 0xA6, 0x97, 0x57, 0x34, 0x81, 0x5, 0xB0, 0x2, 0x92, 0x3A, 0x5D, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xED, 0x5, 0x17, 0x4, 0x99, 0x0, 0x28, 0x0, 0x0, 0x25, 0x6, 0x6, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x23, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x23, 0x35, 0x21, 0x4, 0x4D, 0x2C, 0xF0, 0xD1, 0xEA, 0xFE, 0xDA, 0x1, 0x26, 0xE2, 0xD6, 0x7C, 0x3A, 0xC5, 0x3B, 0x33, 0x1C, 0x23, 0x41, 0x5D, 0xF2, 0x1B, 0xD5, 0x7D, 0x99, 0x99, 0x85, 0x6C, 0x72, 0x17, 0xEF, 0x1, 0xE7, 0xA0, 0x38, 0x7B, 0x1, 0xC, 0xD4, 0xA4, 0xD4, 0x1, 0x9, 0x5F, 0xAA, 0xF, 0xA3, 0x7, 0x3E, 0x56, 0x82, 0xB6, 0xA2, 0x7A, 0xA5, 0x79, 0xA6, 0x27, 0x11, 0x9E, 0xB2, 0x0, 0x3, 0x0, 0x1E, 0xFE, 0x4B, 0x3, 0x99, 0x5, 0xD5, 0x0, 0x9, 0x0, 0x1A, 0x0, 0x23, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x3, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x35, 0x23, 0x22, 0x15, 0x14, 0x16, 0x1, 0xBF, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x5A, 0x9A, 0xAD, 0xA9, 0x8A, 0x7D, 0xF3, 0xD8, 0xD8, 0x96, 0xC9, 0x6C, 0x62, 0x6B, 0x38, 0x5, 0x54, 0x38, 0x49, 0x49, 0x38, 0x37, 0x4A, 0x4A, 0xF9, 0x2E, 0x99, 0x78, 0x80, 0x8E, 0x3, 0xD0, 0xFC, 0x30, 0xB4, 0x13, 0x87, 0xD1, 0xAF, 0x77, 0x45, 0x5E, 0x2C, 0x32, 0x0, 0x1, 0xFF, 0xF6, 0xFE, 0x60, 0x3, 0xB0, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x0, 0x1, 0x23, 0x11, 0x7, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x37, 0x11, 0x33, 0x3, 0xB0, 0xF3, 0x4D, 0xFE, 0xD6, 0xFE, 0xDB, 0x1, 0x93, 0xFE, 0x42, 0x1, 0x19, 0x1, 0x41, 0x6D, 0xF3, 0xFE, 0x60, 0x3, 0x50, 0x60, 0xFE, 0xB0, 0x1, 0xC2, 0x2, 0x78, 0xFE, 0x2E, 0x70, 0x1, 0x62, 0x0, 0x1, 0x0, 0x7A, 0x0, 0x0, 0x3, 0x65, 0x4, 0x3A, 0x0, 0x5, 0x0, 0x0, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x7A, 0xF3, 0x1, 0xF8, 0x4, 0x3A, 0xFC, 0x87, 0xC1, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x60, 0x4, 0xE0, 0x5, 0x72, 0x0, 0x19, 0x0, 0x25, 0x0, 0x0, 0x1, 0x23, 0x11, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x4, 0x3, 0xF3, 0x6A, 0xAA, 0xCA, 0xE2, 0xE1, 0xCD, 0xA9, 0x69, 0xD7, 0x7D, 0x49, 0x33, 0x25, 0x1B, 0x40, 0x5D, 0xFE, 0x36, 0x92, 0x45, 0x46, 0x8F, 0x83, 0x76, 0x74, 0xFE, 0x60, 0x1, 0xFD, 0x71, 0x1, 0x3A, 0xED, 0x14, 0xF7, 0x1, 0x30, 0x6F, 0x54, 0xB3, 0x8C, 0xF, 0xA2, 0x7, 0x3F, 0x56, 0xFC, 0x7C, 0x7C, 0x1, 0xEA, 0x76, 0xD2, 0x92, 0x15, 0x91, 0xD2, 0x0, 0x1, 0x0, 0x3B, 0x0, 0x0, 0x3, 0xE1, 0x6, 0x15, 0x0, 0x20, 0x0, 0x0, 0x25, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x24, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x7, 0x15, 0x33, 0x3, 0x43, 0xCF, 0xF9, 0xD6, 0xD6, 0x7C, 0x95, 0x62, 0x62, 0x95, 0x58, 0x7A, 0x5, 0xE5, 0x5, 0x1, 0x0, 0xB4, 0xFA, 0xF3, 0xB5, 0xB8, 0xCF, 0x8C, 0x8C, 0x8C, 0xAB, 0xF4, 0xDC, 0x81, 0x6E, 0x83, 0xD9, 0x67, 0x50, 0x9D, 0xDD, 0xFE, 0xC0, 0xDF, 0x6E, 0xC1, 0xFE, 0xD7, 0x29, 0x3E, 0xFF, 0xFF, 0x0, 0x50, 0x0, 0x0, 0x3, 0xF5, 0x6, 0x15, 0x0, 0x26, 0x1, 0x49, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0x0, 0x53, 0xFE, 0x5, 0x0, 0x3, 0x0, 0x50, 0xFF, 0xEC, 0x7, 0x72, 0x6, 0x0, 0x0, 0xB, 0x0, 0xE, 0x0, 0x23, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x1, 0x21, 0x3, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x21, 0x15, 0x1, 0x21, 0x15, 0x2, 0x37, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x2, 0x50, 0x2, 0x25, 0xFD, 0xDB, 0xDD, 0xB, 0x6C, 0xB7, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xF3, 0x3, 0x59, 0xFD, 0xD6, 0x2, 0x3F, 0xB3, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0x14, 0x2, 0xD7, 0xFC, 0x8A, 0x70, 0x84, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x2, 0x29, 0xFE, 0x3A, 0x99, 0xFD, 0x22, 0xC3, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x4B, 0x7, 0x11, 0x6, 0x0, 0x0, 0xB, 0x0, 0x36, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0x22, 0x24, 0x27, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x11, 0x23, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x37, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x3, 0x5C, 0xB3, 0xFE, 0xDA, 0x26, 0xF3, 0x14, 0x7F, 0x76, 0x83, 0x8E, 0x9A, 0x94, 0x8D, 0x1, 0x6A, 0xFE, 0x37, 0xDD, 0xB, 0x6C, 0xB7, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xF3, 0x2, 0xE2, 0x1, 0xFE, 0x79, 0xCE, 0xE3, 0xFE, 0xDF, 0xB3, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xFD, 0x98, 0x99, 0xCB, 0x48, 0x59, 0x89, 0x6B, 0x8F, 0x80, 0xAC, 0x1, 0xBA, 0xFC, 0x89, 0x70, 0x84, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x2, 0x29, 0xFE, 0x3A, 0x9B, 0xFE, 0x1D, 0x15, 0xE6, 0xC4, 0xD1, 0xE1, 0x0, 0x4, 0x0, 0x50, 0xFF, 0x1B, 0x8, 0x94, 0x6, 0x0, 0x0, 0xB, 0x0, 0xE, 0x0, 0x17, 0x0, 0x38, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x1, 0x21, 0x1, 0x22, 0x6, 0x7, 0x33, 0x32, 0x36, 0x35, 0x34, 0x1, 0x7, 0x27, 0x37, 0x21, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x21, 0x15, 0x1, 0x33, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x2, 0x37, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x2, 0x50, 0x2, 0x25, 0xFD, 0xDB, 0x3, 0x77, 0x32, 0x66, 0x4C, 0x69, 0x56, 0x72, 0xFE, 0x4C, 0x9A, 0x9C, 0x53, 0xFD, 0xF6, 0xB, 0x6C, 0xB7, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xF3, 0x3, 0x58, 0xFD, 0xD6, 0x8A, 0x8E, 0xC5, 0x83, 0x80, 0x82, 0xF0, 0xAC, 0xB3, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0x13, 0x2, 0xD6, 0xFE, 0x28, 0x6C, 0x6F, 0x4E, 0x41, 0x4C, 0xFE, 0x62, 0xE5, 0x71, 0x74, 0x70, 0x84, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x2, 0x29, 0xFE, 0x3A, 0x99, 0xFD, 0x22, 0xC8, 0xC7, 0x89, 0x72, 0x9A, 0xBD, 0x0, 0x2, 0x0, 0x8, 0x0, 0x0, 0x5, 0x86, 0x5, 0x41, 0x0, 0x11, 0x0, 0x32, 0x0, 0x0, 0x25, 0x32, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x37, 0x23, 0x11, 0x14, 0x16, 0x33, 0x33, 0x31, 0x7, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x3, 0xD3, 0xC4, 0x53, 0x90, 0xB7, 0xD2, 0x1F, 0x9D, 0x40, 0x31, 0x55, 0xA0, 0x79, 0x9F, 0xB3, 0xB3, 0xF2, 0x1, 0x87, 0x47, 0x52, 0xCB, 0xE6, 0xF3, 0x60, 0x5F, 0x5B, 0x59, 0x72, 0x6B, 0xCA, 0xC7, 0xEF, 0xC7, 0xC9, 0x66, 0x31, 0x48, 0x1D, 0x25, 0x99, 0x83, 0x44, 0x3D, 0xFD, 0xCB, 0x50, 0x38, 0xCA, 0x9D, 0xB5, 0x2, 0x35, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0x14, 0xC6, 0x92, 0x3F, 0x63, 0x52, 0x36, 0x40, 0x39, 0x17, 0x2B, 0x98, 0x89, 0x90, 0xA4, 0x0, 0x2, 0x0, 0x8, 0xFE, 0x4B, 0x4, 0x7A, 0x6, 0x15, 0x0, 0x7, 0x0, 0x2B, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x23, 0x11, 0x14, 0x16, 0x13, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x35, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x11, 0x14, 0x6, 0x2, 0x1E, 0x25, 0x32, 0xC8, 0x33, 0xD, 0x43, 0x46, 0x7, 0x28, 0x35, 0xAB, 0x2, 0x52, 0x49, 0xA6, 0x79, 0xB3, 0xB3, 0xF2, 0xC8, 0xCD, 0xB0, 0x42, 0x46, 0x6, 0x2A, 0x34, 0xAD, 0xCC, 0xB6, 0x7, 0x2, 0xCA, 0xFD, 0xB7, 0x4E, 0x3A, 0xFD, 0x95, 0x12, 0xBE, 0x8, 0xA8, 0x40, 0xF, 0xB6, 0x9C, 0x2, 0x49, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0x67, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xAC, 0xFB, 0x1E, 0xB4, 0xC0, 0x0, 0x2, 0x0, 0x8, 0xFF, 0xEC, 0x6, 0x2, 0x5, 0x41, 0x0, 0x32, 0x0, 0x3D, 0x0, 0x0, 0x25, 0x32, 0x37, 0x26, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x5, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x16, 0x2, 0x13, 0x37, 0x50, 0x3E, 0xF4, 0xF8, 0xC5, 0xF1, 0x4, 0xE4, 0x5, 0x70, 0x63, 0x94, 0x63, 0xD, 0x5D, 0xCE, 0x6F, 0x87, 0x85, 0xF7, 0xC2, 0xC1, 0x7D, 0xA3, 0x95, 0x79, 0x9F, 0xB3, 0xB3, 0xF2, 0xB1, 0xB1, 0x3A, 0x2, 0x6C, 0x4F, 0x7B, 0x36, 0x21, 0x3C, 0x86, 0x4C, 0x3C, 0xB6, 0x33, 0x7E, 0xA4, 0x24, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x50, 0x3D, 0x48, 0x78, 0x93, 0x67, 0x94, 0xC4, 0x6A, 0x6A, 0x9D, 0xB5, 0x2, 0x49, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0xFD, 0xB7, 0x50, 0x38, 0x7, 0x44, 0x3C, 0x2D, 0x22, 0x61, 0x40, 0x2E, 0x0, 0x1, 0x0, 0x2D, 0xFE, 0x7D, 0x6, 0x59, 0x6, 0x15, 0x0, 0x2E, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x21, 0x15, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x6, 0x5, 0x5, 0x43, 0x39, 0x1D, 0x23, 0x41, 0x5C, 0x62, 0x5D, 0x93, 0x48, 0xF2, 0xFE, 0xEC, 0xF4, 0xA5, 0xA5, 0xCC, 0xB0, 0x43, 0x46, 0x6, 0x2A, 0x34, 0xAB, 0x2, 0x2, 0x6, 0x76, 0xB7, 0xA0, 0xC0, 0xD6, 0xFE, 0x7D, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x2, 0xD9, 0x83, 0x6F, 0x83, 0xFC, 0xFB, 0x3, 0x87, 0xFC, 0x79, 0x3, 0x87, 0xB3, 0x67, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xA8, 0x6B, 0x77, 0x8B, 0xD0, 0xEA, 0xFD, 0x29, 0xB3, 0x8D, 0x0, 0x1, 0x0, 0x8C, 0xFF, 0xEC, 0x5, 0x1E, 0x6, 0x0, 0x0, 0x27, 0x0, 0x0, 0x5, 0x20, 0x27, 0x15, 0x23, 0x11, 0x33, 0x11, 0x16, 0x4, 0x33, 0x32, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x3, 0x5D, 0xFE, 0xF7, 0xD5, 0xF3, 0xF3, 0x8A, 0x1, 0x4, 0x4F, 0xD3, 0x5D, 0x84, 0xB2, 0xD8, 0xE0, 0xC1, 0xCB, 0xE6, 0xF2, 0x60, 0x5F, 0x5C, 0x58, 0x6E, 0x76, 0xC1, 0xC8, 0xF1, 0x14, 0x6E, 0x5A, 0x6, 0x0, 0xFB, 0x3D, 0x5C, 0x3D, 0x82, 0x3B, 0x46, 0x1D, 0x27, 0x93, 0x88, 0x85, 0xC3, 0xC6, 0x92, 0x3F, 0x63, 0x52, 0x36, 0x3C, 0x3F, 0x18, 0x27, 0x99, 0x89, 0x90, 0xB8, 0x0, 0x2, 0x0, 0x8C, 0x0, 0x0, 0x4, 0xEE, 0x6, 0x0, 0x0, 0x2, 0x0, 0xB, 0x0, 0x0, 0x25, 0x1, 0x21, 0x3, 0x11, 0x33, 0x11, 0x21, 0x15, 0x1, 0x21, 0x15, 0x1, 0x7F, 0x2, 0x22, 0xFD, 0xDE, 0xF3, 0xF3, 0x3, 0x5A, 0xFD, 0xAC, 0x2, 0x69, 0xD2, 0x2, 0xA4, 0xFC, 0x8A, 0x6, 0x0, 0xFE, 0x3A, 0x99, 0xFD, 0x22, 0xC3, 0x0, 0x2, 0x0, 0x36, 0x0, 0x0, 0x3, 0x90, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x19, 0x0, 0x0, 0x13, 0x3, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x3, 0x23, 0xB, 0x3, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x3, 0x23, 0x3, 0x3, 0xDB, 0xA5, 0xB0, 0x49, 0x6E, 0x8C, 0x70, 0x47, 0xB0, 0xA5, 0x90, 0x77, 0x78, 0x91, 0xA5, 0xB0, 0x49, 0x6E, 0x8C, 0x70, 0x47, 0xB0, 0xA5, 0x90, 0x77, 0x78, 0x3, 0x67, 0x2, 0x49, 0xFE, 0xA3, 0x1, 0x5D, 0xFE, 0xA3, 0x1, 0x5D, 0xFD, 0xB7, 0x1, 0x6D, 0xFE, 0x93, 0xFC, 0x99, 0x2, 0x49, 0xFE, 0xA3, 0x1, 0x5D, 0xFE, 0xA3, 0x1, 0x5D, 0xFD, 0xB7, 0x1, 0x6D, 0xFE, 0x93, 0x0, 0x2, 0x0, 0x57, 0x0, 0x0, 0x3, 0x86, 0x5, 0xAF, 0x0, 0x7, 0x0, 0xF, 0x0, 0x0, 0x1, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x3, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x2, 0xD2, 0xFE, 0x39, 0xB4, 0x3, 0x2F, 0xB4, 0xFE, 0x39, 0xB4, 0x3, 0x2F, 0x3, 0x69, 0x1, 0xB6, 0xFE, 0x4A, 0x2, 0x46, 0xFD, 0xBA, 0xFC, 0x97, 0x1, 0xB6, 0xFE, 0x4A, 0x2, 0x46, 0xFD, 0xBA, 0x0, 0x1, 0x0, 0x1B, 0xFE, 0x60, 0x4, 0x8E, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x16, 0x16, 0x33, 0x32, 0x37, 0x11, 0x4, 0x8E, 0xF3, 0x6B, 0xBD, 0xA0, 0xC5, 0x65, 0x48, 0x26, 0x20, 0x3F, 0x48, 0x8B, 0xD4, 0x1, 0x6B, 0x46, 0xAF, 0x39, 0x4, 0x3A, 0xFA, 0x26, 0x2, 0x10, 0x84, 0xDB, 0xFA, 0x1, 0x2D, 0x5F, 0x46, 0x7, 0xB1, 0x11, 0x9E, 0xC2, 0xFE, 0xCA, 0x9D, 0x68, 0x98, 0x2, 0xEF, 0x0, 0x1, 0x0, 0x1B, 0xFE, 0x4B, 0x5, 0x56, 0x4, 0x4E, 0x0, 0x27, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x16, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x5, 0x56, 0x37, 0x45, 0x7E, 0xD6, 0x6B, 0xBD, 0xA0, 0xC5, 0x1, 0x5C, 0x41, 0x1D, 0x23, 0x37, 0x45, 0x7E, 0xD7, 0x1, 0x6A, 0x47, 0xB1, 0x37, 0xF3, 0x5D, 0x40, 0x22, 0x1E, 0xFE, 0x58, 0xD, 0x8D, 0xB3, 0xE6, 0x85, 0xDB, 0xFA, 0x7A, 0xD4, 0x56, 0x40, 0x7, 0xA3, 0xD, 0x8D, 0xB2, 0xFE, 0xA9, 0x9D, 0x68, 0x9A, 0x2, 0xED, 0xFB, 0x51, 0x56, 0x40, 0x6, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x2, 0xFA, 0x7, 0x2E, 0x0, 0x10, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x26, 0x1, 0xB3, 0x62, 0x28, 0xC5, 0xC5, 0x4C, 0x82, 0x78, 0x8B, 0xC5, 0x4, 0x5, 0x13, 0x59, 0xFD, 0xD2, 0x4, 0xA2, 0xFE, 0x1B, 0x71, 0x91, 0xA2, 0xFE, 0x5, 0x1, 0xD9, 0xAE, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x2, 0xFA, 0x7, 0xE, 0x0, 0x17, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x36, 0x33, 0x32, 0x17, 0x15, 0x27, 0x22, 0x15, 0x15, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x26, 0x1, 0xB3, 0x62, 0x28, 0xC5, 0x2, 0xBA, 0x40, 0x55, 0x44, 0x48, 0x4C, 0x82, 0x78, 0x8B, 0xC5, 0x4, 0x5, 0x13, 0x59, 0xFD, 0xD2, 0x3, 0x8D, 0xF5, 0x10, 0xB4, 0x8, 0x4F, 0xBA, 0x71, 0x91, 0xA2, 0xFE, 0x5, 0x1, 0xD9, 0xAE, 0x0, 0x2, 0x0, 0x22, 0x1, 0x4C, 0x1, 0x8B, 0x6, 0xED, 0x0, 0x9, 0x0, 0x16, 0x0, 0x0, 0x12, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x17, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0xA5, 0x3C, 0x36, 0x38, 0x3C, 0x3C, 0x38, 0x36, 0x3C, 0x14, 0xC5, 0x79, 0x83, 0x31, 0x2F, 0x16, 0x21, 0x60, 0x6, 0xAF, 0x3E, 0x3E, 0x5C, 0x3D, 0x3D, 0xA3, 0xFC, 0xC9, 0x86, 0xA7, 0xD, 0xA6, 0x6, 0x80, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x2, 0x12, 0x5, 0xBA, 0x0, 0xD, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x1, 0xAE, 0x5E, 0x27, 0xC5, 0x98, 0x1E, 0x44, 0x74, 0x2F, 0x11, 0x2E, 0x4, 0xFB, 0x4F, 0xFD, 0xE0, 0x3, 0x21, 0x73, 0x80, 0x7, 0xCE, 0x16, 0x0, 0x1, 0x0, 0x28, 0x2, 0x7F, 0x1, 0xD6, 0x5, 0xAD, 0x0, 0xD, 0x0, 0x0, 0x1, 0x27, 0x6, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x1, 0x3E, 0x1E, 0x44, 0x73, 0x2F, 0x12, 0x33, 0x31, 0x5E, 0x27, 0xC5, 0x2, 0x8C, 0x73, 0x80, 0x7, 0xCE, 0x16, 0x4F, 0x2, 0x20, 0xFC, 0xDF, 0x0, 0x1, 0x0, 0x28, 0x1, 0x4C, 0x2, 0x62, 0x5, 0xAD, 0x0, 0x15, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x6, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x14, 0x33, 0x32, 0x37, 0x15, 0x6, 0x1, 0xCD, 0xB7, 0x5, 0x42, 0x66, 0x2F, 0x12, 0x33, 0x31, 0x5E, 0x27, 0xC5, 0x48, 0x1D, 0x27, 0x52, 0x1, 0x4C, 0xED, 0xAD, 0x67, 0x7, 0xCE, 0x16, 0x4F, 0x2, 0x20, 0xFC, 0xAB, 0x50, 0x9, 0xB4, 0x11, 0x0, 0x2, 0x0, 0x64, 0x2, 0x8C, 0x3, 0x3E, 0x5, 0xAD, 0x0, 0xC, 0x0, 0x15, 0x0, 0x0, 0x13, 0x11, 0x33, 0x11, 0x33, 0x13, 0x33, 0x3, 0x16, 0x15, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x64, 0xC5, 0x99, 0x9C, 0xE0, 0xB7, 0x88, 0xAC, 0x98, 0xA2, 0x91, 0x4C, 0x44, 0x40, 0x46, 0x9B, 0x2, 0x8C, 0x3, 0x21, 0xFE, 0xFF, 0x1, 0x1, 0xFE, 0xD3, 0x4E, 0x99, 0x6D, 0xA0, 0xA7, 0x3D, 0x2E, 0x2C, 0x3B, 0x0, 0x1, 0x0, 0x28, 0x2, 0x8C, 0x4, 0x52, 0x5, 0xAD, 0x0, 0xF, 0x0, 0x0, 0x13, 0x3, 0x33, 0x13, 0x35, 0x13, 0x33, 0x13, 0x15, 0x37, 0x13, 0x33, 0x3, 0x23, 0x3, 0x3, 0xF6, 0xCE, 0xD0, 0x67, 0x91, 0x9A, 0x91, 0x1, 0x66, 0xD0, 0xCD, 0xB5, 0x93, 0x93, 0x2, 0x8C, 0x3, 0x21, 0xFE, 0x2, 0x3, 0x1, 0xFB, 0xFE, 0x6, 0x2, 0x7, 0x1, 0xF5, 0xFC, 0xDF, 0x1, 0xDE, 0xFE, 0x22, 0x0, 0x1, 0x0, 0x2F, 0x1, 0x4C, 0x3, 0x1D, 0x5, 0xAD, 0x0, 0x10, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x37, 0x37, 0x1, 0x33, 0x13, 0x13, 0x33, 0x1, 0x6, 0x6, 0xE6, 0x2F, 0x2C, 0x30, 0x38, 0x34, 0x10, 0x12, 0xFE, 0xE6, 0xDE, 0x9A, 0x9E, 0xD8, 0xFE, 0xC3, 0x17, 0x71, 0x1, 0x4C, 0xD, 0x9D, 0x2, 0x30, 0x31, 0x37, 0x3, 0x21, 0xFE, 0x6, 0x1, 0xFA, 0xFC, 0x69, 0x43, 0x87, 0x0, 0x1, 0x0, 0x23, 0x4, 0xBC, 0x1, 0x72, 0x6, 0x1A, 0x0, 0x3, 0x0, 0x0, 0x13, 0x13, 0x33, 0x3, 0x23, 0x6E, 0xE1, 0xC8, 0x4, 0xBC, 0x1, 0x5E, 0xFE, 0xA2, 0xFF, 0xFF, 0x0, 0x23, 0x4, 0xBC, 0x2, 0xC1, 0x6, 0x1A, 0x0, 0x26, 0x1, 0x6B, 0x0, 0x0, 0x0, 0x7, 0x1, 0x6B, 0x1, 0x4F, 0x0, 0x0, 0x0, 0x1, 0x0, 0x50, 0x3, 0xE1, 0x1, 0x86, 0x6, 0x25, 0x0, 0x8, 0x0, 0x0, 0x13, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x7, 0x15, 0x50, 0x65, 0x51, 0x80, 0x58, 0x2, 0x3, 0xE1, 0xBE, 0x64, 0xDC, 0x46, 0x4D, 0x88, 0xA4, 0xCB, 0x0, 0x1, 0x0, 0x50, 0x3, 0xE1, 0x1, 0x86, 0x6, 0x25, 0x0, 0x8, 0x0, 0x0, 0x13, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x26, 0x35, 0x50, 0xDC, 0x2, 0x58, 0x80, 0x51, 0x65, 0x6, 0x25, 0xCB, 0xA2, 0x8A, 0x4D, 0x47, 0xDC, 0x63, 0x0, 0x1, 0x0, 0x36, 0x4, 0x62, 0x1, 0x6, 0x5, 0xEB, 0x0, 0xC, 0x0, 0x0, 0x13, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x16, 0x14, 0x6, 0x36, 0x2A, 0x38, 0x38, 0x2A, 0x56, 0x7A, 0x7A, 0x4, 0x62, 0x5D, 0x3A, 0x2B, 0x2E, 0x3A, 0x5F, 0x71, 0xAC, 0x6C, 0x0, 0x1, 0x0, 0x36, 0x4, 0x62, 0x1, 0x6, 0x5, 0xEB, 0x0, 0xC, 0x0, 0x0, 0x1, 0x15, 0x22, 0x26, 0x34, 0x36, 0x33, 0x15, 0x22, 0x6, 0x15, 0x14, 0x16, 0x1, 0x6, 0x56, 0x7A, 0x7A, 0x56, 0x2B, 0x37, 0x37, 0x4, 0xBF, 0x5D, 0x6C, 0xAC, 0x71, 0x5F, 0x3A, 0x2E, 0x2B, 0x3A, 0x0, 0x1, 0x0, 0x1B, 0x2, 0x8C, 0x2, 0xC1, 0x7, 0xE, 0x0, 0x18, 0x0, 0x0, 0x1, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x7, 0x1, 0xD1, 0xC9, 0x46, 0x6B, 0x40, 0x3F, 0x5E, 0x46, 0x3D, 0x8, 0xB6, 0x4, 0xAD, 0x8F, 0xB3, 0xB3, 0x78, 0x78, 0x2, 0x8C, 0x1, 0x7D, 0x93, 0x5E, 0x87, 0x67, 0x80, 0x45, 0x35, 0x7E, 0xA2, 0xE1, 0xAA, 0x85, 0x9A, 0xCE, 0x22, 0x0, 0x1, 0x0, 0x3C, 0x2, 0x8C, 0x2, 0xE2, 0x7, 0xE, 0x0, 0x16, 0x0, 0x0, 0x1, 0x11, 0x23, 0x35, 0x26, 0x11, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x1, 0xF5, 0xC9, 0xF0, 0xB4, 0xB3, 0x8F, 0xAD, 0x3, 0xB6, 0x10, 0x7B, 0x5E, 0x3E, 0x40, 0x6A, 0x4, 0x9, 0xFE, 0x83, 0xE8, 0x44, 0x1, 0x54, 0x77, 0xAA, 0xE1, 0xA2, 0x7E, 0x7A, 0x80, 0x67, 0x87, 0x5E, 0x93, 0x0, 0x1, 0x0, 0x3D, 0x2, 0x4F, 0x3, 0x23, 0x5, 0x35, 0x0, 0x8, 0x0, 0x0, 0x1, 0x1, 0x35, 0x1, 0x15, 0x5, 0x7, 0x17, 0x5, 0x3, 0x23, 0xFD, 0x1A, 0x2, 0xE6, 0xFE, 0x40, 0x3F, 0x3F, 0x1, 0xC0, 0x2, 0x4F, 0x1, 0x21, 0xA4, 0x1, 0x21, 0xC0, 0xA6, 0xE, 0xF, 0xA3, 0x0, 0x1, 0x0, 0x3D, 0x2, 0x4F, 0x3, 0x23, 0x5, 0x35, 0x0, 0x8, 0x0, 0x0, 0x13, 0x35, 0x25, 0x37, 0x27, 0x25, 0x35, 0x1, 0x15, 0x3D, 0x1, 0xC0, 0x3F, 0x3F, 0xFE, 0x40, 0x2, 0xE6, 0x2, 0x4F, 0xC0, 0xA3, 0xF, 0xE, 0xA6, 0xC0, 0xFE, 0xDF, 0xA4, 0x0, 0x1, 0x0, 0x30, 0x2, 0x44, 0x3, 0x15, 0x5, 0x2B, 0x0, 0x8, 0x0, 0x0, 0x1, 0x3, 0x23, 0x1, 0x33, 0x1, 0x23, 0x3, 0x27, 0x1, 0x93, 0xA4, 0xBF, 0x1, 0x21, 0xA3, 0x1, 0x21, 0xBF, 0xA6, 0xE, 0x4, 0x4, 0xFE, 0x40, 0x2, 0xE7, 0xFD, 0x19, 0x1, 0xC0, 0x3F, 0x0, 0x1, 0x0, 0x30, 0x2, 0x44, 0x3, 0x15, 0x5, 0x2B, 0x0, 0x8, 0x0, 0x0, 0x1, 0x1, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x1, 0x1, 0x51, 0xFE, 0xDF, 0xBF, 0xA4, 0xF, 0xE, 0xA6, 0xBF, 0xFE, 0xDF, 0x2, 0x44, 0x2, 0xE7, 0xFE, 0x40, 0x3F, 0x3F, 0x1, 0xC0, 0xFD, 0x19, 0x0, 0x1, 0x0, 0x95, 0x4, 0xE1, 0x3, 0x44, 0x6, 0x1, 0x0, 0x8, 0x0, 0x0, 0x1, 0x1, 0x15, 0x23, 0x27, 0x7, 0x23, 0x35, 0x1, 0x2, 0x32, 0x1, 0x12, 0xC3, 0x96, 0x96, 0xC0, 0x1, 0xE, 0x6, 0x1, 0xFE, 0xEB, 0xB, 0x9C, 0x9C, 0xD, 0x1, 0x13, 0x0, 0x1, 0x0, 0x72, 0x4, 0xE1, 0x3, 0x35, 0x6, 0x2, 0x0, 0x8, 0x0, 0x0, 0x1, 0x17, 0x37, 0x33, 0x15, 0x1, 0x23, 0x1, 0x35, 0x1, 0x40, 0x93, 0x92, 0xD0, 0xFE, 0xE9, 0x96, 0xFE, 0xEA, 0x6, 0x2, 0x9B, 0x9B, 0xB, 0xFE, 0xEA, 0x1, 0x17, 0xA, 0x0, 0x1, 0x0, 0x3D, 0x4, 0x7A, 0x0, 0xE4, 0x6, 0x1F, 0x0, 0x3, 0x0, 0x0, 0x13, 0x11, 0x23, 0x11, 0xE4, 0xA7, 0x6, 0x1F, 0xFE, 0x5B, 0x1, 0xA5, 0xFF, 0xFF, 0x0, 0x9C, 0x5, 0xC, 0x3, 0x4A, 0x5, 0xAA, 0x0, 0x6, 0x0, 0x71, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x48, 0x4, 0xD2, 0x2, 0x20, 0x6, 0x0, 0x0, 0x6, 0x0, 0x76, 0xD7, 0x0, 0xFF, 0xFF, 0x0, 0x37, 0x4, 0xD2, 0x2, 0x10, 0x6, 0x0, 0x0, 0x6, 0x0, 0x45, 0x6, 0x0, 0x0, 0x1, 0x0, 0x3D, 0xFE, 0x2, 0x0, 0xE4, 0xFF, 0xA2, 0x0, 0x3, 0x0, 0x0, 0x17, 0x11, 0x23, 0x11, 0xE4, 0xA7, 0x5E, 0xFE, 0x60, 0x1, 0xA0, 0xFF, 0xFF, 0x0, 0x51, 0xFE, 0xC1, 0x2, 0xFF, 0xFF, 0x5F, 0x0, 0x7, 0x0, 0x71, 0xFF, 0xB5, 0xF9, 0xB5, 0xFF, 0xFF, 0x0, 0x37, 0xFE, 0x92, 0x2, 0x10, 0xFF, 0xC0, 0x0, 0x7, 0x0, 0x45, 0x0, 0x6, 0xF9, 0xC0, 0xFF, 0xFF, 0x0, 0x48, 0xFE, 0x92, 0x2, 0x20, 0xFF, 0xC0, 0x0, 0x7, 0x0, 0x76, 0xFF, 0xD7, 0xF9, 0xC0, 0x0, 0x2, 0x0, 0x5F, 0x0, 0x0, 0x1, 0x95, 0x4, 0x3A, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x13, 0x21, 0x7, 0x23, 0x3, 0x37, 0x33, 0x17, 0x5F, 0x1, 0x36, 0x91, 0x15, 0x90, 0x90, 0x15, 0x91, 0x4, 0x3A, 0xF2, 0xFC, 0xB8, 0xF2, 0xF2, 0x0, 0x1, 0x0, 0x5F, 0x3, 0x48, 0x1, 0x95, 0x4, 0x3A, 0x0, 0x3, 0x0, 0x0, 0x13, 0x21, 0x7, 0x23, 0x5F, 0x1, 0x36, 0x91, 0x15, 0x4, 0x3A, 0xF2, 0xFF, 0xFF, 0x0, 0x36, 0x0, 0x90, 0x1, 0x6, 0x2, 0x19, 0x0, 0x7, 0x1, 0x6F, 0x0, 0x0, 0xFC, 0x2E, 0x0, 0x1, 0x0, 0x36, 0x0, 0x90, 0x1, 0x6, 0x2, 0x19, 0x0, 0xD, 0x0, 0x0, 0x25, 0x15, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x15, 0x22, 0x6, 0x15, 0x14, 0x16, 0x1, 0x6, 0x56, 0x7A, 0x7A, 0x56, 0x2B, 0x37, 0x37, 0xEE, 0x5E, 0x6C, 0x57, 0x56, 0x70, 0x5F, 0x3A, 0x2D, 0x2C, 0x39, 0x0, 0x1, 0x0, 0x50, 0x0, 0xA3, 0x2, 0x8, 0x2, 0x18, 0x0, 0x7, 0x0, 0x0, 0x25, 0x21, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x2, 0x8, 0xFE, 0x48, 0x88, 0xA8, 0x88, 0xA3, 0x9F, 0xD6, 0xD6, 0x0, 0x1, 0x0, 0x50, 0x0, 0xA3, 0x2, 0x8, 0x2, 0x2C, 0x0, 0x7, 0x0, 0x0, 0x37, 0x35, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0xD8, 0x88, 0x1, 0xB8, 0x88, 0xA3, 0xEA, 0x9F, 0x9F, 0xEA, 0x0, 0x1, 0x0, 0x50, 0x0, 0x81, 0x2, 0x8, 0x2, 0x47, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x2, 0x8, 0x88, 0xA8, 0x88, 0x88, 0xA8, 0x88, 0x1, 0x14, 0x93, 0x93, 0x9F, 0x94, 0x94, 0x0, 0x1, 0x0, 0x3D, 0x1, 0x14, 0x2, 0x1C, 0x1, 0xB3, 0x0, 0x3, 0x0, 0x0, 0x13, 0x21, 0x15, 0x21, 0x3D, 0x1, 0xDF, 0xFE, 0x21, 0x1, 0xB3, 0x9F, 0x0, 0x1, 0x0, 0x76, 0x4, 0xCC, 0x2, 0xFB, 0x5, 0xE7, 0x0, 0xC, 0x0, 0x0, 0x1, 0x33, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x2, 0x45, 0xB6, 0xAD, 0xFE, 0xD6, 0xAE, 0xB6, 0x40, 0x4D, 0x4C, 0x40, 0x5, 0xE7, 0x7C, 0x9F, 0x9F, 0x7C, 0x37, 0x54, 0x54, 0x0, 0x1, 0x0, 0x82, 0x4, 0xE0, 0x1, 0x88, 0x5, 0xD5, 0x0, 0x9, 0x0, 0x0, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x82, 0x45, 0x7C, 0x45, 0x45, 0x7C, 0x45, 0x5, 0x5A, 0x35, 0x46, 0x46, 0x35, 0x34, 0x46, 0x46, 0x0, 0x2, 0x0, 0x79, 0x4, 0x8E, 0x2, 0x34, 0x6, 0x2A, 0x0, 0x9, 0x0, 0x13, 0x0, 0x0, 0x12, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x6, 0x79, 0x7F, 0x5E, 0x5F, 0x7F, 0x7F, 0x5F, 0x5E, 0x7F, 0x6D, 0x3E, 0x64, 0x3F, 0x3F, 0x64, 0x3E, 0x5, 0xB0, 0x7A, 0x7A, 0xAC, 0x76, 0x76, 0x56, 0x2B, 0x44, 0x43, 0x2C, 0x2E, 0x44, 0x44, 0x0, 0x1, 0x0, 0x29, 0xFE, 0x52, 0x1, 0xA1, 0x0, 0x3C, 0x0, 0x10, 0x0, 0x0, 0x25, 0x17, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x1, 0x1D, 0x70, 0x45, 0x5D, 0x47, 0x2C, 0x2E, 0x15, 0x49, 0x5C, 0x58, 0x7B, 0x6C, 0x3C, 0x3C, 0x2D, 0x5F, 0x3B, 0x44, 0x17, 0x8E, 0x2C, 0x66, 0x63, 0x4E, 0x96, 0x0, 0x1, 0x0, 0x7A, 0x4, 0xDB, 0x3, 0x58, 0x5, 0xF5, 0x0, 0x14, 0x0, 0x0, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x2, 0xC3, 0x95, 0x81, 0x5F, 0x40, 0x51, 0x47, 0x36, 0x26, 0x34, 0x96, 0x7F, 0x60, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x5, 0xF5, 0xC, 0x6F, 0x91, 0x2D, 0x2C, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x2, 0x0, 0x4A, 0x4, 0xD1, 0x3, 0x57, 0x5, 0xFF, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x13, 0x13, 0x33, 0x3, 0x33, 0x13, 0x33, 0x1, 0x4A, 0xAE, 0xE8, 0xDE, 0x85, 0xE1, 0xEF, 0xFE, 0xF6, 0x4, 0xD1, 0x1, 0x2E, 0xFE, 0xD2, 0x1, 0x2E, 0xFE, 0xD2, 0x0, 0x1, 0xFF, 0x3A, 0x1, 0x48, 0x1, 0x9C, 0x3, 0x32, 0x0, 0xC, 0x0, 0x0, 0x3, 0x35, 0x25, 0x16, 0x16, 0x33, 0x37, 0x17, 0x6, 0x23, 0x22, 0x26, 0x27, 0xC6, 0x1, 0x85, 0x13, 0x22, 0x52, 0x31, 0x25, 0x43, 0x4B, 0x82, 0x5C, 0x20, 0x2, 0x1D, 0xC6, 0x4F, 0x7E, 0x97, 0x3, 0xB4, 0x24, 0x92, 0x71, 0x0, 0x1, 0x0, 0x50, 0x4, 0x82, 0x2, 0x55, 0x6, 0x8F, 0x0, 0xB, 0x0, 0x0, 0x1, 0x27, 0x7, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x7, 0x17, 0x1, 0xE5, 0x93, 0x94, 0x6E, 0x94, 0x92, 0x6E, 0x93, 0x94, 0x6E, 0x94, 0x92, 0x4, 0x82, 0x97, 0x95, 0x70, 0x95, 0x95, 0x71, 0x96, 0x95, 0x71, 0x95, 0x96, 0x0, 0x2, 0x0, 0x35, 0x0, 0xD7, 0x3, 0x36, 0x5, 0xAD, 0x0, 0x12, 0x0, 0x1A, 0x0, 0x0, 0x24, 0x26, 0x35, 0x34, 0x37, 0x37, 0x1, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x1, 0x17, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x34, 0x27, 0x6, 0x15, 0x14, 0x1, 0x52, 0x79, 0x1F, 0x50, 0xFE, 0xED, 0xE2, 0x96, 0x9, 0x9, 0x96, 0xE1, 0xFE, 0xE9, 0x42, 0x25, 0x76, 0x5F, 0x26, 0x24, 0x29, 0xD7, 0x5F, 0x5B, 0x27, 0x48, 0xB8, 0x2, 0xF5, 0xFE, 0xC, 0x30, 0x30, 0x1, 0xF4, 0xFD, 0x0, 0x97, 0x51, 0x34, 0x5B, 0x5F, 0x98, 0x30, 0x1F, 0x57, 0x5B, 0x1B, 0x30, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x1, 0x29, 0x7, 0x2E, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x29, 0xC5, 0x7, 0x2E, 0xFB, 0x5E, 0x4, 0xA2, 0x0, 0x1, 0x0, 0x3C, 0x2, 0x7C, 0x2, 0xDF, 0x5, 0xBA, 0x0, 0x21, 0x0, 0x0, 0x1, 0x34, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x16, 0x33, 0x32, 0x2, 0x1B, 0xAD, 0x86, 0x92, 0xAC, 0x87, 0x9D, 0xB3, 0xC3, 0x1, 0x40, 0x46, 0x76, 0x4E, 0x56, 0x8E, 0x94, 0xA7, 0x9C, 0xB0, 0xB0, 0xBE, 0x10, 0x98, 0x79, 0x3, 0x62, 0x47, 0x27, 0x1E, 0x73, 0x6A, 0x6E, 0x81, 0x93, 0x6B, 0x28, 0x3D, 0x4E, 0x28, 0x2A, 0x13, 0x1F, 0x74, 0x6D, 0x72, 0x80, 0xA9, 0x63, 0x72, 0x0, 0x1, 0x0, 0x2F, 0x2, 0x8C, 0x3, 0x19, 0x5, 0xAD, 0x0, 0xB, 0x0, 0x0, 0x1, 0x13, 0x13, 0x33, 0x3, 0x13, 0x23, 0x3, 0x3, 0x23, 0x13, 0x3, 0x1, 0x19, 0x89, 0x8D, 0xE1, 0xE8, 0xF1, 0xE1, 0x94, 0x92, 0xE3, 0xF0, 0xE8, 0x5, 0xAD, 0xFE, 0xFB, 0x1, 0x5, 0xFE, 0x77, 0xFE, 0x68, 0x1, 0x10, 0xFE, 0xF0, 0x1, 0x98, 0x1, 0x89, 0x0, 0x1, 0x0, 0x51, 0x2, 0x8C, 0x3, 0xE, 0x5, 0xBA, 0x0, 0x15, 0x0, 0x0, 0x1, 0x15, 0x23, 0x35, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x2, 0xF, 0xC5, 0x70, 0x89, 0xC8, 0x98, 0x94, 0xC9, 0xC3, 0x3, 0x50, 0x43, 0x54, 0x4C, 0x93, 0x3, 0x8A, 0xFE, 0x6B, 0x19, 0xB2, 0x8B, 0xB0, 0xBD, 0xA4, 0x89, 0x3B, 0x4B, 0x6D, 0x5B, 0xBC, 0x5, 0x0, 0x1, 0x0, 0x1A, 0x0, 0x0, 0x2, 0x19, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x0, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x2, 0x19, 0xF4, 0xFE, 0xF5, 0x1, 0xFF, 0x4, 0xED, 0xC3, 0x0, 0x1, 0x0, 0x1A, 0x0, 0x0, 0x2, 0x19, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x2, 0x19, 0xF4, 0xFE, 0xF5, 0x1, 0xB, 0xF4, 0x3, 0xE2, 0xC3, 0x1, 0xB, 0x0, 0x1, 0x0, 0x1A, 0x0, 0x0, 0x2, 0x19, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x2, 0x19, 0xF4, 0xFE, 0xF5, 0x1, 0xB, 0xF4, 0x2, 0x77, 0xC3, 0x2, 0x76, 0x0, 0x1, 0x0, 0x1A, 0x0, 0x0, 0x2, 0x19, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x2, 0x19, 0xF4, 0xFE, 0xF5, 0x1, 0xB, 0xF4, 0x1, 0xB, 0xC3, 0x3, 0xE2, 0x0, 0x1, 0x0, 0x1A, 0x0, 0x0, 0x2, 0x19, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x0, 0x33, 0x35, 0x21, 0x11, 0x33, 0x11, 0x1A, 0x1, 0xB, 0xF4, 0xC3, 0x4, 0xED, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x2, 0xEE, 0x3, 0x8C, 0x0, 0x5, 0x0, 0x0, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x84, 0xF2, 0x1, 0x78, 0x3, 0x8C, 0xFD, 0x37, 0xC3, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x2, 0xC7, 0x3, 0x8C, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x2, 0xC7, 0xFE, 0xAF, 0xF2, 0xF2, 0x1, 0x51, 0x1, 0x67, 0xFE, 0x99, 0x3, 0x8C, 0xFE, 0x9E, 0x0, 0x1, 0x0, 0x49, 0xFE, 0x5C, 0x3, 0xB, 0xFF, 0x7D, 0x0, 0x8, 0x0, 0x0, 0x5, 0x17, 0x37, 0x33, 0x15, 0x1, 0x23, 0x1, 0x35, 0x1, 0x17, 0x92, 0x93, 0xCF, 0xFE, 0xE9, 0x96, 0xFE, 0xEB, 0x83, 0x9B, 0x9B, 0xA, 0xFE, 0xE9, 0x1, 0x18, 0x9, 0x0, 0x2, 0x0, 0x43, 0x4, 0x8A, 0x2, 0xD9, 0x6, 0x10, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x5, 0x15, 0x21, 0x35, 0x2, 0xD9, 0xFD, 0x6A, 0x2, 0x96, 0xFD, 0x6A, 0x6, 0x10, 0x99, 0x99, 0xEE, 0x98, 0x98, 0x0, 0x2, 0x0, 0x50, 0x3, 0xD6, 0x2, 0xD9, 0x6, 0x18, 0x0, 0x8, 0x0, 0x11, 0x0, 0x0, 0x1, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0x23, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0x2, 0xD9, 0x65, 0x51, 0x80, 0x58, 0x2, 0x77, 0x65, 0x52, 0x7F, 0x57, 0x3, 0x6, 0x18, 0xBB, 0x64, 0xDC, 0x47, 0x4E, 0x8A, 0xA2, 0xC8, 0xBB, 0x64, 0xDC, 0x47, 0x4E, 0x8C, 0x9C, 0xCC, 0x0, 0x1, 0x0, 0x3D, 0xFD, 0xDD, 0x2, 0x43, 0xFF, 0xB8, 0x0, 0x8, 0x0, 0x0, 0x1, 0x3, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x3, 0x1, 0x7, 0xCA, 0x85, 0x73, 0xB, 0xA, 0x74, 0x85, 0xCA, 0xFD, 0xDD, 0x1, 0xDB, 0xFE, 0xE2, 0x2A, 0x2A, 0x1, 0x1E, 0xFE, 0x25, 0x0, 0x1, 0x0, 0x3D, 0xFD, 0xDD, 0x2, 0x43, 0xFF, 0xB8, 0x0, 0x8, 0x0, 0x0, 0x1, 0x3, 0x23, 0x13, 0x33, 0x13, 0x23, 0x3, 0x27, 0x1, 0x35, 0x73, 0x85, 0xCA, 0x72, 0xCA, 0x86, 0x74, 0xA, 0xFE, 0xFC, 0xFE, 0xE1, 0x1, 0xDB, 0xFE, 0x25, 0x1, 0x1F, 0x28, 0x0, 0x1, 0x0, 0x3D, 0xFD, 0xDB, 0x2, 0x44, 0xFF, 0xBC, 0x0, 0x8, 0x0, 0x0, 0x1, 0x25, 0x35, 0x25, 0x15, 0x5, 0x7, 0x17, 0x5, 0x2, 0x44, 0xFD, 0xF9, 0x2, 0x7, 0xFE, 0xC7, 0x2C, 0x2C, 0x1, 0x39, 0xFD, 0xDB, 0xBC, 0x6A, 0xBB, 0x7C, 0x6C, 0x9, 0xA, 0x6A, 0x0, 0x1, 0x0, 0x3D, 0xFD, 0xDB, 0x2, 0x44, 0xFF, 0xBC, 0x0, 0x8, 0x0, 0x0, 0x13, 0x35, 0x25, 0x37, 0x27, 0x25, 0x35, 0x5, 0x15, 0x3D, 0x1, 0x39, 0x2C, 0x2C, 0xFE, 0xC7, 0x2, 0x7, 0xFD, 0xDB, 0x7C, 0x6A, 0xA, 0x9, 0x6C, 0x7C, 0xBB, 0x6A, 0x0, 0x2, 0x0, 0x83, 0xFE, 0x6A, 0x1, 0xEC, 0xFF, 0xBE, 0x0, 0xA, 0x0, 0x14, 0x0, 0x0, 0x16, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x35, 0x34, 0x23, 0x22, 0x6, 0x83, 0x6B, 0x4C, 0x4A, 0x68, 0x68, 0x4A, 0x4C, 0x6B, 0x65, 0x30, 0x22, 0x4E, 0x4E, 0x22, 0x30, 0xA4, 0x62, 0x62, 0x4A, 0x4B, 0x5D, 0x5E, 0x4A, 0x22, 0x2E, 0x50, 0x53, 0x2F, 0xFF, 0xFF, 0x0, 0x37, 0x0, 0xD8, 0x2, 0x10, 0x2, 0x6, 0x0, 0x7, 0x0, 0x45, 0x0, 0x6, 0xFC, 0x6, 0xFF, 0xFF, 0x0, 0x37, 0x0, 0xD8, 0x3, 0xB6, 0x2, 0x6, 0x0, 0x27, 0x0, 0x45, 0x0, 0x6, 0xFC, 0x6, 0x0, 0x7, 0x0, 0x45, 0x1, 0xAC, 0xFC, 0x6, 0xFF, 0xFF, 0x0, 0x48, 0x0, 0xD8, 0x3, 0xC6, 0x2, 0x6, 0x0, 0x27, 0x0, 0x76, 0xFF, 0xD7, 0xFC, 0x6, 0x0, 0x7, 0x0, 0x76, 0x1, 0x7D, 0xFC, 0x6, 0x0, 0x1, 0x0, 0x4A, 0xFE, 0x4F, 0x3, 0x27, 0xFF, 0x69, 0x0, 0x14, 0x0, 0x0, 0x5, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x2, 0x92, 0x95, 0x81, 0x5F, 0x41, 0x50, 0x48, 0x35, 0x26, 0x34, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x97, 0xC, 0x70, 0x90, 0x2C, 0x2D, 0x39, 0x2E, 0x8, 0x6D, 0x97, 0x5A, 0x39, 0xFF, 0xFF, 0x0, 0x51, 0x1, 0x7D, 0x1, 0x6C, 0x5, 0xDB, 0x0, 0x27, 0x0, 0x13, 0xFF, 0xC9, 0x1, 0x89, 0x0, 0x7, 0x0, 0x13, 0xFF, 0xC9, 0x4, 0xDA, 0x0, 0x1, 0x0, 0x50, 0x4, 0x77, 0x1, 0xE5, 0x6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x1, 0x23, 0x15, 0x23, 0x11, 0x21, 0x1, 0xE5, 0xED, 0xA8, 0x1, 0x95, 0x5, 0x63, 0xEC, 0x1, 0x89, 0x0, 0x1, 0x0, 0x50, 0x4, 0x77, 0x1, 0xE5, 0x6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x1, 0x35, 0x23, 0x35, 0x21, 0x11, 0x1, 0x3E, 0xEE, 0x1, 0x95, 0x4, 0x77, 0xEC, 0x9D, 0xFE, 0x77, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x2A, 0x1, 0xE5, 0xFF, 0xB3, 0x0, 0x5, 0x0, 0x0, 0x13, 0x11, 0x33, 0x15, 0x33, 0x15, 0x50, 0xA8, 0xED, 0xFE, 0x2A, 0x1, 0x89, 0xEB, 0x9E, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x2A, 0x1, 0xE5, 0xFF, 0xB3, 0x0, 0x5, 0x0, 0x0, 0x1, 0x21, 0x35, 0x33, 0x35, 0x33, 0x1, 0xE5, 0xFE, 0x6B, 0xEE, 0xA7, 0xFE, 0x2A, 0x9E, 0xEB, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x3B, 0x3, 0x7, 0xFF, 0xA9, 0x0, 0x7, 0x0, 0x0, 0x13, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x50, 0xA9, 0x1, 0x66, 0xA8, 0xFE, 0x3B, 0x1, 0x6E, 0xDC, 0xDC, 0xFE, 0x92, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x2A, 0x2, 0xE9, 0xFF, 0xB3, 0x0, 0x5, 0x0, 0x0, 0x13, 0x11, 0x33, 0x15, 0x21, 0x15, 0x50, 0xA9, 0x1, 0xF0, 0xFE, 0x2A, 0x1, 0x89, 0xF6, 0x93, 0x0, 0x1, 0x0, 0x43, 0xFE, 0x4D, 0x3, 0x48, 0x0, 0xA9, 0x0, 0x8, 0x0, 0x0, 0x5, 0x21, 0x17, 0x23, 0x1, 0x1, 0x33, 0x7, 0x21, 0x3, 0x48, 0xFE, 0xA, 0xE1, 0xC3, 0xFE, 0xD3, 0x1, 0x2D, 0xC3, 0xE2, 0x1, 0xF7, 0xD1, 0xE2, 0x1, 0x2E, 0x1, 0x2E, 0xE3, 0x0, 0x1, 0xFC, 0x8D, 0x4, 0xD2, 0xFE, 0x66, 0x6, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x13, 0x23, 0x1, 0xFD, 0xA2, 0xC4, 0xCA, 0xFE, 0xF1, 0x6, 0x0, 0xFE, 0xD2, 0x1, 0x2E, 0x0, 0x1, 0xFD, 0x5E, 0x4, 0xD2, 0xFF, 0x35, 0x6, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x13, 0x21, 0x1, 0xFD, 0x5E, 0xC3, 0x1, 0x14, 0xFE, 0xEC, 0x4, 0xD2, 0x1, 0x2E, 0xFE, 0xD2, 0xFF, 0xFF, 0xFC, 0x60, 0x4, 0xE1, 0xFF, 0xF, 0x6, 0x1, 0x0, 0x7, 0x1, 0x77, 0xFB, 0xCB, 0x0, 0x0, 0xFF, 0xFF, 0xFC, 0x72, 0x4, 0xDB, 0xFF, 0x50, 0x5, 0xF5, 0x0, 0x7, 0x1, 0x8D, 0xFB, 0xF8, 0x0, 0x0, 0x0, 0x1, 0xFC, 0x60, 0x5, 0xC, 0xFF, 0xF, 0x5, 0xAA, 0x0, 0x3, 0x0, 0x0, 0x3, 0x15, 0x21, 0x35, 0xF1, 0xFD, 0x51, 0x5, 0xAA, 0x9E, 0x9E, 0xFF, 0xFF, 0xFB, 0xEE, 0x6, 0x2F, 0xFF, 0x84, 0x6, 0xEF, 0x0, 0x7, 0x0, 0x44, 0xFB, 0xEB, 0x6, 0xEF, 0x0, 0x1, 0xFC, 0x75, 0x4, 0xCC, 0xFE, 0xFB, 0x5, 0xE7, 0x0, 0xC, 0x0, 0x0, 0x1, 0x33, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0xFE, 0x44, 0xB7, 0xAE, 0xFE, 0xD6, 0xAE, 0xB6, 0x40, 0x4D, 0x4C, 0x40, 0x5, 0xE7, 0x7C, 0x9F, 0x9F, 0x7C, 0x37, 0x54, 0x54, 0x0, 0x1, 0xFD, 0x2F, 0x4, 0xD3, 0xFE, 0x42, 0x5, 0xD5, 0x0, 0x9, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0xFD, 0x2F, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x5, 0x54, 0x38, 0x49, 0x49, 0x38, 0x37, 0x4A, 0x4A, 0x0, 0x2, 0xFC, 0x4, 0x4, 0xE0, 0xFE, 0xCA, 0x5, 0xCD, 0x0, 0xB, 0x0, 0x17, 0x0, 0x0, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0xFC, 0x4, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x1, 0xC9, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x5, 0x56, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x30, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x0, 0x1, 0xFD, 0x3D, 0x4, 0xE7, 0xFE, 0x99, 0x6, 0x80, 0x0, 0xD, 0x0, 0x0, 0x1, 0x23, 0x27, 0x36, 0x35, 0x34, 0x23, 0x37, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0xFE, 0x2, 0xB1, 0x8, 0x8B, 0x97, 0x7, 0xA8, 0xAD, 0x5F, 0x37, 0x4, 0xE7, 0x92, 0x7, 0x3D, 0x48, 0x7B, 0x69, 0x58, 0x48, 0x44, 0x8, 0xFF, 0xFF, 0xFC, 0xDC, 0x4, 0x8E, 0xFE, 0x97, 0x6, 0x2A, 0x0, 0x7, 0x1, 0x8B, 0xFC, 0x63, 0x0, 0x0, 0xFF, 0xFF, 0xFB, 0xEE, 0x4, 0xD2, 0xFF, 0x79, 0x6, 0x0, 0x0, 0x27, 0x0, 0x76, 0xFB, 0x7D, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0xFD, 0x30, 0x0, 0x0, 0x0, 0x1, 0xFC, 0x60, 0x4, 0xE1, 0xFF, 0xE, 0x6, 0x1, 0x0, 0x8, 0x0, 0x0, 0x3, 0x1, 0x23, 0x1, 0x35, 0x33, 0x17, 0x37, 0x33, 0xF2, 0xFE, 0xEF, 0x8F, 0xFE, 0xF2, 0xC0, 0x95, 0x96, 0xC3, 0x5, 0xF6, 0xFE, 0xEB, 0x1, 0x13, 0xD, 0x9C, 0x9C, 0xFF, 0xFF, 0xFD, 0x65, 0x4, 0x7A, 0xFE, 0xC, 0x6, 0x1F, 0x0, 0x7, 0x1, 0x79, 0xFD, 0x28, 0x0, 0x0, 0xFF, 0xFF, 0xFC, 0xDD, 0x4, 0x7A, 0xFE, 0x8F, 0x6, 0x1F, 0x0, 0x27, 0x1, 0x79, 0xFC, 0xA0, 0x0, 0x0, 0x0, 0x7, 0x1, 0x79, 0xFD, 0xAB, 0x0, 0x0, 0x0, 0x2, 0xFC, 0xB, 0x4, 0xE4, 0xFF, 0x33, 0x5, 0xEE, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x13, 0x23, 0x3, 0x23, 0x13, 0x23, 0x1, 0xFE, 0x75, 0xBE, 0xC2, 0xF5, 0x6A, 0xF5, 0xD1, 0xFE, 0xD5, 0x5, 0xEE, 0xFE, 0xF6, 0x1, 0xA, 0xFE, 0xF6, 0x1, 0xA, 0x0, 0x2, 0xFC, 0x75, 0x4, 0xC6, 0xFE, 0xFB, 0x6, 0xBA, 0x0, 0x9, 0x0, 0x16, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x5, 0x33, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0xFD, 0x2F, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x1, 0x15, 0xB7, 0xAE, 0xFE, 0xD6, 0xAE, 0xB6, 0x40, 0x4D, 0x4C, 0x40, 0x6, 0x3E, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x2A, 0x7C, 0x9E, 0x9E, 0x7C, 0x37, 0x53, 0x53, 0x0, 0x1, 0xFC, 0x75, 0x4, 0x96, 0xFE, 0xFB, 0x5, 0xB0, 0x0, 0xD, 0x0, 0x0, 0x1, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0xFE, 0xFB, 0xB7, 0x3F, 0x4C, 0x4D, 0x40, 0xB7, 0xAF, 0x95, 0x94, 0xAE, 0x4, 0x96, 0x37, 0x53, 0x53, 0x37, 0x7D, 0x9D, 0x9D, 0x0, 0x1, 0xFD, 0x47, 0x3, 0xE1, 0xFE, 0x7D, 0x6, 0x25, 0x0, 0x8, 0x0, 0x0, 0x1, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x7, 0x15, 0xFD, 0x47, 0x65, 0x52, 0x7F, 0x57, 0x3, 0x3, 0xE1, 0xBE, 0x64, 0xDC, 0x46, 0x4D, 0x8A, 0x9E, 0xCF, 0xFF, 0xFF, 0xFD, 0x1E, 0x3, 0xE1, 0xFE, 0x54, 0x6, 0x25, 0x0, 0xF, 0x1, 0xC3, 0xFB, 0x9B, 0xA, 0x6, 0xC0, 0x0, 0x0, 0x1, 0xFD, 0x1D, 0x3, 0xE1, 0xFE, 0x53, 0x6, 0x25, 0x0, 0x8, 0x0, 0x0, 0x1, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x26, 0x35, 0xFD, 0x1D, 0xDD, 0x3, 0x56, 0x7F, 0x52, 0x65, 0x6, 0x25, 0xD0, 0x9D, 0x8A, 0x4D, 0x47, 0xDC, 0x63, 0xFF, 0xFF, 0xFF, 0x3A, 0x3, 0xE1, 0x0, 0x70, 0x6, 0x25, 0x0, 0xF, 0x1, 0xC3, 0xFD, 0xB7, 0xA, 0x6, 0xC0, 0x0, 0x0, 0x1, 0xFC, 0xB8, 0xFE, 0x7A, 0xFE, 0x91, 0xFF, 0xA8, 0x0, 0x3, 0x0, 0x0, 0x5, 0x13, 0x23, 0x1, 0xFD, 0xCD, 0xC4, 0xCA, 0xFE, 0xF1, 0x58, 0xFE, 0xD2, 0x1, 0x2E, 0x0, 0x1, 0xFC, 0xC7, 0xFE, 0x7A, 0xFE, 0x9F, 0xFF, 0xA8, 0x0, 0x3, 0x0, 0x0, 0x1, 0x13, 0x21, 0x1, 0xFC, 0xC7, 0xC3, 0x1, 0x15, 0xFE, 0xEB, 0xFE, 0x7A, 0x1, 0x2E, 0xFE, 0xD2, 0x0, 0x1, 0xFC, 0xD4, 0xFE, 0x24, 0xFE, 0x8D, 0xFF, 0xC2, 0x0, 0x7, 0x0, 0x0, 0x1, 0x23, 0x35, 0x21, 0x35, 0x21, 0x35, 0x33, 0xFE, 0x8D, 0xA7, 0xFE, 0xEE, 0x1, 0x12, 0xA7, 0xFE, 0x24, 0x80, 0x9E, 0x80, 0x0, 0x1, 0xFC, 0xDC, 0xFE, 0x24, 0xFE, 0x95, 0xFF, 0xC2, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x33, 0x15, 0x21, 0x15, 0x21, 0x15, 0xFC, 0xDC, 0xA8, 0x1, 0x11, 0xFE, 0xEF, 0xFE, 0x24, 0x1, 0x9E, 0x80, 0x9E, 0x80, 0x0, 0x1, 0xFC, 0xF3, 0x5, 0x3, 0xFF, 0x9C, 0x6, 0x7B, 0x0, 0x5, 0x0, 0x0, 0x3, 0x23, 0x35, 0x21, 0x35, 0x21, 0x64, 0xA8, 0xFD, 0xFF, 0x2, 0xA9, 0x5, 0x3, 0xE6, 0x92, 0x0, 0x1, 0xFE, 0x65, 0x3, 0xE1, 0xFF, 0x9A, 0x6, 0x25, 0x0, 0x8, 0x0, 0x0, 0x3, 0x15, 0x6, 0x6, 0x7, 0x27, 0x36, 0x36, 0x35, 0x66, 0x1, 0x64, 0x51, 0x7F, 0x35, 0x24, 0x6, 0x25, 0x4E, 0xB9, 0xF7, 0x46, 0x4D, 0x61, 0xD7, 0xBF, 0x0, 0x1, 0xFD, 0x71, 0xFE, 0x2B, 0xFE, 0x41, 0xFF, 0xB4, 0x0, 0xC, 0x0, 0x0, 0x1, 0x15, 0x22, 0x26, 0x34, 0x36, 0x33, 0x15, 0x22, 0x6, 0x15, 0x14, 0x16, 0xFE, 0x41, 0x56, 0x7A, 0x7A, 0x56, 0x2A, 0x38, 0x38, 0xFE, 0x88, 0x5D, 0x6C, 0xAC, 0x71, 0x5F, 0x3A, 0x2E, 0x2C, 0x39, 0x0, 0x1, 0xFC, 0xDB, 0xFE, 0x3D, 0xFE, 0x93, 0xFF, 0xB2, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0xFE, 0x93, 0xFE, 0x48, 0x88, 0xA8, 0x88, 0xFE, 0x3D, 0x9F, 0xD6, 0xD6, 0x0, 0x1, 0xFC, 0xDC, 0xFE, 0x32, 0xFE, 0x94, 0xFF, 0xA8, 0x0, 0x7, 0x0, 0x0, 0x1, 0x35, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0xFD, 0x63, 0x87, 0x1, 0xB8, 0x88, 0xFE, 0x32, 0xD7, 0x9F, 0x9F, 0xD7, 0x0, 0x1, 0xFC, 0xDC, 0xFE, 0x13, 0xFE, 0x94, 0xFF, 0xC8, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0xFE, 0x94, 0x88, 0xA8, 0x88, 0x88, 0xA8, 0x88, 0xFE, 0xA0, 0x8D, 0x8D, 0x99, 0x8F, 0x8F, 0x0, 0x1, 0xFC, 0xC2, 0xFE, 0xA4, 0xFE, 0xB0, 0xFF, 0x43, 0x0, 0x3, 0x0, 0x0, 0x5, 0x21, 0x15, 0x21, 0xFC, 0xC2, 0x1, 0xEE, 0xFE, 0x12, 0xBD, 0x9F, 0x0, 0x1, 0xFD, 0xBD, 0xFE, 0x52, 0xFF, 0x66, 0x0, 0xBE, 0x0, 0xC, 0x0, 0x0, 0x25, 0x33, 0x11, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0xFE, 0x96, 0xD0, 0xFE, 0xD1, 0x41, 0x39, 0x20, 0x26, 0x3E, 0x55, 0xBE, 0xFE, 0xF4, 0xFE, 0xA0, 0x11, 0xB1, 0x7, 0x46, 0x5F, 0x0, 0x1, 0xFE, 0xCE, 0xFE, 0x52, 0x0, 0x76, 0x0, 0xBE, 0x0, 0xC, 0x0, 0x0, 0x25, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x23, 0x20, 0x3, 0xFE, 0xCE, 0xCF, 0x56, 0x3E, 0x26, 0x1F, 0x38, 0x41, 0xFE, 0xD9, 0x8, 0xBE, 0xFE, 0xF4, 0x5F, 0x46, 0x7, 0xB1, 0x11, 0x1, 0x4E, 0x0, 0x1, 0xFD, 0x1B, 0xFE, 0x93, 0xFE, 0x2F, 0xFF, 0x8B, 0x0, 0x7, 0x0, 0x0, 0x4, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0xFD, 0x1B, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0xBE, 0x49, 0x49, 0x68, 0x47, 0x47, 0x0, 0x2, 0xFC, 0x3, 0xFE, 0x98, 0xFE, 0xC9, 0xFF, 0x85, 0x0, 0x7, 0x0, 0xF, 0x0, 0x0, 0x4, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x24, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0xFC, 0x3, 0x43, 0x76, 0x44, 0x44, 0x76, 0x43, 0x1, 0xC9, 0x43, 0x76, 0x44, 0x44, 0x76, 0x43, 0xC0, 0x45, 0x45, 0x64, 0x43, 0x43, 0x63, 0x45, 0x45, 0x64, 0x43, 0x43, 0x0, 0x2, 0xFC, 0xDD, 0xFE, 0x26, 0xFE, 0x98, 0xFF, 0xC2, 0x0, 0x9, 0x0, 0x13, 0x0, 0x0, 0x4, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x6, 0xFC, 0xDD, 0x7E, 0x5F, 0x5E, 0x80, 0x80, 0x5E, 0x5F, 0x7E, 0x6D, 0x3E, 0x64, 0x3F, 0x3F, 0x64, 0x3E, 0xB8, 0x7A, 0x7A, 0xAC, 0x76, 0x76, 0x56, 0x2C, 0x43, 0x43, 0x2C, 0x2E, 0x44, 0x44, 0x0, 0x1, 0xFD, 0x32, 0xFD, 0xD7, 0xFE, 0x46, 0xFF, 0x70, 0x0, 0x8, 0x0, 0x0, 0x5, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0xFE, 0x46, 0x4E, 0x46, 0x80, 0x4A, 0x2, 0x90, 0x4B, 0x55, 0xBC, 0x3D, 0x4C, 0x70, 0x7F, 0x5E, 0x0, 0x1, 0xFD, 0x28, 0xFE, 0x40, 0xFE, 0x83, 0x0, 0x4, 0x0, 0xE, 0x0, 0x0, 0x25, 0x33, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x27, 0x32, 0x35, 0x34, 0x26, 0x27, 0xFD, 0x47, 0xB2, 0xC, 0x38, 0x5E, 0xA5, 0xA1, 0x7, 0x88, 0x47, 0x4F, 0x4, 0x37, 0xA, 0x4D, 0x56, 0x65, 0x7B, 0x8A, 0x59, 0x2D, 0x22, 0x6, 0x0, 0x1, 0xFC, 0xCA, 0xFE, 0x52, 0xFE, 0x42, 0x0, 0x3C, 0x0, 0x10, 0x0, 0x0, 0x25, 0x17, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0xFD, 0xCA, 0x64, 0x44, 0x5D, 0x47, 0x2B, 0x2E, 0x15, 0x49, 0x5B, 0x59, 0x7B, 0x78, 0x3C, 0x3C, 0x2D, 0x5F, 0x3B, 0x44, 0x17, 0x8E, 0x2C, 0x66, 0x63, 0x4E, 0x96, 0x0, 0x1, 0xFD, 0x65, 0xFE, 0xE, 0xFE, 0xC, 0xFF, 0xB3, 0x0, 0x3, 0x0, 0x0, 0x5, 0x11, 0x23, 0x11, 0xFE, 0xC, 0xA7, 0x4D, 0xFE, 0x5B, 0x1, 0xA5, 0x0, 0x1, 0xFC, 0x5B, 0xFE, 0x2B, 0xFF, 0x12, 0xFF, 0x9A, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x21, 0x11, 0x23, 0x35, 0x21, 0x15, 0xFC, 0x5B, 0x2, 0xB7, 0xA8, 0xFE, 0x9A, 0xFE, 0x2B, 0x1, 0x6F, 0xFE, 0x91, 0xDC, 0xDC, 0x0, 0x1, 0xFC, 0x2B, 0xFE, 0x9B, 0xFF, 0x49, 0xFF, 0x90, 0x0, 0x16, 0x0, 0x0, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x35, 0x33, 0x14, 0x33, 0x32, 0x36, 0x35, 0x33, 0x14, 0x6, 0xFE, 0x68, 0x70, 0x3F, 0x3F, 0x71, 0x61, 0x7D, 0x67, 0x44, 0x33, 0x7D, 0x67, 0x7B, 0x34, 0x45, 0x68, 0x80, 0xFE, 0x9B, 0x50, 0x50, 0x8A, 0x6B, 0x37, 0x41, 0x78, 0x78, 0x41, 0x37, 0x6B, 0x8A, 0x0, 0x1, 0xFC, 0x61, 0xFE, 0x69, 0xFF, 0x10, 0xFF, 0x89, 0x0, 0x8, 0x0, 0x0, 0x7, 0x1, 0x23, 0x1, 0x35, 0x33, 0x17, 0x37, 0x33, 0xF0, 0xFE, 0xEE, 0x8F, 0xFE, 0xF2, 0xC0, 0x95, 0x97, 0xC3, 0x82, 0xFE, 0xEB, 0x1, 0x13, 0xD, 0x9C, 0x9C, 0x0, 0x1, 0xFC, 0x61, 0xFE, 0x76, 0xFF, 0x10, 0xFF, 0x96, 0x0, 0x8, 0x0, 0x0, 0x5, 0x1, 0x15, 0x23, 0x27, 0x7, 0x23, 0x35, 0x1, 0xFD, 0xFE, 0x1, 0x12, 0xC3, 0x96, 0x96, 0xC0, 0x1, 0xE, 0x6A, 0xFE, 0xEB, 0xB, 0x9C, 0x9C, 0xD, 0x1, 0x13, 0x0, 0x1, 0xFC, 0x75, 0xFE, 0x8B, 0xFE, 0xFB, 0xFF, 0xA5, 0x0, 0xC, 0x0, 0x0, 0x5, 0x33, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0xFE, 0x44, 0xB7, 0xAE, 0xFE, 0xD6, 0xAE, 0xB6, 0x40, 0x4D, 0x4C, 0x40, 0x5B, 0x7D, 0x9D, 0x9D, 0x7D, 0x37, 0x54, 0x54, 0x0, 0x1, 0xFC, 0x75, 0xFE, 0x83, 0xFE, 0xFB, 0xFF, 0x9D, 0x0, 0xC, 0x0, 0x0, 0x1, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x20, 0x16, 0xFE, 0xFB, 0xB7, 0x40, 0x4C, 0x4D, 0x40, 0xB6, 0xAE, 0x1, 0x2A, 0xAE, 0xFE, 0x83, 0x37, 0x53, 0x53, 0x37, 0x7C, 0x9E, 0x9E, 0x0, 0x1, 0xFC, 0x43, 0xFE, 0x79, 0xFF, 0x21, 0xFF, 0x93, 0x0, 0x14, 0x0, 0x0, 0x5, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0xFE, 0x8C, 0x95, 0x81, 0x5F, 0x41, 0x50, 0x47, 0x36, 0x26, 0x34, 0x96, 0x7F, 0x60, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x6D, 0xC, 0x6F, 0x91, 0x2C, 0x2D, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x1, 0xFC, 0x62, 0xFE, 0xC1, 0xFF, 0x10, 0xFF, 0x5F, 0x0, 0x3, 0x0, 0x0, 0x7, 0x15, 0x21, 0x35, 0xF0, 0xFD, 0x52, 0xA1, 0x9E, 0x9E, 0xFF, 0xFF, 0xFB, 0xED, 0xFE, 0xAD, 0xFF, 0x83, 0xFF, 0x6D, 0x0, 0x7, 0x0, 0x44, 0xFB, 0xEA, 0xFF, 0x6D, 0x0, 0x2, 0xFB, 0xED, 0xFD, 0xF9, 0xFF, 0x84, 0xFF, 0xAC, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x7, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x7D, 0xFC, 0x6A, 0x3, 0x97, 0xFC, 0x6A, 0x54, 0xAC, 0xAC, 0xFE, 0xF9, 0xAC, 0xAC, 0xFF, 0xFF, 0xFC, 0x49, 0x1, 0x8F, 0xFF, 0x27, 0x2, 0xA9, 0x0, 0x7, 0x1, 0x8D, 0xFB, 0xCF, 0xFC, 0xB4, 0xFF, 0xFF, 0xFC, 0x69, 0x1, 0xC2, 0xFF, 0x7, 0x2, 0x6D, 0x0, 0x7, 0x7, 0xA4, 0xFB, 0xD9, 0xFF, 0x3B, 0x0, 0x1, 0xFB, 0x44, 0x1, 0xC2, 0x0, 0x2C, 0x2, 0x6D, 0x0, 0x3, 0x0, 0x0, 0x13, 0x15, 0x21, 0x35, 0x2C, 0xFB, 0x18, 0x2, 0x6D, 0xAB, 0xAB, 0x0, 0x1, 0xFC, 0x1E, 0xFF, 0x76, 0xFF, 0x46, 0x4, 0xBC, 0x0, 0x3, 0x0, 0x0, 0x3, 0x1, 0x23, 0x1, 0xBA, 0xFD, 0x69, 0x91, 0x2, 0x97, 0x4, 0xBC, 0xFA, 0xBA, 0x5, 0x46, 0x0, 0x1, 0xFB, 0xA, 0xFF, 0xA1, 0xFF, 0x51, 0x5, 0xEE, 0x0, 0x3, 0x0, 0x0, 0x3, 0x1, 0x23, 0x1, 0xAF, 0xFC, 0x2C, 0x73, 0x3, 0xD4, 0x5, 0xEE, 0xF9, 0xB3, 0x6, 0x4D, 0x0, 0x1, 0xFD, 0x50, 0xFE, 0x2B, 0xFE, 0x20, 0xFF, 0xB4, 0x0, 0xC, 0x0, 0x0, 0x1, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x16, 0x14, 0x6, 0xFD, 0x50, 0x2A, 0x38, 0x38, 0x2A, 0x56, 0x7A, 0x7A, 0xFE, 0x2B, 0x5D, 0x39, 0x2C, 0x2E, 0x3A, 0x5F, 0x71, 0xAC, 0x6C, 0x0, 0x1, 0xFC, 0x5C, 0xFE, 0x23, 0xFF, 0x13, 0xFF, 0x91, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0xFC, 0x5C, 0xA9, 0x1, 0x66, 0xA8, 0xFE, 0x23, 0x1, 0x6E, 0xDC, 0xDC, 0xFE, 0x92, 0x0, 0x2, 0xFC, 0xE8, 0xFE, 0xE, 0xFE, 0x8A, 0xFF, 0xB0, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x21, 0x11, 0x1, 0x15, 0x33, 0x35, 0xFC, 0xE8, 0x1, 0xA2, 0xFE, 0xDC, 0xA7, 0xFE, 0xE, 0x1, 0xA2, 0xFE, 0x5E, 0x1, 0x24, 0xA7, 0xA7, 0x0, 0x1, 0xFC, 0x2B, 0xFE, 0x9E, 0xFF, 0x49, 0xFF, 0x93, 0x0, 0x16, 0x0, 0x0, 0x1, 0x23, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x15, 0x23, 0x34, 0x23, 0x22, 0x6, 0xFC, 0x92, 0x67, 0x7D, 0x61, 0x71, 0x3F, 0x3F, 0x70, 0x61, 0x80, 0x68, 0x45, 0x34, 0x7B, 0x67, 0x7D, 0x33, 0x44, 0xFE, 0x9E, 0x6A, 0x8B, 0x50, 0x50, 0x8B, 0x6A, 0x37, 0x41, 0x77, 0x77, 0x41, 0x0, 0x1, 0xFD, 0x4, 0x4, 0xDF, 0xFE, 0xE3, 0x6, 0xC6, 0x0, 0xB, 0x0, 0x0, 0x1, 0x27, 0x7, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x7, 0x17, 0xFE, 0x7C, 0x89, 0x8A, 0x65, 0x8A, 0x88, 0x65, 0x89, 0x8A, 0x65, 0x8A, 0x89, 0x4, 0xDF, 0x8D, 0x8B, 0x68, 0x8A, 0x8B, 0x68, 0x8C, 0x8B, 0x68, 0x8A, 0x8C, 0x0, 0x1, 0xFD, 0x45, 0x4, 0x62, 0xFE, 0x2A, 0x6, 0x87, 0x0, 0x12, 0x0, 0x0, 0x1, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x35, 0x34, 0x36, 0x33, 0x15, 0x22, 0x15, 0x14, 0x16, 0x15, 0x14, 0x6, 0xFD, 0x45, 0x28, 0x20, 0x46, 0x80, 0x62, 0x40, 0x41, 0x7A, 0x4, 0x62, 0x83, 0x25, 0x13, 0x27, 0x75, 0x3F, 0x4A, 0x45, 0x82, 0x32, 0x2A, 0x72, 0x41, 0x49, 0x4B, 0x0, 0x2, 0xFB, 0xED, 0x5, 0xD4, 0xFF, 0x83, 0x7, 0x7F, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x3, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x7D, 0xFC, 0x6A, 0x3, 0x96, 0xFC, 0x6B, 0x7, 0x7F, 0x9D, 0x9D, 0xFE, 0xF2, 0x9D, 0x9D, 0xFF, 0xFF, 0xFF, 0x0, 0x4, 0xD2, 0x0, 0xD9, 0x6, 0x0, 0x0, 0x7, 0x0, 0x45, 0xFE, 0xCF, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xF, 0x4, 0xD2, 0x0, 0xE7, 0x6, 0x0, 0x0, 0x7, 0x0, 0x76, 0xFE, 0x9E, 0x0, 0x0, 0xFF, 0xFF, 0xFC, 0x49, 0x4, 0xDB, 0xFF, 0x27, 0x5, 0xF5, 0x0, 0x7, 0x1, 0x8D, 0xFB, 0xCF, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0x30, 0x4, 0xC5, 0xFE, 0x44, 0x6, 0x65, 0x0, 0x7, 0x7, 0x25, 0xFC, 0xEA, 0x5, 0x5F, 0xFF, 0xFF, 0xFC, 0xB, 0x4, 0xE0, 0xFF, 0x5E, 0x6, 0xAF, 0x0, 0x7, 0x2, 0x2E, 0xFB, 0xA3, 0x0, 0x0, 0x0, 0x1, 0xFD, 0x60, 0xFD, 0xF2, 0xFE, 0x62, 0xFF, 0xBA, 0x0, 0xB, 0x0, 0x0, 0x5, 0x33, 0x11, 0x14, 0x33, 0x37, 0x15, 0x6, 0x23, 0x22, 0x26, 0x35, 0xFD, 0x60, 0xA4, 0x33, 0x2B, 0x22, 0x30, 0x4D, 0x63, 0x46, 0xFE, 0xF6, 0x48, 0x4, 0x6E, 0xC, 0x57, 0x63, 0x0, 0x1, 0xFC, 0x5C, 0x4, 0xC0, 0xFF, 0x13, 0x6, 0x49, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x21, 0x11, 0x23, 0x35, 0x21, 0x15, 0xFC, 0x5C, 0x2, 0xB7, 0xA8, 0xFE, 0x9A, 0x4, 0xC0, 0x1, 0x89, 0xFE, 0x77, 0xF7, 0xF7, 0x0, 0x2, 0xFC, 0xC2, 0xFE, 0xE, 0xFE, 0xB0, 0xFF, 0x9D, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x5, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0xFC, 0xC2, 0x1, 0xEE, 0xFE, 0x12, 0x1, 0xEE, 0xFE, 0x12, 0x63, 0x9B, 0x59, 0x9B, 0xFF, 0xFF, 0xFC, 0xCE, 0xFE, 0xE, 0xFE, 0xA2, 0xFF, 0xB3, 0x0, 0x27, 0x1, 0x79, 0xFC, 0x91, 0xF9, 0x94, 0x0, 0x7, 0x1, 0x79, 0xFD, 0xBE, 0xF9, 0x94, 0x0, 0x1, 0xFD, 0x9, 0xFE, 0x6, 0xFE, 0x9E, 0xFF, 0x8F, 0x0, 0x5, 0x0, 0x0, 0x1, 0x35, 0x23, 0x35, 0x21, 0x11, 0xFD, 0xF7, 0xEE, 0x1, 0x95, 0xFE, 0x6, 0xEC, 0x9D, 0xFE, 0x77, 0x0, 0x1, 0xFC, 0x4A, 0x4, 0x99, 0xFF, 0x27, 0x6, 0x2F, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x22, 0x27, 0x7, 0x27, 0x37, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x17, 0x7, 0x17, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0xFE, 0x47, 0x3D, 0x39, 0x39, 0x6A, 0x36, 0x14, 0x16, 0x27, 0x34, 0x95, 0x7F, 0x5F, 0x3A, 0x46, 0x3B, 0x68, 0x33, 0x1E, 0x26, 0x36, 0x95, 0x80, 0x4, 0xE9, 0x1E, 0x6E, 0x3D, 0x67, 0x5, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x28, 0x70, 0x3D, 0x61, 0x3, 0x39, 0x2E, 0xC, 0x6F, 0x91, 0x0, 0x3, 0xFC, 0x2A, 0x4, 0x79, 0xFF, 0x7, 0x7, 0x92, 0x0, 0x9, 0x0, 0x1E, 0x0, 0x28, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x5, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0xFD, 0x12, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x1, 0x60, 0x95, 0x80, 0x5F, 0x41, 0x50, 0x48, 0x35, 0x26, 0x35, 0x95, 0x7F, 0x60, 0x51, 0x6F, 0x4D, 0x27, 0x35, 0xFE, 0xA0, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x7, 0x16, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x51, 0xC, 0x70, 0x90, 0x2D, 0x2C, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x5A, 0x3A, 0xFE, 0x91, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0xFC, 0x55, 0x4, 0xDC, 0xFF, 0x32, 0x6, 0x9E, 0x0, 0x13, 0x0, 0x28, 0x0, 0x0, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x15, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0xFE, 0x9D, 0x95, 0x80, 0x60, 0x42, 0x4F, 0x48, 0x34, 0x5B, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x95, 0x80, 0x60, 0x42, 0x4F, 0x48, 0x34, 0x27, 0x34, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x6, 0x9E, 0xA, 0x57, 0x73, 0x23, 0x23, 0x50, 0x7, 0x56, 0x76, 0x46, 0x2C, 0xBE, 0xA, 0x58, 0x72, 0x23, 0x23, 0x2D, 0x24, 0x7, 0x56, 0x76, 0x45, 0x2C, 0x0, 0x1, 0xFC, 0xD, 0xFD, 0xD9, 0xFF, 0x63, 0xFF, 0x89, 0x0, 0xD, 0x0, 0x0, 0x1, 0x37, 0x21, 0x17, 0x23, 0x27, 0x37, 0x33, 0x7, 0x21, 0x27, 0x33, 0x17, 0x7, 0xFE, 0x8, 0x9C, 0xFE, 0x29, 0x9C, 0x89, 0xD3, 0xD3, 0x89, 0x9A, 0x1, 0xD3, 0x9A, 0x89, 0xD2, 0xD2, 0xFD, 0xD9, 0xA0, 0xA0, 0xD8, 0xD8, 0x9E, 0x9E, 0xD8, 0xD8, 0x0, 0x1, 0xFC, 0xD1, 0xFD, 0xDA, 0xFE, 0x9F, 0xFF, 0xA8, 0x0, 0x8, 0x0, 0x0, 0x1, 0x27, 0x11, 0x23, 0x11, 0x7, 0x35, 0x37, 0x17, 0xFE, 0x9F, 0xAD, 0x73, 0xAE, 0xE7, 0xE7, 0xFE, 0x56, 0x9A, 0xFE, 0xEA, 0x1, 0x17, 0x9B, 0x85, 0xCD, 0xCD, 0x0, 0x1, 0xFC, 0x7C, 0x4, 0xA8, 0xFF, 0x12, 0x7, 0x30, 0x0, 0x8, 0x0, 0x0, 0x1, 0x35, 0x25, 0x37, 0x27, 0x25, 0x35, 0x5, 0x15, 0xFC, 0x7C, 0x1, 0x92, 0x3D, 0x3D, 0xFE, 0x6E, 0x2, 0x96, 0x4, 0xA8, 0xA4, 0x91, 0xE, 0xE, 0x93, 0xA4, 0xFF, 0x89, 0x0, 0x1, 0xFD, 0x6F, 0x4, 0x62, 0xFE, 0x3F, 0x5, 0xEB, 0x0, 0xC, 0x0, 0x0, 0x1, 0x22, 0x26, 0x34, 0x36, 0x33, 0x15, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0xFE, 0x3F, 0x56, 0x7A, 0x7A, 0x56, 0x2A, 0x38, 0x38, 0x2A, 0x4, 0x62, 0x6C, 0xAC, 0x71, 0x5F, 0x3A, 0x2E, 0x2B, 0x3A, 0x0, 0x2, 0xFC, 0x75, 0x4, 0x8F, 0xFE, 0xFB, 0x6, 0xBD, 0x0, 0xD, 0x0, 0x19, 0x0, 0x0, 0x1, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0xFE, 0xFB, 0xB7, 0x3F, 0x4C, 0x4D, 0x40, 0xB7, 0xAF, 0x95, 0x94, 0xAE, 0xFE, 0x33, 0x49, 0x41, 0x40, 0x4A, 0x4A, 0x40, 0x41, 0x49, 0x5, 0xA2, 0x37, 0x54, 0x54, 0x37, 0x7D, 0x9E, 0x9E, 0xFE, 0xEB, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x1, 0xFD, 0x4, 0xFD, 0xF0, 0xFE, 0xD3, 0xFF, 0xC7, 0x0, 0xB, 0x0, 0x0, 0x1, 0x27, 0x7, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x7, 0x17, 0xFE, 0x6F, 0x84, 0x85, 0x62, 0x85, 0x84, 0x63, 0x84, 0x85, 0x62, 0x85, 0x84, 0xFD, 0xF0, 0x88, 0x86, 0x64, 0x86, 0x87, 0x64, 0x87, 0x86, 0x64, 0x86, 0x88, 0xFF, 0xFF, 0xFC, 0xBE, 0xFD, 0xDB, 0xFE, 0xC5, 0xFF, 0xBC, 0x0, 0x7, 0x1, 0xA2, 0xFC, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0xFC, 0xCE, 0xFD, 0xDB, 0xFE, 0xD5, 0xFF, 0xBC, 0x0, 0x7, 0x1, 0xA3, 0xFC, 0x91, 0x0, 0x0, 0xFF, 0xFF, 0xFC, 0x17, 0xFD, 0xDB, 0x0, 0x1E, 0xFF, 0xBC, 0x0, 0x27, 0x1, 0xA3, 0xFB, 0xDA, 0x0, 0x0, 0x0, 0x7, 0x1, 0xA1, 0xFD, 0xDB, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0x4F, 0x4, 0x62, 0xFE, 0x1F, 0x5, 0xEB, 0x0, 0x7, 0x1, 0x6F, 0xFD, 0x19, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x49, 0x4, 0xA6, 0x1, 0x5D, 0x5, 0x9E, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x2E, 0x6, 0x13, 0x0, 0x1, 0xFC, 0xD9, 0xFD, 0xEB, 0xFE, 0x96, 0xFF, 0xB7, 0x0, 0xE, 0x0, 0x0, 0x1, 0x37, 0x27, 0x37, 0x17, 0x27, 0x33, 0x7, 0x37, 0x17, 0x7, 0x17, 0x7, 0x27, 0x7, 0xFD, 0xC, 0x6B, 0x9E, 0x1C, 0x9D, 0x7, 0x5D, 0x8, 0x9A, 0x1C, 0xA1, 0x68, 0x4C, 0x5D, 0x5D, 0xFE, 0x25, 0x91, 0x2E, 0x5A, 0x3E, 0xB7, 0xBB, 0x3D, 0x5A, 0x30, 0x8D, 0x37, 0x98, 0x94, 0x0, 0x3, 0xFC, 0x41, 0xFE, 0x1F, 0xFF, 0x50, 0xFF, 0xBC, 0x0, 0x13, 0x0, 0x1C, 0x0, 0x25, 0x0, 0x0, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x22, 0x6, 0x5, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x22, 0x6, 0xFE, 0x73, 0x6A, 0x40, 0x41, 0x69, 0x5F, 0x7F, 0x7F, 0x5F, 0x68, 0x42, 0x41, 0x69, 0x5E, 0x7F, 0x7F, 0xCE, 0x3E, 0x64, 0x3E, 0x3E, 0x64, 0x3E, 0xFE, 0xAC, 0x3E, 0x64, 0x3E, 0x3E, 0x64, 0x3E, 0xFE, 0x1F, 0x47, 0x47, 0x76, 0x57, 0x55, 0x7B, 0x49, 0x49, 0x7B, 0x55, 0x57, 0x76, 0xCD, 0x2C, 0x44, 0x43, 0x5A, 0x44, 0x44, 0x2D, 0x2C, 0x44, 0x43, 0x5A, 0x44, 0x44, 0x0, 0x1, 0xFC, 0xFC, 0x4, 0x9D, 0xFE, 0x94, 0x6, 0x7D, 0x0, 0x7, 0x0, 0x0, 0x1, 0x33, 0x7, 0x33, 0x3, 0x23, 0x37, 0x23, 0xFD, 0x67, 0x86, 0x3C, 0xE3, 0x6B, 0x86, 0x3C, 0xE3, 0x6, 0x7D, 0xAD, 0xFE, 0xCD, 0xAD, 0xFF, 0xFF, 0xFD, 0x34, 0xFE, 0x52, 0x2, 0xCB, 0xFF, 0x98, 0x0, 0x7, 0x2, 0xE, 0x0, 0x0, 0xF9, 0xBC, 0x0, 0x1, 0xFD, 0x34, 0x4, 0x96, 0x2, 0xCB, 0x5, 0xDC, 0x0, 0xC, 0x0, 0x0, 0x1, 0x33, 0x6, 0x4, 0x20, 0x24, 0x27, 0x33, 0x16, 0x4, 0x33, 0x32, 0x24, 0x2, 0x15, 0xB6, 0x4A, 0xFE, 0x9F, 0xFD, 0xC0, 0xFE, 0x9E, 0x4A, 0xB6, 0x39, 0x1, 0xF, 0xCE, 0xCD, 0x1, 0x11, 0x5, 0xDC, 0x7C, 0xCA, 0xCA, 0x7C, 0x37, 0x80, 0x80, 0x0, 0x1, 0xFD, 0xB6, 0x5, 0x6, 0x2, 0x4B, 0x5, 0xA4, 0x0, 0x3, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x2, 0x4B, 0xFB, 0x6B, 0x5, 0xA4, 0x9E, 0x9E, 0xFF, 0xFF, 0xFD, 0xB6, 0xFE, 0xCF, 0x2, 0x4B, 0xFF, 0x6D, 0x0, 0x7, 0x2, 0xF, 0x0, 0x0, 0xF9, 0xC9, 0x0, 0x1, 0xFC, 0x2E, 0x4, 0xD7, 0x3, 0xD1, 0x5, 0xF8, 0x0, 0x15, 0x0, 0x0, 0x1, 0x17, 0x6, 0x6, 0x23, 0x22, 0x2C, 0x2, 0x23, 0x22, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0xC, 0x2, 0x33, 0x32, 0x3, 0x4F, 0x82, 0xE, 0xAB, 0x83, 0x8E, 0xFE, 0xA7, 0xFE, 0x72, 0xFE, 0xC8, 0x6C, 0xA0, 0x2B, 0x83, 0x14, 0xA6, 0x85, 0x78, 0x1, 0x5E, 0x1, 0x8B, 0x1, 0x4E, 0x69, 0xAB, 0x5, 0xF8, 0x28, 0x6A, 0x7B, 0x1B, 0x28, 0x1A, 0x71, 0x23, 0x65, 0x84, 0x1C, 0x26, 0x1B, 0x0, 0x1, 0xFD, 0x34, 0x4, 0x88, 0x2, 0xCB, 0x5, 0xCE, 0x0, 0xC, 0x0, 0x0, 0x1, 0x23, 0x26, 0x24, 0x23, 0x22, 0x4, 0x7, 0x23, 0x36, 0x24, 0x20, 0x4, 0x2, 0xCB, 0xB6, 0x37, 0xFE, 0xEF, 0xCD, 0xCE, 0xFE, 0xF1, 0x39, 0xB6, 0x4A, 0x1, 0x62, 0x2, 0x40, 0x1, 0x61, 0x4, 0x88, 0x37, 0x7F, 0x7F, 0x37, 0x7D, 0xC9, 0xC9, 0x0, 0x1, 0xFD, 0x27, 0xFD, 0xD7, 0x3, 0x6D, 0xFF, 0x89, 0x0, 0x8, 0x0, 0x0, 0x1, 0x23, 0x37, 0x21, 0x35, 0x21, 0x27, 0x33, 0x5, 0x2, 0x40, 0xC3, 0xE4, 0xFA, 0xC6, 0x5, 0x38, 0xE2, 0xC3, 0x1, 0x2D, 0xFD, 0xD7, 0xA4, 0x6B, 0xA3, 0xD8, 0x0, 0x2, 0xFC, 0xD0, 0x4, 0xA8, 0xFE, 0xC1, 0x6, 0xE0, 0x0, 0x9, 0x0, 0x23, 0x0, 0x0, 0x1, 0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x33, 0x35, 0x34, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x17, 0xFD, 0xAC, 0x25, 0x41, 0xC, 0x53, 0x37, 0x35, 0xD3, 0xA, 0x6, 0x38, 0x63, 0x54, 0x63, 0xEF, 0x5F, 0x50, 0x58, 0x8A, 0x7D, 0x68, 0x60, 0x7C, 0x14, 0x5, 0x16, 0x26, 0x16, 0x50, 0x30, 0x20, 0x3C, 0x64, 0x1B, 0x22, 0x47, 0x5A, 0x4B, 0xA8, 0x4, 0x22, 0x55, 0x42, 0x6, 0x4A, 0x62, 0x63, 0x63, 0xE3, 0x4C, 0x39, 0x0, 0x2, 0xFC, 0xCE, 0x4, 0xA3, 0xFE, 0xC0, 0x6, 0xDF, 0x0, 0x5, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x7, 0x33, 0x35, 0x26, 0x13, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x21, 0x16, 0x33, 0x32, 0x37, 0xFD, 0xCD, 0x5E, 0xF, 0xD8, 0x5, 0x81, 0x1B, 0x6B, 0x52, 0x81, 0x8D, 0x8E, 0x71, 0x79, 0x7A, 0xFE, 0x9E, 0xB, 0x7A, 0x5A, 0x30, 0x6, 0x6B, 0x76, 0x9, 0x6D, 0xFE, 0xA0, 0x27, 0x41, 0x99, 0x72, 0x15, 0x85, 0x97, 0x99, 0x77, 0x37, 0x80, 0x3E, 0x0, 0x2, 0xFD, 0x79, 0x4, 0xB1, 0xFE, 0x1C, 0x7, 0xAD, 0x0, 0x5, 0x0, 0x9, 0x0, 0x0, 0x0, 0x33, 0x32, 0x14, 0x23, 0x22, 0x17, 0x11, 0x23, 0x11, 0xFD, 0x79, 0x51, 0x52, 0x52, 0x51, 0x9A, 0x90, 0x7, 0xAD, 0x98, 0x3C, 0xFD, 0xD8, 0x2, 0x28, 0x0, 0x2, 0xFC, 0xC2, 0x4, 0xA3, 0xFE, 0xD0, 0x6, 0xDF, 0x0, 0xA, 0x0, 0x12, 0x0, 0x0, 0x0, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x34, 0x23, 0x22, 0x15, 0x14, 0xFD, 0x50, 0x8E, 0x8E, 0x78, 0x7A, 0x8E, 0x8E, 0x79, 0x78, 0x79, 0x76, 0x4, 0xA3, 0x9C, 0x87, 0x7D, 0x9C, 0x9C, 0x88, 0x7C, 0x9C, 0x74, 0xAF, 0xA5, 0xB0, 0xA4, 0x0, 0x1, 0xFC, 0xD6, 0x4, 0xA7, 0xFE, 0xB3, 0x6, 0xD9, 0x0, 0x10, 0x0, 0x0, 0x1, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0xFE, 0x41, 0xF, 0x37, 0x68, 0x56, 0x67, 0x90, 0x56, 0x4B, 0x1C, 0x90, 0x4, 0xB1, 0x3F, 0x49, 0x6C, 0x7C, 0x1, 0x4A, 0xFE, 0xB5, 0x73, 0x38, 0x1, 0x86, 0xFD, 0xD8, 0x0, 0x1, 0xFC, 0xCC, 0x4, 0xA3, 0xFE, 0xB7, 0x6, 0xDF, 0x0, 0x18, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x33, 0x6, 0x6, 0xFD, 0xCE, 0x84, 0x7E, 0x7E, 0x84, 0x69, 0x7E, 0x2, 0x88, 0x2, 0x2E, 0x32, 0x72, 0x34, 0x3E, 0x59, 0x9, 0x88, 0x2, 0x86, 0x4, 0xA3, 0xA4, 0x71, 0x12, 0x71, 0xA4, 0x74, 0x5B, 0x22, 0x39, 0xB3, 0x43, 0x5E, 0x4D, 0x50, 0x71, 0x0, 0x2, 0xFC, 0xC0, 0x4, 0xA4, 0xFE, 0xBE, 0x7, 0xC8, 0x0, 0x9, 0x0, 0x18, 0x0, 0x0, 0x1, 0x32, 0x37, 0x35, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0xFD, 0xBF, 0x4F, 0x20, 0x20, 0x4E, 0x71, 0x37, 0xBB, 0x9, 0x37, 0x62, 0x68, 0x77, 0x76, 0x6A, 0x59, 0x35, 0x90, 0x5, 0x19, 0x48, 0xC5, 0x47, 0xB1, 0x49, 0x5A, 0x68, 0x35, 0x42, 0x9E, 0x85, 0x7D, 0x9B, 0x36, 0x1, 0x1F, 0xFC, 0xE9, 0x0, 0x1, 0xFC, 0xD6, 0x4, 0xB1, 0xFE, 0xB3, 0x7, 0xC8, 0x0, 0x10, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0xFD, 0xC9, 0x47, 0x1C, 0x90, 0x90, 0x36, 0x5A, 0x56, 0x67, 0x90, 0x6, 0x6B, 0x33, 0xFE, 0x79, 0x3, 0x17, 0xFE, 0xDB, 0x3C, 0x6F, 0x80, 0xFE, 0xC1, 0x1, 0x40, 0x7A, 0x0, 0x1, 0xFC, 0x33, 0x4, 0xB1, 0xFF, 0x5D, 0x6, 0xDF, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x23, 0x22, 0x7, 0x17, 0x11, 0x23, 0x11, 0x34, 0xFD, 0x2A, 0x4B, 0x1C, 0x90, 0x72, 0xF, 0x37, 0x68, 0x75, 0x2D, 0x36, 0x75, 0x56, 0x67, 0x8F, 0x57, 0x4F, 0x1B, 0x3, 0x90, 0x6, 0x6B, 0x38, 0xFE, 0x7E, 0x2, 0x28, 0x42, 0x48, 0x5B, 0x5B, 0x6C, 0x7C, 0xFE, 0xBA, 0x1, 0x47, 0x73, 0x3E, 0x26, 0xFE, 0xAA, 0x1, 0x47, 0x73, 0x0, 0x1, 0xFD, 0x46, 0x4, 0xB1, 0xFE, 0x79, 0x6, 0xDF, 0x0, 0xD, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0xFE, 0x3C, 0x4B, 0x1C, 0x8F, 0x72, 0xE, 0x31, 0x55, 0x1B, 0x12, 0x1C, 0x6, 0x5F, 0x38, 0xFE, 0x8A, 0x2, 0x28, 0x3F, 0x45, 0x5, 0x89, 0xE, 0x0, 0x1, 0xFC, 0xFB, 0x4, 0xAC, 0xFE, 0x46, 0x7, 0x64, 0x0, 0x12, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x33, 0x37, 0xFE, 0x43, 0x21, 0x31, 0x99, 0x3, 0x5A, 0x5A, 0x90, 0x61, 0x61, 0x33, 0x2B, 0x4, 0xB8, 0xC, 0xB3, 0x1, 0x11, 0x6F, 0x85, 0x85, 0x6F, 0xFE, 0xFA, 0x48, 0x4, 0x0, 0x1, 0xFC, 0xC5, 0x4, 0xB1, 0xFE, 0xCB, 0x6, 0xDB, 0x0, 0x8, 0x0, 0x0, 0x1, 0x3, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x3, 0xFD, 0x86, 0xC1, 0x9A, 0x62, 0x8, 0x9, 0x5F, 0x9A, 0xC0, 0x4, 0xB1, 0x2, 0x2A, 0xFE, 0xA7, 0x2F, 0x2F, 0x1, 0x59, 0xFD, 0xD6, 0x0, 0x1, 0xFC, 0xE6, 0x4, 0xB1, 0xFE, 0xEE, 0x6, 0xDB, 0x0, 0xB, 0x0, 0x0, 0x1, 0x17, 0x37, 0x33, 0x3, 0x13, 0x23, 0x27, 0x7, 0x23, 0x13, 0x3, 0xFD, 0x8E, 0x5B, 0x5C, 0xA3, 0xA2, 0xA8, 0xA3, 0x61, 0x61, 0xA3, 0xA8, 0xA2, 0x6, 0xDB, 0xA4, 0xA4, 0xFE, 0xEF, 0xFE, 0xE7, 0xAC, 0xAC, 0x1, 0x19, 0x1, 0x11, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x4, 0x50, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x4, 0x50, 0xFD, 0x41, 0xFC, 0xFC, 0x2, 0xBF, 0x2, 0x88, 0xFD, 0x78, 0x5, 0xB0, 0xFD, 0xA2, 0x0, 0x1, 0x0, 0x1B, 0x0, 0x0, 0x3, 0xD0, 0x4, 0x4E, 0x0, 0x11, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x21, 0x3, 0xD0, 0xFE, 0x1B, 0xF3, 0x5C, 0x41, 0x1D, 0x23, 0x37, 0x45, 0x7E, 0xD6, 0x1, 0xE5, 0x1, 0xB5, 0xFE, 0x4B, 0x3, 0xF, 0x56, 0x40, 0x7, 0xA3, 0xD, 0x8D, 0xB2, 0x98, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x3, 0xE5, 0xFA, 0xFC, 0xF7, 0xCB, 0x4, 0x83, 0x3, 0x84, 0x1, 0x61, 0xFB, 0x1B, 0x4, 0xE5, 0xFE, 0x9F, 0x2, 0x2C, 0xFD, 0xD4, 0x0, 0x1, 0x0, 0x36, 0x0, 0x0, 0x3, 0xF7, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x3, 0x34, 0xA5, 0xF1, 0xA5, 0xC3, 0x3, 0xC1, 0x3, 0xC5, 0x1, 0x28, 0xFB, 0x13, 0x4, 0xED, 0xFE, 0xD8, 0x1, 0xEB, 0xFE, 0x15, 0xFF, 0xFF, 0x0, 0x51, 0x4, 0xBC, 0x1, 0xA0, 0x6, 0x1A, 0x0, 0x6, 0x1, 0x6B, 0x2E, 0x0, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x56, 0x1, 0x9F, 0xFF, 0xB4, 0x0, 0x3, 0x0, 0x0, 0x5, 0x3, 0x23, 0x13, 0x1, 0x9F, 0x6E, 0xE1, 0xC8, 0x4C, 0xFE, 0xA2, 0x1, 0x5E, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0xD, 0x5, 0xB0, 0x0, 0x6, 0x2, 0x72, 0x0, 0x0, 0x0, 0x1, 0x0, 0x86, 0xFF, 0xEB, 0x4, 0x8F, 0x4, 0x3A, 0x0, 0x12, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x11, 0x1, 0x23, 0x11, 0x33, 0x11, 0x1, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x4, 0x10, 0x70, 0x80, 0xFE, 0x59, 0xF3, 0xF3, 0x1, 0xA7, 0xF3, 0x3, 0x46, 0x10, 0xA, 0x19, 0x33, 0x15, 0xA4, 0xB5, 0x1, 0x94, 0xFD, 0x28, 0x4, 0x3A, 0xFD, 0x29, 0x2, 0xD7, 0xFC, 0xFA, 0x7B, 0x4, 0xB3, 0x1F, 0x0, 0x1, 0x0, 0x3B, 0xFF, 0xEC, 0x3, 0xE1, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x2, 0x23, 0x22, 0x24, 0x3B, 0xE5, 0x5, 0x7A, 0x58, 0x95, 0x62, 0x62, 0x95, 0x63, 0x6F, 0x5, 0xE5, 0x5, 0xF1, 0xC4, 0xF7, 0xF3, 0x2, 0xF3, 0xFA, 0xB4, 0xFF, 0x0, 0x1, 0x66, 0x4F, 0x68, 0xD9, 0x83, 0x24, 0x81, 0xDB, 0x7D, 0x57, 0xB3, 0xE4, 0xFE, 0xC4, 0xDD, 0x2A, 0xDF, 0xFE, 0xC0, 0xDD, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x3, 0xF5, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x23, 0x0, 0x0, 0x5, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x6, 0x4, 0x0, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x2, 0x3C, 0xFA, 0xF2, 0xF3, 0xF9, 0xC5, 0xF0, 0x4, 0xE4, 0x5, 0x70, 0x63, 0x94, 0x63, 0x62, 0x96, 0x58, 0x7A, 0x5, 0xE4, 0x4, 0xFF, 0x0, 0xFE, 0xC0, 0x42, 0x76, 0x42, 0x42, 0x76, 0x42, 0x14, 0x1, 0x40, 0xDF, 0x24, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x83, 0xD9, 0x68, 0x4F, 0x9D, 0xDD, 0x2, 0x5E, 0x45, 0x45, 0x64, 0x44, 0x44, 0x0, 0x2, 0x0, 0x3B, 0xFF, 0xEC, 0x3, 0xE1, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x23, 0x0, 0x0, 0x0, 0x26, 0x34, 0x36, 0x32, 0x16, 0x14, 0x6, 0x5, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x2, 0x23, 0x22, 0x24, 0x1, 0xB7, 0x42, 0x42, 0x76, 0x42, 0x42, 0xFE, 0xE, 0xE5, 0x5, 0x7A, 0x58, 0x95, 0x62, 0x62, 0x95, 0x63, 0x6F, 0x5, 0xE5, 0x5, 0xF1, 0xC4, 0xF7, 0xF3, 0x2, 0xF3, 0xFA, 0xB4, 0xFF, 0x0, 0x1, 0xA2, 0x44, 0x64, 0x45, 0x45, 0x64, 0x44, 0x3C, 0x4F, 0x68, 0xD9, 0x83, 0x24, 0x81, 0xDB, 0x7D, 0x57, 0xB3, 0xE4, 0xFE, 0xC4, 0xDD, 0x2A, 0xDF, 0xFE, 0xC0, 0xDD, 0xFF, 0xFF, 0x0, 0x47, 0xFE, 0xB8, 0x1, 0x9F, 0x4, 0x52, 0x0, 0x27, 0x0, 0x13, 0xFF, 0xFC, 0x3, 0x51, 0x0, 0x6, 0x0, 0x11, 0x2A, 0x0, 0x0, 0x1, 0x0, 0xC7, 0x4, 0xEA, 0x1, 0xE2, 0x6, 0x41, 0x0, 0x3, 0x0, 0x0, 0x13, 0x13, 0x33, 0x3, 0xC7, 0x3C, 0xDF, 0x8B, 0x4, 0xEA, 0x1, 0x57, 0xFE, 0xA9, 0x0, 0x3, 0x0, 0x68, 0x4, 0xE0, 0x3, 0xBB, 0x6, 0xAF, 0x0, 0x3, 0x0, 0xF, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x13, 0x33, 0x3, 0x5, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0xC0, 0x2F, 0xE4, 0x81, 0xFE, 0x16, 0x44, 0x3A, 0x3B, 0x44, 0x44, 0x3B, 0x3A, 0x44, 0x2, 0x55, 0x45, 0x3A, 0x3B, 0x44, 0x44, 0x3B, 0x3A, 0x45, 0x5, 0x86, 0x1, 0x29, 0xFE, 0xD7, 0x30, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x30, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0xFF, 0xFF, 0x0, 0x8E, 0x2, 0x46, 0x1, 0xAA, 0x3, 0x52, 0x0, 0x6, 0x0, 0x79, 0x0, 0x0, 0x0, 0x1, 0x0, 0x9B, 0x0, 0x0, 0x4, 0x38, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x0, 0x1, 0x15, 0x21, 0x11, 0x23, 0x11, 0x4, 0x38, 0xFD, 0x5F, 0xFC, 0x5, 0xB0, 0xCB, 0xFB, 0x1B, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x19, 0x0, 0x0, 0x5, 0xA1, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x6, 0x0, 0x0, 0x25, 0x1, 0x1, 0x5, 0x1, 0x33, 0x1, 0x4, 0x4F, 0xFE, 0x98, 0xFE, 0x88, 0xFE, 0xAA, 0x2, 0x56, 0xF4, 0x2, 0x3E, 0xCA, 0x3, 0xBD, 0xFC, 0x43, 0xCA, 0x5, 0xB0, 0xFA, 0x50, 0x0, 0x3, 0x0, 0x5C, 0xFF, 0xEC, 0x5, 0x14, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x27, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x27, 0x15, 0x21, 0x35, 0x5, 0x14, 0xFE, 0xB5, 0xFE, 0xF0, 0xFE, 0xF6, 0xFE, 0xAD, 0x1, 0x51, 0x1, 0xA, 0x1, 0x10, 0x1, 0x4D, 0xFD, 0xB9, 0xA7, 0xA2, 0xBC, 0xBE, 0xA2, 0xA8, 0xB6, 0x74, 0xFE, 0x40, 0x2, 0xB3, 0xFE, 0xB4, 0xFE, 0x85, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xFE, 0x84, 0xFE, 0xB4, 0x2, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0x89, 0xC3, 0xC3, 0x0, 0x1, 0x0, 0x20, 0x0, 0x0, 0x5, 0x12, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x21, 0x1, 0x1, 0x21, 0x1, 0x33, 0x1, 0x4, 0x2, 0xFE, 0x97, 0xFE, 0x97, 0xFE, 0xF0, 0x1, 0xFE, 0xF6, 0x1, 0xFE, 0x4, 0x44, 0xFB, 0xBC, 0x5, 0xB0, 0xFA, 0x50, 0x0, 0x3, 0x0, 0x6D, 0x0, 0x0, 0x4, 0x2F, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x7, 0x0, 0xB, 0x0, 0x0, 0x13, 0x35, 0x21, 0x15, 0x1, 0x35, 0x21, 0x15, 0x1, 0x35, 0x21, 0x15, 0x79, 0x3, 0x9A, 0xFC, 0xBD, 0x2, 0xF7, 0xFC, 0xA6, 0x3, 0xC2, 0x4, 0xE5, 0xCB, 0xCB, 0xFD, 0xA2, 0xC6, 0xC6, 0xFD, 0x79, 0xCA, 0xCA, 0x0, 0x1, 0x0, 0x9B, 0x0, 0x0, 0x5, 0x15, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x5, 0x15, 0xFD, 0xFD, 0x7F, 0xFC, 0x5, 0xB0, 0xFA, 0x50, 0x4, 0xE5, 0xFB, 0x1B, 0x5, 0xB0, 0x0, 0x1, 0x0, 0x48, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x0, 0x33, 0x35, 0x1, 0x1, 0x35, 0x21, 0x15, 0x21, 0x1, 0x15, 0x1, 0x21, 0x15, 0x48, 0x1, 0xC9, 0xFE, 0x37, 0x3, 0xE1, 0xFD, 0x6B, 0x1, 0x88, 0xFE, 0x77, 0x2, 0xBA, 0x98, 0x2, 0x42, 0x2, 0x3F, 0x97, 0xCB, 0xFD, 0xFE, 0x13, 0xFD, 0xFB, 0xCB, 0x0, 0x3, 0x0, 0x4A, 0x0, 0x0, 0x5, 0xAF, 0x5, 0xB0, 0x0, 0x11, 0x0, 0x18, 0x0, 0x1F, 0x0, 0x0, 0x21, 0x23, 0x35, 0x26, 0x0, 0x35, 0x34, 0x0, 0x37, 0x35, 0x33, 0x15, 0x16, 0x0, 0x15, 0x14, 0x0, 0x7, 0x1, 0x14, 0x16, 0x17, 0x11, 0x6, 0x6, 0x5, 0x34, 0x26, 0x27, 0x11, 0x36, 0x36, 0x3, 0x7C, 0xFC, 0xFE, 0xFE, 0xC8, 0x1, 0x3C, 0xFA, 0xFC, 0xF9, 0x1, 0x3A, 0xFE, 0xC9, 0xFC, 0xFD, 0xC7, 0xA1, 0x9C, 0x99, 0xA4, 0x3, 0x73, 0xA2, 0x98, 0x9C, 0x9E, 0xA9, 0x7, 0x1, 0x2C, 0xF3, 0xF8, 0x1, 0x33, 0x6, 0xB0, 0xB0, 0x7, 0xFE, 0xD0, 0xF8, 0xF3, 0xFE, 0xD3, 0x8, 0x2, 0x26, 0x9B, 0xB0, 0x6, 0x2, 0xAD, 0x5, 0xB6, 0x9F, 0xA0, 0xB4, 0x6, 0xFD, 0x53, 0x7, 0xB2, 0x0, 0x1, 0x0, 0x44, 0x0, 0x0, 0x5, 0x5D, 0x5, 0xB0, 0x0, 0x16, 0x0, 0x0, 0x21, 0x23, 0x11, 0x26, 0x0, 0x11, 0x11, 0x33, 0x11, 0x14, 0x16, 0x17, 0x11, 0x33, 0x11, 0x24, 0x13, 0x11, 0x33, 0x11, 0x6, 0x0, 0x7, 0x3, 0x4D, 0xFC, 0xEB, 0xFE, 0xDE, 0xFC, 0x94, 0x7D, 0xFC, 0x1, 0xD, 0x6, 0xFD, 0x3, 0xFE, 0xDE, 0xEB, 0x1, 0x75, 0x17, 0x1, 0x2E, 0x1, 0x6, 0x1, 0xF0, 0xFE, 0x10, 0xA4, 0xBF, 0x19, 0x3, 0x6C, 0xFC, 0x93, 0x2F, 0x1, 0x40, 0x1, 0xFE, 0xFE, 0x6, 0xFF, 0xFE, 0xD8, 0x19, 0x0, 0x1, 0x0, 0x6B, 0x0, 0x0, 0x4, 0xDD, 0x5, 0xC4, 0x0, 0x23, 0x0, 0x0, 0x21, 0x21, 0x35, 0x33, 0x26, 0x2, 0x35, 0x35, 0x10, 0x0, 0x33, 0x32, 0x0, 0x11, 0x15, 0x14, 0x2, 0x7, 0x33, 0x15, 0x21, 0x35, 0x36, 0x12, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x12, 0x17, 0x2, 0x6F, 0xFE, 0x8, 0xD7, 0x66, 0x7D, 0x1, 0x3B, 0xFD, 0xFE, 0x1, 0x3C, 0x7C, 0x65, 0xD3, 0xFE, 0x10, 0x6D, 0x81, 0x2, 0xA0, 0x8C, 0x89, 0xA1, 0x86, 0x70, 0xCC, 0x61, 0x1, 0x21, 0xA0, 0x64, 0x1, 0x15, 0x1, 0x5D, 0xFE, 0xA3, 0xFE, 0xEB, 0x64, 0xA0, 0xFE, 0xE0, 0x62, 0xCC, 0xD0, 0x1D, 0x1, 0x3, 0xEE, 0x76, 0xD0, 0xD4, 0xD4, 0xD0, 0x66, 0xFA, 0xFE, 0xF9, 0x1D, 0x0, 0x2, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x4, 0x4E, 0x0, 0x16, 0x0, 0x21, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x3, 0xFB, 0xA2, 0x35, 0x68, 0xC0, 0xCA, 0xDC, 0xDB, 0xCD, 0xB6, 0x66, 0x14, 0xD0, 0x3, 0x46, 0x10, 0xA, 0x19, 0x33, 0xFD, 0xF3, 0x8C, 0x45, 0x44, 0x8B, 0x84, 0x6E, 0x6D, 0x15, 0xA3, 0xA3, 0x1, 0x28, 0xE7, 0x15, 0xFC, 0x1, 0x43, 0x97, 0x83, 0xFC, 0xFA, 0x7B, 0x4, 0xB3, 0x1F, 0xC3, 0x87, 0x1, 0xCA, 0x8C, 0xE0, 0xB1, 0x8B, 0xC1, 0x0, 0x2, 0x0, 0x96, 0xFE, 0x76, 0x4, 0x6A, 0x5, 0xC4, 0x0, 0x14, 0x0, 0x26, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x34, 0x24, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x11, 0x14, 0x6, 0x2, 0x7D, 0x77, 0x84, 0x75, 0x6F, 0x79, 0x4A, 0x71, 0x62, 0x67, 0x68, 0x5F, 0x81, 0x5A, 0xC4, 0xA6, 0x78, 0xF3, 0x1, 0x14, 0xBF, 0xCD, 0xF5, 0xBB, 0xFA, 0xF9, 0xAF, 0x8C, 0x6A, 0x68, 0x98, 0xB9, 0x74, 0x60, 0x50, 0x7F, 0x7D, 0x65, 0xFC, 0xE1, 0x51, 0xC3, 0x53, 0xFE, 0x37, 0x5, 0xA9, 0xB6, 0xEF, 0xD5, 0xB5, 0xC5, 0x65, 0x5B, 0xFE, 0xF0, 0xD3, 0xE6, 0x0, 0x1, 0x0, 0x21, 0xFE, 0x5F, 0x3, 0xF5, 0x4, 0x3A, 0x0, 0x8, 0x0, 0x0, 0x1, 0x23, 0x11, 0x1, 0x33, 0x13, 0x13, 0x33, 0x1, 0x2, 0x84, 0xF2, 0xFE, 0x8F, 0xFB, 0xF3, 0xEC, 0xFA, 0xFE, 0x8F, 0xFE, 0x5F, 0x1, 0xD1, 0x4, 0xA, 0xFD, 0x4, 0x2, 0xFC, 0xFB, 0xEE, 0x0, 0x2, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0x39, 0x6, 0x21, 0x0, 0x1E, 0x0, 0x2C, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x4, 0x13, 0x15, 0x14, 0x0, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x36, 0x37, 0x27, 0x26, 0x26, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x27, 0x22, 0x6, 0x15, 0xD0, 0xD3, 0xB8, 0x4F, 0x75, 0x46, 0x98, 0x68, 0xA8, 0x49, 0x79, 0x1, 0xB1, 0x9, 0xFE, 0xFB, 0xEC, 0xEE, 0xFE, 0xFA, 0xBF, 0x82, 0x2, 0x59, 0x6A, 0x77, 0x7C, 0x85, 0x84, 0x7A, 0x89, 0x75, 0x84, 0x7D, 0x4, 0xEA, 0x92, 0xA5, 0x19, 0x19, 0xC2, 0x34, 0x71, 0x22, 0x54, 0x2B, 0x9A, 0xFE, 0x74, 0x24, 0xE5, 0xFE, 0xCC, 0x1, 0x30, 0xE3, 0x13, 0xAC, 0xFA, 0x20, 0x5, 0x29, 0x89, 0xFD, 0x7C, 0x8E, 0xCF, 0xCF, 0x8E, 0x14, 0x71, 0xD2, 0x17, 0xCF, 0x8B, 0x0, 0x1, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x4, 0x4D, 0x0, 0x26, 0x0, 0x0, 0x1, 0x14, 0x6, 0x6, 0x23, 0x22, 0x24, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x4, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x4, 0xD, 0x89, 0xD4, 0x72, 0xCD, 0xFE, 0xF0, 0xCB, 0xB8, 0xFD, 0xCD, 0xB6, 0x1, 0x7, 0xF2, 0x79, 0x59, 0x6D, 0x64, 0x62, 0x68, 0xC7, 0xD2, 0xD1, 0x75, 0x6D, 0x6B, 0x7A, 0x1, 0x41, 0x76, 0x97, 0x48, 0xAC, 0x9A, 0xB9, 0x42, 0x4D, 0x98, 0x9A, 0xA1, 0xAE, 0x98, 0x3E, 0x4D, 0x57, 0x34, 0x3C, 0x4C, 0xAD, 0x4, 0x91, 0x3A, 0x5C, 0x5D, 0x3D, 0x0, 0x1, 0x0, 0x61, 0xFE, 0x7E, 0x3, 0xCA, 0x5, 0xB0, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x27, 0x36, 0x27, 0x36, 0x27, 0x27, 0x26, 0x26, 0x35, 0x10, 0x1, 0x13, 0x21, 0x35, 0x21, 0x15, 0x1, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x17, 0x16, 0x16, 0x7, 0x6, 0x6, 0x2, 0xD8, 0x7E, 0x5E, 0x1, 0x1, 0x82, 0x57, 0xAF, 0x94, 0x1, 0x10, 0xF3, 0xFD, 0xC2, 0x3, 0x69, 0xFE, 0xA3, 0x6B, 0x74, 0x4C, 0x50, 0x65, 0x78, 0x9E, 0x1, 0x1, 0x88, 0xFE, 0x7E, 0x64, 0x67, 0x46, 0x41, 0x24, 0x17, 0x2F, 0xAB, 0x9B, 0x1, 0x14, 0x1, 0x44, 0x1, 0x16, 0xC2, 0x91, 0xFE, 0x5B, 0x7D, 0xD3, 0x92, 0x60, 0x56, 0x17, 0x1D, 0x23, 0x52, 0x7D, 0x53, 0xB9, 0x0, 0x1, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x4, 0x4E, 0x0, 0x11, 0x0, 0x0, 0x1, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x4, 0x6, 0xF3, 0x65, 0x60, 0x98, 0x45, 0xF2, 0xDE, 0xB, 0x76, 0xC3, 0xA1, 0xC3, 0x1, 0xFE, 0x61, 0x4, 0x53, 0x77, 0x60, 0x7B, 0xFC, 0xF0, 0x4, 0x3A, 0x83, 0x97, 0xAF, 0xE4, 0x0, 0x3, 0x0, 0x74, 0xFF, 0xEC, 0x4, 0x2D, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x14, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x10, 0x0, 0x23, 0x22, 0x0, 0x3, 0x35, 0x10, 0x0, 0x33, 0x32, 0x0, 0x13, 0x5, 0x21, 0x35, 0x10, 0x23, 0x22, 0x3, 0x13, 0x32, 0x13, 0x37, 0x21, 0x15, 0x10, 0x4, 0x2D, 0xFE, 0xFC, 0xD7, 0xD4, 0xFE, 0xF9, 0x3, 0x1, 0x6, 0xD6, 0xD5, 0x1, 0x5, 0x3, 0xFD, 0x3A, 0x1, 0xD3, 0xEA, 0xD9, 0xF, 0xEA, 0xD8, 0xF, 0x1, 0xFE, 0x2D, 0x2, 0x73, 0xFE, 0xB4, 0xFE, 0xC5, 0x1, 0x35, 0x1, 0x43, 0xE0, 0x1, 0x4C, 0x1, 0x34, 0xFE, 0xD2, 0xFE, 0xBD, 0x1B, 0x31, 0x1, 0x98, 0xFE, 0x9E, 0xFD, 0x10, 0x1, 0x6A, 0x61, 0x2A, 0xFE, 0x5F, 0x0, 0x1, 0x0, 0xAA, 0xFF, 0xF4, 0x2, 0x62, 0x4, 0x3A, 0x0, 0xD, 0x0, 0x0, 0x13, 0x33, 0x3, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x23, 0x22, 0x26, 0x35, 0xAA, 0xF3, 0x1, 0x40, 0x31, 0x2A, 0x2B, 0x43, 0x5D, 0x79, 0x9F, 0x4, 0x3A, 0xFC, 0xF8, 0x49, 0x2C, 0xA, 0xBB, 0x18, 0x89, 0xA7, 0x0, 0x1, 0x0, 0x16, 0xFF, 0xEE, 0x4, 0x4A, 0x5, 0xFC, 0x0, 0x17, 0x0, 0x0, 0x5, 0x22, 0x26, 0x27, 0x3, 0x3, 0x21, 0x1, 0x27, 0x26, 0x23, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x17, 0x1, 0x16, 0x33, 0x37, 0x17, 0x6, 0x3, 0xEC, 0x65, 0x79, 0x2D, 0xCA, 0xF8, 0xFE, 0xF7, 0x1, 0x82, 0x56, 0x26, 0x53, 0x35, 0x3, 0x31, 0x51, 0x6B, 0x78, 0x1F, 0x1, 0xAC, 0x26, 0x3D, 0x23, 0x3, 0x28, 0x12, 0x51, 0x73, 0x2, 0x18, 0xFD, 0x36, 0x4, 0x11, 0xCC, 0x5B, 0x2, 0xB5, 0x11, 0x55, 0x50, 0xFB, 0xBE, 0x5E, 0x2, 0xC2, 0x9, 0x0, 0x1, 0x0, 0x64, 0xFE, 0x75, 0x3, 0xD5, 0x5, 0xC4, 0x0, 0x2C, 0x0, 0x0, 0x5, 0x6, 0x6, 0x7, 0x27, 0x36, 0x36, 0x35, 0x34, 0x27, 0x2E, 0x2, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x4, 0x11, 0x14, 0x16, 0x17, 0x17, 0x16, 0x16, 0x3, 0xD4, 0x1, 0x88, 0x43, 0x84, 0x30, 0x33, 0x82, 0xBC, 0xD5, 0x70, 0xA3, 0x90, 0x6D, 0x7C, 0x1, 0x8, 0xDD, 0x9A, 0x7B, 0x25, 0x88, 0x58, 0x86, 0x7C, 0x7F, 0x93, 0x93, 0xA2, 0xFE, 0xB3, 0x9A, 0x64, 0x6A, 0x80, 0x96, 0x4D, 0x53, 0xB9, 0x32, 0x64, 0x34, 0x4F, 0x2F, 0x3F, 0x22, 0x31, 0x62, 0xAB, 0x96, 0x92, 0xC3, 0x2E, 0x27, 0x8F, 0x60, 0xAB, 0xC0, 0x2C, 0xBD, 0x24, 0x5F, 0x43, 0x51, 0x66, 0xC7, 0x8, 0xFE, 0xEC, 0x75, 0x7B, 0x18, 0x19, 0x1F, 0x5D, 0x0, 0x1, 0x0, 0x2E, 0xFF, 0xF4, 0x4, 0xCF, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x3, 0x14, 0x16, 0x33, 0x32, 0x37, 0x4, 0xCF, 0x43, 0x5C, 0x79, 0xA0, 0xFE, 0xB4, 0xF2, 0xAB, 0x4, 0x7C, 0x9F, 0x1, 0x3F, 0x32, 0x29, 0x2B, 0xC, 0x18, 0x89, 0xA7, 0x2, 0x59, 0xFC, 0x83, 0x3, 0x7D, 0xBD, 0xBD, 0xFD, 0xB5, 0x49, 0x2C, 0xA, 0x0, 0x2, 0x0, 0x81, 0xFE, 0x60, 0x4, 0x32, 0x4, 0x4E, 0x0, 0xC, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x34, 0x0, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x2, 0x4C, 0x83, 0x70, 0x6C, 0x83, 0x75, 0x68, 0x44, 0xD9, 0xB2, 0x6B, 0xF2, 0x1, 0xA, 0xCC, 0xEC, 0xEF, 0xD7, 0xAF, 0xC0, 0x8B, 0x15, 0x9B, 0xE1, 0xDC, 0x7C, 0xFE, 0xF3, 0x77, 0xC3, 0x78, 0xFD, 0xFC, 0x3, 0xE0, 0xF5, 0x1, 0x19, 0xFE, 0xBD, 0xFD, 0x14, 0xE7, 0xFE, 0xD9, 0x0, 0x1, 0x0, 0x52, 0xFE, 0x8A, 0x3, 0xEA, 0x4, 0x4E, 0x0, 0x20, 0x0, 0x0, 0x1, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x4, 0x16, 0x17, 0x17, 0x6, 0x6, 0x7, 0x27, 0x36, 0x36, 0x27, 0x34, 0x27, 0x26, 0x26, 0x35, 0x35, 0x34, 0x12, 0x2, 0x39, 0xBF, 0xF2, 0xE5, 0x64, 0x68, 0x86, 0x6E, 0x92, 0x1, 0x2E, 0x8B, 0x7, 0x1, 0x1, 0x86, 0x43, 0x7F, 0x30, 0x2D, 0x1, 0x82, 0xE9, 0xEE, 0xFB, 0x4, 0x4E, 0xD6, 0xC1, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x83, 0x9A, 0x57, 0x4F, 0x6B, 0x14, 0x53, 0xBA, 0x32, 0x65, 0x34, 0x4D, 0x2F, 0x45, 0x1F, 0x38, 0xFA, 0xD6, 0x24, 0xDE, 0x1, 0x41, 0x0, 0x2, 0x0, 0x53, 0xFF, 0xEC, 0x4, 0x7F, 0x4, 0x3A, 0x0, 0xF, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x14, 0x2, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x0, 0x33, 0x21, 0x15, 0x21, 0x16, 0x16, 0x5, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x4, 0x2D, 0xFF, 0xEA, 0xED, 0xFE, 0xFC, 0x1, 0x4, 0xEB, 0x2, 0x3D, 0xFE, 0xF5, 0x54, 0x65, 0xFD, 0x19, 0x76, 0x88, 0x83, 0x73, 0x72, 0x85, 0x87, 0x76, 0x1, 0xE9, 0xCD, 0xFE, 0xD0, 0x1, 0x3B, 0xEB, 0x15, 0xE3, 0x1, 0x30, 0xC4, 0x42, 0xC1, 0x61, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x87, 0xC8, 0xC8, 0x87, 0x0, 0x1, 0x0, 0x40, 0xFF, 0xEC, 0x3, 0xED, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x3, 0x66, 0x4F, 0x6D, 0x83, 0x95, 0xFE, 0xAE, 0x3, 0xAD, 0xFE, 0x98, 0x35, 0x28, 0x2A, 0x34, 0x19, 0x2D, 0x9A, 0xAB, 0x2, 0x48, 0xC1, 0xC1, 0xFD, 0xB1, 0x47, 0x30, 0x16, 0x0, 0x1, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x0, 0x13, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x26, 0x3, 0x33, 0x16, 0x12, 0x15, 0x14, 0x2, 0x6, 0x23, 0x22, 0x26, 0x27, 0x80, 0xF3, 0x5D, 0x44, 0x7D, 0x85, 0x5, 0x6D, 0xF1, 0x2E, 0x45, 0x67, 0xD9, 0xAA, 0xBD, 0xE0, 0x1, 0x4, 0x3A, 0xFD, 0x6D, 0x89, 0x70, 0xFB, 0x8D, 0xEB, 0x1, 0x19, 0x5C, 0xFE, 0xFD, 0xA5, 0x9E, 0xFE, 0xF4, 0xA1, 0xD4, 0xE6, 0x0, 0x2, 0x0, 0x45, 0xFE, 0x22, 0x5, 0x85, 0x4, 0x41, 0x0, 0x1C, 0x0, 0x25, 0x0, 0x0, 0x1, 0x23, 0x11, 0x2E, 0x2, 0x35, 0x34, 0x12, 0x37, 0x17, 0x6, 0x6, 0x7, 0x14, 0x16, 0x17, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x15, 0x14, 0x6, 0x6, 0x7, 0x35, 0x36, 0x36, 0x35, 0x26, 0x26, 0x23, 0x22, 0x15, 0x3, 0x59, 0xF3, 0xC8, 0xEF, 0x6A, 0x7F, 0x71, 0x98, 0x4D, 0x45, 0x4, 0x86, 0xA9, 0x9F, 0x7B, 0x9E, 0xE8, 0x7F, 0x6C, 0xF3, 0xCD, 0xAF, 0x8B, 0x3, 0x82, 0x7E, 0x37, 0xFE, 0x22, 0x1, 0xD0, 0x16, 0xAE, 0xFF, 0x8F, 0xA3, 0x1, 0x8, 0x52, 0x93, 0x4B, 0xC3, 0x5C, 0x87, 0xE2, 0x22, 0x2, 0x84, 0x74, 0x90, 0x96, 0xF5, 0x8F, 0x88, 0xF3, 0xA7, 0x14, 0xC7, 0x1E, 0xD6, 0x7B, 0x8A, 0xCD, 0x3E, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x22, 0x5, 0x7F, 0x4, 0x3A, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x23, 0x11, 0x26, 0x0, 0x11, 0x11, 0x33, 0x11, 0x16, 0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x36, 0x35, 0x26, 0x3, 0x33, 0x16, 0x16, 0x15, 0x14, 0x2, 0x6, 0x7, 0x3, 0x52, 0xF3, 0xF3, 0xFE, 0xE4, 0xF3, 0x2, 0x9F, 0x7B, 0xF3, 0xAE, 0x8C, 0x3, 0x71, 0xED, 0x30, 0x4A, 0x6A, 0xF4, 0xCF, 0xFE, 0x22, 0x1, 0xD0, 0x1D, 0x1, 0x25, 0x1, 0x1E, 0x1, 0xE8, 0xFE, 0xC, 0xBA, 0xB8, 0x1A, 0x3, 0x80, 0xFC, 0x7F, 0x20, 0xE3, 0x88, 0xDD, 0x1, 0x19, 0x59, 0xFC, 0xA1, 0x91, 0xFE, 0xFF, 0xAE, 0x14, 0x0, 0x1, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x2, 0x35, 0x34, 0x12, 0x37, 0x33, 0x2, 0x7, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x26, 0x3, 0x33, 0x16, 0x12, 0x15, 0x14, 0x2, 0x6, 0x4, 0x8D, 0xE7, 0x5C, 0x5C, 0xE7, 0x9B, 0xB7, 0x4F, 0x55, 0x39, 0xF1, 0x85, 0x7, 0x51, 0x67, 0x50, 0x6C, 0xFB, 0x1, 0x6B, 0x4F, 0x67, 0x52, 0x7, 0x86, 0xF1, 0x38, 0x56, 0x4F, 0xB6, 0x15, 0xDF, 0xDF, 0xA1, 0x1, 0xC, 0x9E, 0xA5, 0x1, 0x3, 0x5C, 0xFE, 0xE9, 0xED, 0x9A, 0xEE, 0x8A, 0xA9, 0x1, 0x45, 0xFE, 0xB5, 0xA5, 0x88, 0xEC, 0x9C, 0xEF, 0x1, 0x15, 0x5C, 0xFE, 0xFD, 0xA5, 0x9E, 0xFE, 0xF4, 0xA1, 0x0, 0x1, 0x0, 0x95, 0xFE, 0x91, 0x5, 0x18, 0x5, 0xB0, 0x0, 0xE, 0x0, 0x0, 0x1, 0x27, 0x37, 0x1, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x1, 0x3, 0x72, 0x84, 0xFC, 0xFE, 0x4D, 0xA6, 0xFC, 0xFC, 0x8D, 0x1, 0xAA, 0x1, 0x32, 0xFD, 0xE3, 0x2, 0x3B, 0xFE, 0x91, 0x98, 0xDB, 0x2, 0x72, 0xB0, 0xFE, 0x3A, 0x5, 0xB0, 0xFD, 0x54, 0xAE, 0x1, 0xFE, 0xFD, 0x7C, 0xFC, 0xD4, 0x0, 0x3, 0x0, 0x50, 0xFF, 0xEB, 0x4, 0x31, 0x6, 0x15, 0x0, 0x9, 0x0, 0x22, 0x0, 0x2D, 0x0, 0x0, 0x1, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x16, 0x1, 0x14, 0x0, 0x23, 0x22, 0x2, 0x3, 0x35, 0x10, 0x0, 0x21, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x6, 0x15, 0x36, 0x33, 0x32, 0x16, 0x25, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x10, 0x2, 0x4F, 0x4A, 0x46, 0x3F, 0x48, 0x90, 0x54, 0x7A, 0x2, 0x43, 0xFE, 0xFF, 0xE8, 0xF8, 0xFC, 0x4, 0x1, 0x20, 0x1, 0x8, 0x97, 0xBB, 0xA8, 0xBB, 0x9C, 0x94, 0x1C, 0x8A, 0xD5, 0xC5, 0xF2, 0xFE, 0x15, 0x67, 0x96, 0x76, 0x82, 0x83, 0x7A, 0x4, 0x98, 0x3A, 0x21, 0x27, 0x40, 0x94, 0x2E, 0xFD, 0x3F, 0xD9, 0xFE, 0xED, 0x1, 0x55, 0x1, 0x56, 0x58, 0x1, 0x6F, 0x1, 0xB8, 0x94, 0x81, 0x67, 0xB1, 0x38, 0x7A, 0x99, 0x97, 0xF2, 0x2F, 0x86, 0x84, 0x85, 0xA4, 0xA4, 0x85, 0x1, 0xA, 0x0, 0x2, 0x0, 0x76, 0xFF, 0xEB, 0x4, 0x99, 0x5, 0xC5, 0x0, 0x9, 0x0, 0x28, 0x0, 0x0, 0x1, 0x14, 0x16, 0x17, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x13, 0x22, 0x0, 0x35, 0x11, 0x37, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x35, 0x26, 0x0, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x37, 0x17, 0x6, 0x7, 0x15, 0x6, 0x6, 0x2, 0x39, 0x77, 0x71, 0x2, 0x6E, 0x34, 0x44, 0x13, 0xD3, 0xFE, 0xFD, 0xEC, 0x81, 0x70, 0xCA, 0x4, 0xD1, 0xFE, 0xFE, 0xCC, 0x9E, 0xA4, 0xBE, 0x76, 0x9, 0x3D, 0x42, 0x1, 0xFE, 0x4, 0x42, 0x68, 0xA4, 0x21, 0x1, 0x3B, 0xA3, 0x49, 0x53, 0xFB, 0x94, 0x1, 0x6, 0xCE, 0x1, 0x24, 0x1, 0xFE, 0xDB, 0x77, 0x91, 0xFE, 0x87, 0x26, 0x1, 0x17, 0xC5, 0x11, 0xB0, 0xC6, 0xCE, 0xBC, 0xFE, 0xCD, 0x16, 0xC6, 0x14, 0xC, 0x7C, 0xD9, 0xF8, 0x0, 0x1, 0xFF, 0xE1, 0x0, 0x0, 0x4, 0x9E, 0x5, 0xC4, 0x0, 0x1A, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x17, 0x13, 0x13, 0x36, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x1, 0x2, 0xBC, 0xFC, 0xFE, 0xDB, 0x1E, 0x43, 0x28, 0xC, 0x25, 0x43, 0x44, 0x56, 0x86, 0x33, 0xC9, 0xCA, 0x32, 0x7F, 0x5B, 0x48, 0x40, 0x26, 0xC, 0x28, 0x42, 0x1F, 0xFE, 0xD9, 0x2, 0x14, 0x2, 0x94, 0x45, 0x6, 0xC2, 0x1B, 0x54, 0x7D, 0xFE, 0x16, 0x1, 0xE6, 0x77, 0x5E, 0x1B, 0xC2, 0x6, 0x45, 0xFD, 0x69, 0xFF, 0xFF, 0x0, 0x54, 0xFE, 0x60, 0x5, 0x7F, 0x6, 0x0, 0x0, 0x6, 0x2, 0x8D, 0x0, 0x0, 0x0, 0x2, 0x0, 0x33, 0xFF, 0xEB, 0x6, 0x55, 0x4, 0x3A, 0x0, 0x13, 0x0, 0x28, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x26, 0x27, 0x21, 0x6, 0x7, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x33, 0x15, 0x16, 0x16, 0x1, 0x14, 0x2, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x2, 0x35, 0x34, 0x37, 0x23, 0x35, 0x21, 0x15, 0x23, 0x16, 0x4, 0x7C, 0x58, 0x45, 0x4, 0x3D, 0xFC, 0xC8, 0x3D, 0x4, 0x46, 0x58, 0x52, 0x70, 0xFA, 0x1, 0x71, 0x1, 0xE0, 0x49, 0xAA, 0x92, 0xED, 0x5D, 0x5D, 0xED, 0x91, 0xAB, 0x4A, 0x38, 0x71, 0x6, 0x22, 0x81, 0x37, 0xAE, 0xEC, 0x9C, 0x9A, 0xB4, 0xB4, 0x9A, 0x9A, 0xEE, 0x8A, 0xA9, 0xE1, 0xE8, 0xA4, 0x88, 0x1, 0x88, 0x9E, 0xFE, 0xF4, 0xA1, 0xE2, 0xE2, 0xA1, 0x1, 0xC, 0x9E, 0xAF, 0x9F, 0xB6, 0xB6, 0x9C, 0x0, 0x1, 0x0, 0x23, 0xFE, 0x73, 0x5, 0x2F, 0x4, 0x4E, 0x0, 0x25, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x2, 0x27, 0x1, 0x23, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x1, 0x33, 0x7, 0x16, 0x12, 0x12, 0x16, 0x15, 0x14, 0x6, 0x3, 0xDC, 0x41, 0x3A, 0x16, 0x22, 0xB3, 0x64, 0x5B, 0x13, 0xFE, 0x7, 0xDC, 0x65, 0x5B, 0x47, 0x26, 0x1F, 0x3A, 0x4B, 0xA1, 0x9D, 0x1, 0xE1, 0xE5, 0x80, 0x10, 0x4D, 0x7D, 0x29, 0xA6, 0xFE, 0x73, 0xE, 0xB8, 0x6, 0xA3, 0x6F, 0xBD, 0x1, 0x12, 0x8D, 0xFD, 0x5F, 0x88, 0x2, 0x67, 0x5B, 0x44, 0x7, 0xB6, 0x11, 0xBC, 0xA3, 0xFE, 0xC2, 0x2, 0x89, 0xAA, 0xB5, 0xFE, 0xE6, 0xFE, 0xFA, 0x93, 0x60, 0x8C, 0xC9, 0x0, 0x2, 0x0, 0x66, 0xFE, 0x60, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0x10, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x23, 0x11, 0x26, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x7, 0x13, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x3, 0x42, 0xFD, 0xD7, 0xFE, 0xF8, 0x1, 0x52, 0x1, 0xA, 0x1, 0x10, 0x1, 0x4D, 0xFE, 0xFD, 0xDA, 0xE0, 0xB9, 0xA7, 0xA2, 0xBD, 0xBF, 0xA2, 0xA8, 0xB6, 0xFE, 0x60, 0x1, 0x98, 0x2B, 0x1, 0x6D, 0x1, 0x23, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xFE, 0x84, 0xFE, 0xB4, 0x49, 0xFE, 0xDC, 0xFE, 0x93, 0x2A, 0x3, 0x6, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x60, 0x4, 0x3E, 0x4, 0x4E, 0x0, 0x10, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x23, 0x11, 0x26, 0x2, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x2, 0x7, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x2, 0xC1, 0xF3, 0xB6, 0xC8, 0x1, 0xA, 0xEC, 0xEF, 0x1, 0x9, 0xC8, 0xB5, 0xFE, 0x81, 0x7D, 0x89, 0x86, 0x7D, 0x7C, 0x89, 0x87, 0x7D, 0xFE, 0x60, 0x1, 0x99, 0x27, 0x1, 0x27, 0xCB, 0x15, 0xEC, 0x1, 0x3B, 0xFE, 0xC5, 0xEC, 0x15, 0xCC, 0xFE, 0xDA, 0x27, 0x2, 0x19, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x0, 0x1, 0x0, 0x66, 0xFE, 0x78, 0x4, 0xEC, 0x5, 0xC4, 0x0, 0x20, 0x0, 0x0, 0x1, 0x27, 0x36, 0x35, 0x34, 0x27, 0x25, 0x26, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x17, 0x5, 0x16, 0x15, 0x14, 0x6, 0x3, 0x3C, 0x1, 0x82, 0x55, 0xFE, 0xCB, 0xC2, 0xFE, 0xF5, 0x1, 0x4A, 0x1, 0xF, 0x1, 0x5, 0x1, 0x12, 0x16, 0xFC, 0xE, 0x7B, 0xA8, 0xB4, 0xA6, 0xA3, 0x7C, 0x1, 0x4F, 0xE8, 0xCE, 0xFE, 0x78, 0xC5, 0x9, 0x4D, 0x40, 0x1B, 0x60, 0x3D, 0x1, 0x20, 0x1, 0x1B, 0x68, 0x1, 0x28, 0x1, 0x6E, 0xFE, 0xE2, 0xD7, 0x7B, 0xAE, 0xFF, 0xC9, 0x6A, 0xBC, 0xBE, 0x2A, 0x71, 0x4E, 0xBC, 0x87, 0x9F, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x7C, 0x4, 0x3, 0x4, 0x4E, 0x0, 0x22, 0x0, 0x0, 0x1, 0x35, 0x32, 0x35, 0x34, 0x27, 0x27, 0x2E, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x17, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x2, 0x93, 0x7D, 0x5D, 0xF5, 0x60, 0xA7, 0x67, 0xF3, 0xF9, 0xC5, 0xF0, 0x4, 0xE4, 0x5, 0x70, 0x63, 0x91, 0x66, 0x97, 0x6B, 0xF9, 0x5A, 0x6C, 0xC8, 0xFE, 0x7C, 0xC2, 0x55, 0x46, 0x14, 0x40, 0x1C, 0x67, 0xC2, 0xA3, 0x24, 0xD9, 0x1, 0x3C, 0xE4, 0xB3, 0x57, 0x7D, 0xCF, 0x81, 0x24, 0x96, 0x88, 0x1F, 0x48, 0x1D, 0x70, 0x6D, 0x92, 0x8A, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x4, 0x31, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x1, 0x35, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x3, 0x11, 0xFE, 0x80, 0xFC, 0x3, 0x9C, 0xFD, 0x60, 0x2, 0x4A, 0x1, 0x95, 0xD4, 0xFD, 0x97, 0x5, 0xB0, 0xCB, 0xFE, 0x4E, 0xFE, 0x62, 0x0, 0x1, 0x0, 0x87, 0xFE, 0x60, 0x3, 0xD3, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x25, 0x35, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x2, 0xBA, 0xFE, 0xC0, 0xF3, 0x3, 0x4C, 0xFD, 0xA7, 0x2, 0x2, 0xC4, 0xB8, 0xFC, 0xE4, 0x5, 0xDA, 0xC1, 0xFE, 0xC5, 0xFE, 0x86, 0x0, 0x1, 0x0, 0x23, 0xFF, 0xEB, 0x5, 0x8, 0x5, 0xCE, 0x0, 0x1E, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x37, 0x13, 0x1, 0x27, 0x13, 0x37, 0x34, 0x23, 0x7, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x3, 0x1, 0x17, 0x3, 0x7, 0x14, 0x33, 0x37, 0x7, 0x6, 0x4, 0xA5, 0xA3, 0xAC, 0x3, 0x2A, 0xFD, 0x4C, 0x21, 0x4A, 0x2, 0xB2, 0x25, 0x11, 0x27, 0x2E, 0xA1, 0xAC, 0x6, 0x20, 0x2, 0xBE, 0x20, 0x5A, 0x3, 0xAC, 0x2B, 0x11, 0x27, 0x15, 0xA9, 0x8D, 0x4F, 0x1, 0xB0, 0xFD, 0xDA, 0x16, 0x3, 0x3D, 0x25, 0xA0, 0x1, 0xB7, 0x6, 0xB0, 0xA1, 0x28, 0x30, 0xFE, 0xAF, 0x2, 0x35, 0x18, 0xFC, 0x80, 0x32, 0x98, 0x2, 0xB8, 0x6, 0x0, 0x1, 0x0, 0x52, 0x0, 0x0, 0x4, 0x14, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x21, 0x13, 0x21, 0x35, 0x1, 0x21, 0x3, 0x21, 0x15, 0x2, 0xF9, 0xFE, 0xF9, 0xFA, 0xFD, 0x66, 0x1, 0x20, 0x1, 0x8, 0xFB, 0x2, 0x95, 0x2, 0x6E, 0x6C, 0x2, 0xD6, 0xFD, 0x81, 0x66, 0x0, 0x1, 0x0, 0x21, 0xFE, 0x4B, 0x5, 0x93, 0x5, 0xC4, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x35, 0x32, 0x12, 0x13, 0x1, 0x27, 0x1, 0x26, 0x27, 0x1, 0x27, 0x1, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x12, 0x24, 0x33, 0x20, 0x0, 0x13, 0x15, 0x10, 0x0, 0x2, 0xC0, 0xD6, 0xEE, 0x13, 0xFD, 0xD8, 0x61, 0x2, 0x8D, 0x1, 0x28, 0xFD, 0x2F, 0x61, 0x2, 0xE2, 0x7F, 0xEC, 0xBB, 0xCD, 0x1B, 0xF3, 0x13, 0x95, 0x1, 0x1A, 0xD9, 0x1, 0x60, 0x1, 0x73, 0x4, 0xFE, 0x85, 0xFE, 0x4B, 0xEA, 0x1, 0x2A, 0x1, 0xA, 0xFE, 0xC1, 0xA9, 0x1, 0x7A, 0xB0, 0x89, 0xFE, 0x5E, 0xAA, 0x1, 0xAB, 0xBF, 0xE1, 0xC0, 0x9E, 0x1, 0x1C, 0xB3, 0xFE, 0x1F, 0xFE, 0x6B, 0x7C, 0xFE, 0x64, 0xFE, 0x15, 0x0, 0x1, 0x0, 0x21, 0xFE, 0x4B, 0x5, 0x3F, 0x6, 0x1F, 0x0, 0x12, 0x0, 0x0, 0x1, 0x34, 0x2, 0x27, 0x1, 0x27, 0x1, 0x26, 0x27, 0x1, 0x27, 0x1, 0x2, 0x25, 0x37, 0x4, 0x0, 0x12, 0x11, 0x4, 0x5F, 0x21, 0x28, 0xFD, 0x75, 0x62, 0x2, 0xB3, 0x36, 0x4F, 0xFD, 0x59, 0x61, 0x2, 0x91, 0xEF, 0xFE, 0x30, 0xDF, 0x1, 0xAA, 0x1, 0xD9, 0xBC, 0xFE, 0x4B, 0xE8, 0x1, 0x8A, 0xA8, 0xFE, 0x87, 0xA9, 0x1, 0x90, 0x91, 0x7A, 0xFE, 0x77, 0xA9, 0x1, 0x7C, 0x1, 0xB, 0xCF, 0x79, 0xB7, 0xFE, 0x2, 0xFD, 0x3B, 0xFE, 0x20, 0x0, 0x1, 0x0, 0x23, 0xFF, 0xEC, 0x5, 0x13, 0x4, 0x4E, 0x0, 0x1E, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x11, 0x1, 0x23, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x1, 0x33, 0x7, 0x13, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x4, 0x8E, 0xA0, 0x9E, 0xFE, 0x31, 0xDC, 0x65, 0x5B, 0x47, 0x27, 0x1D, 0x1, 0x3A, 0x4B, 0xA1, 0x9D, 0x1, 0xE1, 0xE5, 0x80, 0x1, 0x5, 0x9D, 0x25, 0x1F, 0x3C, 0x14, 0xBC, 0xA3, 0x1, 0x1F, 0xFD, 0x96, 0x88, 0x2, 0x67, 0x5B, 0x44, 0x7, 0xB6, 0x11, 0xBC, 0xA3, 0xFE, 0xC2, 0x2, 0x89, 0xAB, 0xFD, 0xAF, 0x92, 0x7, 0xB7, 0x10, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x25, 0x4, 0x32, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x27, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0x23, 0x34, 0x26, 0x27, 0x26, 0x0, 0x3, 0x35, 0x34, 0x0, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x2, 0x23, 0x22, 0x27, 0x16, 0x16, 0x17, 0x16, 0x16, 0x2, 0x40, 0x89, 0x76, 0x76, 0x87, 0x88, 0x77, 0x76, 0x2, 0x24, 0xC4, 0x5B, 0x85, 0xDB, 0xFE, 0xF3, 0x1, 0x1, 0x4, 0xEE, 0xED, 0x1, 0x3, 0xEC, 0xD7, 0xC7, 0x8D, 0x1D, 0xB1, 0x80, 0xAF, 0xC5, 0xFE, 0xB6, 0x79, 0x15, 0x86, 0xC3, 0xC3, 0x86, 0x15, 0x79, 0xB6, 0xFD, 0x27, 0x3D, 0x39, 0x1C, 0x2E, 0x1, 0x7C, 0x1, 0x7D, 0x4F, 0xEA, 0x1, 0x37, 0xFE, 0xD4, 0xE0, 0x15, 0xD6, 0xFE, 0xE4, 0x96, 0xA4, 0x97, 0x1B, 0x25, 0x7C, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xF9, 0x3, 0x6D, 0x4, 0x41, 0x0, 0x15, 0x0, 0x0, 0x25, 0x15, 0x21, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x37, 0x21, 0x15, 0x21, 0x22, 0x6, 0x7, 0x21, 0x15, 0x21, 0x16, 0x16, 0x33, 0x3, 0x6D, 0xFE, 0xD0, 0xF9, 0xF4, 0xF2, 0xF3, 0x1, 0x37, 0xFE, 0xD3, 0x80, 0x6E, 0xA, 0x1, 0x7B, 0xFE, 0x84, 0xB, 0x6D, 0x7F, 0xBC, 0xC3, 0x1, 0x33, 0xDF, 0x24, 0xDC, 0x1, 0x34, 0x2, 0xC3, 0x9B, 0x6B, 0xB6, 0x6B, 0x9B, 0x0, 0x1, 0x0, 0x28, 0xFF, 0xF9, 0x3, 0x45, 0x4, 0x41, 0x0, 0x15, 0x0, 0x0, 0x17, 0x35, 0x21, 0x32, 0x36, 0x37, 0x21, 0x35, 0x21, 0x26, 0x26, 0x23, 0x21, 0x35, 0x21, 0x16, 0x12, 0x17, 0x15, 0x14, 0x2, 0x23, 0x28, 0x1, 0x30, 0x7F, 0x6D, 0xB, 0xFE, 0x84, 0x1, 0x7B, 0xA, 0x6E, 0x80, 0xFE, 0xD3, 0x1, 0x33, 0xF5, 0xF3, 0x1, 0xF4, 0xF9, 0x7, 0xC3, 0x9B, 0x6B, 0xB6, 0x6B, 0x9B, 0xC3, 0x1, 0xFE, 0xCE, 0xDC, 0x27, 0xDF, 0xFE, 0xCD, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x60, 0x5, 0x5D, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x11, 0x23, 0x11, 0x21, 0x1, 0x1, 0x21, 0x11, 0x23, 0x11, 0x1, 0x2, 0x9A, 0xFE, 0xD5, 0xF2, 0x1, 0x32, 0x1, 0x3E, 0x1, 0x40, 0x1, 0x30, 0xF3, 0xFE, 0xD5, 0x2, 0xD2, 0xFB, 0x8E, 0x5, 0xDA, 0xFC, 0xF1, 0x3, 0xF, 0xFB, 0xC6, 0x2, 0xCD, 0xFD, 0x33, 0xFF, 0xFF, 0x0, 0x14, 0xFE, 0x60, 0x4, 0x81, 0x4, 0x4E, 0x0, 0x26, 0x2, 0x46, 0x4F, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x84, 0xFC, 0x6A, 0x0, 0x1, 0x0, 0x4D, 0xFF, 0xEC, 0x4, 0xD3, 0x5, 0xC4, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x34, 0x2, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x0, 0x21, 0x20, 0x0, 0x13, 0x15, 0x10, 0x0, 0x21, 0x20, 0x0, 0x4D, 0xFC, 0x11, 0x86, 0x9D, 0xAB, 0xAC, 0x1, 0x9C, 0xB1, 0xA3, 0x89, 0x12, 0xFC, 0x14, 0x1, 0x1A, 0x1, 0xC, 0x1, 0xA, 0x1, 0x3D, 0x4, 0xFE, 0xBD, 0xFE, 0xED, 0xFE, 0xFA, 0xFE, 0xEC, 0x1, 0xE1, 0x8B, 0x9E, 0xFB, 0xE4, 0x7D, 0xDA, 0x1, 0xA, 0x96, 0x8C, 0xD4, 0x1, 0x1A, 0xFE, 0x92, 0xFE, 0xCD, 0x85, 0xFE, 0xC5, 0xFE, 0x89, 0x1, 0x1B, 0x0, 0x2, 0x0, 0x66, 0xFF, 0xEC, 0x4, 0xEC, 0x5, 0xC4, 0x0, 0x1B, 0x0, 0x25, 0x0, 0x0, 0x1, 0x33, 0x6, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x3, 0xEF, 0xFC, 0x13, 0xFE, 0xE5, 0xFE, 0xF4, 0xFE, 0xF3, 0xFE, 0xC2, 0x1, 0x44, 0x1, 0x13, 0x1, 0x5, 0x1, 0x14, 0x16, 0xFC, 0x10, 0x87, 0x9C, 0xAB, 0xAC, 0x1, 0x9B, 0xB1, 0xA3, 0x89, 0xFE, 0x4C, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x1, 0xDA, 0xD4, 0xFE, 0xE6, 0x1, 0x76, 0x1, 0x3B, 0x76, 0x1, 0x3A, 0x1, 0x77, 0xFE, 0xE5, 0xDA, 0x8C, 0x9D, 0xFA, 0xE4, 0x7D, 0xDA, 0xFE, 0xF5, 0x97, 0x1, 0x88, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0x0, 0x4D, 0xFF, 0xEC, 0x4, 0xD3, 0x5, 0xC4, 0x0, 0x9, 0x0, 0x25, 0x0, 0x0, 0x0, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x5, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x34, 0x2, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x0, 0x21, 0x20, 0x0, 0x13, 0x15, 0x10, 0x0, 0x21, 0x20, 0x0, 0x2, 0x2C, 0x49, 0x49, 0x82, 0x49, 0x49, 0xFD, 0x9F, 0xFC, 0x11, 0x86, 0x9D, 0xAB, 0xAC, 0x1, 0x9C, 0xB1, 0xA3, 0x89, 0x12, 0xFC, 0x14, 0x1, 0x1A, 0x1, 0xC, 0x1, 0xA, 0x1, 0x3D, 0x4, 0xFE, 0xBD, 0xFE, 0xED, 0xFE, 0xFA, 0xFE, 0xEC, 0x2, 0x5C, 0x47, 0x34, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x7B, 0x8B, 0x9E, 0xFB, 0xE4, 0x7D, 0xDA, 0x1, 0xA, 0x96, 0x8C, 0xD4, 0x1, 0x1A, 0xFE, 0x92, 0xFE, 0xCD, 0x85, 0xFE, 0xC5, 0xFE, 0x89, 0x1, 0x1B, 0x0, 0x1, 0x0, 0x23, 0xFF, 0xF1, 0x5, 0xBC, 0x5, 0xB0, 0x0, 0x19, 0x0, 0x0, 0x1, 0x14, 0x2, 0x21, 0x27, 0x32, 0x36, 0x35, 0x26, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x36, 0x33, 0x32, 0x4, 0x5, 0xBC, 0xF8, 0xFE, 0xE9, 0x2, 0xAB, 0x6A, 0x1, 0x8F, 0x8E, 0x85, 0x7A, 0xFC, 0xFE, 0x7C, 0x4, 0x6E, 0xFE, 0x12, 0x94, 0x72, 0xF5, 0x1, 0x1E, 0x1, 0xB7, 0xC1, 0xFE, 0xFB, 0xC1, 0x98, 0x64, 0x77, 0x88, 0x20, 0xFD, 0x73, 0x4, 0xE5, 0xCB, 0xCB, 0xFE, 0x73, 0x26, 0xE8, 0x0, 0x1, 0x0, 0x69, 0xFF, 0xEC, 0x4, 0xEF, 0x5, 0xC4, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x6, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x21, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x4, 0xEF, 0x14, 0xFE, 0xE4, 0xFE, 0xF5, 0xFE, 0xF3, 0xFE, 0xC2, 0x1, 0x43, 0x1, 0x14, 0x1, 0x5, 0x1, 0x14, 0x16, 0xFC, 0x10, 0x86, 0x9D, 0xA4, 0xAC, 0x9, 0x1, 0xFA, 0xFE, 0x6, 0x6, 0x9E, 0xA9, 0xA3, 0x89, 0x11, 0x1, 0xDA, 0xD5, 0xFE, 0xE7, 0x1, 0x75, 0x1, 0x3B, 0x75, 0x1, 0x3C, 0x1, 0x77, 0xFE, 0xE5, 0xDA, 0x8B, 0x9F, 0xE6, 0xD1, 0xCB, 0xCA, 0xF7, 0x98, 0x8C, 0x0, 0x2, 0x0, 0x2D, 0x0, 0x0, 0x8, 0x41, 0x5, 0xB0, 0x0, 0x16, 0x0, 0x1E, 0x0, 0x0, 0x33, 0x35, 0x37, 0x36, 0x36, 0x13, 0x13, 0x21, 0x11, 0x21, 0x16, 0x0, 0x15, 0x14, 0x0, 0x23, 0x21, 0x11, 0x21, 0x3, 0x2, 0x2, 0x7, 0x25, 0x21, 0x32, 0x36, 0x34, 0x26, 0x23, 0x21, 0x2D, 0x31, 0x7B, 0x61, 0xD, 0x1B, 0x3, 0xAC, 0x1, 0x30, 0xF3, 0x1, 0x10, 0xFE, 0xED, 0xF8, 0xFD, 0xDB, 0xFE, 0x43, 0x1B, 0x16, 0xC5, 0xE7, 0x4, 0x97, 0x1, 0x28, 0x8D, 0x83, 0x83, 0x8D, 0xFE, 0xD8, 0xCA, 0x5, 0xE, 0xF4, 0x1, 0x2E, 0x2, 0xB1, 0xFD, 0xF1, 0x2, 0xFE, 0xFA, 0xC9, 0xC8, 0xFE, 0xF8, 0x4, 0xE5, 0xFD, 0xCB, 0xFE, 0x8C, 0xFE, 0xC7, 0x3, 0xCA, 0xA3, 0xCA, 0x9F, 0x0, 0x2, 0x0, 0x9B, 0x0, 0x0, 0x8, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x3, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x16, 0x4, 0x15, 0x14, 0x0, 0x23, 0x5, 0x14, 0x1, 0x29, 0x8D, 0x82, 0x82, 0x8D, 0xFE, 0xD7, 0xFC, 0xFD, 0x7F, 0xFC, 0xFC, 0x2, 0x81, 0xFC, 0x1, 0x34, 0xF3, 0x1, 0xC, 0xFE, 0xEE, 0xF8, 0xD0, 0x96, 0x61, 0x5F, 0x93, 0xFD, 0x47, 0x2, 0x7B, 0xFD, 0x85, 0x5, 0xB0, 0xFD, 0x95, 0x2, 0x6B, 0xFD, 0xD3, 0x3, 0xF9, 0xC2, 0xC4, 0xFE, 0xFF, 0x0, 0x1, 0x0, 0x31, 0x0, 0x0, 0x5, 0xC8, 0x5, 0xB0, 0x0, 0x15, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x36, 0x33, 0x32, 0x4, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x3, 0xB6, 0x84, 0x8E, 0xFD, 0xFE, 0x8A, 0x4, 0x62, 0xFE, 0x11, 0x87, 0x8B, 0xF5, 0x1, 0x1D, 0xFC, 0x8A, 0x2, 0xD0, 0x1C, 0xFD, 0x4C, 0x4, 0xE5, 0xCB, 0xCB, 0xFE, 0x9B, 0x1B, 0xDA, 0xF9, 0xFE, 0x38, 0x1, 0xC8, 0x9B, 0x6D, 0x0, 0x1, 0x0, 0x93, 0xFE, 0x98, 0x5, 0xD, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x21, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x5, 0xD, 0xFE, 0x4B, 0xFC, 0xFE, 0x37, 0xFC, 0x2, 0x81, 0xFD, 0xFE, 0x98, 0x1, 0x68, 0x5, 0xB0, 0xFB, 0x1A, 0x4, 0xE6, 0x0, 0x2, 0x0, 0x90, 0x0, 0x0, 0x4, 0xC2, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x14, 0x0, 0x0, 0x25, 0x21, 0x32, 0x36, 0x34, 0x26, 0x23, 0x21, 0x3, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x16, 0x4, 0x15, 0x14, 0x4, 0x23, 0x1, 0x8E, 0x1, 0x28, 0x8D, 0x82, 0x82, 0x8D, 0xFE, 0xD8, 0xFE, 0x3, 0x9D, 0xFD, 0x61, 0x1, 0x2C, 0xF6, 0x1, 0x12, 0xFE, 0xEC, 0xF8, 0xCA, 0x99, 0xCA, 0x8B, 0xFD, 0x48, 0x5, 0xB0, 0xCB, 0xFE, 0x9E, 0x1, 0xF3, 0xC9, 0xC8, 0xFE, 0x0, 0x2, 0x0, 0x24, 0xFE, 0x9A, 0x5, 0xDC, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x14, 0x0, 0x0, 0x25, 0x21, 0x11, 0x21, 0x3, 0x2, 0x1, 0x11, 0x21, 0x11, 0x23, 0x3, 0x33, 0x36, 0x12, 0x13, 0x13, 0x21, 0x11, 0x33, 0x3, 0x1, 0xB7, 0x2, 0x70, 0xFE, 0x57, 0x18, 0x1D, 0x2, 0x96, 0xFC, 0x41, 0xF3, 0x9, 0x76, 0x36, 0x84, 0x14, 0x26, 0x3, 0x96, 0xB8, 0xD, 0xCA, 0x4, 0x1B, 0xFE, 0x55, 0xFE, 0x6F, 0xFC, 0xF1, 0x1, 0x66, 0xFE, 0x9A, 0x2, 0x30, 0x34, 0x1, 0x19, 0x1, 0x27, 0x2, 0x72, 0xFB, 0x1A, 0xFD, 0xD0, 0x0, 0x1, 0x0, 0x17, 0x0, 0x0, 0x7, 0x9C, 0x5, 0xB0, 0x0, 0x15, 0x0, 0x0, 0x21, 0x11, 0x23, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x33, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x23, 0x11, 0x3, 0x61, 0xAB, 0xFE, 0x9B, 0xFE, 0xC6, 0x1, 0xD4, 0xFE, 0x4B, 0x1, 0x32, 0x1, 0x5C, 0x9D, 0xFB, 0x97, 0x1, 0x58, 0x1, 0x32, 0xFE, 0x4E, 0x1, 0xD1, 0xFE, 0xC6, 0xFE, 0x9E, 0xA4, 0x2, 0x74, 0xFD, 0x8C, 0x3, 0x8, 0x2, 0xA8, 0xFD, 0xA1, 0x2, 0x5F, 0xFD, 0xA1, 0x2, 0x5F, 0xFD, 0x59, 0xFC, 0xF7, 0x2, 0x74, 0xFD, 0x8C, 0x0, 0x1, 0x0, 0x49, 0xFF, 0xEC, 0x4, 0x7F, 0x5, 0xC4, 0x0, 0x27, 0x0, 0x0, 0x5, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x25, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x33, 0x32, 0x4, 0x15, 0x14, 0x6, 0x7, 0x16, 0x15, 0x14, 0x4, 0x2, 0x5A, 0x81, 0xF3, 0x9D, 0xFD, 0x98, 0x7C, 0x8E, 0x9A, 0xFE, 0xF6, 0xB9, 0xAB, 0x8A, 0x78, 0x83, 0x8F, 0x6C, 0x94, 0xFC, 0x1, 0x2D, 0xCF, 0xF0, 0x1, 0x1F, 0x79, 0x6B, 0xFA, 0xFE, 0xCB, 0x14, 0x58, 0xBB, 0x95, 0x5B, 0x83, 0x81, 0x61, 0xE5, 0x6, 0xC7, 0x79, 0x61, 0x56, 0x7F, 0x72, 0x5B, 0xBE, 0xDA, 0xD3, 0xCC, 0x63, 0xA6, 0x30, 0x57, 0xFD, 0xCD, 0xDF, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x5, 0xD, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x1, 0x33, 0x11, 0x23, 0x11, 0x1, 0x23, 0x11, 0x33, 0x1, 0x91, 0x2, 0x80, 0xFC, 0xFC, 0xFD, 0x80, 0xFC, 0xFC, 0x1, 0xA3, 0x4, 0xD, 0xFA, 0x50, 0x4, 0xE, 0xFB, 0xF2, 0x5, 0xB0, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x5, 0xE, 0x5, 0xB0, 0x0, 0xF, 0x0, 0x0, 0x33, 0x35, 0x37, 0x36, 0x36, 0x13, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0x3, 0x2, 0x2, 0x7, 0x2D, 0x31, 0x7B, 0x61, 0xD, 0x1B, 0x3, 0xAC, 0xFD, 0xFE, 0x43, 0x1B, 0x16, 0xC5, 0xE7, 0xCA, 0x5, 0xE, 0xF4, 0x1, 0x2E, 0x2, 0xB1, 0xFA, 0x50, 0x4, 0xE5, 0xFD, 0xCB, 0xFE, 0x8C, 0xFE, 0xC7, 0x3, 0x0, 0x1, 0x0, 0x3A, 0xFF, 0xEB, 0x4, 0xDE, 0x5, 0xB0, 0x0, 0xF, 0x0, 0x0, 0x5, 0x27, 0x37, 0x17, 0x32, 0x36, 0x37, 0x37, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x6, 0x6, 0x1, 0x70, 0x67, 0x1, 0x55, 0x47, 0x45, 0x27, 0x19, 0xFE, 0xF, 0x1, 0x14, 0x1, 0x53, 0x1, 0x24, 0x1, 0x19, 0xFE, 0xA, 0x31, 0x99, 0x15, 0x6, 0xC8, 0x4, 0x3B, 0x60, 0x3E, 0x4, 0x22, 0xFD, 0x9, 0x2, 0xF7, 0xFB, 0x57, 0x71, 0xAB, 0x0, 0x3, 0x0, 0x4F, 0xFF, 0xC4, 0x6, 0x19, 0x5, 0xEC, 0x0, 0x8, 0x0, 0x11, 0x0, 0x27, 0x0, 0x0, 0x1, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x15, 0x23, 0x35, 0x23, 0x26, 0x0, 0x11, 0x10, 0x0, 0x33, 0x33, 0x35, 0x33, 0x15, 0x33, 0x16, 0x0, 0x11, 0x10, 0x0, 0x7, 0x2, 0xBC, 0x18, 0xA8, 0xBD, 0xBE, 0xA7, 0x1, 0xB, 0x18, 0xA6, 0xBC, 0xBC, 0xA6, 0x18, 0xF3, 0x1E, 0xFC, 0xFE, 0xAD, 0x1, 0x58, 0xFD, 0x18, 0xF3, 0x1C, 0xFB, 0x1, 0x53, 0xFE, 0xAC, 0xFA, 0x1, 0x4D, 0x3, 0xF, 0xD1, 0xBB, 0xB7, 0xCC, 0x3, 0xF, 0xFC, 0xF1, 0xCF, 0xB6, 0xBA, 0xD0, 0xFC, 0x27, 0xBF, 0xBF, 0x2, 0x1, 0x44, 0x1, 0x7, 0x1, 0xD, 0x1, 0x49, 0xC6, 0xC6, 0x2, 0xFE, 0xB9, 0xFE, 0xF5, 0xFE, 0xF8, 0xFE, 0xBB, 0x2, 0x0, 0x1, 0x0, 0x93, 0xFE, 0xA1, 0x5, 0xBD, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x5, 0xA9, 0xE7, 0xFB, 0xD1, 0xFC, 0x2, 0x81, 0xFD, 0xB0, 0xFE, 0xA1, 0x1, 0x5F, 0x5, 0xB0, 0xFB, 0x1A, 0x4, 0xE6, 0xFB, 0x1D, 0x0, 0x1, 0x0, 0x8E, 0x0, 0x0, 0x4, 0xEF, 0x5, 0xB0, 0x0, 0x11, 0x0, 0x0, 0x21, 0x23, 0x11, 0x6, 0x23, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x16, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x4, 0xEF, 0xFD, 0x9E, 0xB4, 0xF5, 0xFE, 0xE3, 0xFD, 0x1, 0x89, 0x8B, 0xA9, 0xA9, 0xFD, 0x2, 0x3E, 0x29, 0xD9, 0xF9, 0x1, 0xC9, 0xFE, 0x32, 0x96, 0x6C, 0x29, 0x2, 0xA7, 0x0, 0x1, 0x0, 0x99, 0x0, 0x0, 0x7, 0x4, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x99, 0xFD, 0x1, 0xBD, 0xFB, 0x1, 0xBA, 0xFC, 0xF9, 0x95, 0x5, 0xB0, 0xFB, 0x1A, 0x4, 0xE6, 0xFB, 0x1A, 0x4, 0xE6, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x99, 0xFE, 0xA1, 0x7, 0xAD, 0x5, 0xB0, 0x0, 0xF, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x7, 0x99, 0xDD, 0xF9, 0xDD, 0xFD, 0x1, 0xBD, 0xFB, 0x1, 0xBA, 0xFC, 0xA9, 0xFE, 0xA1, 0x1, 0x5F, 0x5, 0xB0, 0xFB, 0x1A, 0x4, 0xE6, 0xFB, 0x1A, 0x4, 0xE6, 0xFB, 0x13, 0x0, 0x2, 0x0, 0x18, 0x0, 0x0, 0x5, 0xD4, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x14, 0x0, 0x0, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x16, 0x4, 0x15, 0x14, 0x4, 0x23, 0x25, 0x21, 0x32, 0x36, 0x34, 0x26, 0x23, 0x21, 0x1, 0xA3, 0xFE, 0x75, 0x2, 0x88, 0x1, 0x2D, 0xF6, 0x1, 0x11, 0xFE, 0xED, 0xF8, 0xFE, 0xD7, 0x1, 0x29, 0x8C, 0x83, 0x83, 0x8C, 0xFE, 0xD7, 0x4, 0xED, 0xC3, 0xFD, 0xD3, 0x1, 0xF3, 0xC9, 0xC8, 0xFE, 0xCA, 0x99, 0xCA, 0x8B, 0x0, 0x3, 0x0, 0x9C, 0x0, 0x0, 0x6, 0x59, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xE, 0x0, 0x16, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x11, 0x33, 0x11, 0x21, 0x16, 0x4, 0x15, 0x14, 0x4, 0x23, 0x25, 0x21, 0x32, 0x36, 0x34, 0x26, 0x23, 0x21, 0x6, 0x59, 0xFC, 0xFB, 0x3F, 0xFD, 0x1, 0x2C, 0xF6, 0x1, 0x12, 0xFE, 0xEC, 0xF8, 0xFE, 0xD8, 0x1, 0x28, 0x8D, 0x82, 0x82, 0x8D, 0xFE, 0xD8, 0x5, 0xB0, 0xFA, 0x50, 0x5, 0xB0, 0xFA, 0x50, 0x5, 0xB0, 0xFD, 0xD3, 0x1, 0xF3, 0xC9, 0xC8, 0xFE, 0xCA, 0x99, 0xCA, 0x8B, 0x0, 0x2, 0x0, 0x91, 0x0, 0x0, 0x4, 0xC2, 0x5, 0xB0, 0x0, 0xA, 0x0, 0x12, 0x0, 0x0, 0x33, 0x11, 0x33, 0x11, 0x21, 0x16, 0x4, 0x15, 0x14, 0x4, 0x23, 0x25, 0x21, 0x32, 0x36, 0x34, 0x26, 0x23, 0x21, 0x91, 0xFD, 0x1, 0x2C, 0xF6, 0x1, 0x12, 0xFE, 0xEC, 0xF8, 0xFE, 0xD8, 0x1, 0x28, 0x8D, 0x82, 0x82, 0x8D, 0xFE, 0xD8, 0x5, 0xB0, 0xFD, 0xD3, 0x1, 0xF3, 0xC9, 0xC8, 0xFE, 0xCA, 0x99, 0xCA, 0x8B, 0x0, 0x1, 0x0, 0x6B, 0xFF, 0xEC, 0x4, 0xF1, 0x5, 0xC4, 0x0, 0x1D, 0x0, 0x0, 0x5, 0x20, 0x0, 0x27, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x21, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x0, 0x21, 0x20, 0x0, 0x13, 0x15, 0x10, 0x0, 0x2, 0xA6, 0xFE, 0xF5, 0xFE, 0xE5, 0x14, 0xFC, 0x12, 0x89, 0xA3, 0xA8, 0x9F, 0x7, 0xFD, 0xFE, 0x2, 0x2, 0x7, 0xAE, 0xA4, 0x9D, 0x86, 0x11, 0xFC, 0x17, 0x1, 0x13, 0x1, 0x6, 0x1, 0x10, 0x1, 0x42, 0x4, 0xFE, 0xC2, 0x14, 0x1, 0x19, 0xD5, 0x8C, 0x98, 0xF3, 0xC8, 0xCB, 0xD4, 0xE9, 0x9F, 0x8B, 0xDA, 0x1, 0x1B, 0xFE, 0x91, 0xFE, 0xCB, 0x84, 0xFE, 0xC5, 0xFE, 0x8B, 0x0, 0x2, 0x0, 0xA0, 0xFF, 0xEC, 0x7, 0x8, 0x5, 0xC4, 0x0, 0x13, 0x0, 0x21, 0x0, 0x0, 0x5, 0x22, 0x0, 0x3, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x12, 0x0, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x13, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x4, 0xAD, 0xF9, 0xFE, 0xB5, 0x17, 0xB6, 0xFC, 0xFC, 0xB4, 0xA, 0x1, 0x4E, 0x1, 0x3, 0x1, 0x10, 0x1, 0x4D, 0xFE, 0xB5, 0x4E, 0xB9, 0xA7, 0xA2, 0xBD, 0xBF, 0xA2, 0xA8, 0xB6, 0x14, 0x1, 0x4C, 0x1, 0x26, 0xFD, 0xA2, 0x5, 0xB0, 0xFD, 0x71, 0x1, 0x3C, 0x1, 0x67, 0xFE, 0x84, 0xFE, 0xB4, 0x49, 0xFE, 0xB4, 0xFE, 0x85, 0x3, 0x12, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0x0, 0x2, 0x0, 0x21, 0x0, 0x0, 0x4, 0x5F, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x15, 0x0, 0x0, 0x1, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x13, 0x11, 0x21, 0x1, 0x21, 0x1, 0x26, 0x11, 0x34, 0x24, 0x33, 0x21, 0x11, 0x3, 0x63, 0xEC, 0x8B, 0x88, 0x8A, 0x89, 0xEC, 0xFE, 0xE6, 0xFE, 0xE7, 0xFE, 0xF1, 0x1, 0x45, 0xFE, 0x1, 0x1B, 0xF4, 0x1, 0xE8, 0x2, 0xE4, 0x2, 0x1, 0x87, 0x75, 0x7A, 0x8B, 0xFD, 0x1C, 0x2, 0x21, 0xFD, 0xDF, 0x2, 0x6C, 0x77, 0x1, 0x11, 0xD8, 0xE4, 0xFA, 0x50, 0x0, 0x2, 0x0, 0x5C, 0xFF, 0xEB, 0x4, 0x3D, 0x6, 0x13, 0x0, 0x19, 0x0, 0x27, 0x0, 0x0, 0x5, 0x22, 0x0, 0x27, 0x35, 0x10, 0x0, 0x37, 0x36, 0x36, 0x35, 0x33, 0x14, 0x6, 0x7, 0x6, 0x6, 0x7, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x0, 0x3, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x2, 0x4D, 0xEC, 0xFE, 0xFE, 0x3, 0x1, 0xA, 0xDA, 0x71, 0x73, 0xC5, 0xC8, 0xAE, 0x7E, 0xB1, 0x1E, 0x90, 0xC4, 0xD8, 0xEB, 0xFE, 0xFD, 0xEF, 0x87, 0x76, 0x77, 0x88, 0x87, 0x76, 0x76, 0x15, 0x1, 0x31, 0xE6, 0x57, 0x1, 0x7D, 0x1, 0x7C, 0x2E, 0x18, 0x36, 0x45, 0xB5, 0x7C, 0x25, 0x1B, 0x96, 0xA4, 0x96, 0xFE, 0xE4, 0xD6, 0x15, 0xE0, 0xFE, 0xD4, 0x3, 0x50, 0xB5, 0x7A, 0x15, 0x86, 0xC3, 0xC3, 0x86, 0x15, 0x7A, 0xB5, 0x0, 0x3, 0x0, 0x8F, 0x0, 0x0, 0x4, 0x3B, 0x4, 0x3A, 0x0, 0x6, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x15, 0x33, 0x32, 0x35, 0x34, 0x27, 0x3, 0x11, 0x21, 0x32, 0x35, 0x34, 0x27, 0x1, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x1, 0x82, 0xC9, 0xCF, 0xCA, 0xCE, 0x1, 0xA, 0xBC, 0xB4, 0xFD, 0xFB, 0x1, 0xB8, 0xD1, 0xF4, 0xB7, 0x73, 0x73, 0xE3, 0xCC, 0x3, 0x79, 0xFE, 0x7B, 0x80, 0x3, 0xFE, 0x54, 0xFE, 0xF4, 0x85, 0x84, 0x3, 0xFE, 0x33, 0x4, 0x3A, 0x92, 0x9A, 0x9F, 0x42, 0x19, 0x89, 0x56, 0x9A, 0x9B, 0x0, 0x1, 0x0, 0x85, 0x0, 0x0, 0x3, 0x4D, 0x4, 0x3A, 0x0, 0x5, 0x0, 0x0, 0x1, 0x15, 0x21, 0x11, 0x23, 0x11, 0x3, 0x4D, 0xFE, 0x2B, 0xF3, 0x4, 0x3A, 0xC4, 0xFC, 0x8A, 0x4, 0x3A, 0x0, 0x2, 0x0, 0x27, 0xFE, 0xBE, 0x4, 0xC6, 0x4, 0x3A, 0x0, 0x5, 0x0, 0x14, 0x0, 0x0, 0x25, 0x21, 0x11, 0x21, 0x7, 0x2, 0x3, 0x11, 0x23, 0x13, 0x33, 0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x1, 0x9F, 0x1, 0x9E, 0xFE, 0xEF, 0x5, 0xC, 0xFD, 0xF7, 0x1, 0x59, 0x54, 0x58, 0x7, 0xC, 0x2, 0xF0, 0x96, 0xF3, 0xC3, 0x2, 0xA6, 0xB6, 0xFE, 0xC5, 0xFE, 0x88, 0xFE, 0xBE, 0x2, 0x5, 0x5E, 0xC9, 0xCD, 0x1, 0x83, 0xFC, 0x89, 0xFD, 0xFB, 0x1, 0x42, 0x0, 0x1, 0x0, 0x1E, 0x0, 0x0, 0x6, 0x5C, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x0, 0x21, 0x11, 0x23, 0x3, 0x21, 0x1, 0x1, 0x21, 0x13, 0x33, 0x11, 0x33, 0x11, 0x33, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x23, 0x11, 0x2, 0xC2, 0x80, 0xFA, 0xFE, 0xD6, 0x1, 0x68, 0xFE, 0xAB, 0x1, 0x29, 0xF6, 0x72, 0xF2, 0x74, 0xF5, 0x1, 0x29, 0xFE, 0xAE, 0x1, 0x68, 0xFE, 0xD2, 0xF9, 0x81, 0x1, 0xB3, 0xFE, 0x4D, 0x2, 0x33, 0x2, 0x7, 0xFE, 0x58, 0x1, 0xA8, 0xFE, 0x58, 0x1, 0xA8, 0xFD, 0xFD, 0xFD, 0xC9, 0x1, 0xB3, 0xFE, 0x4D, 0x0, 0x1, 0x0, 0x4E, 0xFF, 0xEC, 0x3, 0xC4, 0x4, 0x4D, 0x0, 0x25, 0x0, 0x0, 0x5, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x2, 0x8, 0x6D, 0xCB, 0x82, 0xF2, 0x6E, 0x61, 0x64, 0x5E, 0xB7, 0xB3, 0xBB, 0x9C, 0x4D, 0x62, 0x52, 0x6C, 0xF2, 0xFA, 0xAF, 0xC4, 0xE5, 0xA6, 0xB9, 0xF7, 0x14, 0x48, 0x97, 0x76, 0x3D, 0x5E, 0x5D, 0x3A, 0x92, 0x2, 0xB0, 0x4, 0x82, 0x34, 0x57, 0x4D, 0x3E, 0x98, 0xAE, 0xA1, 0x9A, 0x99, 0x4C, 0x41, 0xBA, 0x9A, 0xAC, 0x0, 0x1, 0x0, 0x86, 0x0, 0x0, 0x4, 0x13, 0x4, 0x3A, 0x0, 0x9, 0x0, 0x0, 0x1, 0x1, 0x33, 0x11, 0x23, 0x11, 0x1, 0x23, 0x11, 0x33, 0x1, 0x79, 0x1, 0xA7, 0xF3, 0xF3, 0xFE, 0x59, 0xF3, 0xF3, 0x1, 0x68, 0x2, 0xD2, 0xFB, 0xC6, 0x2, 0xD2, 0xFD, 0x2E, 0x4, 0x3A, 0x0, 0x1, 0x0, 0x8F, 0x0, 0x0, 0x4, 0x65, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x3, 0x2A, 0xFE, 0xD3, 0x7B, 0xF3, 0xF3, 0x6C, 0x1, 0x2A, 0x1, 0x2D, 0xFE, 0x78, 0x1, 0xA8, 0x1, 0xAD, 0xFE, 0x53, 0x4, 0x3A, 0xFE, 0x51, 0x1, 0xAF, 0xFD, 0xFA, 0xFD, 0xCC, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x4, 0x14, 0x4, 0x3A, 0x0, 0xF, 0x0, 0x0, 0x33, 0x27, 0x37, 0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0x3, 0x2, 0x6, 0x7, 0x23, 0x1, 0x27, 0x5F, 0x44, 0xA, 0x14, 0x3, 0xA, 0xF3, 0xFE, 0xCF, 0x15, 0x13, 0xAA, 0xAC, 0xCB, 0x3, 0x8, 0xC1, 0xD5, 0x1, 0xCE, 0xFB, 0xC6, 0x3, 0x76, 0xFE, 0x8B, 0xFE, 0xEB, 0xEA, 0x2, 0x0, 0x1, 0x0, 0x8F, 0x0, 0x0, 0x5, 0x6F, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x11, 0x23, 0x11, 0x21, 0x1, 0x1, 0x21, 0x11, 0x23, 0x11, 0x1, 0x2, 0xAD, 0xFE, 0xD5, 0xF3, 0x1, 0x33, 0x1, 0x3D, 0x1, 0x41, 0x1, 0x2F, 0xF2, 0xFE, 0xD5, 0x2, 0xD2, 0xFD, 0x2E, 0x4, 0x3A, 0xFC, 0xF1, 0x3, 0xF, 0xFB, 0xC6, 0x2, 0xCF, 0xFD, 0x31, 0x0, 0x1, 0x0, 0x86, 0x0, 0x0, 0x4, 0x11, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x3, 0x1E, 0xFE, 0x5B, 0xF3, 0xF3, 0x1, 0xA5, 0xF3, 0x1, 0xB5, 0xFE, 0x4B, 0x4, 0x3A, 0xFE, 0x3D, 0x1, 0xC3, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x86, 0x0, 0x0, 0x4, 0x13, 0x4, 0x3A, 0x0, 0x7, 0x0, 0x0, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x3, 0x20, 0xFE, 0x59, 0xF3, 0x3, 0x8D, 0x3, 0x76, 0xFC, 0x8A, 0x4, 0x3A, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x3, 0xD1, 0x4, 0x3A, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x3, 0xD1, 0xFE, 0xA0, 0xF3, 0xFE, 0xA6, 0x3, 0xAD, 0x3, 0x79, 0xFC, 0x87, 0x3, 0x79, 0xC1, 0x0, 0x3, 0x0, 0x54, 0xFE, 0x60, 0x5, 0x7F, 0x6, 0x0, 0x0, 0xA, 0x0, 0x15, 0x0, 0x31, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x5, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x2, 0x2, 0x1D, 0x2B, 0x22, 0x21, 0x2A, 0x79, 0x5F, 0x5D, 0x2, 0xC, 0x78, 0x64, 0x65, 0x79, 0x2D, 0x24, 0x24, 0x73, 0x55, 0x42, 0xF3, 0x3D, 0x4E, 0xC1, 0xCA, 0xC9, 0xC4, 0x4C, 0x3D, 0xF3, 0x41, 0x54, 0xC3, 0xC9, 0x1, 0xC9, 0xAF, 0xA, 0x2, 0xC8, 0xA, 0xE0, 0xB1, 0x8B, 0xC0, 0x1, 0xC0, 0xA1, 0x9B, 0xE1, 0xC, 0xFD, 0x39, 0xA, 0xC3, 0x1E, 0xFE, 0x57, 0x1, 0xA6, 0x1B, 0x1, 0x28, 0xE7, 0x15, 0xFC, 0x1, 0x43, 0x1B, 0x1, 0xCD, 0xFE, 0x2F, 0x1F, 0xFE, 0xC0, 0xFA, 0x1A, 0xE7, 0xFE, 0xD8, 0x0, 0x1, 0x0, 0x86, 0xFE, 0xBF, 0x4, 0xA6, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x4, 0x92, 0xDE, 0xFC, 0xD2, 0xF3, 0x1, 0xA7, 0xF3, 0x93, 0xFE, 0xBF, 0x1, 0x41, 0x4, 0x3A, 0xFC, 0x89, 0x3, 0x77, 0xFC, 0x88, 0x0, 0x1, 0x0, 0x5F, 0x0, 0x0, 0x3, 0xE1, 0x4, 0x3B, 0x0, 0x11, 0x0, 0x0, 0x21, 0x23, 0x11, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x3, 0xE1, 0xF3, 0x64, 0x63, 0xD1, 0xF7, 0xF3, 0x6B, 0x6A, 0x65, 0x62, 0xF3, 0x1, 0x6A, 0x16, 0xC9, 0xD2, 0x1, 0x4C, 0xFE, 0xB4, 0x76, 0x62, 0x17, 0x2, 0xC, 0x0, 0x1, 0x0, 0x86, 0x0, 0x0, 0x6, 0x4, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x86, 0xF3, 0x1, 0x53, 0xF3, 0x1, 0x52, 0xF3, 0xFA, 0x82, 0x4, 0x3A, 0xFC, 0x89, 0x3, 0x77, 0xFC, 0x89, 0x3, 0x77, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x7F, 0xFE, 0xBF, 0x6, 0xB5, 0x4, 0x3A, 0x0, 0xF, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x6, 0xA1, 0xDD, 0xFA, 0xBB, 0xF2, 0x1, 0x53, 0xF3, 0x1, 0x52, 0xF3, 0xB9, 0xFE, 0xBF, 0x1, 0x41, 0x4, 0x3A, 0xFC, 0x89, 0x3, 0x77, 0xFC, 0x89, 0x3, 0x77, 0xFC, 0x88, 0x0, 0x2, 0x0, 0x1F, 0x0, 0x0, 0x4, 0xEB, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x14, 0x0, 0x0, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x23, 0x1, 0x58, 0xFE, 0xC7, 0x2, 0x2C, 0xF1, 0xCF, 0xE0, 0xE2, 0xD1, 0xED, 0xED, 0x69, 0x57, 0x57, 0x69, 0xED, 0x3, 0x77, 0xC3, 0xFE, 0xA8, 0x1, 0xCE, 0xA1, 0x9D, 0xD5, 0xC2, 0x6A, 0x84, 0x70, 0x0, 0x3, 0x0, 0x8F, 0x0, 0x0, 0x5, 0xCA, 0x4, 0x3A, 0x0, 0x3, 0x0, 0xE, 0x0, 0x16, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x11, 0x33, 0x11, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x23, 0x5, 0xCA, 0xF3, 0xFB, 0xB8, 0xF4, 0xF1, 0xCF, 0xE0, 0xE2, 0xD1, 0xED, 0xED, 0x69, 0x57, 0x57, 0x69, 0xED, 0x4, 0x3A, 0xFB, 0xC6, 0x4, 0x3A, 0xFB, 0xC6, 0x4, 0x3A, 0xFE, 0xA8, 0x1, 0xCE, 0xA1, 0x9D, 0xD5, 0xC2, 0x6A, 0x84, 0x70, 0x0, 0x2, 0x0, 0x8F, 0x0, 0x0, 0x4, 0x23, 0x4, 0x3A, 0x0, 0xA, 0x0, 0x12, 0x0, 0x0, 0x33, 0x11, 0x33, 0x11, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x23, 0x8F, 0xF4, 0xF1, 0xCF, 0xE0, 0xE2, 0xD1, 0xED, 0xED, 0x69, 0x57, 0x57, 0x69, 0xED, 0x4, 0x3A, 0xFE, 0xA8, 0x1, 0xCE, 0xA1, 0x9D, 0xD5, 0xC2, 0x6A, 0x84, 0x70, 0x0, 0x1, 0x0, 0x52, 0xFF, 0xEB, 0x3, 0xE9, 0x4, 0x4E, 0x0, 0x1D, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x21, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x2, 0x2, 0xBE, 0xF2, 0xE5, 0x70, 0x5B, 0x77, 0x70, 0xA, 0xFE, 0xAB, 0x1, 0x54, 0xC, 0x70, 0x74, 0x53, 0x78, 0xE5, 0x1, 0x1, 0xAF, 0xED, 0xFA, 0xFB, 0x15, 0xE5, 0xB3, 0x57, 0x7E, 0xB1, 0x72, 0xA8, 0x6E, 0xA4, 0x67, 0x50, 0x9D, 0xDD, 0xFE, 0xBF, 0xDF, 0x23, 0xDF, 0xFE, 0xBF, 0x0, 0x2, 0x0, 0x91, 0xFF, 0xEC, 0x6, 0x39, 0x4, 0x4E, 0x0, 0x13, 0x0, 0x21, 0x0, 0x0, 0x5, 0x22, 0x0, 0x27, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x36, 0x0, 0x33, 0x32, 0x0, 0x17, 0x15, 0x14, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x4, 0x42, 0xD9, 0xFE, 0xFB, 0x16, 0xCA, 0xF3, 0xF3, 0xCC, 0x1B, 0x1, 0x2, 0xD3, 0xEC, 0x1, 0x9, 0x4, 0xFE, 0xF6, 0xFE, 0xE, 0x7D, 0x88, 0x87, 0x7D, 0x7D, 0x89, 0x87, 0x7C, 0x14, 0x1, 0xA, 0xCE, 0xFE, 0x3C, 0x4, 0x3A, 0xFE, 0x4E, 0xC6, 0x1, 0x0, 0xFE, 0xCD, 0xE7, 0x22, 0xEB, 0xFE, 0xC5, 0x2, 0x26, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x0, 0x2, 0x0, 0x27, 0x0, 0x0, 0x3, 0xE0, 0x4, 0x3A, 0x0, 0x8, 0x0, 0x15, 0x0, 0x0, 0x1, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x13, 0x11, 0x23, 0x3, 0x23, 0x13, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x2, 0xEE, 0xE1, 0x65, 0x5D, 0x57, 0x5E, 0xEE, 0xE2, 0xE8, 0xFD, 0xFF, 0xCF, 0xE8, 0xCE, 0x1, 0xD3, 0x2, 0x42, 0x1, 0x37, 0x65, 0x39, 0x38, 0x61, 0xFD, 0xBE, 0x1, 0x8E, 0xFE, 0x72, 0x1, 0xB6, 0x57, 0xD3, 0x95, 0xC5, 0xFB, 0xC6, 0x0, 0x1, 0xFF, 0xDA, 0xFE, 0x4B, 0x3, 0xF9, 0x6, 0x0, 0x0, 0x22, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x15, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x6, 0x2, 0x99, 0x45, 0x3B, 0xF, 0x29, 0x3A, 0x7A, 0x1, 0x62, 0x5D, 0x93, 0x48, 0xF2, 0xA0, 0xA0, 0xF2, 0x1, 0xC, 0xFE, 0xF4, 0x76, 0xB7, 0x9F, 0xC0, 0x1, 0xBB, 0xFE, 0x4B, 0x11, 0xBF, 0xD, 0xB0, 0x2, 0xFD, 0x71, 0x5C, 0x83, 0xFC, 0xFB, 0x4, 0xAE, 0xAB, 0xA7, 0xA7, 0xAB, 0xEB, 0x8B, 0xB6, 0xDA, 0xFD, 0x3, 0xB6, 0xC0, 0x0, 0x1, 0x0, 0x54, 0xFF, 0xEC, 0x3, 0xFA, 0x4, 0x4E, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x6, 0x4, 0x23, 0x22, 0x2, 0x27, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x21, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x3, 0xFA, 0x5, 0xFF, 0x0, 0xB4, 0xF8, 0xF3, 0x2, 0xF3, 0xF9, 0xC5, 0xF0, 0x5, 0xE5, 0x4, 0x70, 0x63, 0x83, 0x69, 0x9, 0x1, 0x5A, 0xFE, 0xA7, 0xA, 0x69, 0x81, 0x59, 0x7A, 0x4, 0x1, 0x66, 0x9D, 0xDD, 0x1, 0x3B, 0xDE, 0x2A, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xAF, 0x71, 0xA8, 0x6F, 0xA5, 0x68, 0x4F, 0x0, 0x2, 0x0, 0x1F, 0x0, 0x0, 0x6, 0x9B, 0x4, 0x3A, 0x0, 0x17, 0x0, 0x20, 0x0, 0x0, 0x33, 0x27, 0x37, 0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x6, 0x23, 0x21, 0x11, 0x21, 0x3, 0x2, 0x6, 0x7, 0x25, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x20, 0x1, 0x27, 0x5F, 0x45, 0xA, 0x14, 0x2, 0xF2, 0xF2, 0xCE, 0x70, 0x71, 0xE2, 0xD1, 0xFE, 0x1F, 0xFE, 0xE6, 0x13, 0x12, 0xAD, 0xAE, 0x3, 0x8D, 0xEE, 0x69, 0x57, 0x57, 0x69, 0xEE, 0xCB, 0x3, 0x8, 0xC1, 0xD5, 0x1, 0xCE, 0xFE, 0x88, 0x1, 0x62, 0x63, 0x98, 0x99, 0xCB, 0x3, 0x76, 0xFE, 0x9A, 0xFE, 0xE0, 0xEF, 0x1, 0xC1, 0x68, 0x3D, 0x3B, 0x5E, 0x0, 0x2, 0x0, 0x86, 0x0, 0x0, 0x6, 0xB1, 0x4, 0x3A, 0x0, 0x8, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x3, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x4, 0x11, 0xED, 0x6A, 0x56, 0x56, 0x6A, 0xED, 0xF3, 0xFE, 0x5B, 0xF3, 0xF3, 0x1, 0xA5, 0xF3, 0xF2, 0xCE, 0xE0, 0xE2, 0xD1, 0xC1, 0x68, 0x3D, 0x3B, 0x5E, 0xFE, 0x1, 0x1, 0xDD, 0xFE, 0x23, 0x4, 0x3A, 0xFE, 0x65, 0x1, 0x9B, 0xFE, 0x87, 0x1, 0xC5, 0x97, 0x99, 0xCB, 0x0, 0x1, 0xFF, 0xEE, 0x0, 0x0, 0x3, 0xF9, 0x6, 0x0, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x15, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0x47, 0x93, 0x48, 0xF2, 0x8C, 0x8C, 0xF2, 0x1, 0x20, 0xFE, 0xE0, 0x76, 0xB7, 0x9F, 0xC0, 0x1, 0xF3, 0x62, 0x3, 0x88, 0x83, 0xFC, 0xFB, 0x4, 0xB5, 0xAB, 0xA0, 0xA0, 0xAB, 0xF2, 0x8B, 0xB6, 0xDA, 0xFD, 0x42, 0x2, 0xBB, 0x71, 0x5C, 0x0, 0x1, 0x0, 0x86, 0xFE, 0x9A, 0x4, 0x13, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x21, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x4, 0x13, 0xFE, 0xB4, 0xF2, 0xFE, 0xB1, 0xF3, 0x1, 0xA7, 0xF3, 0xFE, 0x9A, 0x1, 0x66, 0x4, 0x3A, 0xFC, 0x89, 0x3, 0x77, 0x0, 0x1, 0x0, 0x89, 0xFF, 0xEB, 0x6, 0xC2, 0x5, 0xB0, 0x0, 0x1D, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x4, 0x4, 0xF7, 0xE4, 0x6E, 0x71, 0xE9, 0xC2, 0xFF, 0x0, 0xFD, 0x6E, 0x57, 0x62, 0x78, 0x1, 0x1, 0x75, 0xB8, 0x72, 0xFD, 0xFE, 0xFB, 0x15, 0xA6, 0xA6, 0xE3, 0xDF, 0x4, 0x3, 0xFB, 0xFD, 0x7F, 0x79, 0x79, 0x7F, 0x4, 0x3, 0xFB, 0xFD, 0x7F, 0x79, 0x79, 0x7F, 0x4, 0x3, 0xFB, 0xFD, 0xDF, 0xE3, 0x0, 0x1, 0x0, 0x70, 0xFF, 0xEB, 0x5, 0xEE, 0x4, 0x3A, 0x0, 0x1D, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x6, 0x4, 0x55, 0xC5, 0x61, 0x66, 0xCC, 0xAC, 0xE1, 0xF3, 0x54, 0x46, 0x53, 0x67, 0xF4, 0x2, 0xA8, 0x4B, 0x5B, 0xF3, 0xE7, 0x15, 0x8F, 0x8F, 0xD1, 0xD0, 0x2, 0xAE, 0xFD, 0x52, 0x72, 0x6C, 0x6C, 0x72, 0x2, 0xAE, 0xFD, 0x4D, 0xD9, 0x6C, 0x72, 0x2, 0xAE, 0xFD, 0x52, 0xD0, 0xD1, 0x0, 0x2, 0xFF, 0xDF, 0x0, 0x0, 0x4, 0x22, 0x6, 0x19, 0x0, 0x11, 0x0, 0x1A, 0x0, 0x0, 0x24, 0x6, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x16, 0x16, 0x1, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x4, 0x22, 0xE2, 0xD2, 0xFE, 0x20, 0xAF, 0xAF, 0xF3, 0x1, 0x22, 0xFE, 0xDE, 0xF1, 0xD0, 0xE0, 0xFD, 0x5F, 0xED, 0x6A, 0x57, 0x57, 0x6A, 0xED, 0xDF, 0xDF, 0x4, 0x3A, 0xAB, 0x1, 0x34, 0xFE, 0xCC, 0xAB, 0xFE, 0xC9, 0x1, 0xD7, 0xFE, 0x97, 0x75, 0x49, 0x47, 0x7A, 0x0, 0x1, 0x0, 0x99, 0xFF, 0xED, 0x6, 0xCE, 0x5, 0xC5, 0x0, 0x23, 0x0, 0x0, 0x1, 0x6, 0x0, 0x21, 0x20, 0x0, 0x3, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x12, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x21, 0x15, 0x21, 0x16, 0x12, 0x33, 0x32, 0x36, 0x37, 0x6, 0xCD, 0x13, 0xFE, 0xE5, 0xFE, 0xF4, 0xFE, 0xF7, 0xFE, 0xC3, 0x5, 0xB3, 0xFC, 0xFC, 0xB5, 0x10, 0x1, 0x3F, 0x1, 0x6, 0x1, 0x5, 0x1, 0x14, 0x16, 0xFC, 0x10, 0x87, 0x9C, 0xA1, 0xAC, 0xB, 0x1, 0xE9, 0xFE, 0x16, 0x3, 0x9D, 0xAD, 0xA3, 0x89, 0x12, 0x1, 0xDB, 0xD4, 0xFE, 0xE6, 0x1, 0x6C, 0x1, 0x33, 0xFD, 0x74, 0x5, 0xB0, 0xFD, 0xA0, 0x1, 0x20, 0x1, 0x55, 0xFE, 0xE5, 0xDA, 0x8C, 0x9D, 0xDE, 0xCB, 0xC4, 0xD3, 0xFF, 0x0, 0x97, 0x8B, 0x0, 0x1, 0x0, 0x87, 0xFF, 0xEC, 0x5, 0xBB, 0x4, 0x4E, 0x0, 0x23, 0x0, 0x0, 0x1, 0x6, 0x4, 0x23, 0x22, 0x2, 0x27, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x36, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x21, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x5, 0xBB, 0x5, 0xFF, 0x0, 0xB4, 0xE7, 0xF2, 0x11, 0x9E, 0xF3, 0xF3, 0x9E, 0x11, 0xF2, 0xE6, 0xC5, 0xF0, 0x5, 0xE5, 0x4, 0x71, 0x63, 0x81, 0x69, 0x9, 0x1, 0x7B, 0xFE, 0x85, 0x9, 0x69, 0x82, 0x59, 0x7A, 0x4, 0x1, 0x66, 0x9D, 0xDD, 0x1, 0x14, 0xC7, 0xFE, 0x39, 0x4, 0x3A, 0xFE, 0x38, 0xC7, 0x1, 0x15, 0xE4, 0xB3, 0x57, 0x7D, 0xAA, 0x6F, 0xAB, 0x70, 0xA8, 0x68, 0x4F, 0x0, 0x2, 0x0, 0x1D, 0x0, 0x0, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x2, 0x0, 0xE, 0x0, 0x0, 0x1, 0x3, 0x3, 0x13, 0x11, 0x23, 0x3, 0x21, 0x1, 0x33, 0x1, 0x21, 0x3, 0x23, 0x11, 0x3, 0x45, 0xA8, 0xAA, 0x31, 0x72, 0x8F, 0xFE, 0xFA, 0x2, 0x6, 0xF5, 0x2, 0x0, 0xFE, 0xFA, 0x8E, 0x7E, 0x2, 0x69, 0x1, 0xFA, 0xFE, 0x6, 0xFD, 0x97, 0x1, 0xAA, 0xFE, 0x56, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0xAA, 0xFE, 0x56, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x4, 0x46, 0x4, 0x3A, 0x0, 0x4, 0x0, 0x10, 0x0, 0x0, 0x1, 0x3, 0x33, 0x3, 0x27, 0x3, 0x11, 0x23, 0x3, 0x23, 0x1, 0x33, 0x1, 0x23, 0x3, 0x23, 0x11, 0x2, 0xC, 0x61, 0xF7, 0x63, 0x19, 0x61, 0x5B, 0x68, 0xF8, 0x1, 0xAA, 0xE7, 0x1, 0xAB, 0xF8, 0x6A, 0x5C, 0x2, 0xCA, 0xFE, 0xFB, 0x1, 0x5, 0x67, 0xFC, 0xCF, 0x1, 0x18, 0xFE, 0xE8, 0x4, 0x3A, 0xFB, 0xC6, 0x1, 0x18, 0xFE, 0xE8, 0x0, 0x2, 0x0, 0xAD, 0x0, 0x0, 0x7, 0x30, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x16, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x13, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x1, 0x33, 0x1, 0x21, 0x3, 0x23, 0x11, 0x23, 0x11, 0x23, 0x3, 0x5, 0x5D, 0xA8, 0xAA, 0xFE, 0x2A, 0x99, 0xFE, 0xDB, 0xFC, 0xFC, 0x1, 0x67, 0x1, 0x2C, 0xF5, 0x1, 0xFF, 0xFE, 0xFA, 0x8D, 0x7F, 0xE1, 0x72, 0x90, 0x2, 0x69, 0x1, 0xFA, 0xFE, 0x6, 0xFD, 0x97, 0x1, 0xAC, 0xFE, 0x54, 0x5, 0xB0, 0xFC, 0xB7, 0x3, 0x49, 0xFA, 0x50, 0x1, 0xAA, 0xFE, 0x56, 0x1, 0xAA, 0xFE, 0x56, 0x0, 0x2, 0x0, 0x9E, 0x0, 0x0, 0x6, 0x19, 0x4, 0x3A, 0x0, 0x4, 0x0, 0x18, 0x0, 0x0, 0x1, 0x3, 0x33, 0x3, 0x27, 0x1, 0x13, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x13, 0x33, 0x1, 0x23, 0x3, 0x23, 0x11, 0x23, 0x11, 0x23, 0x3, 0x3, 0xDF, 0x61, 0xF6, 0x63, 0x18, 0xFD, 0xE4, 0x6E, 0xBA, 0xF3, 0xF3, 0xFE, 0xF7, 0xE8, 0x1, 0xAB, 0xF8, 0x6B, 0x5B, 0xC3, 0x5B, 0x68, 0x2, 0xCA, 0xFE, 0xFB, 0x1, 0x5, 0x65, 0xFC, 0xD1, 0x1, 0x17, 0xFE, 0xE9, 0x4, 0x3A, 0xFD, 0x8B, 0x2, 0x75, 0xFB, 0xC6, 0x1, 0x18, 0xFE, 0xE8, 0x1, 0x18, 0xFE, 0xE8, 0x0, 0x2, 0x0, 0x80, 0x0, 0x0, 0x6, 0x6E, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x13, 0x21, 0x1, 0x23, 0x11, 0x36, 0x24, 0x33, 0x1, 0x21, 0x1, 0x16, 0x4, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x23, 0x7, 0x11, 0x23, 0x11, 0x23, 0x22, 0x6, 0x15, 0x3, 0x84, 0xE9, 0xFE, 0x2E, 0xFE, 0xE1, 0xFC, 0x3, 0x1, 0x10, 0xFA, 0xFE, 0x85, 0x4, 0xE4, 0xFE, 0x85, 0xEC, 0x1, 0x7, 0xFC, 0x82, 0x86, 0x66, 0x6, 0xFC, 0x7E, 0x85, 0x83, 0x3, 0x3A, 0x1, 0xA9, 0xFB, 0x1D, 0x1, 0x6C, 0xF4, 0xC9, 0x2, 0x87, 0xFD, 0x79, 0x3, 0xCF, 0xF6, 0xFE, 0x9F, 0x1, 0x61, 0x93, 0x68, 0xA, 0xFD, 0xAE, 0x2, 0x5C, 0x68, 0x93, 0x0, 0x2, 0x0, 0x83, 0x0, 0x0, 0x5, 0x64, 0x4, 0x3B, 0x0, 0x2, 0x0, 0x21, 0x0, 0x0, 0x1, 0x13, 0x21, 0x3, 0x23, 0x35, 0x36, 0x36, 0x37, 0x1, 0x33, 0x35, 0x21, 0x15, 0x33, 0x1, 0x16, 0x16, 0x15, 0x15, 0x23, 0x35, 0x26, 0x26, 0x27, 0x23, 0x7, 0x11, 0x23, 0x11, 0x23, 0x22, 0x6, 0x15, 0x2, 0xFB, 0x95, 0xFE, 0xD5, 0xEF, 0xF3, 0x2, 0xD4, 0xBC, 0xFE, 0xEB, 0xA9, 0x2, 0xC6, 0x86, 0xFE, 0xEA, 0xB7, 0xCE, 0xF3, 0x1, 0x6A, 0x6D, 0x27, 0x1, 0xF3, 0x2C, 0x70, 0x6C, 0x2, 0x69, 0x1, 0x22, 0xFC, 0x75, 0xB2, 0xDB, 0xC7, 0xC, 0x1, 0xDA, 0x1, 0x1, 0xFE, 0x25, 0xF, 0xCB, 0xDB, 0xAA, 0xAF, 0x8F, 0x65, 0x1, 0x1, 0xFE, 0x5D, 0x1, 0xA4, 0x67, 0x93, 0x0, 0x2, 0x0, 0xA4, 0x0, 0x0, 0x8, 0xB4, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x23, 0x0, 0x0, 0x1, 0x13, 0x21, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x1, 0x21, 0x1, 0x16, 0x4, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x23, 0x7, 0x11, 0x23, 0x11, 0x23, 0x22, 0x6, 0x15, 0x11, 0x23, 0x11, 0x34, 0x5, 0xC9, 0xE9, 0xFE, 0x2E, 0xFE, 0x21, 0xFE, 0x9F, 0xFC, 0xFC, 0x3, 0x31, 0xFE, 0x86, 0x4, 0xE4, 0xFE, 0x85, 0xEC, 0x1, 0x8, 0xFC, 0x82, 0x86, 0x67, 0x6, 0xFC, 0x7E, 0x85, 0x82, 0xFC, 0x3, 0x3B, 0x1, 0xA8, 0xFD, 0x84, 0xFD, 0x99, 0x5, 0xB0, 0xFD, 0x7B, 0x2, 0x85, 0xFD, 0x79, 0x3, 0xCF, 0xF6, 0xFE, 0x9F, 0x1, 0x61, 0x93, 0x68, 0xA, 0xFD, 0xAE, 0x2, 0x5C, 0x68, 0x93, 0xFE, 0x9F, 0x1, 0x61, 0xA0, 0x0, 0x2, 0x0, 0x90, 0x0, 0x0, 0x7, 0x77, 0x4, 0x3B, 0x0, 0x2, 0x0, 0x27, 0x0, 0x0, 0x1, 0x13, 0x21, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x1, 0x33, 0x35, 0x21, 0x15, 0x33, 0x1, 0x16, 0x16, 0x15, 0x15, 0x23, 0x35, 0x26, 0x26, 0x27, 0x23, 0x7, 0x11, 0x23, 0x11, 0x23, 0x22, 0x6, 0x15, 0x15, 0x23, 0x35, 0x34, 0x5, 0xD, 0x95, 0xFE, 0xD6, 0xFE, 0x54, 0xFE, 0xB7, 0xF3, 0xF3, 0x2, 0xA4, 0xFE, 0xEC, 0xA9, 0x2, 0xC5, 0x86, 0xFE, 0xEB, 0xB7, 0xCE, 0xF3, 0x1, 0x6A, 0x6D, 0x27, 0x1, 0xF3, 0x2C, 0x70, 0x6D, 0xF2, 0x2, 0x69, 0x1, 0x22, 0xFE, 0x1D, 0xFE, 0x58, 0x4, 0x3A, 0xFE, 0x28, 0x1, 0xD8, 0x1, 0x1, 0xFE, 0x25, 0xF, 0xCB, 0xDB, 0xAA, 0xAF, 0x8F, 0x65, 0x1, 0x1, 0xFE, 0x5D, 0x1, 0xA4, 0x67, 0x93, 0xAA, 0xAA, 0x9B, 0x0, 0x2, 0x0, 0x29, 0xFE, 0x40, 0x3, 0xAA, 0x7, 0x89, 0x0, 0x8, 0x0, 0x32, 0x0, 0x0, 0x1, 0x17, 0x37, 0x33, 0x15, 0x1, 0x23, 0x1, 0x35, 0x13, 0x26, 0x26, 0x27, 0x34, 0x36, 0x33, 0x33, 0x32, 0x36, 0x35, 0x34, 0x25, 0x23, 0x35, 0x33, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x4, 0x15, 0x14, 0x6, 0x7, 0x4, 0x11, 0x14, 0x4, 0x23, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x1, 0x71, 0x92, 0x92, 0xD0, 0xFE, 0xE9, 0x96, 0xFE, 0xEB, 0xAE, 0x7D, 0xA9, 0x2, 0xBD, 0xA0, 0x33, 0x79, 0x85, 0xFE, 0xE3, 0x9D, 0x98, 0x89, 0x78, 0x7C, 0x83, 0xFE, 0xE5, 0x1, 0x1B, 0xDC, 0x1, 0x16, 0x7D, 0x6F, 0x1, 0xD, 0xFE, 0xEF, 0xD8, 0x32, 0x85, 0x6F, 0x29, 0x7, 0x89, 0x9B, 0x9B, 0xB, 0xFE, 0xEA, 0x1, 0x17, 0xA, 0xF6, 0xB7, 0x26, 0xB3, 0x84, 0x8F, 0x86, 0x81, 0x61, 0xED, 0x6, 0xC7, 0x1, 0x77, 0x5B, 0x56, 0x73, 0xC6, 0xC5, 0xBF, 0x6F, 0xA4, 0x2C, 0x55, 0xFF, 0x0, 0xCD, 0xE0, 0x67, 0x4A, 0x4E, 0x13, 0x0, 0x2, 0x0, 0x33, 0xFE, 0x47, 0x3, 0x88, 0x6, 0x1C, 0x0, 0x8, 0x0, 0x31, 0x0, 0x0, 0x1, 0x17, 0x37, 0x33, 0x15, 0x1, 0x23, 0x1, 0x35, 0x13, 0x26, 0x26, 0x27, 0x34, 0x36, 0x33, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x4, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x23, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x1, 0x42, 0x92, 0x93, 0xCF, 0xFE, 0xE9, 0x96, 0xFE, 0xEB, 0xD9, 0x6C, 0xAC, 0x2, 0xB7, 0x98, 0x30, 0x6B, 0x78, 0xF0, 0xA8, 0x9A, 0x77, 0x67, 0x6D, 0x71, 0xFE, 0xE5, 0x1, 0x1B, 0xCD, 0x1, 0x3, 0xB8, 0xD9, 0xFA, 0xC6, 0x2E, 0x8C, 0x69, 0x28, 0x6, 0x1C, 0x9B, 0x9B, 0xA, 0xFE, 0xE9, 0x1, 0x17, 0xA, 0xF8, 0x2B, 0x29, 0xAD, 0x80, 0x87, 0x7F, 0x52, 0x3E, 0x8E, 0x5, 0xAA, 0x4F, 0x3F, 0x38, 0x4B, 0xB9, 0x9C, 0x95, 0x9F, 0x4B, 0x44, 0xAB, 0x9A, 0xAB, 0x67, 0x4A, 0x4E, 0x13, 0x0, 0x3, 0x0, 0x5F, 0xFF, 0xEC, 0x5, 0x18, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x1, 0x22, 0x6, 0x7, 0x21, 0x26, 0x26, 0x3, 0x20, 0x13, 0x21, 0x16, 0x16, 0x5, 0x18, 0xFE, 0xB5, 0xFE, 0xF0, 0xFE, 0xF6, 0xFE, 0xAC, 0x1, 0x52, 0x1, 0xA, 0x1, 0x10, 0x1, 0x4D, 0xFD, 0xA3, 0x9B, 0xBA, 0x9, 0x2, 0xBD, 0x8, 0xB7, 0x9E, 0x1, 0x49, 0x14, 0xFD, 0x43, 0xB, 0xBC, 0x2, 0xB3, 0xFE, 0xB4, 0xFE, 0x85, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xFE, 0x84, 0xFE, 0xB4, 0x1, 0xF7, 0xE9, 0xE0, 0xE0, 0xE9, 0xFB, 0xC9, 0x1, 0xC3, 0xDC, 0xE7, 0x0, 0x3, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0x3D, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x14, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x34, 0x0, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x23, 0x22, 0x0, 0x27, 0x1, 0x22, 0x6, 0x7, 0x21, 0x26, 0x26, 0x3, 0x32, 0x36, 0x37, 0x21, 0x16, 0x16, 0x4F, 0x1, 0xA, 0xEC, 0xEF, 0x1, 0x9, 0xFE, 0xF7, 0xED, 0xEB, 0xFE, 0xF7, 0x4, 0x1, 0xF6, 0x74, 0x7C, 0xE, 0x1, 0xFF, 0xE, 0x7D, 0x74, 0x76, 0x7C, 0xE, 0xFD, 0xFF, 0xE, 0x7C, 0x2, 0x27, 0xEC, 0x1, 0x3B, 0xFE, 0xC5, 0xEC, 0x15, 0xEB, 0xFE, 0xC5, 0x1, 0x33, 0xE6, 0x1, 0x86, 0xA2, 0x75, 0x75, 0xA2, 0xFD, 0x24, 0xA2, 0x78, 0x78, 0xA2, 0x0, 0x1, 0x0, 0x10, 0x0, 0x0, 0x4, 0xF4, 0x5, 0xC3, 0x0, 0xF, 0x0, 0x0, 0x21, 0x1, 0x21, 0x1, 0x17, 0x37, 0x13, 0x36, 0x36, 0x33, 0x17, 0x7, 0x23, 0x6, 0x7, 0x1, 0x2, 0x2, 0xFE, 0xE, 0x1, 0xE, 0x1, 0x43, 0x1B, 0x1B, 0xE4, 0x34, 0x96, 0x82, 0x2D, 0x2, 0x17, 0x55, 0x29, 0xFE, 0x99, 0x5, 0xB0, 0xFB, 0xDB, 0x72, 0x70, 0x2, 0xF7, 0xA3, 0xA0, 0x1, 0xD7, 0x2, 0x80, 0xFB, 0x97, 0x0, 0x1, 0x0, 0x21, 0x0, 0x0, 0x4, 0x19, 0x4, 0x4E, 0x0, 0x11, 0x0, 0x0, 0x21, 0x1, 0x33, 0x13, 0x17, 0x37, 0x13, 0x12, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, 0x1, 0x1, 0x8E, 0xFE, 0x93, 0xFB, 0xC8, 0x14, 0x14, 0x7A, 0x58, 0xD1, 0x44, 0x26, 0x17, 0x8, 0x24, 0x22, 0x3B, 0xD, 0xFE, 0xF5, 0x4, 0x3A, 0xFD, 0x35, 0x61, 0x61, 0x1, 0xBD, 0x1, 0x22, 0x15, 0xC0, 0x5, 0x35, 0x27, 0xFC, 0xDE, 0x0, 0x2, 0x0, 0x5F, 0xFF, 0x76, 0x5, 0x18, 0x6, 0x2E, 0x0, 0x13, 0x0, 0x25, 0x0, 0x0, 0x5, 0x23, 0x35, 0x26, 0x0, 0x3, 0x35, 0x10, 0x0, 0x37, 0x35, 0x33, 0x15, 0x16, 0x0, 0x13, 0x15, 0x10, 0x0, 0x7, 0x3, 0x33, 0x15, 0x36, 0x13, 0x35, 0x10, 0x27, 0x15, 0x23, 0x35, 0x6, 0x6, 0x15, 0x15, 0x14, 0x16, 0x17, 0x3, 0x21, 0xC5, 0xE2, 0xFE, 0xE7, 0x2, 0x1, 0x19, 0xE3, 0xC5, 0xE4, 0x1, 0x12, 0x2, 0xFE, 0xEE, 0xE5, 0xC5, 0xC5, 0xF4, 0x6, 0xFB, 0xC5, 0x77, 0x88, 0x89, 0x77, 0x8A, 0x7D, 0x22, 0x1, 0x6D, 0x1, 0x28, 0x52, 0x1, 0x2D, 0x1, 0x73, 0x21, 0x71, 0x71, 0x23, 0xFE, 0x92, 0xFE, 0xD9, 0x52, 0xFE, 0xD3, 0xFE, 0x8F, 0x22, 0x1, 0x37, 0x61, 0x47, 0x1, 0x90, 0x5E, 0x1, 0x9E, 0x49, 0x61, 0x62, 0x22, 0xF7, 0xCF, 0x4B, 0xCE, 0xF9, 0x23, 0x0, 0x2, 0x0, 0x50, 0xFF, 0x88, 0x4, 0x3E, 0x4, 0xB4, 0x0, 0x13, 0x0, 0x23, 0x0, 0x0, 0x5, 0x23, 0x35, 0x26, 0x2, 0x35, 0x35, 0x34, 0x12, 0x37, 0x35, 0x33, 0x15, 0x16, 0x12, 0x15, 0x15, 0x14, 0x2, 0x7, 0x11, 0x15, 0x36, 0x11, 0x34, 0x26, 0x27, 0x15, 0x23, 0x35, 0x6, 0x11, 0x14, 0x16, 0x17, 0x35, 0x2, 0x9F, 0xB7, 0xC2, 0xD6, 0xD8, 0xC2, 0xB8, 0xC4, 0xD8, 0xDA, 0xC5, 0xAC, 0x51, 0x58, 0xB8, 0xA8, 0x50, 0x56, 0x78, 0x6C, 0x20, 0x1, 0x2B, 0xD3, 0x15, 0xD4, 0x1, 0x2C, 0x20, 0x6D, 0x6D, 0x1F, 0xFE, 0xD3, 0xD4, 0x15, 0xD5, 0xFE, 0xD3, 0x1E, 0x1, 0x36, 0x6A, 0x40, 0x1, 0x29, 0x74, 0xBD, 0x22, 0x5F, 0x5F, 0x44, 0xFE, 0xDC, 0x75, 0xB9, 0x23, 0x67, 0x0, 0x3, 0x0, 0x89, 0xFF, 0xEB, 0x6, 0xB6, 0x7, 0x3F, 0x0, 0x11, 0x0, 0x1A, 0x0, 0x45, 0x0, 0x0, 0x1, 0x15, 0x22, 0x26, 0x26, 0x23, 0x22, 0x7, 0x15, 0x23, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x33, 0x1, 0x27, 0x36, 0x35, 0x35, 0x33, 0x15, 0x14, 0x6, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x24, 0x35, 0x11, 0x34, 0x24, 0x33, 0x15, 0x22, 0x6, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x35, 0x32, 0x16, 0x15, 0x11, 0x14, 0x6, 0x5, 0x5F, 0x94, 0xAD, 0x88, 0x38, 0x67, 0x1, 0x86, 0x7D, 0x6D, 0x4E, 0x8E, 0xA1, 0x68, 0xFE, 0x39, 0x52, 0x44, 0xA9, 0x69, 0x1, 0x4B, 0xE4, 0x71, 0x72, 0xE3, 0xC2, 0xFF, 0x0, 0x1, 0x0, 0xC2, 0x57, 0x6E, 0x6E, 0x57, 0x62, 0x78, 0xF5, 0x79, 0x62, 0x56, 0x6F, 0x6F, 0x56, 0xC2, 0xFF, 0xFF, 0x6, 0xC7, 0x86, 0x3C, 0x3C, 0x64, 0x14, 0x25, 0x70, 0x69, 0x3C, 0x3C, 0xFE, 0x4F, 0x39, 0x55, 0x42, 0x5F, 0x66, 0x3A, 0x74, 0xFA, 0xBA, 0x9E, 0x9E, 0xEE, 0xEA, 0x2, 0x14, 0xEA, 0xEF, 0xCB, 0x83, 0x8B, 0xFD, 0xEC, 0x8B, 0x83, 0x79, 0x7F, 0x1, 0x83, 0xFE, 0x7D, 0x7F, 0x79, 0x83, 0x8B, 0x2, 0x14, 0x8B, 0x83, 0xCB, 0xEF, 0xEA, 0xFD, 0xEC, 0xEA, 0xEE, 0x0, 0x3, 0x0, 0x74, 0xFF, 0xEB, 0x5, 0xD2, 0x5, 0xE3, 0x0, 0x12, 0x0, 0x1B, 0x0, 0x46, 0x0, 0x0, 0x1, 0x15, 0x22, 0x26, 0x27, 0x26, 0x23, 0x22, 0x7, 0x15, 0x23, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x33, 0x1, 0x27, 0x36, 0x35, 0x35, 0x33, 0x15, 0x14, 0x6, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x15, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x33, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x4, 0xF7, 0x75, 0x84, 0x95, 0x3F, 0x35, 0x68, 0x1, 0x87, 0x7E, 0x6E, 0x4E, 0x8D, 0xA1, 0x68, 0xFE, 0x3E, 0x52, 0x44, 0xA9, 0x69, 0x1, 0x3, 0xC4, 0x61, 0x62, 0xC3, 0xAB, 0xDF, 0xE8, 0xB0, 0x49, 0x5C, 0x54, 0x43, 0x4D, 0x62, 0xEC, 0x63, 0x4C, 0x43, 0x54, 0x5C, 0x49, 0xB0, 0xE8, 0xE0, 0x5, 0x6B, 0x86, 0x1D, 0x40, 0x1B, 0x64, 0x14, 0x25, 0x70, 0x69, 0x3C, 0x3C, 0xFE, 0x4D, 0x39, 0x55, 0x42, 0x5F, 0x66, 0x3A, 0x74, 0xFC, 0x18, 0x92, 0x92, 0xDB, 0xD9, 0xF5, 0xD9, 0xDB, 0xC3, 0x75, 0x7C, 0xF5, 0x7C, 0x75, 0x6C, 0x72, 0xC6, 0xC6, 0x72, 0x6C, 0x75, 0x7C, 0xF5, 0x7C, 0x75, 0xC3, 0xDB, 0xD9, 0xF5, 0xD9, 0xDB, 0x0, 0x2, 0x0, 0x89, 0xFF, 0xEB, 0x6, 0xC2, 0x7, 0x12, 0x0, 0x7, 0x0, 0x25, 0x0, 0x0, 0x1, 0x21, 0x35, 0x21, 0x17, 0x21, 0x15, 0x23, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x4, 0x3, 0x46, 0xFE, 0xB9, 0x3, 0x54, 0x2, 0xFE, 0xA6, 0xB5, 0x1, 0xB1, 0xE4, 0x6E, 0x71, 0xE9, 0xC2, 0xFF, 0x0, 0xFD, 0x6E, 0x57, 0x62, 0x78, 0x1, 0x1, 0x75, 0xB8, 0x72, 0xFD, 0xFE, 0xFB, 0x6, 0x97, 0x7B, 0x7B, 0x7F, 0xF9, 0xD3, 0xA6, 0xA6, 0xE3, 0xDF, 0x4, 0x3, 0xFB, 0xFD, 0x7F, 0x79, 0x79, 0x7F, 0x4, 0x3, 0xFB, 0xFD, 0x7F, 0x79, 0x79, 0x7F, 0x4, 0x3, 0xFB, 0xFD, 0xDF, 0xE3, 0x0, 0x2, 0x0, 0x70, 0xFF, 0xEB, 0x5, 0xEE, 0x5, 0xB1, 0x0, 0x7, 0x0, 0x25, 0x0, 0x0, 0x1, 0x21, 0x35, 0x21, 0x17, 0x21, 0x15, 0x23, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x6, 0x2, 0xD0, 0xFE, 0xC7, 0x3, 0x38, 0x5, 0xFE, 0xB1, 0xB5, 0x1, 0x85, 0xC5, 0x61, 0x66, 0xCC, 0xAC, 0xE1, 0xF3, 0x54, 0x46, 0x53, 0x67, 0xF4, 0x2, 0xA8, 0x4B, 0x5B, 0xF3, 0xE7, 0x5, 0x37, 0x7A, 0x7A, 0x7F, 0xFB, 0x33, 0x8F, 0x8F, 0xD1, 0xD0, 0x2, 0xAE, 0xFD, 0x52, 0x72, 0x6C, 0x6C, 0x72, 0x2, 0xAE, 0xFD, 0x4D, 0xD9, 0x6C, 0x72, 0x2, 0xAE, 0xFD, 0x52, 0xD0, 0xD1, 0x0, 0x1, 0x0, 0x67, 0xFE, 0x8B, 0x4, 0xB6, 0x5, 0xC5, 0x0, 0x17, 0x0, 0x0, 0x25, 0x11, 0x23, 0x11, 0x26, 0x2, 0x35, 0x11, 0x10, 0x0, 0x33, 0x32, 0x0, 0x15, 0x23, 0x10, 0x21, 0x22, 0x6, 0x15, 0x11, 0x14, 0x16, 0x33, 0x3, 0x35, 0xFC, 0xD5, 0xFD, 0x1, 0x33, 0xFD, 0xFE, 0x1, 0x21, 0xFC, 0xFE, 0xDD, 0x94, 0xA0, 0xA0, 0x94, 0xB5, 0xFD, 0xD6, 0x1, 0x67, 0x20, 0x1, 0x4A, 0xEF, 0x1, 0x19, 0x1, 0x9, 0x1, 0x58, 0xFE, 0xFB, 0xEC, 0x1, 0x26, 0xEA, 0xAA, 0xFE, 0xE5, 0xAB, 0xEB, 0x0, 0x1, 0x0, 0x5C, 0xFE, 0x88, 0x3, 0xF3, 0x4, 0x4E, 0x0, 0x18, 0x0, 0x0, 0x25, 0x11, 0x23, 0x11, 0x26, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x2, 0xD5, 0xF2, 0xBF, 0xC8, 0xFB, 0xEC, 0xBF, 0xF1, 0xE4, 0x70, 0x5C, 0x86, 0x6E, 0x6D, 0x88, 0xAE, 0xFD, 0xDA, 0x1, 0x6B, 0x22, 0x1, 0x2F, 0xC8, 0x23, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x83, 0xDA, 0x0, 0x1, 0x0, 0x6E, 0x0, 0x0, 0x4, 0x94, 0x5, 0x3E, 0x0, 0x13, 0x0, 0x0, 0x1, 0x3, 0x5, 0x7, 0x25, 0x3, 0x23, 0x13, 0x25, 0x37, 0x5, 0x13, 0x25, 0x37, 0x5, 0x13, 0x33, 0x3, 0x5, 0x7, 0x3, 0x28, 0xCC, 0x1, 0x21, 0x48, 0xFE, 0xDD, 0xB5, 0xAF, 0xE1, 0xFE, 0xDF, 0x47, 0x1, 0x25, 0xCA, 0xFE, 0xDE, 0x49, 0x1, 0x23, 0xB9, 0xAC, 0xE4, 0x1, 0x25, 0x4C, 0x3, 0x29, 0xFE, 0x98, 0xAC, 0x80, 0xAA, 0xFE, 0xC1, 0x1, 0x8E, 0xAB, 0x80, 0xAB, 0x1, 0x68, 0xAB, 0x82, 0xAB, 0x1, 0x46, 0xFE, 0x6B, 0xAB, 0x7F, 0x0, 0x1, 0xFC, 0x65, 0x4, 0xA2, 0xFF, 0x38, 0x5, 0xFD, 0x0, 0x7, 0x0, 0x0, 0x3, 0x21, 0x15, 0x27, 0x37, 0x21, 0x27, 0x17, 0xC8, 0xFD, 0xDF, 0xB2, 0x1, 0x2, 0x22, 0x1, 0xB1, 0x5, 0x20, 0x7E, 0x1, 0xEE, 0x6C, 0x1, 0x0, 0x1, 0xFC, 0x72, 0x5, 0x17, 0xFF, 0x6C, 0x6, 0x15, 0x0, 0x12, 0x0, 0x0, 0x1, 0x32, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x23, 0x35, 0x26, 0x23, 0x22, 0x6, 0x6, 0x23, 0x23, 0xFC, 0x72, 0x66, 0x72, 0x9B, 0x4A, 0x4F, 0x6F, 0x7F, 0x88, 0x1, 0x69, 0x39, 0x87, 0xB0, 0x74, 0x24, 0x5, 0x9D, 0x18, 0x41, 0x1F, 0x69, 0x70, 0x25, 0x14, 0x64, 0x3C, 0x3C, 0x0, 0x1, 0xFD, 0x7A, 0x5, 0x17, 0xFE, 0x71, 0x6, 0x61, 0x0, 0x5, 0x0, 0x0, 0x1, 0x27, 0x35, 0x33, 0x7, 0x17, 0xFE, 0x20, 0xA6, 0xBE, 0x1, 0x3A, 0x5, 0x17, 0xC5, 0x85, 0x97, 0x6F, 0x0, 0x1, 0xFD, 0xA5, 0x5, 0x17, 0xFE, 0x9C, 0x6, 0x61, 0x0, 0x5, 0x0, 0x0, 0x1, 0x7, 0x27, 0x37, 0x27, 0x33, 0xFE, 0x9C, 0xA6, 0x51, 0x3A, 0x1, 0xBE, 0x5, 0xDC, 0xC5, 0x44, 0x6F, 0x97, 0x0, 0x1, 0xFC, 0x2D, 0x5, 0x17, 0xFF, 0x63, 0x6, 0x15, 0x0, 0x13, 0x0, 0x0, 0x3, 0x15, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x23, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x33, 0x9D, 0xB1, 0x44, 0x62, 0x75, 0x5F, 0x30, 0x53, 0x88, 0x93, 0x85, 0x67, 0x82, 0x5F, 0x34, 0x5, 0x9D, 0x86, 0x3C, 0x3C, 0x30, 0x36, 0x12, 0x25, 0x63, 0x76, 0x3C, 0x3C, 0x0, 0x8, 0xFA, 0x24, 0xFE, 0xC4, 0x1, 0xC0, 0x5, 0xAF, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x29, 0x0, 0x37, 0x0, 0x45, 0x0, 0x53, 0x0, 0x61, 0x0, 0x6F, 0x0, 0x0, 0x1, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x1, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x5, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x1, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x5, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x1, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x5, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x1, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0xFD, 0x82, 0x71, 0x70, 0x62, 0x61, 0x72, 0x70, 0x2D, 0x36, 0x35, 0x2C, 0xFD, 0xC4, 0x72, 0x71, 0x62, 0x61, 0x72, 0x70, 0x2D, 0x36, 0x35, 0x2C, 0x4, 0x8C, 0x72, 0x71, 0x61, 0x62, 0x72, 0x71, 0x2C, 0x37, 0x35, 0x2B, 0xFA, 0xC3, 0x71, 0x71, 0x61, 0x62, 0x71, 0x70, 0x2C, 0x37, 0x35, 0x2C, 0x5, 0xF7, 0x71, 0x71, 0x61, 0x62, 0x71, 0x70, 0x2C, 0x37, 0x34, 0x2D, 0xFA, 0xB0, 0x72, 0x71, 0x61, 0x62, 0x72, 0x71, 0x2C, 0x37, 0x35, 0x2B, 0x4, 0x8B, 0x71, 0x71, 0x61, 0x62, 0x71, 0x70, 0x2C, 0x37, 0x35, 0x2C, 0xFD, 0xC0, 0x71, 0x70, 0x62, 0x61, 0x72, 0x70, 0x2D, 0x36, 0x35, 0x2C, 0x4, 0xF3, 0x53, 0x69, 0x69, 0x53, 0x28, 0x3D, 0x3D, 0xFE, 0xC3, 0x53, 0x69, 0x69, 0x53, 0x28, 0x3D, 0x3D, 0x28, 0x53, 0x69, 0x69, 0x53, 0x28, 0x3D, 0x3D, 0xFD, 0xE1, 0x53, 0x69, 0x69, 0x53, 0x28, 0x3D, 0x3D, 0x28, 0x53, 0x69, 0x69, 0x53, 0x28, 0x3D, 0x3D, 0xFD, 0xD1, 0x53, 0x69, 0x69, 0x53, 0x28, 0x3D, 0x3D, 0x28, 0x53, 0x69, 0x69, 0x53, 0x28, 0x3D, 0x3D, 0xFE, 0xBC, 0x52, 0x6A, 0x6A, 0x52, 0x28, 0x3D, 0x3D, 0x0, 0x8, 0xFA, 0x4C, 0xFE, 0x63, 0x1, 0x8C, 0x5, 0xC6, 0x0, 0x4, 0x0, 0x9, 0x0, 0xE, 0x0, 0x13, 0x0, 0x18, 0x0, 0x1D, 0x0, 0x22, 0x0, 0x27, 0x0, 0x0, 0x1, 0x23, 0x27, 0x13, 0x33, 0x1, 0x7, 0x27, 0x3, 0x37, 0x1, 0x27, 0x37, 0x25, 0x17, 0x1, 0x15, 0x7, 0x25, 0x35, 0x5, 0x35, 0x37, 0x5, 0x15, 0x1, 0x37, 0x17, 0x13, 0x7, 0x1, 0x17, 0x7, 0x5, 0x27, 0x25, 0x33, 0x17, 0x3, 0x23, 0xFE, 0x14, 0x88, 0xC, 0x7A, 0x60, 0xFE, 0x12, 0x62, 0x11, 0x94, 0x41, 0x3, 0xFD, 0x61, 0x2, 0x1, 0x41, 0x44, 0xFA, 0xDD, 0xD, 0xFE, 0xB3, 0x5, 0xE6, 0xD, 0x1, 0x4D, 0xFD, 0xDF, 0x61, 0x11, 0x95, 0x42, 0xFC, 0x5, 0x61, 0x2, 0xFE, 0xC0, 0x45, 0x2, 0xB7, 0x89, 0xB, 0x7A, 0x60, 0x4, 0x66, 0xE, 0x1, 0x52, 0xFD, 0xF8, 0x62, 0x2, 0x1, 0x46, 0x45, 0xFE, 0x9E, 0x63, 0x10, 0x99, 0x44, 0xFD, 0xED, 0x8B, 0xC, 0x7C, 0x62, 0x97, 0x8B, 0xC, 0x7C, 0x62, 0xFE, 0x99, 0x63, 0x2, 0xFE, 0xBB, 0x47, 0x1, 0x65, 0x63, 0x11, 0x99, 0x45, 0x14, 0xE, 0xFE, 0xAD, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x7D, 0x5, 0xDD, 0x7, 0x25, 0x0, 0x26, 0x2, 0x72, 0x0, 0x0, 0x0, 0x27, 0x1, 0x89, 0x1, 0x1C, 0x1, 0x3E, 0x0, 0x7, 0x0, 0x11, 0x4, 0x80, 0xFF, 0xC5, 0xFF, 0xFF, 0x0, 0x86, 0xFE, 0x7D, 0x4, 0xE4, 0x5, 0xD9, 0x0, 0x26, 0x2, 0x86, 0x0, 0x0, 0x0, 0x27, 0x1, 0x89, 0x0, 0x97, 0xFF, 0xF2, 0x0, 0x7, 0x0, 0x11, 0x3, 0x87, 0xFF, 0xC5, 0x0, 0x2, 0xFF, 0xDF, 0x0, 0x0, 0x4, 0x22, 0x6, 0x63, 0x0, 0x11, 0x0, 0x1A, 0x0, 0x0, 0x24, 0x6, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x33, 0x16, 0x16, 0x1, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x4, 0x22, 0xE2, 0xD2, 0xFE, 0x20, 0xAF, 0xAF, 0xF3, 0x1, 0x22, 0xFE, 0xDE, 0xF1, 0xD0, 0xE0, 0xFD, 0x5F, 0xED, 0x6A, 0x57, 0x57, 0x6A, 0xED, 0xDF, 0xDF, 0x5, 0x5, 0xAB, 0xB3, 0xB3, 0xAB, 0xFD, 0xFE, 0x1, 0xD7, 0xFE, 0x97, 0x75, 0x49, 0x47, 0x7A, 0x0, 0x2, 0x0, 0x95, 0x0, 0x0, 0x4, 0xDA, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x11, 0x15, 0x11, 0x23, 0x11, 0x21, 0x32, 0x0, 0x15, 0x14, 0x7, 0x17, 0x7, 0x27, 0x6, 0x23, 0x2, 0xC2, 0x50, 0x39, 0x73, 0x6E, 0x75, 0x1B, 0x81, 0x93, 0xFE, 0xCF, 0xFC, 0x2, 0x2D, 0xFD, 0x1, 0x15, 0x74, 0x7A, 0x6E, 0x88, 0x79, 0xA9, 0x2, 0xE8, 0x16, 0x80, 0x64, 0x81, 0x35, 0x49, 0x66, 0xA0, 0xFE, 0x3, 0xCB, 0xFD, 0xE3, 0x5, 0xB0, 0xFE, 0xFA, 0xC9, 0xC2, 0x75, 0x87, 0x64, 0x96, 0x38, 0x0, 0x2, 0x0, 0x7D, 0xFE, 0x60, 0x4, 0x31, 0x4, 0x4E, 0x0, 0xE, 0x0, 0x22, 0x0, 0x0, 0x25, 0x32, 0x37, 0x27, 0x37, 0x17, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x7, 0x17, 0x7, 0x27, 0x6, 0x2, 0x48, 0x44, 0x33, 0x6A, 0x6F, 0x58, 0x22, 0x75, 0x83, 0x96, 0x41, 0x43, 0xDA, 0xB1, 0x6C, 0xF2, 0xDF, 0xA, 0x6D, 0xB7, 0xCE, 0xD9, 0x6E, 0x6A, 0x6F, 0x68, 0x58, 0xAF, 0x21, 0x7B, 0x64, 0x66, 0x54, 0x8A, 0x92, 0xCF, 0x7D, 0xFE, 0x23, 0x7F, 0xC3, 0x75, 0xFD, 0xFF, 0x5, 0xDA, 0x6D, 0x81, 0xFE, 0xD0, 0xF8, 0x14, 0xF5, 0x95, 0x7B, 0x63, 0x78, 0x36, 0x0, 0x1, 0x0, 0x90, 0x0, 0x0, 0x4, 0x34, 0x7, 0x10, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x15, 0x1, 0x8C, 0xFC, 0x2, 0xB1, 0xF3, 0x7, 0x4, 0xE5, 0xFB, 0x1B, 0x5, 0xB0, 0x1, 0x60, 0xFD, 0xDD, 0x8, 0x0, 0x1, 0x0, 0x7F, 0x0, 0x0, 0x3, 0x5C, 0x5, 0x74, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x1, 0x71, 0xF2, 0x1, 0xEA, 0xF3, 0xFE, 0x15, 0x4, 0x3A, 0x1, 0x3A, 0xFE, 0x2, 0x0, 0x1, 0x0, 0x9B, 0xFE, 0xC5, 0x4, 0x9E, 0x5, 0xB0, 0x0, 0x15, 0x0, 0x0, 0x1, 0x27, 0x32, 0x36, 0x35, 0x2, 0x25, 0x23, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x16, 0x4, 0x12, 0x15, 0x14, 0x2, 0x2, 0xA1, 0x2, 0xA3, 0x69, 0x2, 0xFE, 0xAB, 0xBD, 0xFC, 0x3, 0x9D, 0xFD, 0x5F, 0xB3, 0xBC, 0x1, 0xD, 0x8B, 0xF3, 0xFE, 0xC5, 0xBB, 0xE5, 0x91, 0x1, 0x7A, 0x9, 0xFD, 0x87, 0x5, 0xB0, 0xCB, 0xFE, 0x5E, 0x1, 0x8D, 0xFF, 0x0, 0xB8, 0xF4, 0xFE, 0xBC, 0x0, 0x1, 0x0, 0x7F, 0xFE, 0xE2, 0x3, 0xDC, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x0, 0x1, 0x27, 0x36, 0x27, 0x34, 0x26, 0x23, 0x23, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x15, 0x33, 0x16, 0x4, 0x15, 0x16, 0x6, 0x6, 0x2, 0x60, 0x55, 0xDF, 0x2, 0xA1, 0x84, 0x52, 0xF2, 0x2, 0xC8, 0xFE, 0x2A, 0x5A, 0xE7, 0x1, 0x29, 0x1, 0x4D, 0xA7, 0xFE, 0xE2, 0xAD, 0x4C, 0xD4, 0x89, 0x8F, 0xFE, 0x39, 0x4, 0x3A, 0xC4, 0xE5, 0x2, 0xF9, 0xE7, 0x4D, 0xBD, 0xA1, 0xFF, 0xFF, 0x0, 0x17, 0xFE, 0x99, 0x8, 0x6, 0x5, 0xB0, 0x0, 0x26, 0x2, 0x70, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x6, 0xB6, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x1E, 0xFE, 0x99, 0x6, 0xB5, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x84, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x5, 0x65, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x9B, 0xFE, 0x99, 0x5, 0x80, 0x5, 0xB0, 0x0, 0x26, 0x7, 0xAA, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x4, 0x30, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8F, 0xFE, 0x99, 0x4, 0xC3, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x87, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x3, 0x73, 0x0, 0x0, 0x0, 0x1, 0x0, 0x91, 0x0, 0x0, 0x5, 0x36, 0x5, 0xB0, 0x0, 0x14, 0x0, 0x0, 0x1, 0x35, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x23, 0x15, 0x1, 0xE6, 0x58, 0xFD, 0xFD, 0x58, 0xA3, 0x38, 0x1, 0x1B, 0x1, 0x32, 0xFE, 0x7D, 0x1, 0xAB, 0xFE, 0xC1, 0xFE, 0xD5, 0x43, 0x1, 0x85, 0xE8, 0xFD, 0x93, 0x5, 0xB0, 0xFD, 0x9A, 0xFF, 0xFF, 0x2, 0x66, 0xFD, 0x5B, 0xFC, 0xF5, 0x2, 0x6D, 0xE8, 0x0, 0x1, 0x0, 0x8E, 0x0, 0x0, 0x4, 0xAF, 0x4, 0x3A, 0x0, 0x14, 0x0, 0x0, 0x25, 0x35, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x23, 0x15, 0x1, 0xD7, 0x56, 0xF3, 0xF3, 0x56, 0x9C, 0x27, 0xCF, 0x1, 0x2C, 0xFE, 0xC3, 0x1, 0x57, 0xFE, 0xCB, 0xD9, 0x2E, 0xFA, 0xB3, 0xFE, 0x53, 0x4, 0x3A, 0xFE, 0x51, 0xC7, 0xC7, 0x1, 0xAF, 0xFD, 0xFE, 0xFD, 0xC8, 0x1, 0xAD, 0xB3, 0x0, 0x1, 0x0, 0x34, 0x0, 0x0, 0x6, 0xA3, 0x5, 0xB0, 0x0, 0xE, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x5, 0x73, 0xFE, 0x43, 0xAC, 0xFD, 0xFE, 0x27, 0x2, 0xD6, 0x8A, 0x1, 0xAD, 0x1, 0x36, 0xFE, 0xD, 0x2, 0x1F, 0x2, 0x70, 0xFD, 0x90, 0x4, 0xED, 0xC3, 0xFD, 0x9D, 0x2, 0x63, 0xFD, 0x47, 0xFD, 0x9, 0x0, 0x1, 0x0, 0x3E, 0x0, 0x0, 0x5, 0xA9, 0x4, 0x3A, 0x0, 0xE, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x4, 0x6D, 0xFE, 0xD4, 0x7B, 0xF3, 0xFE, 0x6B, 0x2, 0x88, 0x6B, 0x1, 0x2B, 0x1, 0x2C, 0xFE, 0x79, 0x1, 0xA8, 0x1, 0xAD, 0xFE, 0x53, 0x3, 0x76, 0xC4, 0xFE, 0x51, 0x1, 0xAF, 0xFD, 0xFA, 0xFD, 0xCC, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x99, 0x5, 0xDC, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x4, 0x8C, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x86, 0xFE, 0x99, 0x4, 0xD6, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x8A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x3, 0x86, 0x0, 0x0, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x7, 0x84, 0x5, 0xB0, 0x0, 0xD, 0x0, 0x0, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x4, 0x1C, 0xFD, 0x75, 0xFC, 0xFC, 0x2, 0x8B, 0x3, 0x68, 0xFD, 0x95, 0x2, 0x88, 0xFD, 0x78, 0x5, 0xB0, 0xFD, 0xA2, 0x2, 0x5E, 0xC3, 0xFB, 0x13, 0x0, 0x1, 0x0, 0x7F, 0x0, 0x0, 0x5, 0x67, 0x4, 0x3A, 0x0, 0xD, 0x0, 0x0, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x3, 0x16, 0xFE, 0x5B, 0xF2, 0xF2, 0x1, 0xA5, 0x2, 0x51, 0xFE, 0xA2, 0x1, 0xB5, 0xFE, 0x4B, 0x4, 0x3A, 0xFE, 0x3D, 0x1, 0xC3, 0xC4, 0xFC, 0x8A, 0x0, 0x1, 0x0, 0x9B, 0xFE, 0xC3, 0x7, 0xF0, 0x5, 0xB0, 0x0, 0x16, 0x0, 0x0, 0x1, 0x27, 0x32, 0x36, 0x35, 0x2, 0x25, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x4, 0x0, 0x11, 0x14, 0x2, 0x5, 0xF3, 0x2, 0xA3, 0x69, 0x2, 0xFE, 0xAB, 0x91, 0xFD, 0xFD, 0x7F, 0xFC, 0x4, 0x7A, 0x88, 0x1, 0x14, 0x1, 0x3F, 0xF3, 0xFE, 0xC3, 0xBB, 0xE5, 0x91, 0x1, 0x7A, 0x9, 0xFD, 0x89, 0x4, 0xE5, 0xFB, 0x1B, 0x5, 0xB0, 0xFD, 0x91, 0x2, 0xFE, 0xD3, 0xFE, 0xE9, 0xF4, 0xFE, 0xBC, 0x0, 0x1, 0x0, 0x7F, 0xFE, 0xE5, 0x6, 0xBB, 0x4, 0x3A, 0x0, 0x17, 0x0, 0x0, 0x1, 0x27, 0x36, 0x35, 0x26, 0x26, 0x23, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x16, 0x4, 0x15, 0x14, 0x6, 0x6, 0x5, 0x3F, 0x55, 0xDE, 0x1, 0xAB, 0x8E, 0x83, 0xF3, 0xFE, 0x59, 0xF2, 0x3, 0x8C, 0x8E, 0xF0, 0x1, 0x32, 0x4C, 0xA7, 0xFE, 0xE5, 0xAE, 0x4A, 0xD5, 0x89, 0x8F, 0xFE, 0x36, 0x3, 0x76, 0xFC, 0x8A, 0x4, 0x3A, 0xFE, 0x5B, 0x3, 0xF9, 0xE7, 0x4D, 0xBD, 0xA1, 0x0, 0x2, 0x0, 0x67, 0xFF, 0xEA, 0x5, 0xD8, 0x5, 0xC5, 0x0, 0x23, 0x0, 0x2E, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x33, 0x15, 0x22, 0x6, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x37, 0x26, 0x11, 0x35, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x15, 0x10, 0x7, 0x16, 0x33, 0x1, 0x10, 0x17, 0x36, 0x37, 0x35, 0x10, 0x23, 0x22, 0x6, 0x15, 0x5, 0xD8, 0xDE, 0xB6, 0x96, 0xB4, 0xFE, 0xE0, 0xFE, 0x8D, 0x1, 0xE, 0xDC, 0x6B, 0x79, 0xD4, 0xB9, 0x2E, 0x2B, 0xE1, 0xE8, 0xBD, 0xC4, 0xF1, 0xBA, 0x5C, 0x6A, 0xFD, 0x8E, 0xC8, 0xA1, 0x1, 0xB9, 0x53, 0x5E, 0x16, 0x48, 0x47, 0x1, 0x86, 0x1, 0x35, 0xB2, 0x1, 0x7, 0x1, 0x66, 0xD4, 0xE9, 0xAE, 0xBE, 0xCD, 0xFE, 0xEF, 0x7, 0xCB, 0x1, 0x3E, 0xD0, 0xE9, 0x1, 0x3D, 0xFE, 0xBD, 0xFD, 0xCD, 0xFE, 0xD8, 0xC8, 0x14, 0x2, 0x19, 0xFE, 0xF0, 0x92, 0x8D, 0xFD, 0xE4, 0x1, 0x59, 0xB0, 0xA0, 0x0, 0x2, 0x0, 0x61, 0xFF, 0xEB, 0x4, 0xC9, 0x4, 0x4F, 0x0, 0xA, 0x0, 0x2D, 0x0, 0x0, 0x1, 0x14, 0x17, 0x36, 0x35, 0x35, 0x34, 0x26, 0x22, 0x6, 0x15, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x12, 0x33, 0x15, 0x6, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x37, 0x26, 0x27, 0x35, 0x34, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x7, 0x16, 0x33, 0x2, 0xD8, 0x78, 0x62, 0x38, 0x6A, 0x38, 0x1, 0xF1, 0xBA, 0x93, 0x78, 0x91, 0xEE, 0xFE, 0xDC, 0xD7, 0xAF, 0x41, 0x4B, 0x96, 0x82, 0x25, 0x8E, 0x1, 0xB3, 0x97, 0x9B, 0xB7, 0x80, 0x4C, 0x58, 0x2, 0x22, 0xAA, 0x6C, 0x62, 0xA5, 0x80, 0x65, 0x8D, 0x7E, 0x61, 0xFD, 0x47, 0x37, 0x39, 0x1, 0x4A, 0xF3, 0x4B, 0xCB, 0x1, 0x10, 0xCA, 0x4, 0x96, 0x75, 0x4D, 0x9E, 0xD4, 0x2, 0x95, 0xDA, 0x83, 0xB6, 0xEF, 0xFE, 0xFB, 0xC1, 0x7D, 0xD3, 0x95, 0x11, 0xFF, 0xFF, 0x0, 0x29, 0xFE, 0x99, 0x5, 0x23, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3D, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x3, 0xD3, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x1F, 0xFE, 0x99, 0x4, 0x28, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5D, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x2, 0xD8, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2E, 0xFE, 0xA1, 0x6, 0xB8, 0x5, 0xB0, 0x0, 0xF, 0x0, 0x0, 0x25, 0x3, 0x23, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x6, 0xB8, 0x14, 0xE7, 0xFB, 0xD1, 0xFE, 0xA0, 0x3, 0xBD, 0xFE, 0x9F, 0x2, 0x81, 0xFD, 0xCD, 0xFD, 0xD4, 0x1, 0x5F, 0x4, 0xED, 0xC3, 0xC3, 0xFB, 0xDD, 0x4, 0xE6, 0xFB, 0x1D, 0x0, 0x1, 0x0, 0x26, 0xFE, 0xBF, 0x5, 0x3B, 0x4, 0x3B, 0x0, 0xF, 0x0, 0x0, 0x25, 0x3, 0x23, 0x11, 0x21, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x5, 0x3B, 0x14, 0xDD, 0xFC, 0xD2, 0xF6, 0x2, 0xC4, 0xDC, 0x1, 0xA7, 0xF3, 0xC2, 0xFD, 0xFD, 0x1, 0x41, 0x3, 0x77, 0xC4, 0xC4, 0xFD, 0x4C, 0x3, 0x77, 0xFC, 0x88, 0xFF, 0xFF, 0x0, 0x8E, 0xFE, 0x99, 0x5, 0xAE, 0x5, 0xB0, 0x0, 0x26, 0x2, 0x77, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x4, 0x5E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5F, 0xFE, 0x99, 0x4, 0xA6, 0x4, 0x3B, 0x0, 0x26, 0x2, 0x8F, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x3, 0x56, 0x0, 0x0, 0x0, 0x1, 0x0, 0x81, 0x0, 0x0, 0x4, 0xE1, 0x5, 0xB0, 0x0, 0x17, 0x0, 0x0, 0x21, 0x23, 0x11, 0x6, 0x7, 0x15, 0x23, 0x35, 0x26, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x37, 0x11, 0x33, 0x4, 0xE1, 0xFC, 0x61, 0x6F, 0xA3, 0xE7, 0xFE, 0xF6, 0xFC, 0x7A, 0x7B, 0xA3, 0x6E, 0x62, 0xFC, 0x2, 0x3E, 0x19, 0xA, 0xEB, 0xE5, 0x7, 0xDA, 0xF1, 0x1, 0xC9, 0xFE, 0x37, 0x91, 0x70, 0x5, 0x1, 0x2A, 0xFE, 0xDC, 0xB, 0x17, 0x2, 0xA7, 0x0, 0x1, 0x0, 0x74, 0x0, 0x0, 0x3, 0xF6, 0x4, 0x3B, 0x0, 0x16, 0x0, 0x0, 0x21, 0x23, 0x11, 0x6, 0x7, 0x15, 0x23, 0x35, 0x26, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x11, 0x33, 0x11, 0x36, 0x37, 0x11, 0x33, 0x3, 0xF6, 0xF4, 0x3A, 0x3B, 0xA4, 0xAD, 0xC8, 0xF3, 0x82, 0xA4, 0x3A, 0x3B, 0xF4, 0x1, 0x6A, 0xD, 0x5, 0x8C, 0x8C, 0x13, 0xC8, 0xBC, 0x1, 0x4C, 0xFE, 0xB4, 0xAF, 0x20, 0x1, 0xB, 0xFE, 0xF0, 0x5, 0xE, 0x2, 0xC, 0x0, 0x1, 0x0, 0x85, 0x0, 0x0, 0x4, 0xE5, 0x5, 0xB0, 0x0, 0x11, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x4, 0x15, 0x11, 0x23, 0x11, 0x26, 0x26, 0x2, 0xD3, 0xA9, 0xA9, 0xFC, 0xFC, 0x9E, 0xB4, 0xF6, 0x1, 0x1C, 0xFC, 0x1, 0x89, 0x2, 0xD0, 0x29, 0xFD, 0x59, 0x5, 0xB0, 0xFD, 0xC2, 0x29, 0xD9, 0xF9, 0xFE, 0x37, 0x1, 0xCE, 0x97, 0x6B, 0x0, 0x2, 0x0, 0x17, 0xFF, 0xE9, 0x5, 0xBD, 0x5, 0xC4, 0x0, 0x7, 0x0, 0x25, 0x0, 0x0, 0x1, 0x21, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x1, 0x6, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x26, 0x26, 0x35, 0x33, 0x14, 0x17, 0x36, 0x12, 0x24, 0x17, 0x20, 0x0, 0x11, 0x15, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x2, 0x55, 0x2, 0x6C, 0x85, 0xA9, 0x9B, 0xA3, 0x3, 0x16, 0x1F, 0xC9, 0xA7, 0xFE, 0xC5, 0xFE, 0xB7, 0x9D, 0xA4, 0xB5, 0x8C, 0x1, 0x99, 0x1, 0x2, 0x9F, 0x1, 0x13, 0x1, 0x17, 0xFC, 0x98, 0xB1, 0xD6, 0x7C, 0xAC, 0x36, 0x3, 0x55, 0x1F, 0x9E, 0xDB, 0xED, 0xFC, 0x3F, 0x12, 0x44, 0x1, 0x62, 0x1, 0x14, 0x45, 0x18, 0xD7, 0xA7, 0xB4, 0x2A, 0xB5, 0x1, 0x16, 0x9D, 0x1, 0xFE, 0x91, 0xFE, 0xC9, 0x88, 0x36, 0xAC, 0xF5, 0x31, 0x16, 0x0, 0x2, 0xFF, 0xCA, 0xFF, 0xEC, 0x4, 0x8B, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x21, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x26, 0x26, 0x1, 0x6, 0x6, 0x23, 0x22, 0x0, 0x27, 0x26, 0x26, 0x35, 0x33, 0x14, 0x17, 0x36, 0x24, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x2, 0xBC, 0x63, 0x7B, 0x11, 0x1, 0xCE, 0x4, 0x61, 0x1, 0x44, 0x34, 0xCC, 0xA1, 0xED, 0xFE, 0xEC, 0x4, 0x83, 0x87, 0xAA, 0x69, 0x21, 0x1, 0xA, 0xB5, 0xEC, 0xE2, 0xFD, 0x3D, 0xA, 0x95, 0x80, 0xA8, 0x68, 0x3, 0x8B, 0x8C, 0x7C, 0x12, 0x5F, 0x97, 0xFD, 0x2D, 0x4C, 0x80, 0x1, 0x25, 0xDA, 0x1E, 0xBF, 0x93, 0x95, 0x30, 0xCD, 0xEB, 0xFE, 0xD4, 0xEA, 0x67, 0x7D, 0xA5, 0x86, 0x0, 0x1, 0x0, 0x91, 0xFE, 0xBE, 0x4, 0xEE, 0x5, 0xB0, 0x0, 0x18, 0x0, 0x0, 0x1, 0x27, 0x32, 0x36, 0x36, 0x27, 0x10, 0x25, 0x21, 0x35, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x16, 0x0, 0x15, 0x14, 0x2, 0x2, 0xEA, 0x1, 0x6D, 0x72, 0x2A, 0x1, 0xFE, 0xB0, 0xFE, 0xF5, 0x8, 0xFD, 0xFD, 0x70, 0x1, 0xB3, 0x1, 0x31, 0xFE, 0x23, 0xE4, 0x1, 0x5, 0xF3, 0xFE, 0xBE, 0xC2, 0x6D, 0xA9, 0x5B, 0x1, 0x78, 0x8, 0x1, 0xFD, 0x8E, 0x5, 0xB0, 0xFD, 0xA5, 0x2, 0x5B, 0xFD, 0x8B, 0x1D, 0xFE, 0xDA, 0xFE, 0xEE, 0xFE, 0xB2, 0x0, 0x1, 0x0, 0x8E, 0xFE, 0xE9, 0x4, 0x43, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x0, 0x1, 0x27, 0x36, 0x35, 0x2, 0x21, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x16, 0x16, 0x15, 0x14, 0x6, 0x6, 0x2, 0xBE, 0x55, 0xDE, 0x2, 0xFE, 0xBE, 0x82, 0xF3, 0xF3, 0x54, 0x1, 0x42, 0x1, 0x2C, 0xFE, 0x8B, 0xA5, 0xC6, 0x4C, 0xA7, 0xFE, 0xE9, 0xAD, 0x49, 0xC9, 0x1, 0x5, 0xFE, 0x53, 0x4, 0x3A, 0xFE, 0x51, 0x1, 0xAF, 0xFE, 0x28, 0x26, 0xDC, 0xB8, 0x4B, 0xB7, 0x9B, 0xFF, 0xFF, 0x0, 0x2D, 0xFE, 0x7D, 0x5, 0xDB, 0x5, 0xB0, 0x0, 0x26, 0x2, 0x73, 0x0, 0x0, 0x0, 0x7, 0x0, 0x11, 0x4, 0x7E, 0xFF, 0xC5, 0xFF, 0xFF, 0x0, 0x22, 0xFE, 0x7D, 0x4, 0xE5, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x88, 0x0, 0x0, 0x0, 0x7, 0x0, 0x11, 0x3, 0x88, 0xFF, 0xC5, 0x0, 0x1, 0x0, 0x9B, 0xFE, 0x4B, 0x5, 0x13, 0x5, 0xB0, 0x0, 0x14, 0x0, 0x0, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x21, 0x11, 0x23, 0x9B, 0xFC, 0x2, 0x80, 0xFC, 0xBF, 0xA7, 0x46, 0x3C, 0xE, 0x2A, 0x39, 0x7A, 0x1, 0xFD, 0x80, 0xFC, 0x5, 0xB0, 0xFD, 0x83, 0x2, 0x7D, 0xFA, 0x17, 0xB9, 0xC3, 0x11, 0xC7, 0xD, 0xAE, 0x2, 0xA5, 0xFD, 0x97, 0x0, 0x1, 0x0, 0x7F, 0xFE, 0x4B, 0x4, 0x9, 0x4, 0x3A, 0x0, 0x14, 0x0, 0x0, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x21, 0x11, 0x23, 0x7F, 0xF2, 0x1, 0xA5, 0xF3, 0xBC, 0xA4, 0x45, 0x3A, 0xE, 0x29, 0x39, 0x7B, 0x1, 0xFE, 0x5B, 0xF2, 0x4, 0x3A, 0xFE, 0x3D, 0x1, 0xC3, 0xFB, 0x87, 0xB6, 0xC0, 0x11, 0xBF, 0xD, 0xB0, 0x1, 0xF7, 0xFE, 0x4B, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x7D, 0x5, 0xE8, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x0, 0x11, 0x4, 0x8B, 0xFF, 0xC5, 0xFF, 0xFF, 0x0, 0x86, 0xFE, 0x7D, 0x4, 0xE2, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x8A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x11, 0x3, 0x85, 0xFF, 0xC5, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x7D, 0x7, 0x31, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x32, 0x0, 0x0, 0x0, 0x7, 0x0, 0x11, 0x5, 0xD4, 0xFF, 0xC5, 0xFF, 0xFF, 0x0, 0x8F, 0xFE, 0x7D, 0x6, 0x41, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x89, 0x0, 0x0, 0x0, 0x7, 0x0, 0x11, 0x4, 0xE4, 0xFF, 0xC5, 0x0, 0x2, 0x0, 0x51, 0xFF, 0xEB, 0x5, 0x1E, 0x5, 0xC4, 0x0, 0x16, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x14, 0x2, 0x4, 0x27, 0x20, 0x0, 0x11, 0x35, 0x21, 0x26, 0x2, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x20, 0x0, 0x11, 0x1, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, 0x16, 0x5, 0x1E, 0xA4, 0xFE, 0xEA, 0xAC, 0xFE, 0xD0, 0xFE, 0xC9, 0x3, 0xD1, 0x3, 0xC6, 0xE7, 0x83, 0xB6, 0x39, 0x31, 0x20, 0xD4, 0xAF, 0x1, 0x4F, 0x1, 0x5D, 0xFD, 0x9A, 0xA1, 0xB7, 0xF, 0xFD, 0x2F, 0xA0, 0x2, 0x9B, 0xCB, 0xFE, 0xCA, 0xAF, 0x1, 0x1, 0x6E, 0x1, 0x36, 0x8E, 0xC1, 0x1, 0xF, 0x30, 0x16, 0xC5, 0x13, 0x44, 0xFE, 0x7D, 0xFE, 0xCF, 0xFD, 0xB1, 0xEB, 0xAC, 0x1F, 0x9D, 0xDB, 0x0, 0x1, 0x0, 0x5C, 0xFF, 0xEB, 0x4, 0x4B, 0x5, 0xB0, 0x0, 0x1B, 0x0, 0x0, 0x5, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x47, 0x78, 0xE2, 0x91, 0xFC, 0x82, 0x6D, 0x7E, 0x8A, 0x98, 0x92, 0x8C, 0x1, 0x66, 0xFD, 0x93, 0x3, 0x91, 0x1, 0xFE, 0x86, 0xC7, 0xDA, 0xFE, 0xDD, 0x15, 0x58, 0xBC, 0x95, 0x5B, 0x84, 0x82, 0x61, 0x95, 0x84, 0xAD, 0x1, 0x87, 0xCB, 0xA3, 0xFE, 0x51, 0x19, 0xE9, 0xC4, 0xCD, 0xE0, 0x0, 0x1, 0x0, 0x5E, 0xFE, 0x75, 0x4, 0x46, 0x4, 0x3A, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x46, 0x77, 0xE1, 0x90, 0xF3, 0x85, 0x70, 0x80, 0x8E, 0x9B, 0x93, 0x8E, 0x1, 0x5C, 0xFD, 0x9B, 0x3, 0x8D, 0x1, 0xFE, 0x89, 0xC7, 0xD9, 0xFE, 0xDF, 0xFE, 0x75, 0x58, 0xBB, 0x95, 0x5E, 0x87, 0x85, 0x64, 0x97, 0x82, 0xAB, 0x1, 0x91, 0xC4, 0x9B, 0xFE, 0x44, 0x18, 0xE7, 0xC3, 0xCC, 0xE0, 0xFF, 0xFF, 0x0, 0x32, 0xFE, 0x4B, 0x4, 0x8A, 0x5, 0xB0, 0x0, 0x26, 0x2, 0x30, 0x52, 0x0, 0x0, 0x26, 0x7, 0xA4, 0xA2, 0x29, 0x0, 0x7, 0x7, 0xE3, 0x1, 0x35, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x2C, 0xFE, 0x47, 0x3, 0xA2, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x82, 0x55, 0x0, 0x0, 0x27, 0x7, 0xA4, 0xFF, 0x9C, 0xFF, 0x79, 0x0, 0x7, 0x7, 0xE3, 0x1, 0xB, 0xFF, 0xFC, 0xFF, 0xFF, 0x0, 0x29, 0xFE, 0x4B, 0x5, 0x51, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3D, 0x0, 0x0, 0x0, 0x7, 0x7, 0xE3, 0x3, 0xC3, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x1F, 0xFE, 0x4B, 0x4, 0x55, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5D, 0x0, 0x0, 0x0, 0x7, 0x7, 0xE3, 0x2, 0xC7, 0x0, 0x0, 0x0, 0x2, 0x0, 0x52, 0x0, 0x0, 0x4, 0x83, 0x5, 0xB0, 0x0, 0xA, 0x0, 0x12, 0x0, 0x0, 0x21, 0x21, 0x22, 0x0, 0x35, 0x34, 0x0, 0x33, 0x21, 0x11, 0x33, 0x3, 0x11, 0x21, 0x22, 0x6, 0x14, 0x16, 0x33, 0x4, 0x83, 0xFD, 0xDA, 0xF7, 0xFE, 0xEC, 0x1, 0x14, 0xF7, 0x1, 0x29, 0xFD, 0xFD, 0xFE, 0xD7, 0x8D, 0x81, 0x81, 0x8D, 0x1, 0x8, 0xC8, 0xCA, 0x1, 0x2, 0x2, 0x14, 0xFB, 0x1A, 0x2, 0x7, 0x9A, 0xCA, 0xA3, 0x0, 0x2, 0x0, 0x68, 0x0, 0x0, 0x6, 0xB0, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x20, 0x0, 0x0, 0x25, 0x11, 0x21, 0x22, 0x6, 0x14, 0x16, 0x33, 0x15, 0x22, 0x0, 0x35, 0x34, 0x0, 0x33, 0x21, 0x11, 0x33, 0x11, 0x37, 0x36, 0x36, 0x37, 0x36, 0x26, 0x27, 0x33, 0x16, 0x16, 0x7, 0x6, 0x6, 0x23, 0x3, 0x9C, 0xFE, 0xD7, 0x8D, 0x81, 0x81, 0x8D, 0xF7, 0xFE, 0xEC, 0x1, 0x14, 0xF7, 0x1, 0x29, 0xFD, 0x4A, 0x6C, 0x60, 0x3, 0x2, 0x20, 0x1E, 0xF5, 0x1A, 0x2B, 0x2, 0x4, 0xF8, 0xCF, 0xCA, 0x2, 0x7, 0x9A, 0xCA, 0xA3, 0xCA, 0x1, 0x8, 0xC8, 0xCA, 0x1, 0x2, 0x2, 0x14, 0xFB, 0x1A, 0x1, 0x2, 0xA0, 0x66, 0x4D, 0xD5, 0x4D, 0x4D, 0xD2, 0x50, 0xD7, 0xFC, 0x0, 0x2, 0x0, 0x5F, 0xFF, 0xE7, 0x6, 0x7E, 0x6, 0x18, 0x0, 0x1E, 0x0, 0x2A, 0x0, 0x0, 0x5, 0x6, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x33, 0x16, 0x16, 0x7, 0x2, 0x0, 0x25, 0x32, 0x37, 0x27, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x4, 0x90, 0xFF, 0x57, 0x69, 0xCD, 0xCA, 0xDB, 0xDA, 0xCD, 0xA2, 0x65, 0xF3, 0x4E, 0x42, 0x77, 0x7F, 0x3, 0x3, 0x3F, 0xEC, 0x1B, 0x2A, 0x2, 0x4, 0xFE, 0xDB, 0xFC, 0xEF, 0x8A, 0x48, 0x7, 0x47, 0x82, 0x84, 0x6F, 0x6E, 0x15, 0x4, 0xB7, 0xB3, 0x1, 0x28, 0xE8, 0x14, 0xFC, 0x1, 0x43, 0x77, 0x2, 0x41, 0xFB, 0x4C, 0x4F, 0x66, 0x2, 0xBE, 0xA2, 0xC2, 0xD1, 0x61, 0xCB, 0x67, 0xFE, 0xEA, 0xFE, 0xF0, 0xC7, 0x71, 0x45, 0x1, 0xB8, 0x68, 0xDD, 0xB1, 0x8B, 0xBD, 0x0, 0x1, 0x0, 0x3C, 0xFF, 0xE8, 0x5, 0xE4, 0x5, 0xB0, 0x0, 0x2A, 0x0, 0x0, 0x5, 0x6, 0x26, 0x27, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x16, 0x4, 0x15, 0x14, 0x7, 0x16, 0x16, 0x15, 0x15, 0x6, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x33, 0x16, 0x16, 0x7, 0x2, 0x0, 0x4, 0x2, 0x9F, 0xBA, 0x8, 0x79, 0x68, 0xD9, 0xA6, 0x97, 0x81, 0x7B, 0x8F, 0xFE, 0xA1, 0x1, 0x68, 0xF7, 0x1, 0x6, 0xFF, 0x8D, 0x6E, 0x1, 0x3B, 0x34, 0x68, 0x6F, 0x4, 0x4, 0x41, 0xF6, 0x1A, 0x2B, 0x2, 0x4, 0xFE, 0xE1, 0x15, 0x3, 0x9D, 0xB3, 0x42, 0x68, 0x81, 0xCD, 0x1, 0x72, 0x6F, 0x5F, 0x72, 0xCD, 0x2, 0xD4, 0xCA, 0xE5, 0x64, 0x26, 0xAF, 0x76, 0x44, 0x37, 0x4A, 0x2, 0xBA, 0x9E, 0xBB, 0xD8, 0x61, 0xCB, 0x67, 0xFE, 0xE9, 0xFE, 0xF1, 0x0, 0x1, 0x0, 0x30, 0xFF, 0xE2, 0x4, 0xFF, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x0, 0x5, 0x6, 0x26, 0x27, 0x35, 0x26, 0x27, 0x23, 0x27, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x27, 0x21, 0x16, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x15, 0x6, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x33, 0x16, 0x16, 0x7, 0x6, 0x6, 0x3, 0x54, 0x9D, 0xA0, 0x9, 0x2, 0x98, 0xED, 0x2, 0xC2, 0xB8, 0x5A, 0x69, 0xFE, 0xFA, 0x6, 0x1, 0x1A, 0xCB, 0xDE, 0xB0, 0xBE, 0x2, 0x4E, 0x59, 0x61, 0x3, 0x3, 0x3F, 0xEB, 0x1B, 0x2B, 0x2, 0x4, 0xFE, 0x1B, 0x3, 0x72, 0x82, 0x4E, 0x78, 0x2, 0xBC, 0x4, 0x83, 0x41, 0x56, 0xC2, 0x3, 0xA9, 0x97, 0x9B, 0x4A, 0x30, 0xBA, 0x3C, 0x58, 0x2, 0x90, 0x7D, 0x9D, 0xA2, 0x50, 0xA1, 0x4E, 0xE1, 0xDD, 0x0, 0x1, 0x0, 0x49, 0xFE, 0xB9, 0x4, 0x38, 0x5, 0xB0, 0x0, 0x25, 0x0, 0x0, 0x1, 0x27, 0x36, 0x36, 0x37, 0x23, 0x26, 0x26, 0x35, 0x35, 0x34, 0x26, 0x23, 0x23, 0x27, 0x33, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x27, 0x21, 0x16, 0x4, 0x15, 0x14, 0x7, 0x16, 0x16, 0x15, 0x15, 0x33, 0x7, 0x14, 0x6, 0x3, 0x7A, 0x83, 0x23, 0x37, 0x9, 0xA3, 0x2E, 0x11, 0x7E, 0x71, 0xF2, 0x1, 0xCE, 0x92, 0x81, 0x7F, 0x8C, 0xFE, 0xE0, 0x3, 0x1, 0x30, 0xEC, 0x1, 0x4, 0xE5, 0x82, 0x65, 0xCD, 0x1, 0x67, 0xFE, 0xB9, 0x4E, 0x38, 0x78, 0x49, 0x28, 0xAA, 0x23, 0x73, 0x71, 0x83, 0xC3, 0x1, 0x74, 0x6F, 0x69, 0x81, 0xC3, 0x3, 0xDB, 0xC9, 0xE0, 0x65, 0x29, 0xB7, 0x7A, 0x7D, 0xAD, 0x65, 0xDA, 0x0, 0x1, 0x0, 0x75, 0xFE, 0xA8, 0x4, 0x1B, 0x4, 0x3A, 0x0, 0x21, 0x0, 0x0, 0x1, 0x27, 0x36, 0x36, 0x37, 0x23, 0x26, 0x26, 0x2, 0x27, 0x21, 0x35, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x27, 0x21, 0x16, 0x16, 0x15, 0x14, 0x7, 0x16, 0x16, 0x15, 0x15, 0x33, 0x15, 0x14, 0x6, 0x3, 0x5D, 0x83, 0x26, 0x38, 0x7, 0xA7, 0x18, 0x12, 0x2, 0xB7, 0xFE, 0xFE, 0xF0, 0xC2, 0x62, 0x6B, 0xFE, 0xE1, 0x4, 0x1, 0x2C, 0xCF, 0xE9, 0xAE, 0x65, 0x4F, 0xBC, 0x67, 0xFE, 0xA8, 0x4E, 0x3C, 0x7E, 0x50, 0x12, 0x4B, 0x1, 0x3B, 0x4, 0xB3, 0x4, 0x8A, 0x42, 0x5A, 0xC1, 0x2, 0xB2, 0x9B, 0x9E, 0x4F, 0x21, 0x89, 0x5A, 0x1E, 0xAD, 0x65, 0xDA, 0x0, 0x1, 0x0, 0x43, 0xFF, 0xEB, 0x7, 0x80, 0x5, 0xB0, 0x0, 0x20, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x11, 0x21, 0x3, 0x2, 0x2, 0x7, 0x23, 0x35, 0x37, 0x36, 0x36, 0x13, 0x13, 0x21, 0x11, 0x14, 0x16, 0x37, 0x36, 0x36, 0x37, 0x36, 0x27, 0x33, 0x16, 0x16, 0x7, 0x2, 0x0, 0x5, 0x90, 0xB1, 0xD7, 0xFE, 0x61, 0x1A, 0x16, 0xC6, 0xE7, 0x49, 0x31, 0x7B, 0x61, 0xD, 0x1B, 0x3, 0x8D, 0x4A, 0x41, 0x73, 0x7B, 0x3, 0x4, 0x40, 0xF6, 0x1A, 0x2B, 0x2, 0x4, 0xFE, 0xD9, 0x15, 0xB2, 0xCD, 0x3, 0x79, 0xFD, 0xCD, 0xFE, 0x8C, 0xFE, 0xC7, 0x3, 0xCA, 0x5, 0xE, 0xF4, 0x1, 0x2E, 0x2, 0xB1, 0xFB, 0xBA, 0x4E, 0x66, 0x1, 0x1, 0xBB, 0x9E, 0xBE, 0xD5, 0x61, 0xCB, 0x67, 0xFE, 0xEA, 0xFE, 0xF0, 0x0, 0x1, 0x0, 0x41, 0xFF, 0xEB, 0x6, 0x59, 0x4, 0x3A, 0x0, 0x20, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x11, 0x21, 0x3, 0x2, 0x6, 0x7, 0x23, 0x27, 0x37, 0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x14, 0x16, 0x37, 0x36, 0x36, 0x37, 0x36, 0x27, 0x33, 0x16, 0x16, 0x7, 0x2, 0x4, 0x4, 0xA1, 0xB1, 0xD9, 0xFE, 0xF8, 0x15, 0x13, 0xAA, 0xAC, 0x4F, 0x1, 0x27, 0x5F, 0x45, 0xA, 0x14, 0x2, 0xE0, 0x51, 0x46, 0x5D, 0x64, 0x2, 0x4, 0x40, 0xEC, 0x1A, 0x2B, 0x2, 0x4, 0xFE, 0xFB, 0x15, 0xB1, 0xCC, 0x2, 0xD, 0xFE, 0x8C, 0xFE, 0xEB, 0xEA, 0x2, 0xCB, 0x3, 0x8, 0xC1, 0xD5, 0x1, 0xCE, 0xFD, 0x2E, 0x50, 0x6A, 0x1, 0x1, 0xA9, 0x8F, 0xB5, 0xC8, 0x5C, 0xC0, 0x61, 0xFE, 0xFF, 0xFC, 0x0, 0x1, 0x0, 0x94, 0xFF, 0xE8, 0x7, 0x86, 0x5, 0xB0, 0x0, 0x1C, 0x0, 0x0, 0x5, 0x6, 0x26, 0x27, 0x35, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x33, 0x16, 0x16, 0x7, 0x2, 0x0, 0x5, 0x95, 0xB0, 0xCC, 0xB, 0xFD, 0x83, 0xFD, 0xFD, 0x2, 0x7D, 0xFD, 0x4B, 0x3F, 0x74, 0x7B, 0x3, 0x4, 0x41, 0xF6, 0x1C, 0x2A, 0x2, 0x4, 0xFE, 0xD9, 0x15, 0x3, 0xB5, 0xCD, 0xFF, 0xFD, 0x97, 0x5, 0xB0, 0xFD, 0x83, 0x2, 0x7D, 0xFB, 0xB6, 0x4D, 0x62, 0x2, 0xBA, 0x9E, 0xBB, 0xD8, 0x65, 0xC8, 0x66, 0xFE, 0xEA, 0xFE, 0xF0, 0x0, 0x1, 0x0, 0x77, 0xFF, 0xE8, 0x6, 0x5D, 0x4, 0x3A, 0x0, 0x1C, 0x0, 0x0, 0x5, 0x6, 0x26, 0x27, 0x35, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x33, 0x16, 0x16, 0x7, 0x2, 0x4, 0x4, 0xA4, 0xB1, 0xCE, 0xB, 0xFE, 0x50, 0xF3, 0xF3, 0x1, 0xB0, 0xF3, 0x52, 0x45, 0x5D, 0x64, 0x3, 0x4, 0x40, 0xEB, 0x28, 0x1E, 0x2, 0x4, 0xFE, 0xFA, 0x15, 0x3, 0xB4, 0xCC, 0x52, 0xFE, 0x46, 0x4, 0x3A, 0xFE, 0x44, 0x1, 0xBC, 0xFD, 0x2A, 0x4E, 0x67, 0x2, 0xA8, 0x8F, 0xAF, 0xCE, 0x8F, 0x9F, 0x4F, 0xFE, 0xFF, 0xFC, 0x0, 0x1, 0x0, 0x5D, 0xFF, 0xEB, 0x4, 0xBC, 0x5, 0xC5, 0x0, 0x1E, 0x0, 0x0, 0x5, 0x20, 0x0, 0x11, 0x11, 0x10, 0x0, 0x21, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x14, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x33, 0x17, 0x16, 0x7, 0x6, 0x4, 0x2, 0xBB, 0xFE, 0xF1, 0xFE, 0xB1, 0x1, 0x4F, 0x1, 0xF, 0xDE, 0x89, 0x3E, 0x86, 0xA3, 0xA6, 0xBB, 0xBB, 0xA6, 0x7C, 0x84, 0x3, 0x3, 0x35, 0xF5, 0x27, 0x14, 0x2, 0x4, 0xFE, 0xD0, 0x15, 0x1, 0x61, 0x1, 0x9, 0x1, 0x6, 0x1, 0xA, 0x1, 0x60, 0x59, 0xB8, 0x44, 0xF2, 0xA9, 0xFE, 0xF8, 0xAB, 0xF3, 0x2, 0x86, 0x73, 0x96, 0xCA, 0xAC, 0x5B, 0x59, 0xE7, 0xE0, 0x0, 0x1, 0x0, 0x55, 0xFF, 0xEB, 0x3, 0xE6, 0x4, 0x4E, 0x0, 0x1D, 0x0, 0x0, 0x25, 0x36, 0x36, 0x37, 0x34, 0x27, 0x33, 0x16, 0x7, 0x6, 0x6, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x2, 0x5A, 0x57, 0x3F, 0x2, 0x13, 0xEB, 0x1C, 0x1, 0x4, 0xDF, 0xA8, 0xF9, 0xFE, 0xF4, 0x1, 0x3, 0xEE, 0xBB, 0x5F, 0x2E, 0x62, 0x8A, 0x87, 0x77, 0x7F, 0xAF, 0x2, 0x49, 0x41, 0x76, 0x68, 0x8C, 0x52, 0xAA, 0xA6, 0x1, 0x45, 0xD8, 0x2A, 0xD8, 0x1, 0x44, 0x42, 0xBC, 0x3A, 0xDD, 0x7B, 0x2A, 0x7C, 0xDD, 0x0, 0x1, 0x0, 0x22, 0xFF, 0xE8, 0x5, 0x5A, 0x5, 0xB0, 0x0, 0x18, 0x0, 0x0, 0x5, 0x6, 0x26, 0x27, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x6, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x33, 0x16, 0x16, 0x7, 0x2, 0x0, 0x3, 0x6A, 0xB0, 0xCD, 0xA, 0xFE, 0x3F, 0x4, 0x80, 0xFE, 0x3D, 0x1, 0x4C, 0x40, 0x74, 0x7B, 0x3, 0x4, 0x40, 0xF5, 0x1B, 0x2A, 0x2, 0x4, 0xFE, 0xDA, 0x15, 0x3, 0xB5, 0xCD, 0x3, 0x79, 0xCD, 0xCD, 0xFC, 0x87, 0x4E, 0x65, 0x2, 0xBA, 0x9E, 0xB7, 0xDC, 0x61, 0xCB, 0x67, 0xFE, 0xEA, 0xFE, 0xF0, 0x0, 0x1, 0x0, 0x45, 0xFF, 0xE8, 0x4, 0xCD, 0x4, 0x3A, 0x0, 0x18, 0x0, 0x0, 0x5, 0x6, 0x26, 0x27, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x6, 0x16, 0x33, 0x36, 0x36, 0x37, 0x36, 0x27, 0x33, 0x16, 0x16, 0x7, 0x6, 0x4, 0x3, 0x13, 0xB1, 0xCE, 0xA, 0xFE, 0xBB, 0x3, 0x8B, 0xFE, 0xAD, 0x1, 0x51, 0x46, 0x5E, 0x64, 0x3, 0x3, 0x3F, 0xEB, 0x1B, 0x2B, 0x2, 0x4, 0xFE, 0xF9, 0x15, 0x3, 0xB4, 0xCC, 0x2, 0x10, 0xC2, 0xC2, 0xFD, 0xF0, 0x50, 0x69, 0x2, 0x85, 0x73, 0x93, 0x9E, 0x4C, 0x99, 0x4C, 0xE1, 0xDD, 0x0, 0x1, 0x0, 0x82, 0xFF, 0xEB, 0x4, 0xFF, 0x5, 0xC5, 0x0, 0x27, 0x0, 0x0, 0x1, 0x14, 0x6, 0x4, 0x23, 0x20, 0x24, 0x35, 0x34, 0x25, 0x26, 0x26, 0x35, 0x34, 0x24, 0x21, 0x32, 0x4, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x4, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x4, 0xFF, 0xA5, 0xFE, 0xFF, 0x8A, 0xFF, 0x0, 0xFE, 0xB3, 0x1, 0xD, 0x73, 0x84, 0x1, 0x37, 0x1, 0x0, 0xDD, 0x1, 0x3F, 0xFC, 0xA7, 0x79, 0xA3, 0x97, 0x8C, 0x9E, 0xC0, 0xD2, 0xFE, 0xD2, 0xB0, 0xA0, 0x8A, 0xAA, 0x1, 0x94, 0x95, 0xBC, 0x58, 0xE0, 0xCD, 0xFD, 0x57, 0x30, 0xA5, 0x64, 0xCC, 0xD4, 0xDB, 0xBE, 0x5B, 0x73, 0x80, 0x56, 0x61, 0x79, 0xC7, 0x7, 0xE4, 0x61, 0x82, 0x84, 0x5B, 0xFF, 0xFF, 0x0, 0x2D, 0xFE, 0x4B, 0x5, 0xFC, 0x5, 0xB0, 0x0, 0x26, 0x2, 0x73, 0x0, 0x0, 0x0, 0x7, 0x7, 0xE3, 0x4, 0x6E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x22, 0xFE, 0x4B, 0x5, 0x6, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x88, 0x0, 0x0, 0x0, 0x7, 0x7, 0xE3, 0x3, 0x78, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x7, 0x88, 0x5, 0xB0, 0x0, 0x17, 0x0, 0x0, 0x33, 0x35, 0x37, 0x36, 0x36, 0x13, 0x13, 0x21, 0x1, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x1, 0x23, 0x3, 0x2, 0x2, 0x7, 0x2D, 0x31, 0x7B, 0x61, 0xD, 0x1B, 0x2, 0x94, 0x1, 0x32, 0x1, 0x31, 0x1, 0x24, 0xFE, 0x48, 0x1, 0xC3, 0xFE, 0xD9, 0xFE, 0xC7, 0xFE, 0xC6, 0xFE, 0xD9, 0x1, 0xC3, 0xFE, 0xC4, 0xFA, 0x1B, 0x16, 0xC5, 0xE7, 0xCA, 0x5, 0xE, 0xF4, 0x1, 0x2E, 0x2, 0xB1, 0xFD, 0xF2, 0x2, 0xE, 0xFD, 0x2E, 0xFD, 0x22, 0x2, 0x17, 0xFD, 0xE9, 0x2, 0xDE, 0x2, 0x7, 0xFD, 0xCB, 0xFE, 0x8C, 0xFE, 0xC7, 0x3, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x5, 0xFE, 0x4, 0x3A, 0x0, 0x17, 0x0, 0x0, 0x33, 0x27, 0x37, 0x36, 0x36, 0x37, 0x13, 0x21, 0x13, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x3, 0x21, 0x1, 0x3, 0x23, 0x3, 0x2, 0x6, 0x7, 0x23, 0x1, 0x27, 0x5F, 0x44, 0xA, 0x14, 0x2, 0x43, 0xCA, 0xCE, 0x1, 0xD, 0xFE, 0xB6, 0x1, 0x56, 0xFE, 0xF3, 0xD8, 0xD7, 0xFE, 0xF2, 0x1, 0x56, 0xD0, 0xCA, 0x15, 0x13, 0xAA, 0xAC, 0xCB, 0x3, 0x8, 0xC1, 0xD5, 0x1, 0xCE, 0xFE, 0x9C, 0x1, 0x64, 0xFD, 0xEC, 0xFD, 0xDA, 0x1, 0x72, 0xFE, 0x8E, 0x2, 0x26, 0x1, 0x50, 0xFE, 0x8B, 0xFE, 0xEB, 0xEA, 0x2, 0x0, 0x2, 0x0, 0x95, 0x0, 0x0, 0x6, 0xF8, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x18, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x1, 0x11, 0x23, 0x11, 0x21, 0x32, 0x4, 0x17, 0x13, 0x21, 0x1, 0x1, 0x21, 0x1, 0x6, 0x23, 0x1, 0x91, 0x1, 0x31, 0x93, 0x81, 0x81, 0x93, 0xFE, 0xCF, 0xFC, 0x2, 0x2D, 0xC6, 0x1, 0x1, 0x30, 0xF2, 0x1, 0x2F, 0xFD, 0xE9, 0x2, 0x35, 0xFE, 0xD4, 0xFE, 0x4D, 0x85, 0xD2, 0x4, 0xE5, 0xFE, 0x3, 0x8A, 0x6D, 0x66, 0xA0, 0xFD, 0x38, 0xFD, 0xE3, 0x5, 0xB0, 0xA4, 0x87, 0x1, 0x2B, 0xFD, 0x74, 0xFC, 0xDC, 0x2, 0x72, 0x55, 0x0, 0x2, 0x0, 0x7D, 0xFE, 0x60, 0x6, 0x2D, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x20, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x6, 0x6, 0x2, 0x48, 0x83, 0x73, 0x75, 0x83, 0x96, 0x41, 0x43, 0xDA, 0xB1, 0x6C, 0xF2, 0xDF, 0xA, 0x6D, 0xB7, 0x98, 0xC7, 0x2A, 0xCD, 0x1, 0x2D, 0xFE, 0x89, 0x1, 0x97, 0xFE, 0xC5, 0xDC, 0x28, 0xC8, 0xAF, 0xD3, 0x90, 0x15, 0x92, 0xCF, 0x7D, 0xFE, 0x23, 0x7F, 0xC3, 0x75, 0xFD, 0xFF, 0x5, 0xDA, 0x6D, 0x81, 0xAB, 0x93, 0x1, 0x2A, 0xFD, 0xE8, 0xFD, 0xDE, 0x1, 0x3B, 0x97, 0xB8, 0x0, 0x2, 0x0, 0x43, 0x0, 0x0, 0x7, 0x3C, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x13, 0x11, 0x21, 0x1, 0x21, 0x1, 0x26, 0x11, 0x34, 0x24, 0x33, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x3, 0x85, 0xEC, 0x8B, 0x88, 0x8A, 0x89, 0xEC, 0xFE, 0xE6, 0xFE, 0xE7, 0xFE, 0xF1, 0x1, 0x45, 0xFE, 0x1, 0x1B, 0xF4, 0x4, 0x9C, 0xFD, 0x4C, 0x2, 0x56, 0xFD, 0xAA, 0x2, 0xBB, 0x2, 0xE4, 0x2, 0x1, 0x87, 0x75, 0x7A, 0x8B, 0xFD, 0x1C, 0x2, 0x21, 0xFD, 0xDF, 0x2, 0x6C, 0x77, 0x1, 0x11, 0xD8, 0xE4, 0xCB, 0xFE, 0x6D, 0xC7, 0xFE, 0x3F, 0xCA, 0x0, 0x3, 0x0, 0x27, 0xFF, 0xEC, 0x6, 0xA5, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x10, 0x0, 0x2E, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x26, 0x26, 0x1, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x1, 0x6, 0x6, 0x23, 0x22, 0x24, 0x27, 0x23, 0x3, 0x23, 0x13, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x15, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x4, 0xD6, 0x63, 0x7B, 0x11, 0x1, 0xCE, 0x4, 0x62, 0xFD, 0x9F, 0xE1, 0x65, 0x5D, 0x57, 0x5E, 0x4, 0x94, 0x34, 0xCC, 0xA1, 0xD3, 0xFE, 0xF5, 0x1E, 0xEB, 0xE8, 0xFD, 0xFF, 0xCF, 0xE8, 0xCE, 0x1, 0xB7, 0x78, 0x9B, 0xEC, 0xE2, 0xFD, 0x3D, 0xA, 0x95, 0x80, 0xA8, 0x68, 0x3, 0x8B, 0x8C, 0x7C, 0x12, 0x5F, 0x97, 0xFE, 0xB7, 0x1, 0x37, 0x65, 0x39, 0x38, 0x61, 0xFE, 0x76, 0x4C, 0x80, 0xEB, 0xB7, 0xFE, 0x72, 0x1, 0xB6, 0x57, 0xD3, 0x95, 0xC5, 0x42, 0x56, 0xFE, 0xD4, 0xEA, 0x67, 0x7D, 0xA5, 0x86, 0x0, 0x1, 0x0, 0x9B, 0x0, 0x0, 0x5, 0x26, 0x5, 0xB0, 0x0, 0x14, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x13, 0x27, 0x37, 0x17, 0x37, 0x21, 0x1, 0x17, 0x7, 0x27, 0x7, 0x1, 0x3, 0xEE, 0xFE, 0x12, 0x69, 0xFC, 0xFC, 0x5A, 0xE8, 0x96, 0x6F, 0x8D, 0x8A, 0x1, 0x39, 0xFE, 0xF8, 0xA9, 0x6E, 0xA2, 0xAC, 0x2, 0x3F, 0x2, 0x8B, 0xFD, 0x75, 0x5, 0xB0, 0xFD, 0x82, 0x1, 0x3A, 0x80, 0x82, 0x79, 0xBB, 0xFE, 0xA5, 0x91, 0x81, 0x8A, 0xE3, 0xFD, 0x16, 0x0, 0x1, 0x0, 0x8F, 0x0, 0x0, 0x4, 0x5E, 0x4, 0x3B, 0x0, 0x14, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x37, 0x27, 0x37, 0x17, 0x37, 0x21, 0x7, 0x17, 0x7, 0x27, 0x7, 0x1, 0x3, 0x2D, 0xFE, 0xCF, 0x7A, 0xF3, 0xF3, 0x6F, 0x89, 0x88, 0x6B, 0x81, 0x4C, 0x1, 0x1B, 0xB7, 0x9C, 0x6A, 0x96, 0x6B, 0x1, 0x9F, 0x1, 0xAD, 0xFE, 0x53, 0x4, 0x3A, 0xFE, 0x51, 0xBD, 0x70, 0x83, 0x6A, 0x69, 0xFA, 0x80, 0x84, 0x7B, 0x92, 0xFD, 0xDB, 0x0, 0x1, 0x0, 0x2D, 0xFE, 0x4B, 0x8, 0x32, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x3, 0x2, 0x2, 0x7, 0x23, 0x35, 0x37, 0x36, 0x36, 0x13, 0x13, 0x21, 0x11, 0x36, 0x33, 0x32, 0x4, 0x15, 0x11, 0x14, 0x6, 0x6, 0xCD, 0x45, 0x3A, 0xF, 0x32, 0x2D, 0x7A, 0x8F, 0x8C, 0x7A, 0x93, 0xFD, 0xFE, 0x43, 0x1B, 0x16, 0xC5, 0xE7, 0x4A, 0x31, 0x7B, 0x61, 0xD, 0x1B, 0x3, 0xAC, 0x95, 0xA4, 0xE4, 0x1, 0x7, 0xC0, 0xFE, 0x4B, 0x11, 0xCD, 0xD, 0xA5, 0x2, 0x7, 0x9B, 0x6D, 0x1D, 0xFD, 0x4D, 0x4, 0xE5, 0xFD, 0xCB, 0xFE, 0x8C, 0xFE, 0xC7, 0x3, 0xCA, 0x5, 0xE, 0xF4, 0x1, 0x2E, 0x2, 0xB1, 0xFD, 0xCF, 0x1C, 0xDA, 0xF9, 0xFD, 0xF9, 0xB6, 0xC0, 0x0, 0x1, 0x0, 0x22, 0xFE, 0x4B, 0x6, 0xA3, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x3, 0x2, 0x6, 0x7, 0x23, 0x27, 0x37, 0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x6, 0x5, 0x44, 0x45, 0x3B, 0xF, 0x27, 0x3C, 0x7A, 0x1, 0x6D, 0x68, 0x5F, 0x69, 0xF3, 0xFE, 0xCF, 0x15, 0x13, 0xAA, 0xAC, 0x4F, 0x1, 0x27, 0x5F, 0x44, 0xA, 0x14, 0x3, 0xA, 0x75, 0x79, 0xBD, 0xE4, 0xBA, 0xFE, 0x4B, 0x11, 0xBF, 0xD, 0xB0, 0x1, 0x8D, 0x76, 0x62, 0x19, 0xFD, 0xF6, 0x3, 0x76, 0xFE, 0x8B, 0xFE, 0xEB, 0xEA, 0x2, 0xCB, 0x3, 0x8, 0xC1, 0xD5, 0x1, 0xCE, 0xFE, 0x92, 0x1A, 0xC8, 0xD3, 0xFE, 0x76, 0xB6, 0xC0, 0x0, 0x1, 0x0, 0x9B, 0xFE, 0x4B, 0x8, 0x44, 0x5, 0xB0, 0x0, 0x22, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x4, 0x15, 0x11, 0x14, 0x6, 0x6, 0xDF, 0x45, 0x3A, 0xE, 0x32, 0x2D, 0x7B, 0x8A, 0x8C, 0x85, 0x8E, 0xFC, 0xFD, 0x74, 0xFC, 0xFC, 0x2, 0x8C, 0xFC, 0x87, 0x8C, 0xF5, 0x1, 0x1D, 0xC0, 0xFE, 0x4B, 0x11, 0xCD, 0xD, 0xA5, 0x2, 0x7, 0x9B, 0x6D, 0x1C, 0xFD, 0x4C, 0x2, 0x88, 0xFD, 0x78, 0x5, 0xB0, 0xFD, 0xA2, 0x2, 0x5E, 0xFD, 0xD0, 0x1B, 0xDA, 0xF9, 0xFD, 0xF9, 0xB6, 0xC0, 0x0, 0x1, 0x0, 0x86, 0xFE, 0x4B, 0x6, 0xA0, 0x4, 0x3A, 0x0, 0x22, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x6, 0x5, 0x41, 0x45, 0x3B, 0xF, 0x27, 0x3C, 0x7A, 0x1, 0x6A, 0x6B, 0x65, 0x63, 0xF3, 0xFE, 0x5B, 0xF3, 0xF3, 0x1, 0xA5, 0xF3, 0x64, 0x64, 0xD1, 0xF6, 0xBA, 0xFE, 0x4B, 0x11, 0xBF, 0xD, 0xB0, 0x1, 0x8D, 0x76, 0x62, 0x18, 0xFD, 0xF5, 0x1, 0xB5, 0xFE, 0x4B, 0x4, 0x3A, 0xFE, 0x3D, 0x1, 0xC3, 0xFE, 0x96, 0x16, 0xC8, 0xD3, 0xFE, 0x76, 0xB6, 0xC0, 0x0, 0x1, 0x0, 0x9B, 0xFE, 0x99, 0x5, 0xD6, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x25, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x5, 0xD6, 0xF2, 0xCC, 0xFD, 0x7F, 0xFC, 0x4, 0x7A, 0xB5, 0xFD, 0xE4, 0x1, 0x67, 0x4, 0xE5, 0xFB, 0x1B, 0x5, 0xB0, 0xFB, 0x5, 0x0, 0x1, 0x0, 0x86, 0xFE, 0x99, 0x4, 0xD7, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x25, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x4, 0xD7, 0xF3, 0xC4, 0xFE, 0x59, 0xF3, 0x3, 0x8D, 0xB5, 0xFD, 0xE4, 0x1, 0x67, 0x3, 0x76, 0xFC, 0x8A, 0x4, 0x3A, 0xFC, 0x7B, 0x0, 0x1, 0x0, 0x85, 0xFE, 0x99, 0x5, 0xB0, 0x5, 0xB0, 0x0, 0x15, 0x0, 0x0, 0x21, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x4, 0x17, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x26, 0x26, 0x23, 0x22, 0x7, 0x1, 0x81, 0xFC, 0xFC, 0xA2, 0xB0, 0xF4, 0x1, 0x1C, 0x2, 0xCB, 0xF3, 0xD4, 0x1, 0x89, 0x8C, 0xA7, 0xAB, 0x5, 0xB0, 0xFD, 0xC1, 0x2A, 0xD6, 0xF5, 0xFE, 0xE5, 0xFD, 0xE4, 0x1, 0x67, 0x1, 0xCE, 0x97, 0x6B, 0x2A, 0x0, 0x1, 0x0, 0x7A, 0xFE, 0x99, 0x4, 0xBD, 0x6, 0x0, 0x0, 0x15, 0x0, 0x0, 0x25, 0x11, 0x23, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x4, 0xBD, 0xF2, 0xC5, 0x62, 0x5D, 0x91, 0x4A, 0xF2, 0xF2, 0x78, 0xB5, 0x9F, 0xC0, 0x1, 0xB5, 0xFD, 0xE4, 0x1, 0x67, 0x2, 0xBB, 0x71, 0x5C, 0x81, 0xFC, 0xF9, 0x6, 0x0, 0xFD, 0xC3, 0x8B, 0xB6, 0xDA, 0xFD, 0xF7, 0x0, 0x1, 0x0, 0xD, 0xFE, 0x4B, 0x5, 0x78, 0x5, 0xB0, 0x0, 0x14, 0x0, 0x0, 0x13, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x14, 0x6, 0x8C, 0x45, 0x3A, 0xE, 0x32, 0x2D, 0x7B, 0xFC, 0x2, 0x8B, 0xFC, 0xFC, 0xFD, 0x75, 0xC1, 0xFE, 0x4B, 0x11, 0xCD, 0xD, 0xA5, 0x5, 0xEF, 0xFD, 0xA2, 0x2, 0x5E, 0xFA, 0x50, 0x2, 0x88, 0xFD, 0x39, 0xB6, 0xC0, 0x0, 0x1, 0x0, 0xD, 0xFE, 0x4B, 0x4, 0x84, 0x4, 0x3A, 0x0, 0x14, 0x0, 0x0, 0x13, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x6, 0x6, 0x8C, 0x45, 0x3A, 0xE, 0x26, 0x3D, 0x7A, 0x1, 0xF3, 0x1, 0xA5, 0xF3, 0xF3, 0xFE, 0x5B, 0x1, 0xBB, 0xFE, 0x4B, 0x11, 0xC5, 0xC, 0xA9, 0x4, 0x7C, 0xFE, 0x3D, 0x1, 0xC3, 0xFB, 0xC6, 0x1, 0xB5, 0xFE, 0x8, 0xB4, 0xBE, 0x0, 0x2, 0x0, 0x24, 0xFE, 0x9A, 0xA, 0xCF, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x25, 0x0, 0x0, 0x25, 0x21, 0x11, 0x21, 0x3, 0x2, 0x1, 0x11, 0x21, 0x11, 0x23, 0x3, 0x33, 0x36, 0x12, 0x13, 0x13, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x3, 0x1, 0xB7, 0x2, 0x70, 0xFE, 0x57, 0x18, 0x1D, 0x2, 0x96, 0xFC, 0x41, 0xF3, 0x9, 0x76, 0x36, 0x84, 0x14, 0x26, 0x3, 0x96, 0x1, 0x27, 0xFD, 0x8A, 0x1, 0xAC, 0x1, 0x32, 0xFE, 0x6, 0x2, 0x19, 0xFE, 0xD4, 0xFE, 0x4A, 0xA5, 0xFD, 0xFE, 0xD9, 0xB8, 0xD, 0xCA, 0x4, 0x1B, 0xFE, 0x55, 0xFE, 0x6F, 0xFC, 0xF1, 0x1, 0x66, 0xFE, 0x9A, 0x2, 0x30, 0x34, 0x1, 0x19, 0x1, 0x27, 0x2, 0x72, 0xFD, 0x98, 0x2, 0x68, 0xFD, 0x98, 0x2, 0x68, 0xFD, 0x4C, 0xFD, 0x4, 0x2, 0x76, 0xFD, 0x8A, 0x2, 0x76, 0xFE, 0x54, 0xFD, 0xD0, 0x0, 0x2, 0x0, 0x27, 0xFE, 0xBE, 0x8, 0xFC, 0x4, 0x3A, 0x0, 0x5, 0x0, 0x25, 0x0, 0x0, 0x25, 0x21, 0x11, 0x21, 0x7, 0x2, 0x3, 0x11, 0x23, 0x11, 0x33, 0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x15, 0x33, 0x11, 0x23, 0x11, 0x1, 0x9E, 0x1, 0x9F, 0xFE, 0xEF, 0x5, 0xE, 0xFB, 0xF7, 0x5A, 0x54, 0x58, 0x7, 0xC, 0x2, 0xF0, 0xF6, 0xF3, 0x6B, 0x1, 0x2B, 0x1, 0x2C, 0xFE, 0x79, 0x1, 0xA8, 0xFE, 0xC4, 0xFE, 0xD4, 0x7B, 0xF3, 0xF6, 0x96, 0xF3, 0xC3, 0x2, 0xA6, 0xB6, 0xFE, 0xC4, 0xFE, 0x89, 0xFE, 0xBE, 0x2, 0x5, 0x5E, 0xC9, 0xCD, 0x1, 0x83, 0xFE, 0x51, 0x1, 0xAF, 0xFE, 0x51, 0x1, 0xAF, 0xFD, 0xFA, 0xFD, 0xCC, 0x1, 0xAD, 0xFE, 0x53, 0x1, 0xAD, 0xEA, 0xFD, 0xFB, 0x1, 0x42, 0x0, 0x3, 0x0, 0x3A, 0xFE, 0x9A, 0x5, 0xF2, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x7, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x7, 0x3, 0x21, 0x11, 0x13, 0x11, 0x21, 0x11, 0x23, 0x3, 0x33, 0x13, 0x26, 0x3, 0x11, 0x33, 0x11, 0x14, 0x17, 0x1, 0x21, 0x11, 0x33, 0x3, 0x4, 0x3D, 0x66, 0xFE, 0xEB, 0x6C, 0xB1, 0x2, 0x98, 0xB8, 0xFC, 0x41, 0xF4, 0x8, 0x51, 0xD6, 0xEC, 0x7, 0xFD, 0x61, 0x1, 0x82, 0x1, 0xEB, 0xB9, 0xD, 0x2, 0xE0, 0x2, 0x5, 0xFD, 0xFB, 0xCA, 0xFE, 0xB4, 0x1, 0x4B, 0xFC, 0x85, 0x1, 0x66, 0xFE, 0x9A, 0x2, 0x30, 0x1, 0x7C, 0x62, 0x1, 0x2C, 0x1, 0xDC, 0xFE, 0x37, 0xAE, 0x36, 0x2, 0xAD, 0xFB, 0x1A, 0xFD, 0xD0, 0x0, 0x3, 0x0, 0x2B, 0xFE, 0xBE, 0x4, 0xC9, 0x4, 0x3A, 0x0, 0x3, 0x0, 0x8, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x23, 0x3, 0x33, 0x5, 0x7, 0x21, 0x35, 0x21, 0x3, 0x11, 0x23, 0x11, 0x33, 0x37, 0x26, 0x27, 0x11, 0x33, 0x11, 0x14, 0x17, 0x1, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x3, 0x41, 0x1F, 0xD1, 0xF0, 0xFE, 0x9B, 0x6A, 0x1, 0xCF, 0xFE, 0xC2, 0xE2, 0xF6, 0x3A, 0x97, 0xA4, 0x2, 0xE8, 0x31, 0x1, 0x3F, 0x1, 0x85, 0x96, 0xF2, 0x3, 0x69, 0xFE, 0xB8, 0xB8, 0xA6, 0xA4, 0xFE, 0x99, 0xFE, 0xBE, 0x2, 0x5, 0xE6, 0x64, 0xF0, 0x1, 0x3D, 0xFE, 0xC9, 0x76, 0x36, 0x1, 0xE3, 0xFC, 0x89, 0xFD, 0xFB, 0x1, 0x42, 0x0, 0x1, 0x0, 0x2D, 0xFE, 0x99, 0x5, 0xCF, 0x5, 0xB0, 0x0, 0x13, 0x0, 0x0, 0x1, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x3, 0x2, 0x2, 0x7, 0x23, 0x35, 0x37, 0x36, 0x36, 0x13, 0x1, 0x62, 0x3, 0xAC, 0xC1, 0xF3, 0xCB, 0xFE, 0x42, 0x1A, 0x16, 0xC5, 0xE7, 0x4A, 0x31, 0x7B, 0x61, 0xD, 0x5, 0xB0, 0xFB, 0x5, 0xFD, 0xE4, 0x1, 0x67, 0x4, 0xE5, 0xFD, 0xCB, 0xFE, 0x8C, 0xFE, 0xC7, 0x3, 0xCA, 0x5, 0xE, 0xF4, 0x1, 0x2E, 0x0, 0x1, 0x0, 0x22, 0xFE, 0x99, 0x4, 0xD8, 0x4, 0x3A, 0x0, 0x13, 0x0, 0x0, 0x1, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x3, 0x2, 0x6, 0x7, 0x23, 0x27, 0x37, 0x36, 0x36, 0x37, 0x1, 0xA, 0x3, 0xA, 0xC4, 0xF2, 0xC5, 0xFE, 0xCF, 0x15, 0x13, 0xAA, 0xAC, 0x4F, 0x1, 0x27, 0x5F, 0x44, 0xA, 0x4, 0x3A, 0xFC, 0x7B, 0xFD, 0xE4, 0x1, 0x67, 0x3, 0x76, 0xFE, 0x8B, 0xFE, 0xEB, 0xEA, 0x2, 0xCB, 0x3, 0x8, 0xC1, 0xD5, 0x0, 0x1, 0xFB, 0x6C, 0x4, 0xE1, 0x0, 0x1D, 0x6, 0x1, 0x0, 0xE, 0x0, 0x0, 0x1, 0x7, 0x23, 0x35, 0x1, 0x33, 0x17, 0x37, 0x33, 0x1, 0x15, 0x23, 0x27, 0x7, 0x23, 0xFC, 0xC2, 0x95, 0xC1, 0x1, 0xF, 0x8F, 0xB9, 0xBA, 0x8F, 0x1, 0x11, 0xC3, 0x96, 0x95, 0xD7, 0x5, 0x7D, 0x9C, 0xD, 0x1, 0x13, 0xBE, 0xBE, 0xFE, 0xEB, 0xB, 0x9C, 0x9C, 0x0, 0x4, 0xFB, 0xAF, 0x4, 0xC4, 0xFF, 0xC1, 0x6, 0x60, 0x0, 0x9, 0x0, 0x15, 0x0, 0x1F, 0x0, 0x2B, 0x0, 0x0, 0x0, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x5, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0xFC, 0xDB, 0x7F, 0x5F, 0x5E, 0x7F, 0x7F, 0x5E, 0x5F, 0x7F, 0x6D, 0x3F, 0x32, 0x31, 0x3F, 0x3F, 0x31, 0x32, 0x3F, 0xFE, 0x67, 0x43, 0x7C, 0x45, 0x45, 0x7C, 0x43, 0x3, 0xE, 0x44, 0x3E, 0x3D, 0x45, 0x45, 0x3D, 0x3E, 0x44, 0x5, 0xE6, 0x7A, 0x7A, 0xAC, 0x76, 0x76, 0x56, 0x2B, 0x44, 0x43, 0x2C, 0x2E, 0x44, 0x44, 0x6F, 0x32, 0x44, 0x44, 0x32, 0x31, 0x45, 0x45, 0x2F, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x0, 0x3, 0xFB, 0xD1, 0x4, 0x60, 0xFF, 0x9F, 0x6, 0x9D, 0x0, 0x19, 0x0, 0x25, 0x0, 0x31, 0x0, 0x0, 0x1, 0x22, 0x26, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x27, 0x32, 0x37, 0x35, 0x34, 0x23, 0x22, 0x6, 0x7, 0x15, 0x16, 0x16, 0x21, 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, 0x23, 0x22, 0x7, 0x15, 0x14, 0xFE, 0xA7, 0x52, 0x7A, 0x23, 0x23, 0x79, 0x52, 0x74, 0x85, 0x85, 0x73, 0x52, 0x7A, 0x23, 0x23, 0x7B, 0x52, 0x72, 0x85, 0x85, 0x73, 0x6F, 0x3, 0x71, 0x4E, 0x5B, 0x7, 0x6, 0x5C, 0xFE, 0x70, 0x4C, 0x5C, 0x6, 0x6, 0x5B, 0x4E, 0x73, 0x2, 0x4, 0x60, 0x60, 0x3B, 0x3B, 0x60, 0x9D, 0x73, 0x1D, 0x73, 0x9D, 0x5E, 0x3A, 0x3A, 0x5E, 0x9D, 0x73, 0x1D, 0x73, 0x9D, 0x71, 0x97, 0x25, 0x9F, 0x86, 0x1D, 0x11, 0x1D, 0x8A, 0x8A, 0x1D, 0x11, 0x1D, 0x86, 0x9A, 0x22, 0x9F, 0x0, 0x1, 0xFC, 0x8A, 0x4, 0x86, 0xFE, 0xE6, 0x7, 0x2E, 0x0, 0x8, 0x0, 0x0, 0x1, 0x1, 0x35, 0x17, 0x11, 0x33, 0x11, 0x37, 0x15, 0xFD, 0xB8, 0xFE, 0xD2, 0xE3, 0x97, 0xE2, 0x4, 0x86, 0x1, 0x2D, 0xC3, 0xE2, 0x1, 0x9A, 0xFE, 0x67, 0xE1, 0xC3, 0xFF, 0xFF, 0xFC, 0x25, 0x4, 0xA7, 0xFF, 0x14, 0x6, 0xCB, 0x0, 0x27, 0x1, 0xD4, 0xFF, 0xA, 0x6, 0x14, 0x0, 0x27, 0x1, 0xD4, 0x0, 0xE5, 0x6, 0x14, 0x0, 0x7, 0x1, 0xD4, 0xFF, 0xF7, 0x7, 0x40, 0x0, 0x2, 0xFB, 0xA6, 0xFD, 0xD8, 0x0, 0x6, 0xFF, 0x7F, 0x0, 0xB, 0x0, 0x17, 0x0, 0x0, 0x5, 0x17, 0x37, 0x33, 0x7, 0x17, 0x23, 0x27, 0x7, 0x23, 0x37, 0x27, 0x21, 0x17, 0x37, 0x33, 0x7, 0x17, 0x23, 0x27, 0x7, 0x23, 0x37, 0x27, 0xFE, 0xA6, 0x5B, 0x5C, 0xA3, 0xA2, 0xA8, 0xA3, 0x61, 0x61, 0xA3, 0xA8, 0xA2, 0xFE, 0x4A, 0x5B, 0x5C, 0xA3, 0xA2, 0xA8, 0xA3, 0x61, 0x61, 0xA3, 0xA8, 0xA2, 0x81, 0x7D, 0x7D, 0xD0, 0xD7, 0x84, 0x84, 0xD7, 0xD0, 0x7D, 0x7D, 0xD0, 0xD7, 0x84, 0x84, 0xD7, 0xD0, 0x0, 0x1, 0xFB, 0x4C, 0xFE, 0x94, 0x0, 0x25, 0xFF, 0x8B, 0x0, 0x26, 0x0, 0x0, 0x5, 0x32, 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x6, 0x23, 0x22, 0x26, 0x26, 0x27, 0x23, 0x22, 0x6, 0x6, 0x22, 0x26, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x32, 0x36, 0x33, 0x32, 0x16, 0xFE, 0x86, 0x37, 0x50, 0x55, 0x45, 0x6B, 0x13, 0x7D, 0x1A, 0x3B, 0x2B, 0x34, 0x3C, 0x32, 0x34, 0x3B, 0x33, 0x27, 0x4, 0x2B, 0x34, 0x3C, 0x66, 0x3B, 0x35, 0x2A, 0x39, 0x1C, 0x7D, 0x13, 0x6E, 0x47, 0x51, 0x4F, 0x6E, 0x4B, 0x4C, 0x4B, 0x4A, 0xCF, 0x5A, 0x6A, 0x4E, 0x33, 0x4D, 0x2D, 0x2C, 0x2C, 0x2C, 0x1, 0x2D, 0x2C, 0x2C, 0x2D, 0x4B, 0x33, 0x4D, 0x69, 0x5A, 0x5A, 0x5A, 0x0, 0x1, 0xFD, 0x5B, 0xFD, 0xD5, 0xFE, 0xBD, 0xFF, 0x9C, 0x0, 0xB, 0x0, 0x0, 0x5, 0x33, 0x15, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x23, 0x22, 0x3, 0xFD, 0x5B, 0xB4, 0x4, 0x70, 0x1F, 0x1B, 0x30, 0x36, 0xF7, 0x5, 0x64, 0xC5, 0x68, 0x7, 0x93, 0xE, 0x1, 0x2, 0xFF, 0xFF, 0xFC, 0x76, 0xFD, 0xD5, 0xFF, 0x3D, 0xFF, 0x9C, 0x0, 0x27, 0x3, 0x27, 0xFF, 0x1B, 0x0, 0x0, 0x0, 0x7, 0x3, 0x27, 0x0, 0x80, 0x0, 0x0, 0x0, 0x1, 0xFD, 0x5B, 0xFE, 0x18, 0xFF, 0x38, 0x0, 0x96, 0x0, 0x3, 0x0, 0x0, 0x27, 0x1, 0x27, 0x1, 0xC8, 0xFE, 0xA1, 0x7E, 0x1, 0x64, 0x4B, 0xFD, 0xCD, 0x49, 0x2, 0x35, 0x0, 0x1, 0xFD, 0x57, 0xFE, 0x10, 0xFF, 0x3F, 0x0, 0x96, 0x0, 0xD, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x13, 0x17, 0x3, 0x16, 0x15, 0x14, 0x6, 0xFD, 0xD2, 0x33, 0x48, 0x43, 0x31, 0xFC, 0x78, 0xFA, 0x9, 0x48, 0xFE, 0x10, 0x48, 0x33, 0x32, 0x47, 0x3, 0x1, 0x8F, 0x4B, 0xFE, 0x70, 0x17, 0x19, 0x33, 0x48, 0x0, 0x2, 0xFB, 0xAA, 0x5, 0x2, 0xFF, 0xDD, 0x6, 0xAF, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xDE, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFD, 0x8, 0x39, 0x81, 0x81, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x5, 0x2, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6C, 0x10, 0x10, 0x6C, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x4, 0xFA, 0xED, 0x5, 0x2, 0x0, 0xB0, 0x6, 0xAF, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x29, 0x0, 0x37, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x7, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xB, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFE, 0xFE, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFD, 0x9, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0xD6, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0x5, 0x2, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6C, 0x10, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6C, 0x10, 0x10, 0x6C, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x4A, 0x10, 0x6C, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x2, 0xFB, 0x9D, 0xFD, 0xE3, 0xFF, 0xD0, 0xFF, 0x90, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xEB, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFD, 0x8, 0x39, 0x81, 0x81, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0xFD, 0xE3, 0x49, 0x11, 0x3F, 0x3F, 0x3B, 0x3D, 0x11, 0x4C, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x59, 0x6D, 0xF, 0x4C, 0x11, 0x3F, 0x39, 0x3F, 0x3F, 0x11, 0x0, 0x2, 0xFA, 0xEF, 0x1, 0x77, 0x0, 0xA0, 0x3, 0x25, 0x0, 0xC, 0x0, 0x19, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x15, 0x14, 0x16, 0x17, 0x1A, 0xE, 0x22, 0x3F, 0x3E, 0x23, 0xE, 0x39, 0x81, 0x81, 0xFB, 0x8B, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x62, 0x3F, 0x23, 0x1, 0x77, 0x4A, 0x11, 0x3E, 0x40, 0x3B, 0x3E, 0x10, 0x4C, 0xF, 0x6B, 0xB8, 0x6C, 0x10, 0x10, 0x6C, 0x5C, 0x5A, 0x6D, 0xF, 0x4C, 0x2D, 0x5C, 0x3F, 0x3F, 0x11, 0x0, 0x2, 0x0, 0x8, 0x0, 0x0, 0x4, 0x98, 0x4, 0x3A, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x1, 0x2, 0xF6, 0xA6, 0xA5, 0x1, 0xF0, 0x59, 0xFE, 0x1D, 0x59, 0xFE, 0x1, 0xCD, 0xF7, 0x1, 0xCC, 0x1, 0x99, 0x1, 0x9A, 0xFE, 0x66, 0xFE, 0x67, 0xDC, 0xDC, 0x4, 0x3A, 0xFB, 0xC6, 0x0, 0x2, 0xFF, 0xF0, 0x0, 0x0, 0x6, 0x4, 0x4, 0x3A, 0x0, 0x2, 0x0, 0x12, 0x0, 0x0, 0x1, 0x3, 0x1, 0x1, 0x27, 0x21, 0x7, 0x21, 0x1, 0x21, 0x15, 0x21, 0x17, 0x21, 0x15, 0x21, 0x13, 0x21, 0x15, 0x2, 0xEF, 0x14, 0xFE, 0xFA, 0x1, 0x2B, 0x9, 0xFE, 0x76, 0x78, 0xFE, 0xFB, 0x2, 0x6F, 0x3, 0x77, 0xFD, 0xF6, 0xA, 0x1, 0xC3, 0xFE, 0x45, 0xC, 0x2, 0x1A, 0x1, 0x9D, 0x1, 0xE1, 0xFE, 0x1F, 0xFE, 0x63, 0xDC, 0xDC, 0x4, 0x3A, 0xC1, 0xE4, 0xC1, 0xFE, 0xED, 0xC1, 0x0, 0x3, 0x0, 0x3D, 0xFF, 0xEC, 0x6, 0x79, 0x4, 0x50, 0x0, 0xA, 0x0, 0x12, 0x0, 0x3C, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x1, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, 0x16, 0x5, 0x22, 0x27, 0x6, 0x27, 0x22, 0x2, 0x35, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x23, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x4, 0xD2, 0x3F, 0x85, 0x2B, 0xBD, 0x71, 0x76, 0x58, 0xFC, 0xD0, 0x6C, 0x77, 0xE, 0xFE, 0x3D, 0x60, 0x3, 0xB, 0xE1, 0x6D, 0x82, 0xC9, 0xD9, 0xE9, 0x2, 0xB7, 0x9, 0x8D, 0x92, 0x70, 0x8B, 0x36, 0x48, 0x29, 0xC7, 0x98, 0xFC, 0x8D, 0x35, 0xCC, 0x9C, 0xB6, 0xC2, 0xEF, 0xE8, 0xBF, 0x5F, 0x58, 0x5F, 0x6F, 0xF2, 0xF7, 0x3, 0x97, 0x3E, 0x29, 0xD0, 0x65, 0x42, 0x3E, 0x52, 0xFD, 0x19, 0x96, 0x73, 0x1E, 0x62, 0x89, 0xC3, 0x84, 0x85, 0x1, 0x1, 0x8, 0xE2, 0x8D, 0x7F, 0xAA, 0x3D, 0x1F, 0xA6, 0x20, 0x59, 0xA2, 0x3E, 0x64, 0xB5, 0x98, 0x9D, 0xAD, 0x47, 0x5A, 0x68, 0x5C, 0x3F, 0x13, 0x8F, 0xBC, 0x0, 0x3, 0x0, 0x1B, 0x0, 0x0, 0x4, 0xF3, 0x4, 0x3A, 0x0, 0x6, 0x0, 0xD, 0x0, 0x21, 0x0, 0x0, 0x1, 0x15, 0x33, 0x32, 0x35, 0x34, 0x27, 0x3, 0x11, 0x21, 0x32, 0x35, 0x34, 0x27, 0x1, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x7, 0x33, 0x15, 0x23, 0x16, 0x15, 0x14, 0x6, 0x23, 0x1, 0xCA, 0xC9, 0xCF, 0xCA, 0xCE, 0x1, 0xA, 0xBC, 0xB4, 0xFD, 0xFB, 0xBC, 0xBC, 0x1, 0xB8, 0xD1, 0xF4, 0x3B, 0xDA, 0xA7, 0x37, 0xE3, 0xCC, 0x3, 0x79, 0xFE, 0x7B, 0x80, 0x3, 0xFE, 0x54, 0xFE, 0xF4, 0x85, 0x84, 0x3, 0xFE, 0x33, 0x1, 0xCD, 0xAE, 0x1, 0xBF, 0x92, 0x9A, 0x54, 0x3F, 0xAE, 0x40, 0x58, 0x9A, 0x9B, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xEF, 0x4, 0x1A, 0x4, 0x4E, 0x0, 0x19, 0x0, 0x0, 0x1, 0x33, 0x6, 0x4, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x32, 0x36, 0x3, 0x26, 0xF3, 0xF, 0xFF, 0x0, 0xCD, 0xD5, 0xFE, 0xE8, 0x1, 0x18, 0xD5, 0xD2, 0xFC, 0xF, 0xF3, 0x1D, 0xCD, 0x71, 0x8A, 0x8A, 0xE2, 0x69, 0x1, 0x94, 0xD3, 0xD2, 0x1, 0x12, 0xE0, 0x7C, 0xE0, 0x1, 0x11, 0xD1, 0xD1, 0xE1, 0xAA, 0x85, 0x7D, 0x85, 0xAC, 0x6E, 0x0, 0x2, 0x0, 0x86, 0x0, 0x0, 0x4, 0x3A, 0x4, 0x3A, 0x0, 0x9, 0x0, 0x13, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x1, 0x11, 0x21, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x23, 0x1, 0x78, 0xC5, 0x72, 0x98, 0x98, 0x72, 0xFE, 0x49, 0x1, 0xB7, 0xD7, 0x1, 0x26, 0xFE, 0xDA, 0xD7, 0x3, 0x79, 0xFD, 0x48, 0xA3, 0x79, 0x80, 0x7A, 0xA2, 0xFC, 0x87, 0x4, 0x3A, 0xFE, 0xF6, 0xD4, 0x7F, 0xD4, 0xFE, 0xF7, 0xFF, 0xFF, 0x0, 0x2D, 0x0, 0x0, 0x4, 0x9E, 0x4, 0x3A, 0x0, 0x26, 0x3, 0x34, 0x64, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x9D, 0xFF, 0x38, 0x0, 0x1, 0x0, 0x86, 0x0, 0x0, 0x3, 0xC6, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x86, 0x3, 0x40, 0xFD, 0xB2, 0x1, 0xF8, 0xFE, 0x8, 0x2, 0x4E, 0x4, 0x3A, 0xC1, 0xE2, 0xC2, 0xFE, 0xEC, 0xC1, 0xFF, 0xFF, 0x0, 0x4E, 0xFF, 0xEC, 0x3, 0xC4, 0x4, 0x4D, 0x0, 0x6, 0x2, 0x85, 0x0, 0x0, 0x0, 0x2, 0x0, 0x7A, 0xFE, 0x65, 0x1, 0x8D, 0x4, 0x3A, 0x0, 0x3, 0x0, 0xF, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0x7C, 0xF3, 0xF, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0x4, 0x3A, 0xFB, 0xC6, 0x4, 0x3A, 0xFA, 0xAE, 0x37, 0x4B, 0x4B, 0x37, 0x38, 0x4B, 0x4B, 0x0, 0x1, 0x0, 0x1A, 0xFF, 0xEE, 0x3, 0x78, 0x4, 0x3A, 0x0, 0xF, 0x0, 0x0, 0x1, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x2, 0x86, 0xF2, 0xEF, 0xB6, 0xC4, 0xF5, 0xF3, 0x70, 0x56, 0x4D, 0x66, 0x4, 0x3A, 0xFD, 0x38, 0xB2, 0xD2, 0xB9, 0xBB, 0x5D, 0x56, 0x6B, 0x58, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x4, 0x53, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x3, 0x1E, 0xFE, 0xC6, 0x6E, 0xF2, 0xF2, 0x55, 0x1, 0x42, 0x1, 0x2C, 0xFE, 0x69, 0x1, 0xB1, 0x1, 0xAE, 0xFE, 0x52, 0x4, 0x3A, 0xFE, 0x4C, 0x1, 0xB4, 0xFD, 0xFF, 0xFD, 0xC7, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x3, 0x92, 0x4, 0x3A, 0x0, 0xD, 0x0, 0x0, 0x33, 0x11, 0x7, 0x35, 0x37, 0x11, 0x33, 0x11, 0x37, 0x15, 0x7, 0x11, 0x21, 0x15, 0xA7, 0x7A, 0x7A, 0xF2, 0xFE, 0xFE, 0x1, 0xF9, 0x1, 0xF2, 0x25, 0xB8, 0x25, 0x1, 0x90, 0xFE, 0xB9, 0x4D, 0xB8, 0x4D, 0xFE, 0x86, 0xC1, 0x0, 0x1, 0x0, 0x86, 0x0, 0x0, 0x5, 0x66, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x11, 0x23, 0x11, 0x21, 0x1, 0x1, 0x21, 0x11, 0x23, 0x11, 0x1, 0x2, 0xA3, 0xFE, 0xD5, 0xF2, 0x1, 0x32, 0x1, 0x3E, 0x1, 0x40, 0x1, 0x30, 0xF3, 0xFE, 0xD5, 0x2, 0xD2, 0xFD, 0x2E, 0x4, 0x3A, 0xFC, 0xF1, 0x3, 0xF, 0xFB, 0xC6, 0x2, 0xCF, 0xFD, 0x31, 0xFF, 0xFF, 0x0, 0x85, 0x0, 0x0, 0x4, 0x12, 0x4, 0x3A, 0x0, 0x6, 0x2, 0x86, 0xFF, 0x0, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEE, 0x4, 0x4E, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x14, 0x0, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x0, 0x15, 0x27, 0x34, 0x26, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x4, 0x4E, 0xFE, 0xE5, 0xE3, 0xE2, 0xFE, 0xE2, 0x1, 0x1C, 0xE2, 0xE3, 0x1, 0x1D, 0xF3, 0x8F, 0xFC, 0x8D, 0x8E, 0x7F, 0x7E, 0x8D, 0x1, 0xE7, 0xE0, 0xFE, 0xE7, 0x1, 0x19, 0xE0, 0x70, 0xE0, 0x1, 0x17, 0xFE, 0xE9, 0xE0, 0x1, 0x8B, 0xAA, 0xAA, 0x8B, 0x71, 0x8B, 0xAD, 0xAD, 0x8B, 0x0, 0x1, 0x0, 0x3B, 0xFF, 0xEC, 0x3, 0xE1, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x2, 0x23, 0x22, 0x24, 0x3B, 0xE5, 0x5, 0x7A, 0x58, 0x95, 0x62, 0x62, 0x95, 0x63, 0x6F, 0x5, 0xE5, 0x5, 0xF1, 0xC4, 0xF7, 0xF3, 0x2, 0xF3, 0xFA, 0xB4, 0xFF, 0x0, 0x1, 0x66, 0x4F, 0x68, 0xD9, 0x83, 0x24, 0x81, 0xDB, 0x7D, 0x57, 0xB3, 0xE4, 0xFE, 0xC4, 0xDD, 0x2A, 0xDF, 0xFE, 0xC0, 0xDD, 0x0, 0x2, 0x0, 0x50, 0x0, 0x26, 0x4, 0xB2, 0x4, 0x14, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x22, 0x0, 0x35, 0x34, 0x0, 0x33, 0x33, 0x32, 0x0, 0x15, 0x14, 0x0, 0x7, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x2, 0x77, 0xEB, 0xFE, 0xC4, 0x1, 0x3C, 0xEC, 0x14, 0xEC, 0x1, 0x3A, 0xFE, 0xCE, 0xE7, 0xD, 0x92, 0xD1, 0xCE, 0x91, 0x19, 0x8F, 0xD5, 0xD5, 0x8F, 0x26, 0x1, 0xB, 0xEB, 0xEF, 0x1, 0x9, 0xFE, 0xF7, 0xED, 0xEA, 0xFE, 0xF6, 0x4, 0xF3, 0x7D, 0x88, 0x86, 0x7D, 0x1, 0x7D, 0x89, 0x87, 0x7C, 0x0, 0x1, 0x0, 0x50, 0x0, 0x4A, 0x4, 0xB2, 0x3, 0xF0, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x14, 0x16, 0x17, 0x15, 0x26, 0x2, 0x35, 0x34, 0x24, 0x37, 0x33, 0x32, 0x4, 0x15, 0x14, 0x6, 0x7, 0x35, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x22, 0x6, 0x1, 0x13, 0x68, 0x4F, 0x9D, 0xDD, 0x1, 0x3C, 0xDD, 0x2A, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x83, 0xD9, 0x2, 0x5, 0x58, 0x79, 0x5, 0xE5, 0x5, 0x1, 0x0, 0xB4, 0xF8, 0xF3, 0x2, 0xF4, 0xF8, 0xC4, 0xF1, 0x5, 0xE5, 0x5, 0x6F, 0x63, 0x95, 0x62, 0x62, 0x0, 0x3, 0x0, 0x25, 0x0, 0x26, 0x5, 0x6A, 0x4, 0x14, 0x0, 0x8, 0x0, 0x11, 0x0, 0x27, 0x0, 0x0, 0x1, 0x22, 0x7, 0x1, 0x36, 0x35, 0x34, 0x26, 0x27, 0x3, 0x32, 0x37, 0x1, 0x6, 0x15, 0x14, 0x16, 0x33, 0x5, 0x27, 0x6, 0x5, 0x23, 0x22, 0x0, 0x35, 0x34, 0x37, 0x27, 0x35, 0x17, 0x36, 0x25, 0x33, 0x32, 0x0, 0x15, 0x14, 0x7, 0x17, 0x2, 0xB7, 0x99, 0x60, 0x2, 0x5E, 0x13, 0xCE, 0x91, 0x4, 0x99, 0x5E, 0xFD, 0xA3, 0x13, 0xD5, 0x8F, 0x2, 0xB3, 0xD7, 0x94, 0xFE, 0xD9, 0x21, 0xEB, 0xFE, 0xC4, 0x20, 0x8B, 0xC9, 0x94, 0x1, 0x29, 0x21, 0xEC, 0x1, 0x3A, 0x20, 0x98, 0x3, 0x22, 0x3E, 0xFE, 0xD6, 0x2D, 0x37, 0x86, 0x7D, 0x1, 0xFD, 0xF7, 0x3C, 0x1, 0x29, 0x2C, 0x36, 0x87, 0x7C, 0x94, 0x6A, 0xC5, 0x4, 0x1, 0xB, 0xEB, 0x66, 0x56, 0x44, 0x91, 0x63, 0xC6, 0x4, 0xFE, 0xF7, 0xED, 0x66, 0x57, 0x4B, 0x0, 0x3, 0x0, 0x4C, 0xFF, 0xEC, 0x6, 0xE3, 0x4, 0x50, 0x0, 0xD, 0x0, 0x15, 0x0, 0x37, 0x0, 0x0, 0x1, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x1, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, 0x16, 0x5, 0x22, 0x26, 0x27, 0x6, 0x6, 0x27, 0x22, 0x2, 0x35, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x5, 0xF1, 0x76, 0x89, 0x87, 0x76, 0x77, 0x88, 0x87, 0x76, 0xFC, 0x1F, 0x5B, 0x74, 0x12, 0xFE, 0x4B, 0x64, 0x3, 0x54, 0x7F, 0xC1, 0x3F, 0x40, 0xB8, 0x6D, 0xE2, 0xE2, 0x2, 0xAA, 0xA, 0x87, 0x80, 0x6B, 0x8D, 0x37, 0x4F, 0x35, 0xC6, 0x91, 0x7E, 0xC4, 0x41, 0x3F, 0xC0, 0x7D, 0xEE, 0x1, 0x3, 0xFE, 0xFD, 0x2, 0x29, 0x92, 0xD2, 0xD2, 0x93, 0x14, 0x8F, 0xD5, 0xD5, 0x8F, 0xFE, 0x9C, 0x93, 0x6F, 0x19, 0x60, 0x89, 0xC3, 0x5E, 0x52, 0x53, 0x5E, 0x1, 0x1, 0xF, 0xD9, 0x8F, 0x7C, 0xAD, 0x36, 0x26, 0x9E, 0x2F, 0x52, 0x5D, 0x52, 0x52, 0x5D, 0xFE, 0xC5, 0xEC, 0x15, 0xEB, 0xFE, 0xC4, 0x0, 0x2, 0x0, 0x4F, 0xFF, 0xEC, 0x3, 0x97, 0x4, 0x4E, 0x0, 0x16, 0x0, 0x20, 0x0, 0x0, 0x4, 0x26, 0x35, 0x35, 0x34, 0x37, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x14, 0x7, 0x16, 0x15, 0x15, 0x14, 0x6, 0x1, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x6, 0x1, 0x3F, 0xF0, 0x9B, 0x9B, 0xF3, 0x49, 0x68, 0x66, 0x4A, 0xF4, 0x9B, 0x9B, 0xEE, 0xFE, 0x9A, 0xB1, 0x5F, 0x51, 0x52, 0xBE, 0x51, 0x14, 0xD9, 0xC9, 0x10, 0xD1, 0x7D, 0x8B, 0xD7, 0x6E, 0x98, 0x98, 0x6E, 0xD6, 0x8B, 0x7D, 0xD2, 0x10, 0xC9, 0xD9, 0x1, 0xA2, 0xDF, 0x77, 0x78, 0x65, 0x82, 0x7E, 0x0, 0x1, 0x0, 0x4F, 0x2, 0x1D, 0x4, 0x4D, 0x4, 0x4E, 0x0, 0x11, 0x0, 0x0, 0x1, 0x23, 0x35, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x23, 0x35, 0x36, 0x0, 0x33, 0x32, 0x0, 0x15, 0x4, 0x4D, 0xF3, 0x2, 0x8E, 0x7D, 0x7F, 0x8C, 0xF3, 0x1, 0x1, 0x1B, 0xE2, 0xE3, 0x1, 0x1D, 0x2, 0x1D, 0x42, 0x88, 0xA4, 0xA8, 0x8B, 0x3B, 0x3D, 0xDE, 0x1, 0x16, 0xFE, 0xE9, 0xE0, 0x0, 0x1, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0x4D, 0x2, 0x1E, 0x0, 0x11, 0x0, 0x0, 0x1, 0x33, 0x15, 0x14, 0x0, 0x23, 0x22, 0x0, 0x35, 0x35, 0x33, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x3, 0x5A, 0xF3, 0xFE, 0xE3, 0xE3, 0xE2, 0xFE, 0xE4, 0xF3, 0x8C, 0x7F, 0x7E, 0x8F, 0x2, 0x1E, 0x3B, 0xE0, 0xFE, 0xE9, 0x1, 0x17, 0xE0, 0x3B, 0x3C, 0x8B, 0xA8, 0xA8, 0x8B, 0x0, 0x2, 0x0, 0x8F, 0x0, 0x0, 0x4, 0x3E, 0x4, 0x3A, 0x0, 0x8, 0x0, 0x13, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x1, 0x82, 0xEE, 0x70, 0x6B, 0x6B, 0x70, 0xEE, 0xF3, 0x1, 0xE1, 0xD8, 0xF6, 0xF6, 0xD8, 0x3, 0x79, 0xFE, 0x8A, 0x70, 0x49, 0x4B, 0x72, 0xFD, 0xC8, 0xFE, 0xBF, 0x4, 0x3A, 0xD5, 0xA7, 0xA8, 0xD5, 0x0, 0x2, 0x0, 0x31, 0x0, 0x0, 0x3, 0xEA, 0x4, 0x3A, 0x0, 0x8, 0x0, 0x15, 0x0, 0x0, 0x1, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x13, 0x11, 0x23, 0x3, 0x23, 0x1, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x2, 0xF8, 0xE0, 0x66, 0x5D, 0x57, 0x5F, 0xED, 0xE2, 0xE8, 0xFD, 0x1, 0x0, 0xD0, 0xE9, 0xCE, 0x1, 0xD2, 0x2, 0x42, 0x1, 0x37, 0x65, 0x39, 0x38, 0x61, 0xFD, 0xBE, 0x1, 0x8E, 0xFE, 0x72, 0x1, 0xB6, 0x56, 0xD4, 0x95, 0xC5, 0xFB, 0xC6, 0x0, 0x2, 0x0, 0x31, 0x0, 0x0, 0x3, 0xEA, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x15, 0x0, 0x0, 0x21, 0x21, 0x22, 0x26, 0x35, 0x34, 0x37, 0x1, 0x33, 0x13, 0x33, 0x11, 0x33, 0x3, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x3, 0xEA, 0xFE, 0x2E, 0xCE, 0xE9, 0xD0, 0xFF, 0x0, 0xFD, 0xE8, 0xE2, 0xF2, 0xF2, 0xED, 0x5F, 0x57, 0x5D, 0x66, 0xC5, 0x95, 0xD4, 0x56, 0x1, 0xB6, 0xFE, 0x72, 0x1, 0x8E, 0xFC, 0x87, 0x1, 0x37, 0x5F, 0x3A, 0x3B, 0x63, 0xFF, 0xFF, 0x0, 0x25, 0x0, 0x0, 0x3, 0xD2, 0x4, 0x3A, 0x0, 0x6, 0x2, 0x8C, 0x1, 0x0, 0x0, 0x1, 0x0, 0x7A, 0xFF, 0xEE, 0x4, 0x78, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x0, 0x1, 0x33, 0x11, 0x14, 0x4, 0x23, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x3, 0x85, 0xF3, 0xFE, 0xE2, 0xE1, 0xDF, 0xFE, 0xE0, 0xF2, 0x94, 0x79, 0x7D, 0x8F, 0x4, 0x3A, 0xFD, 0x5D, 0xCB, 0xDE, 0xDE, 0xCB, 0x2, 0xA3, 0xFD, 0x5D, 0x70, 0x78, 0x78, 0x70, 0x0, 0x1, 0x0, 0x5B, 0x0, 0x53, 0x4, 0xA9, 0x3, 0xD3, 0x0, 0x11, 0x0, 0x0, 0x37, 0x35, 0x21, 0x36, 0x36, 0x35, 0x34, 0x27, 0x21, 0x35, 0x21, 0x15, 0x7, 0x16, 0x15, 0x14, 0x6, 0x23, 0x5B, 0x2, 0x8E, 0x91, 0x69, 0xA3, 0xFD, 0x1B, 0x4, 0x3A, 0x79, 0x8D, 0xD4, 0xF3, 0x53, 0xF3, 0x1, 0x66, 0x44, 0xB8, 0x37, 0xF3, 0xD7, 0xD, 0x6D, 0xCA, 0x9F, 0xC6, 0x0, 0x3, 0x0, 0x5B, 0x0, 0x53, 0x6, 0x10, 0x3, 0xD3, 0x0, 0x11, 0x0, 0x1B, 0x0, 0x25, 0x0, 0x0, 0x25, 0x35, 0x21, 0x36, 0x36, 0x35, 0x34, 0x27, 0x21, 0x35, 0x21, 0x15, 0x7, 0x16, 0x15, 0x14, 0x6, 0x23, 0x1, 0x22, 0x26, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x3, 0x22, 0x26, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x1, 0xC2, 0x2, 0x8D, 0x91, 0x69, 0xA3, 0xFD, 0x1C, 0x4, 0x3A, 0x79, 0x8D, 0xD5, 0xF3, 0xFC, 0x8B, 0x31, 0x45, 0x45, 0x31, 0x32, 0x44, 0x44, 0x33, 0x31, 0x46, 0x46, 0x31, 0x32, 0x44, 0x44, 0x53, 0xF3, 0x1, 0x66, 0x44, 0xB8, 0x37, 0xF3, 0xD7, 0xD, 0x6D, 0xCA, 0x9F, 0xC6, 0x2, 0x32, 0x44, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0xFE, 0x1D, 0x44, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0x0, 0x1, 0x0, 0x5B, 0xFF, 0x28, 0x4, 0xA9, 0x5, 0x25, 0x0, 0x1F, 0x0, 0x0, 0x17, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x21, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x27, 0x21, 0x35, 0x21, 0x15, 0x7, 0x16, 0x15, 0x14, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x5B, 0x2, 0x8E, 0x92, 0x68, 0x63, 0x4D, 0xFD, 0x28, 0x2, 0x8E, 0x8A, 0x70, 0x77, 0xFC, 0xEF, 0x4, 0x3A, 0x74, 0x88, 0xAE, 0x4F, 0x5F, 0xD5, 0xEC, 0xD8, 0xF3, 0x69, 0x5A, 0x53, 0x69, 0x14, 0xF2, 0x69, 0x5A, 0x92, 0x3D, 0xF3, 0xDE, 0xB, 0x73, 0xC8, 0xD5, 0x53, 0x35, 0xA7, 0x71, 0x9D, 0xC7, 0xFF, 0xFF, 0x0, 0x1A, 0x0, 0x0, 0x3, 0xDE, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x5B, 0x3, 0x0, 0xFF, 0xFF, 0x0, 0x25, 0x0, 0x0, 0x5, 0xD0, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x5C, 0x3, 0x0, 0xFF, 0xFF, 0x0, 0x56, 0x0, 0x0, 0x3, 0xC4, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x5F, 0x4, 0x0, 0x0, 0x1, 0x0, 0x4E, 0xFF, 0xEC, 0x3, 0xC4, 0x4, 0x3A, 0x0, 0x1A, 0x0, 0x0, 0x5, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x16, 0x16, 0x15, 0x14, 0x6, 0x2, 0x8, 0x6D, 0xCB, 0x82, 0xF2, 0x6E, 0x61, 0x64, 0x5E, 0xBB, 0xB6, 0x1, 0x22, 0xFD, 0xDF, 0x3, 0x4C, 0xFE, 0xC0, 0xA7, 0xB0, 0xF2, 0x14, 0x48, 0x97, 0x76, 0x3D, 0x5E, 0x60, 0x47, 0xA4, 0x4, 0x7C, 0x1, 0x5, 0xC4, 0x9B, 0xFE, 0xCF, 0xB, 0xA2, 0x7E, 0xA6, 0xB1, 0x0, 0x1, 0x0, 0x57, 0xFF, 0xEC, 0x3, 0xD6, 0x4, 0x4E, 0x0, 0x27, 0x0, 0x0, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x35, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x15, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x3, 0xD6, 0xEA, 0xDF, 0xC7, 0xEF, 0xC0, 0xA8, 0x8C, 0x7A, 0x58, 0x5C, 0x5F, 0x60, 0xF3, 0xE7, 0xCA, 0xC1, 0xE1, 0x9E, 0x94, 0xB8, 0x82, 0x64, 0x60, 0x52, 0x89, 0x5, 0x1, 0x56, 0x86, 0xE4, 0xAD, 0x91, 0x85, 0x86, 0x16, 0x4E, 0x9, 0x41, 0x3B, 0x34, 0x46, 0x63, 0x3F, 0x92, 0xC6, 0xB2, 0x85, 0x7F, 0x81, 0x1B, 0x55, 0x54, 0x39, 0x31, 0x47, 0x4F, 0x65, 0x0, 0x1, 0x0, 0x39, 0xFF, 0xEC, 0x4, 0x93, 0x4, 0x4D, 0x0, 0x20, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x26, 0x27, 0x6, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x26, 0x27, 0x26, 0xEF, 0xC8, 0xAF, 0xB0, 0xC8, 0xA0, 0x56, 0x3E, 0x77, 0x63, 0x78, 0x1B, 0x77, 0x7F, 0x72, 0x8C, 0x39, 0x3A, 0x8C, 0x71, 0x7F, 0x77, 0x1B, 0x78, 0x63, 0x77, 0x3E, 0x9F, 0x3B, 0x1B, 0x2, 0xF7, 0x8B, 0xCB, 0xCB, 0x8B, 0xAC, 0xE5, 0x64, 0x53, 0x2B, 0xC3, 0x2B, 0x48, 0x3D, 0x3D, 0x48, 0x2B, 0xC3, 0x2B, 0x53, 0xAA, 0xA2, 0x4B, 0xFF, 0xFF, 0x0, 0x8F, 0x0, 0x0, 0x3, 0x57, 0x4, 0x3A, 0x0, 0x6, 0x2, 0x82, 0xA, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x0, 0x4, 0x98, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x0, 0x21, 0x1, 0x1, 0x23, 0x1, 0x33, 0x1, 0x3, 0x9B, 0xFE, 0xB5, 0xFE, 0xB6, 0xFE, 0x1, 0xCD, 0xF7, 0x1, 0xCC, 0x3, 0x33, 0xFC, 0xCD, 0x4, 0x3A, 0xFB, 0xC6, 0xFF, 0xFF, 0x0, 0x8F, 0x0, 0x0, 0x4, 0x1C, 0x4, 0x3A, 0x0, 0x6, 0x2, 0x8B, 0x9, 0x0, 0xFF, 0xFF, 0x0, 0x8F, 0x0, 0x0, 0x4, 0x3E, 0x4, 0x3A, 0x0, 0x6, 0x3, 0x47, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2E, 0x0, 0x0, 0x5, 0x24, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x0, 0x21, 0x23, 0x11, 0x26, 0x0, 0x3, 0x35, 0x33, 0x15, 0x12, 0x5, 0x11, 0x33, 0x11, 0x24, 0x13, 0x35, 0x33, 0x15, 0x2, 0x2, 0x7, 0x3, 0x26, 0xF3, 0xFF, 0xFE, 0xFD, 0x3, 0xF3, 0x6, 0x1, 0xC, 0xF3, 0x1, 0x5, 0x7, 0xF2, 0x3, 0xFE, 0xFD, 0x1, 0xB, 0x1A, 0x1, 0x2B, 0x1, 0x12, 0xD8, 0xE0, 0xFE, 0xAF, 0x36, 0x2, 0x67, 0xFD, 0x9A, 0x39, 0x1, 0x4A, 0xE3, 0xD9, 0xFE, 0xF2, 0xFE, 0xD5, 0x1C, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x4, 0x14, 0x4, 0x3A, 0x0, 0x6, 0x2, 0x88, 0x0, 0x0, 0x0, 0x2, 0x0, 0x1B, 0x2, 0x8C, 0x4, 0x14, 0x6, 0xC1, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x1, 0x2, 0xB1, 0x98, 0x99, 0x1, 0xBE, 0x52, 0xFE, 0x59, 0x53, 0xD7, 0x1, 0xA2, 0xBA, 0x1, 0x9D, 0x4, 0x1E, 0x1, 0xB1, 0xFE, 0x4F, 0xFE, 0x6E, 0xEB, 0xEB, 0x4, 0x35, 0xFB, 0xCB, 0x0, 0x2, 0x0, 0x1B, 0x2, 0x8C, 0x5, 0x8A, 0x6, 0xC1, 0x0, 0x2, 0x0, 0x12, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x27, 0x21, 0x7, 0x23, 0x1, 0x21, 0x15, 0x21, 0x13, 0x21, 0x15, 0x21, 0x13, 0x21, 0x15, 0x2, 0xE6, 0x13, 0xF4, 0x1, 0x19, 0xA, 0xFE, 0x99, 0x84, 0xE8, 0x2, 0x5F, 0x2, 0xE2, 0xFE, 0x3E, 0xB, 0x1, 0x7C, 0xFE, 0x8B, 0xD, 0x1, 0xD1, 0x4, 0x30, 0x1, 0xD1, 0xFE, 0x2F, 0xFE, 0x5C, 0xFB, 0xFB, 0x4, 0x35, 0xA8, 0xFE, 0xF2, 0xA7, 0xFE, 0xD0, 0xA8, 0x0, 0x3, 0x0, 0x64, 0x2, 0x8C, 0x3, 0x88, 0x6, 0xC1, 0x0, 0x8, 0x0, 0xF, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x11, 0x33, 0x32, 0x35, 0x34, 0x27, 0x1, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x1, 0x29, 0xC0, 0x56, 0x6A, 0x69, 0x62, 0xB5, 0xD7, 0xC3, 0xB5, 0xFE, 0x56, 0x1, 0x91, 0xAE, 0xCC, 0x9E, 0x5C, 0x5B, 0xC6, 0xAC, 0x6, 0x19, 0xFE, 0xEB, 0x47, 0x49, 0x4D, 0x38, 0xFE, 0x4E, 0xFE, 0xCC, 0x9B, 0x96, 0x3, 0xFE, 0x25, 0x4, 0x35, 0x8E, 0x97, 0x9C, 0x41, 0x19, 0x8C, 0x52, 0x9E, 0x9E, 0x0, 0x3, 0x0, 0x1B, 0x2, 0x8C, 0x4, 0x88, 0x6, 0xC1, 0x0, 0x8, 0x0, 0xF, 0x0, 0x23, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x11, 0x33, 0x32, 0x35, 0x34, 0x27, 0x1, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x7, 0x33, 0x15, 0x23, 0x16, 0x15, 0x14, 0x6, 0x23, 0x1, 0xB0, 0xC0, 0x57, 0x6A, 0x6A, 0x61, 0xB6, 0xD7, 0xC3, 0xB5, 0xFE, 0x56, 0xD0, 0xD0, 0x1, 0x91, 0xAE, 0xCC, 0x39, 0xCB, 0xAB, 0x32, 0xC6, 0xAB, 0x6, 0x19, 0xFE, 0xEB, 0x47, 0x49, 0x4D, 0x38, 0xFE, 0x4E, 0xFE, 0xCC, 0x9B, 0x96, 0x3, 0xFE, 0x25, 0x1, 0xDB, 0x9D, 0x1, 0xBD, 0x8E, 0x97, 0x59, 0x3F, 0x9D, 0x43, 0x5C, 0x9E, 0x9E, 0x0, 0x2, 0x0, 0x64, 0x2, 0x8C, 0x3, 0xA7, 0x6, 0xC1, 0x0, 0x7, 0x0, 0x11, 0x0, 0x0, 0x1, 0x11, 0x33, 0x20, 0x13, 0x35, 0x10, 0x25, 0x1, 0x11, 0x21, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x23, 0x1, 0x28, 0x91, 0x1, 0x21, 0x8, 0xFE, 0xEE, 0xFE, 0x94, 0x1, 0x5F, 0xDD, 0x1, 0x7, 0xFE, 0xF8, 0xE6, 0x6, 0x1B, 0xFD, 0x18, 0x1, 0x47, 0x4A, 0x1, 0x4F, 0x8, 0xFC, 0x71, 0x4, 0x35, 0xFE, 0xEC, 0xEB, 0x36, 0xEA, 0xFE, 0xEA, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x3, 0x30, 0x6, 0xC1, 0x0, 0xB, 0x0, 0x0, 0x13, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x64, 0x2, 0xC7, 0xFD, 0xFD, 0x1, 0xBD, 0xFE, 0x43, 0x2, 0x8, 0x2, 0x8C, 0x4, 0x35, 0xA6, 0xFE, 0xEA, 0xA7, 0xFE, 0xD5, 0xA7, 0x0, 0x1, 0x0, 0x35, 0x2, 0x8C, 0x3, 0x1, 0x6, 0xC1, 0x0, 0xB, 0x0, 0x0, 0x13, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x3A, 0x2, 0x4, 0xFE, 0x42, 0x1, 0xBE, 0xFD, 0xF7, 0x2, 0xCC, 0x2, 0x8C, 0xA7, 0x1, 0x16, 0xA7, 0x1, 0x2B, 0xA6, 0xFB, 0xCB, 0x0, 0x1, 0x0, 0x3C, 0x2, 0x7B, 0x3, 0xA3, 0x6, 0xCE, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x11, 0x6, 0x6, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x20, 0x3, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x23, 0x35, 0x3, 0xA3, 0x22, 0xB1, 0xB6, 0xCA, 0xFE, 0xEC, 0xFD, 0xD1, 0xC2, 0xC4, 0x13, 0xAD, 0xE, 0x6C, 0x70, 0xFE, 0xFD, 0x8, 0x9C, 0x82, 0x65, 0x5D, 0x14, 0xE9, 0x4, 0xB1, 0xFE, 0x66, 0x2C, 0x70, 0x1, 0xB, 0xFA, 0x49, 0xF5, 0x1, 0x10, 0xC0, 0x95, 0x54, 0x5B, 0xFE, 0xB6, 0x5E, 0xAE, 0xB3, 0x2F, 0x15, 0xAE, 0xA0, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x3, 0xDC, 0x6, 0xC1, 0x0, 0xB, 0x0, 0x0, 0x1, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x3, 0x19, 0xFE, 0xF, 0xC4, 0xC4, 0x1, 0xF1, 0xC3, 0x2, 0x8C, 0x1, 0xC9, 0xFE, 0x37, 0x4, 0x35, 0xFE, 0x3A, 0x1, 0xC6, 0xFB, 0xCB, 0x0, 0x1, 0x0, 0x7F, 0x2, 0x8C, 0x1, 0x42, 0x6, 0xC1, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x42, 0xC3, 0x6, 0xC1, 0xFB, 0xCB, 0x4, 0x35, 0x0, 0x1, 0x0, 0x28, 0x2, 0x78, 0x2, 0xF1, 0x6, 0xBC, 0x0, 0xE, 0x0, 0x0, 0x1, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x2D, 0xC4, 0xCD, 0x92, 0x93, 0xD7, 0xBD, 0x64, 0x49, 0x96, 0x5, 0x6, 0xBC, 0xFD, 0x18, 0xB3, 0xA9, 0xA8, 0xAD, 0x56, 0x58, 0xA7, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x3, 0xCD, 0x6, 0xC1, 0x0, 0xB, 0x0, 0x0, 0x1, 0x1, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x1, 0x33, 0x1, 0x1, 0x2, 0xE2, 0xFE, 0xCF, 0x89, 0xC4, 0xC4, 0x1, 0x8F, 0xF7, 0xFE, 0x87, 0x1, 0x98, 0x2, 0x8C, 0x1, 0xD0, 0x99, 0xFE, 0xC9, 0x4, 0x35, 0xFE, 0xF, 0x1, 0xF1, 0xFE, 0x34, 0xFD, 0x97, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x3, 0x18, 0x6, 0xC1, 0x0, 0x5, 0x0, 0x0, 0x13, 0x11, 0x33, 0x11, 0x21, 0x15, 0x64, 0xC4, 0x1, 0xF0, 0x2, 0x8C, 0x4, 0x35, 0xFC, 0x72, 0xA7, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x4, 0xD4, 0x6, 0xC1, 0x0, 0xE, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x33, 0x1, 0x1, 0x33, 0x11, 0x23, 0x11, 0x13, 0x1, 0x23, 0x1, 0x1, 0x29, 0xC5, 0xEA, 0x1, 0x4D, 0x1, 0x50, 0xE9, 0xC5, 0xE, 0xFE, 0xCC, 0x9C, 0xFE, 0xCD, 0x3, 0xFC, 0xFE, 0x90, 0x4, 0x35, 0xFC, 0xD2, 0x3, 0x2E, 0xFB, 0xCB, 0x1, 0x70, 0x1, 0x7D, 0xFD, 0x13, 0x2, 0xEE, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x3, 0xD9, 0x6, 0xC1, 0x0, 0xB, 0x0, 0x0, 0x1, 0x1, 0x11, 0x23, 0x11, 0x33, 0x1, 0x11, 0x33, 0x11, 0x23, 0x35, 0x3, 0x13, 0xFE, 0x16, 0xC5, 0xC5, 0x1, 0xEC, 0xC4, 0xC4, 0x2, 0x8C, 0x2, 0xEC, 0xFD, 0x14, 0x4, 0x35, 0xFD, 0x9, 0x2, 0xF7, 0xFB, 0xCB, 0x2, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x3, 0xD9, 0x6, 0xC1, 0x0, 0xB, 0x0, 0x0, 0x1, 0x27, 0x15, 0x23, 0x11, 0x33, 0x11, 0x1, 0x33, 0x11, 0x23, 0x11, 0x1, 0x2A, 0x2, 0xC4, 0xC4, 0x1, 0xEC, 0xC5, 0xC5, 0x2, 0x8C, 0x2, 0x2, 0x4, 0x35, 0xFD, 0x9, 0x2, 0xF7, 0xFB, 0xCB, 0x2, 0xEC, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x7B, 0x3, 0xD0, 0x6, 0xCE, 0x0, 0xD, 0x0, 0x19, 0x0, 0x0, 0x1, 0x14, 0x2, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x12, 0x15, 0x27, 0x10, 0x21, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x13, 0x3, 0xD0, 0xFC, 0xCD, 0xC9, 0xFE, 0xFE, 0x1, 0x0, 0xC9, 0xCE, 0xFD, 0xC5, 0xFE, 0xFA, 0x79, 0x8B, 0x8C, 0x7A, 0xFE, 0x6, 0x4, 0x89, 0xFA, 0xFE, 0xEC, 0x1, 0x14, 0xFA, 0x38, 0xFA, 0x1, 0x13, 0xFE, 0xED, 0xFA, 0x1, 0x1, 0x66, 0xB0, 0xB6, 0x39, 0xB5, 0xB2, 0x1, 0x57, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x7E, 0x3, 0x3C, 0x6, 0xC1, 0x0, 0x17, 0x0, 0x23, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x34, 0x37, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x14, 0x7, 0x16, 0x17, 0x15, 0x14, 0x6, 0x1, 0x14, 0x33, 0x32, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0xBC, 0xB4, 0xCC, 0x7F, 0x7F, 0xC5, 0x5D, 0x5E, 0x5C, 0x5F, 0xC5, 0x7F, 0x7E, 0x1, 0xCB, 0xFE, 0x90, 0xBB, 0xB7, 0x4, 0x61, 0x5B, 0x59, 0x61, 0x2, 0x7E, 0xE6, 0xAB, 0x23, 0xCB, 0x70, 0x67, 0xED, 0x8E, 0x6C, 0x6C, 0x8E, 0xED, 0x67, 0x6E, 0xCA, 0x26, 0xAB, 0xE6, 0x1, 0x96, 0xEF, 0xE5, 0x26, 0x6F, 0x81, 0x81, 0x6F, 0x0, 0x2, 0x0, 0x64, 0x2, 0x8C, 0x3, 0x8B, 0x6, 0xC1, 0x0, 0x7, 0x0, 0x12, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x3, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x1, 0x28, 0xC8, 0xD7, 0x68, 0x6F, 0xC8, 0xC4, 0x1, 0xA2, 0xBF, 0xC6, 0xC6, 0xBF, 0x6, 0x1B, 0xFE, 0xA0, 0xAC, 0x4D, 0x67, 0xFD, 0xF9, 0xFE, 0x78, 0x4, 0x35, 0xC5, 0x94, 0x9D, 0xB7, 0x0, 0x2, 0x0, 0x64, 0x2, 0x8C, 0x3, 0x9E, 0x6, 0xC1, 0x0, 0x6, 0x0, 0x14, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x35, 0x34, 0x27, 0x13, 0x3, 0x23, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x7, 0x13, 0x15, 0x1, 0x29, 0xA9, 0xD4, 0xCE, 0xF1, 0xE4, 0xBC, 0xC5, 0x1, 0x84, 0xB9, 0xCA, 0xC8, 0xFB, 0x6, 0x1B, 0xFE, 0xAB, 0xA5, 0xAD, 0x3, 0xFC, 0x71, 0x1, 0x93, 0xFE, 0x6D, 0x4, 0x35, 0xAB, 0xA4, 0xD9, 0x51, 0xFE, 0x4E, 0xA, 0x0, 0x1, 0x0, 0x28, 0x2, 0x8C, 0x3, 0x7A, 0x6, 0xC1, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x3, 0x7A, 0xFE, 0xB9, 0xC6, 0xFE, 0xBB, 0x3, 0x52, 0x6, 0x1B, 0xFC, 0x71, 0x3, 0x8F, 0xA6, 0x0, 0x1, 0x0, 0x64, 0x2, 0x7B, 0x3, 0x91, 0x6, 0xBF, 0x0, 0xF, 0x0, 0x0, 0x1, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x2, 0xCC, 0xC5, 0xE7, 0xAF, 0xB5, 0xE2, 0xC5, 0x2, 0xD0, 0xCF, 0x2, 0x6, 0xBF, 0xFD, 0x3C, 0xC2, 0xBE, 0xBE, 0xC2, 0x2, 0xC4, 0xFD, 0x3F, 0xDD, 0xDD, 0x0, 0x1, 0x0, 0x35, 0x2, 0x8C, 0x5, 0x3F, 0x6, 0xC1, 0x0, 0xC, 0x0, 0x0, 0x1, 0x3, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x3, 0x23, 0x3, 0x3, 0x1, 0x30, 0xFB, 0xC7, 0x9D, 0xCB, 0xB1, 0xC8, 0x9B, 0xC7, 0xFB, 0xB1, 0xD6, 0xDB, 0x2, 0x8C, 0x4, 0x35, 0xFC, 0xFF, 0x3, 0x1, 0xFC, 0xFF, 0x3, 0x1, 0xFB, 0xCB, 0x3, 0x7, 0xFC, 0xF9, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x7D, 0x3, 0x0, 0x5, 0xBA, 0x0, 0x8, 0x0, 0x24, 0x0, 0x0, 0x1, 0x32, 0x36, 0x37, 0x35, 0x23, 0x6, 0x15, 0x14, 0x5, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x34, 0x23, 0x22, 0x7, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x17, 0x15, 0x1, 0x78, 0x34, 0x59, 0x18, 0x61, 0xBB, 0x1, 0x37, 0xD, 0x7, 0x5A, 0x7F, 0x7A, 0x95, 0xC2, 0xAF, 0x70, 0x86, 0x77, 0xF, 0xBE, 0xBA, 0x97, 0x87, 0xB7, 0x1E, 0x3, 0x1F, 0x2A, 0x1D, 0x93, 0x3, 0x75, 0x62, 0x93, 0x1A, 0x2C, 0x55, 0x82, 0x6B, 0x84, 0x8D, 0x18, 0x87, 0x5C, 0x5F, 0x9D, 0x8B, 0x93, 0xFE, 0xAA, 0x6D, 0x41, 0xC, 0x0, 0x2, 0x0, 0x56, 0x2, 0x7D, 0x3, 0x1A, 0x5, 0xBA, 0x0, 0x8, 0x0, 0x24, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x15, 0x33, 0x36, 0x35, 0x34, 0x13, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x27, 0x35, 0x33, 0x16, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x23, 0x15, 0x14, 0x33, 0x32, 0x37, 0x1, 0xDF, 0x34, 0x5A, 0x18, 0x62, 0xBA, 0xAE, 0xB9, 0x98, 0x87, 0xB7, 0x1E, 0xC9, 0xC, 0x7, 0x5A, 0x80, 0x7A, 0x94, 0xC1, 0xAF, 0x71, 0x86, 0x78, 0xF, 0x5, 0x19, 0x2A, 0x1E, 0x92, 0x3, 0x74, 0x63, 0xFE, 0x61, 0x5E, 0x9F, 0x8B, 0x94, 0x1, 0x56, 0x6D, 0x40, 0xC, 0x1A, 0x2C, 0x55, 0x82, 0x6B, 0x83, 0x8E, 0x18, 0x86, 0x5C, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x7D, 0x3, 0x6A, 0x5, 0xBC, 0x0, 0x15, 0x0, 0x20, 0x0, 0x0, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x16, 0x33, 0x37, 0x17, 0x6, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x3, 0xD, 0x8E, 0x26, 0x4C, 0x8C, 0x96, 0xAF, 0xAF, 0x98, 0x87, 0x4B, 0xE, 0xAC, 0x2, 0x34, 0x14, 0x11, 0x3B, 0xFE, 0x7F, 0x69, 0x33, 0x32, 0x68, 0x61, 0x4E, 0x4C, 0x2, 0x7D, 0x75, 0x74, 0xDB, 0xAA, 0xF, 0xBC, 0xEE, 0x70, 0x61, 0xFD, 0xD2, 0x5C, 0x3, 0x91, 0x18, 0x95, 0x63, 0x1, 0x4D, 0x66, 0xA1, 0x84, 0x67, 0x8A, 0x0, 0x3, 0x0, 0x3C, 0x2, 0x7D, 0x4, 0xF7, 0x5, 0xBC, 0x0, 0x8, 0x0, 0xF, 0x0, 0x36, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x15, 0x33, 0x36, 0x35, 0x34, 0x1, 0x32, 0x37, 0x21, 0x15, 0x14, 0x16, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x23, 0x15, 0x14, 0x33, 0x32, 0x37, 0x33, 0x14, 0x6, 0x3, 0xBC, 0x34, 0x5A, 0x18, 0x61, 0xBB, 0xFD, 0x6E, 0x91, 0x1B, 0xFE, 0xB5, 0x50, 0x2, 0x3E, 0xA5, 0x55, 0x67, 0x8F, 0xAF, 0xB4, 0x2, 0x11, 0xE, 0x6F, 0x50, 0x6B, 0x53, 0x73, 0x27, 0x9D, 0x78, 0xB1, 0x6F, 0x3E, 0x8B, 0x67, 0x85, 0x97, 0xC1, 0xAF, 0x71, 0x86, 0x78, 0xF, 0xBD, 0xBA, 0x5, 0x1B, 0x2A, 0x1E, 0x93, 0x3, 0x75, 0x63, 0xFE, 0x9, 0xAD, 0xD, 0x46, 0x5A, 0xA5, 0x5C, 0x5E, 0xDE, 0xAD, 0x63, 0x50, 0x5A, 0x61, 0x73, 0x39, 0x5B, 0x71, 0x39, 0x39, 0x82, 0x6B, 0x84, 0x8D, 0x18, 0x86, 0x5C, 0x5F, 0x9E, 0x0, 0x2, 0x0, 0x64, 0x2, 0x7D, 0x3, 0x3D, 0x7, 0xE, 0x0, 0xF, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x22, 0x27, 0x7, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x1, 0xFC, 0x8F, 0x50, 0xD, 0xAC, 0xC4, 0x4E, 0x84, 0x9B, 0xA8, 0xA9, 0xC6, 0x5A, 0x50, 0x4E, 0x5D, 0x72, 0x33, 0x34, 0x2, 0x7D, 0x6A, 0x5B, 0x4, 0x82, 0xFE, 0x50, 0x5C, 0xDE, 0xB9, 0x10, 0xB6, 0xE0, 0xA8, 0x80, 0x7E, 0x69, 0x87, 0x62, 0xFE, 0xD7, 0x63, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x7D, 0x3, 0x15, 0x7, 0xE, 0x0, 0x9, 0x0, 0x19, 0x0, 0x0, 0x1, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x5, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x1, 0xAB, 0x72, 0x34, 0x33, 0x72, 0x5D, 0x4E, 0x1, 0x68, 0xD, 0x50, 0x8F, 0x98, 0xA9, 0xA9, 0x9A, 0x84, 0x4E, 0xC4, 0x3, 0x25, 0x63, 0x1, 0x29, 0x62, 0x86, 0x7A, 0xEE, 0x99, 0x5A, 0x69, 0xE0, 0xB6, 0x10, 0xB9, 0xDE, 0x5B, 0x1, 0xAF, 0xFB, 0x7E, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x7E, 0x3, 0x16, 0x5, 0xBC, 0x0, 0x6, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x22, 0x7, 0x21, 0x35, 0x34, 0x26, 0x1, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x1, 0xB2, 0x91, 0x1B, 0x1, 0x4B, 0x4F, 0x1, 0x1, 0x26, 0x9E, 0x77, 0xB2, 0xDA, 0xDF, 0x98, 0xAF, 0xB4, 0xFD, 0xEF, 0xE, 0x6F, 0x50, 0x40, 0x5B, 0x24, 0x5, 0x15, 0xAD, 0xD, 0x47, 0x59, 0xFD, 0xFD, 0x39, 0x5B, 0xDE, 0xA4, 0x1F, 0xBE, 0xDF, 0xDE, 0xAD, 0x63, 0x50, 0x5A, 0x39, 0x28, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x7C, 0x3, 0x16, 0x5, 0xBA, 0x0, 0x14, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x27, 0x32, 0x37, 0x21, 0x15, 0x14, 0x16, 0x1, 0x9F, 0xAF, 0xB4, 0x2, 0x11, 0xE, 0x6F, 0x50, 0x6B, 0x53, 0x73, 0x27, 0x9D, 0x78, 0xB2, 0xD9, 0xDE, 0x98, 0x91, 0x1B, 0xFE, 0xB5, 0x50, 0x2, 0x7C, 0xDE, 0xAD, 0x63, 0x50, 0x5A, 0x61, 0x73, 0x39, 0x5B, 0xDE, 0xA4, 0x1F, 0xBE, 0xDF, 0xA7, 0xAD, 0xD, 0x46, 0x5A, 0x0, 0x1, 0x0, 0x3C, 0x2, 0x7C, 0x2, 0xE8, 0x5, 0xBA, 0x0, 0x20, 0x0, 0x0, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x33, 0x15, 0x23, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x2, 0xE8, 0xD9, 0x7A, 0x93, 0xC6, 0x94, 0x85, 0xB7, 0x93, 0x83, 0xC4, 0xB9, 0x4, 0x8F, 0x80, 0x78, 0x93, 0x93, 0x86, 0x8E, 0x95, 0xB, 0x3, 0x79, 0x83, 0x7A, 0x80, 0x71, 0x89, 0x31, 0x39, 0x70, 0x72, 0x78, 0x81, 0x71, 0x50, 0x55, 0x52, 0x1, 0x97, 0x1, 0x5B, 0x61, 0x5D, 0x0, 0x1, 0x0, 0x3C, 0x2, 0x7C, 0x2, 0xE8, 0x5, 0xBA, 0x0, 0x20, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x33, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x1, 0x8F, 0x7A, 0xD9, 0xB9, 0x9, 0x97, 0x8E, 0x87, 0x93, 0x93, 0x79, 0x81, 0x8F, 0x3, 0xBA, 0xC4, 0x83, 0x94, 0xB7, 0x85, 0x93, 0xC5, 0x2, 0x7C, 0x7A, 0x83, 0x5D, 0x61, 0x5B, 0x1, 0x97, 0x1, 0x52, 0x55, 0x50, 0x71, 0x81, 0x78, 0x72, 0x70, 0x39, 0x31, 0x89, 0x71, 0x80, 0x0, 0x2, 0x0, 0x3C, 0x1, 0x4C, 0x3, 0x16, 0x5, 0xBA, 0x0, 0xA, 0x0, 0x24, 0x0, 0x0, 0x1, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x35, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x14, 0x6, 0x1, 0xB0, 0x70, 0x31, 0x31, 0x6F, 0x5E, 0x52, 0x50, 0x60, 0x53, 0xBD, 0x3E, 0x61, 0x5C, 0x7A, 0xB1, 0x6, 0x4F, 0x80, 0x92, 0xB4, 0xB3, 0x94, 0x8D, 0x4E, 0xD, 0xAB, 0xC7, 0x3, 0x22, 0x55, 0x1, 0x4A, 0x52, 0x85, 0x7C, 0x6B, 0x85, 0xFE, 0x2A, 0x44, 0x49, 0x7B, 0x64, 0x9B, 0x4A, 0x5A, 0xE8, 0xAF, 0xF, 0xB7, 0xE2, 0x66, 0x57, 0xFC, 0xF0, 0xA2, 0xAD, 0x0, 0x2, 0x0, 0x78, 0x1, 0x4F, 0x1, 0x5C, 0x5, 0xAD, 0x0, 0x3, 0x0, 0xD, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x2, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0x4D, 0xC5, 0x10, 0x3B, 0x37, 0x36, 0x3C, 0x3C, 0x36, 0x37, 0x3B, 0x5, 0xAD, 0xFC, 0xDF, 0x3, 0x21, 0xFC, 0x3C, 0x3D, 0x3D, 0x5C, 0x3E, 0x3E, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x3, 0x3E, 0x7, 0xE, 0x0, 0xC, 0x0, 0x0, 0x1, 0x3, 0x7, 0x15, 0x23, 0x11, 0x33, 0x11, 0x37, 0x37, 0x33, 0x1, 0x1, 0x2, 0x54, 0xD8, 0x53, 0xC5, 0xC5, 0x36, 0xDA, 0xE4, 0xFE, 0xDD, 0x1, 0x44, 0x2, 0x8C, 0x1, 0x54, 0x58, 0xFC, 0x4, 0x82, 0xFD, 0x5E, 0x45, 0xFC, 0xFE, 0xBB, 0xFE, 0x24, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x4, 0xCC, 0x5, 0xBA, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x7, 0x17, 0x11, 0x23, 0x11, 0x26, 0x1, 0xB3, 0x62, 0x28, 0xC5, 0x98, 0x20, 0x4C, 0x8F, 0xB6, 0x37, 0x4B, 0x9A, 0x78, 0x8B, 0xC5, 0x4, 0x7F, 0x64, 0x28, 0x2, 0xC5, 0x4, 0x5, 0x13, 0x59, 0xFD, 0xD2, 0x3, 0x21, 0x7A, 0x87, 0x9A, 0x9A, 0x91, 0xA2, 0xFE, 0x5, 0x1, 0xD9, 0xAE, 0x5F, 0x1F, 0xFD, 0xF7, 0x1, 0xD9, 0xAE, 0x0, 0x1, 0x0, 0x64, 0x1, 0x4C, 0x2, 0xFA, 0x5, 0xBA, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x2, 0x3F, 0x46, 0x4F, 0x27, 0x1D, 0x47, 0x45, 0x3D, 0x62, 0x28, 0xC5, 0xAB, 0x11, 0x4C, 0x8B, 0x78, 0x8B, 0x1, 0x4C, 0x11, 0xB4, 0x9, 0x50, 0x1, 0xFE, 0x69, 0x54, 0x59, 0xFD, 0xD2, 0x3, 0x21, 0x73, 0x80, 0x91, 0xA2, 0xFD, 0xBF, 0xFA, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x7C, 0x3, 0x32, 0x5, 0xBA, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x11, 0x34, 0x26, 0x23, 0x22, 0x3C, 0xCB, 0xAF, 0xB1, 0xCB, 0xCB, 0xB0, 0xAF, 0xCC, 0xC5, 0x5B, 0x5B, 0xB6, 0x5B, 0x5C, 0xB5, 0x4, 0x23, 0xB3, 0xE4, 0xE4, 0xB3, 0x10, 0xB3, 0xE4, 0xE4, 0xB3, 0x6E, 0x82, 0x1, 0x0, 0x6C, 0x84, 0x0, 0x1, 0x0, 0x28, 0x2, 0x7C, 0x2, 0x83, 0x5, 0xBA, 0x0, 0x15, 0x0, 0x0, 0x13, 0x37, 0x16, 0x33, 0x32, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x22, 0x30, 0x54, 0x38, 0x4D, 0xB5, 0x5B, 0x5B, 0x43, 0x38, 0x65, 0x5D, 0x83, 0xB0, 0xCB, 0xCA, 0xB0, 0x7F, 0x2, 0xB9, 0x8F, 0x25, 0x1, 0x0, 0x6C, 0x84, 0x24, 0x88, 0x43, 0xE4, 0xB3, 0x10, 0xB3, 0xE4, 0x0, 0x1, 0x0, 0x28, 0x4, 0x13, 0x3, 0x1E, 0x5, 0xBA, 0x0, 0xD, 0x0, 0x0, 0x1, 0x23, 0x10, 0x23, 0x22, 0x11, 0x23, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x3, 0x1E, 0xC5, 0xB7, 0xB5, 0xC5, 0xCB, 0xAF, 0xB1, 0xCB, 0x4, 0x13, 0x1, 0x0, 0xFF, 0x0, 0x10, 0xB3, 0xE4, 0xE4, 0xB3, 0x0, 0x1, 0x0, 0x28, 0x2, 0x83, 0x3, 0x1E, 0x4, 0x2A, 0x0, 0xE, 0x0, 0x0, 0x1, 0x33, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x2, 0x59, 0xC5, 0xCB, 0xB1, 0xAF, 0xCB, 0xC5, 0x5B, 0x5A, 0xB7, 0x4, 0x2A, 0x10, 0xB2, 0xE5, 0xE5, 0xB2, 0x10, 0x7D, 0x83, 0x0, 0x2, 0x0, 0x64, 0x1, 0x29, 0x3, 0x3D, 0x5, 0xBA, 0x0, 0x9, 0x0, 0x19, 0x0, 0x0, 0x1, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x1, 0xCD, 0x5D, 0x4E, 0xAA, 0x72, 0x34, 0x33, 0x9F, 0x84, 0x4E, 0xC4, 0xAC, 0xD, 0x50, 0x8F, 0x98, 0xA9, 0xA8, 0x3, 0x24, 0x86, 0x7B, 0xED, 0x63, 0xFE, 0xD7, 0x62, 0xA7, 0x5C, 0xFE, 0x50, 0x4, 0x82, 0x5A, 0x69, 0xDF, 0xB6, 0x10, 0xB9, 0xDF, 0x0, 0x1, 0x0, 0x28, 0x2, 0x7D, 0x2, 0x2, 0x6, 0x70, 0x0, 0x15, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x1, 0xFE, 0x32, 0x56, 0x57, 0x73, 0x84, 0x84, 0xC5, 0x91, 0x91, 0x27, 0x25, 0x23, 0x1E, 0x2, 0x8F, 0x12, 0x74, 0x86, 0x1, 0x95, 0xA0, 0xC4, 0xC4, 0xA0, 0xFE, 0x7E, 0x3B, 0x2A, 0x7, 0x0, 0x1, 0x0, 0x64, 0x2, 0x7F, 0x2, 0xFA, 0x5, 0xAD, 0x0, 0x10, 0x0, 0x0, 0x1, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x2, 0x51, 0x12, 0x4C, 0x8B, 0x79, 0x8B, 0xC5, 0x4, 0x7F, 0x61, 0x28, 0xC5, 0x2, 0x8C, 0x74, 0x81, 0x91, 0xA2, 0x1, 0xFB, 0xFE, 0x28, 0xAF, 0x58, 0x2, 0x2F, 0xFC, 0xDF, 0x0, 0x1, 0x0, 0x3C, 0x2, 0xCB, 0x3, 0x6A, 0x5, 0x61, 0x0, 0x10, 0x0, 0x0, 0x13, 0x35, 0x21, 0x36, 0x35, 0x34, 0x27, 0x21, 0x35, 0x21, 0x15, 0x7, 0x16, 0x15, 0x14, 0x6, 0x23, 0x3C, 0x1, 0xD8, 0xAF, 0x59, 0xFD, 0xD2, 0x3, 0x20, 0x74, 0x82, 0x91, 0xA2, 0x2, 0xCB, 0xC5, 0x4, 0x7E, 0x62, 0x28, 0xC5, 0xA8, 0x13, 0x4C, 0x8C, 0x78, 0x8B, 0x0, 0x1, 0x0, 0x64, 0x2, 0x7F, 0x4, 0xCC, 0x5, 0xAD, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x27, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x27, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x4, 0x34, 0x20, 0x4C, 0x8F, 0xB6, 0x36, 0x4B, 0x9A, 0x79, 0x8B, 0xC5, 0x4, 0x7F, 0x65, 0x27, 0x2, 0xC5, 0x4, 0x7F, 0x61, 0x28, 0xC5, 0x2, 0x8C, 0x79, 0x86, 0x9A, 0x9A, 0x91, 0xA2, 0x1, 0xFB, 0xFE, 0x28, 0xAF, 0x5E, 0x20, 0x2, 0x9, 0xFE, 0x28, 0xAF, 0x59, 0x2, 0x2E, 0xFC, 0xDF, 0x0, 0x1, 0x0, 0x28, 0x2, 0x8C, 0x3, 0xB, 0x5, 0xAD, 0x0, 0x8, 0x0, 0x0, 0x1, 0x1, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x1, 0x1, 0x40, 0xFE, 0xE8, 0xD4, 0x96, 0x9, 0xA, 0x93, 0xD3, 0xFE, 0xEB, 0x2, 0x8C, 0x3, 0x21, 0xFD, 0xF3, 0x32, 0x32, 0x2, 0xD, 0xFC, 0xDF, 0x0, 0x1, 0x0, 0x35, 0x2, 0x7D, 0x3, 0x6D, 0x5, 0xBA, 0x0, 0x1E, 0x0, 0x0, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x26, 0x27, 0x6, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x26, 0x27, 0xBB, 0x97, 0xFE, 0x97, 0x6F, 0x40, 0x2D, 0x52, 0x4A, 0x58, 0x14, 0x5B, 0x5B, 0x54, 0x68, 0x2A, 0x2B, 0x67, 0x54, 0x5B, 0x5B, 0x14, 0x58, 0x4A, 0x52, 0x2D, 0x9E, 0xF, 0x4, 0xBC, 0x65, 0x99, 0x99, 0x65, 0x73, 0xA0, 0x47, 0x3E, 0x20, 0xA7, 0x20, 0x35, 0x2D, 0x2D, 0x35, 0x20, 0xA7, 0x20, 0x3E, 0xAA, 0x86, 0x0, 0x2, 0x0, 0x64, 0x1, 0x66, 0x3, 0x45, 0x6, 0xCF, 0x0, 0x10, 0x0, 0x22, 0x0, 0x0, 0x1, 0x32, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x15, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x1, 0xD1, 0xAF, 0xB3, 0x48, 0x38, 0x93, 0x42, 0x4C, 0x9A, 0x3C, 0x89, 0x6F, 0x56, 0xC4, 0xCD, 0x8E, 0x98, 0xBF, 0x92, 0xC1, 0xC3, 0x3, 0x23, 0xA9, 0xA1, 0x5, 0x9F, 0x2, 0x92, 0x34, 0x4F, 0xA7, 0xFD, 0xCE, 0x2C, 0xA7, 0x34, 0xFE, 0xB6, 0x4, 0x31, 0x87, 0xB1, 0x9E, 0x86, 0x91, 0x4C, 0x44, 0xC8, 0x9C, 0xAA, 0x0, 0x1, 0x0, 0x28, 0x1, 0x4C, 0x3, 0x32, 0x5, 0xAB, 0x0, 0xA, 0x0, 0x0, 0x1, 0x23, 0x11, 0x1, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x1, 0x2, 0x11, 0xC5, 0xFE, 0xDC, 0xD8, 0xA6, 0x9, 0xA, 0xA2, 0xD7, 0xFE, 0xDF, 0x1, 0x4C, 0x1, 0x47, 0x3, 0x18, 0xFD, 0xEF, 0x32, 0x32, 0x2, 0x11, 0xFC, 0xEE, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x7C, 0x3, 0x24, 0x7, 0x14, 0x0, 0x1C, 0x0, 0x26, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x4, 0x13, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x37, 0x37, 0x26, 0x26, 0x13, 0x14, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x27, 0x6, 0x96, 0xA1, 0x82, 0x7C, 0x89, 0x26, 0x84, 0x56, 0x65, 0x84, 0x1, 0x44, 0x3, 0xC4, 0xAE, 0xB0, 0xC6, 0x8F, 0x60, 0x3, 0x42, 0x56, 0x6C, 0x56, 0x5A, 0xAC, 0x56, 0x56, 0xB0, 0x6, 0x35, 0x69, 0x76, 0x46, 0x8F, 0x33, 0x47, 0x42, 0x2F, 0x73, 0xFE, 0xD6, 0x14, 0xA9, 0xE4, 0xE2, 0xA6, 0xF, 0x7F, 0xB4, 0x18, 0x8, 0x1F, 0x67, 0xFE, 0x22, 0x69, 0x83, 0xFB, 0x53, 0x92, 0x11, 0x7, 0x0, 0x2, 0x0, 0x3C, 0x1, 0x4C, 0x4, 0x2C, 0x5, 0xC4, 0x0, 0x18, 0x0, 0x21, 0x0, 0x0, 0x1, 0x23, 0x11, 0x26, 0x2, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x15, 0x14, 0x16, 0x17, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x35, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x15, 0x2, 0x90, 0xC5, 0xD9, 0xB6, 0x64, 0x55, 0x71, 0x66, 0x57, 0x74, 0x78, 0x63, 0xB0, 0xD6, 0xBC, 0xE0, 0x7C, 0x5B, 0x5C, 0x44, 0x37, 0x1, 0x4C, 0x1, 0x3F, 0x1D, 0x1, 0x7, 0x9D, 0x78, 0xC2, 0x3D, 0x72, 0x74, 0x91, 0x62, 0x9B, 0x19, 0x1, 0xA2, 0x7F, 0x6D, 0xF0, 0x9E, 0x96, 0xFD, 0x19, 0xAA, 0x15, 0x93, 0x5A, 0x66, 0x84, 0x48, 0x0, 0x1, 0x0, 0x35, 0x1, 0x4A, 0x3, 0x4E, 0x5, 0xBA, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x6, 0x27, 0x26, 0x26, 0x27, 0x27, 0x3, 0x23, 0x1, 0x3, 0x26, 0x26, 0x23, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x17, 0x17, 0x13, 0x33, 0x1, 0x13, 0x16, 0x17, 0x16, 0x37, 0x3, 0x3C, 0x22, 0x30, 0x5B, 0x69, 0x25, 0x42, 0xAD, 0xBE, 0x1, 0x11, 0x87, 0x14, 0x33, 0x2F, 0x31, 0x2, 0x3B, 0x2F, 0x6F, 0x60, 0x1B, 0x46, 0xA1, 0xBC, 0xFE, 0xFD, 0x90, 0x2D, 0x32, 0x18, 0x1E, 0x1, 0x57, 0xD, 0x3, 0x5, 0x86, 0x53, 0x94, 0xFE, 0x9C, 0x2, 0x2E, 0x1, 0x2E, 0x2E, 0x34, 0x4, 0x97, 0xE, 0x80, 0x3C, 0x9C, 0x1, 0x4A, 0xFD, 0xEC, 0xFE, 0xBE, 0x5F, 0x3, 0x2, 0x4, 0x0, 0x2, 0x0, 0x78, 0xFF, 0x38, 0x1, 0x5C, 0x3, 0x96, 0x0, 0xB, 0x0, 0xF, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x17, 0x11, 0x23, 0x11, 0x78, 0x3B, 0x37, 0x36, 0x3C, 0x3C, 0x36, 0x37, 0x3B, 0xD5, 0xC5, 0x3, 0x2A, 0x2F, 0x3D, 0x3D, 0x2F, 0x2D, 0x3D, 0x3D, 0xA4, 0xFC, 0xDF, 0x3, 0x21, 0xFF, 0xFF, 0x0, 0x64, 0xFF, 0x38, 0x2, 0x12, 0x2, 0x66, 0x0, 0x7, 0x1, 0x65, 0x0, 0x0, 0xFC, 0xAC, 0xFF, 0xFF, 0x0, 0x64, 0xFF, 0x2B, 0x2, 0xFA, 0x2, 0x59, 0x0, 0x7, 0x3, 0x87, 0x0, 0x0, 0xFC, 0xAC, 0xFF, 0xFF, 0x0, 0x28, 0xFF, 0x38, 0x3, 0xB, 0x2, 0x59, 0x0, 0x7, 0x3, 0x8A, 0x0, 0x0, 0xFC, 0xAC, 0xFF, 0xFF, 0x0, 0x64, 0xFE, 0x17, 0x3, 0x45, 0x3, 0x80, 0x0, 0x7, 0x3, 0x8C, 0x0, 0x0, 0xFC, 0xB1, 0xFF, 0xFF, 0x0, 0x28, 0xFD, 0xFA, 0x3, 0x32, 0x2, 0x59, 0x0, 0x7, 0x3, 0x8D, 0x0, 0x0, 0xFC, 0xAE, 0x0, 0x2, 0x0, 0x64, 0xFE, 0x8, 0x3, 0x39, 0x2, 0x6C, 0x0, 0xB, 0x0, 0x1A, 0x0, 0x0, 0x5, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x14, 0x6, 0x1, 0xC9, 0x5C, 0x4F, 0x4E, 0x59, 0x57, 0x4D, 0x33, 0xA0, 0x84, 0x4F, 0xC5, 0xD7, 0x97, 0xAC, 0xB9, 0x2, 0xA7, 0x2C, 0x76, 0x78, 0x73, 0x90, 0x8C, 0x5C, 0xBD, 0x4C, 0xA7, 0x59, 0xFE, 0x82, 0x2, 0xDE, 0xB6, 0xD0, 0xEA, 0xB9, 0x17, 0xAA, 0xDB, 0xFF, 0xFF, 0x0, 0x3C, 0xFD, 0xEB, 0x4, 0x2C, 0x2, 0x63, 0x0, 0x7, 0x3, 0x8F, 0x0, 0x0, 0xFC, 0x9F, 0xFF, 0xFF, 0x0, 0x42, 0xFD, 0xF4, 0x3, 0x5B, 0x2, 0x64, 0x0, 0x7, 0x3, 0x90, 0x0, 0xD, 0xFC, 0xAA, 0x0, 0x2, 0x0, 0x77, 0xFF, 0xEC, 0x6, 0xBC, 0x4, 0x4E, 0x0, 0x23, 0x0, 0x2B, 0x0, 0x0, 0x5, 0x22, 0x26, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x16, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x6, 0x3, 0x22, 0x6, 0x7, 0x21, 0x35, 0x26, 0x26, 0x5, 0xA, 0x9B, 0xE5, 0x3F, 0x2D, 0xB5, 0x8D, 0x9F, 0xC6, 0xF3, 0x1, 0x66, 0x45, 0xB7, 0x37, 0xE5, 0x74, 0x91, 0xEC, 0xE2, 0xFD, 0x3D, 0xA, 0x95, 0x80, 0xA8, 0x68, 0x83, 0x34, 0xCC, 0xBE, 0x63, 0x7B, 0x11, 0x1, 0xCE, 0x5, 0x61, 0x14, 0x83, 0x6E, 0x6F, 0x82, 0xD5, 0xF3, 0x2, 0x86, 0xFD, 0x72, 0x8F, 0x6A, 0xA3, 0x2, 0xE4, 0x38, 0x4C, 0xFE, 0xD4, 0xEA, 0x67, 0x7D, 0xA5, 0x86, 0x7D, 0x4C, 0x80, 0x3, 0x9F, 0x8C, 0x7C, 0x12, 0x5F, 0x97, 0x0, 0x2, 0xFF, 0xEC, 0xFF, 0xEC, 0x4, 0xBF, 0x6, 0x0, 0x0, 0x24, 0x0, 0x2F, 0x0, 0x0, 0x1, 0x14, 0x2, 0x23, 0x22, 0x27, 0x7, 0x23, 0x11, 0x27, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x35, 0x33, 0x15, 0x33, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x23, 0x27, 0x15, 0x36, 0x33, 0x32, 0x12, 0x17, 0x1, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x4, 0xBF, 0xD8, 0xCE, 0xBC, 0x6C, 0xC, 0xDC, 0x19, 0x29, 0x38, 0xA3, 0x89, 0x67, 0x17, 0x16, 0xF3, 0x3, 0x29, 0x3A, 0xA3, 0x8A, 0x68, 0x17, 0x6A, 0xB1, 0xD0, 0xD7, 0x1, 0xFE, 0x1D, 0x87, 0x69, 0x66, 0x8C, 0x9C, 0x42, 0x43, 0x2, 0x12, 0xEF, 0xFE, 0xC9, 0x89, 0x75, 0x4, 0xDC, 0x2, 0x3B, 0x2F, 0x8, 0x72, 0x9C, 0x5, 0x7B, 0xD2, 0x3B, 0x2F, 0xC, 0x73, 0x97, 0x1, 0xB0, 0x7B, 0xFE, 0xD0, 0xF3, 0xFE, 0x88, 0xCA, 0xAA, 0x8F, 0xD2, 0x8B, 0xFE, 0x43, 0x8D, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x5, 0x9, 0x6, 0x0, 0x0, 0xB, 0x0, 0x2F, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x27, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x35, 0x33, 0x15, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x23, 0x27, 0x11, 0x2, 0x37, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x1, 0x73, 0xB, 0x6C, 0xB7, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0x1D, 0x29, 0x38, 0xA3, 0x89, 0x67, 0x19, 0x18, 0xF3, 0x29, 0x39, 0xA3, 0x8A, 0x68, 0x13, 0xB3, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xB3, 0x70, 0x84, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x1, 0x9, 0x2, 0x3B, 0x30, 0x9, 0x71, 0x9C, 0x6, 0x79, 0xCF, 0x3B, 0x30, 0xD, 0x73, 0x97, 0x1, 0xFB, 0x7A, 0x0, 0x1, 0x0, 0x13, 0x0, 0x0, 0x3, 0x33, 0x6, 0x15, 0x0, 0x27, 0x0, 0x0, 0x1, 0x27, 0x11, 0x23, 0x11, 0x27, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x17, 0x35, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x15, 0x23, 0x11, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x2, 0x3A, 0x18, 0xF3, 0x18, 0x29, 0x38, 0xA3, 0x89, 0x67, 0x2C, 0xA5, 0xA5, 0xCC, 0xB0, 0x42, 0x46, 0x6, 0x2A, 0x34, 0xAB, 0x2, 0xDC, 0xDC, 0x2E, 0x39, 0xA3, 0x8A, 0x1, 0x8A, 0x1, 0xFE, 0x75, 0x1, 0xE5, 0x1, 0x3B, 0x2F, 0x8, 0x72, 0x9C, 0x4, 0xF9, 0xB3, 0x67, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xA8, 0x6B, 0xB3, 0xFE, 0xAF, 0x3B, 0x2F, 0xC, 0x73, 0x97, 0x0, 0x3, 0x0, 0x14, 0x0, 0x0, 0x7, 0xC3, 0x4, 0x4E, 0x0, 0x9, 0x0, 0x12, 0x0, 0x37, 0x0, 0x0, 0x1, 0x16, 0x17, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x25, 0x22, 0x7, 0x15, 0x16, 0x17, 0x35, 0x26, 0x26, 0x13, 0x11, 0x26, 0x27, 0x11, 0x23, 0x11, 0x6, 0x7, 0x27, 0x36, 0x37, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x36, 0x37, 0x17, 0x6, 0x7, 0x11, 0x23, 0x11, 0x26, 0x27, 0x11, 0x4, 0x65, 0xFA, 0x98, 0x69, 0x59, 0x52, 0x69, 0x15, 0xFE, 0x4A, 0x93, 0x3C, 0x9C, 0xF6, 0x1, 0x68, 0x69, 0xFC, 0x96, 0xF3, 0x34, 0x25, 0x80, 0x3B, 0x9E, 0xE5, 0x7, 0x73, 0xC5, 0xD8, 0x51, 0x35, 0xA7, 0x70, 0xA5, 0xBD, 0x2, 0x33, 0x28, 0x7E, 0x3F, 0x9A, 0xF3, 0xA2, 0xF0, 0x2, 0x67, 0x19, 0x3, 0x73, 0x78, 0x52, 0x58, 0x47, 0x9F, 0x78, 0x6E, 0x5, 0x1C, 0x40, 0x6E, 0x59, 0xFC, 0x78, 0x1, 0xE4, 0x1D, 0x3, 0xFD, 0xFC, 0x1, 0xE5, 0x1B, 0x42, 0x32, 0x92, 0x3A, 0x1, 0xB4, 0x71, 0x85, 0xA5, 0x4B, 0x5A, 0xB6, 0xD2, 0x54, 0x1E, 0x3D, 0x3C, 0x95, 0x33, 0xFE, 0x37, 0x1, 0xAC, 0x3, 0x1A, 0xFE, 0x37, 0x0, 0x2, 0x0, 0x14, 0x0, 0x0, 0x5, 0x39, 0x4, 0x4E, 0x0, 0x8, 0x0, 0x24, 0x0, 0x0, 0x1, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x15, 0x16, 0x7, 0x11, 0x23, 0x11, 0x6, 0x7, 0x27, 0x34, 0x36, 0x37, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x36, 0x37, 0x17, 0x14, 0x6, 0x7, 0x11, 0x23, 0x11, 0x3, 0x71, 0x62, 0x5D, 0x92, 0x49, 0xA8, 0xA8, 0xF2, 0x44, 0xA, 0x83, 0x6B, 0x66, 0xE4, 0x8, 0x77, 0xC3, 0x9C, 0xBC, 0x1, 0x47, 0xC, 0x82, 0x6D, 0x68, 0xF3, 0x2, 0x4D, 0x71, 0x70, 0x5A, 0x86, 0x7C, 0x14, 0x8D, 0xFE, 0x1B, 0x1, 0xF0, 0x14, 0x54, 0x23, 0x51, 0x84, 0x10, 0x1, 0xAA, 0x7D, 0x91, 0xB3, 0xDA, 0x82, 0x12, 0x58, 0x28, 0x54, 0x81, 0xD, 0xFE, 0x61, 0x1, 0xAB, 0x0, 0x2, 0xFF, 0xE6, 0xFE, 0x60, 0x4, 0xA0, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x2F, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x3, 0x27, 0x15, 0x23, 0x35, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x17, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x23, 0x22, 0x27, 0x11, 0x17, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x2, 0xB7, 0x83, 0x74, 0x76, 0x83, 0x94, 0x42, 0x43, 0x14, 0x2F, 0xF3, 0x2, 0x28, 0x38, 0xA4, 0x8A, 0x67, 0x15, 0xE0, 0xA, 0x6C, 0xB7, 0xCE, 0xD9, 0xD9, 0xCB, 0xB1, 0x6C, 0x1B, 0x29, 0x3A, 0xA2, 0x89, 0xAF, 0xD3, 0x91, 0x14, 0x92, 0xCF, 0x7B, 0xFE, 0x20, 0x7E, 0xFD, 0xFF, 0x4, 0x52, 0xAB, 0x3B, 0x30, 0x9, 0x71, 0x9C, 0x1, 0x4, 0x85, 0x6D, 0x81, 0xFE, 0xD0, 0xF8, 0x14, 0xEC, 0xFE, 0xC6, 0x75, 0xFE, 0xFB, 0x2, 0x3B, 0x30, 0xD, 0x74, 0x96, 0x0, 0x1, 0xFF, 0xDD, 0x0, 0x0, 0x3, 0x34, 0x4, 0x4E, 0x0, 0x21, 0x0, 0x0, 0x1, 0x27, 0x11, 0x23, 0x11, 0x27, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x2, 0x5, 0x17, 0xF2, 0x1B, 0x29, 0x38, 0xA3, 0x89, 0x67, 0x18, 0x17, 0xE7, 0x7, 0x57, 0x9D, 0x31, 0x25, 0x2, 0x32, 0x30, 0xA9, 0x39, 0x2C, 0x39, 0xA3, 0x8A, 0x1, 0x74, 0x1, 0xFE, 0x8B, 0x1, 0xCF, 0x2, 0x3B, 0x30, 0x9, 0x71, 0x9C, 0x5, 0x1, 0xC3, 0x79, 0x8D, 0xD, 0xE5, 0x8, 0x80, 0xC4, 0x3B, 0x30, 0xD, 0x73, 0x97, 0x0, 0x1, 0xFF, 0xFC, 0x0, 0x0, 0x3, 0x15, 0x4, 0x4E, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x22, 0x27, 0x11, 0x23, 0x11, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x17, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x2, 0x23, 0x1E, 0x1B, 0xF3, 0x58, 0xA3, 0x89, 0x72, 0xCC, 0xB0, 0x42, 0x46, 0x6, 0x2A, 0x34, 0xAB, 0x2, 0x26, 0x29, 0x39, 0xA3, 0x8A, 0x1, 0x74, 0x6, 0xFE, 0x86, 0x1, 0xD1, 0x8, 0x63, 0x9, 0x72, 0x9B, 0x5E, 0xB4, 0xC0, 0x12, 0xBE, 0x8, 0xA8, 0xBA, 0x4, 0x3B, 0x30, 0xD, 0x73, 0x97, 0x0, 0x1, 0x0, 0x28, 0xFF, 0xEC, 0x4, 0x29, 0x4, 0x4E, 0x0, 0x35, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x24, 0x27, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x17, 0x32, 0x37, 0x17, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x2, 0x32, 0xDF, 0xEA, 0xEC, 0x5, 0x8A, 0x51, 0x5F, 0x65, 0x4F, 0xFF, 0x0, 0x3E, 0x2F, 0x18, 0x3D, 0x38, 0x5, 0x83, 0x43, 0x43, 0x21, 0xE1, 0xC0, 0xCB, 0xE7, 0xF3, 0x60, 0x5F, 0x5C, 0x58, 0x5C, 0x82, 0x6B, 0x49, 0x23, 0x6D, 0xB, 0x82, 0x6A, 0x28, 0xEE, 0x14, 0xE4, 0x86, 0x64, 0x50, 0x4A, 0x3A, 0x33, 0x4B, 0x39, 0x19, 0x8, 0x41, 0x2D, 0x23, 0x40, 0x72, 0x20, 0x38, 0x49, 0x85, 0xC3, 0xC6, 0x92, 0x3F, 0x63, 0x52, 0x36, 0x35, 0x40, 0x1C, 0x17, 0x1D, 0x2, 0x68, 0x27, 0x81, 0x40, 0x3F, 0x56, 0x90, 0xB8, 0x0, 0x1, 0xFF, 0xE2, 0xFF, 0xEC, 0x2, 0xD1, 0x5, 0x41, 0x0, 0x29, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x27, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x23, 0x27, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0xA5, 0x43, 0x5C, 0x79, 0xA0, 0x1B, 0x26, 0x35, 0x95, 0x7F, 0x5F, 0x16, 0x17, 0xB2, 0xB2, 0xF3, 0xBF, 0xBF, 0x26, 0x36, 0x95, 0x81, 0x5F, 0x11, 0x3F, 0x32, 0x29, 0x2B, 0x4, 0x18, 0x89, 0xA7, 0xD6, 0x2, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x5, 0xF3, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0xFE, 0xB8, 0x3A, 0x2E, 0xC, 0x70, 0x90, 0x1, 0x72, 0x49, 0x2B, 0xA, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x3, 0xE8, 0x4, 0x3A, 0x0, 0x21, 0x0, 0x0, 0x33, 0x35, 0x13, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x21, 0x35, 0x21, 0x15, 0x1, 0x16, 0x33, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x23, 0x22, 0x27, 0x7, 0x21, 0x15, 0x67, 0xFE, 0x2E, 0x21, 0x2E, 0x39, 0x82, 0x7D, 0x63, 0x3A, 0x85, 0xC0, 0xFD, 0xE5, 0x3, 0x4F, 0xFE, 0xF8, 0x29, 0x1D, 0x2E, 0x39, 0x83, 0x7C, 0x65, 0x47, 0x71, 0xB9, 0x2, 0x3F, 0x9F, 0x1, 0x50, 0x8, 0x40, 0x2E, 0x24, 0x5C, 0x8D, 0x1E, 0xFE, 0xC4, 0x99, 0xFE, 0xA2, 0x7, 0x41, 0x2E, 0x28, 0x5C, 0x89, 0x1A, 0xF5, 0xC3, 0x0, 0x2, 0x0, 0x7C, 0xFE, 0x55, 0x4, 0x37, 0x4, 0x4D, 0x0, 0x1A, 0x0, 0x26, 0x0, 0x0, 0x25, 0x14, 0x2, 0x23, 0x22, 0x27, 0x7, 0x23, 0x11, 0x34, 0x24, 0x33, 0x32, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x36, 0x33, 0x32, 0x12, 0x17, 0x1, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x4, 0x37, 0xE9, 0xC9, 0xBA, 0x69, 0xA, 0xDC, 0x1, 0x12, 0xD9, 0x59, 0xF4, 0x48, 0x73, 0x70, 0xA4, 0x79, 0x8D, 0x6A, 0xAE, 0xC6, 0xE8, 0x2, 0xFE, 0x11, 0x83, 0x79, 0x77, 0x83, 0x96, 0x45, 0x43, 0x7E, 0xF7, 0xFE, 0xCE, 0x7F, 0x6B, 0x4, 0x1C, 0xDB, 0xED, 0x51, 0x62, 0x91, 0x85, 0x85, 0x7E, 0x4A, 0x76, 0xFE, 0xCC, 0xE8, 0xFE, 0x81, 0xD0, 0x92, 0x15, 0x90, 0xCD, 0x7F, 0xFE, 0x27, 0x7C, 0xFF, 0xFF, 0x0, 0x64, 0x2, 0x8C, 0x3, 0xDC, 0x6, 0xC1, 0x0, 0x6, 0x3, 0x63, 0x0, 0x0, 0x0, 0x2, 0x0, 0x3E, 0xFE, 0x60, 0x4, 0x3, 0x4, 0x3A, 0x0, 0x18, 0x0, 0x24, 0x0, 0x0, 0x1, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x37, 0x21, 0x35, 0x21, 0x15, 0x6, 0x6, 0x15, 0x14, 0x1E, 0x2, 0x15, 0x14, 0x4, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x6, 0x6, 0x15, 0x14, 0x16, 0x2, 0x21, 0xBE, 0xFE, 0xDB, 0xF3, 0xDC, 0x4D, 0x8A, 0xFE, 0x1C, 0x3, 0x72, 0x90, 0x9B, 0x66, 0x8A, 0x66, 0xFE, 0xE6, 0xC5, 0x67, 0x85, 0x50, 0x35, 0xB4, 0xA6, 0x87, 0xFE, 0x60, 0xDC, 0xD5, 0xC7, 0xEE, 0x17, 0x64, 0x5B, 0x80, 0x5A, 0xC4, 0x9B, 0x3D, 0x71, 0x4D, 0x3E, 0x73, 0x8C, 0xC1, 0x8C, 0xD7, 0xE3, 0xC3, 0x88, 0x6C, 0x65, 0x94, 0x3E, 0x13, 0x9A, 0x83, 0x77, 0x84, 0x0, 0x1, 0x0, 0x22, 0xFF, 0x83, 0x6, 0x64, 0x6, 0x0, 0x0, 0x2F, 0x0, 0x0, 0x5, 0x22, 0x27, 0x7, 0x23, 0x13, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x1, 0x11, 0x33, 0x11, 0x1, 0x33, 0x1, 0x37, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x3, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x2, 0x4, 0x56, 0x3C, 0x6B, 0xE5, 0xDB, 0x12, 0xB2, 0xB2, 0xF3, 0xBF, 0xBF, 0x1, 0x6, 0xF3, 0x1, 0x31, 0xE5, 0xFE, 0xE5, 0x32, 0x9F, 0xC0, 0x1, 0xF3, 0x62, 0x5D, 0x94, 0x47, 0xF3, 0xDE, 0x19, 0x30, 0x29, 0x2B, 0x43, 0x14, 0x1E, 0x87, 0x1, 0x14, 0x39, 0x4C, 0x2, 0x6B, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0xFE, 0x2C, 0x1, 0x4A, 0x3, 0x3, 0xFE, 0x2F, 0x1, 0x81, 0xFE, 0x9B, 0x3, 0xB6, 0xDA, 0xFD, 0x42, 0x2, 0xBB, 0x71, 0x5C, 0x82, 0xFC, 0xFA, 0x1, 0xDC, 0xFE, 0xE9, 0xF, 0xA, 0xBC, 0x18, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x2, 0xB2, 0x4, 0x3A, 0x0, 0x26, 0x1, 0x1F, 0xF9, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x84, 0xFF, 0x5A, 0xFF, 0xFF, 0x0, 0x14, 0xFF, 0xF4, 0x2, 0xB2, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x42, 0x3B, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x84, 0xFF, 0x5E, 0x0, 0x3, 0x0, 0x18, 0xFE, 0x60, 0x4, 0xFF, 0x4, 0x4E, 0x0, 0x6, 0x0, 0xD, 0x0, 0x22, 0x0, 0x0, 0x1, 0x22, 0x7, 0x15, 0x21, 0x26, 0x26, 0x3, 0x32, 0x36, 0x37, 0x21, 0x15, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x17, 0x36, 0x20, 0x16, 0x17, 0x33, 0x15, 0x23, 0x6, 0x2, 0x2, 0x87, 0x95, 0x41, 0x1, 0xC7, 0x11, 0x75, 0x69, 0x79, 0x75, 0x8, 0xFE, 0x32, 0x43, 0xDA, 0xB1, 0x6C, 0xF2, 0xA7, 0xA7, 0xDF, 0xA, 0x6C, 0x1, 0x6E, 0xD6, 0x16, 0x91, 0x8D, 0xA, 0xD9, 0x3, 0x88, 0x7C, 0x7C, 0x6C, 0x8C, 0xFD, 0x27, 0xB5, 0x81, 0xB8, 0x7E, 0xC3, 0x75, 0xFD, 0xFF, 0x3, 0x85, 0xAB, 0x1, 0xAA, 0x6D, 0x81, 0xF3, 0xCB, 0xAB, 0xDB, 0xFE, 0xE2, 0x0, 0x2, 0x0, 0x18, 0xFF, 0xEE, 0x5, 0x48, 0x4, 0x3A, 0x0, 0x8, 0x0, 0x1D, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x21, 0x15, 0x14, 0x16, 0x17, 0x22, 0x24, 0x35, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x4, 0x2, 0xB0, 0x7D, 0x8F, 0xFD, 0xE7, 0x94, 0x79, 0xDF, 0xFE, 0xE0, 0x99, 0x99, 0xF2, 0x2, 0x19, 0xF3, 0x99, 0x99, 0xFE, 0xE2, 0xAF, 0x78, 0x70, 0x4E, 0x4E, 0x70, 0x78, 0xC1, 0xDE, 0xCB, 0x4E, 0xAB, 0x1, 0xAA, 0xFE, 0x56, 0x1, 0xAA, 0xFE, 0x56, 0xAB, 0x4E, 0xCB, 0xDE, 0x0, 0x2, 0x0, 0x18, 0xFF, 0xEB, 0x4, 0xD9, 0x4, 0x4E, 0x0, 0xA, 0x0, 0x39, 0x0, 0x0, 0x25, 0x32, 0x36, 0x36, 0x35, 0x27, 0x21, 0x7, 0x14, 0x16, 0x16, 0x25, 0x14, 0x6, 0x6, 0x23, 0x22, 0x26, 0x26, 0x35, 0x34, 0x37, 0x23, 0x35, 0x33, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x21, 0x27, 0x26, 0x35, 0x34, 0x36, 0x36, 0x33, 0x15, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x33, 0x15, 0x23, 0x16, 0x2, 0x78, 0x7A, 0x7D, 0x2D, 0x3, 0xFD, 0xBF, 0x3, 0x2D, 0x7D, 0x2, 0x90, 0x59, 0xE7, 0xD7, 0xD6, 0xE7, 0x59, 0x8, 0x52, 0x88, 0x28, 0x10, 0x4F, 0x22, 0x9D, 0x99, 0x30, 0x29, 0x18, 0x1, 0xD9, 0x2D, 0x15, 0x31, 0x99, 0x9C, 0x22, 0x4E, 0x23, 0x15, 0x88, 0x52, 0x8, 0xAE, 0x57, 0x7C, 0x36, 0x2E, 0x2E, 0x36, 0x7C, 0x57, 0xD1, 0x5C, 0xBB, 0x7D, 0x7D, 0xBB, 0x5C, 0x35, 0x31, 0xAB, 0x5B, 0x26, 0x26, 0x39, 0x21, 0xBD, 0x4E, 0x6E, 0x2F, 0x35, 0x67, 0x37, 0x6A, 0x34, 0x35, 0x2F, 0x6E, 0x4E, 0xBD, 0x21, 0x39, 0x28, 0x4F, 0x30, 0xAB, 0x31, 0x0, 0x2, 0x0, 0x7D, 0xFE, 0x52, 0x4, 0x32, 0x6, 0x0, 0x0, 0xA, 0x0, 0x28, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x6, 0x23, 0x22, 0x27, 0x7, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x7, 0x11, 0x14, 0x6, 0x2, 0x4F, 0x87, 0x6A, 0x67, 0x8C, 0x9B, 0x43, 0x44, 0xE7, 0x3B, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0x3A, 0x42, 0xBD, 0x6C, 0xB, 0xDC, 0xF2, 0x6A, 0xB2, 0xD1, 0xD6, 0x5A, 0xB6, 0xB3, 0xCA, 0xAA, 0x8F, 0xD2, 0x8C, 0xFE, 0x44, 0x8D, 0xFD, 0x9F, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6C, 0x12, 0x8A, 0x76, 0x6, 0x0, 0xFD, 0xD2, 0x7C, 0xFE, 0xCD, 0xF4, 0x15, 0xE0, 0x91, 0xFE, 0xF1, 0x9B, 0xA5, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x52, 0x4, 0xA4, 0x6, 0x0, 0x0, 0xB, 0x0, 0x29, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x33, 0x11, 0x14, 0x6, 0x2, 0x37, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x1, 0xB2, 0x3B, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0xAE, 0xB, 0x6C, 0xB7, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xF3, 0xA0, 0xB6, 0xB3, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xFD, 0x9F, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x70, 0x84, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x2, 0x29, 0xFA, 0xC3, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x1, 0x0, 0x2D, 0xFE, 0x52, 0x2, 0xD7, 0x6, 0x15, 0x0, 0x22, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x15, 0x23, 0x11, 0x33, 0x11, 0x14, 0x6, 0x1, 0x28, 0x3B, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0xC5, 0xA5, 0xA5, 0xCC, 0xB0, 0x43, 0x46, 0x6, 0x2A, 0x34, 0xAB, 0x2, 0xDB, 0xDB, 0xA0, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x3, 0x87, 0xB3, 0x67, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xA8, 0x6B, 0xB3, 0xFD, 0x3C, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x2, 0x0, 0x51, 0xFE, 0x52, 0x5, 0xA1, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x35, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x6, 0x4, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x6, 0x23, 0x22, 0x2, 0x27, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x21, 0x11, 0x14, 0x6, 0x2, 0x3E, 0x97, 0x44, 0x43, 0x96, 0x83, 0x79, 0x77, 0x2, 0xA8, 0x3C, 0x33, 0x1D, 0x23, 0x41, 0x5D, 0xC7, 0xA, 0xFE, 0xF2, 0xD2, 0x59, 0xF4, 0x48, 0x73, 0x6F, 0xA5, 0x79, 0x8D, 0x6A, 0xAF, 0xC5, 0xE8, 0x2, 0xE9, 0xC8, 0xBB, 0x69, 0xA, 0xDC, 0x1, 0x95, 0xB6, 0xB3, 0x80, 0x1, 0xD9, 0x7C, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xFD, 0x9F, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0xCD, 0xDD, 0x51, 0x62, 0x91, 0x85, 0x85, 0x7F, 0x49, 0x76, 0x1, 0x35, 0xE8, 0x1D, 0xF7, 0x1, 0x31, 0x80, 0x6C, 0xFC, 0x89, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x52, 0x4, 0x4C, 0x6, 0x0, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x1, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x1, 0x33, 0x11, 0x14, 0x6, 0x3, 0xE, 0x3B, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0x5F, 0xFE, 0xBF, 0x6D, 0xF3, 0xF3, 0x4D, 0x1, 0x2B, 0x1, 0x24, 0xFE, 0x6D, 0x1, 0x34, 0x9F, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x1, 0xD2, 0x70, 0xFE, 0x9E, 0x6, 0x0, 0xFC, 0x8A, 0x60, 0x1, 0x50, 0xFE, 0x3E, 0xFE, 0x4B, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x1, 0x0, 0x82, 0xFE, 0x52, 0x2, 0x2E, 0x6, 0x0, 0x0, 0x11, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x14, 0x6, 0xF0, 0x3B, 0x33, 0x1C, 0x23, 0x41, 0x5D, 0xC4, 0xF3, 0xA0, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x6, 0x0, 0xFA, 0xC3, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x52, 0x7, 0x1B, 0x4, 0x4E, 0x0, 0x2C, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x33, 0x11, 0x14, 0x6, 0x5, 0xDD, 0x3C, 0x33, 0x1D, 0x23, 0x41, 0x5D, 0xC5, 0x69, 0x59, 0x53, 0x69, 0x14, 0xF3, 0x69, 0x5A, 0x93, 0x3C, 0xF3, 0xE5, 0x7, 0x73, 0xC5, 0xD8, 0x51, 0x77, 0xD6, 0xA5, 0xBD, 0x2, 0xA0, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x2, 0xBE, 0x78, 0x52, 0x5A, 0x48, 0xFD, 0x1A, 0x2, 0xBC, 0x72, 0x5A, 0x78, 0xFC, 0xF0, 0x4, 0x3A, 0x71, 0x85, 0xA5, 0xA5, 0xB6, 0xD2, 0xFD, 0xFD, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x52, 0x4, 0x9E, 0x4, 0x4E, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x33, 0x11, 0x14, 0x6, 0x3, 0x60, 0x3C, 0x33, 0x1D, 0x23, 0x41, 0x5D, 0xC6, 0x61, 0x5D, 0x92, 0x49, 0xF3, 0xE5, 0x8, 0x77, 0xC3, 0x9B, 0xBC, 0x1, 0xA2, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x2, 0xBE, 0x70, 0x5A, 0x85, 0xFC, 0xFD, 0x4, 0x3A, 0x7D, 0x91, 0xB3, 0xDA, 0xFE, 0x2, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x2, 0x0, 0x7D, 0xFE, 0x52, 0x4, 0x31, 0x4, 0x4E, 0x0, 0x1D, 0x0, 0x29, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x6, 0x23, 0x22, 0x27, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x7, 0x11, 0x14, 0x6, 0x3, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x2, 0x9A, 0x3B, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0x3A, 0x43, 0xB1, 0x6C, 0xF2, 0xDF, 0xA, 0x6D, 0xB7, 0xCE, 0xD9, 0x59, 0xB6, 0xDA, 0x83, 0x73, 0x75, 0x83, 0x96, 0x41, 0x43, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6D, 0x13, 0x75, 0xFD, 0xFF, 0x5, 0xDA, 0x6D, 0x81, 0xFE, 0xD0, 0xF8, 0x14, 0xDA, 0x91, 0xFE, 0xEB, 0x9B, 0xA5, 0x2, 0x5D, 0xD3, 0x90, 0x15, 0x92, 0xCF, 0x7D, 0xFE, 0x23, 0x7F, 0x0, 0x1, 0x0, 0x64, 0xFE, 0x52, 0x2, 0xB5, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x33, 0x11, 0x14, 0x6, 0xD2, 0x3B, 0x33, 0x1D, 0x22, 0x41, 0x5D, 0xC4, 0xE8, 0x6, 0x56, 0x9E, 0x31, 0x25, 0x2, 0x32, 0x30, 0xA9, 0x39, 0xA1, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x4, 0x3A, 0x7A, 0x8E, 0xD, 0xE5, 0x8, 0x80, 0xFD, 0xDF, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x1, 0x0, 0x4C, 0xFE, 0x52, 0x3, 0xCA, 0x4, 0x4E, 0x0, 0x30, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x11, 0x14, 0x6, 0x2, 0x8C, 0x3B, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0x64, 0x82, 0xDF, 0xEA, 0xEC, 0x5, 0x8A, 0x50, 0x60, 0x65, 0x55, 0x8E, 0xB0, 0xD9, 0xE0, 0xC1, 0xCB, 0xE7, 0xF3, 0x60, 0x5F, 0x5C, 0x58, 0x5F, 0x7F, 0xBC, 0xD3, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x84, 0x2A, 0xE4, 0x86, 0x64, 0x50, 0x4A, 0x3A, 0x35, 0x4C, 0x1E, 0x25, 0x93, 0x89, 0x85, 0xC3, 0xC6, 0x92, 0x3F, 0x63, 0x52, 0x6C, 0x40, 0x1B, 0x28, 0x92, 0x91, 0xFE, 0x5E, 0x9B, 0xA5, 0x0, 0x1, 0x0, 0x1B, 0xFE, 0x4B, 0x3, 0xDA, 0x6, 0x15, 0x0, 0x25, 0x0, 0x0, 0x13, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x21, 0x11, 0x14, 0x6, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x15, 0x14, 0x6, 0xA4, 0x43, 0x46, 0x7, 0x28, 0x35, 0xAD, 0xCD, 0xAF, 0x43, 0x46, 0x7, 0x28, 0x35, 0xAC, 0x1, 0x1, 0xBA, 0xB6, 0x88, 0x3B, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0xEB, 0xCC, 0xFE, 0x4B, 0x12, 0xBE, 0x8, 0xAC, 0x4, 0xE2, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xAA, 0xFC, 0x20, 0xFE, 0xCF, 0x9B, 0xA5, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x41, 0xB4, 0xC0, 0x0, 0x1, 0x0, 0x17, 0xFE, 0x52, 0x3, 0xDB, 0x4, 0x3A, 0x0, 0x14, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x21, 0x1, 0x33, 0x13, 0x13, 0x33, 0x1, 0x33, 0x11, 0x14, 0x6, 0x2, 0x47, 0x3B, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0xFE, 0xDB, 0xFE, 0x86, 0xFB, 0xEA, 0xE4, 0xFB, 0xFE, 0xCD, 0xDD, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x4, 0x3A, 0xFC, 0xFB, 0x3, 0x5, 0xFC, 0x89, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x1, 0x0, 0x1F, 0xFE, 0x52, 0x4, 0x7, 0x4, 0x3A, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x23, 0x3, 0x3, 0x21, 0x1, 0x1, 0x21, 0x13, 0x13, 0x21, 0x1, 0x13, 0x33, 0x11, 0x14, 0x6, 0x2, 0xC9, 0x3C, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0x5B, 0xD8, 0xD7, 0xFE, 0xF2, 0x1, 0x56, 0xFE, 0xB6, 0x1, 0xD, 0xCA, 0xCE, 0x1, 0xD, 0xFE, 0xB6, 0xDD, 0x97, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x1, 0x72, 0xFE, 0x8E, 0x2, 0x26, 0x2, 0x14, 0xFE, 0x9C, 0x1, 0x64, 0xFD, 0xEC, 0xFE, 0x9D, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x1, 0x0, 0x52, 0xFE, 0x52, 0x3, 0xC0, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x11, 0x14, 0x6, 0x2, 0x82, 0x3B, 0x33, 0x1D, 0x23, 0x41, 0x5C, 0xFD, 0x61, 0x2, 0x26, 0xFD, 0xE5, 0x3, 0x4E, 0xFD, 0xD6, 0x2, 0x3F, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x6E, 0x9F, 0x2, 0xD7, 0xC4, 0x99, 0xFD, 0x22, 0xFE, 0xCF, 0x9B, 0xA5, 0x0, 0x2, 0x0, 0x5B, 0xFE, 0x52, 0x5, 0x1F, 0x4, 0x4E, 0x0, 0x29, 0x0, 0x32, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x23, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x24, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x17, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x0, 0x36, 0x37, 0x35, 0x23, 0x6, 0x15, 0x14, 0x16, 0x4, 0xB0, 0x88, 0xB6, 0x6E, 0x12, 0xA, 0x73, 0xAA, 0xA2, 0xCE, 0x1, 0x2, 0xEA, 0x99, 0x5F, 0x5F, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0xB6, 0xED, 0x2, 0x6D, 0x5D, 0x40, 0x23, 0x1D, 0x33, 0xFD, 0x61, 0x7A, 0x19, 0x94, 0xFF, 0x58, 0xFE, 0x52, 0xA5, 0x9B, 0x6E, 0x25, 0x41, 0x7A, 0xBA, 0x8A, 0xAD, 0xB8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0xBA, 0xBA, 0xFE, 0xF, 0x26, 0xFE, 0xCF, 0x56, 0x3F, 0x7, 0xA3, 0xF, 0x2, 0x5D, 0x51, 0x31, 0xCC, 0x6, 0xAF, 0x41, 0x58, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x52, 0x5, 0x69, 0x4, 0x4E, 0x0, 0x1F, 0x0, 0x2A, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x26, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x16, 0x17, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x1, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x4, 0xFB, 0x88, 0xB6, 0x76, 0x2B, 0x67, 0xC0, 0xCA, 0xDB, 0xDA, 0xCD, 0xB6, 0x66, 0x14, 0xD0, 0x3, 0x45, 0x4D, 0x5D, 0x40, 0x23, 0x1D, 0x33, 0xFC, 0xFD, 0x8D, 0x44, 0x44, 0x8B, 0x83, 0x6F, 0x6D, 0xFE, 0x52, 0xA5, 0x9B, 0x5E, 0x18, 0x85, 0xA2, 0x1, 0x28, 0xE8, 0x14, 0xFC, 0x1, 0x43, 0x97, 0x83, 0xFC, 0xF9, 0x76, 0x1, 0xFE, 0xD6, 0x56, 0x3F, 0x7, 0xA3, 0xF, 0x2, 0x5C, 0x88, 0x1, 0xCA, 0x8B, 0xE0, 0xB1, 0x8B, 0xC1, 0x0, 0x2, 0x0, 0x4E, 0xFE, 0x52, 0x4, 0xDF, 0x6, 0x1F, 0x0, 0xB, 0x0, 0x2F, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x35, 0x94, 0x45, 0x43, 0x94, 0x84, 0x73, 0x72, 0x3, 0x2D, 0x2F, 0x4C, 0x88, 0xCD, 0x6B, 0xAD, 0xC3, 0xE6, 0xE5, 0xC6, 0xAB, 0x6A, 0xD7, 0x7D, 0x49, 0x33, 0x25, 0x1A, 0x41, 0x5C, 0x5D, 0x40, 0x23, 0x1D, 0xB3, 0x84, 0x1, 0xD1, 0x80, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xFD, 0xAE, 0xF, 0x95, 0xAB, 0xD2, 0x78, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x76, 0x1, 0x8, 0xB3, 0x8C, 0xF, 0xA2, 0x7, 0x3F, 0x56, 0xFA, 0xB2, 0x56, 0x3F, 0x7, 0x0, 0x2, 0x0, 0x54, 0xFE, 0x52, 0x4, 0xD7, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x28, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x26, 0x26, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x6, 0x23, 0x22, 0x0, 0x35, 0x35, 0x10, 0x0, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x17, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x3D, 0x64, 0x7A, 0x12, 0x1, 0xCE, 0x4, 0x61, 0x2, 0x21, 0x33, 0x3B, 0x88, 0xB6, 0x5F, 0x73, 0xF1, 0xFE, 0xEC, 0x1, 0x1B, 0xCE, 0xEC, 0xE3, 0xFD, 0x3D, 0xA, 0x95, 0x80, 0xA7, 0x68, 0x83, 0x5D, 0x41, 0x23, 0x1C, 0x3, 0x8B, 0x8C, 0x7C, 0x12, 0x5F, 0x97, 0xFA, 0xD6, 0xF, 0xA5, 0x9B, 0x80, 0x26, 0x1, 0x2C, 0xDF, 0x29, 0x1, 0x1, 0x1, 0x2D, 0xFE, 0xD4, 0xEA, 0x67, 0x7D, 0xA5, 0x86, 0x7D, 0xFE, 0xDA, 0x56, 0x3F, 0x7, 0x0, 0x1, 0x0, 0x61, 0xFE, 0x52, 0x4, 0xEB, 0x4, 0x4D, 0x0, 0x31, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x6, 0x23, 0x22, 0x24, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x4, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x4, 0xEB, 0x33, 0x3C, 0x88, 0xB6, 0x72, 0x8E, 0xCD, 0xFE, 0xF0, 0xCB, 0xB8, 0xFD, 0xCD, 0xB6, 0x1, 0x7, 0xF2, 0x79, 0x59, 0x6D, 0x64, 0x62, 0x68, 0xC7, 0xD2, 0xD1, 0x75, 0x6D, 0x6B, 0x7A, 0xF3, 0x5C, 0x41, 0x23, 0x1D, 0xFE, 0x61, 0xF, 0xA5, 0x9B, 0x8C, 0x32, 0xAC, 0x9A, 0xB9, 0x42, 0x4D, 0x98, 0x9A, 0xA1, 0xAE, 0x98, 0x3E, 0x4D, 0x57, 0x34, 0x3C, 0x4C, 0xAD, 0x4, 0x91, 0x3A, 0x5C, 0x5D, 0x3D, 0xFE, 0x51, 0x56, 0x3F, 0x7, 0x0, 0x1, 0x0, 0x4D, 0xFE, 0x52, 0x3, 0xFA, 0x4, 0x4D, 0x0, 0x31, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x4, 0x23, 0x22, 0x27, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x1, 0xFA, 0x33, 0x3C, 0x88, 0xB6, 0xF2, 0x7A, 0x6B, 0x6E, 0x75, 0xD4, 0xD0, 0xC7, 0x69, 0x61, 0x63, 0x6E, 0x58, 0x7A, 0xF2, 0x1, 0x8, 0xB5, 0xCE, 0xFD, 0xB8, 0xCB, 0xFE, 0xF0, 0xCE, 0x8E, 0x72, 0x5E, 0x40, 0x23, 0x1D, 0xFE, 0x61, 0xF, 0xA5, 0x9B, 0x1, 0xAF, 0x3D, 0x5D, 0x5C, 0x3A, 0x92, 0x3, 0xAD, 0x4C, 0x3C, 0x34, 0x57, 0x4D, 0x3E, 0x98, 0xAE, 0xA1, 0x9A, 0x98, 0x4D, 0x42, 0xB9, 0x9A, 0xAC, 0x32, 0x8C, 0x56, 0x3F, 0x7, 0x0, 0x2, 0x0, 0x47, 0xFE, 0x52, 0x5, 0xD6, 0x4, 0x4E, 0x0, 0x22, 0x0, 0x2A, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x11, 0x23, 0x6, 0x4, 0x23, 0x22, 0x2, 0x35, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x0, 0x17, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x1, 0x32, 0x36, 0x37, 0x21, 0x15, 0x16, 0x16, 0x5, 0x67, 0x87, 0xB6, 0x31, 0x1C, 0xFE, 0xF2, 0xBA, 0xEC, 0xE2, 0x2, 0xC3, 0xA, 0x95, 0x80, 0xA8, 0x68, 0x83, 0x34, 0xCC, 0xA1, 0xE6, 0x1, 0x13, 0xC, 0xFB, 0x5D, 0x40, 0x23, 0x1D, 0x33, 0xFC, 0x73, 0x63, 0x7B, 0x11, 0xFE, 0x32, 0x5, 0x61, 0xFE, 0x52, 0xA5, 0x9B, 0x2, 0x25, 0xD5, 0xF6, 0x1, 0x2C, 0xEA, 0x67, 0x7D, 0xA5, 0x86, 0x7D, 0x4D, 0x7F, 0xFE, 0xEC, 0xD1, 0xFD, 0x29, 0x56, 0x3F, 0x7, 0xA3, 0xF, 0x2, 0x5D, 0x8C, 0x7C, 0x12, 0x5E, 0x98, 0x0, 0x2, 0x0, 0x7D, 0xFE, 0x52, 0x2, 0xD4, 0x5, 0xD5, 0x0, 0x9, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x22, 0x26, 0x35, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x7D, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x1, 0xE8, 0x88, 0xB6, 0x9B, 0xF3, 0x78, 0x5D, 0x40, 0x23, 0x1D, 0x33, 0x5, 0x54, 0x38, 0x49, 0x49, 0x38, 0x37, 0x4A, 0x4A, 0xF9, 0x35, 0xA5, 0x9B, 0x6E, 0x4, 0x3A, 0xFC, 0x9E, 0xFE, 0xBA, 0x56, 0x3F, 0x7, 0xA3, 0xF, 0x0, 0x1, 0x0, 0x3B, 0xFE, 0x52, 0x3, 0xE8, 0x4, 0x4E, 0x0, 0x27, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x2, 0x23, 0x22, 0x27, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x1, 0xE8, 0x33, 0x3C, 0x88, 0xB6, 0xEC, 0x5, 0x7A, 0x58, 0x95, 0x62, 0x62, 0x95, 0x63, 0x6F, 0x5, 0xE5, 0x5, 0xF1, 0xC4, 0xF7, 0xF3, 0x2, 0xF3, 0xFA, 0x84, 0x6D, 0x5D, 0x41, 0x23, 0x1D, 0xFE, 0x61, 0xF, 0xA5, 0x9B, 0x1, 0xD4, 0x4F, 0x68, 0xD9, 0x83, 0x24, 0x81, 0xDB, 0x7D, 0x57, 0xB3, 0xE4, 0xFE, 0xC4, 0xDD, 0x2A, 0xDF, 0xFE, 0xC0, 0x42, 0x9C, 0x56, 0x3F, 0x7, 0x0, 0x1, 0x0, 0x1B, 0xFE, 0x4B, 0x3, 0x31, 0x6, 0x2D, 0x0, 0x20, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x14, 0x6, 0x7, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x1, 0x59, 0x88, 0xB6, 0x7, 0x27, 0x36, 0xAD, 0x1, 0xCC, 0xAF, 0x43, 0x46, 0x6, 0x2A, 0x34, 0xAC, 0x1, 0xA4, 0x91, 0x5D, 0x40, 0x23, 0x1D, 0x33, 0xFE, 0x4B, 0xA5, 0x9B, 0x25, 0xBF, 0x9, 0xAB, 0x3, 0xA8, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xAA, 0xFC, 0x58, 0xA2, 0xBB, 0x13, 0x18, 0x56, 0x3F, 0x7, 0xA3, 0xF, 0x0, 0x1, 0x0, 0x77, 0xFE, 0x52, 0x5, 0x58, 0x4, 0x3A, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x23, 0x27, 0x6, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x4, 0xEA, 0x88, 0xB6, 0x9A, 0x6, 0x6A, 0xC6, 0x9E, 0xC6, 0x1, 0xF3, 0x67, 0x45, 0xAE, 0x40, 0xF3, 0x84, 0x5D, 0x41, 0x23, 0x1C, 0x33, 0xFE, 0x52, 0xA5, 0x9B, 0x6E, 0x6A, 0x7E, 0xBA, 0xD5, 0x2, 0xBF, 0xFD, 0x43, 0x75, 0x55, 0x7D, 0x3, 0xA, 0xFC, 0x9E, 0xFE, 0xBA, 0x56, 0x3F, 0x7, 0xA3, 0xF, 0x0, 0x1, 0x0, 0x5E, 0xFD, 0xDA, 0x4, 0x46, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x23, 0x22, 0x27, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0xA, 0x33, 0x3B, 0x88, 0xB6, 0xF3, 0x85, 0x70, 0x80, 0x8E, 0x9B, 0x93, 0x84, 0x1, 0x49, 0xFD, 0xA4, 0x3, 0x8D, 0x1, 0xFE, 0x87, 0xC8, 0xDA, 0xFE, 0xDF, 0xDF, 0xA7, 0x7F, 0x6A, 0x41, 0x22, 0x1D, 0xFD, 0xE9, 0xF, 0xA3, 0x9B, 0x1, 0x6E, 0x5E, 0x88, 0x88, 0x65, 0x7A, 0x69, 0xAB, 0x1, 0x5B, 0xC4, 0x9B, 0xFE, 0x7B, 0x15, 0xCC, 0xAC, 0xCE, 0xE2, 0x4A, 0xF, 0x56, 0x3D, 0x7, 0x0, 0x2, 0x0, 0x41, 0x2, 0x7D, 0x3, 0x70, 0x5, 0xBC, 0x0, 0x15, 0x0, 0x20, 0x0, 0x0, 0x1, 0x22, 0x27, 0x7, 0x23, 0x11, 0x26, 0x23, 0x7, 0x27, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x2, 0x29, 0x86, 0x4C, 0xE, 0xAC, 0x2, 0x35, 0x13, 0x12, 0x38, 0x26, 0x8E, 0x26, 0x4C, 0x8C, 0x96, 0xAF, 0xAF, 0xC5, 0x61, 0x4E, 0x4C, 0x62, 0x68, 0x33, 0x32, 0x2, 0x7D, 0x70, 0x61, 0x2, 0x30, 0x5B, 0x3, 0x91, 0x17, 0x74, 0x74, 0xDB, 0xAA, 0xF, 0xBB, 0xF0, 0x95, 0xA2, 0x83, 0x67, 0x8A, 0x63, 0xFE, 0xB2, 0x65, 0x0, 0x1, 0x0, 0x3C, 0x2, 0x7C, 0x2, 0xF5, 0x5, 0xBA, 0x0, 0x19, 0x0, 0x0, 0x1, 0x32, 0x37, 0x33, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0xAD, 0x88, 0x14, 0xAC, 0x4, 0xBC, 0x86, 0xB8, 0xBB, 0xBB, 0xB8, 0x92, 0xB0, 0x4, 0xAC, 0x15, 0x87, 0x5F, 0x4D, 0x4B, 0x3, 0x23, 0x71, 0x74, 0xA4, 0xED, 0xA5, 0x1A, 0xA5, 0xED, 0xA8, 0x85, 0x86, 0x8B, 0x60, 0x1A, 0x61, 0x8A, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x26, 0x3, 0x40, 0x5, 0xBA, 0x0, 0x8, 0x0, 0x27, 0x0, 0x0, 0x1, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x16, 0x17, 0x22, 0x27, 0x7, 0x27, 0x37, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x2, 0x1, 0x32, 0x50, 0x39, 0x40, 0x68, 0x27, 0x34, 0x78, 0x57, 0x71, 0x81, 0x82, 0x3A, 0xBE, 0xB3, 0x92, 0xB3, 0x4, 0xAC, 0x15, 0x87, 0x61, 0x4C, 0x6, 0x86, 0x89, 0x77, 0x6B, 0xC2, 0x3, 0x1B, 0x26, 0x29, 0x31, 0x67, 0x19, 0x9F, 0x36, 0x8C, 0x5F, 0x9F, 0x63, 0x86, 0x1B, 0xAA, 0xE8, 0xA8, 0x85, 0x86, 0x8C, 0x5F, 0x1B, 0x2A, 0x23, 0x7A, 0x78, 0x4D, 0x72, 0x87, 0x0, 0x2, 0x0, 0x3C, 0x2, 0x7D, 0x3, 0x3A, 0x6, 0xEF, 0x0, 0x1A, 0x0, 0x25, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x26, 0x27, 0x7, 0x27, 0x37, 0x26, 0x27, 0x37, 0x16, 0x17, 0x37, 0x17, 0x7, 0x16, 0x13, 0x15, 0x14, 0x6, 0x27, 0x32, 0x11, 0x35, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x1, 0xBB, 0xAA, 0xD5, 0xC3, 0xAB, 0x62, 0x50, 0x20, 0x49, 0xAB, 0x40, 0x8B, 0x29, 0x2F, 0x3E, 0x6F, 0x5B, 0xA9, 0x40, 0x93, 0xA0, 0x1, 0xDA, 0xA2, 0xB7, 0x42, 0x79, 0x5B, 0x5E, 0x5F, 0x2, 0x7D, 0xD3, 0x97, 0xA9, 0xCD, 0x36, 0x6F, 0x4C, 0x60, 0x5C, 0x4E, 0x17, 0xF, 0x9D, 0x1B, 0x45, 0x5F, 0x5C, 0x53, 0xB6, 0xFE, 0xE5, 0x42, 0xBF, 0xF0, 0xA7, 0x1, 0x12, 0x4A, 0x3B, 0x71, 0x63, 0x54, 0x6F, 0x0, 0x1, 0x0, 0x32, 0x2, 0x7C, 0x2, 0xDE, 0x5, 0xBA, 0x0, 0x20, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x33, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x1, 0x85, 0x7A, 0xD9, 0xB8, 0xB, 0x95, 0x8E, 0x86, 0x93, 0x93, 0x78, 0x80, 0x8F, 0x4, 0xB9, 0xC4, 0x83, 0x93, 0xB7, 0x85, 0x94, 0xC6, 0x2, 0x7C, 0x7A, 0x83, 0x5D, 0x61, 0x5B, 0x1, 0x97, 0x1, 0x52, 0x55, 0x50, 0x71, 0x81, 0x78, 0x72, 0x6F, 0x3A, 0x30, 0x8A, 0x71, 0x80, 0x0, 0x1, 0x0, 0x35, 0x2, 0x8C, 0x2, 0x34, 0x7, 0x1E, 0x0, 0x14, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x2, 0x19, 0xA5, 0xC5, 0x7A, 0x7A, 0x9B, 0x82, 0x34, 0x34, 0x5, 0x1C, 0x2B, 0x73, 0x1, 0xA5, 0x5, 0xC, 0xFD, 0x80, 0x2, 0x80, 0xA0, 0x55, 0x8D, 0x90, 0xD, 0x9F, 0x6, 0x75, 0x57, 0x0, 0x1, 0x0, 0x33, 0x1, 0x4C, 0x2, 0x4D, 0x5, 0xAD, 0x0, 0x15, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x6, 0xAB, 0x36, 0x2A, 0x17, 0x20, 0x32, 0x2F, 0xB0, 0xB0, 0xC5, 0xA5, 0xA5, 0x7A, 0x1, 0x4C, 0xD, 0xA6, 0x6, 0x38, 0x49, 0x1, 0x91, 0xA0, 0x1, 0x2, 0xFE, 0xFE, 0xA0, 0xFE, 0x70, 0x87, 0xA8, 0xFF, 0xFF, 0x0, 0x3C, 0x1, 0x4C, 0x3, 0x16, 0x5, 0xBA, 0x0, 0x6, 0x3, 0x7C, 0x0, 0x0, 0x0, 0x1, 0x0, 0x64, 0x1, 0xB, 0x2, 0xFA, 0x5, 0xAD, 0x0, 0x10, 0x0, 0x0, 0x1, 0x23, 0x11, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x2, 0xFA, 0xC5, 0x4B, 0x82, 0x79, 0x8B, 0xC5, 0x4, 0x7F, 0x61, 0x28, 0xC5, 0x1, 0xB, 0x1, 0xE5, 0x71, 0x91, 0xA2, 0x1, 0xFB, 0xFE, 0x28, 0xAF, 0x58, 0x2, 0x2F, 0x0, 0x2, 0x0, 0x28, 0x2, 0x8C, 0x2, 0x42, 0x6, 0xEA, 0x0, 0x9, 0x0, 0x15, 0x0, 0x0, 0x12, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0xC2, 0x3B, 0x37, 0x36, 0x3C, 0x3C, 0x36, 0x37, 0x3B, 0x1, 0x80, 0xAC, 0xC5, 0xA9, 0xA9, 0xC5, 0xAC, 0x6, 0xAC, 0x3E, 0x3E, 0x5C, 0x3D, 0x3D, 0xFD, 0xBB, 0xFE, 0x81, 0x1, 0x7F, 0xA0, 0x1, 0x2, 0xFE, 0xFE, 0x0, 0x1, 0x0, 0x64, 0x2, 0x82, 0x1, 0xCF, 0x5, 0xAD, 0x0, 0xC, 0x0, 0x0, 0x13, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x26, 0x35, 0x64, 0xC4, 0x3, 0x43, 0x1C, 0x2A, 0x1B, 0x3A, 0x50, 0x62, 0x7F, 0x5, 0xAD, 0xFD, 0xC9, 0x4D, 0x10, 0x95, 0x22, 0x73, 0x7E, 0x0, 0x1, 0x0, 0x3F, 0x2, 0x8C, 0x2, 0x2B, 0x5, 0xEB, 0x0, 0xB, 0x0, 0x0, 0x1, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x2, 0x2B, 0xFE, 0x14, 0x93, 0x93, 0x1, 0xEC, 0x94, 0x94, 0x2, 0x8C, 0xA0, 0x2, 0x1F, 0xA0, 0xA0, 0xFD, 0xE1, 0x0, 0x1, 0x0, 0x28, 0x2, 0x8C, 0x2, 0x42, 0x5, 0xEB, 0x0, 0x13, 0x0, 0x0, 0x1, 0x21, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x2, 0x2B, 0xFE, 0x14, 0x93, 0xAA, 0xAA, 0x93, 0x1, 0xEC, 0x94, 0xAB, 0xAB, 0x94, 0x2, 0x8C, 0xA0, 0xEC, 0xA0, 0x93, 0xA0, 0xA0, 0x93, 0xA0, 0xEC, 0x0, 0x3, 0x0, 0x0, 0x1, 0x3D, 0x2, 0x7D, 0x6, 0xEA, 0x0, 0x7, 0x0, 0x17, 0x0, 0x20, 0x0, 0x0, 0x0, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x3, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x14, 0x6, 0x27, 0x32, 0x36, 0x35, 0x35, 0x23, 0x22, 0x15, 0x14, 0x1, 0x1F, 0x3B, 0x6C, 0x3D, 0x3D, 0x6C, 0x3B, 0x24, 0x67, 0x94, 0x9D, 0x6A, 0x27, 0xC5, 0x8A, 0x8A, 0x70, 0x90, 0x24, 0x17, 0x21, 0x50, 0x6, 0xAC, 0x3E, 0x3E, 0x5C, 0x3D, 0x3D, 0xFA, 0xED, 0x6A, 0x67, 0x77, 0x7C, 0x2, 0xAC, 0xFD, 0x54, 0xA7, 0x83, 0x9A, 0xA3, 0x2C, 0x22, 0x2C, 0x40, 0x3A, 0x0, 0x1, 0x0, 0x64, 0x1, 0x4C, 0x1, 0xB5, 0x7, 0xE, 0x0, 0xB, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x27, 0x11, 0x33, 0x11, 0x14, 0x33, 0x32, 0x37, 0x1, 0xB5, 0x52, 0x43, 0xBA, 0x2, 0xC5, 0x48, 0x1D, 0x27, 0x1, 0x5D, 0x11, 0xF5, 0x4, 0xCD, 0xFB, 0x4A, 0x50, 0x9, 0x0, 0x1, 0x0, 0x64, 0x1, 0x4C, 0x1, 0xC3, 0x7, 0xE, 0x0, 0xF, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x15, 0x14, 0x1, 0x7, 0x43, 0x52, 0x27, 0x1D, 0x48, 0x9A, 0xC5, 0x9A, 0x1, 0x4C, 0x11, 0xB4, 0x9, 0x50, 0x34, 0x4, 0x82, 0xFC, 0x25, 0xED, 0xFA, 0x0, 0x1, 0x0, 0x65, 0x2, 0x8C, 0x2, 0xC0, 0x5, 0xAD, 0x0, 0x5, 0x0, 0x0, 0x13, 0x11, 0x33, 0x11, 0x21, 0x15, 0x65, 0xC5, 0x1, 0x96, 0x2, 0x8C, 0x3, 0x21, 0xFD, 0x86, 0xA7, 0x0, 0x1, 0x0, 0x64, 0x1, 0x4C, 0x4, 0xCA, 0x5, 0xBA, 0x0, 0x25, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x17, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x4, 0xE, 0x45, 0x50, 0x2A, 0x1A, 0x48, 0x46, 0x3D, 0x63, 0x27, 0x2, 0xC5, 0x4, 0x7E, 0x62, 0x28, 0xC5, 0x98, 0x20, 0x4C, 0x8F, 0xB5, 0x37, 0x4A, 0x99, 0x79, 0x8B, 0x1, 0x4C, 0x11, 0xB4, 0x9, 0x50, 0x1, 0xFE, 0x69, 0x54, 0x5A, 0x23, 0xFD, 0xF6, 0x1, 0xD9, 0xAE, 0x59, 0xFD, 0xD2, 0x3, 0x21, 0x7A, 0x87, 0x98, 0x98, 0x91, 0xA2, 0xFD, 0xBF, 0xFA, 0x0, 0x1, 0x0, 0x64, 0x1, 0x4C, 0x4, 0xCA, 0x5, 0xAD, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x23, 0x11, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x27, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x4, 0xCA, 0xC5, 0x4C, 0x82, 0xB5, 0x37, 0x4A, 0x99, 0x79, 0x8B, 0xC5, 0x4, 0x7F, 0x63, 0x27, 0x2, 0xC5, 0x4, 0x7E, 0x62, 0x28, 0xC5, 0x1, 0x4C, 0x1, 0xA4, 0x71, 0x98, 0x98, 0x91, 0xA2, 0x1, 0xFB, 0xFE, 0x28, 0xAF, 0x5A, 0x23, 0x2, 0xA, 0xFE, 0x28, 0xAF, 0x59, 0x2, 0x2E, 0x0, 0x1, 0x0, 0x1A, 0x1, 0x4C, 0x3, 0x3C, 0x5, 0xBA, 0x0, 0x18, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x7, 0x11, 0x6, 0xAF, 0x46, 0x4F, 0x27, 0x1D, 0x47, 0xAB, 0x11, 0x4C, 0x8B, 0x79, 0x8B, 0xC5, 0x4, 0x7F, 0x61, 0x28, 0x3, 0x1, 0x4C, 0x11, 0xB4, 0x9, 0x50, 0x3, 0x55, 0x73, 0x80, 0x91, 0xA2, 0xFE, 0x5, 0x1, 0xD9, 0xAE, 0x58, 0xFD, 0x83, 0xF2, 0x0, 0x1, 0x0, 0x64, 0x1, 0x4C, 0x3, 0x86, 0x5, 0xBA, 0x0, 0x18, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x27, 0x11, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x33, 0x32, 0x37, 0x3, 0x86, 0x4F, 0x46, 0xB9, 0x3, 0x4, 0x7E, 0x62, 0x28, 0xC5, 0xAB, 0x12, 0x4C, 0x8A, 0x78, 0x8B, 0x48, 0x1D, 0x27, 0x1, 0x5D, 0x11, 0xF2, 0x2, 0x27, 0xAE, 0x59, 0xFD, 0xD2, 0x3, 0x21, 0x71, 0x7E, 0x91, 0xA2, 0xFD, 0xD1, 0x50, 0x9, 0x0, 0x1, 0x0, 0x64, 0x2, 0x8C, 0x3, 0x83, 0x5, 0xAD, 0x0, 0x9, 0x0, 0x0, 0x1, 0x1, 0x11, 0x23, 0x11, 0x33, 0x1, 0x11, 0x33, 0x11, 0x2, 0xBD, 0xFE, 0x6C, 0xC5, 0xC5, 0x1, 0x94, 0xC6, 0x2, 0x8C, 0x1, 0xEA, 0xFE, 0x16, 0x3, 0x21, 0xFE, 0x17, 0x1, 0xE9, 0xFC, 0xDF, 0x0, 0x3, 0x0, 0x3C, 0x2, 0x7C, 0x3, 0x32, 0x5, 0xBA, 0x0, 0xD, 0x0, 0x12, 0x0, 0x17, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x1, 0x22, 0x7, 0x21, 0x26, 0x3, 0x32, 0x37, 0x21, 0x16, 0x3C, 0xCB, 0xAF, 0xB1, 0xCB, 0xCB, 0xB0, 0xAF, 0xCC, 0x1, 0x7A, 0x8E, 0x20, 0x1, 0x5E, 0x20, 0x8F, 0x93, 0x1D, 0xFE, 0xA0, 0x1C, 0x4, 0x23, 0xB3, 0xE4, 0xE4, 0xB3, 0x10, 0xB3, 0xE4, 0xE4, 0xB3, 0x1, 0x0, 0x9F, 0x9F, 0xFE, 0x10, 0xA7, 0xA7, 0x0, 0x3, 0x0, 0x3C, 0x1, 0x57, 0x4, 0x31, 0x7, 0xD, 0x0, 0x9, 0x0, 0x14, 0x0, 0x2D, 0x0, 0x0, 0x1, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x21, 0x32, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x6, 0x23, 0x22, 0x26, 0x10, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x1, 0x95, 0x21, 0x1B, 0x1A, 0x21, 0x50, 0x45, 0x1, 0xD2, 0x98, 0x49, 0x50, 0x21, 0x1B, 0x1B, 0x55, 0x3F, 0x31, 0xC5, 0x2F, 0x3B, 0x8E, 0x9D, 0x9C, 0x91, 0x3A, 0x2E, 0xC5, 0x30, 0x3E, 0x91, 0x9C, 0x9C, 0x3, 0x20, 0xB, 0x1, 0xDF, 0xB, 0x90, 0x84, 0xE1, 0xE7, 0xA, 0x73, 0x91, 0xC, 0xFE, 0x21, 0xA, 0xA5, 0x16, 0xFE, 0xC6, 0x1, 0x39, 0x15, 0xDB, 0x1, 0x76, 0xEE, 0x15, 0x1, 0x68, 0xFE, 0x96, 0x17, 0xED, 0xCC, 0xAA, 0xDC, 0x0, 0x1, 0x0, 0x3C, 0x1, 0x4C, 0x2, 0xDF, 0x5, 0xBA, 0x0, 0x2C, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x15, 0x16, 0x33, 0x32, 0x37, 0x1, 0x8D, 0x4F, 0x46, 0x66, 0x56, 0xBE, 0x10, 0x98, 0x79, 0xAD, 0x86, 0x92, 0xAC, 0x87, 0x9D, 0xB3, 0xC3, 0x1, 0x40, 0x46, 0x76, 0x4E, 0x56, 0x8E, 0x94, 0xA7, 0x9C, 0x5C, 0x49, 0x3, 0x4F, 0x1D, 0x27, 0x1, 0x5D, 0x11, 0x81, 0x84, 0x1, 0x37, 0x72, 0x4C, 0x47, 0x27, 0x1E, 0x73, 0x6A, 0x6E, 0x81, 0x93, 0x6B, 0x28, 0x3D, 0x4E, 0x28, 0x2A, 0x13, 0x1F, 0x74, 0x6D, 0x72, 0x80, 0x1C, 0x48, 0x48, 0x9, 0x0, 0x1, 0x0, 0x1A, 0x1, 0x4C, 0x1, 0xF6, 0x7, 0xE, 0x0, 0x13, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x11, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x15, 0x11, 0x6, 0xAF, 0x43, 0x52, 0x27, 0x1D, 0x47, 0x2, 0xBA, 0x42, 0x53, 0x34, 0x10, 0x47, 0x2, 0x1, 0x4C, 0x11, 0xB4, 0x9, 0x50, 0x3, 0xC1, 0xF5, 0x10, 0xB4, 0x8, 0x4F, 0xFC, 0x3E, 0xF5, 0x0, 0x1, 0x0, 0x28, 0x1, 0x4C, 0x2, 0x7, 0x6, 0x70, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x35, 0x26, 0x27, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x33, 0x32, 0x37, 0x15, 0x6, 0x1, 0x47, 0x46, 0x4F, 0x27, 0x1D, 0x48, 0x90, 0x2, 0x84, 0x84, 0xC5, 0x96, 0x96, 0x51, 0x19, 0x28, 0x5, 0x1, 0x4C, 0x11, 0xB4, 0x9, 0x4A, 0x32, 0x24, 0xD2, 0x1, 0x8C, 0xA7, 0xC3, 0xC3, 0xA7, 0xFE, 0x8B, 0x6D, 0x8, 0xF3, 0xED, 0x0, 0x2, 0x0, 0x28, 0x2, 0x7F, 0x3, 0xA2, 0x5, 0xAD, 0x0, 0x6, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x32, 0x37, 0x35, 0x21, 0x14, 0x16, 0x17, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x1, 0xE2, 0x61, 0x28, 0xFE, 0xF4, 0x46, 0xE1, 0x12, 0x4B, 0x8C, 0x78, 0x8B, 0x72, 0x72, 0xC5, 0x1, 0xC, 0xC5, 0x72, 0x72, 0x3, 0x26, 0x59, 0x64, 0x69, 0x54, 0x9A, 0x73, 0x80, 0x91, 0xA2, 0x31, 0xA7, 0x1, 0x23, 0xFE, 0xDD, 0x1, 0x23, 0xFE, 0xDD, 0xA7, 0xFE, 0xA9, 0x0, 0x1, 0x0, 0x4C, 0x2, 0x7F, 0x3, 0x81, 0x5, 0xAD, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x36, 0x34, 0x26, 0x26, 0x27, 0x35, 0x34, 0x36, 0x36, 0x33, 0x15, 0x22, 0x6, 0x15, 0x14, 0x16, 0x16, 0x15, 0x14, 0x6, 0x6, 0x23, 0x22, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x6, 0x14, 0x16, 0x2, 0x6A, 0x51, 0x3C, 0x3B, 0x2, 0x29, 0x84, 0x87, 0x22, 0x49, 0x3B, 0x3B, 0x44, 0xB2, 0xA5, 0xA4, 0xB2, 0x44, 0x3B, 0x1D, 0x1E, 0x48, 0x23, 0x88, 0x83, 0x29, 0x3C, 0x1D, 0x20, 0x50, 0x3, 0x26, 0x74, 0x68, 0x58, 0x5A, 0x36, 0x7, 0x25, 0x57, 0x40, 0xA1, 0x17, 0x29, 0x22, 0x47, 0x5F, 0x49, 0x47, 0x93, 0x62, 0x62, 0x93, 0x47, 0x49, 0x5F, 0x23, 0x24, 0x22, 0x29, 0x17, 0xA1, 0x40, 0x57, 0x25, 0x3A, 0x5D, 0x2A, 0x2E, 0x68, 0x74, 0x0, 0x1, 0x0, 0x5B, 0x2, 0x7E, 0x3, 0x50, 0x5, 0xAD, 0x0, 0xF, 0x0, 0x0, 0x1, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x2, 0x8B, 0xC5, 0xD2, 0xA9, 0xA6, 0xD4, 0xC5, 0x1, 0xB4, 0xB5, 0x1, 0x5, 0xAD, 0xFE, 0x27, 0xAD, 0xA9, 0xA9, 0xAD, 0x1, 0xD9, 0xFE, 0x25, 0xAE, 0xAE, 0x0, 0x1, 0x0, 0x5B, 0x2, 0x7F, 0x3, 0x13, 0x5, 0xBA, 0x0, 0x18, 0x0, 0x0, 0x1, 0x32, 0x36, 0x35, 0x35, 0x34, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x32, 0x17, 0x15, 0x14, 0x6, 0x20, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x1, 0xB7, 0x41, 0x56, 0x41, 0x1C, 0x27, 0x4F, 0x3E, 0xB7, 0x5, 0xC1, 0xFE, 0xCA, 0xC1, 0xC5, 0x57, 0x3, 0x26, 0x54, 0x6A, 0xD0, 0x4A, 0x9, 0xB4, 0x11, 0xED, 0xFA, 0xBA, 0x9A, 0x9A, 0xBA, 0x1, 0xDA, 0xFE, 0x37, 0x6A, 0x54, 0x0, 0x1, 0x0, 0x1C, 0x2, 0x8C, 0x2, 0xFF, 0x5, 0xAD, 0x0, 0x8, 0x0, 0x0, 0x1, 0x3, 0x23, 0x1, 0x33, 0x1, 0x23, 0x3, 0x27, 0x1, 0x87, 0x97, 0xD4, 0x1, 0x18, 0xB6, 0x1, 0x15, 0xD3, 0x93, 0x9, 0x4, 0x99, 0xFD, 0xF3, 0x3, 0x21, 0xFC, 0xDF, 0x2, 0xD, 0x30, 0x0, 0x1, 0x0, 0x2E, 0x2, 0x8C, 0x2, 0xB8, 0x5, 0xAD, 0x0, 0x9, 0x0, 0x0, 0x13, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0x2E, 0x1, 0x7C, 0xFE, 0x8C, 0x2, 0x72, 0xFE, 0x82, 0x1, 0x8E, 0x2, 0x8C, 0x84, 0x1, 0xF6, 0xA7, 0x7F, 0xFE, 0x5, 0xA7, 0x0, 0x1, 0x0, 0x2E, 0x1, 0x4C, 0x3, 0x43, 0x5, 0xAD, 0x0, 0x13, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x27, 0x35, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0x14, 0x33, 0x32, 0x37, 0x3, 0x43, 0x4F, 0x46, 0xB8, 0x4, 0xFE, 0x3C, 0x1, 0x7C, 0xFE, 0x8C, 0x2, 0x72, 0xFE, 0x82, 0x1, 0x8E, 0x47, 0x1D, 0x27, 0x1, 0x5D, 0x11, 0xF0, 0x50, 0x84, 0x1, 0xF6, 0xA7, 0x7F, 0xFE, 0x5, 0xE1, 0x4A, 0x9, 0x0, 0x2, 0x0, 0x2E, 0x1, 0xEA, 0x3, 0xA3, 0x5, 0xAD, 0x0, 0x6, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x22, 0x7, 0x33, 0x36, 0x35, 0x34, 0x1, 0x7, 0x27, 0x37, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x33, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x2, 0xB1, 0x2B, 0x48, 0x15, 0x8B, 0xFE, 0xF7, 0x6C, 0x97, 0x29, 0xCD, 0x1, 0x7C, 0xFE, 0x8C, 0x2, 0x72, 0xFE, 0x82, 0x47, 0x63, 0x94, 0x6B, 0x62, 0x6E, 0xB6, 0xA2, 0x3, 0xA3, 0x70, 0x2, 0x43, 0x2B, 0xFE, 0xE9, 0xA2, 0x68, 0x3A, 0x84, 0x1, 0xF6, 0xA7, 0x7F, 0xFE, 0x5, 0x8D, 0x8D, 0x6C, 0x56, 0x74, 0x8B, 0x0, 0x1, 0x0, 0x33, 0x1, 0x54, 0x3, 0x2B, 0x5, 0xAD, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x13, 0x21, 0x35, 0x21, 0x17, 0x1, 0x4, 0x11, 0x14, 0x6, 0x1, 0xAE, 0x8E, 0xED, 0xC7, 0x4, 0x55, 0x5B, 0x56, 0x62, 0x7E, 0x63, 0x63, 0xF7, 0xFE, 0x45, 0x2, 0xAD, 0x1, 0xFE, 0xF4, 0x1, 0x2B, 0xE0, 0x1, 0x54, 0x96, 0xA7, 0x41, 0x57, 0x57, 0x49, 0x65, 0x4A, 0xA5, 0x1, 0x19, 0xA7, 0x80, 0xFE, 0xBA, 0x30, 0xFE, 0xE0, 0x97, 0xAC, 0x0, 0x3, 0x0, 0x58, 0x2, 0x7B, 0x3, 0x49, 0x6, 0xCE, 0x0, 0xD, 0x0, 0x15, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x1, 0x21, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x13, 0x32, 0x36, 0x35, 0x21, 0x15, 0x14, 0x16, 0x1, 0xD1, 0x9A, 0xDF, 0xDD, 0x9B, 0x9D, 0xDC, 0xDB, 0xFE, 0xAE, 0x1, 0x68, 0x58, 0x5C, 0x5A, 0x5A, 0xB5, 0x5E, 0x55, 0xFE, 0x98, 0x5B, 0x2, 0x7B, 0xEF, 0xFC, 0x84, 0xFD, 0xE7, 0xE7, 0xFD, 0x84, 0xFC, 0xEF, 0x2, 0x7F, 0x9, 0x9E, 0x87, 0x86, 0xFD, 0x80, 0x90, 0xA1, 0x4, 0x9D, 0x90, 0x0, 0x3, 0xFB, 0xCE, 0x4, 0x90, 0xFF, 0x6A, 0x6, 0x0, 0x0, 0x3, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x1, 0x13, 0x23, 0x1, 0x5, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x5, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0xFD, 0x9B, 0xC3, 0xCA, 0xFE, 0xF2, 0x1, 0xD0, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0xFD, 0x78, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x6, 0x0, 0xFE, 0xD2, 0x1, 0x2E, 0x92, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x2F, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x3, 0xFB, 0xCB, 0x4, 0x90, 0xFF, 0x67, 0x6, 0x0, 0x0, 0x3, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x1, 0x13, 0x21, 0x1, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x5, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0xFC, 0xDE, 0xC3, 0x1, 0x15, 0xFE, 0xEB, 0xFE, 0x2A, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x2, 0x89, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x4, 0xD2, 0x1, 0x2E, 0xFE, 0xD2, 0x9C, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x2F, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x1, 0xFD, 0xA, 0xFD, 0xD5, 0xFE, 0x64, 0xFF, 0xAE, 0x0, 0x29, 0x0, 0x0, 0x5, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x7, 0x6, 0x14, 0x16, 0x16, 0x14, 0x6, 0x6, 0x7, 0x15, 0x14, 0x17, 0x7, 0x26, 0x26, 0x35, 0x34, 0x36, 0x36, 0x37, 0x35, 0x34, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0xFD, 0xA, 0x58, 0x6F, 0x43, 0x45, 0x46, 0x22, 0x23, 0x4B, 0x4B, 0x4C, 0x49, 0x2, 0x7C, 0x14, 0x6B, 0x82, 0x4A, 0x4A, 0x1, 0x4F, 0x22, 0x25, 0x4E, 0x28, 0x26, 0x23, 0x3F, 0x45, 0x88, 0x36, 0x3C, 0x50, 0x21, 0x8, 0x8, 0x18, 0xB, 0x1A, 0x44, 0x17, 0x9, 0xA, 0x1, 0x13, 0x8, 0x55, 0x8, 0x38, 0x2C, 0x22, 0x17, 0x9, 0xC, 0x1, 0xA, 0xC, 0xB, 0xC, 0x1F, 0x1C, 0x20, 0xB, 0xA, 0xC, 0x14, 0x24, 0x0, 0x1, 0xFC, 0xCB, 0x4, 0xAC, 0xFF, 0x6C, 0x6, 0x28, 0x0, 0x5, 0x0, 0x0, 0x1, 0x25, 0x37, 0x17, 0x25, 0x17, 0xFD, 0xCF, 0xFE, 0xFC, 0x54, 0xB0, 0x1, 0x48, 0x55, 0x4, 0xAC, 0x95, 0x90, 0x65, 0xBC, 0x90, 0x0, 0x1, 0xFC, 0xDE, 0x4, 0xD2, 0xFF, 0xBC, 0x6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x1, 0x35, 0x21, 0x37, 0x21, 0x3, 0xFC, 0xDE, 0x1, 0x8D, 0x49, 0x1, 0x8, 0xEE, 0x4, 0xD2, 0x9E, 0x90, 0xFE, 0xD2, 0x0, 0x1, 0xFC, 0x3C, 0x4, 0xD2, 0xFF, 0x1A, 0x6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x1, 0x3, 0x21, 0x17, 0x21, 0x15, 0xFD, 0x2A, 0xEE, 0x1, 0x4, 0x4A, 0x1, 0x90, 0x4, 0xD2, 0x1, 0x2E, 0x90, 0x9E, 0x0, 0x1, 0xFC, 0xA4, 0x4, 0xD2, 0xFF, 0x71, 0x6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x1, 0x35, 0x21, 0x13, 0x23, 0x27, 0xFC, 0xA4, 0x2, 0x9, 0xC4, 0xCA, 0x81, 0x5, 0x62, 0x9E, 0xFE, 0xD2, 0x90, 0x0, 0x1, 0xFC, 0x6E, 0x4, 0xD2, 0xFF, 0x35, 0x6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x1, 0x13, 0x21, 0x15, 0x21, 0x7, 0xFC, 0x6E, 0xC3, 0x2, 0x4, 0xFE, 0x84, 0x81, 0x4, 0xD2, 0x1, 0x2E, 0x9E, 0x90, 0x0, 0x1, 0xFC, 0x22, 0x4, 0xD2, 0xFF, 0x8F, 0x6, 0x0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x3, 0x33, 0x17, 0x37, 0x21, 0x13, 0x23, 0x27, 0x7, 0xFC, 0xED, 0xCB, 0xEF, 0x5C, 0x61, 0x1, 0x35, 0x8C, 0xB4, 0x7A, 0x7E, 0x4, 0xD2, 0x1, 0x2E, 0xA0, 0xA0, 0xFE, 0xD2, 0xA7, 0xA7, 0x0, 0x1, 0xFC, 0x60, 0x4, 0xD2, 0xFF, 0xCE, 0x6, 0x0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x13, 0x21, 0x17, 0x37, 0x33, 0x3, 0x23, 0x27, 0x7, 0xFC, 0x60, 0x8D, 0x1, 0x34, 0x61, 0x5C, 0xF0, 0xCC, 0xF6, 0x81, 0x7B, 0x4, 0xD2, 0x1, 0x2E, 0xA0, 0xA0, 0xFE, 0xD2, 0xA7, 0xA7, 0x0, 0x1, 0xFD, 0x44, 0xFD, 0xDA, 0xFE, 0x77, 0xFF, 0x87, 0x0, 0xD, 0x0, 0x0, 0x5, 0x22, 0x7, 0x15, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0xFE, 0x3A, 0x4B, 0x1C, 0x8F, 0x72, 0xE, 0x31, 0x55, 0x1B, 0x12, 0x1A, 0xFA, 0x37, 0xF5, 0x1, 0xA7, 0x3F, 0x45, 0x5, 0x89, 0xD, 0x0, 0x1, 0xFB, 0x61, 0x4, 0xCC, 0x0, 0x36, 0x5, 0xE7, 0x0, 0xE, 0x0, 0x0, 0x13, 0x21, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x21, 0x36, 0xFD, 0x83, 0x58, 0xBC, 0x95, 0xAF, 0xB7, 0x40, 0x4D, 0x4C, 0x3F, 0x3, 0x6, 0x5, 0x49, 0x7D, 0x9F, 0x7C, 0x37, 0x54, 0x54, 0x37, 0x0, 0x1, 0xFB, 0x3D, 0x4, 0xCC, 0x0, 0x10, 0x5, 0xE7, 0x0, 0xE, 0x0, 0x0, 0x1, 0x22, 0x27, 0x21, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x14, 0x6, 0xFE, 0xCE, 0xBF, 0x56, 0xFD, 0x84, 0x3, 0x4, 0x40, 0x4D, 0x4C, 0x3F, 0xB7, 0xAE, 0x4, 0xCC, 0x7D, 0x9E, 0x37, 0x54, 0x54, 0x37, 0x7C, 0x9F, 0x0, 0x1, 0xFC, 0x9F, 0x4, 0xA1, 0x3, 0x63, 0x5, 0xEE, 0x0, 0x8, 0x0, 0x0, 0x13, 0x5, 0x15, 0x7, 0x25, 0x5, 0x27, 0x35, 0x25, 0x47, 0x3, 0x1C, 0xCD, 0xFD, 0x69, 0xFD, 0x6B, 0xCB, 0x3, 0x19, 0x5, 0xEE, 0xF1, 0x19, 0x43, 0xD2, 0xD2, 0x43, 0x1B, 0xEF, 0xFF, 0xFF, 0xFD, 0x2F, 0x3, 0xE6, 0xFE, 0xA7, 0x5, 0xD0, 0x0, 0xF, 0x1, 0x8C, 0xFE, 0xD0, 0x4, 0x22, 0xC0, 0x0, 0x0, 0x1, 0xFC, 0xD6, 0xFD, 0xD5, 0xFE, 0x9A, 0xFF, 0x90, 0x0, 0x7, 0x0, 0x0, 0x1, 0x23, 0x37, 0x21, 0x13, 0x33, 0x7, 0x21, 0xFE, 0x47, 0x99, 0x31, 0xFE, 0xF7, 0x53, 0x99, 0x31, 0x1, 0x9, 0xFD, 0xD5, 0xA4, 0x1, 0x17, 0xA4, 0x0, 0x1, 0xFC, 0xC9, 0xFE, 0x14, 0xFF, 0xAE, 0xFF, 0xC0, 0x0, 0x13, 0x0, 0x0, 0x5, 0x33, 0x7, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x7, 0x27, 0xFD, 0x5A, 0x98, 0x60, 0x4C, 0x3B, 0x38, 0x57, 0x32, 0x46, 0x16, 0x78, 0x8, 0x57, 0x5C, 0x53, 0x84, 0x42, 0x47, 0x62, 0x68, 0x40, 0xF5, 0x2E, 0x40, 0x50, 0x27, 0x4E, 0x80, 0x4B, 0x3B, 0x30, 0x0, 0x1, 0xFC, 0x94, 0x4, 0x7A, 0xFE, 0xDB, 0x5, 0xDF, 0x0, 0x20, 0x0, 0x0, 0x1, 0x32, 0x35, 0x34, 0x26, 0x27, 0x35, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x15, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x16, 0xFE, 0x36, 0x3A, 0x23, 0x2E, 0x45, 0x77, 0x59, 0x51, 0x4C, 0x4C, 0x32, 0x2D, 0x3B, 0x48, 0x4C, 0x67, 0x5F, 0x4A, 0x4C, 0x4E, 0x13, 0x10, 0x22, 0x4, 0xE4, 0x42, 0x1F, 0x34, 0x2, 0x64, 0x5F, 0x58, 0x4A, 0x64, 0x50, 0x9D, 0x3B, 0x42, 0x6, 0x68, 0x62, 0x4E, 0x4A, 0x5C, 0x58, 0x3B, 0x36, 0x25, 0x0, 0x1, 0xFC, 0x9B, 0x4, 0x7E, 0xFE, 0xE0, 0x7, 0x7A, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x6, 0x7, 0x27, 0x3E, 0x2, 0x35, 0x34, 0x26, 0x22, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x6, 0xFD, 0x95, 0x5F, 0x9B, 0xA3, 0x74, 0x83, 0xAB, 0x78, 0xB1, 0x57, 0x2D, 0x3E, 0x85, 0x5B, 0x57, 0x82, 0x4E, 0x7F, 0x39, 0x27, 0x19, 0x3A, 0x5, 0x91, 0x6B, 0x7D, 0x73, 0x8E, 0xA4, 0x92, 0x97, 0xB7, 0x61, 0x17, 0x70, 0x15, 0x44, 0x87, 0x77, 0x63, 0x61, 0x4A, 0x40, 0x84, 0x12, 0x56, 0x26, 0x0, 0x1, 0xFC, 0x3D, 0x4, 0xA8, 0xFF, 0x32, 0x5, 0x6C, 0x0, 0x14, 0x0, 0x0, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x33, 0x32, 0x35, 0x33, 0x14, 0x33, 0x32, 0x35, 0x33, 0x14, 0x6, 0xFE, 0x52, 0x61, 0x39, 0x32, 0x68, 0x65, 0x7C, 0x8A, 0x57, 0x51, 0x85, 0x5E, 0x51, 0x8F, 0x7D, 0x4, 0xA8, 0x34, 0x34, 0x6E, 0x56, 0x54, 0x54, 0x54, 0x54, 0x62, 0x62, 0x0, 0x3, 0xFC, 0x1F, 0x4, 0xA3, 0xFF, 0x60, 0x6, 0xE0, 0x0, 0x5, 0x0, 0xF, 0x0, 0x34, 0x0, 0x0, 0x1, 0x22, 0x7, 0x33, 0x35, 0x26, 0x1, 0x32, 0x37, 0x26, 0x27, 0x23, 0x22, 0x6, 0x15, 0x14, 0x5, 0x6, 0x6, 0x23, 0x22, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x33, 0x35, 0x34, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x21, 0x16, 0x33, 0x32, 0x37, 0xFE, 0x6D, 0x5E, 0xF, 0xD8, 0x5, 0xFE, 0x28, 0x59, 0x24, 0x9, 0x1, 0x54, 0x37, 0x35, 0x2, 0xA6, 0x1B, 0x6B, 0x52, 0xA3, 0x47, 0x16, 0x5D, 0x49, 0x54, 0x63, 0xEF, 0x5F, 0x50, 0x58, 0x8A, 0x7D, 0x68, 0x6D, 0x3B, 0x43, 0x62, 0x79, 0x7A, 0xFE, 0x9E, 0xB, 0x7A, 0x5A, 0x30, 0x6, 0x6B, 0x76, 0x9, 0x6D, 0xFE, 0xAB, 0x4A, 0x1F, 0x23, 0x30, 0x20, 0x3C, 0xB, 0x27, 0x41, 0x7A, 0x2E, 0x47, 0x5A, 0x4B, 0xA8, 0x4, 0x22, 0x55, 0x42, 0x6, 0x4A, 0x62, 0x3B, 0x3A, 0x99, 0x77, 0x37, 0x80, 0x3E, 0x0, 0x3, 0xFC, 0x19, 0x4, 0xA3, 0xFF, 0x76, 0x6, 0xE0, 0x0, 0x7, 0x0, 0x25, 0x0, 0x2F, 0x0, 0x0, 0x1, 0x32, 0x35, 0x34, 0x23, 0x22, 0x15, 0x14, 0x17, 0x22, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x33, 0x35, 0x34, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x25, 0x32, 0x37, 0x26, 0x27, 0x23, 0x22, 0x6, 0x15, 0x14, 0xFE, 0x6F, 0x78, 0x79, 0x76, 0x77, 0x9D, 0x45, 0x16, 0x5D, 0x4A, 0x54, 0x63, 0xEE, 0x60, 0x50, 0x58, 0x8A, 0x7D, 0x68, 0x6E, 0x3B, 0x45, 0x66, 0x7A, 0x8E, 0x8E, 0xFE, 0xD, 0x5A, 0x24, 0x8, 0x2, 0x56, 0x36, 0x35, 0x5, 0x17, 0xAF, 0xA5, 0xB0, 0xA4, 0x74, 0x7D, 0x2F, 0x49, 0x5A, 0x4B, 0xA8, 0x4, 0x22, 0x55, 0x42, 0x6, 0x4A, 0x62, 0x3C, 0x3B, 0x9C, 0x88, 0x7C, 0x9C, 0x73, 0x4C, 0x1E, 0x22, 0x30, 0x20, 0x3C, 0x0, 0x2, 0xFC, 0x13, 0x4, 0xA8, 0xFF, 0x1F, 0x6, 0xE0, 0x0, 0x9, 0x0, 0x25, 0x0, 0x0, 0x1, 0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x33, 0x35, 0x34, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x37, 0x13, 0x33, 0x3, 0xFC, 0xEE, 0x25, 0x41, 0xC, 0x53, 0x36, 0x35, 0xD2, 0xA, 0x6, 0x38, 0x63, 0x53, 0x63, 0xEE, 0x5F, 0x50, 0x58, 0x8A, 0x7E, 0x68, 0x60, 0x7C, 0xB, 0x8A, 0x9A, 0xE5, 0x5, 0x16, 0x26, 0x16, 0x50, 0x30, 0x20, 0x3C, 0x64, 0x1B, 0x22, 0x47, 0x5A, 0x4B, 0xA8, 0x4, 0x22, 0x55, 0x42, 0x6, 0x4A, 0x62, 0x63, 0x63, 0xC8, 0x25, 0x1, 0x65, 0xFD, 0xD6, 0x0, 0x1, 0xFC, 0xCC, 0x3, 0xC8, 0xFE, 0xB7, 0x6, 0xDF, 0x0, 0x23, 0x0, 0x0, 0x1, 0x14, 0x7, 0x27, 0x32, 0x35, 0x34, 0x27, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x33, 0x6, 0x6, 0x7, 0x7, 0x16, 0x16, 0xFE, 0x41, 0xB0, 0x4, 0x40, 0x48, 0x10, 0x66, 0x63, 0x7E, 0x84, 0x69, 0x7E, 0x2, 0x88, 0x2, 0x2E, 0x32, 0x72, 0x34, 0x3E, 0x59, 0x9, 0x88, 0x2, 0x6D, 0x52, 0x4, 0x21, 0x2E, 0x4, 0x3A, 0x70, 0x2, 0x4E, 0x28, 0x1E, 0x8, 0x44, 0x12, 0x99, 0x77, 0x71, 0xA4, 0x74, 0x5B, 0x22, 0x39, 0xB3, 0x43, 0x5E, 0x4D, 0x48, 0x6A, 0xC, 0x14, 0x7, 0x25, 0x0, 0x2, 0xFC, 0xAA, 0x4, 0xA8, 0xFE, 0xCA, 0x7, 0xC5, 0x0, 0x12, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x26, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x15, 0x14, 0x6, 0x27, 0x32, 0x37, 0x35, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0xFD, 0xB8, 0x76, 0x98, 0x92, 0x71, 0x40, 0x39, 0x1E, 0x80, 0x44, 0x2F, 0x89, 0xCE, 0xA0, 0x71, 0x7F, 0x3, 0x25, 0x5E, 0x42, 0x3D, 0x41, 0x4, 0xA8, 0x92, 0x68, 0x74, 0x8E, 0x22, 0x59, 0x65, 0x16, 0x6F, 0x22, 0xF4, 0xB1, 0x2C, 0x84, 0xA6, 0x74, 0xAE, 0x40, 0x29, 0x51, 0x40, 0x3A, 0x4C, 0x0, 0x2, 0xFC, 0xAA, 0x4, 0xA8, 0xFE, 0xCA, 0x7, 0xC5, 0x0, 0x1A, 0x0, 0x25, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x26, 0x27, 0x7, 0x27, 0x37, 0x26, 0x27, 0x37, 0x16, 0x17, 0x37, 0x17, 0x7, 0x16, 0x15, 0x15, 0x14, 0x6, 0x27, 0x32, 0x37, 0x35, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0xFD, 0xB8, 0x76, 0x98, 0x92, 0x71, 0x40, 0x39, 0x18, 0x35, 0x70, 0x28, 0x5F, 0x2A, 0x32, 0x2F, 0x5C, 0x4D, 0x73, 0x27, 0x67, 0x7B, 0xA0, 0x71, 0x7F, 0x3, 0x25, 0x5E, 0x42, 0x3D, 0x41, 0x4, 0xA8, 0x92, 0x68, 0x74, 0x8E, 0x22, 0x47, 0x34, 0x3F, 0x38, 0x35, 0x1B, 0x10, 0x6F, 0x17, 0x3D, 0x40, 0x37, 0x3A, 0x86, 0xC2, 0x26, 0x84, 0xA6, 0x74, 0xAE, 0x40, 0x29, 0x51, 0x40, 0x3A, 0x4C, 0x0, 0x2, 0xFC, 0xB8, 0x3, 0xDA, 0xFE, 0xC0, 0x6, 0xE6, 0x0, 0x8, 0x0, 0x21, 0x0, 0x0, 0x1, 0x32, 0x37, 0x35, 0x26, 0x23, 0x22, 0x15, 0x14, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x35, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x14, 0x6, 0xFD, 0xC1, 0x4E, 0x21, 0x21, 0x4D, 0x7B, 0x6B, 0x3A, 0x7C, 0x25, 0x41, 0x3A, 0x59, 0x80, 0x5, 0x36, 0x59, 0x65, 0x84, 0x83, 0x67, 0x62, 0x36, 0x8, 0x7E, 0xA0, 0x5, 0x1D, 0x38, 0xE7, 0x36, 0xB1, 0xA4, 0xFE, 0xBD, 0x2E, 0x2F, 0x5A, 0x45, 0x6A, 0x2F, 0x3C, 0xA0, 0x83, 0x7E, 0x9C, 0x45, 0x3A, 0xFD, 0xE8, 0x79, 0x70, 0x0, 0x1, 0xFC, 0xAA, 0x4, 0xA7, 0xFE, 0xC5, 0x7, 0x9, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x32, 0x16, 0x17, 0x23, 0x26, 0x23, 0x22, 0x7, 0x15, 0x14, 0x33, 0x32, 0x37, 0x35, 0x23, 0x35, 0x21, 0x15, 0x6, 0x6, 0xFD, 0xBD, 0x77, 0x9C, 0x9A, 0xE8, 0x80, 0x9, 0x88, 0x11, 0x64, 0x7D, 0x1, 0x83, 0x54, 0x25, 0x76, 0x1, 0x5, 0x16, 0x88, 0x4, 0xA7, 0x87, 0x6C, 0x7C, 0x6D, 0x86, 0x66, 0x58, 0x4B, 0x90, 0x61, 0x8B, 0x1C, 0x50, 0x6B, 0xF0, 0x1C, 0x3E, 0x0, 0x1, 0xFC, 0xD2, 0x4, 0xB1, 0xFE, 0xDA, 0x7, 0xCD, 0x0, 0xC, 0x0, 0x0, 0x1, 0x27, 0x7, 0x15, 0x23, 0x11, 0x33, 0x11, 0x37, 0x37, 0x33, 0x7, 0x13, 0xFE, 0x36, 0x9A, 0x3A, 0x90, 0x90, 0x23, 0x92, 0x9F, 0xC1, 0xE5, 0x4, 0xB1, 0xE9, 0x3D, 0xAC, 0x3, 0x1C, 0xFE, 0x35, 0x2C, 0xAB, 0xDE, 0xFE, 0xB6, 0x0, 0x1, 0xFD, 0x71, 0x4, 0xB1, 0xFE, 0x0, 0x7, 0xC8, 0x0, 0x3, 0x0, 0x0, 0x1, 0x33, 0x11, 0x23, 0xFD, 0x71, 0x8F, 0x8F, 0x7, 0xC8, 0xFC, 0xE9, 0x0, 0x1, 0xFD, 0xB, 0x4, 0xB1, 0xFE, 0x9C, 0x7, 0x4, 0x0, 0x5, 0x0, 0x0, 0x1, 0x11, 0x33, 0x11, 0x21, 0x15, 0xFD, 0xB, 0x8F, 0x1, 0x2, 0x4, 0xB1, 0x2, 0x53, 0xFE, 0x21, 0x74, 0x0, 0x1, 0xFC, 0x65, 0x4, 0xB1, 0xFF, 0x9, 0x7, 0x4, 0x0, 0xC, 0x0, 0x0, 0x1, 0x3, 0x11, 0x23, 0x11, 0x33, 0x13, 0x13, 0x33, 0x11, 0x23, 0x11, 0x3, 0xFD, 0x80, 0x8C, 0x8F, 0xB0, 0xA2, 0xA3, 0xAF, 0x8F, 0x8C, 0x4, 0xB1, 0x1, 0x6D, 0xFE, 0x93, 0x2, 0x53, 0xFE, 0x4C, 0x1, 0xB4, 0xFD, 0xAD, 0x1, 0x6C, 0xFE, 0x94, 0xFF, 0xFF, 0xFC, 0xC9, 0x4, 0xB1, 0xFE, 0xA6, 0x6, 0xE3, 0x0, 0xF, 0x2, 0x18, 0xFB, 0x7C, 0xB, 0x8A, 0xC0, 0x0, 0x0, 0x1, 0xFC, 0x97, 0x4, 0xB1, 0xFE, 0xC4, 0x7, 0x4, 0x0, 0x9, 0x0, 0x0, 0x1, 0x1, 0x11, 0x23, 0x11, 0x33, 0x1, 0x11, 0x33, 0x11, 0xFE, 0x35, 0xFE, 0xF1, 0x8F, 0x8F, 0x1, 0xF, 0x8F, 0x4, 0xB1, 0x1, 0x7B, 0xFE, 0x85, 0x2, 0x53, 0xFE, 0x85, 0x1, 0x7B, 0xFD, 0xAD, 0x0, 0x2, 0xFC, 0xBB, 0x4, 0xB1, 0xFE, 0xB5, 0x7, 0x4, 0x0, 0x6, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x15, 0x33, 0x32, 0x35, 0x34, 0x23, 0x3, 0x15, 0x23, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x14, 0x17, 0x15, 0x23, 0x26, 0x26, 0x34, 0x26, 0x23, 0xFD, 0x4A, 0x6F, 0x56, 0x56, 0x6F, 0x8F, 0xFE, 0x6C, 0x79, 0x58, 0x5C, 0x13, 0x93, 0xB, 0x5, 0x32, 0x30, 0x6, 0x91, 0x99, 0x52, 0x47, 0xFE, 0xF3, 0xD3, 0x2, 0x53, 0x5E, 0x53, 0x5D, 0x2E, 0x20, 0xD6, 0x18, 0x9, 0xD, 0x3D, 0x6D, 0x1C, 0x0, 0x1, 0xFD, 0x1, 0x4, 0xB1, 0xFE, 0x91, 0x6, 0xDF, 0x0, 0x12, 0x0, 0x0, 0x1, 0x23, 0x27, 0x36, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x17, 0xFE, 0x91, 0x96, 0x8D, 0x46, 0x44, 0x44, 0x2E, 0x43, 0x42, 0x5E, 0x64, 0x52, 0x72, 0x70, 0x7A, 0x4, 0xB1, 0xEE, 0x21, 0x3B, 0x2C, 0x44, 0x25, 0x56, 0x43, 0x5F, 0x53, 0x62, 0x47, 0xCD, 0x0, 0x1, 0xFC, 0xC3, 0x4, 0xA7, 0xFE, 0x9E, 0x6, 0xE3, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x34, 0x2E, 0x2, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0xFE, 0x11, 0x2D, 0xA0, 0x6F, 0x79, 0x62, 0x67, 0x84, 0x89, 0xA, 0x58, 0x4E, 0xCA, 0x72, 0x86, 0x62, 0x74, 0x7F, 0x85, 0x2, 0x46, 0x2A, 0x57, 0x5, 0x49, 0x18, 0x21, 0x26, 0x4D, 0x48, 0x4A, 0x5C, 0x65, 0x4A, 0x46, 0x39, 0x2D, 0x2E, 0x4B, 0x4D, 0x4F, 0x58, 0x74, 0x44, 0x2D, 0x22, 0x0, 0x1, 0xFD, 0x6B, 0x4, 0xB1, 0xFE, 0x81, 0x7, 0xD8, 0x0, 0xC, 0x0, 0x0, 0x1, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0xFD, 0xFB, 0x90, 0x74, 0x56, 0x22, 0x2A, 0x8, 0x14, 0x1A, 0x50, 0x4, 0xB1, 0x2, 0x60, 0x63, 0x64, 0xB, 0x6F, 0x6, 0x53, 0x0, 0x1, 0xFC, 0xD8, 0x4, 0xB1, 0xFE, 0x98, 0x6, 0xD9, 0x0, 0x9, 0x0, 0x0, 0x1, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0xFC, 0xD8, 0x1, 0x9, 0xFE, 0xFD, 0x1, 0xAF, 0xFE, 0xFB, 0x1, 0x10, 0x4, 0xB1, 0x63, 0x1, 0x51, 0x74, 0x5E, 0xFE, 0xAB, 0x75, 0x0, 0x2, 0xFC, 0x9B, 0x4, 0xA7, 0xFE, 0xD6, 0x6, 0xE4, 0x0, 0x14, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x14, 0x33, 0x37, 0x17, 0x6, 0x25, 0x32, 0x37, 0x35, 0x26, 0x23, 0x22, 0x15, 0x14, 0xFE, 0x88, 0x57, 0x1B, 0x35, 0x62, 0x6A, 0x7A, 0x79, 0x6C, 0x5C, 0x35, 0x9, 0x7E, 0x26, 0xD, 0xB, 0x19, 0xFE, 0xE1, 0x49, 0x22, 0x23, 0x47, 0x75, 0x4, 0xA7, 0x53, 0x53, 0x97, 0x80, 0x81, 0xA5, 0x4D, 0x43, 0xFE, 0x7D, 0x3E, 0x1, 0x64, 0xF, 0x74, 0x3C, 0xD9, 0x40, 0xBD, 0x98, 0x0, 0x2, 0xFC, 0xBA, 0x4, 0xA4, 0xFE, 0xB7, 0x7, 0xC8, 0x0, 0xE, 0x0, 0x18, 0x0, 0x0, 0x1, 0x22, 0x27, 0x7, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x15, 0x16, 0xFD, 0xD8, 0x62, 0x37, 0x9, 0x7C, 0x8F, 0x35, 0x59, 0x6A, 0x76, 0x77, 0x88, 0x70, 0x37, 0x3A, 0x4E, 0x20, 0x20, 0x4, 0xA4, 0x43, 0x36, 0x3, 0x17, 0xFE, 0xE1, 0x36, 0x9A, 0x89, 0x79, 0x9F, 0x75, 0xAE, 0x4A, 0x5C, 0x47, 0xC5, 0x48, 0x0, 0x2, 0xFC, 0xAD, 0x3, 0xE8, 0xFE, 0xC4, 0x7, 0xA2, 0x0, 0x10, 0x0, 0x22, 0x0, 0x0, 0x1, 0x32, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0x15, 0x11, 0x16, 0x17, 0x22, 0x27, 0x15, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0xFD, 0xB9, 0x7C, 0x74, 0x3A, 0x28, 0x66, 0x68, 0x2C, 0x45, 0x2F, 0x64, 0x55, 0x3E, 0x8F, 0xA0, 0x62, 0x68, 0x85, 0x60, 0x88, 0x85, 0x5, 0x16, 0x72, 0x7B, 0x1, 0x69, 0x1, 0x67, 0x5D, 0x36, 0x43, 0xFE, 0x88, 0x2B, 0x6F, 0x28, 0xE7, 0x2, 0xD0, 0x7A, 0x70, 0x66, 0x5C, 0x6D, 0x32, 0x2E, 0x8B, 0x6C, 0x75, 0x0, 0x2, 0xFC, 0xBF, 0x4, 0xA3, 0xFE, 0xB2, 0x6, 0xDF, 0x0, 0x13, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x21, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x27, 0x32, 0x37, 0x23, 0x15, 0x16, 0xFD, 0xB2, 0x79, 0x7A, 0x1, 0x62, 0xB, 0x7A, 0x5B, 0x2E, 0x48, 0x1B, 0x6B, 0x53, 0x80, 0x8E, 0x90, 0x70, 0x5E, 0xF, 0xD8, 0x5, 0x4, 0xA3, 0x99, 0x77, 0x37, 0x80, 0x3E, 0x4B, 0x27, 0x41, 0x99, 0x72, 0x15, 0x85, 0x97, 0x74, 0x76, 0x9, 0x6D, 0x0, 0x1, 0xFD, 0xD, 0x4, 0xB1, 0xFE, 0x81, 0x7, 0xD8, 0x0, 0x14, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0xFE, 0x58, 0x5D, 0x90, 0x5E, 0x5E, 0x74, 0x56, 0x22, 0x2A, 0x8, 0x14, 0x1A, 0x4F, 0x1, 0x5D, 0x6, 0x70, 0xFE, 0x41, 0x1, 0xBF, 0x6F, 0x32, 0x63, 0x64, 0xB, 0x6F, 0x6, 0x51, 0x34, 0x0, 0x1, 0xFC, 0xFB, 0x4, 0xB1, 0xFE, 0x72, 0x7, 0xC8, 0x0, 0x23, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x17, 0x35, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x17, 0x35, 0x33, 0x11, 0x32, 0x35, 0x17, 0x14, 0x6, 0x23, 0x15, 0x32, 0x35, 0x17, 0x14, 0x6, 0xFE, 0x0, 0x8F, 0x4, 0x2F, 0x43, 0x3C, 0x2F, 0xB, 0x4, 0x2F, 0x43, 0x3C, 0x2F, 0xB, 0x8F, 0x2F, 0x43, 0x3D, 0x35, 0x2F, 0x43, 0x3D, 0x5, 0xB4, 0xFE, 0xFD, 0x1, 0x30, 0x38, 0x12, 0x2F, 0x48, 0x1, 0x4A, 0x38, 0x12, 0x2F, 0x48, 0x1, 0xFD, 0xFE, 0xD6, 0x38, 0x14, 0x2F, 0x46, 0x49, 0x39, 0x14, 0x2F, 0x46, 0x0, 0x2, 0xFC, 0x75, 0x3, 0xED, 0xFE, 0xC1, 0x6, 0xDF, 0x0, 0x8, 0x0, 0x18, 0x0, 0x0, 0x1, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x15, 0x14, 0x17, 0x22, 0x27, 0x7, 0x27, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0xFD, 0xBA, 0x40, 0x37, 0x78, 0x77, 0x78, 0x30, 0x2A, 0x7A, 0x71, 0x7E, 0x40, 0x8E, 0x78, 0x7A, 0x8E, 0x8E, 0x5, 0x17, 0x59, 0x56, 0xA5, 0xB0, 0xA4, 0x74, 0xD, 0xC3, 0x41, 0xCA, 0x4C, 0x82, 0x7D, 0x9C, 0x9C, 0x88, 0x7C, 0x9C, 0xFF, 0xFF, 0xFC, 0xB9, 0x3, 0xBE, 0xFE, 0xB7, 0x6, 0xE2, 0x0, 0xF, 0x2, 0x1A, 0xFB, 0x77, 0xB, 0x86, 0xC0, 0x0, 0x0, 0x1, 0xFC, 0xE5, 0x3, 0xBC, 0xFE, 0x82, 0x7, 0xD8, 0x0, 0x15, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x11, 0x14, 0x6, 0xFD, 0x31, 0x18, 0x34, 0x9, 0xF, 0x1E, 0x51, 0x74, 0x57, 0x21, 0x2A, 0x8, 0x14, 0x19, 0x51, 0x74, 0x3, 0xBC, 0xB, 0x6E, 0x5, 0x53, 0x2, 0x8E, 0x63, 0x64, 0xB, 0x6F, 0x6, 0x53, 0xFD, 0x72, 0x63, 0x64, 0x0, 0x1, 0xFC, 0x6E, 0x3, 0xED, 0xFE, 0xA6, 0x6, 0xD9, 0x0, 0x13, 0x0, 0x0, 0x1, 0x27, 0x7, 0x27, 0x37, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, 0x27, 0x6, 0xFD, 0x86, 0x30, 0x77, 0x71, 0x7D, 0x22, 0x90, 0x56, 0x4B, 0x1C, 0x90, 0x72, 0xF, 0x37, 0x4, 0xA7, 0x4, 0xBE, 0x41, 0xC7, 0x39, 0x61, 0x1, 0x4A, 0xFE, 0xB5, 0x73, 0x38, 0x1, 0x86, 0xFD, 0xD8, 0x3F, 0x49, 0x0, 0x1, 0xFC, 0x40, 0x4, 0xB1, 0xFF, 0x31, 0x6, 0xD9, 0x0, 0xF, 0x0, 0x0, 0x1, 0x3, 0x33, 0x13, 0x13, 0x33, 0x13, 0x35, 0x13, 0x33, 0x3, 0x23, 0x3, 0x27, 0x7, 0x3, 0xFC, 0xD3, 0x93, 0x8D, 0x4B, 0x65, 0x77, 0x67, 0x49, 0x8D, 0x93, 0x73, 0x66, 0xD, 0xC, 0x66, 0x4, 0xB1, 0x2, 0x28, 0xFE, 0x9E, 0x1, 0x62, 0xFE, 0x97, 0x3, 0x1, 0x66, 0xFD, 0xD8, 0x1, 0x4E, 0x2F, 0x2E, 0xFE, 0xB1, 0x0, 0x4, 0xFC, 0xD0, 0x4, 0xA8, 0xFE, 0xC1, 0x7, 0xAD, 0x0, 0x5, 0x0, 0xB, 0x0, 0x15, 0x0, 0x2F, 0x0, 0x0, 0x0, 0x33, 0x32, 0x14, 0x23, 0x22, 0x26, 0x33, 0x32, 0x14, 0x23, 0x22, 0x13, 0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x33, 0x35, 0x34, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x17, 0xFD, 0xF4, 0x52, 0x51, 0x51, 0x52, 0xFE, 0x52, 0x51, 0x51, 0x52, 0xB6, 0x25, 0x41, 0xC, 0x53, 0x37, 0x35, 0xD3, 0xA, 0x6, 0x38, 0x63, 0x54, 0x63, 0xEF, 0x5F, 0x50, 0x58, 0x8A, 0x7D, 0x68, 0x60, 0x7C, 0x14, 0x7, 0xAD, 0x98, 0x98, 0x98, 0xFE, 0x1, 0x26, 0x16, 0x50, 0x30, 0x20, 0x3C, 0x64, 0x1B, 0x22, 0x47, 0x5A, 0x4B, 0xA8, 0x4, 0x22, 0x55, 0x42, 0x6, 0x4A, 0x62, 0x63, 0x63, 0xE3, 0x4C, 0x39, 0x0, 0x4, 0xFC, 0xB1, 0x4, 0xA3, 0xFE, 0xBF, 0x7, 0xAD, 0x0, 0x5, 0x0, 0xB, 0x0, 0x16, 0x0, 0x1F, 0x0, 0x0, 0x0, 0x33, 0x32, 0x14, 0x23, 0x22, 0x26, 0x33, 0x32, 0x14, 0x23, 0x22, 0x13, 0x22, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x15, 0x14, 0xFD, 0xE6, 0x51, 0x52, 0x52, 0x51, 0xFE, 0x51, 0x52, 0x52, 0x51, 0xD1, 0x7A, 0x8E, 0x8E, 0xF2, 0x8E, 0x8D, 0x79, 0x40, 0x37, 0x78, 0x77, 0x7, 0xAD, 0x98, 0x98, 0x98, 0xFD, 0x8E, 0x9C, 0x87, 0x7D, 0x9C, 0x9B, 0x89, 0x7C, 0x9C, 0x74, 0x59, 0x56, 0xA5, 0xB0, 0xA4, 0x0, 0x3, 0xFC, 0xC9, 0x4, 0xA7, 0xFE, 0xA6, 0x7, 0xAD, 0x0, 0x3, 0x0, 0x7, 0x0, 0x18, 0x0, 0x0, 0x0, 0x32, 0x14, 0x22, 0x26, 0x32, 0x14, 0x22, 0x1, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0xFD, 0xE4, 0xA2, 0xA2, 0xFE, 0xA2, 0xA2, 0x1, 0x4E, 0xF, 0x37, 0x68, 0x56, 0x67, 0x90, 0x56, 0x4B, 0x1C, 0x90, 0x7, 0xAD, 0x98, 0x98, 0x98, 0xFD, 0x9C, 0x3F, 0x49, 0x6C, 0x7C, 0x1, 0x4A, 0xFE, 0xB5, 0x73, 0x38, 0x1, 0x86, 0xFD, 0xD8, 0xFF, 0xFF, 0xFC, 0xDB, 0x4, 0x96, 0xFE, 0x93, 0x6, 0xB, 0x0, 0x7, 0x1, 0x85, 0xFC, 0x8B, 0x3, 0xF3, 0x0, 0x1, 0xFD, 0x23, 0xFE, 0x5A, 0x2, 0xBA, 0xFF, 0xA0, 0x0, 0xC, 0x0, 0x0, 0x1, 0x23, 0x26, 0x24, 0x23, 0x22, 0x4, 0x7, 0x23, 0x36, 0x24, 0x20, 0x4, 0x2, 0xBA, 0xB6, 0x37, 0xFE, 0xEF, 0xCD, 0xCE, 0xFE, 0xF2, 0x3A, 0xB6, 0x4A, 0x1, 0x62, 0x2, 0x40, 0x1, 0x61, 0xFE, 0x5A, 0x37, 0x80, 0x80, 0x37, 0x7C, 0xCA, 0xCA, 0x0, 0x2, 0xFC, 0x55, 0xFE, 0x2, 0xFF, 0x32, 0xFF, 0xC4, 0x0, 0x13, 0x0, 0x28, 0x0, 0x0, 0x5, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x15, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0xFE, 0x9D, 0x95, 0x80, 0x60, 0x42, 0x4F, 0x48, 0x34, 0x5B, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x95, 0x80, 0x60, 0x42, 0x4F, 0x48, 0x34, 0x27, 0x34, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x3C, 0xA, 0x57, 0x73, 0x23, 0x23, 0x51, 0x8, 0x55, 0x77, 0x46, 0x2C, 0xBE, 0xA, 0x58, 0x72, 0x23, 0x23, 0x2D, 0x24, 0x7, 0x55, 0x77, 0x45, 0x2C, 0xFF, 0xFF, 0xFC, 0x46, 0x4, 0x9C, 0xFF, 0x2C, 0x7, 0x82, 0x0, 0x7, 0x1, 0x73, 0xFC, 0x9, 0x2, 0x4D, 0x0, 0x2, 0xFA, 0xEF, 0xFD, 0xDD, 0x0, 0xA2, 0xFF, 0xBC, 0x0, 0x6, 0x0, 0xF, 0x0, 0x0, 0x1, 0x35, 0x25, 0x25, 0x35, 0x5, 0x15, 0x5, 0x1, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x1, 0xFA, 0xEF, 0x1, 0xBE, 0xFE, 0x42, 0x2, 0xE7, 0x1, 0x8, 0xFE, 0xDF, 0xB2, 0xA3, 0x1D, 0x1B, 0xA7, 0xB1, 0xFE, 0xE0, 0xFD, 0xE3, 0x84, 0x68, 0x6A, 0x83, 0xB8, 0x68, 0xBF, 0x1, 0xDA, 0xFE, 0xE2, 0x41, 0x41, 0x1, 0x1E, 0xFE, 0x26, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x40, 0x5, 0x19, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x6, 0x0, 0x7A, 0x30, 0x0, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0x40, 0x3, 0xF9, 0x6, 0x0, 0x0, 0x26, 0x0, 0x4D, 0x0, 0x0, 0x0, 0x6, 0x0, 0x7A, 0xE, 0x0, 0xFF, 0xFF, 0x0, 0xA, 0xFE, 0x7F, 0x2, 0xE8, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2E, 0x5E, 0x0, 0x0, 0x7, 0x1, 0x8D, 0xFF, 0x90, 0xF9, 0xA4, 0xFF, 0xFF, 0x0, 0x6, 0xFE, 0x83, 0x2, 0xE4, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x4E, 0x76, 0x0, 0x0, 0x7, 0x1, 0x8D, 0xFF, 0x8C, 0xF9, 0xA8, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x2, 0xD2, 0x7, 0xBE, 0x0, 0x26, 0x0, 0x2E, 0x52, 0x0, 0x0, 0x7, 0x7, 0xB5, 0x3, 0xBA, 0x1, 0x59, 0xFF, 0xFF, 0x0, 0xE, 0x0, 0x0, 0x2, 0xD4, 0x7, 0x26, 0x0, 0x26, 0x0, 0x8E, 0x63, 0x0, 0x0, 0x7, 0x8, 0xBB, 0x3, 0xB7, 0xFF, 0xF9, 0x0, 0x2, 0x0, 0xD2, 0x0, 0x0, 0x2, 0xD7, 0x7, 0x86, 0x0, 0x9, 0x0, 0x16, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x13, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x1, 0x92, 0x45, 0x7C, 0x45, 0x45, 0x7C, 0x45, 0x34, 0xF4, 0xCC, 0xB0, 0x43, 0x46, 0x6, 0x2A, 0x34, 0xAD, 0x7, 0xA, 0x35, 0x47, 0x47, 0x35, 0x34, 0x46, 0x46, 0xF9, 0x2A, 0x4, 0xA1, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xAC, 0x0, 0x1, 0x0, 0x41, 0x0, 0x0, 0x2, 0xD7, 0x6, 0x15, 0x0, 0x14, 0x0, 0x0, 0x1, 0x7, 0x11, 0x23, 0x11, 0x7, 0x35, 0x37, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x37, 0x2, 0x63, 0x9D, 0xF4, 0x91, 0x91, 0xCC, 0xB0, 0x43, 0x46, 0x6, 0x2A, 0x34, 0xAC, 0x1, 0x9D, 0x2, 0xD0, 0x37, 0xFD, 0x67, 0x2, 0x42, 0x33, 0xB7, 0x34, 0x1, 0xA7, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xAA, 0xFE, 0xAD, 0x38, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x2, 0xD7, 0x6, 0x15, 0x0, 0x12, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x36, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x33, 0x2, 0xA1, 0xDB, 0xF4, 0xA5, 0xA7, 0x10, 0xC7, 0xA3, 0x43, 0x46, 0x6, 0x2A, 0x34, 0x8C, 0x1B, 0xD5, 0x4, 0x31, 0xFB, 0xCF, 0x4, 0x31, 0xA5, 0x9B, 0xA4, 0x12, 0xBE, 0x8, 0x77, 0x0, 0x1, 0x0, 0x74, 0xFF, 0xEB, 0x4, 0xF3, 0x5, 0xC4, 0x0, 0x24, 0x0, 0x0, 0x5, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x23, 0x11, 0x31, 0x12, 0x12, 0x33, 0x32, 0x4, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x3, 0x2, 0x9F, 0x93, 0x45, 0x6E, 0x6F, 0x80, 0x8E, 0x9A, 0x93, 0x8E, 0x1, 0x1C, 0x31, 0x7F, 0x5E, 0x87, 0x66, 0xF2, 0x1, 0xEF, 0xEF, 0xAD, 0x1, 0xE, 0x78, 0xFE, 0xBB, 0xCF, 0xE3, 0xFE, 0xE3, 0x15, 0x36, 0xBE, 0x31, 0x84, 0x69, 0x91, 0x7B, 0xAB, 0x1, 0x53, 0x25, 0x37, 0xB4, 0x91, 0xFC, 0x44, 0x3, 0xBE, 0x1, 0x2, 0x1, 0x4, 0x85, 0x65, 0xFE, 0x77, 0x14, 0xDE, 0xC2, 0xD3, 0xDF, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0x39, 0x6, 0x21, 0x0, 0x6, 0x2, 0x3D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0xEF, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x7, 0x0, 0x31, 0x1, 0xC8, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1B, 0x0, 0x0, 0x4, 0x50, 0x6, 0x0, 0x0, 0x13, 0x0, 0x0, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x2, 0x87, 0xA6, 0xF3, 0xD3, 0xD3, 0xF3, 0xA6, 0xF3, 0xD6, 0xD6, 0x4, 0x9A, 0xFB, 0x66, 0x4, 0x9A, 0xAA, 0xBC, 0xBC, 0xBC, 0xBC, 0xAA, 0xFB, 0x66, 0x0, 0x1, 0x0, 0x66, 0xFF, 0xEC, 0x4, 0x32, 0x5, 0xB7, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x37, 0x16, 0x12, 0x15, 0x14, 0x6, 0x23, 0x22, 0x0, 0x11, 0x35, 0x10, 0x0, 0x25, 0x17, 0x6, 0x2, 0x11, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2, 0x54, 0x57, 0xAA, 0xDD, 0xF9, 0xE3, 0xDF, 0xFE, 0xEF, 0x1, 0x3B, 0x1, 0x69, 0x20, 0xE2, 0xE8, 0x90, 0x63, 0x6E, 0x7D, 0x8B, 0x3, 0x14, 0xB9, 0x34, 0xFE, 0xEB, 0xBC, 0xDD, 0xFF, 0x1, 0x44, 0x1, 0x6, 0x2C, 0x1, 0x4D, 0x1, 0xD0, 0x38, 0xC8, 0x2B, 0xFE, 0xD4, 0xFE, 0xF3, 0x79, 0xAD, 0xB1, 0x87, 0x7C, 0x92, 0xA7, 0x0, 0x1, 0x0, 0x4E, 0xFF, 0xEC, 0x4, 0x10, 0x6, 0x1F, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x37, 0x16, 0x12, 0x15, 0x14, 0x6, 0x23, 0x22, 0x0, 0x11, 0x35, 0x10, 0x0, 0x25, 0x17, 0x6, 0x0, 0x11, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2, 0x36, 0x57, 0xA8, 0xDB, 0xF7, 0xE1, 0xDC, 0xFE, 0xF2, 0x1, 0x4A, 0x1, 0x34, 0x52, 0xCF, 0xFE, 0xF3, 0x90, 0x63, 0x6E, 0x7D, 0x8B, 0x3, 0x14, 0xB9, 0x34, 0xFE, 0xEB, 0xBC, 0xDD, 0xFF, 0x1, 0x43, 0x1, 0x6, 0x2D, 0x1, 0x4D, 0x1, 0xED, 0x83, 0xB5, 0x62, 0xFE, 0x86, 0xFE, 0xD2, 0x4E, 0xAF, 0xB3, 0x8A, 0x7D, 0x92, 0xA7, 0x0, 0x2, 0x0, 0x1C, 0xFF, 0xEB, 0x5, 0x46, 0x5, 0xB0, 0x0, 0xF, 0x0, 0x1B, 0x0, 0x0, 0x5, 0x22, 0x26, 0x10, 0x36, 0x33, 0x32, 0x17, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x6, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x1, 0x8D, 0x99, 0xD8, 0xD8, 0x99, 0x44, 0x3E, 0xFE, 0x72, 0x1, 0x11, 0x1, 0x5B, 0x1, 0x49, 0x1, 0x10, 0xFD, 0xA4, 0x27, 0xBE, 0x77, 0x3E, 0x56, 0x56, 0x3E, 0x3F, 0x58, 0x58, 0x15, 0xD8, 0x1, 0x32, 0xD9, 0x17, 0x2, 0xF9, 0xFD, 0x34, 0x2, 0xCC, 0xFB, 0x30, 0x6B, 0x8A, 0xD6, 0x4F, 0x4D, 0x4E, 0x51, 0x51, 0x4E, 0x4D, 0x4F, 0x0, 0x2, 0x0, 0x1B, 0xFE, 0x4B, 0x4, 0x99, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x1, 0x21, 0x13, 0x17, 0x13, 0x21, 0x1, 0x6, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x1, 0x89, 0x97, 0xD7, 0xD8, 0x99, 0x2E, 0x2D, 0xFE, 0xE8, 0x1, 0xA, 0xCB, 0xC, 0xE0, 0x1, 0x9, 0xFE, 0x61, 0x33, 0xB0, 0x8A, 0x3E, 0x56, 0x56, 0x3E, 0x40, 0x57, 0x57, 0xFE, 0x4B, 0xD8, 0x99, 0x98, 0xDA, 0xC, 0x3, 0x18, 0xFD, 0x63, 0x36, 0x2, 0xD3, 0xFB, 0x3B, 0x96, 0x94, 0xD6, 0x4F, 0x4D, 0x4E, 0x50, 0x50, 0x4E, 0x4D, 0x4F, 0x0, 0x1, 0x0, 0x5B, 0x4, 0x6F, 0x1, 0x5B, 0x5, 0xD8, 0x0, 0x7, 0x0, 0x0, 0x1, 0x15, 0x6, 0x7, 0x27, 0x36, 0x35, 0x35, 0x1, 0x5B, 0x2, 0xAE, 0x50, 0x4F, 0x5, 0xD8, 0x5D, 0xB3, 0x59, 0x49, 0x4B, 0x82, 0x53, 0x0, 0x1, 0x0, 0x73, 0xFD, 0xF2, 0x1, 0x75, 0xFF, 0x9C, 0x0, 0xB, 0x0, 0x0, 0x17, 0x33, 0x15, 0x14, 0x33, 0x37, 0x15, 0x6, 0x23, 0x22, 0x26, 0x35, 0x73, 0xA4, 0x33, 0x2B, 0x24, 0x2E, 0x4C, 0x64, 0x64, 0xEC, 0x48, 0x4, 0x6E, 0xC, 0x57, 0x63, 0x0, 0x1, 0x0, 0x5B, 0x4, 0x6F, 0x1, 0x5B, 0x5, 0xD8, 0x0, 0x7, 0x0, 0x0, 0x1, 0x15, 0x6, 0x7, 0x27, 0x36, 0x35, 0x35, 0x1, 0x5B, 0x2, 0xAE, 0x50, 0x4F, 0x5, 0xD8, 0x5D, 0xB3, 0x59, 0x49, 0x4B, 0x82, 0x53, 0x0, 0x1, 0x0, 0x4B, 0x4, 0xDB, 0x3, 0x29, 0x5, 0xF5, 0x0, 0x14, 0x0, 0x0, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x2, 0x94, 0x95, 0x81, 0x5F, 0x40, 0x51, 0x47, 0x36, 0x26, 0x34, 0x96, 0x7F, 0x60, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x5, 0xF5, 0xC, 0x6F, 0x91, 0x2D, 0x2C, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x3, 0x0, 0x6F, 0x4, 0xC7, 0x3, 0x48, 0x6, 0xC7, 0x0, 0x13, 0x0, 0x1F, 0x0, 0x2B, 0x0, 0x0, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x2, 0x8B, 0x67, 0x5D, 0x49, 0x50, 0x52, 0x41, 0x1F, 0x2A, 0x68, 0x5C, 0x49, 0x42, 0x63, 0x3F, 0x1E, 0x2C, 0xFD, 0xE4, 0x44, 0x3D, 0x3E, 0x45, 0x45, 0x3E, 0x3D, 0x44, 0x1, 0xD5, 0x44, 0x3D, 0x3E, 0x45, 0x45, 0x3E, 0x3D, 0x44, 0x6, 0xC7, 0x1E, 0x49, 0x6D, 0x47, 0x32, 0x25, 0x1C, 0x47, 0x71, 0x47, 0x32, 0xFE, 0x9C, 0x32, 0x44, 0x44, 0x32, 0x31, 0x45, 0x45, 0x2F, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x0, 0x2, 0x0, 0x5B, 0x4, 0x6F, 0x2, 0xC9, 0x5, 0xD8, 0x0, 0x7, 0x0, 0xD, 0x0, 0x0, 0x1, 0x15, 0x6, 0x7, 0x27, 0x36, 0x35, 0x35, 0x1, 0x15, 0x23, 0x3, 0x35, 0x33, 0x1, 0x5B, 0x2, 0xAE, 0x50, 0x4F, 0x2, 0x1F, 0x5D, 0xE6, 0xD3, 0x5, 0xD8, 0x5D, 0xB3, 0x59, 0x49, 0x4B, 0x82, 0x53, 0xFE, 0xC0, 0x14, 0x1, 0x3F, 0x15, 0x0, 0x2, 0x0, 0x5B, 0x4, 0x6F, 0x2, 0xB5, 0x5, 0xD8, 0x0, 0x7, 0x0, 0xD, 0x0, 0x0, 0x1, 0x15, 0x6, 0x7, 0x27, 0x36, 0x35, 0x35, 0x13, 0x35, 0x13, 0x33, 0x15, 0x3, 0x1, 0x5B, 0x2, 0xAE, 0x50, 0x4F, 0xC9, 0x6F, 0xD3, 0xE6, 0x5, 0xD8, 0x5D, 0xB3, 0x59, 0x49, 0x4B, 0x82, 0x53, 0xFE, 0xAC, 0x14, 0x1, 0x40, 0x15, 0xFE, 0xC1, 0x0, 0x2, 0x0, 0x6F, 0x4, 0x6F, 0x2, 0xA8, 0x6, 0x9F, 0x0, 0x13, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x7, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x35, 0x35, 0x2, 0x41, 0x67, 0x5C, 0x49, 0x50, 0x53, 0x41, 0x1F, 0x2A, 0x67, 0x5C, 0x49, 0x42, 0x62, 0x3F, 0x1E, 0x2C, 0x57, 0x45, 0x3E, 0x55, 0x3F, 0x6, 0x9F, 0x1E, 0x49, 0x6D, 0x47, 0x32, 0x25, 0x1C, 0x48, 0x70, 0x46, 0x31, 0xE1, 0x4B, 0x40, 0x7A, 0x25, 0x3C, 0x3F, 0x65, 0x4A, 0x0, 0x2, 0x0, 0x68, 0x4, 0x6F, 0x2, 0xA4, 0x5, 0xD8, 0x0, 0x8, 0x0, 0xE, 0x0, 0x0, 0x13, 0x33, 0x15, 0x14, 0x17, 0x7, 0x26, 0x26, 0x35, 0x5, 0x15, 0x23, 0x3, 0x35, 0x33, 0x68, 0xB0, 0x50, 0x51, 0x51, 0x5E, 0x2, 0x3C, 0x5C, 0xE6, 0xD3, 0x5, 0xD8, 0x53, 0x83, 0x4A, 0x49, 0x2A, 0x8D, 0x59, 0xE7, 0x14, 0x1, 0x3F, 0x15, 0x0, 0x2, 0x0, 0x68, 0x4, 0x6F, 0x2, 0xD6, 0x5, 0xD8, 0x0, 0x8, 0x0, 0xE, 0x0, 0x0, 0x13, 0x33, 0x15, 0x14, 0x17, 0x7, 0x26, 0x26, 0x35, 0x5, 0x35, 0x13, 0x33, 0x15, 0x3, 0x68, 0xB0, 0x50, 0x51, 0x51, 0x5E, 0x1, 0x2C, 0x6F, 0xD3, 0xE6, 0x5, 0xD8, 0x53, 0x83, 0x4A, 0x49, 0x2A, 0x8D, 0x59, 0xFB, 0x14, 0x1, 0x40, 0x15, 0xFE, 0xC1, 0x0, 0x2, 0x0, 0x6F, 0x4, 0x6F, 0x2, 0xA8, 0x6, 0x9F, 0x0, 0x13, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x7, 0x33, 0x15, 0x14, 0x17, 0x7, 0x26, 0x26, 0x35, 0x2, 0x41, 0x67, 0x5C, 0x49, 0x50, 0x53, 0x41, 0x1F, 0x2A, 0x67, 0x5C, 0x49, 0x42, 0x62, 0x3F, 0x1E, 0x2C, 0xF6, 0x99, 0x3F, 0x56, 0x3D, 0x45, 0x6, 0x9F, 0x1E, 0x49, 0x6D, 0x47, 0x32, 0x25, 0x1C, 0x48, 0x70, 0x46, 0x31, 0xE1, 0x4A, 0x65, 0x3F, 0x3C, 0x25, 0x7A, 0x40, 0x0, 0x3, 0x0, 0x6F, 0x4, 0xC7, 0x3, 0x48, 0x6, 0x65, 0x0, 0x3, 0x0, 0xF, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x17, 0x23, 0x27, 0x3, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0xBB, 0x72, 0x8D, 0xA8, 0x89, 0x44, 0x3D, 0x3E, 0x45, 0x45, 0x3E, 0x3D, 0x44, 0x1, 0xD5, 0x44, 0x3D, 0x3E, 0x45, 0x45, 0x3E, 0x3D, 0x44, 0x6, 0x65, 0xD3, 0xD3, 0xFE, 0xD9, 0x32, 0x44, 0x44, 0x32, 0x31, 0x45, 0x45, 0x2F, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x0, 0x3, 0x0, 0x6F, 0x4, 0xC7, 0x3, 0x48, 0x6, 0x65, 0x0, 0x3, 0x0, 0xF, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x37, 0x33, 0x7, 0x5, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0x86, 0x71, 0xC3, 0xA7, 0xFE, 0x5C, 0x44, 0x3D, 0x3E, 0x45, 0x45, 0x3E, 0x3D, 0x44, 0x1, 0xD5, 0x44, 0x3D, 0x3E, 0x45, 0x45, 0x3E, 0x3D, 0x44, 0x5, 0x92, 0xD3, 0xD3, 0x54, 0x32, 0x44, 0x44, 0x32, 0x31, 0x45, 0x45, 0x2F, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x0, 0x1, 0x0, 0x66, 0x4, 0x6F, 0x1, 0xA9, 0x5, 0xC3, 0x0, 0x5, 0x0, 0x0, 0x1, 0x23, 0x3, 0x35, 0x33, 0x13, 0x1, 0xA9, 0x5D, 0xE6, 0xD3, 0x70, 0x4, 0x6F, 0x1, 0x3F, 0x15, 0xFE, 0xC1, 0x0, 0x1, 0x0, 0x64, 0x4, 0x6F, 0x1, 0xA7, 0x5, 0xC3, 0x0, 0x5, 0x0, 0x0, 0x13, 0x35, 0x13, 0x33, 0x15, 0x3, 0x64, 0x70, 0xD3, 0xE6, 0x4, 0x6F, 0x15, 0x1, 0x3F, 0x15, 0xFE, 0xC1, 0x0, 0x1, 0x0, 0x69, 0x4, 0x6F, 0x1, 0x69, 0x5, 0xD8, 0x0, 0x8, 0x0, 0x0, 0x13, 0x33, 0x15, 0x14, 0x17, 0x7, 0x26, 0x26, 0x35, 0x69, 0xB0, 0x50, 0x51, 0x51, 0x5E, 0x5, 0xD8, 0x53, 0x83, 0x4A, 0x49, 0x2A, 0x8D, 0x59, 0x0, 0x1, 0xFD, 0x68, 0xFF, 0x38, 0xFE, 0x9, 0x4, 0xD8, 0x0, 0x3, 0x0, 0x0, 0x5, 0x11, 0x33, 0x11, 0xFD, 0x68, 0xA1, 0xC8, 0x5, 0xA0, 0xFA, 0x60, 0x0, 0x1, 0xFC, 0x94, 0xFF, 0x38, 0xFE, 0xDE, 0x5, 0xF1, 0x0, 0xE, 0x0, 0x0, 0x1, 0x27, 0x11, 0x23, 0x11, 0x7, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x7, 0x17, 0xFE, 0x67, 0x61, 0xA0, 0x5B, 0x77, 0xB0, 0xB0, 0x77, 0xAE, 0xAE, 0x77, 0xB0, 0xB0, 0x3, 0xA0, 0x63, 0xFB, 0x35, 0x4, 0xC5, 0x5D, 0x74, 0xB4, 0xB4, 0x75, 0xB2, 0xB2, 0x75, 0xB4, 0xB4, 0x0, 0x1, 0xFC, 0xAD, 0xFF, 0x38, 0xFF, 0x46, 0x5, 0xD1, 0x0, 0xA, 0x0, 0x0, 0x1, 0x37, 0x23, 0x11, 0x23, 0x11, 0x21, 0x27, 0x33, 0x17, 0x7, 0xFD, 0x98, 0xA8, 0xF2, 0xA1, 0x1, 0x9A, 0xA8, 0xC6, 0xE1, 0xE7, 0x3, 0xE9, 0xA1, 0xFA, 0xAE, 0x5, 0xEB, 0xAE, 0xFB, 0xED, 0x0, 0x1, 0xFC, 0x5E, 0xFF, 0x38, 0xFE, 0xF7, 0x5, 0xD1, 0x0, 0xA, 0x0, 0x0, 0x5, 0x11, 0x23, 0x17, 0x23, 0x27, 0x37, 0x33, 0x7, 0x21, 0x11, 0xFE, 0x57, 0xF3, 0xA8, 0xC6, 0xE8, 0xE1, 0xC7, 0xA9, 0x1, 0x9A, 0xC8, 0x5, 0x52, 0xA1, 0xED, 0xFB, 0xAE, 0xFA, 0x15, 0xFF, 0xFF, 0x0, 0x47, 0x2, 0xA, 0x2, 0x54, 0x2, 0xCD, 0x0, 0x6, 0x0, 0x12, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x47, 0x2, 0xA, 0x2, 0x54, 0x2, 0xCD, 0x0, 0x6, 0x0, 0x12, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x9F, 0x2, 0x6E, 0x3, 0xEF, 0x3, 0x32, 0x0, 0x6, 0x5, 0x3A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x9E, 0x2, 0x6E, 0x4, 0x97, 0x3, 0x32, 0x0, 0x46, 0x5, 0x3A, 0xDF, 0x0, 0x4C, 0xCD, 0x40, 0x0, 0xFF, 0xFF, 0x0, 0x82, 0x2, 0x6E, 0x5, 0xCF, 0x3, 0x32, 0x0, 0x46, 0x5, 0x3A, 0x84, 0x0, 0x66, 0x66, 0x40, 0x0, 0xFF, 0xFF, 0x0, 0xAB, 0xFE, 0xF2, 0x2, 0x8D, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x61, 0xFD, 0x0, 0x0, 0x7, 0x0, 0x61, 0x1, 0x37, 0x0, 0x0, 0x0, 0x2, 0x0, 0x4, 0xFE, 0x60, 0x3, 0x9A, 0x0, 0x0, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x21, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x3, 0x9A, 0xFC, 0x6A, 0x3, 0x96, 0xFC, 0x6A, 0x9D, 0x9D, 0xFE, 0xFC, 0x9C, 0x9C, 0x0, 0x1, 0x0, 0x64, 0x4, 0x21, 0x1, 0x96, 0x6, 0x1B, 0x0, 0x8, 0x0, 0x0, 0x13, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x7, 0x15, 0x64, 0x65, 0x51, 0x7C, 0x59, 0x4, 0x4, 0x21, 0x88, 0x5F, 0xD0, 0x43, 0x4D, 0x87, 0x8B, 0x9B, 0x0, 0x1, 0x0, 0x34, 0x4, 0x0, 0x1, 0x66, 0x6, 0x0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0x1, 0x66, 0x65, 0x51, 0x7C, 0x5A, 0x3, 0x6, 0x0, 0x8E, 0x5E, 0xD0, 0x44, 0x4D, 0x89, 0x8D, 0x9D, 0x0, 0x1, 0x0, 0x32, 0xFE, 0xD6, 0x1, 0x65, 0x0, 0xCB, 0x0, 0x8, 0x0, 0x0, 0x25, 0x7, 0x6, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0x1, 0x65, 0x1, 0x1, 0x63, 0x52, 0x7C, 0x55, 0x3, 0xCB, 0x86, 0x5F, 0xCD, 0x43, 0x4D, 0x81, 0x93, 0x94, 0x0, 0x1, 0x0, 0x4B, 0x4, 0x0, 0x1, 0x7D, 0x6, 0x0, 0x0, 0x8, 0x0, 0x0, 0x13, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x26, 0x35, 0x4B, 0xD5, 0x3, 0x5A, 0x7C, 0x52, 0x64, 0x6, 0x0, 0x9D, 0x91, 0x85, 0x4D, 0x44, 0xD0, 0x5E, 0xFF, 0xFF, 0x0, 0x6D, 0x4, 0x21, 0x2, 0xEF, 0x6, 0x1B, 0x0, 0x26, 0x4, 0x62, 0x9, 0x0, 0x0, 0x7, 0x4, 0x62, 0x1, 0x59, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x41, 0x4, 0x0, 0x2, 0xC1, 0x6, 0x0, 0x0, 0x26, 0x4, 0x63, 0xD, 0x0, 0x0, 0x7, 0x4, 0x63, 0x1, 0x5B, 0x0, 0x0, 0x0, 0x2, 0x0, 0x32, 0xFE, 0xC2, 0x2, 0xAB, 0x0, 0xFF, 0x0, 0x8, 0x0, 0x11, 0x0, 0x0, 0x25, 0x7, 0x14, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0x23, 0x7, 0x14, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0x2, 0xAB, 0x1, 0x64, 0x52, 0x7F, 0x59, 0x3, 0x6C, 0x1, 0x61, 0x52, 0x7F, 0x55, 0x3, 0xFF, 0xB7, 0x64, 0xDC, 0x46, 0x4D, 0x8D, 0x9B, 0xC8, 0xB7, 0x64, 0xDC, 0x46, 0x4D, 0x87, 0xA0, 0xC9, 0x0, 0x2, 0x0, 0x4F, 0x3, 0xD6, 0x2, 0xE0, 0x6, 0x18, 0x0, 0x8, 0x0, 0x11, 0x0, 0x0, 0x1, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x26, 0x35, 0x25, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x26, 0x35, 0x1, 0xAA, 0xDC, 0x2, 0x58, 0x80, 0x51, 0x65, 0xFE, 0xA5, 0xDC, 0x3, 0x57, 0x7F, 0x52, 0x65, 0x6, 0x18, 0xC8, 0xA2, 0x8A, 0x4E, 0x47, 0xDC, 0x64, 0xBB, 0xCC, 0x9C, 0x8C, 0x4E, 0x47, 0xDC, 0x64, 0x0, 0x1, 0x0, 0x41, 0x0, 0x0, 0x4, 0x1E, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x4, 0x1E, 0xFE, 0x88, 0xF3, 0xFE, 0x8E, 0x1, 0x72, 0xF3, 0x1, 0x78, 0x3, 0x73, 0xFC, 0x8D, 0x3, 0x73, 0xC7, 0x1, 0x76, 0xFE, 0x8A, 0x0, 0x1, 0x0, 0x5D, 0xFE, 0x60, 0x4, 0x3A, 0x5, 0xB0, 0x0, 0x13, 0x0, 0x0, 0x21, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x4, 0x3A, 0xFE, 0x88, 0xF3, 0xFE, 0x8E, 0x1, 0x72, 0xFE, 0x8E, 0x1, 0x72, 0xF3, 0x1, 0x78, 0xFE, 0x88, 0x1, 0x78, 0xFE, 0x60, 0x1, 0xA0, 0xC3, 0x2, 0xB3, 0xC4, 0x1, 0x76, 0xFE, 0x8A, 0xC4, 0xFD, 0x4D, 0x0, 0x1, 0x0, 0x88, 0x2, 0x7, 0x2, 0x45, 0x3, 0xDB, 0x0, 0xC, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x22, 0x26, 0x35, 0x88, 0x78, 0x65, 0x68, 0x78, 0x77, 0xCE, 0x78, 0x3, 0x3, 0x5F, 0x79, 0x79, 0x5F, 0x27, 0x5E, 0x77, 0x77, 0x5E, 0x0, 0x1, 0x0, 0x98, 0x0, 0x87, 0x4, 0x9, 0x4, 0x90, 0x0, 0x2, 0x0, 0x0, 0x13, 0x1, 0x1, 0x98, 0x3, 0x71, 0xFC, 0x8F, 0x4, 0x90, 0xFD, 0xFB, 0xFD, 0xFC, 0xFF, 0xFF, 0x0, 0x85, 0xFF, 0xF4, 0x1, 0xA0, 0x1, 0x1, 0x0, 0x6, 0x0, 0x13, 0xFD, 0x0, 0xFF, 0xFF, 0x0, 0x8C, 0xFF, 0xF4, 0x3, 0x70, 0x1, 0x1, 0x0, 0x26, 0x0, 0x13, 0x4, 0x0, 0x0, 0x7, 0x0, 0x13, 0x1, 0xCD, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8C, 0xFF, 0xF4, 0x5, 0x29, 0x1, 0x1, 0x0, 0x22, 0x0, 0x13, 0x4, 0x0, 0x0, 0x23, 0x0, 0x13, 0x1, 0xCD, 0x0, 0x0, 0x0, 0x3, 0x0, 0x13, 0x3, 0x86, 0x0, 0x0, 0x0, 0x1, 0x0, 0x5B, 0x1, 0xEC, 0x1, 0x6E, 0x2, 0xED, 0x0, 0x9, 0x0, 0x0, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x5B, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x2, 0x6C, 0x38, 0x49, 0x49, 0x38, 0x37, 0x49, 0x49, 0x0, 0x6, 0x0, 0x4B, 0xFF, 0xEB, 0x7, 0x60, 0x5, 0xC5, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x1F, 0x0, 0x35, 0x0, 0x42, 0x0, 0x4F, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x25, 0x1, 0x27, 0x1, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x1, 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x5, 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x4B, 0xA1, 0x8C, 0x92, 0xA3, 0xA3, 0x90, 0x8E, 0xA1, 0xA2, 0x45, 0x48, 0x46, 0x44, 0x45, 0x47, 0x46, 0x45, 0x3, 0x9C, 0xFD, 0x39, 0x7D, 0x2, 0xC7, 0x2, 0x21, 0x96, 0x50, 0x4E, 0x93, 0x91, 0xA5, 0xA4, 0x90, 0x94, 0x4F, 0x50, 0x94, 0x91, 0xA4, 0xA4, 0xFE, 0xE4, 0x49, 0x44, 0x89, 0x44, 0x47, 0x46, 0x45, 0xFE, 0x39, 0x48, 0x45, 0x89, 0x44, 0x47, 0x46, 0x45, 0x4, 0x98, 0x7C, 0xB1, 0xB1, 0x7C, 0x4D, 0x7A, 0xB1, 0xB1, 0x7A, 0x3B, 0x5E, 0x5D, 0x3C, 0x4D, 0x3D, 0x5E, 0x5E, 0x3D, 0x47, 0xFB, 0x8E, 0x49, 0x4, 0x72, 0xFA, 0xC3, 0x6F, 0x6F, 0xB1, 0x7B, 0x4E, 0x7B, 0xB1, 0x6F, 0x6F, 0xB1, 0x7B, 0x4E, 0x7B, 0xB1, 0x1, 0x2C, 0x3C, 0x5E, 0xAA, 0x3E, 0x3C, 0x5E, 0x5E, 0x3C, 0x4E, 0x3C, 0x5E, 0xAA, 0x3E, 0x3C, 0x5E, 0x5E, 0x3C, 0x0, 0x7, 0x0, 0x4B, 0xFF, 0xEB, 0x9, 0x15, 0x5, 0xC5, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x1F, 0x0, 0x3C, 0x0, 0x49, 0x0, 0x56, 0x0, 0x63, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x25, 0x1, 0x27, 0x1, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x20, 0x16, 0x15, 0x15, 0x14, 0x6, 0x1, 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x5, 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x5, 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x4B, 0xA1, 0x8C, 0x92, 0xA3, 0xA3, 0x90, 0x8E, 0xA1, 0xA2, 0x45, 0x48, 0x46, 0x44, 0x45, 0x47, 0x46, 0x45, 0x3, 0x8B, 0xFD, 0x39, 0x7D, 0x2, 0xC7, 0x3, 0xE7, 0x92, 0x50, 0x4D, 0x97, 0x95, 0x50, 0x4F, 0x93, 0x91, 0xA5, 0xA5, 0x8F, 0x95, 0x4F, 0x50, 0x93, 0x99, 0x4D, 0x4F, 0x1, 0x22, 0xA4, 0xA4, 0xFE, 0xE4, 0x49, 0x44, 0x89, 0x44, 0x47, 0x46, 0x45, 0xFE, 0x3B, 0x49, 0x43, 0x8A, 0x45, 0x47, 0x46, 0x44, 0xFE, 0x39, 0x48, 0x44, 0x8A, 0x45, 0x47, 0x46, 0x44, 0x4, 0x98, 0x7C, 0xB1, 0xB1, 0x7C, 0x4D, 0x7A, 0xB1, 0xB1, 0x7A, 0x3B, 0x5E, 0x5D, 0x3C, 0x4D, 0x3D, 0x5E, 0x5E, 0x3D, 0x47, 0xFB, 0x8E, 0x49, 0x4, 0x72, 0xFA, 0xC3, 0x6A, 0x6A, 0x6F, 0x6F, 0xB1, 0x7B, 0x4E, 0x7B, 0xB1, 0x6F, 0x6F, 0x6A, 0x6A, 0xB1, 0x7B, 0x4E, 0x7B, 0xB1, 0x1, 0x2C, 0x3C, 0x5E, 0xAA, 0x3E, 0x3C, 0x5E, 0x5E, 0x3C, 0x4E, 0x3C, 0x5E, 0xAC, 0x3C, 0x3C, 0x5E, 0x5E, 0x3C, 0x4E, 0x3C, 0x5E, 0xA9, 0x3F, 0x3C, 0x5E, 0x5E, 0x3C, 0x0, 0x3, 0x0, 0x4C, 0x4, 0xBA, 0x4, 0xA4, 0x6, 0x1A, 0x0, 0x3, 0x0, 0x7, 0x0, 0xB, 0x0, 0x0, 0x1, 0x13, 0x33, 0x3, 0x21, 0x13, 0x33, 0x3, 0x21, 0x13, 0x33, 0x3, 0x3, 0x1B, 0x9A, 0xEF, 0xDE, 0xFD, 0xEE, 0x99, 0xF0, 0xDE, 0xFD, 0xED, 0x9A, 0xEF, 0xDE, 0x4, 0xBA, 0x1, 0x60, 0xFE, 0xA0, 0x1, 0x60, 0xFE, 0xA0, 0x1, 0x60, 0xFE, 0xA0, 0x0, 0x1, 0x0, 0x4C, 0x4, 0xBA, 0x1, 0xD5, 0x6, 0x1A, 0x0, 0x3, 0x0, 0x0, 0x1, 0x13, 0x23, 0x3, 0x1, 0x3C, 0x99, 0xAB, 0xDE, 0x6, 0x1A, 0xFE, 0xA0, 0x1, 0x60, 0x0, 0x2, 0x0, 0x50, 0x4, 0xBA, 0x3, 0x41, 0x6, 0x1A, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x13, 0x23, 0x3, 0x21, 0x13, 0x23, 0x3, 0x1, 0x40, 0x99, 0xAB, 0xDE, 0x2, 0x57, 0x9A, 0xAB, 0xDE, 0x6, 0x1A, 0xFE, 0xA0, 0x1, 0x60, 0xFE, 0xA0, 0x1, 0x60, 0x0, 0x3, 0x0, 0x50, 0x4, 0xBA, 0x4, 0xA8, 0x6, 0x1A, 0x0, 0x3, 0x0, 0x7, 0x0, 0xB, 0x0, 0x0, 0x1, 0x13, 0x23, 0x3, 0x21, 0x13, 0x23, 0x3, 0x21, 0x13, 0x23, 0x3, 0x1, 0x40, 0x99, 0xAB, 0xDE, 0x2, 0x57, 0x9A, 0xAB, 0xDE, 0x2, 0x57, 0x99, 0xAB, 0xDE, 0x6, 0x1A, 0xFE, 0xA0, 0x1, 0x60, 0xFE, 0xA0, 0x1, 0x60, 0xFE, 0xA0, 0x1, 0x60, 0x0, 0x1, 0x0, 0x30, 0xFD, 0xDB, 0x3, 0x49, 0xFF, 0x9D, 0x0, 0x8, 0x0, 0x0, 0x1, 0x3, 0x23, 0x1, 0x33, 0x1, 0x23, 0x3, 0x27, 0x1, 0xAB, 0xB5, 0xC6, 0x1, 0x39, 0xA4, 0x1, 0x3C, 0xC6, 0xBB, 0xE, 0xFE, 0xF5, 0xFE, 0xE6, 0x1, 0xC2, 0xFE, 0x3E, 0x1, 0x1A, 0x24, 0x0, 0x1, 0x0, 0x6C, 0x0, 0x8B, 0x2, 0x34, 0x3, 0xAA, 0x0, 0x6, 0x0, 0x0, 0x25, 0x23, 0x1, 0x35, 0x1, 0x33, 0x3, 0x2, 0x34, 0xA8, 0xFE, 0xE0, 0x1, 0x20, 0xA8, 0xF7, 0x8B, 0x1, 0x86, 0x13, 0x1, 0x86, 0xFE, 0x71, 0x0, 0x1, 0x0, 0x55, 0x0, 0x8A, 0x2, 0x1C, 0x3, 0xA9, 0x0, 0x6, 0x0, 0x0, 0x37, 0x23, 0x13, 0x3, 0x33, 0x1, 0x15, 0xFC, 0xA7, 0xF7, 0xF7, 0xA7, 0x1, 0x20, 0x8A, 0x1, 0x90, 0x1, 0x8F, 0xFE, 0x7A, 0x13, 0x0, 0x5, 0x0, 0x4A, 0x0, 0x6B, 0x4, 0xE1, 0x4, 0xF1, 0x0, 0x9, 0x0, 0x15, 0x0, 0x21, 0x0, 0x2B, 0x0, 0x35, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x9, 0x2, 0x27, 0x1, 0x1, 0x37, 0x1, 0x1, 0x17, 0x1, 0x1, 0x3, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x2, 0xC, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x1, 0xC9, 0xFE, 0xC5, 0xFE, 0xC4, 0x94, 0x1, 0x3C, 0xFE, 0xC4, 0x94, 0x1, 0x3C, 0x1, 0x3B, 0x94, 0xFE, 0xC4, 0x1, 0x3C, 0x9C, 0x49, 0x40, 0x41, 0x4A, 0x4A, 0x41, 0x40, 0x49, 0xFC, 0x7D, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x1, 0xC2, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x4, 0x75, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0xFC, 0x96, 0x1, 0x42, 0xFE, 0xBE, 0x95, 0x1, 0x43, 0x1, 0x42, 0x95, 0xFE, 0xBE, 0x1, 0x42, 0x95, 0xFE, 0xBE, 0xFE, 0xBD, 0x1, 0x46, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x34, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0xFE, 0x68, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x0, 0x3, 0x0, 0x2C, 0xFF, 0xF4, 0x3, 0x88, 0x6, 0x78, 0x0, 0x5, 0x0, 0x19, 0x0, 0x23, 0x0, 0x0, 0x1, 0x34, 0x27, 0x3, 0x36, 0x36, 0x1, 0x3, 0x6, 0x15, 0x23, 0x36, 0x36, 0x37, 0x27, 0x21, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x6, 0x6, 0x7, 0x3, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x2, 0x95, 0x80, 0x8, 0x3A, 0x4E, 0xFE, 0x9F, 0xE, 0x7, 0xF3, 0x2, 0x86, 0x6C, 0x4, 0x1, 0x1, 0x4, 0xAF, 0xC0, 0x5B, 0xA1, 0x35, 0x25, 0x1, 0xF4, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x4, 0x39, 0x9E, 0x1D, 0xFE, 0x55, 0x38, 0x6A, 0xFD, 0xC2, 0x2, 0xCE, 0x19, 0x1D, 0x87, 0xB1, 0x28, 0xD3, 0xB6, 0xF, 0xC8, 0xA9, 0x65, 0xA4, 0x9A, 0x33, 0x76, 0x49, 0xFE, 0xC9, 0x38, 0x4B, 0x4B, 0x38, 0x37, 0x4B, 0x4B, 0xFF, 0xFF, 0x0, 0xD, 0x6, 0x13, 0x3, 0xA3, 0x6, 0xD3, 0x0, 0x7, 0x0, 0x44, 0x0, 0xA, 0x6, 0xD3, 0x0, 0x1, 0x0, 0xB, 0xFE, 0x1A, 0x6, 0x19, 0xFF, 0x8D, 0x0, 0xD, 0x0, 0x0, 0x1, 0x20, 0x24, 0x27, 0x37, 0x16, 0x4, 0x33, 0x32, 0x24, 0x37, 0x17, 0x6, 0x4, 0x3, 0x11, 0xFE, 0xD7, 0xFE, 0x94, 0x71, 0x71, 0x65, 0x1, 0x41, 0xEF, 0xF0, 0x1, 0x52, 0x65, 0x61, 0x5A, 0xFE, 0x7C, 0xFE, 0x1A, 0x9F, 0x7A, 0x58, 0x41, 0x5C, 0x62, 0x3D, 0x5A, 0x71, 0xA8, 0x0, 0x1, 0x0, 0xB, 0x4, 0x9E, 0x6, 0x19, 0x6, 0x10, 0x0, 0xD, 0x0, 0x0, 0x1, 0x22, 0x4, 0x7, 0x27, 0x36, 0x24, 0x21, 0x20, 0x4, 0x17, 0x7, 0x26, 0x24, 0x3, 0x11, 0xEF, 0xFE, 0xBF, 0x65, 0x71, 0x71, 0x1, 0x6C, 0x1, 0x29, 0x1, 0x2A, 0x1, 0x84, 0x5A, 0x61, 0x65, 0xFE, 0xAE, 0x5, 0x3D, 0x5C, 0x41, 0x57, 0x7A, 0x9F, 0xA8, 0x71, 0x59, 0x3D, 0x62, 0x0, 0x1, 0x0, 0x3B, 0xFE, 0xE, 0x3, 0x3D, 0x2, 0x5A, 0x0, 0x7, 0x0, 0x0, 0x1, 0x3, 0x3, 0x27, 0x1, 0x17, 0x1, 0x13, 0x2, 0x60, 0xC8, 0xC4, 0x99, 0x2, 0x67, 0x9B, 0xFE, 0xC0, 0xFB, 0xFE, 0xE, 0x1, 0x42, 0xFE, 0xBF, 0x58, 0x3, 0xF3, 0x58, 0xFD, 0xF3, 0xFE, 0x6B, 0x0, 0x3, 0x0, 0x50, 0x0, 0x83, 0x5, 0x8, 0x5, 0x27, 0x0, 0x17, 0x0, 0x2F, 0x0, 0x47, 0x0, 0x0, 0x1, 0x27, 0x15, 0x23, 0x35, 0x7, 0x27, 0x37, 0x23, 0x35, 0x33, 0x27, 0x37, 0x17, 0x35, 0x33, 0x15, 0x37, 0x17, 0x7, 0x33, 0x15, 0x23, 0x17, 0x1, 0x27, 0x15, 0x23, 0x35, 0x7, 0x27, 0x37, 0x23, 0x35, 0x33, 0x27, 0x37, 0x17, 0x35, 0x33, 0x15, 0x37, 0x17, 0x7, 0x33, 0x15, 0x23, 0x17, 0x5, 0x27, 0x15, 0x23, 0x35, 0x7, 0x27, 0x37, 0x23, 0x35, 0x33, 0x27, 0x37, 0x17, 0x35, 0x33, 0x15, 0x37, 0x17, 0x7, 0x33, 0x15, 0x23, 0x17, 0x3, 0x4B, 0x65, 0x73, 0x66, 0x51, 0x68, 0x94, 0x91, 0x65, 0x51, 0x67, 0x72, 0x65, 0x50, 0x65, 0x92, 0x95, 0x68, 0xFE, 0x70, 0x65, 0x73, 0x66, 0x51, 0x68, 0x94, 0x91, 0x65, 0x51, 0x67, 0x72, 0x65, 0x50, 0x65, 0x92, 0x95, 0x68, 0x2, 0x30, 0x65, 0x73, 0x66, 0x51, 0x68, 0x94, 0x91, 0x65, 0x51, 0x67, 0x72, 0x65, 0x50, 0x65, 0x92, 0x95, 0x68, 0x3, 0x17, 0x66, 0x8E, 0x90, 0x68, 0x52, 0x69, 0x73, 0x66, 0x51, 0x68, 0x93, 0x91, 0x66, 0x51, 0x67, 0x72, 0x6A, 0xFD, 0x43, 0x66, 0x8E, 0x90, 0x68, 0x52, 0x69, 0x73, 0x66, 0x51, 0x68, 0x93, 0x91, 0x66, 0x51, 0x67, 0x72, 0x6A, 0x51, 0x66, 0x8E, 0x90, 0x68, 0x52, 0x69, 0x73, 0x66, 0x51, 0x68, 0x93, 0x91, 0x66, 0x51, 0x67, 0x72, 0x6A, 0x0, 0x1, 0x0, 0x54, 0x2, 0x17, 0x3, 0x1A, 0x3, 0xBB, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x21, 0x11, 0x3, 0x1A, 0xFD, 0x3A, 0x3, 0xBB, 0xFE, 0x5C, 0x1, 0xA4, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x6D, 0x3, 0x72, 0x5, 0x28, 0x0, 0x3, 0x0, 0x0, 0x1, 0x1, 0x27, 0x1, 0x3, 0x72, 0xFD, 0x39, 0x7E, 0x2, 0xC7, 0x4, 0xDF, 0xFB, 0x8E, 0x49, 0x4, 0x72, 0x0, 0x1, 0x0, 0x99, 0xFE, 0xBB, 0x2, 0x32, 0x6, 0x8F, 0x0, 0xB, 0x0, 0x0, 0x5, 0x15, 0x21, 0x11, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x11, 0x2, 0x32, 0xFE, 0x67, 0x1, 0x99, 0xA6, 0xA6, 0xA6, 0x87, 0xBE, 0x7, 0xD4, 0xBE, 0xFD, 0x3E, 0xBE, 0xFD, 0x28, 0x0, 0x1, 0x0, 0x5E, 0xFE, 0xBB, 0x1, 0xF7, 0x6, 0x8F, 0x0, 0xB, 0x0, 0x0, 0x1, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x1, 0xF7, 0xFE, 0x67, 0xA6, 0xA6, 0xA6, 0xA6, 0x1, 0x99, 0xFE, 0xBB, 0xBE, 0x2, 0xD8, 0xBE, 0x2, 0xC2, 0xBE, 0x0, 0x1, 0x0, 0x3C, 0xFE, 0x60, 0x3, 0x1C, 0x4, 0x3A, 0x0, 0x5, 0x0, 0x0, 0x13, 0x35, 0x21, 0x11, 0x23, 0x11, 0x3C, 0x2, 0xE0, 0xF2, 0x3, 0x76, 0xC4, 0xFA, 0x26, 0x5, 0x16, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x3, 0xB6, 0x5, 0xB0, 0x0, 0xA, 0x0, 0x0, 0x21, 0x23, 0x11, 0x21, 0x32, 0x12, 0x15, 0x14, 0x2, 0x23, 0x23, 0x1, 0x77, 0xF3, 0x1, 0x46, 0xEF, 0xFD, 0xFD, 0xEF, 0x53, 0x5, 0xB0, 0xFE, 0xF5, 0xC9, 0xCA, 0xFE, 0xF6, 0x0, 0x2, 0x0, 0x66, 0x0, 0xCD, 0x4, 0x97, 0x3, 0xBD, 0x0, 0x7, 0x0, 0xB, 0x0, 0x0, 0x1, 0x11, 0x21, 0x22, 0x26, 0x10, 0x36, 0x33, 0x5, 0x23, 0x11, 0x33, 0x4, 0x97, 0xFD, 0x66, 0xB5, 0xE2, 0xE2, 0xB5, 0x1, 0xD2, 0x6A, 0x6A, 0x3, 0xBD, 0xFD, 0x10, 0xCE, 0x1, 0x54, 0xCE, 0x7B, 0xFE, 0x6, 0x0, 0x2, 0x0, 0x66, 0x0, 0xCD, 0x4, 0x97, 0x3, 0xBD, 0x0, 0x7, 0x0, 0xB, 0x0, 0x0, 0x13, 0x21, 0x32, 0x16, 0x10, 0x6, 0x23, 0x21, 0x1, 0x23, 0x11, 0x33, 0x66, 0x2, 0x9A, 0xB6, 0xE1, 0xE1, 0xB6, 0xFD, 0x66, 0x1, 0x32, 0x6A, 0x6A, 0x3, 0xBD, 0xCE, 0xFE, 0xAC, 0xCE, 0x2, 0x75, 0xFE, 0x6, 0xFF, 0xFF, 0x0, 0x3E, 0xFE, 0x4E, 0x3, 0x97, 0x1, 0xB1, 0x0, 0x7, 0x0, 0xF, 0x0, 0x22, 0xFC, 0x0, 0x0, 0x2, 0x0, 0x84, 0xFE, 0xAB, 0x1, 0xD9, 0x4, 0x52, 0x0, 0x9, 0x0, 0x12, 0x0, 0x0, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x13, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x26, 0x35, 0x84, 0x4A, 0x86, 0x4B, 0x4B, 0x86, 0x4A, 0x18, 0xE5, 0x3, 0x55, 0x7F, 0x55, 0x69, 0x3, 0xCA, 0x3A, 0x4E, 0x4E, 0x3A, 0x38, 0x4D, 0x4D, 0xFD, 0x59, 0xCC, 0xA0, 0x87, 0x4D, 0x48, 0xE0, 0x65, 0x0, 0x2, 0x0, 0xB, 0xFE, 0x1A, 0x6, 0x19, 0x6, 0x11, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x36, 0x24, 0x21, 0x20, 0x4, 0x17, 0x7, 0x26, 0x24, 0x23, 0x22, 0x4, 0x7, 0x1, 0x20, 0x24, 0x27, 0x37, 0x16, 0x4, 0x33, 0x32, 0x24, 0x37, 0x17, 0x6, 0x4, 0xB, 0x71, 0x1, 0x6C, 0x1, 0x29, 0x1, 0x2A, 0x1, 0x84, 0x5A, 0x61, 0x65, 0xFE, 0xAE, 0xF0, 0xEF, 0xFE, 0xBF, 0x65, 0x2, 0x95, 0xFE, 0xD7, 0xFE, 0x94, 0x71, 0x71, 0x65, 0x1, 0x41, 0xEF, 0xF0, 0x1, 0x52, 0x65, 0x61, 0x5A, 0xFE, 0x7C, 0x4, 0xF8, 0x7A, 0x9F, 0xA8, 0x71, 0x5A, 0x3D, 0x62, 0x5C, 0x41, 0xF9, 0x7A, 0x9F, 0x7A, 0x58, 0x41, 0x5C, 0x62, 0x3D, 0x5A, 0x71, 0xA8, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x4F, 0x3, 0xA9, 0x5, 0xB1, 0x0, 0x26, 0x0, 0xF, 0x34, 0x0, 0x0, 0x7, 0x0, 0xF, 0x0, 0x34, 0xFC, 0x1, 0x0, 0x3, 0x0, 0x43, 0xFF, 0x83, 0x3, 0x6C, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xF, 0x0, 0x19, 0x0, 0x0, 0x1, 0x1, 0x23, 0x1, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x3, 0x55, 0xFD, 0xC3, 0xBF, 0x2, 0x3D, 0xFD, 0xAD, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0x2, 0x16, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x5, 0xB0, 0xF9, 0xD3, 0x6, 0x2D, 0xFE, 0x7B, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0xFD, 0x18, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x1, 0x0, 0x50, 0x1, 0xFB, 0x5, 0x2E, 0x3, 0x89, 0x0, 0x16, 0x0, 0x0, 0x1, 0x17, 0x6, 0x6, 0x23, 0x22, 0x26, 0x27, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x16, 0x33, 0x32, 0x36, 0x4, 0xCF, 0x5F, 0x36, 0xA7, 0x6A, 0x6E, 0xC5, 0x5A, 0x5E, 0x5D, 0x4E, 0x73, 0x37, 0x57, 0x41, 0xA9, 0x67, 0x6C, 0xC1, 0xB6, 0x59, 0x44, 0x74, 0x3, 0x1D, 0x98, 0x2E, 0x5C, 0x64, 0x31, 0x33, 0x35, 0x29, 0x9E, 0x31, 0x55, 0x65, 0x63, 0x33, 0x0, 0x1, 0x0, 0xB, 0xFE, 0x1A, 0x6, 0x19, 0xFF, 0x8D, 0x0, 0xD, 0x0, 0x0, 0x5, 0x20, 0x4, 0x17, 0x7, 0x26, 0x24, 0x23, 0x22, 0x4, 0x7, 0x27, 0x36, 0x24, 0x3, 0x11, 0x1, 0x2A, 0x1, 0x84, 0x5A, 0x61, 0x65, 0xFE, 0xAE, 0xF0, 0xEF, 0xFE, 0xBF, 0x65, 0x71, 0x71, 0x1, 0x6C, 0x73, 0xA9, 0x70, 0x5A, 0x3D, 0x62, 0x5D, 0x40, 0x58, 0x79, 0xA0, 0x0, 0x1, 0x0, 0xC0, 0x0, 0x49, 0x4, 0x63, 0x3, 0xEC, 0x0, 0x17, 0x0, 0x0, 0x25, 0x27, 0x15, 0x23, 0x35, 0x7, 0x27, 0x37, 0x23, 0x35, 0x33, 0x27, 0x37, 0x17, 0x35, 0x33, 0x15, 0x37, 0x17, 0x7, 0x33, 0x15, 0x23, 0x17, 0x3, 0x97, 0xAB, 0xB5, 0xAD, 0x7F, 0xB1, 0xFC, 0xF7, 0xAC, 0x7F, 0xAE, 0xB4, 0xAB, 0x80, 0xAD, 0xF9, 0xFD, 0xB1, 0x8B, 0xAF, 0xF1, 0xF3, 0xB1, 0x81, 0xB4, 0xB5, 0xB0, 0x7F, 0xB1, 0xF9, 0xF6, 0xAE, 0x7F, 0xB0, 0xB5, 0xB4, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE2, 0x3, 0x6E, 0x3, 0xED, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x2, 0xD9, 0x0, 0x27, 0x1, 0xD4, 0x5, 0x3F, 0x1, 0x4F, 0x0, 0x7, 0x1, 0xD4, 0x5, 0x3F, 0x4, 0x62, 0x0, 0x4, 0x0, 0x50, 0x4, 0xBA, 0x6, 0x13, 0x6, 0x1A, 0x0, 0x3, 0x0, 0x7, 0x0, 0xB, 0x0, 0xF, 0x0, 0x0, 0x1, 0x13, 0x33, 0x3, 0x21, 0x13, 0x33, 0x3, 0x21, 0x13, 0x33, 0x3, 0x21, 0x13, 0x33, 0x3, 0x4, 0x8A, 0x9A, 0xEF, 0xDE, 0xFD, 0xEA, 0x9A, 0xEF, 0xDE, 0xFD, 0xEE, 0x99, 0xF0, 0xDE, 0xFD, 0xED, 0x9A, 0xEF, 0xDE, 0x4, 0xBA, 0x1, 0x60, 0xFE, 0xA0, 0x1, 0x60, 0xFE, 0xA0, 0x1, 0x60, 0xFE, 0xA0, 0x1, 0x60, 0xFE, 0xA0, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE2, 0x4, 0xA0, 0x3, 0xED, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x2, 0xD9, 0x0, 0x27, 0x1, 0xD4, 0x4, 0xCC, 0x1, 0x4F, 0x0, 0x27, 0x1, 0xD4, 0x6, 0x71, 0x2, 0xD9, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xCC, 0x4, 0x62, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE2, 0x4, 0x43, 0x3, 0xED, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x4, 0x62, 0x0, 0x27, 0x1, 0xD4, 0x6, 0x14, 0x1, 0x4F, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x1, 0x4F, 0x0, 0x27, 0x1, 0xD4, 0x6, 0x14, 0x4, 0x62, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x9E, 0x2, 0xD9, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE2, 0x1, 0x57, 0x5, 0x5C, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x1, 0x4F, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x28, 0x5, 0xD1, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE2, 0x4, 0x37, 0x5, 0x5C, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x3, 0x9A, 0x0, 0x27, 0x1, 0xD4, 0x6, 0x8, 0x3, 0x9A, 0x0, 0x27, 0x1, 0xD4, 0x4, 0x98, 0x1, 0x4F, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x98, 0x5, 0xD1, 0x0, 0x5, 0x0, 0x43, 0xFF, 0xD6, 0x4, 0x5B, 0x3, 0xFA, 0x0, 0xB, 0x0, 0x17, 0x0, 0x23, 0x0, 0x2F, 0x0, 0x39, 0x0, 0x0, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x3, 0x47, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0xFC, 0xFC, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0x3, 0xFA, 0xFE, 0x84, 0xEC, 0xFE, 0x82, 0x1, 0x7E, 0xEC, 0x1, 0x7C, 0xFC, 0x6, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0x3, 0x5, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x3, 0x70, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x34, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0xFE, 0x4C, 0xFE, 0x4E, 0x1, 0xB2, 0xDD, 0x1, 0x95, 0xFE, 0x6B, 0xFD, 0xF9, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x34, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE2, 0x1, 0x57, 0x5, 0x5C, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x5, 0xD1, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x3, 0x90, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x28, 0x1, 0x4F, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE2, 0x1, 0x57, 0x5, 0x5C, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x5, 0xD1, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x4, 0x4E, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x2, 0xCF, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x28, 0x1, 0x4F, 0xFF, 0xFF, 0x0, 0x4C, 0x2, 0x90, 0x2, 0xAA, 0x5, 0xBB, 0x0, 0x7, 0x7, 0x43, 0x0, 0x0, 0x2, 0x9B, 0x0, 0x2, 0x0, 0x79, 0x2, 0x30, 0x1, 0x5F, 0x6, 0x91, 0x0, 0xB, 0x0, 0xF, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x17, 0x11, 0x23, 0x11, 0x79, 0x3C, 0x36, 0x38, 0x3C, 0x3C, 0x38, 0x36, 0x3C, 0xD9, 0xC5, 0x6, 0x24, 0x2F, 0x3E, 0x3E, 0x2F, 0x2E, 0x3D, 0x3D, 0xA2, 0xFC, 0xDC, 0x3, 0x24, 0xFF, 0xFF, 0x0, 0x35, 0x2, 0x9B, 0x2, 0xBF, 0x5, 0xB0, 0x0, 0x7, 0x7, 0x9E, 0x0, 0x0, 0x2, 0x9B, 0xFF, 0xFF, 0x0, 0x4F, 0x2, 0x90, 0x2, 0xAE, 0x5, 0xB0, 0x0, 0x7, 0x7, 0x9F, 0x0, 0x0, 0x2, 0x9B, 0xFF, 0xFF, 0x0, 0x4E, 0x2, 0x90, 0x2, 0xB9, 0x5, 0xBD, 0x0, 0x7, 0x7, 0xA0, 0x0, 0x0, 0x2, 0x9B, 0xFF, 0xFF, 0x0, 0x37, 0x2, 0x9B, 0x2, 0xAE, 0x5, 0xB0, 0x0, 0x7, 0x7, 0xA1, 0x0, 0x0, 0x2, 0x9B, 0xFF, 0xFF, 0x0, 0x4C, 0x2, 0x90, 0x2, 0xAA, 0x5, 0xBB, 0x0, 0x7, 0x7, 0xA2, 0x0, 0x0, 0x2, 0x9B, 0xFF, 0xFF, 0x0, 0x47, 0x2, 0x92, 0x2, 0xA4, 0x5, 0xBB, 0x0, 0x7, 0x7, 0xA3, 0x0, 0x0, 0x2, 0x9B, 0x0, 0x1, 0x0, 0x50, 0x2, 0x8E, 0x2, 0xEC, 0x5, 0x53, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x2, 0xEC, 0xFD, 0xA1, 0xFE, 0xFE, 0xA1, 0xFD, 0x3, 0xA3, 0xFE, 0xEB, 0x1, 0x15, 0x9A, 0x1, 0x16, 0xFE, 0xEA, 0x0, 0x1, 0x0, 0x50, 0x3, 0xA3, 0x2, 0xA9, 0x4, 0x3D, 0x0, 0x3, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x2, 0xA9, 0xFD, 0xA7, 0x4, 0x3D, 0x9A, 0x9A, 0x0, 0x2, 0x0, 0x50, 0x3, 0x10, 0x2, 0xA9, 0x4, 0xD0, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x2, 0xA9, 0xFD, 0xA7, 0x2, 0x59, 0xFD, 0xA7, 0x4, 0xD0, 0x9A, 0x9A, 0xFE, 0xDA, 0x9A, 0x9A, 0x0, 0x1, 0x0, 0x50, 0x1, 0x87, 0x1, 0xB0, 0x6, 0x31, 0x0, 0xE, 0x0, 0x0, 0x13, 0x34, 0x12, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x7, 0x26, 0x2, 0x35, 0x50, 0xC5, 0x57, 0x44, 0x37, 0x65, 0x65, 0x37, 0x44, 0x57, 0xC5, 0x3, 0xE5, 0xF7, 0x1, 0x2A, 0x2B, 0x7F, 0x3A, 0xCF, 0xD6, 0xCC, 0xCA, 0x3A, 0x7C, 0x2C, 0x1, 0x2A, 0xF8, 0x0, 0x1, 0x0, 0x50, 0x1, 0x87, 0x1, 0xB0, 0x6, 0x31, 0x0, 0xE, 0x0, 0x0, 0x1, 0x14, 0x2, 0x7, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x12, 0x15, 0x1, 0xB0, 0xC4, 0x58, 0x44, 0x37, 0x65, 0x64, 0x38, 0x44, 0x58, 0xC4, 0x3, 0xD4, 0xF7, 0xFE, 0xD6, 0x2C, 0x7C, 0x3A, 0xC9, 0xE0, 0xC2, 0xD0, 0x3A, 0x7F, 0x2B, 0xFE, 0xD6, 0xF7, 0x0, 0x1, 0x0, 0x6A, 0x2, 0x8C, 0x3, 0x0, 0x5, 0xBA, 0x0, 0x10, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x26, 0x1, 0xB8, 0x61, 0x28, 0xC5, 0x98, 0x20, 0x4B, 0x8F, 0x79, 0x8B, 0xC5, 0x4, 0x5, 0x13, 0x58, 0xFD, 0xD1, 0x3, 0x21, 0x79, 0x86, 0x91, 0xA2, 0xFE, 0x5, 0x1, 0xD9, 0xAE, 0xFF, 0xFF, 0x0, 0x4C, 0xFE, 0x88, 0x2, 0xAA, 0x1, 0xB3, 0x0, 0x7, 0x7, 0x43, 0x0, 0x0, 0xFE, 0x93, 0xFF, 0xFF, 0x0, 0x81, 0xFE, 0x93, 0x2, 0x3, 0x1, 0xA7, 0x0, 0x7, 0x7, 0x42, 0x0, 0x0, 0xFE, 0x93, 0xFF, 0xFF, 0x0, 0x3C, 0xFE, 0x93, 0x2, 0xB2, 0x1, 0xB3, 0x0, 0x7, 0x7, 0x41, 0x0, 0x0, 0xFE, 0x93, 0xFF, 0xFF, 0x0, 0x37, 0xFE, 0x88, 0x2, 0xA9, 0x1, 0xB3, 0x0, 0x7, 0x7, 0x9D, 0x0, 0x0, 0xFE, 0x93, 0xFF, 0xFF, 0x0, 0x35, 0xFE, 0x93, 0x2, 0xBF, 0x1, 0xA8, 0x0, 0x7, 0x7, 0x9E, 0x0, 0x0, 0xFE, 0x93, 0xFF, 0xFF, 0x0, 0x4F, 0xFE, 0x88, 0x2, 0xAE, 0x1, 0xA8, 0x0, 0x7, 0x7, 0x9F, 0x0, 0x0, 0xFE, 0x93, 0xFF, 0xFF, 0x0, 0x4E, 0xFE, 0x88, 0x2, 0xB9, 0x1, 0xB5, 0x0, 0x7, 0x7, 0xA0, 0x0, 0x0, 0xFE, 0x93, 0xFF, 0xFF, 0x0, 0x37, 0xFE, 0x93, 0x2, 0xAE, 0x1, 0xA8, 0x0, 0x7, 0x7, 0xA1, 0x0, 0x0, 0xFE, 0x93, 0xFF, 0xFF, 0x0, 0x4C, 0xFE, 0x88, 0x2, 0xAA, 0x1, 0xB3, 0x0, 0x7, 0x7, 0xA2, 0x0, 0x0, 0xFE, 0x93, 0xFF, 0xFF, 0x0, 0x47, 0xFE, 0x8A, 0x2, 0xA4, 0x1, 0xB3, 0x0, 0x7, 0x7, 0xA3, 0x0, 0x0, 0xFE, 0x93, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0xA6, 0x2, 0xEC, 0x1, 0x6B, 0x0, 0x7, 0x4, 0xA3, 0x0, 0x0, 0xFC, 0x18, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xBB, 0x2, 0xA9, 0x0, 0x55, 0x0, 0x7, 0x4, 0xA4, 0x0, 0x0, 0xFC, 0x18, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0x28, 0x2, 0xA9, 0x0, 0xE8, 0x0, 0x7, 0x4, 0xA5, 0x0, 0x0, 0xFC, 0x18, 0x0, 0x1, 0x0, 0x50, 0xFD, 0xEB, 0x1, 0xB0, 0x2, 0x53, 0x0, 0xE, 0x0, 0x0, 0x37, 0x34, 0x12, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x7, 0x26, 0x2, 0x35, 0x50, 0xC5, 0x57, 0x44, 0x37, 0x65, 0x65, 0x37, 0x44, 0x57, 0xC5, 0x25, 0xEB, 0x1, 0x1B, 0x28, 0x7F, 0x35, 0xC2, 0xCA, 0xBD, 0xBB, 0x35, 0x7B, 0x28, 0x1, 0x18, 0xE9, 0x0, 0x1, 0x0, 0x50, 0xFD, 0xEB, 0x1, 0xB0, 0x2, 0x53, 0x0, 0xE, 0x0, 0x0, 0x25, 0x14, 0x2, 0x7, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x12, 0x15, 0x1, 0xB0, 0xC4, 0x58, 0x44, 0x37, 0x65, 0x64, 0x38, 0x44, 0x58, 0xC4, 0x1E, 0xED, 0xFE, 0xE3, 0x29, 0x7B, 0x37, 0xBD, 0xD6, 0xB2, 0xBE, 0x34, 0x7F, 0x28, 0xFE, 0xEA, 0xE6, 0xFF, 0xFF, 0x0, 0x3C, 0xFE, 0x50, 0x3, 0x0, 0x1, 0x8D, 0x0, 0x7, 0x3, 0x72, 0x0, 0x0, 0xFB, 0xD3, 0xFF, 0xFF, 0x0, 0x3C, 0xFE, 0x4B, 0x3, 0x16, 0x1, 0x89, 0x0, 0x7, 0x3, 0x78, 0x0, 0x0, 0xFB, 0xCD, 0xFF, 0xFF, 0x0, 0x3C, 0xFE, 0x4C, 0x3, 0x32, 0x1, 0x8A, 0x0, 0x7, 0x3, 0x81, 0x0, 0x0, 0xFB, 0xD0, 0xFF, 0xFF, 0x0, 0x28, 0xFE, 0x5F, 0x3, 0x12, 0x1, 0x80, 0x0, 0x7, 0x1, 0x94, 0xFF, 0xF9, 0xFB, 0xD3, 0xFF, 0xFF, 0x0, 0x3C, 0xFE, 0x4B, 0x3, 0x16, 0x1, 0x89, 0x0, 0xF, 0x3, 0x78, 0x3, 0x52, 0x4, 0x7, 0xC0, 0x0, 0xFF, 0xFF, 0x0, 0x64, 0xFE, 0x5F, 0x2, 0xFA, 0x3, 0x1, 0x0, 0x7, 0x1, 0x62, 0x0, 0x0, 0xFB, 0xD3, 0xFF, 0xFF, 0x0, 0x64, 0xFE, 0x5F, 0x3, 0x3E, 0x2, 0xE1, 0x0, 0x7, 0x3, 0x7E, 0x0, 0x0, 0xFB, 0xD3, 0xFF, 0xFF, 0x0, 0x78, 0xFE, 0x5F, 0x1, 0x3D, 0x3, 0x1, 0x0, 0x7, 0x1, 0x92, 0x0, 0x14, 0xFB, 0xD3, 0xFF, 0xFF, 0x0, 0x64, 0xFE, 0x5F, 0x4, 0xCC, 0x1, 0x8D, 0x0, 0x7, 0x3, 0x7F, 0x0, 0x0, 0xFB, 0xD3, 0x0, 0x1, 0x0, 0x64, 0xFE, 0x60, 0x2, 0xFA, 0x1, 0x8D, 0x0, 0x10, 0x0, 0x0, 0x25, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x26, 0x1, 0xB3, 0x62, 0x28, 0xC5, 0xA7, 0x14, 0x4C, 0x8C, 0x78, 0x8B, 0xC5, 0x4, 0xE7, 0x59, 0xFD, 0xD2, 0x3, 0x20, 0x74, 0x81, 0x91, 0xA2, 0xFE, 0x6, 0x1, 0xD8, 0xAF, 0x0, 0x2, 0x0, 0x64, 0xFD, 0xEE, 0x3, 0x3D, 0x1, 0x88, 0x0, 0x9, 0x0, 0x19, 0x0, 0x0, 0x5, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x15, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x1, 0xCD, 0x5D, 0x4E, 0xAA, 0x72, 0x34, 0x33, 0x9F, 0x84, 0x4E, 0xC4, 0xAC, 0xC, 0x50, 0x90, 0x98, 0xA9, 0xA8, 0xC8, 0x72, 0x6A, 0xCC, 0x57, 0xFE, 0xFF, 0x50, 0xA6, 0x52, 0xF6, 0x3, 0x8B, 0x55, 0x64, 0xCD, 0xA8, 0xF, 0xA9, 0xC9, 0xFF, 0xFF, 0x0, 0x3C, 0xFE, 0x4B, 0x2, 0xDF, 0x1, 0x89, 0x0, 0x7, 0x1, 0x93, 0x0, 0x0, 0xFB, 0xCF, 0xFF, 0xFF, 0x0, 0x28, 0xFE, 0x4B, 0x2, 0x2, 0x2, 0x3E, 0x0, 0x7, 0x3, 0x86, 0x0, 0x0, 0xFB, 0xCE, 0x0, 0x1, 0x0, 0x58, 0xFF, 0xFF, 0x5, 0x28, 0x6, 0x1, 0x0, 0x20, 0x0, 0x0, 0x5, 0x11, 0x22, 0x0, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x2, 0x22, 0xC6, 0xFE, 0xFC, 0x1, 0x3, 0xC7, 0xC4, 0xEA, 0xD, 0xE4, 0x1A, 0xBD, 0x68, 0x7E, 0x7F, 0x67, 0x3, 0x6, 0xFD, 0xDE, 0x1, 0xD2, 0xFE, 0x2E, 0x2, 0x22, 0x1, 0x1, 0xBE, 0x1, 0x3, 0xCF, 0xA0, 0xD0, 0x1, 0x2, 0xC2, 0xC2, 0xCE, 0xA1, 0x7A, 0xA1, 0x79, 0xA4, 0x1, 0x98, 0xB6, 0xE0, 0xB7, 0xFE, 0xF8, 0xB6, 0x0, 0x3, 0x0, 0x66, 0xFF, 0x83, 0x4, 0xEC, 0x6, 0x22, 0x0, 0x5, 0x0, 0xB, 0x0, 0x2C, 0x0, 0x0, 0x1, 0x14, 0x17, 0x13, 0x4, 0x11, 0x13, 0x1, 0x26, 0x27, 0x1, 0x16, 0x3, 0x37, 0x26, 0x27, 0x7, 0x23, 0x13, 0x26, 0x3, 0x35, 0x10, 0x0, 0x25, 0x37, 0x33, 0x7, 0x16, 0x17, 0x37, 0x33, 0x3, 0x16, 0x17, 0x23, 0x1, 0x36, 0x36, 0x37, 0x33, 0x6, 0x0, 0x21, 0x7, 0x1, 0x65, 0xD, 0xFA, 0xFE, 0xF9, 0xDB, 0x1, 0x48, 0x27, 0x37, 0xFE, 0xBA, 0x27, 0x36, 0x2A, 0x33, 0x2E, 0x37, 0xC0, 0x5F, 0x9E, 0x2, 0x1, 0x3D, 0x1, 0xE, 0x1F, 0xBF, 0x25, 0x34, 0x2F, 0x30, 0xBF, 0x55, 0x71, 0x14, 0xF1, 0xFF, 0x0, 0x79, 0x6B, 0x10, 0xFC, 0x13, 0xFE, 0xE6, 0xFE, 0xF9, 0x22, 0x2, 0x9D, 0x5E, 0x4D, 0x2, 0xFE, 0x3A, 0xFE, 0x55, 0xFD, 0xBF, 0x3, 0xF2, 0x20, 0xF, 0xFC, 0x17, 0x26, 0xFE, 0xA7, 0x82, 0xF, 0x18, 0xA9, 0x1, 0x23, 0xB9, 0x1, 0x36, 0x7E, 0x1, 0x37, 0x1, 0x76, 0x4, 0x5E, 0x72, 0xD, 0x16, 0x95, 0xFE, 0xF9, 0x80, 0xCC, 0xFC, 0xEE, 0x10, 0x93, 0x7A, 0xD4, 0xFE, 0xE6, 0x69, 0x0, 0x1, 0x0, 0x66, 0xFF, 0xEC, 0x4, 0xEC, 0x5, 0xC4, 0x0, 0x28, 0x0, 0x0, 0x1, 0x6, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x16, 0x17, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x36, 0x36, 0x37, 0x4, 0xEB, 0x13, 0xFE, 0xE5, 0xFE, 0xF4, 0xFE, 0xF3, 0xFE, 0xC2, 0x1, 0x44, 0x1, 0x13, 0x1, 0x5, 0x1, 0x14, 0x16, 0xFC, 0x10, 0x87, 0x9C, 0xAB, 0xAC, 0x1, 0x5F, 0x6A, 0xE2, 0xA, 0x5A, 0x9C, 0x35, 0x22, 0x2, 0x32, 0x31, 0xA7, 0x3A, 0x64, 0x5C, 0xE, 0x1, 0xDA, 0xD4, 0xFE, 0xE6, 0x1, 0x76, 0x1, 0x3B, 0x76, 0x1, 0x3A, 0x1, 0x77, 0xFE, 0xE5, 0xDA, 0x8C, 0x9D, 0xFA, 0xE4, 0x7D, 0xAC, 0xF2, 0x2E, 0x2, 0x9B, 0x78, 0x8C, 0xE, 0xE4, 0x8, 0x7F, 0xFE, 0xAD, 0x18, 0x8E, 0x70, 0x0, 0x1, 0x0, 0x60, 0x0, 0x0, 0x4, 0x7C, 0x5, 0xC4, 0x0, 0x28, 0x0, 0x0, 0x21, 0x21, 0x35, 0x33, 0x36, 0x36, 0x35, 0x27, 0x23, 0x35, 0x33, 0x27, 0x23, 0x35, 0x33, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x17, 0x21, 0x15, 0x21, 0x17, 0x21, 0x15, 0x21, 0x17, 0x14, 0x7, 0x21, 0x4, 0x7C, 0xFB, 0xE7, 0x51, 0x32, 0x21, 0x2, 0xA5, 0xA0, 0x4, 0x9C, 0x97, 0x5, 0xFF, 0xC6, 0xD0, 0xE3, 0xF5, 0x7A, 0x4E, 0x51, 0x6E, 0x6, 0x1, 0x3E, 0xFE, 0xC7, 0x5, 0x1, 0x34, 0xFE, 0xD1, 0x2, 0x41, 0x2, 0xB8, 0xCA, 0xD, 0x8A, 0x3D, 0x37, 0x90, 0x79, 0x90, 0xA1, 0xCF, 0xE6, 0xDE, 0xB5, 0x6E, 0x5A, 0x78, 0x72, 0xA1, 0x90, 0x79, 0x90, 0x2F, 0x88, 0x54, 0x0, 0x1, 0x0, 0x7D, 0xFF, 0x83, 0x6, 0x7A, 0x5, 0x1, 0x0, 0x25, 0x0, 0x0, 0x21, 0x35, 0x3, 0x23, 0x1, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x13, 0x33, 0x7, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x11, 0x3, 0x1, 0x80, 0xC0, 0x1, 0x40, 0x68, 0x5A, 0x93, 0x3D, 0xF2, 0xE4, 0x7, 0x73, 0xC6, 0x95, 0x56, 0x69, 0xBF, 0x58, 0x53, 0x67, 0xA6, 0xBD, 0x1, 0xF3, 0x69, 0x5A, 0x53, 0x69, 0x14, 0xC3, 0xFE, 0xC0, 0x3, 0x1E, 0x1B, 0x72, 0x5A, 0x78, 0xFC, 0xF0, 0x4, 0x3A, 0x71, 0x85, 0x52, 0x1, 0x5, 0xDB, 0x28, 0xB8, 0xD4, 0xFD, 0x3E, 0x2, 0xBE, 0x78, 0x52, 0x5A, 0x48, 0xFD, 0x1A, 0x0, 0x5, 0x0, 0x22, 0x0, 0x0, 0x6, 0x4F, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x6, 0x0, 0xA, 0x0, 0x26, 0x0, 0x29, 0x0, 0x0, 0x1, 0x15, 0x33, 0x13, 0x27, 0x23, 0x15, 0x21, 0x35, 0x23, 0x17, 0x13, 0x1, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x1, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x3, 0x35, 0x23, 0x1, 0xF1, 0x2B, 0xC2, 0x5E, 0x8F, 0x2, 0x8B, 0xF2, 0x5E, 0x92, 0xFE, 0xC9, 0xFE, 0xAE, 0xFD, 0xD2, 0xD2, 0xD2, 0xD2, 0xFD, 0x1, 0x35, 0x1, 0x56, 0xFB, 0xD8, 0xD8, 0xD8, 0xD8, 0xFB, 0x2F, 0x4, 0x9, 0x44, 0xFE, 0xCA, 0x96, 0x96, 0x96, 0x96, 0xFD, 0x71, 0x1, 0xEF, 0xFE, 0x11, 0x1, 0xEF, 0xA0, 0x96, 0xA0, 0x1, 0xEB, 0xFE, 0x15, 0x1, 0xEB, 0xFE, 0x15, 0xA0, 0x96, 0xA0, 0xFE, 0x11, 0x1, 0xA4, 0x4B, 0x0, 0x2, 0x0, 0x99, 0xFF, 0xEC, 0x6, 0x3A, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x28, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x6, 0x6, 0x23, 0x23, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x17, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x1, 0x93, 0x92, 0x95, 0x5F, 0x5F, 0x95, 0x4, 0x15, 0x43, 0x5D, 0x79, 0x9F, 0x77, 0x1A, 0xED, 0xDF, 0x92, 0xFA, 0x1, 0x8C, 0xE5, 0xEE, 0x16, 0x74, 0xF3, 0xBF, 0xBF, 0x3F, 0x31, 0x2A, 0x2B, 0x4, 0xE4, 0xFE, 0x4, 0x9F, 0x61, 0x60, 0x9C, 0xFB, 0x20, 0x18, 0x89, 0xA7, 0x2, 0x6B, 0xA1, 0xCA, 0xFD, 0xE4, 0x5, 0xB0, 0xD1, 0xA5, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0xFD, 0xA3, 0x49, 0x2B, 0xA, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x8, 0x3C, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x37, 0x0, 0x0, 0x0, 0x7, 0x0, 0x58, 0x4, 0x72, 0x0, 0x0, 0x0, 0x6, 0x0, 0x22, 0x0, 0x0, 0x6, 0x7, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x7, 0x0, 0xB, 0x0, 0xE, 0x0, 0x11, 0x0, 0x31, 0x0, 0x0, 0x1, 0x37, 0x23, 0x17, 0x21, 0x27, 0x23, 0x7, 0x21, 0x37, 0x23, 0x17, 0x1, 0x37, 0x23, 0x5, 0x37, 0x23, 0x1, 0x3, 0x23, 0x35, 0x33, 0x27, 0x23, 0x35, 0x33, 0x3, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x13, 0x33, 0x3, 0x33, 0x15, 0x23, 0x7, 0x33, 0x15, 0x23, 0x3, 0x23, 0x3, 0x23, 0x3, 0x2, 0x34, 0x1A, 0xA6, 0x1A, 0x1, 0x74, 0x1A, 0x12, 0x1B, 0x1, 0x75, 0x19, 0xA1, 0x19, 0xFE, 0x7, 0x1F, 0x3F, 0x2, 0x50, 0x1E, 0x3C, 0xFD, 0x6E, 0x77, 0xE3, 0xC3, 0x21, 0xA2, 0x81, 0x4F, 0xFB, 0x3F, 0xD9, 0x3D, 0xE1, 0x3D, 0xD5, 0x3D, 0xFB, 0x4F, 0x87, 0xA7, 0x21, 0xC8, 0xE8, 0x77, 0xFA, 0x5E, 0x7B, 0x60, 0x2, 0xE9, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xFE, 0x9B, 0xC5, 0xBE, 0xBE, 0xFD, 0xB7, 0x2, 0x49, 0xA0, 0xA2, 0xA0, 0x1, 0x85, 0xFE, 0x7B, 0x1, 0x85, 0xFE, 0x7B, 0x1, 0x85, 0xFE, 0x7B, 0xA0, 0xA2, 0xA0, 0xFD, 0xB7, 0x2, 0x49, 0xFD, 0xB7, 0x0, 0x2, 0x0, 0x7D, 0x0, 0x0, 0x6, 0x10, 0x4, 0x3A, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x21, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x21, 0x11, 0x33, 0x11, 0x21, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x4, 0x23, 0x7D, 0x2, 0x90, 0xB6, 0xB3, 0x1, 0xF3, 0x66, 0x5E, 0xFE, 0xAF, 0xF2, 0x1, 0x99, 0xF2, 0x1, 0x51, 0x5E, 0x66, 0xF3, 0xFE, 0xF2, 0xB7, 0x4, 0x3A, 0xBA, 0xD7, 0xFE, 0xBC, 0x1, 0x40, 0x7B, 0x56, 0xFC, 0x8A, 0x2, 0xD6, 0xFD, 0xEE, 0x56, 0x7B, 0x2, 0xA5, 0xFD, 0x5C, 0xD9, 0xBD, 0x0, 0x1, 0x0, 0x5E, 0xFF, 0xEC, 0x4, 0x31, 0x5, 0xC4, 0x0, 0x23, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x0, 0x3, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x12, 0x0, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x4, 0x31, 0x7A, 0x7F, 0xF0, 0xFE, 0xCA, 0x8, 0xAC, 0xAC, 0xAC, 0xAD, 0xE, 0x1, 0x38, 0xF0, 0x6B, 0x85, 0x1D, 0x63, 0x67, 0x8E, 0xA9, 0xB, 0x1, 0x63, 0xFE, 0x9C, 0x1, 0x64, 0xFE, 0x9C, 0x6, 0xAE, 0x8D, 0x6C, 0x60, 0xA, 0x1E, 0x1, 0x13, 0x1, 0x11, 0x8C, 0x81, 0x8C, 0x1, 0xC, 0x1, 0xF, 0x1F, 0xCD, 0x21, 0xA1, 0xAF, 0x8C, 0x81, 0x8C, 0xBA, 0xA0, 0x20, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x5, 0x90, 0x5, 0xB0, 0x0, 0x13, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x21, 0x15, 0x21, 0x1, 0x4, 0x60, 0xFE, 0x43, 0xAC, 0xFD, 0xD8, 0xD8, 0xFD, 0x8A, 0x1, 0xAD, 0x1, 0x36, 0xFE, 0x44, 0x1, 0xCB, 0xFE, 0x57, 0x1, 0xC6, 0x2, 0x70, 0xFD, 0x90, 0x2, 0x7A, 0xCA, 0x2, 0x6C, 0xFD, 0x9D, 0x2, 0x63, 0xFD, 0x94, 0xCA, 0xFD, 0x86, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x17, 0x0, 0x0, 0x1, 0x7, 0x11, 0x23, 0x11, 0x7, 0x35, 0x37, 0x35, 0x7, 0x35, 0x37, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x37, 0x15, 0x7, 0x15, 0x37, 0x3, 0xC5, 0xDA, 0xFC, 0xE3, 0xE3, 0xE3, 0xE3, 0xFE, 0x3E, 0x4, 0x83, 0xFE, 0x3B, 0xDA, 0xDA, 0xDA, 0x2, 0x39, 0x56, 0xFE, 0x1D, 0x1, 0x7F, 0x5A, 0xBE, 0x5A, 0x92, 0x5A, 0xBE, 0x5A, 0x1, 0x58, 0xCB, 0xCB, 0xF4, 0x57, 0xBE, 0x57, 0x92, 0x57, 0x0, 0x5, 0x0, 0x35, 0xFE, 0x60, 0xA, 0x26, 0x6, 0x7E, 0x0, 0xC, 0x0, 0x18, 0x0, 0x22, 0x0, 0x31, 0x0, 0x50, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x11, 0x16, 0x21, 0x32, 0x12, 0x35, 0x35, 0x34, 0x2, 0x23, 0x7, 0x11, 0x16, 0x16, 0x5, 0x32, 0x35, 0x35, 0x26, 0x7, 0x6, 0x15, 0x14, 0x16, 0x5, 0x22, 0x27, 0x11, 0x23, 0x11, 0x34, 0x0, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x21, 0x22, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x6, 0x7, 0x35, 0x36, 0x37, 0x35, 0x33, 0x15, 0x36, 0x33, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x8, 0x40, 0x83, 0x71, 0x6C, 0x83, 0x75, 0x68, 0x44, 0xFC, 0x42, 0xA7, 0x95, 0xD8, 0xED, 0x8D, 0x39, 0x82, 0xFD, 0xE6, 0x6C, 0x35, 0x32, 0x66, 0x38, 0x7, 0x35, 0xB2, 0x6B, 0xF2, 0x1, 0xA, 0xCC, 0xEC, 0xEE, 0xD6, 0xFA, 0x9E, 0x73, 0xA1, 0x3C, 0x57, 0xCB, 0x9A, 0xAD, 0xA9, 0x8A, 0x42, 0x3B, 0x83, 0x95, 0x93, 0x85, 0xF3, 0x4C, 0x4A, 0x1, 0x47, 0x1, 0x67, 0xFE, 0xD8, 0xAF, 0xC0, 0x8B, 0x15, 0x9B, 0xE1, 0xDC, 0x7C, 0xFE, 0xF1, 0x75, 0x1, 0x1E, 0xE6, 0x4C, 0xEF, 0x1, 0x13, 0x5, 0xFC, 0x3A, 0x36, 0x51, 0x15, 0x78, 0x18, 0x2D, 0x1, 0x2, 0x5B, 0x2B, 0x34, 0xAE, 0x78, 0xFD, 0xFC, 0x3, 0xE0, 0xF5, 0x1, 0x19, 0xFE, 0xBD, 0xFD, 0x14, 0xE7, 0xFE, 0xD9, 0x4B, 0x34, 0x7F, 0x98, 0x78, 0x80, 0x8E, 0x17, 0x2, 0xE9, 0x18, 0x2A, 0xC3, 0x29, 0x18, 0xE0, 0xC0, 0x6, 0xFE, 0x76, 0xFE, 0xC3, 0x4A, 0xFE, 0xB1, 0xFE, 0x88, 0x0, 0x2, 0x0, 0x22, 0xFE, 0x4B, 0x4, 0xC1, 0x6, 0x18, 0x0, 0xB, 0x0, 0x30, 0x0, 0x0, 0x1, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x7, 0x3, 0x3, 0x23, 0x1, 0x1, 0x37, 0x3, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x2, 0x3, 0x13, 0x16, 0x15, 0x14, 0x6, 0x3, 0x5A, 0x55, 0x3F, 0x47, 0x3D, 0x3F, 0x45, 0x1D, 0x3F, 0x6C, 0x6E, 0x5A, 0x62, 0x36, 0x32, 0x24, 0x45, 0x89, 0xFF, 0x99, 0xE0, 0x1, 0x58, 0x1, 0x4, 0x4F, 0x79, 0x29, 0x1F, 0xB2, 0xAA, 0xB3, 0xA6, 0x81, 0x8D, 0x8A, 0x39, 0xA5, 0x2, 0xFC, 0xAC, 0xBD, 0x51, 0x48, 0x57, 0x59, 0x49, 0x38, 0x7C, 0xFA, 0x4C, 0x2C, 0xC1, 0x2A, 0x39, 0x2B, 0x34, 0x7C, 0xC8, 0xFE, 0x1, 0x3B, 0xFE, 0xD9, 0x2, 0x93, 0xFE, 0xBB, 0x99, 0x1, 0x63, 0x8D, 0x72, 0x74, 0x95, 0xC6, 0xC9, 0x8E, 0x84, 0xFE, 0xC2, 0xFE, 0xF7, 0xFE, 0x69, 0xB3, 0x69, 0x71, 0x87, 0x0, 0x4, 0x0, 0x22, 0x0, 0x0, 0x5, 0xD5, 0x5, 0xB0, 0x0, 0x4, 0x0, 0x9, 0x0, 0xE, 0x0, 0x28, 0x0, 0x0, 0x1, 0x15, 0x21, 0x26, 0x23, 0x1, 0x27, 0x21, 0x15, 0x21, 0x7, 0x21, 0x15, 0x21, 0x32, 0x5, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x16, 0x17, 0x33, 0x15, 0x23, 0x17, 0x7, 0x33, 0x15, 0x23, 0x6, 0x5, 0x1, 0xD6, 0x1, 0xF2, 0x48, 0x79, 0x1, 0x14, 0x2, 0xFD, 0xBD, 0x2, 0x44, 0x4E, 0xFE, 0xA, 0x1, 0x31, 0x7F, 0xFE, 0x50, 0xFC, 0xB8, 0xB8, 0xB8, 0xB8, 0x2, 0x2D, 0xB9, 0xF9, 0x37, 0xE5, 0xBD, 0x1, 0x1, 0xBD, 0xE1, 0x6D, 0xFE, 0x94, 0x4, 0xE5, 0x3E, 0x3E, 0xFE, 0xFA, 0x28, 0x47, 0xA0, 0x38, 0xCB, 0xFD, 0xE3, 0x3, 0x20, 0xA0, 0x47, 0xA0, 0x1, 0x9, 0x90, 0x79, 0xA0, 0x26, 0x21, 0xA0, 0xFC, 0x7, 0x0, 0x3, 0x0, 0x6A, 0xFF, 0x83, 0x4, 0xF0, 0x6, 0x17, 0x0, 0x19, 0x0, 0x1F, 0x0, 0x25, 0x0, 0x0, 0x25, 0x6, 0x6, 0x7, 0x15, 0x23, 0x35, 0x26, 0x0, 0x3, 0x35, 0x10, 0x0, 0x37, 0x35, 0x33, 0x15, 0x16, 0x16, 0x17, 0x23, 0x26, 0x26, 0x27, 0x11, 0x21, 0x5, 0x10, 0x17, 0x11, 0x6, 0x11, 0x5, 0x23, 0x11, 0x36, 0x36, 0x37, 0x4, 0xF0, 0x2B, 0xDB, 0xD5, 0xC3, 0xDB, 0xFE, 0xF5, 0x2, 0x1, 0x1, 0xE7, 0xC3, 0xE0, 0xE3, 0x18, 0xF8, 0x10, 0x69, 0x6A, 0x1, 0xDB, 0xFC, 0x79, 0xE9, 0xE9, 0x2, 0x8B, 0xDF, 0x66, 0x62, 0x17, 0xBE, 0x3A, 0x8B, 0xB, 0x6B, 0x75, 0x2A, 0x1, 0x5F, 0x1, 0x1E, 0x68, 0x1, 0x2B, 0x1, 0x67, 0x23, 0x5B, 0x57, 0x15, 0xFD, 0xBB, 0x60, 0x8B, 0x14, 0xFD, 0xF9, 0x43, 0xFE, 0x88, 0x60, 0x4, 0x18, 0x4F, 0xFE, 0x6B, 0xD8, 0xFE, 0x8C, 0x7, 0x36, 0x19, 0x0, 0x3, 0x0, 0x22, 0x0, 0x0, 0x5, 0x64, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x6, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x27, 0x7, 0x1, 0x27, 0x21, 0x7, 0x1, 0x3, 0x21, 0x3, 0x21, 0x13, 0x23, 0x35, 0x33, 0x37, 0x21, 0x35, 0x21, 0x13, 0x33, 0x13, 0x21, 0x15, 0x21, 0x17, 0x33, 0x15, 0x23, 0x13, 0x3, 0x21, 0x55, 0x56, 0x1, 0x29, 0x3A, 0xFE, 0xCD, 0x3A, 0x2, 0x64, 0x77, 0xFD, 0xCD, 0x77, 0xFE, 0xF9, 0x83, 0x95, 0xDF, 0x3F, 0xFE, 0xE2, 0x1, 0x67, 0xD1, 0xE3, 0xD1, 0x1, 0x52, 0xFE, 0xF8, 0x3F, 0xC9, 0x80, 0x84, 0x3, 0x88, 0xF4, 0xF4, 0xFE, 0x97, 0xA6, 0xA6, 0xFD, 0xE1, 0x1, 0x54, 0xFE, 0xAC, 0x1, 0x5C, 0xC3, 0xA6, 0xC3, 0x2, 0x28, 0xFD, 0xD8, 0xC3, 0xA6, 0xC3, 0xFE, 0xA4, 0x0, 0x2, 0x0, 0x43, 0xFF, 0xEC, 0x4, 0x8C, 0x5, 0xC4, 0x0, 0x14, 0x0, 0x29, 0x0, 0x0, 0x1, 0x21, 0x35, 0x21, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x33, 0x3, 0x6, 0x4, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x23, 0x35, 0x21, 0x15, 0x21, 0x6, 0x15, 0x14, 0x33, 0x32, 0x36, 0x37, 0x4, 0x8C, 0xFB, 0xB7, 0x2, 0xB2, 0x37, 0xBD, 0x70, 0x5F, 0x2, 0xFD, 0x6, 0xD6, 0xF0, 0xD4, 0xE8, 0x38, 0x9B, 0x3E, 0x5, 0xFE, 0xF8, 0xD9, 0xE1, 0xF5, 0x40, 0x8F, 0x4, 0x49, 0xFD, 0x45, 0x43, 0xDA, 0x66, 0x80, 0x2, 0x3, 0x1E, 0xB2, 0x42, 0x58, 0x91, 0x5A, 0x50, 0x9F, 0xD4, 0xB0, 0xA2, 0x53, 0x4F, 0xFD, 0x97, 0xC5, 0xB6, 0xB4, 0xA4, 0x61, 0x4F, 0xB2, 0xB2, 0x43, 0x64, 0x99, 0x50, 0x63, 0x0, 0x2, 0x0, 0x66, 0xFF, 0x83, 0x4, 0xEC, 0x6, 0x17, 0x0, 0x1B, 0x0, 0x22, 0x0, 0x0, 0x1, 0x6, 0x2, 0x7, 0x15, 0x23, 0x35, 0x26, 0x0, 0x11, 0x35, 0x10, 0x0, 0x37, 0x35, 0x33, 0x15, 0x16, 0x12, 0x17, 0x23, 0x26, 0x26, 0x27, 0x11, 0x36, 0x36, 0x37, 0x25, 0x14, 0x16, 0x17, 0x11, 0x6, 0x11, 0x4, 0xEB, 0x11, 0xEA, 0xDB, 0xC3, 0xE4, 0xFE, 0xF8, 0x1, 0x8, 0xE4, 0xC3, 0xDA, 0xE9, 0x14, 0xFC, 0xE, 0x62, 0x6B, 0x6A, 0x61, 0xF, 0xFD, 0x76, 0x70, 0x7D, 0xED, 0x1, 0xDA, 0xBF, 0xFE, 0xF2, 0x1B, 0x6F, 0x70, 0x20, 0x1, 0x6C, 0x1, 0x1E, 0x76, 0x1, 0x1B, 0x1, 0x6A, 0x24, 0x5B, 0x58, 0x18, 0xFE, 0xEF, 0xC7, 0x76, 0x96, 0x15, 0xFB, 0xD1, 0x16, 0x8F, 0x74, 0xC3, 0xBA, 0xFC, 0x23, 0x4, 0x25, 0x4A, 0xFE, 0x6E, 0x0, 0x1, 0x0, 0x22, 0xFF, 0xEC, 0x4, 0x20, 0x6, 0x0, 0x0, 0x1D, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x4, 0x20, 0x43, 0x5D, 0x97, 0x81, 0xA5, 0xF3, 0xAE, 0xAE, 0xF3, 0xA5, 0xF3, 0xBF, 0xBF, 0x27, 0x49, 0x2A, 0x2B, 0x4, 0x18, 0xAA, 0x91, 0x2, 0x60, 0xFC, 0x79, 0x3, 0x87, 0xB3, 0x1, 0xC6, 0xFE, 0x3A, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0xFD, 0xB7, 0x43, 0x45, 0xA, 0x0, 0x3, 0x0, 0x35, 0xFF, 0x89, 0x4, 0xE2, 0x5, 0xC4, 0x0, 0x8, 0x0, 0xF, 0x0, 0x46, 0x0, 0x0, 0x25, 0x37, 0x35, 0x34, 0x23, 0x22, 0x7, 0x17, 0x16, 0x25, 0x22, 0x7, 0x16, 0x17, 0x34, 0x26, 0x13, 0x35, 0x26, 0x27, 0x15, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x15, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x24, 0x35, 0x34, 0x24, 0x33, 0x32, 0x0, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x15, 0x23, 0x35, 0x7, 0x22, 0x27, 0x15, 0x2, 0xC1, 0x38, 0x64, 0x47, 0x23, 0x2, 0x4A, 0xFE, 0xBC, 0x3A, 0x20, 0x46, 0x78, 0x35, 0x35, 0x7A, 0x52, 0x96, 0x74, 0x18, 0x3A, 0x6C, 0x8B, 0x29, 0x39, 0x75, 0xBF, 0x6, 0x57, 0x85, 0x9E, 0xE2, 0xFE, 0xEF, 0x1, 0x1B, 0xE6, 0xFC, 0x1, 0x14, 0xFC, 0x85, 0x91, 0x82, 0x80, 0xB1, 0x8B, 0xE8, 0xF2, 0xB3, 0xA1, 0x95, 0x38, 0x4C, 0x48, 0xB4, 0x2, 0x2F, 0x90, 0x3C, 0x7A, 0xB, 0xC1, 0x2B, 0x41, 0x28, 0x54, 0x40, 0xFE, 0x14, 0x8F, 0x27, 0x46, 0xFC, 0x2, 0x60, 0x5C, 0x66, 0x74, 0x74, 0xDB, 0x3B, 0x32, 0x68, 0x5F, 0x69, 0x30, 0x45, 0xCD, 0xB1, 0xB0, 0xE2, 0xFE, 0xF7, 0xB3, 0x68, 0x8B, 0x74, 0x54, 0x5C, 0x6A, 0x28, 0x43, 0xD6, 0xB3, 0x91, 0xC1, 0x25, 0x79, 0x64, 0x1, 0xA, 0x6D, 0x0, 0x2, 0x0, 0x2D, 0x0, 0x0, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xB, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x4, 0xB0, 0xFB, 0x7D, 0x4, 0x83, 0xFE, 0x3B, 0xFC, 0xFE, 0x3E, 0x4, 0x83, 0x5, 0xB0, 0xCB, 0xCB, 0xFD, 0xF6, 0xFC, 0x5A, 0x3, 0xA6, 0xCC, 0x0, 0x1, 0x0, 0x28, 0x0, 0x0, 0x4, 0xC, 0x5, 0xB0, 0x0, 0x1A, 0x0, 0x0, 0x25, 0x15, 0x21, 0x1, 0x27, 0x33, 0x32, 0x36, 0x37, 0x21, 0x37, 0x21, 0x26, 0x27, 0x21, 0x37, 0x21, 0x7, 0x23, 0x16, 0x17, 0x33, 0x7, 0x23, 0x6, 0x6, 0x7, 0x3, 0x59, 0xFE, 0xE2, 0xFE, 0x3, 0x1, 0xFC, 0x70, 0x84, 0x16, 0xFD, 0xE6, 0x32, 0x1, 0xE3, 0x2F, 0xC8, 0xFE, 0xE1, 0x37, 0x3, 0xAD, 0x33, 0xD9, 0x33, 0xF, 0xCA, 0x33, 0x95, 0x15, 0xCF, 0xD9, 0xD, 0xD, 0x2, 0x52, 0x99, 0x5E, 0x4B, 0xB6, 0x96, 0x5, 0xCB, 0xB6, 0x4A, 0x66, 0xB6, 0x98, 0xBC, 0x12, 0x0, 0x1, 0x0, 0x22, 0xFF, 0xEC, 0x4, 0x52, 0x5, 0xB0, 0x0, 0x1D, 0x0, 0x0, 0x5, 0x22, 0x27, 0x11, 0x7, 0x35, 0x37, 0x35, 0x7, 0x35, 0x37, 0x11, 0x33, 0x15, 0x37, 0x15, 0x7, 0x15, 0x37, 0x15, 0x7, 0x11, 0x36, 0x36, 0x37, 0x35, 0x33, 0x15, 0x2, 0x0, 0x1, 0xF4, 0x7A, 0x7C, 0xDC, 0xDC, 0xDC, 0xDC, 0xFB, 0xE2, 0xE2, 0xE2, 0xE2, 0xAC, 0xAE, 0x3, 0xFC, 0x4, 0xFE, 0xB3, 0x14, 0x14, 0x2, 0x5D, 0x57, 0xC8, 0x57, 0x89, 0x57, 0xC7, 0x57, 0x1, 0x3B, 0xD7, 0x5A, 0xC8, 0x59, 0x89, 0x5A, 0xC8, 0x5A, 0xFD, 0xFB, 0x2, 0xF4, 0xF0, 0x5E, 0x5C, 0xFE, 0xBB, 0xFE, 0x8D, 0x0, 0x3, 0x0, 0x28, 0x0, 0x0, 0x6, 0x62, 0x5, 0xA4, 0x0, 0x9, 0x0, 0x2D, 0x0, 0x39, 0x0, 0x0, 0x1, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x33, 0x1, 0x14, 0x6, 0x6, 0x23, 0x27, 0x7, 0x27, 0x7, 0x15, 0x14, 0x16, 0x33, 0x15, 0x20, 0x24, 0x27, 0x7, 0x27, 0x25, 0x11, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x21, 0x1E, 0x2, 0x25, 0x15, 0x37, 0x17, 0x37, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x1, 0xD8, 0x34, 0x38, 0x29, 0x38, 0x6B, 0x4, 0xEC, 0x91, 0xCD, 0x5A, 0x81, 0xB1, 0x81, 0x2C, 0x98, 0xD6, 0xFE, 0xC3, 0xFE, 0xF3, 0x13, 0xA2, 0x6A, 0x1, 0x8, 0x7D, 0x8A, 0xA9, 0xAD, 0x9A, 0xC6, 0x96, 0x1, 0x8E, 0xC9, 0xE4, 0x5C, 0xFC, 0x69, 0x5D, 0x77, 0xC6, 0x94, 0x4D, 0x30, 0x84, 0xA1, 0x4, 0x3A, 0x4C, 0x31, 0x3F, 0x33, 0x2C, 0x5D, 0xFE, 0x99, 0x86, 0xA6, 0x4D, 0x82, 0x7A, 0x92, 0x10, 0xA, 0x98, 0x8E, 0xB4, 0xC6, 0xC8, 0x3A, 0xD4, 0x56, 0x1, 0x7, 0x8F, 0x80, 0x78, 0x98, 0xD1, 0x87, 0x12, 0x1, 0x6E, 0xA6, 0x60, 0xB8, 0x1E, 0x85, 0x78, 0xAB, 0xE, 0x63, 0x30, 0x52, 0x5F, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x5, 0x10, 0x4, 0x3A, 0x0, 0x17, 0x0, 0x0, 0x21, 0x23, 0x35, 0x12, 0x0, 0x37, 0x35, 0x33, 0x15, 0x16, 0x0, 0x11, 0x15, 0x23, 0x35, 0x26, 0x26, 0x27, 0x11, 0x23, 0x11, 0x6, 0x6, 0x15, 0x1, 0x42, 0xF2, 0x2, 0x1, 0xD, 0xD7, 0xF2, 0xDD, 0x1, 0xB, 0xF3, 0x1, 0x81, 0x73, 0xF2, 0x71, 0x83, 0xB8, 0x1, 0x1F, 0x1, 0x6B, 0x29, 0xCF, 0xCF, 0x28, 0xFE, 0x91, 0xFE, 0xDB, 0xAF, 0xB8, 0xC4, 0xF3, 0x29, 0xFD, 0x68, 0x2, 0x97, 0x2A, 0xF5, 0xC7, 0x0, 0x2, 0x0, 0x29, 0x0, 0x0, 0x5, 0x34, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x13, 0x21, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x0, 0x15, 0x14, 0x4, 0x23, 0x21, 0x15, 0x21, 0x1, 0xF2, 0x1, 0x2D, 0x94, 0x83, 0x81, 0x92, 0x11, 0xFE, 0xBE, 0xFC, 0xCD, 0xCD, 0xCD, 0xCD, 0x2, 0x2C, 0xFD, 0x1, 0x15, 0xFE, 0xE9, 0xFB, 0xFE, 0xD0, 0x1, 0x42, 0x4, 0xE4, 0xFE, 0x4, 0x8A, 0x72, 0x62, 0x9E, 0xFC, 0x3, 0xE7, 0xE7, 0xCB, 0x6B, 0xCB, 0x2, 0xC8, 0xFE, 0xFE, 0xC8, 0xD8, 0xF1, 0x6B, 0x0, 0x1, 0x0, 0x66, 0x0, 0x0, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0x25, 0x0, 0x0, 0x21, 0x21, 0x35, 0x33, 0x26, 0x26, 0x35, 0x34, 0x12, 0x37, 0x35, 0x33, 0x15, 0x37, 0x17, 0x35, 0x33, 0x15, 0x16, 0x12, 0x15, 0x23, 0x10, 0x27, 0x11, 0x23, 0x11, 0x27, 0x7, 0x11, 0x23, 0x11, 0x6, 0x11, 0x14, 0x16, 0x33, 0x21, 0x5, 0x15, 0xFB, 0x53, 0xB4, 0x56, 0x60, 0xCC, 0xAC, 0xA8, 0x3C, 0x3D, 0xA8, 0xAE, 0xCA, 0xF0, 0x88, 0xA8, 0x3D, 0x3C, 0xA8, 0x88, 0xC5, 0xA9, 0x2, 0x51, 0xC3, 0x57, 0xF1, 0x94, 0xE9, 0x1, 0x3B, 0x3F, 0xC2, 0x9D, 0x2, 0x2, 0x9D, 0xC1, 0x40, 0xFE, 0xC1, 0xEC, 0x1, 0xF, 0x6E, 0xFE, 0x83, 0x1, 0xC1, 0x4, 0x4, 0xFE, 0x3F, 0x1, 0x7E, 0x6E, 0xFE, 0xF8, 0xE3, 0xFA, 0xFF, 0xFF, 0xFB, 0x5B, 0x5, 0x8, 0xFF, 0xF9, 0x6, 0x15, 0x0, 0x27, 0x0, 0x13, 0xFA, 0xD3, 0x5, 0x14, 0x0, 0x27, 0x0, 0x13, 0xFC, 0x9D, 0x5, 0x14, 0x0, 0x7, 0x0, 0x13, 0xFE, 0x56, 0x5, 0x14, 0xFF, 0xFF, 0xFA, 0x85, 0x5, 0x8, 0x0, 0xD5, 0x6, 0x15, 0x0, 0x27, 0x0, 0x13, 0xF9, 0xFD, 0x5, 0x14, 0x0, 0x27, 0x0, 0x13, 0xFB, 0xC7, 0x5, 0x14, 0x0, 0x27, 0x0, 0x13, 0xFD, 0x80, 0x5, 0x14, 0x0, 0x7, 0x0, 0x13, 0xFF, 0x32, 0x5, 0x14, 0xFF, 0xFF, 0xFB, 0x5B, 0xFE, 0x0, 0xFF, 0xF9, 0xFF, 0xD, 0x0, 0x27, 0x0, 0x13, 0xFA, 0xD3, 0xFE, 0xC, 0x0, 0x27, 0x0, 0x13, 0xFC, 0x9D, 0xFE, 0xC, 0x0, 0x7, 0x0, 0x13, 0xFE, 0x56, 0xFE, 0xC, 0x0, 0x1, 0xFC, 0x54, 0x4, 0xDF, 0xFF, 0x3F, 0x7, 0xD7, 0x0, 0x11, 0x0, 0x0, 0x1, 0x37, 0x7, 0x27, 0x37, 0x27, 0x37, 0x17, 0x27, 0x33, 0x7, 0x37, 0x17, 0x7, 0x17, 0x7, 0x27, 0x17, 0xFD, 0x73, 0x9, 0xD0, 0x57, 0xD9, 0xDA, 0x57, 0xD0, 0x9, 0xAF, 0xA, 0xD0, 0x58, 0xD9, 0xD9, 0x57, 0xD0, 0x9, 0x4, 0xDF, 0xF5, 0x83, 0x97, 0x72, 0x73, 0x97, 0x82, 0xF5, 0xF5, 0x83, 0x97, 0x72, 0x73, 0x98, 0x83, 0xF5, 0x0, 0x4, 0x0, 0x6A, 0xFF, 0xEC, 0x5, 0xB2, 0x5, 0xC0, 0x0, 0x3, 0x0, 0xB, 0x0, 0x27, 0x0, 0x42, 0x0, 0x0, 0x1, 0x1, 0x27, 0x1, 0x1, 0x32, 0x37, 0x35, 0x23, 0x6, 0x15, 0x14, 0x17, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x34, 0x23, 0x22, 0x7, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x17, 0x15, 0x1, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x14, 0x6, 0x4, 0xCB, 0xFD, 0x39, 0x7D, 0x2, 0xC7, 0xFD, 0x20, 0x56, 0x2E, 0x4E, 0x95, 0xF9, 0xA, 0x6, 0x47, 0x6B, 0x63, 0x79, 0x9E, 0x8E, 0x5C, 0x6C, 0x61, 0xB, 0x9D, 0x97, 0x7B, 0x6E, 0x9A, 0x19, 0x1, 0xE4, 0x8B, 0x97, 0x97, 0x89, 0x8A, 0x96, 0xA9, 0x3A, 0x7A, 0x3A, 0x3C, 0x3D, 0x3C, 0x39, 0xA9, 0x94, 0x4, 0xDF, 0xFB, 0x8E, 0x49, 0x4, 0x72, 0xFE, 0x77, 0x3A, 0x78, 0x2, 0x61, 0x4F, 0x77, 0x14, 0x25, 0x45, 0x69, 0x58, 0x6B, 0x73, 0x14, 0x6D, 0x4B, 0x4D, 0x82, 0x72, 0x78, 0xFE, 0xE9, 0x5A, 0x33, 0xA, 0xFC, 0xC4, 0xB1, 0x7A, 0x4D, 0x7C, 0xB1, 0x9C, 0x6B, 0x2D, 0x48, 0x5E, 0x3D, 0x4D, 0x3B, 0x5E, 0x4B, 0x29, 0x6A, 0x9C, 0x0, 0x4, 0x0, 0x6A, 0xFF, 0xEC, 0x5, 0xA6, 0x5, 0xC0, 0x0, 0x3, 0x0, 0xB, 0x0, 0x27, 0x0, 0x46, 0x0, 0x0, 0x1, 0x1, 0x27, 0x1, 0x1, 0x32, 0x37, 0x35, 0x23, 0x6, 0x15, 0x14, 0x17, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x34, 0x23, 0x22, 0x7, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x17, 0x15, 0x1, 0x22, 0x26, 0x35, 0x33, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x16, 0x15, 0x14, 0x6, 0x4, 0xCC, 0xFD, 0x39, 0x7E, 0x2, 0xC7, 0xFD, 0x20, 0x56, 0x2E, 0x4E, 0x95, 0xF9, 0xA, 0x6, 0x47, 0x6B, 0x63, 0x79, 0x9E, 0x8E, 0x5C, 0x6C, 0x61, 0xB, 0x9D, 0x97, 0x7B, 0x6E, 0x9A, 0x19, 0x1, 0xEF, 0x90, 0x8F, 0x9E, 0xC, 0x7A, 0x5F, 0x8B, 0x67, 0x78, 0x8D, 0x6E, 0x80, 0x92, 0xA3, 0x2, 0x66, 0x60, 0xF7, 0x74, 0x8B, 0x4, 0xDF, 0xFB, 0x8E, 0x49, 0x4, 0x72, 0xFE, 0x77, 0x3A, 0x78, 0x2, 0x61, 0x4F, 0x77, 0x14, 0x25, 0x45, 0x69, 0x58, 0x6B, 0x73, 0x14, 0x6D, 0x4B, 0x4D, 0x82, 0x72, 0x78, 0xFE, 0xE9, 0x5A, 0x33, 0xA, 0xFC, 0xC4, 0x8A, 0x50, 0x5A, 0x3D, 0x3A, 0x1F, 0x17, 0x5F, 0x55, 0x57, 0x6C, 0x77, 0x58, 0x4F, 0x3F, 0x34, 0x37, 0x5C, 0x58, 0x5E, 0x68, 0x0, 0x3, 0x0, 0x28, 0xFF, 0xEC, 0x6, 0xD3, 0x5, 0xC5, 0x0, 0x9, 0x0, 0x15, 0x0, 0x31, 0x0, 0x0, 0x12, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x1, 0x33, 0x6, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x28, 0x9C, 0x6C, 0x6B, 0x99, 0x99, 0x6B, 0x6C, 0x9C, 0x8B, 0x4A, 0x33, 0x34, 0x46, 0x46, 0x34, 0x33, 0x4A, 0x5, 0x23, 0xFC, 0x13, 0xFE, 0xE5, 0xFE, 0xF4, 0xFE, 0xF3, 0xFE, 0xC2, 0x1, 0x44, 0x1, 0x12, 0x1, 0x6, 0x1, 0x14, 0x16, 0xFC, 0x10, 0x87, 0x9D, 0xAB, 0xAC, 0x1, 0x9C, 0xB1, 0xA3, 0x89, 0x5, 0x26, 0x9F, 0x9F, 0xDC, 0x9B, 0x9B, 0x6E, 0x35, 0x47, 0x47, 0x35, 0x37, 0x49, 0x49, 0xFC, 0xEB, 0xD4, 0xFE, 0xE6, 0x1, 0x76, 0x1, 0x3B, 0x76, 0x1, 0x3A, 0x1, 0x77, 0xFE, 0xE5, 0xDA, 0x8C, 0x9D, 0xFA, 0xE4, 0x7D, 0xDA, 0xFE, 0xF5, 0x97, 0x0, 0x4, 0x0, 0x71, 0xFF, 0xEB, 0x5, 0x89, 0x5, 0xC5, 0x0, 0x1A, 0x0, 0x1E, 0x0, 0x2B, 0x0, 0x38, 0x0, 0x0, 0x1, 0x33, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x25, 0x1, 0x27, 0x1, 0x3, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x2, 0x8, 0xA9, 0x94, 0x8A, 0x8B, 0x97, 0x97, 0x89, 0x8B, 0x95, 0xA9, 0x3A, 0x7A, 0x3A, 0x3C, 0x3D, 0x3C, 0x39, 0x2, 0x83, 0xFD, 0x39, 0x7D, 0x2, 0xC7, 0xEE, 0xA2, 0x92, 0x95, 0xA0, 0x9F, 0xFE, 0xD8, 0xA2, 0xA9, 0x49, 0x44, 0x8A, 0x45, 0x47, 0x46, 0x45, 0x4, 0x26, 0x6A, 0x9C, 0xB1, 0x7A, 0x4D, 0x7C, 0xB1, 0x9C, 0x6B, 0x2D, 0x48, 0x5E, 0x3D, 0x4D, 0x3B, 0x5E, 0x4B, 0xE2, 0xFB, 0x8E, 0x49, 0x4, 0x72, 0xFC, 0x3D, 0x7B, 0xB1, 0xB1, 0x7B, 0x4E, 0x7B, 0xB1, 0xB1, 0x7B, 0x3C, 0x5E, 0xA9, 0x3F, 0x3C, 0x5E, 0x5E, 0x3C, 0x0, 0x3, 0x0, 0x6A, 0xFF, 0xF4, 0x5, 0x9F, 0x5, 0xC5, 0x0, 0x1A, 0x0, 0x1E, 0x0, 0x2F, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x14, 0x6, 0x1, 0x1, 0x27, 0x1, 0x1, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x1, 0x8C, 0x8B, 0x97, 0x97, 0x89, 0x8B, 0x95, 0xA9, 0x3A, 0x7A, 0x3A, 0x3C, 0x3D, 0x3C, 0x39, 0xA9, 0x94, 0x2, 0x68, 0xFD, 0x39, 0x7D, 0x2, 0xC7, 0x1, 0x10, 0xD, 0x40, 0x70, 0x60, 0x73, 0xA4, 0x65, 0x50, 0x20, 0xA5, 0x3, 0x20, 0xB1, 0x7A, 0x4D, 0x7C, 0xB1, 0x9C, 0x6B, 0x2D, 0x48, 0x5E, 0x3D, 0x4D, 0x3B, 0x5E, 0x4B, 0x29, 0x6A, 0x9C, 0x1, 0xBF, 0xFB, 0x8E, 0x49, 0x4, 0x72, 0xFA, 0xD8, 0x54, 0x60, 0x78, 0x88, 0x1, 0x98, 0xFE, 0x7A, 0x8B, 0x47, 0x1, 0xCA, 0xFD, 0x74, 0x0, 0x3, 0x0, 0x28, 0x0, 0x0, 0x6, 0x43, 0x5, 0xC5, 0x0, 0x9, 0x0, 0x15, 0x0, 0x1F, 0x0, 0x0, 0x12, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x28, 0x9C, 0x6C, 0x6B, 0x99, 0x99, 0x6B, 0x6C, 0x9C, 0x8B, 0x4A, 0x33, 0x34, 0x46, 0x46, 0x34, 0x33, 0x4A, 0x5, 0x3A, 0xFD, 0xB7, 0xFD, 0x3, 0x9C, 0xFD, 0x61, 0x2, 0x49, 0x5, 0x26, 0x9F, 0x9F, 0xDC, 0x9B, 0x9B, 0x6E, 0x35, 0x47, 0x47, 0x35, 0x37, 0x49, 0x49, 0xFD, 0x7A, 0xFD, 0x97, 0x5, 0xB0, 0xCB, 0xFE, 0x4E, 0x0, 0x2, 0x0, 0x4C, 0xFF, 0xEB, 0x3, 0x91, 0x5, 0xF9, 0x0, 0x18, 0x0, 0x20, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x35, 0x6, 0x23, 0x35, 0x32, 0x37, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x2, 0x7, 0x15, 0x14, 0x16, 0x33, 0x3, 0x36, 0x35, 0x35, 0x34, 0x23, 0x22, 0x7, 0x2, 0xDB, 0xEB, 0xE3, 0x5D, 0x64, 0x67, 0x5A, 0xB5, 0x9B, 0x86, 0xAE, 0xCB, 0xBF, 0x5B, 0x79, 0xD4, 0xA5, 0x4C, 0x56, 0x3, 0x15, 0xF7, 0xCD, 0xD, 0x13, 0xBB, 0x18, 0x1, 0xDE, 0xC3, 0xDC, 0xB1, 0x9A, 0x2A, 0x9E, 0xFE, 0xA2, 0x6D, 0x4F, 0x7D, 0x8A, 0x2, 0x43, 0xA1, 0xEE, 0x17, 0x80, 0xB2, 0x0, 0x4, 0x0, 0x90, 0x0, 0x0, 0x7, 0xC3, 0x5, 0xC0, 0x0, 0xC, 0x0, 0x1A, 0x0, 0x24, 0x0, 0x28, 0x0, 0x0, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x11, 0x21, 0x1, 0x11, 0x23, 0x11, 0x21, 0x1, 0x11, 0x1, 0x15, 0x21, 0x35, 0x5, 0xE, 0xBB, 0x9F, 0xA1, 0xBA, 0xB9, 0xFE, 0xC0, 0xBC, 0xAF, 0x55, 0x58, 0x56, 0x54, 0x55, 0x57, 0x56, 0x55, 0xFE, 0xC6, 0xFE, 0xF5, 0xFE, 0xC, 0xF4, 0x1, 0xC, 0x1, 0xF5, 0x4, 0x6, 0xFD, 0x9F, 0x4, 0x60, 0x9B, 0xC5, 0xC5, 0x9B, 0x53, 0x9B, 0xC4, 0xC4, 0x9B, 0x59, 0x74, 0x74, 0x59, 0x53, 0x58, 0x74, 0x74, 0x58, 0x1, 0x50, 0xFA, 0x50, 0x4, 0xB, 0xFB, 0xF5, 0x5, 0xB0, 0xFB, 0xF3, 0x4, 0xD, 0xFC, 0x82, 0x95, 0x95, 0x0, 0x4, 0x0, 0x57, 0xFF, 0xEB, 0x5, 0xE2, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x24, 0x0, 0x2E, 0x0, 0x0, 0x4, 0x24, 0x2, 0x35, 0x34, 0x12, 0x24, 0x20, 0x4, 0x12, 0x15, 0x14, 0x2, 0x4, 0x26, 0x24, 0x12, 0x35, 0x34, 0x2, 0x24, 0x20, 0x4, 0x2, 0x15, 0x14, 0x12, 0x4, 0x13, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x14, 0x6, 0x23, 0x2, 0x59, 0xFE, 0xBE, 0xC0, 0xC0, 0x1, 0x42, 0x1, 0x88, 0x1, 0x41, 0xC0, 0xC0, 0xFE, 0xBF, 0x22, 0x1, 0xB, 0x9E, 0x9E, 0xFE, 0xF5, 0xFE, 0xBC, 0xFE, 0xF5, 0x9F, 0x9F, 0x1, 0xB, 0x2B, 0xB7, 0x53, 0x4C, 0x4C, 0x53, 0xB7, 0x97, 0x1, 0x4E, 0x91, 0xA2, 0xA3, 0x90, 0x15, 0xC7, 0x1, 0x54, 0xD3, 0xD4, 0x1, 0x52, 0xC5, 0xC5, 0xFE, 0xAE, 0xD4, 0xD3, 0xFE, 0xAC, 0xC7, 0x7D, 0xA5, 0x1, 0x1C, 0xB0, 0xB1, 0x1, 0x19, 0xA4, 0xA4, 0xFE, 0xE7, 0xB1, 0xB0, 0xFE, 0xE4, 0xA5, 0x3, 0x8E, 0xFE, 0xF3, 0x4A, 0x38, 0x39, 0x52, 0xFE, 0x6C, 0xFE, 0xC7, 0x3, 0x52, 0x97, 0xF0, 0x92, 0x0, 0x2, 0x0, 0x95, 0x0, 0x0, 0x5, 0x4B, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x20, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x3, 0x13, 0x27, 0x21, 0x11, 0x23, 0x11, 0x21, 0x32, 0x4, 0x15, 0x14, 0x6, 0x7, 0x17, 0x37, 0x5, 0x3, 0x13, 0x15, 0x21, 0x27, 0x7, 0x21, 0x1, 0x91, 0x1, 0x4, 0x88, 0x89, 0x80, 0x8D, 0x15, 0xDE, 0xA3, 0xFE, 0xD2, 0xFC, 0x2, 0x0, 0xFB, 0x1, 0x12, 0x8E, 0x7D, 0x4F, 0x64, 0x1, 0x1, 0xE1, 0xDE, 0xFE, 0xFA, 0x5C, 0x5D, 0xFE, 0xFB, 0x4, 0xE5, 0xFE, 0x17, 0x89, 0x68, 0x70, 0x87, 0x1, 0xFB, 0x28, 0x1, 0x38, 0xEC, 0xFD, 0xCF, 0x5, 0xB0, 0xE0, 0xD7, 0x92, 0xC6, 0x34, 0x6E, 0x8D, 0x1, 0xFE, 0xBA, 0xFE, 0xC8, 0xD, 0x86, 0x86, 0x0, 0x4, 0x0, 0x95, 0xFE, 0x98, 0x4, 0xDE, 0x6, 0xF4, 0x0, 0x5, 0x0, 0xB, 0x0, 0xE, 0x0, 0x24, 0x0, 0x0, 0x1, 0x11, 0x33, 0x13, 0x26, 0x23, 0x5, 0x34, 0x27, 0x3, 0x36, 0x36, 0x1, 0x13, 0x23, 0x9, 0x2, 0x23, 0x13, 0x23, 0x11, 0x21, 0x32, 0x17, 0x37, 0x27, 0x37, 0x5, 0x7, 0x16, 0x11, 0x14, 0x6, 0x7, 0x1, 0x15, 0x1, 0x91, 0xC1, 0xA2, 0x2B, 0x34, 0x1, 0x11, 0x21, 0x7D, 0x4F, 0x4F, 0xFD, 0xEB, 0x7D, 0x7D, 0x2, 0x3F, 0xFE, 0xE6, 0xFE, 0xCB, 0xAA, 0x79, 0xBB, 0x2, 0x0, 0x58, 0x4A, 0x1E, 0xC4, 0x4A, 0x1, 0x4F, 0x52, 0xCA, 0x8E, 0x7D, 0x1, 0x47, 0x4, 0xE5, 0xFE, 0x17, 0x1, 0xDF, 0xA, 0xF8, 0x53, 0x38, 0xFE, 0x95, 0x1A, 0x77, 0xFD, 0x21, 0x1, 0x72, 0xFD, 0xCF, 0x2, 0x1E, 0xFC, 0x7A, 0x1, 0x68, 0x5, 0xB0, 0xE, 0x59, 0x51, 0xA8, 0x9A, 0xEF, 0x6D, 0xFE, 0xFB, 0x92, 0xC6, 0x34, 0xFD, 0xA0, 0xD, 0x0, 0x2, 0x0, 0x65, 0x3, 0x8B, 0x4, 0xB3, 0x5, 0xB9, 0x0, 0xC, 0x0, 0x2B, 0x0, 0x0, 0x1, 0x3, 0x11, 0x23, 0x11, 0x33, 0x13, 0x13, 0x33, 0x11, 0x23, 0x11, 0x3, 0x25, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x15, 0x23, 0x34, 0x22, 0x15, 0x14, 0x1E, 0x2, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x16, 0x33, 0x32, 0x3, 0x80, 0x8C, 0x6E, 0x88, 0x91, 0x91, 0x83, 0x6F, 0x87, 0xFD, 0xF7, 0x2E, 0x44, 0x61, 0x68, 0x6F, 0x62, 0xD1, 0x6E, 0xC6, 0x24, 0xB5, 0x62, 0x77, 0x65, 0x5F, 0x82, 0x6E, 0x2, 0x71, 0x6E, 0x3, 0x95, 0x1, 0x5A, 0xFE, 0xA6, 0x2, 0x1B, 0xFE, 0x83, 0x1, 0x7D, 0xFD, 0xE5, 0x1, 0x4B, 0xFE, 0xB5, 0x91, 0x1B, 0x24, 0xF, 0x16, 0x49, 0x4C, 0x44, 0x56, 0xAA, 0x4E, 0x3E, 0x19, 0x20, 0x2C, 0x4C, 0x47, 0x48, 0x54, 0x54, 0x58, 0x4F, 0x0, 0x3, 0x0, 0x65, 0x3, 0x96, 0x5, 0x4B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0xD, 0x0, 0x19, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0x1, 0x11, 0x33, 0x11, 0x33, 0x15, 0x21, 0x11, 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x1, 0xEB, 0x89, 0x76, 0x87, 0x1, 0x86, 0x2, 0x17, 0x76, 0xD3, 0xFC, 0xF6, 0x1, 0x48, 0xD3, 0xB1, 0xB1, 0xD3, 0x5, 0x51, 0xFE, 0x45, 0x1, 0xBB, 0x5F, 0xFD, 0xE6, 0x2, 0x1A, 0xFE, 0x45, 0x5F, 0x2, 0x1A, 0x5F, 0x78, 0x5F, 0x85, 0x5F, 0x0, 0x2, 0x0, 0x6E, 0x3, 0x95, 0x4, 0x57, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x14, 0x0, 0x0, 0x1, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x1, 0x11, 0x3, 0x23, 0x3, 0x11, 0x23, 0x11, 0x33, 0x13, 0x13, 0x33, 0x11, 0x1, 0xF9, 0x89, 0x76, 0x8C, 0x3, 0x7B, 0x7D, 0x3D, 0x7D, 0x6E, 0x88, 0x81, 0x85, 0x85, 0x5, 0xB0, 0x5F, 0xFE, 0x45, 0x1, 0xBB, 0x5F, 0xFD, 0xE5, 0x1, 0x74, 0xFE, 0x8C, 0x1, 0x74, 0xFE, 0x8C, 0x2, 0x1B, 0xFE, 0x83, 0x1, 0x7D, 0xFD, 0xE5, 0x0, 0x1, 0x0, 0x12, 0xFE, 0x98, 0x5, 0x1D, 0x6, 0xF4, 0x0, 0x10, 0x0, 0x0, 0x21, 0x27, 0x3, 0x23, 0x1, 0x1, 0x21, 0x13, 0x13, 0x27, 0x37, 0x5, 0x1, 0x17, 0x1, 0x21, 0x1, 0x2, 0x1C, 0x3D, 0xB7, 0xAA, 0x1, 0x8, 0xFE, 0x8C, 0x1, 0x15, 0xDA, 0xFE, 0xC3, 0x49, 0x1, 0x4F, 0xFE, 0x82, 0x40, 0x1, 0x71, 0x1, 0x16, 0xFD, 0xF4, 0xAB, 0xFD, 0xED, 0x3, 0xB, 0x4, 0xD, 0xFD, 0x5D, 0x2, 0xEE, 0x51, 0xA8, 0x9A, 0xFB, 0xAB, 0xC7, 0x4, 0x72, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x51, 0xFE, 0x75, 0x4, 0x42, 0x5, 0xB0, 0x0, 0x22, 0x0, 0x0, 0x1, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x35, 0x33, 0x1, 0x21, 0x35, 0x21, 0x17, 0x1, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x3D, 0x77, 0xE3, 0x92, 0xFC, 0x82, 0x6E, 0x80, 0x88, 0x95, 0x93, 0x8E, 0x1, 0x30, 0xFE, 0xCF, 0x1, 0x1, 0x2D, 0xFD, 0xBE, 0x3, 0x99, 0x1, 0xFE, 0xAA, 0x1, 0x55, 0x1, 0xFE, 0xA3, 0xBB, 0xD0, 0xFE, 0xDA, 0xFE, 0x75, 0x58, 0xBB, 0x95, 0x58, 0x87, 0x81, 0x69, 0x92, 0x79, 0xAE, 0x1, 0x1D, 0xCA, 0x1, 0x1E, 0xCA, 0x9B, 0xFE, 0xB3, 0x9D, 0xFE, 0xAE, 0x1D, 0xDE, 0xBD, 0xCC, 0xE0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x30, 0x0, 0x0, 0x0, 0x3, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x6, 0xEF, 0x0, 0xB, 0x0, 0xE, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x14, 0x16, 0x17, 0x33, 0x36, 0x36, 0x35, 0x34, 0x26, 0x22, 0x6, 0x1, 0x3, 0x3, 0x1, 0x3, 0x21, 0x3, 0x21, 0x1, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x7, 0x1, 0x2, 0x39, 0x35, 0x2C, 0x1F, 0x2B, 0x35, 0x3E, 0x64, 0x3E, 0x1, 0x45, 0xD4, 0xD3, 0x2, 0x64, 0x77, 0xFD, 0xCC, 0x76, 0xFE, 0xF8, 0x2, 0x11, 0x57, 0x7E, 0xBE, 0x7E, 0x57, 0x2, 0x14, 0x6, 0x1F, 0x28, 0x41, 0x6, 0x6, 0x40, 0x29, 0x2D, 0x44, 0x44, 0xFB, 0xD3, 0x2, 0x5E, 0xFD, 0xA2, 0xFD, 0xE1, 0x1, 0x54, 0xFE, 0xAC, 0x5, 0x79, 0x3C, 0x6A, 0x56, 0x7A, 0x7A, 0x56, 0x69, 0x3C, 0xFA, 0x86, 0x0, 0x2, 0x0, 0x97, 0xFF, 0xEC, 0x4, 0x92, 0x4, 0x4E, 0x0, 0x13, 0x0, 0x1A, 0x0, 0x0, 0x25, 0x17, 0x6, 0x23, 0x22, 0x26, 0x26, 0x10, 0x36, 0x36, 0x33, 0x32, 0x0, 0x17, 0x15, 0x21, 0x11, 0x16, 0x33, 0x32, 0x3, 0x22, 0x7, 0x11, 0x21, 0x11, 0x26, 0x4, 0x13, 0x2, 0xB8, 0xBA, 0x91, 0xEE, 0x8D, 0x99, 0xF0, 0x83, 0xCC, 0x1, 0x1D, 0x6, 0xFD, 0x0, 0x76, 0x9B, 0xC6, 0xC6, 0x95, 0x7C, 0x2, 0x1C, 0x73, 0xC6, 0x68, 0x72, 0x98, 0xFF, 0x1, 0x34, 0xFF, 0x98, 0xFE, 0xD4, 0xDF, 0x41, 0xFE, 0xB8, 0x6E, 0x3, 0xA4, 0x7A, 0xFE, 0xEB, 0x1, 0x1E, 0x71, 0x0, 0x1, 0x0, 0x35, 0x0, 0x0, 0x3, 0xD1, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x33, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x35, 0x2, 0xA0, 0xFD, 0xB6, 0x2, 0x4A, 0xFC, 0xCB, 0x1, 0xB2, 0xCA, 0x2, 0x69, 0xFA, 0x50, 0x0, 0x4, 0x0, 0x65, 0x3, 0x96, 0x5, 0xE4, 0x5, 0xB0, 0x0, 0x2, 0x0, 0xC, 0x0, 0x18, 0x0, 0x20, 0x0, 0x0, 0x1, 0x27, 0x7, 0x27, 0x23, 0x15, 0x23, 0x11, 0x21, 0x15, 0x23, 0x15, 0x33, 0x25, 0x17, 0x37, 0x33, 0x3, 0x13, 0x23, 0x27, 0x7, 0x23, 0x13, 0x3, 0x3, 0x27, 0x23, 0x7, 0x23, 0x13, 0x33, 0x13, 0x2, 0xFF, 0x50, 0x50, 0xD4, 0xB1, 0x75, 0x1, 0x48, 0xD3, 0xB1, 0x2, 0xF5, 0x6E, 0x6F, 0x83, 0xAD, 0xB1, 0x82, 0x73, 0x72, 0x82, 0xB0, 0xAC, 0xB6, 0x28, 0xE4, 0x28, 0x74, 0xD5, 0x72, 0xD4, 0x4, 0x5C, 0xD7, 0xD7, 0x11, 0xD7, 0x2, 0x1A, 0x5F, 0x85, 0xE3, 0xBA, 0xBA, 0xFE, 0xF6, 0xFE, 0xF1, 0xBF, 0xBF, 0x1, 0xF, 0x1, 0xA, 0xFD, 0xE7, 0x6B, 0x6B, 0x2, 0x19, 0xFD, 0xE7, 0x0, 0x4, 0x0, 0x6A, 0xFF, 0xEC, 0x7, 0xA0, 0x6, 0x88, 0x0, 0x2, 0x0, 0x6, 0x0, 0xE, 0x0, 0x32, 0x0, 0x0, 0x1, 0x3, 0x3, 0x25, 0x1, 0x27, 0x1, 0x1, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x1, 0x1, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x2, 0x82, 0x7A, 0x7D, 0x4, 0x4E, 0xFD, 0x39, 0x7D, 0x2, 0xC7, 0xFD, 0x98, 0x43, 0xFE, 0xAA, 0x43, 0xAE, 0x1, 0x52, 0x97, 0x1, 0x4F, 0x3, 0x59, 0x4E, 0x66, 0x98, 0x9F, 0xA7, 0x8B, 0xA7, 0xA2, 0x8, 0xA2, 0x1, 0x54, 0x5B, 0x8C, 0x63, 0x53, 0xA3, 0x92, 0xA4, 0x9C, 0xA3, 0xC4, 0xA3, 0xB, 0x67, 0x52, 0x9B, 0x4, 0x66, 0x1, 0x60, 0xFE, 0xA0, 0x79, 0xFB, 0x8E, 0x49, 0x4, 0x72, 0xFD, 0xF8, 0xBF, 0xBF, 0x3, 0x68, 0xFC, 0x98, 0xFD, 0xBE, 0x30, 0x3B, 0x23, 0x34, 0x78, 0x71, 0x62, 0x88, 0xA3, 0x6F, 0x2D, 0x5E, 0x66, 0x32, 0x3F, 0x1C, 0x37, 0x76, 0x6C, 0x6A, 0x8A, 0xA7, 0x7D, 0x58, 0x45, 0x0, 0x4, 0x0, 0x57, 0xFF, 0xEC, 0x7, 0xB8, 0x3, 0x80, 0x0, 0x33, 0x0, 0x3D, 0x0, 0x47, 0x0, 0x51, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x20, 0x27, 0x6, 0x20, 0x27, 0x6, 0x23, 0x35, 0x32, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x32, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x32, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x33, 0x1, 0x14, 0x17, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x5, 0x14, 0x17, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x5, 0x14, 0x17, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0xB8, 0xAE, 0x8D, 0x8D, 0xFE, 0xA4, 0x8D, 0x8D, 0xFE, 0xA4, 0x8C, 0x8D, 0xAE, 0x55, 0x41, 0x7B, 0x75, 0xAA, 0xAB, 0x75, 0x7B, 0x41, 0xAA, 0x42, 0x7B, 0x75, 0xAA, 0xAB, 0x75, 0x7B, 0x41, 0xAA, 0x42, 0x7B, 0x75, 0xAA, 0xAB, 0x75, 0x7B, 0x41, 0x55, 0xF9, 0x91, 0x49, 0x48, 0x23, 0x26, 0x25, 0x23, 0x2, 0x76, 0x48, 0x49, 0x23, 0x26, 0x25, 0x23, 0x2, 0x76, 0x48, 0x49, 0x23, 0x26, 0x25, 0x23, 0x14, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0x4C, 0xC3, 0x11, 0x99, 0xDB, 0x88, 0xC4, 0xC4, 0x88, 0xDB, 0x99, 0x11, 0x11, 0x99, 0xDB, 0x88, 0xC4, 0xC4, 0x88, 0xDB, 0x99, 0x11, 0x11, 0x99, 0xDB, 0x88, 0xC4, 0xC4, 0x88, 0xDB, 0x99, 0x11, 0x1, 0x84, 0xB0, 0x5D, 0x5E, 0xAF, 0x3B, 0x4F, 0x4F, 0x3B, 0xAF, 0x5E, 0x5D, 0xB0, 0x3B, 0x4F, 0x4F, 0x3B, 0xAF, 0x5E, 0x5D, 0xB0, 0x3B, 0x4F, 0x4F, 0xFF, 0xFF, 0x0, 0x93, 0x0, 0x0, 0x6, 0xA6, 0x5, 0xAC, 0x0, 0x27, 0x7, 0x42, 0x0, 0x12, 0x2, 0x98, 0x0, 0x27, 0x7, 0xA1, 0x3, 0xF8, 0x0, 0x0, 0x0, 0x7, 0x4, 0x83, 0x1, 0x4A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x93, 0xFF, 0xF7, 0x6, 0x3B, 0x5, 0xAC, 0x0, 0x27, 0x7, 0x42, 0x0, 0x12, 0x2, 0x98, 0x0, 0x27, 0x7, 0xA3, 0x3, 0x97, 0x0, 0x0, 0x0, 0x7, 0x4, 0x83, 0x1, 0x4A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x93, 0xFF, 0xF5, 0x8, 0x23, 0x5, 0xAC, 0x0, 0x27, 0x7, 0x42, 0x0, 0x12, 0x2, 0x98, 0x0, 0x27, 0x7, 0x43, 0x5, 0x79, 0x0, 0x0, 0x0, 0x27, 0x4, 0x83, 0x1, 0x4B, 0x0, 0x0, 0x0, 0x7, 0x7, 0x42, 0x3, 0x58, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x93, 0xFF, 0xF5, 0x6, 0x57, 0x5, 0xAC, 0x0, 0x27, 0x7, 0x42, 0x0, 0x12, 0x2, 0x98, 0x0, 0x27, 0x7, 0x9D, 0x3, 0xAE, 0x0, 0x0, 0x0, 0x7, 0x4, 0x83, 0x1, 0x4A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x58, 0xFF, 0xF5, 0x7, 0x7, 0x5, 0xB8, 0x0, 0x27, 0x7, 0x41, 0x0, 0x1C, 0x2, 0x98, 0x0, 0x27, 0x4, 0x83, 0x1, 0xFD, 0x0, 0x0, 0x0, 0x7, 0x7, 0x9D, 0x4, 0x5E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x93, 0xFF, 0xF5, 0x6, 0x51, 0x5, 0xAC, 0x0, 0x27, 0x7, 0x42, 0x0, 0x12, 0x2, 0x98, 0x0, 0x27, 0x7, 0x9F, 0x3, 0xA3, 0x0, 0x0, 0x0, 0x7, 0x4, 0x83, 0x1, 0x4A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x58, 0xFF, 0xF5, 0x7, 0x4, 0x5, 0xB8, 0x0, 0x27, 0x7, 0x41, 0x0, 0x1C, 0x2, 0x98, 0x0, 0x27, 0x4, 0x83, 0x1, 0xFC, 0x0, 0x0, 0x0, 0x7, 0x7, 0x9F, 0x4, 0x56, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xF5, 0x6, 0xD7, 0x5, 0xB8, 0x0, 0x27, 0x7, 0x9D, 0x0, 0x24, 0x2, 0x98, 0x0, 0x27, 0x4, 0x83, 0x1, 0xA6, 0x0, 0x0, 0x0, 0x7, 0x7, 0x9F, 0x4, 0x29, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x52, 0xFF, 0xF5, 0x7, 0x3A, 0x5, 0xAD, 0x0, 0x27, 0x7, 0x9E, 0x0, 0x1D, 0x2, 0x98, 0x0, 0x27, 0x4, 0x83, 0x2, 0xC, 0x0, 0x0, 0x0, 0x7, 0x7, 0x9F, 0x4, 0x8C, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x93, 0xFF, 0xF5, 0x6, 0x29, 0x5, 0xAC, 0x0, 0x27, 0x7, 0x42, 0x0, 0x12, 0x2, 0x98, 0x0, 0x27, 0x7, 0xA0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x7, 0x4, 0x83, 0x1, 0x49, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x51, 0xFF, 0xF5, 0x6, 0x76, 0x5, 0xAD, 0x0, 0x27, 0x7, 0x9F, 0x0, 0x2, 0x2, 0x98, 0x0, 0x27, 0x7, 0xA0, 0x3, 0xBD, 0x0, 0x0, 0x0, 0x7, 0x4, 0x83, 0x1, 0x96, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x59, 0xFF, 0xF5, 0x5, 0xCB, 0x5, 0x9A, 0x0, 0x27, 0x7, 0x42, 0xFF, 0xD8, 0x2, 0x86, 0x0, 0x27, 0x4, 0x83, 0x0, 0xFB, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA2, 0x3, 0x21, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xF5, 0x6, 0x68, 0x5, 0xB4, 0x0, 0x27, 0x7, 0x9D, 0x0, 0x1D, 0x2, 0x94, 0x0, 0x27, 0x4, 0x83, 0x1, 0xA8, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA2, 0x3, 0xBE, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xF5, 0x6, 0x5C, 0x5, 0xA8, 0x0, 0x27, 0x7, 0x9F, 0x0, 0xC, 0x2, 0x93, 0x0, 0x27, 0x4, 0x83, 0x1, 0x8C, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA2, 0x3, 0xB2, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x59, 0xFF, 0xF5, 0x6, 0x1A, 0x5, 0xA3, 0x0, 0x27, 0x7, 0xA1, 0x0, 0x22, 0x2, 0x8E, 0x0, 0x27, 0x4, 0x83, 0x1, 0x33, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA2, 0x3, 0x70, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x93, 0x0, 0x6D, 0x4, 0xBC, 0x5, 0xAC, 0x0, 0x27, 0x7, 0x42, 0x0, 0x12, 0x2, 0x98, 0x0, 0x7, 0x4, 0x83, 0x1, 0x4A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x3, 0xBD, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x2E, 0x2, 0x1D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x5, 0xDB, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x27, 0x0, 0x2E, 0x2, 0x1D, 0x0, 0x0, 0x0, 0x7, 0x0, 0x2E, 0x4, 0x3B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x7, 0x56, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x3B, 0x2, 0x39, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x1D, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x3B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x6, 0xC5, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3B, 0x0, 0x0, 0x0, 0x7, 0x0, 0x2E, 0x5, 0x25, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x8, 0xE2, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3B, 0x0, 0x0, 0x0, 0x27, 0x0, 0x2E, 0x5, 0x25, 0x0, 0x0, 0x0, 0x7, 0x0, 0x2E, 0x7, 0x42, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0xA, 0xFF, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3B, 0x0, 0x0, 0x0, 0x27, 0x0, 0x2E, 0x5, 0x25, 0x0, 0x0, 0x0, 0x27, 0x0, 0x2E, 0x7, 0x42, 0x0, 0x0, 0x0, 0x7, 0x0, 0x2E, 0x9, 0x5F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x7, 0x31, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x3D, 0x2, 0x47, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x28, 0x0, 0x0, 0x4, 0xE9, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x3D, 0xFF, 0x0, 0xFF, 0xFF, 0x0, 0x28, 0x0, 0x0, 0x6, 0xBC, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3D, 0xFF, 0x0, 0x0, 0x7, 0x0, 0x2E, 0x5, 0x1C, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x28, 0x0, 0x0, 0x8, 0xD9, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3D, 0xFF, 0x0, 0x0, 0x27, 0x0, 0x2E, 0x5, 0x1C, 0x0, 0x0, 0x0, 0x7, 0x0, 0x2E, 0x7, 0x39, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x4, 0x36, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x31, 0xF, 0x0, 0xFF, 0xFF, 0x0, 0x65, 0xFF, 0xEC, 0x4, 0xEB, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x28, 0xFF, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x4, 0xE1, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x29, 0xF, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x6, 0x7A, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x32, 0xF, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0x0, 0x0, 0x1, 0x92, 0x5, 0xD5, 0x0, 0x6, 0x0, 0x4E, 0x1, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0x0, 0x0, 0x3, 0x9E, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x4E, 0x1, 0x0, 0x0, 0x7, 0x0, 0x4E, 0x2, 0xD, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0x0, 0x0, 0x5, 0xA9, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x4E, 0x1, 0x0, 0x0, 0x27, 0x0, 0x4E, 0x2, 0xD, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4E, 0x4, 0x18, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0x0, 0x0, 0x5, 0xE8, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x4E, 0x1, 0x0, 0x0, 0x7, 0x0, 0x5B, 0x2, 0xD, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x1A, 0x0, 0x0, 0x3, 0xDE, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x5B, 0x3, 0x0, 0xFF, 0xFF, 0x0, 0x1A, 0x0, 0x0, 0x5, 0x8A, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x5B, 0x3, 0x0, 0x0, 0x7, 0x0, 0x4E, 0x3, 0xF9, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x1A, 0x0, 0x0, 0x7, 0x95, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x5B, 0x3, 0x0, 0x0, 0x27, 0x0, 0x4E, 0x3, 0xF9, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4E, 0x6, 0x4, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x1A, 0x0, 0x0, 0x9, 0xA1, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x5B, 0x3, 0x0, 0x0, 0x27, 0x0, 0x4E, 0x3, 0xF9, 0x0, 0x0, 0x0, 0x27, 0x0, 0x4E, 0x6, 0x4, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4E, 0x8, 0x10, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0x0, 0x0, 0x5, 0xF6, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x4E, 0x1, 0x0, 0x0, 0x7, 0x0, 0x5D, 0x2, 0xD, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x3, 0xEC, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x5D, 0x3, 0x0, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x5, 0x9B, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x5D, 0x3, 0x0, 0x0, 0x7, 0x0, 0x4E, 0x4, 0xA, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x7, 0xA7, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x5D, 0x3, 0x0, 0x0, 0x27, 0x0, 0x4E, 0x4, 0xA, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4E, 0x6, 0x16, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0x0, 0x0, 0x1, 0x71, 0x6, 0x0, 0x0, 0x6, 0x0, 0x51, 0xF2, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x3, 0xF5, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x48, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x4, 0x6, 0x0, 0x0, 0x6, 0x0, 0x49, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0x0, 0x0, 0x6, 0x7B, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x52, 0x1, 0x0, 0x0, 0x3, 0x0, 0x68, 0x0, 0x0, 0x6, 0xCC, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x13, 0x0, 0x23, 0x0, 0x0, 0x25, 0x11, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x12, 0x17, 0x1, 0x11, 0x33, 0x32, 0x12, 0x35, 0x35, 0x34, 0x2, 0x23, 0x1, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x3, 0x1F, 0x1D, 0xCD, 0xCE, 0x2, 0xCB, 0xD5, 0x1, 0xE, 0x17, 0xD2, 0xD2, 0xC6, 0xD1, 0xFE, 0xCC, 0xFE, 0xD0, 0xFE, 0x95, 0x1, 0x6A, 0x1, 0x24, 0x1, 0x48, 0x1, 0x24, 0x1, 0x6A, 0xFE, 0x95, 0xFE, 0xD0, 0xCA, 0x4, 0x1B, 0xEF, 0xED, 0x56, 0xE0, 0xFE, 0xFA, 0x3, 0x4, 0x1B, 0xFB, 0xE5, 0x1, 0x2, 0xE7, 0x4C, 0xE2, 0x1, 0x4, 0xFB, 0x1B, 0x1, 0x77, 0x1, 0x3C, 0x4A, 0x1, 0x3D, 0x1, 0x76, 0xFE, 0x8A, 0xFE, 0xC3, 0x4A, 0xFE, 0xC4, 0xFE, 0x89, 0x0, 0x3, 0x0, 0x99, 0x0, 0x0, 0x4, 0xF4, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1C, 0x0, 0x26, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x37, 0x35, 0x34, 0x26, 0x23, 0x3, 0x15, 0x33, 0x36, 0x12, 0x37, 0x35, 0x34, 0x26, 0x27, 0x23, 0x15, 0x33, 0x16, 0x16, 0x17, 0x15, 0x14, 0x6, 0x23, 0x1, 0x11, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x1, 0x8C, 0x75, 0xDB, 0x4, 0x71, 0x65, 0x7E, 0xCF, 0xDA, 0xD9, 0x1, 0xD2, 0xD1, 0xE0, 0x88, 0xAE, 0xD7, 0x1, 0xDA, 0xB8, 0xFE, 0x91, 0x1, 0xCC, 0x1, 0x25, 0x1, 0x6A, 0xFE, 0x94, 0xFE, 0xD0, 0x3, 0xF3, 0xFD, 0xC6, 0xFD, 0x38, 0x8D, 0x78, 0xFD, 0x2B, 0x68, 0x1, 0x1, 0xB, 0xEC, 0x51, 0xFC, 0xFD, 0x2, 0x6C, 0x1, 0xE0, 0xBC, 0x32, 0xBF, 0xE2, 0xFE, 0xE2, 0x5, 0xB0, 0xFE, 0x8A, 0xFE, 0xC3, 0x4A, 0xFE, 0xC4, 0xFE, 0x89, 0x0, 0x5, 0x0, 0x6A, 0x0, 0x0, 0x7, 0x87, 0x5, 0xB0, 0x0, 0x13, 0x0, 0x1C, 0x0, 0x24, 0x0, 0x38, 0x0, 0x48, 0x0, 0x0, 0x25, 0x35, 0x23, 0x26, 0x26, 0x27, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x23, 0x6, 0x6, 0x7, 0x15, 0x14, 0x12, 0x33, 0x1, 0x11, 0x33, 0x32, 0x37, 0x35, 0x34, 0x26, 0x23, 0x1, 0x11, 0x23, 0x22, 0x7, 0x15, 0x10, 0x17, 0x5, 0x15, 0x33, 0x32, 0x12, 0x35, 0x35, 0x34, 0x26, 0x23, 0x23, 0x15, 0x33, 0x16, 0x16, 0x17, 0x15, 0x14, 0x6, 0x23, 0x1, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x3, 0x7F, 0x2C, 0xB6, 0xD9, 0x1, 0xDB, 0xAF, 0x32, 0x8D, 0xD0, 0xD1, 0x2, 0xDB, 0xDB, 0x1, 0x6D, 0x22, 0xDB, 0x4, 0x71, 0x65, 0xFE, 0xE2, 0x2B, 0xD0, 0x6, 0xD7, 0x1, 0x1D, 0x7A, 0xDB, 0xDB, 0xD4, 0xD6, 0x86, 0x35, 0xAE, 0xD8, 0x1, 0xDB, 0xB8, 0xFE, 0x6A, 0xFE, 0xD0, 0xFE, 0x95, 0x1, 0x6A, 0x1, 0x24, 0x2, 0x1, 0x1, 0x24, 0x1, 0x6A, 0xFE, 0x95, 0xFE, 0xD0, 0xB6, 0x68, 0x1, 0xE0, 0xBD, 0x31, 0xBF, 0xE2, 0x6C, 0x2, 0xF9, 0xF6, 0x56, 0xF0, 0xFE, 0xF3, 0x3, 0x3D, 0xFD, 0xC6, 0xFD, 0x38, 0x8D, 0x78, 0xFD, 0xC6, 0x2, 0x3A, 0xF4, 0x40, 0xFE, 0xFF, 0x5, 0x9B, 0x68, 0x1, 0xD, 0xF0, 0x4C, 0xFD, 0xFE, 0x6C, 0x1, 0xE0, 0xBD, 0x31, 0xBF, 0xE2, 0xFE, 0xE2, 0x1, 0x77, 0x1, 0x3C, 0x4A, 0x1, 0x3D, 0x1, 0x76, 0xFE, 0x8A, 0xFE, 0xC3, 0x4A, 0xFE, 0xC4, 0xFE, 0x89, 0x0, 0x1, 0x0, 0x4D, 0xFF, 0xEC, 0x4, 0xCD, 0x5, 0xC4, 0x0, 0x1A, 0x0, 0x0, 0x13, 0x33, 0x16, 0x16, 0x33, 0x32, 0x12, 0x35, 0x35, 0x34, 0x2, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x0, 0x21, 0x20, 0x0, 0x13, 0x15, 0x10, 0x0, 0x20, 0x0, 0x4E, 0xF3, 0x13, 0x8B, 0xA6, 0xB4, 0xA1, 0xB2, 0xB0, 0x9E, 0x89, 0x11, 0xF3, 0x16, 0x1, 0x12, 0x1, 0x3, 0x1, 0x10, 0x1, 0x41, 0x4, 0xFE, 0xC3, 0xFD, 0xEA, 0xFE, 0xE8, 0x1, 0xD9, 0x8E, 0x9C, 0x1, 0x13, 0xD9, 0x7C, 0xE6, 0x1, 0x4, 0xA2, 0x8D, 0xDA, 0x1, 0x18, 0xFE, 0x93, 0xFE, 0xCD, 0x89, 0xFE, 0xC7, 0xFE, 0x8A, 0x1, 0x1A, 0x0, 0x1, 0x0, 0x3B, 0xFF, 0xEC, 0x3, 0xE1, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x2, 0x23, 0x22, 0x24, 0x3B, 0xE5, 0x5, 0x7A, 0x58, 0x95, 0x62, 0x62, 0x95, 0x63, 0x6F, 0x5, 0xE5, 0x5, 0xF1, 0xC4, 0xF7, 0xF3, 0x2, 0xF3, 0xFA, 0xB4, 0xFF, 0x0, 0x1, 0x66, 0x4F, 0x68, 0xD9, 0x83, 0x24, 0x81, 0xDB, 0x7D, 0x57, 0xB3, 0xE4, 0xFE, 0xC4, 0xDD, 0x2A, 0xDF, 0xFE, 0xC0, 0xDD, 0x0, 0x1, 0x0, 0x66, 0xFE, 0x98, 0x4, 0xE6, 0x5, 0xC4, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x37, 0x35, 0x4, 0xD6, 0xF3, 0x80, 0xB5, 0xFE, 0xF5, 0xFE, 0xC3, 0x1, 0x43, 0x1, 0x12, 0x1, 0x3, 0x1, 0x12, 0x16, 0xF3, 0x11, 0x89, 0x9E, 0xB0, 0xB2, 0xA1, 0xB4, 0xC6, 0x6F, 0x1, 0xDC, 0xFC, 0xBC, 0x1, 0x9E, 0x4A, 0x1, 0x76, 0x1, 0x39, 0x7A, 0x1, 0x3A, 0x1, 0x75, 0xFE, 0xE8, 0xDA, 0x8D, 0xA2, 0xFE, 0xFC, 0xE6, 0x7C, 0xD9, 0xFE, 0xED, 0x7F, 0xAE, 0x0, 0x1, 0x0, 0x3C, 0x0, 0x0, 0x6, 0x10, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x1, 0x37, 0x1, 0x11, 0x33, 0x11, 0x1, 0x17, 0x1, 0x2, 0xB6, 0xFD, 0x86, 0xB0, 0x1, 0xBF, 0xF3, 0x1, 0xC8, 0xAA, 0xFD, 0x86, 0x2, 0xA4, 0xAD, 0xFE, 0x17, 0x4, 0x48, 0xFB, 0xB5, 0x1, 0xEC, 0xB4, 0xFD, 0x63, 0x0, 0x4, 0x0, 0x99, 0x0, 0x0, 0x4, 0xF9, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x18, 0x0, 0x2C, 0x0, 0x36, 0x0, 0x0, 0x1, 0x11, 0x36, 0x35, 0x35, 0x34, 0x26, 0x3, 0x15, 0x33, 0x36, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x23, 0x15, 0x33, 0x4, 0x17, 0x15, 0x14, 0x6, 0x7, 0x15, 0x33, 0x32, 0x12, 0x35, 0x35, 0x10, 0x2, 0x23, 0x23, 0x15, 0x33, 0x16, 0x16, 0x17, 0x15, 0x14, 0x6, 0x7, 0x5, 0x11, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x1, 0x8C, 0x83, 0x40, 0x43, 0x6A, 0x88, 0x9D, 0x1, 0x9F, 0x82, 0x6F, 0x17, 0x1, 0x17, 0x5, 0x97, 0x9C, 0xD2, 0xDC, 0xF3, 0xE8, 0xDA, 0xDF, 0x8F, 0xC1, 0xEF, 0x1, 0xF0, 0xCA, 0xFE, 0x87, 0x1, 0xD2, 0x1, 0x29, 0x1, 0x65, 0xFE, 0x9A, 0xFE, 0xCB, 0x3, 0x62, 0xFE, 0xF6, 0x1, 0x71, 0x1E, 0x45, 0x35, 0xFE, 0x68, 0x50, 0x1, 0x90, 0xAF, 0x3A, 0xBC, 0x8B, 0x4B, 0x6, 0xF9, 0x27, 0x80, 0x80, 0xE0, 0x53, 0x1, 0x22, 0xFA, 0x4C, 0x1, 0x1, 0x1, 0x20, 0x55, 0x1, 0xF0, 0xE4, 0x39, 0xE6, 0xEC, 0x1, 0xEA, 0x5, 0xB0, 0xFE, 0x8A, 0xFE, 0xC3, 0x4A, 0xFE, 0xC4, 0xFE, 0x89, 0x0, 0x7, 0x0, 0x6A, 0x0, 0x0, 0x8, 0x37, 0x5, 0xB0, 0x0, 0x13, 0x0, 0x25, 0x0, 0x2D, 0x0, 0x35, 0x0, 0x47, 0x0, 0x5B, 0x0, 0x6B, 0x0, 0x0, 0x25, 0x35, 0x23, 0x26, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x23, 0x6, 0x2, 0x7, 0x15, 0x14, 0x12, 0x33, 0x37, 0x35, 0x23, 0x24, 0x27, 0x35, 0x10, 0x25, 0x33, 0x35, 0x23, 0x6, 0x6, 0x7, 0x15, 0x14, 0x16, 0x33, 0x1, 0x11, 0x33, 0x32, 0x35, 0x35, 0x34, 0x26, 0x1, 0x11, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x5, 0x15, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x23, 0x15, 0x33, 0x4, 0x17, 0x15, 0x14, 0x5, 0x7, 0x15, 0x33, 0x32, 0x12, 0x35, 0x35, 0x10, 0x2, 0x23, 0x23, 0x15, 0x33, 0x16, 0x16, 0x17, 0x15, 0x14, 0x6, 0x7, 0x5, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x3, 0xD7, 0x86, 0xCA, 0xF0, 0xF1, 0xC3, 0x8C, 0xE2, 0xD5, 0xE7, 0x3, 0xF4, 0xDB, 0xD2, 0x1B, 0xFE, 0xE6, 0x6, 0x1, 0x1C, 0x1F, 0x71, 0x81, 0x9D, 0x1, 0xA0, 0x8B, 0x1, 0x58, 0x5, 0x88, 0x42, 0xFE, 0xC2, 0xB, 0x40, 0x44, 0x1, 0x82, 0x65, 0x8C, 0x9F, 0x9F, 0x82, 0x6F, 0x1D, 0x1, 0x18, 0x5, 0xFE, 0xE2, 0x1C, 0xD2, 0xDB, 0xF4, 0xE8, 0xDA, 0xDF, 0x8F, 0xC1, 0xEF, 0x1, 0xF0, 0xCA, 0xFD, 0xB5, 0xFE, 0xCB, 0xFE, 0x9A, 0x1, 0x65, 0x1, 0x29, 0x2, 0xB1, 0x1, 0x29, 0x1, 0x65, 0xFE, 0x9A, 0xFE, 0xCB, 0x97, 0x53, 0x1, 0xEC, 0xE6, 0x35, 0xE7, 0xF2, 0x55, 0x1, 0xFE, 0xE7, 0xFB, 0x58, 0xFA, 0xFE, 0xDE, 0xE3, 0x50, 0x6, 0xF0, 0x28, 0x1, 0x2, 0x6, 0x4B, 0x1, 0x8A, 0xB7, 0x3B, 0xB2, 0x92, 0x1, 0xE8, 0xFE, 0xF6, 0x72, 0x1E, 0x44, 0x36, 0xFE, 0xF6, 0x1, 0xA, 0x35, 0x45, 0x1E, 0x72, 0x8E, 0x50, 0x92, 0xB2, 0x36, 0xBC, 0x8B, 0x4B, 0x6, 0xF9, 0x27, 0xF9, 0x7, 0xE0, 0x53, 0x1, 0x22, 0xFA, 0x4C, 0x1, 0x1, 0x1, 0x20, 0x55, 0x1, 0xF0, 0xE4, 0x39, 0xE6, 0xEC, 0x1, 0xEA, 0x1, 0x77, 0x1, 0x3C, 0x4A, 0x1, 0x3D, 0x1, 0x76, 0xFE, 0x8A, 0xFE, 0xC3, 0x4A, 0xFE, 0xC4, 0xFE, 0x89, 0xFF, 0xFF, 0x0, 0x46, 0xFF, 0xF5, 0x6, 0x51, 0x5, 0xA8, 0x0, 0x27, 0x4, 0x83, 0x1, 0x65, 0x0, 0x0, 0x0, 0x27, 0x7, 0x9D, 0x3, 0xA8, 0x0, 0x0, 0x0, 0x7, 0x7, 0x43, 0xFF, 0xFA, 0x2, 0x88, 0x0, 0x2, 0x0, 0x62, 0xFF, 0xEB, 0x4, 0x43, 0x5, 0xF6, 0x0, 0x19, 0x0, 0x27, 0x0, 0x0, 0x1, 0x32, 0x17, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x20, 0x0, 0x13, 0x15, 0x10, 0x0, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x12, 0x17, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x26, 0x26, 0x2, 0x39, 0xAC, 0x78, 0x19, 0xC5, 0x84, 0x4E, 0x74, 0x46, 0x1D, 0x38, 0x8E, 0x73, 0x1, 0x12, 0x1, 0x20, 0x2, 0xFE, 0xFD, 0xEE, 0xED, 0xFE, 0xFD, 0xF6, 0xFC, 0x88, 0x77, 0x76, 0x87, 0x89, 0x76, 0xF, 0x74, 0x4, 0x5, 0x7E, 0xC1, 0xE6, 0x1A, 0x1A, 0xB7, 0x19, 0x2C, 0xFE, 0x4B, 0xFE, 0x84, 0x44, 0xFE, 0xE8, 0xFE, 0x82, 0x1, 0x30, 0xE3, 0x15, 0xD6, 0x1, 0x1C, 0xC3, 0xB9, 0x7D, 0x15, 0x86, 0xC3, 0xE9, 0xA7, 0x5A, 0x2F, 0x7B, 0x0, 0x1, 0x0, 0xA6, 0xFF, 0x1A, 0x4, 0xF4, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x4, 0xF4, 0xF3, 0xFD, 0x99, 0xF4, 0x5, 0xB0, 0xF9, 0x6A, 0x5, 0xD6, 0xFA, 0x2A, 0x6, 0x96, 0x0, 0x1, 0x0, 0x41, 0xFE, 0xF3, 0x4, 0xC1, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x0, 0x13, 0x35, 0x1, 0x1, 0x35, 0x21, 0x15, 0x21, 0x1, 0x15, 0x1, 0x21, 0x15, 0x41, 0x2, 0x4E, 0xFD, 0xB2, 0x4, 0x46, 0xFC, 0xF7, 0x2, 0x12, 0xFD, 0xEE, 0x3, 0x43, 0xFE, 0xF3, 0x97, 0x2, 0xC9, 0x2, 0xC6, 0x97, 0xC3, 0xFD, 0x74, 0x1E, 0xFD, 0x73, 0xC3, 0x0, 0x1, 0x0, 0x9F, 0x2, 0x6E, 0x3, 0xEF, 0x3, 0x32, 0x0, 0x3, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x3, 0xEF, 0xFC, 0xB0, 0x3, 0x32, 0xC4, 0xC4, 0x0, 0x1, 0x0, 0x3C, 0xFF, 0xFF, 0x4, 0x92, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x5, 0x3, 0x23, 0x35, 0x21, 0x13, 0x1, 0x33, 0x1, 0x1, 0xE5, 0xD9, 0xD0, 0x1, 0x66, 0xA0, 0x1, 0x78, 0xD8, 0xFE, 0x17, 0x1, 0x2, 0x42, 0xC6, 0xFE, 0x23, 0x4, 0x86, 0xFA, 0x4F, 0x0, 0x3, 0x0, 0x5E, 0xFF, 0xEB, 0x7, 0xE0, 0x4, 0x4E, 0x0, 0x19, 0x0, 0x29, 0x0, 0x39, 0x0, 0x0, 0x5, 0x22, 0x26, 0x27, 0x6, 0x6, 0x23, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x13, 0x34, 0x26, 0x23, 0x22, 0x6, 0x6, 0x7, 0x15, 0x1E, 0x2, 0x33, 0x32, 0x36, 0x35, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x36, 0x37, 0x35, 0x2E, 0x2, 0x23, 0x22, 0x6, 0x15, 0x5, 0xE9, 0xB1, 0xDC, 0x3E, 0x3D, 0xDC, 0xB1, 0xE3, 0xFE, 0xF0, 0x3, 0x1, 0x11, 0xE3, 0xB2, 0xDD, 0x3E, 0x3D, 0xDD, 0xB2, 0xDB, 0x1, 0x1A, 0xFE, 0xEE, 0x22, 0x8B, 0x81, 0x6B, 0x8B, 0x49, 0x9, 0x8, 0x4A, 0x8B, 0x69, 0x82, 0x8C, 0xFA, 0x5D, 0x8C, 0x82, 0x6A, 0x8A, 0x4A, 0x8, 0x8, 0x49, 0x8B, 0x6C, 0x81, 0x8B, 0x15, 0xD2, 0x7A, 0x7A, 0xD2, 0x1, 0x40, 0xDD, 0x20, 0xE0, 0x1, 0x46, 0xCE, 0x78, 0x78, 0xCE, 0xFE, 0xC4, 0xF2, 0xF, 0xE0, 0xFE, 0xBA, 0x2, 0x3D, 0x91, 0xCF, 0x8D, 0xA4, 0x25, 0x23, 0x26, 0xA8, 0x8F, 0xCC, 0x93, 0x93, 0xCC, 0x8F, 0xA8, 0x26, 0x23, 0x25, 0xA4, 0x8D, 0xCF, 0x91, 0x0, 0x1, 0xFF, 0xAF, 0xFE, 0x4B, 0x2, 0xA9, 0x6, 0x15, 0x0, 0x15, 0x0, 0x0, 0x13, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x15, 0x11, 0x14, 0x6, 0x31, 0x46, 0x3C, 0x11, 0x2B, 0x27, 0x8C, 0xC5, 0xAE, 0x3D, 0x5B, 0x19, 0x2A, 0x32, 0xA3, 0xBB, 0xFE, 0x4B, 0x12, 0xBE, 0xD, 0xA2, 0x4, 0xF3, 0xB4, 0xBE, 0x15, 0xB8, 0xA, 0xAF, 0xFB, 0xD, 0xB5, 0xB0, 0x0, 0x2, 0x0, 0x65, 0x1, 0x1, 0x4, 0x16, 0x3, 0xFB, 0x0, 0x14, 0x0, 0x28, 0x0, 0x0, 0x13, 0x35, 0x36, 0x33, 0x36, 0x1E, 0x2, 0x33, 0x32, 0x37, 0x15, 0x6, 0x23, 0x22, 0x2E, 0x2, 0x7, 0x22, 0x6, 0x3, 0x35, 0x36, 0x33, 0x36, 0x1E, 0x2, 0x33, 0x32, 0x37, 0x15, 0x6, 0x23, 0x22, 0x2E, 0x2, 0x7, 0x22, 0x65, 0x65, 0x91, 0x4F, 0x63, 0x7A, 0x5D, 0x49, 0x85, 0x64, 0x65, 0x80, 0x30, 0x48, 0xDD, 0x4A, 0x33, 0x41, 0x8A, 0x2F, 0x65, 0x8E, 0x4F, 0x63, 0x7A, 0x5D, 0x49, 0x88, 0x64, 0x65, 0x84, 0x30, 0x48, 0xDD, 0x4A, 0x33, 0x92, 0x2, 0xB5, 0xDA, 0x6A, 0x2, 0x2B, 0x3E, 0x27, 0x7E, 0xDA, 0x6A, 0x10, 0x70, 0xF, 0x1, 0x43, 0xFE, 0x21, 0xDA, 0x6A, 0x2, 0x2B, 0x3E, 0x27, 0x7E, 0xDA, 0x6A, 0x10, 0x70, 0xF, 0x1, 0x0, 0x1, 0x0, 0x91, 0x0, 0x80, 0x3, 0xF0, 0x4, 0xC4, 0x0, 0x13, 0x0, 0x0, 0x1, 0x21, 0x7, 0x27, 0x37, 0x23, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x7, 0x33, 0x15, 0x21, 0x7, 0x21, 0x3, 0xF0, 0xFD, 0xE2, 0x81, 0x6D, 0x5D, 0xB0, 0x1, 0x22, 0x7E, 0xFE, 0x60, 0x2, 0x11, 0x86, 0x6D, 0x63, 0xBE, 0xFE, 0xD1, 0x7E, 0x1, 0xAD, 0x1, 0x64, 0xE4, 0x3E, 0xA6, 0xCA, 0xDF, 0xC9, 0xEE, 0x3F, 0xAF, 0xC9, 0xDF, 0xFF, 0xFF, 0x0, 0x3C, 0x0, 0x0, 0x3, 0x8C, 0x4, 0x48, 0x0, 0x67, 0x0, 0x21, 0x0, 0x0, 0x0, 0x8B, 0x40, 0x0, 0x37, 0x96, 0x0, 0x47, 0x5, 0x3A, 0xFF, 0x9D, 0xFD, 0xA6, 0x40, 0x0, 0x3D, 0xFC, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xFF, 0x3, 0xE0, 0x4, 0x55, 0x0, 0x67, 0x0, 0x23, 0x0, 0x0, 0x0, 0x98, 0x40, 0x0, 0x37, 0x96, 0x0, 0x47, 0x5, 0x3A, 0xFF, 0xE1, 0xFD, 0xA5, 0x40, 0x0, 0x3D, 0xFC, 0x0, 0x1, 0x0, 0x45, 0xFE, 0xB8, 0x4, 0xFB, 0x0, 0x8C, 0x0, 0x7, 0x0, 0x0, 0x37, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x45, 0xC8, 0x3, 0x26, 0xC8, 0xFB, 0x4A, 0x8C, 0xFE, 0xEA, 0x1, 0x16, 0xFE, 0x2C, 0x0, 0x2, 0x0, 0x24, 0x0, 0x0, 0x3, 0xEB, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x9, 0x0, 0x0, 0x1, 0x13, 0x13, 0x3, 0x3, 0x1, 0x1, 0x33, 0x1, 0x1, 0x1, 0x18, 0xF2, 0xED, 0xF1, 0x5F, 0xFE, 0x7D, 0x1, 0x80, 0xC5, 0x1, 0x82, 0xFE, 0x81, 0x2, 0xD7, 0xFE, 0x2A, 0x1, 0xD6, 0x1, 0xD7, 0xFB, 0x52, 0x2, 0xD7, 0x2, 0xD9, 0xFD, 0x27, 0xFD, 0x29, 0x0, 0x2, 0x0, 0x99, 0xFE, 0xBB, 0x3, 0xA8, 0x6, 0x8F, 0x0, 0x3, 0x0, 0xB, 0x0, 0x0, 0x5, 0x33, 0x11, 0x23, 0x3, 0x11, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x1, 0x6E, 0xA1, 0xA1, 0xD5, 0x3, 0xF, 0xC4, 0xC4, 0x9F, 0x6, 0x87, 0xF8, 0xD3, 0x7, 0xD4, 0xA7, 0xF9, 0x79, 0xA6, 0x0, 0x2, 0x0, 0x52, 0xFE, 0xBB, 0x3, 0x61, 0x6, 0x8F, 0x0, 0x3, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x11, 0x33, 0x5, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, 0x2, 0x8D, 0xA2, 0xA2, 0xFD, 0xC5, 0xC5, 0xC5, 0x3, 0xF, 0x5, 0xE8, 0xF9, 0x79, 0xA6, 0xA6, 0x6, 0x87, 0xA7, 0xF8, 0x2C, 0x0, 0x1, 0x0, 0x40, 0xFE, 0xBE, 0x2, 0x98, 0x6, 0x8A, 0x0, 0x5, 0x0, 0x0, 0x1, 0x17, 0x1, 0x1, 0x7, 0x1, 0x1, 0xD0, 0xC8, 0xFE, 0x96, 0x1, 0x6A, 0xC8, 0xFE, 0x70, 0x6, 0x8A, 0x58, 0xFC, 0x72, 0xFC, 0x70, 0x56, 0x3, 0xE6, 0x0, 0x1, 0x0, 0x67, 0xFE, 0xBE, 0x2, 0xBF, 0x6, 0x8A, 0x0, 0x5, 0x0, 0x0, 0x13, 0x37, 0x1, 0x1, 0x27, 0x1, 0x67, 0xC8, 0x1, 0x90, 0xFE, 0x70, 0xC8, 0x1, 0x6A, 0x6, 0x32, 0x58, 0xFC, 0x1A, 0xFC, 0x1A, 0x56, 0x3, 0x90, 0xFF, 0xFF, 0x0, 0x40, 0xFE, 0xBE, 0x4, 0x4B, 0x6, 0x8A, 0x0, 0x26, 0x5, 0x46, 0x0, 0x0, 0x0, 0x7, 0x5, 0x46, 0x1, 0xB3, 0x0, 0x0, 0x0, 0x2, 0x0, 0x67, 0xFE, 0xBE, 0x4, 0x72, 0x6, 0x8A, 0x0, 0x5, 0x0, 0xB, 0x0, 0x0, 0x1, 0x37, 0x1, 0x1, 0x27, 0x1, 0x1, 0x37, 0x1, 0x1, 0x27, 0x1, 0x2, 0x1A, 0xC8, 0x1, 0x90, 0xFE, 0x70, 0xC8, 0x1, 0x6A, 0xFC, 0xE3, 0xC8, 0x1, 0x90, 0xFE, 0x70, 0xC8, 0x1, 0x6A, 0x6, 0x32, 0x58, 0xFC, 0x1A, 0xFC, 0x1A, 0x56, 0x3, 0x90, 0x3, 0x8E, 0x58, 0xFC, 0x1A, 0xFC, 0x1A, 0x56, 0x3, 0x90, 0x0, 0x2, 0x0, 0x99, 0xFE, 0x76, 0x3, 0x66, 0x6, 0xDC, 0x0, 0x7, 0x0, 0xB, 0x0, 0x0, 0x1, 0x1, 0x11, 0x1, 0x17, 0x7, 0x11, 0x17, 0x1, 0x17, 0x11, 0x7, 0x2, 0xFA, 0xFD, 0x9F, 0x2, 0x61, 0x6C, 0xA9, 0xA9, 0xFE, 0x8, 0x7A, 0x7A, 0xFE, 0x76, 0x1, 0x7B, 0x5, 0x70, 0x1, 0x7B, 0xA3, 0x6B, 0xF9, 0xB6, 0x6B, 0x1, 0x3F, 0x4D, 0x5, 0x3C, 0x4D, 0x0, 0x2, 0x0, 0x5A, 0xFE, 0x76, 0x3, 0x27, 0x6, 0xDC, 0x0, 0x7, 0x0, 0xB, 0x0, 0x0, 0x13, 0x27, 0x37, 0x11, 0x27, 0x37, 0x1, 0x11, 0x3, 0x27, 0x11, 0x37, 0xC6, 0x6C, 0xA9, 0xA9, 0x6C, 0x2, 0x61, 0xD5, 0x7A, 0x7A, 0xFE, 0x76, 0xA3, 0x6B, 0x6, 0x4A, 0x6B, 0xA3, 0xFE, 0x85, 0xFA, 0x90, 0x5, 0x9, 0x4D, 0xFA, 0xC4, 0x4D, 0x0, 0x1, 0x0, 0x99, 0xFE, 0x76, 0x2, 0x3F, 0x6, 0xDC, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x17, 0x7, 0x1, 0x11, 0x1, 0x17, 0x1, 0x6E, 0xD1, 0x94, 0xFE, 0xEE, 0x1, 0x12, 0x94, 0x5, 0x77, 0xFA, 0x64, 0xD2, 0x93, 0x1, 0x12, 0x6, 0x42, 0x1, 0x12, 0x93, 0x0, 0x1, 0x0, 0x54, 0xFE, 0x76, 0x1, 0xFA, 0x6, 0xDC, 0x0, 0x7, 0x0, 0x0, 0x17, 0x37, 0x11, 0x27, 0x37, 0x1, 0x11, 0x1, 0x54, 0xD1, 0xD1, 0x94, 0x1, 0x12, 0xFE, 0xEE, 0xF7, 0xD2, 0x5, 0x9C, 0xD2, 0x93, 0xFE, 0xEE, 0xF9, 0xBE, 0xFE, 0xEE, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x2, 0xCA, 0x4, 0x4E, 0x0, 0x8, 0x0, 0x0, 0x1, 0x3, 0x3, 0x23, 0x13, 0x5, 0x37, 0x25, 0x13, 0x2, 0x97, 0xA0, 0xDB, 0x9D, 0xE6, 0xFE, 0xEB, 0x32, 0x1, 0x72, 0xD6, 0x2, 0x20, 0x1, 0x15, 0xFC, 0xCB, 0x3, 0x5C, 0x9F, 0xBD, 0xD4, 0xFE, 0x8F, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xED, 0x2, 0xCA, 0x4, 0x3A, 0x0, 0x8, 0x0, 0x0, 0x5, 0x25, 0x27, 0x5, 0x3, 0x33, 0x13, 0x13, 0x17, 0x1, 0xF4, 0xFE, 0x8E, 0x32, 0x1, 0x15, 0xE6, 0x9D, 0xDB, 0xA0, 0x33, 0x13, 0xD4, 0xBC, 0x9F, 0x3, 0x5C, 0xFC, 0xCB, 0x1, 0x15, 0xBC, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x5, 0x2, 0x6, 0x18, 0x0, 0x17, 0x0, 0x0, 0x33, 0x23, 0x1, 0x3E, 0x2, 0x33, 0x32, 0x16, 0x7, 0x7, 0x25, 0x7, 0x5, 0x3, 0x37, 0x13, 0x37, 0x12, 0x23, 0x22, 0x6, 0x7, 0x7, 0xED, 0x9D, 0x1, 0x13, 0x2A, 0x5D, 0x96, 0x7F, 0xBF, 0x97, 0x35, 0x2A, 0x1, 0xC, 0x32, 0xFE, 0x8E, 0xD6, 0x33, 0xA4, 0x29, 0x47, 0xD4, 0x54, 0x5D, 0x1B, 0x30, 0x4, 0x4, 0x9B, 0xF0, 0x89, 0xED, 0xC7, 0x9E, 0x9A, 0xBC, 0xD4, 0x1, 0x71, 0xBC, 0xFE, 0xE5, 0x99, 0x1, 0x9, 0x7A, 0x5F, 0xAB, 0x0, 0x1, 0x0, 0x35, 0xFF, 0xEC, 0x4, 0xBF, 0x6, 0x18, 0x0, 0x16, 0x0, 0x0, 0x5, 0x25, 0x27, 0x5, 0x1, 0x26, 0x26, 0x23, 0x22, 0x6, 0x17, 0x13, 0x7, 0x3, 0x26, 0x12, 0x33, 0x32, 0x16, 0x17, 0x1, 0x13, 0x17, 0x3, 0xE9, 0xFE, 0x8E, 0x32, 0x1, 0x19, 0xFE, 0xF6, 0x16, 0x4F, 0x5F, 0x61, 0x55, 0x22, 0x46, 0x93, 0x4B, 0x2F, 0xA0, 0xBD, 0x96, 0x94, 0x2B, 0x1, 0x8, 0x9D, 0x33, 0x14, 0xD4, 0xBC, 0xA1, 0x3, 0xE0, 0x51, 0x78, 0x84, 0x7E, 0xFE, 0xFD, 0x28, 0x1, 0x12, 0xAF, 0x1, 0x0, 0x9A, 0x9E, 0xFC, 0x28, 0x1, 0x11, 0xBC, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x4, 0x7F, 0x6, 0x1F, 0x0, 0xA, 0x0, 0x0, 0x33, 0x35, 0x21, 0x1, 0x5, 0x37, 0x25, 0x13, 0x7, 0x3, 0x1, 0x50, 0x1, 0x8D, 0x1, 0x3D, 0xFE, 0xEB, 0x32, 0x1, 0x72, 0xD6, 0x33, 0xA0, 0xFE, 0xA6, 0x94, 0x4, 0x9A, 0x9F, 0xBC, 0xD4, 0xFE, 0x8F, 0xBC, 0x1, 0x15, 0xFA, 0xF9, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x7F, 0x6, 0xB, 0x0, 0xA, 0x0, 0x0, 0x5, 0x25, 0x27, 0x5, 0x1, 0x21, 0x35, 0x21, 0x1, 0x13, 0x17, 0x3, 0xA9, 0xFE, 0x8E, 0x32, 0x1, 0x15, 0xFE, 0xC3, 0xFE, 0x73, 0x2, 0x2, 0x1, 0x5A, 0xA0, 0x33, 0x14, 0xD4, 0xBC, 0x9F, 0x4, 0x9A, 0x94, 0xFA, 0xF9, 0x1, 0x15, 0xBC, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x6C, 0x6, 0x0, 0x0, 0xB, 0x0, 0x0, 0x25, 0x13, 0x1, 0x27, 0x1, 0x33, 0x1, 0x1, 0x25, 0x37, 0x5, 0x3, 0x3, 0x56, 0x53, 0xFD, 0x20, 0x79, 0x1, 0x80, 0x9A, 0xFE, 0x97, 0x2, 0x5B, 0xFE, 0xCD, 0xA8, 0x1, 0x9B, 0x6E, 0x61, 0x1, 0x35, 0xFE, 0x56, 0x86, 0x5, 0x8E, 0xFA, 0xBC, 0x1, 0x5D, 0x53, 0x62, 0x6F, 0xFE, 0x64, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x6C, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x25, 0x13, 0x1, 0x27, 0x1, 0x33, 0x3, 0x1, 0x25, 0x37, 0x5, 0x3, 0x3, 0x56, 0x53, 0xFD, 0x20, 0x79, 0x1, 0x8, 0x9B, 0xF2, 0x2, 0x5B, 0xFE, 0xCD, 0xA8, 0x1, 0x9B, 0x6E, 0x61, 0x1, 0x35, 0xFE, 0x56, 0x86, 0x3, 0xC8, 0xFC, 0x82, 0x1, 0x5D, 0x53, 0x62, 0x6F, 0xFE, 0x64, 0xFF, 0xFF, 0x0, 0x21, 0x0, 0x0, 0x4, 0x7A, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x53, 0x0, 0x0, 0x27, 0x7, 0xA4, 0xFF, 0x91, 0x0, 0xD5, 0x0, 0x6, 0x7, 0xA4, 0x91, 0xA8, 0xFF, 0xFF, 0x0, 0x21, 0x0, 0x0, 0x2, 0xBF, 0x6, 0x0, 0x0, 0x26, 0x0, 0x51, 0x6A, 0x0, 0x0, 0x27, 0x7, 0xA4, 0xFF, 0x91, 0x0, 0xD5, 0x0, 0x6, 0x7, 0xA4, 0x91, 0xA8, 0x0, 0x1, 0x0, 0x5, 0x0, 0x0, 0x4, 0xA8, 0x5, 0xB0, 0x0, 0x19, 0x0, 0x0, 0x21, 0x11, 0x27, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x17, 0x11, 0x33, 0x11, 0x33, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x23, 0x27, 0x11, 0x21, 0x15, 0x1, 0x17, 0x10, 0x29, 0x38, 0xA1, 0x87, 0x67, 0x24, 0xFC, 0x1, 0x29, 0x39, 0xA1, 0x89, 0x66, 0x15, 0x2, 0x95, 0x2, 0xE9, 0x1, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x3, 0x2, 0x24, 0xFD, 0x86, 0x39, 0x2E, 0xC, 0x6F, 0x91, 0x1, 0xFE, 0x38, 0xCA, 0xFF, 0xFF, 0x0, 0x21, 0x0, 0x0, 0x5, 0x15, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x35, 0x41, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x91, 0x0, 0xFF, 0x0, 0x2, 0x0, 0x95, 0xFE, 0x4B, 0x4, 0xDE, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x21, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x3, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x16, 0x4, 0x15, 0x14, 0x6, 0x7, 0x1, 0x15, 0x21, 0x1, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x1, 0x91, 0x1, 0x4, 0x88, 0x89, 0x80, 0x8D, 0x26, 0x3E, 0x44, 0x9D, 0xBF, 0x2, 0xD, 0xF5, 0x1, 0xB, 0x8E, 0x7D, 0x1, 0x47, 0xFE, 0xF2, 0xFE, 0xDC, 0xFE, 0xE5, 0x57, 0x40, 0x2A, 0x21, 0x4, 0xE5, 0xFE, 0x17, 0x89, 0x68, 0x70, 0x87, 0x1, 0xF9, 0x77, 0x11, 0xC0, 0xB6, 0x5, 0xEF, 0x3, 0xE0, 0xD4, 0x92, 0xC6, 0x34, 0xFD, 0xA0, 0xD, 0x2, 0x31, 0xFD, 0x90, 0x62, 0x45, 0x8, 0x0, 0x4, 0x0, 0x5B, 0xFF, 0x76, 0x3, 0xFC, 0x4, 0xBC, 0x0, 0x2, 0x0, 0x9, 0x0, 0xE, 0x0, 0x32, 0x0, 0x0, 0x1, 0x35, 0x7, 0x3, 0x32, 0x36, 0x37, 0x35, 0x23, 0x3, 0x27, 0x14, 0x17, 0x13, 0x6, 0x13, 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, 0x16, 0x15, 0x11, 0x14, 0x17, 0x15, 0x23, 0x26, 0x27, 0x6, 0x2, 0xE0, 0x19, 0xCE, 0x54, 0x7A, 0x19, 0x63, 0xA3, 0x8D, 0x1B, 0x7F, 0x9A, 0x7E, 0x29, 0x26, 0x3D, 0x90, 0x52, 0xA6, 0xFA, 0xE2, 0x6C, 0x30, 0x51, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0x74, 0x5A, 0x48, 0x90, 0x6A, 0x67, 0x29, 0xF8, 0x12, 0xA, 0x73, 0x2, 0x95, 0x32, 0x32, 0xFE, 0x1A, 0x51, 0x31, 0xCC, 0xFE, 0xB4, 0x97, 0x34, 0x26, 0x1, 0x3, 0x25, 0xFE, 0x20, 0x7, 0x7D, 0xA7, 0x5B, 0xB8, 0xAA, 0xB8, 0x3, 0xDB, 0x26, 0x56, 0x3E, 0x80, 0xCC, 0x25, 0x93, 0xD8, 0x62, 0xA8, 0xFE, 0x20, 0x92, 0x57, 0x11, 0x25, 0x41, 0x7A, 0x0, 0x2, 0x0, 0x8, 0xFF, 0x76, 0x3, 0x34, 0x5, 0x41, 0x0, 0x2, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x37, 0x23, 0x13, 0x22, 0x27, 0x7, 0x23, 0x13, 0x27, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x37, 0x33, 0x1, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x1, 0xAD, 0x5E, 0x5E, 0x26, 0x8D, 0x47, 0x62, 0x91, 0xB2, 0x3, 0xB3, 0xB3, 0xF2, 0xB6, 0x40, 0x91, 0xFE, 0x79, 0x40, 0x31, 0x2A, 0x2B, 0x46, 0x2, 0xC7, 0xC0, 0xFC, 0x65, 0x51, 0xC7, 0x1, 0x6B, 0x2A, 0x2, 0x7C, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0x82, 0xFC, 0xE4, 0x76, 0x49, 0x2B, 0xA, 0xBC, 0x18, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x99, 0x5, 0xDC, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x4, 0x8C, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0x99, 0x4, 0xBE, 0x6, 0x0, 0x0, 0x26, 0x0, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x3, 0x6E, 0x0, 0x0, 0x0, 0x1, 0x0, 0x95, 0xFE, 0x9A, 0x5, 0x4C, 0x5, 0xB0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x1, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x1, 0x33, 0x5, 0x4C, 0xFB, 0x65, 0xFE, 0x4B, 0xA6, 0xFC, 0xFC, 0x8D, 0x1, 0xAA, 0x1, 0x32, 0xFD, 0xE3, 0x1, 0xAD, 0xC2, 0xFE, 0x9A, 0x1, 0x66, 0x2, 0x76, 0xB0, 0xFE, 0x3A, 0x5, 0xB0, 0xFD, 0x54, 0xAE, 0x1, 0xFE, 0xFD, 0x7C, 0xFD, 0x9E, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0xBE, 0x4, 0x7D, 0x6, 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x1, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x1, 0x33, 0x4, 0x7D, 0xF2, 0x6D, 0xFE, 0xBF, 0x6D, 0xF3, 0xF3, 0x4D, 0x1, 0x2B, 0x1, 0x24, 0xFE, 0x6D, 0x1, 0x34, 0xD0, 0xFE, 0xBE, 0x1, 0x42, 0x1, 0xD2, 0x70, 0xFE, 0x9E, 0x6, 0x0, 0xFC, 0x8A, 0x60, 0x1, 0x50, 0xFE, 0x3E, 0xFE, 0x4B, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x9A, 0x4, 0x8C, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x4, 0x8C, 0xFB, 0xFC, 0xBF, 0x2, 0xF2, 0xFD, 0x14, 0x4, 0x1E, 0xFD, 0xE, 0x3, 0xA, 0xFE, 0x9A, 0x1, 0x66, 0xA4, 0x4, 0x41, 0xCB, 0xA0, 0xFB, 0xBA, 0x0, 0x1, 0x0, 0x52, 0xFE, 0xBE, 0x3, 0xD9, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x3, 0xD9, 0xF3, 0xFD, 0x6C, 0x2, 0x26, 0xFD, 0xE5, 0x3, 0x4E, 0xFD, 0xD6, 0x2, 0x58, 0xFE, 0xBE, 0x1, 0x42, 0x9F, 0x2, 0xD7, 0xC4, 0x99, 0xFD, 0x22, 0x0, 0x2, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xFD, 0x5, 0xC4, 0x0, 0xB, 0x0, 0x23, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x5, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x32, 0x17, 0x37, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0xDE, 0xB8, 0x5E, 0x5F, 0xB7, 0xD3, 0xA8, 0xB0, 0x3, 0xEA, 0x51, 0x5A, 0x9E, 0x52, 0x9F, 0xEC, 0xFE, 0xCE, 0xFE, 0xC1, 0x1, 0x49, 0x1, 0x28, 0xC1, 0x91, 0xA, 0xBD, 0x4F, 0x3A, 0x19, 0x26, 0xBC, 0x63, 0x3, 0x88, 0x4D, 0xFE, 0xDD, 0xC8, 0x61, 0xD6, 0xFE, 0xEA, 0xA3, 0x2D, 0x67, 0x67, 0x1, 0x92, 0x1, 0x2A, 0x61, 0x1, 0x32, 0x1, 0x89, 0x3D, 0x29, 0xFB, 0xAB, 0x5F, 0x3F, 0x9, 0x0, 0x1, 0x0, 0x95, 0xFE, 0x4B, 0x6, 0x6B, 0x5, 0xB0, 0x0, 0x17, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x35, 0x11, 0x13, 0x1, 0x23, 0x1, 0x13, 0x11, 0x23, 0x11, 0x21, 0x1, 0x1, 0x21, 0x11, 0x14, 0x6, 0x5, 0x6, 0x47, 0x38, 0xE, 0x32, 0x2D, 0x7B, 0x18, 0xFE, 0x53, 0xB5, 0xFE, 0x53, 0x19, 0xFC, 0x1, 0x47, 0x1, 0xA4, 0x1, 0xA3, 0x1, 0x48, 0xC1, 0xFE, 0x4B, 0x11, 0xCD, 0xD, 0xA5, 0x2, 0x1F, 0x2, 0x80, 0xFB, 0xA0, 0x4, 0x61, 0xFD, 0x7F, 0xFE, 0x20, 0x5, 0xB0, 0xFB, 0xA4, 0x4, 0x5C, 0xFA, 0x11, 0xB6, 0xC0, 0x0, 0x2, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x5, 0xB0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x1, 0x13, 0x21, 0x13, 0x1, 0x21, 0x13, 0x21, 0x13, 0x21, 0x1, 0x2, 0xAA, 0xD3, 0xFE, 0x5A, 0x61, 0xFD, 0xDA, 0x1, 0x8, 0x76, 0x2, 0x34, 0x77, 0x1, 0x8, 0xFD, 0xD8, 0x1, 0x34, 0x2, 0x5D, 0xFC, 0x6F, 0x5, 0xB0, 0xFE, 0xAC, 0x1, 0x54, 0xFA, 0x50, 0x0, 0x2, 0x0, 0x11, 0xFF, 0xEC, 0x5, 0xA7, 0x5, 0xC4, 0x0, 0x17, 0x0, 0x23, 0x0, 0x0, 0x5, 0x22, 0x27, 0x7, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x25, 0x32, 0x12, 0x35, 0x35, 0x34, 0x2, 0x23, 0x22, 0x7, 0x11, 0x16, 0x3, 0x36, 0xC5, 0x8C, 0xA, 0xBE, 0x4F, 0x39, 0x1B, 0x24, 0x45, 0x50, 0x5A, 0x9E, 0x52, 0x9F, 0xEC, 0x1, 0x32, 0x1, 0x3F, 0xFE, 0xB7, 0xFE, 0xD1, 0xD4, 0xA7, 0xB0, 0xCB, 0xB8, 0x5E, 0x61, 0x14, 0x3D, 0x29, 0x4, 0x55, 0x5F, 0x3F, 0x9, 0xAD, 0x2D, 0x67, 0x67, 0xFE, 0x6E, 0xFE, 0xD7, 0x61, 0xFE, 0xCD, 0xFE, 0x77, 0xD0, 0x1, 0x24, 0xC8, 0x61, 0xD5, 0x1, 0x16, 0x63, 0xFC, 0x78, 0x4D, 0x0, 0x1, 0x0, 0x17, 0x0, 0x0, 0x4, 0xA4, 0x4, 0x4D, 0x0, 0x11, 0x0, 0x0, 0x21, 0x1, 0x33, 0x13, 0x17, 0x37, 0x13, 0x36, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x1, 0x1, 0x91, 0xFE, 0x86, 0xFB, 0xD7, 0x12, 0x13, 0x83, 0x24, 0x86, 0x7C, 0x86, 0x67, 0x4E, 0x3D, 0x31, 0x4F, 0x2D, 0xFE, 0xF8, 0x4, 0x3A, 0xFD, 0x3B, 0x5B, 0x5B, 0x1, 0xB3, 0x7C, 0xA9, 0x54, 0xA4, 0x24, 0x81, 0xFD, 0x8, 0x0, 0x1, 0x0, 0x30, 0x0, 0x0, 0x7, 0xF4, 0x5, 0xC4, 0x0, 0x1B, 0x0, 0x0, 0x21, 0x1, 0x33, 0x13, 0x17, 0x37, 0x1, 0x33, 0x1, 0x17, 0x37, 0x13, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, 0x3, 0x23, 0x1, 0x1, 0x1, 0x82, 0xFE, 0xAE, 0xFC, 0xDC, 0x4, 0x7, 0x1, 0x12, 0xD3, 0x1, 0xC, 0x9, 0x4, 0x96, 0x24, 0x92, 0x7F, 0x56, 0x88, 0x3A, 0x67, 0x4E, 0x3D, 0x27, 0x34, 0x17, 0xFB, 0xF2, 0xFE, 0xEC, 0xFE, 0xE4, 0x5, 0xB0, 0xFB, 0xD5, 0x28, 0x2A, 0x4, 0x29, 0xFB, 0xD5, 0x30, 0x32, 0x2, 0xDE, 0xAD, 0xB2, 0x4F, 0x34, 0xA4, 0x40, 0x41, 0x62, 0xFB, 0xC6, 0x4, 0x26, 0xFB, 0xDA, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x6, 0xAA, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x21, 0x1, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x13, 0x17, 0x37, 0x13, 0x36, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x3, 0x23, 0x3, 0x27, 0x7, 0x3, 0x1, 0x4A, 0xFE, 0xD8, 0xED, 0xA4, 0x8, 0xB, 0xD5, 0xB8, 0xD6, 0xD, 0xC, 0x58, 0x2A, 0x91, 0x68, 0x7E, 0x6F, 0x4D, 0x38, 0x35, 0x5B, 0x28, 0xC8, 0xC8, 0xCF, 0x18, 0x17, 0xCE, 0x4, 0x3A, 0xFD, 0x3C, 0x3F, 0x3D, 0x2, 0xC6, 0xFD, 0x3B, 0x4B, 0x52, 0x1, 0x8B, 0xB5, 0x92, 0x54, 0xA2, 0x24, 0x94, 0xFD, 0x18, 0x2, 0x9C, 0x6E, 0x6D, 0xFD, 0x63, 0x0, 0x2, 0x0, 0x31, 0x0, 0x0, 0x3, 0xF4, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x6, 0x13, 0x3, 0x7, 0x27, 0x37, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x17, 0x17, 0x37, 0x13, 0x33, 0x1, 0x1, 0x6C, 0x48, 0x28, 0x23, 0x8, 0x9, 0x47, 0xB9, 0x72, 0x43, 0x7A, 0x4, 0x4C, 0x9F, 0x82, 0x77, 0x78, 0x57, 0x72, 0x50, 0x18, 0x1A, 0xD5, 0xFB, 0xFE, 0x7E, 0x3, 0x11, 0x31, 0x30, 0x28, 0x25, 0x25, 0xFC, 0xB0, 0x2, 0x1, 0x3B, 0xA5, 0x3C, 0xA, 0xD3, 0xCA, 0x77, 0x56, 0x54, 0x7B, 0x48, 0xF5, 0x72, 0x72, 0x2, 0xC5, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x4, 0x50, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x4, 0x50, 0xFD, 0x41, 0xFC, 0xFC, 0x2, 0xBF, 0x2, 0x88, 0xFD, 0x78, 0x5, 0xB0, 0xFD, 0xA2, 0x0, 0x1, 0x0, 0x7A, 0x0, 0x0, 0x3, 0x52, 0x4, 0x3A, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x3, 0x52, 0xFE, 0x1B, 0xF3, 0xF3, 0x1, 0xE5, 0x1, 0xB5, 0xFE, 0x4B, 0x4, 0x3A, 0xFE, 0x3D, 0x0, 0x2, 0x0, 0x49, 0xFF, 0xEB, 0x5, 0x8A, 0x4, 0x41, 0x0, 0x19, 0x0, 0x22, 0x0, 0x0, 0x5, 0x22, 0x24, 0x2, 0x35, 0x34, 0x12, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x15, 0x14, 0x2, 0x4, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x15, 0x2, 0xE6, 0xF7, 0xFE, 0xDA, 0x80, 0x7F, 0x72, 0x97, 0x4D, 0x48, 0x85, 0xA9, 0x9F, 0x7B, 0x9E, 0xE9, 0x7F, 0x82, 0xFE, 0xD8, 0x83, 0xB0, 0x8A, 0x85, 0x7E, 0x37, 0x15, 0xAA, 0x1, 0x12, 0x9D, 0xA3, 0x1, 0x8, 0x52, 0x93, 0x4B, 0xC3, 0x5C, 0x87, 0xE2, 0x22, 0x2, 0x84, 0x74, 0x90, 0x96, 0xF5, 0x8F, 0x94, 0xFE, 0xFB, 0xA3, 0xCD, 0x1E, 0xD6, 0x7B, 0x8A, 0xCD, 0x3E, 0x0, 0x2, 0x0, 0x54, 0xFF, 0xEC, 0x5, 0x5A, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x25, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x26, 0x26, 0x1, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x0, 0x35, 0x35, 0x10, 0x0, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x17, 0x16, 0x16, 0x33, 0x32, 0x37, 0x2, 0x3D, 0x64, 0x7A, 0x12, 0x1, 0xCE, 0x4, 0x61, 0x2, 0xA4, 0x44, 0x95, 0x90, 0x47, 0x86, 0xCB, 0xF1, 0xFE, 0xEC, 0x1, 0x1B, 0xCE, 0xEC, 0xE3, 0xFD, 0x3D, 0xA, 0x95, 0x80, 0xA7, 0x68, 0x88, 0x1A, 0x39, 0x26, 0x43, 0x20, 0x3, 0x8B, 0x8C, 0x7C, 0x12, 0x5F, 0x97, 0xFD, 0x21, 0xC0, 0x73, 0x73, 0x1, 0x2C, 0xDF, 0x29, 0x1, 0x1, 0x1, 0x2D, 0xFE, 0xD4, 0xEA, 0x67, 0x7D, 0xA5, 0x86, 0x23, 0x44, 0x32, 0x76, 0x0, 0x1, 0x0, 0x28, 0xFF, 0xEC, 0x2, 0x60, 0x6, 0x15, 0x0, 0x17, 0x0, 0x0, 0x21, 0x27, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x1, 0x78, 0x6, 0x55, 0x9F, 0x31, 0x25, 0x2, 0x32, 0x30, 0xA9, 0x39, 0x5D, 0x41, 0x23, 0x1D, 0x39, 0x43, 0x7E, 0xD6, 0x79, 0x8D, 0xD, 0xE5, 0x8, 0x80, 0x3, 0x80, 0x56, 0x3E, 0x7, 0xA3, 0xF, 0x8D, 0xB2, 0xFB, 0x2A, 0x0, 0x3, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x1E, 0x0, 0x2B, 0x0, 0x0, 0x13, 0x34, 0x0, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x23, 0x22, 0x0, 0x27, 0x37, 0x14, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x50, 0x1, 0xA, 0xEC, 0xEF, 0x1, 0x9, 0xFE, 0xF7, 0xED, 0xEB, 0xFE, 0xF7, 0x4, 0xF2, 0x10, 0x1C, 0x87, 0x54, 0x53, 0x84, 0x1C, 0xF, 0x7C, 0x89, 0x87, 0x7D, 0x1, 0x6, 0x17, 0x64, 0x46, 0x34, 0x33, 0x4A, 0x3D, 0x2C, 0x2, 0x27, 0xEC, 0x1, 0x3B, 0xFE, 0xC5, 0xEC, 0x15, 0xEB, 0xFE, 0xC5, 0x1, 0x33, 0xE6, 0xD, 0x4C, 0x3F, 0x4D, 0x63, 0x62, 0x4C, 0x3F, 0x5F, 0x8F, 0xD5, 0xD5, 0x8F, 0xFE, 0x88, 0x1, 0x11, 0x69, 0x37, 0x49, 0x49, 0x37, 0x30, 0x43, 0x7, 0x0, 0x1, 0x0, 0x56, 0x0, 0x0, 0x3, 0x97, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x33, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x56, 0x2, 0x4E, 0xFE, 0x9, 0x1, 0xF7, 0xFD, 0xB2, 0x3, 0x41, 0xC1, 0xE5, 0xC2, 0x1, 0x11, 0xC1, 0xFB, 0xC6, 0xFF, 0xFF, 0x0, 0x29, 0xFD, 0xF5, 0x1, 0x92, 0x3, 0x96, 0x0, 0x7, 0x1, 0x64, 0x0, 0x7, 0xFC, 0xA9, 0x0, 0x1, 0x0, 0x28, 0x2, 0x8C, 0x3, 0x25, 0x5, 0xD5, 0x0, 0x8, 0x0, 0x0, 0x1, 0x1, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x1, 0x1, 0x4D, 0xFE, 0xDB, 0xD4, 0xA3, 0x9, 0xA, 0xA0, 0xD3, 0xFE, 0xDE, 0x2, 0x8C, 0x3, 0x49, 0xFD, 0xCB, 0x32, 0x32, 0x2, 0x35, 0xFC, 0xB7, 0x0, 0x1, 0x0, 0x4A, 0xFE, 0x4B, 0x4, 0x8A, 0x5, 0xC4, 0x0, 0x2E, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x0, 0x3, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x24, 0x24, 0x35, 0x34, 0x24, 0x33, 0x32, 0x0, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x4, 0x23, 0x27, 0x16, 0x33, 0x32, 0x37, 0x4, 0x24, 0x3D, 0x78, 0xCD, 0xFE, 0xA8, 0xAA, 0x56, 0xFD, 0xB8, 0x85, 0x84, 0x85, 0x72, 0xFE, 0x60, 0xFE, 0xFD, 0x1, 0x1D, 0xE7, 0xF7, 0x1, 0x16, 0xFC, 0x86, 0x8E, 0x85, 0x7F, 0x98, 0x99, 0xF7, 0xED, 0xFE, 0xE7, 0xED, 0x50, 0xA7, 0xC0, 0x47, 0x42, 0xFE, 0x66, 0x1B, 0x1, 0x61, 0x1, 0xC, 0x6D, 0x93, 0x8A, 0x7A, 0x6C, 0x58, 0x57, 0x69, 0x81, 0xCA, 0xAE, 0xB0, 0xE3, 0xFE, 0xF9, 0xB6, 0x6B, 0x89, 0x73, 0x56, 0x52, 0x6B, 0x2D, 0x48, 0xD8, 0xAE, 0xB8, 0xD6, 0x4, 0xD7, 0x10, 0x0, 0x1, 0x0, 0x4F, 0xFE, 0x4B, 0x4, 0x8C, 0x5, 0xB0, 0x0, 0x16, 0x0, 0x0, 0x1, 0x22, 0x2E, 0x2, 0x23, 0x23, 0x27, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x1E, 0x3, 0x33, 0x32, 0x37, 0x15, 0x6, 0x3, 0xE3, 0x7B, 0xB5, 0xAA, 0xCB, 0x90, 0x5C, 0x3, 0x2, 0xF3, 0xFD, 0x14, 0x4, 0x1E, 0xFD, 0x1, 0x7C, 0xB3, 0x8D, 0x84, 0x4E, 0x43, 0x46, 0x42, 0xFE, 0x4B, 0x84, 0xAD, 0x84, 0xA3, 0x4, 0x42, 0xCB, 0x9F, 0xFB, 0xA5, 0x1F, 0x86, 0x92, 0x66, 0x12, 0xC3, 0x1D, 0x0, 0x2, 0xFC, 0xB4, 0x4, 0xA8, 0xFE, 0xBC, 0x7, 0xC7, 0x0, 0x18, 0x0, 0x22, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x36, 0x36, 0x37, 0x36, 0x36, 0x37, 0x33, 0x14, 0x6, 0x7, 0x6, 0x6, 0x7, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x34, 0x23, 0x22, 0x15, 0x15, 0x14, 0x16, 0xFD, 0xB9, 0x7F, 0x86, 0x1, 0x83, 0x70, 0x59, 0x20, 0x2, 0x76, 0x56, 0x67, 0x3F, 0x59, 0x10, 0x3D, 0x5F, 0x73, 0x79, 0x86, 0x7D, 0x73, 0x75, 0x73, 0x39, 0x4, 0xA8, 0xA3, 0x73, 0x27, 0xD0, 0xBF, 0x16, 0x13, 0x17, 0x13, 0x58, 0x43, 0x17, 0xE, 0x3B, 0x4A, 0x3A, 0x8F, 0x7A, 0x72, 0x99, 0x74, 0xA2, 0x8A, 0x8A, 0xB, 0x44, 0x53, 0x0, 0x3, 0xFC, 0xD1, 0x4, 0xB1, 0xFE, 0xC2, 0x6, 0xD9, 0x0, 0x6, 0x0, 0xD, 0x0, 0x19, 0x0, 0x0, 0x1, 0x15, 0x33, 0x32, 0x35, 0x34, 0x27, 0x7, 0x15, 0x33, 0x32, 0x35, 0x34, 0x27, 0x5, 0x11, 0x33, 0x32, 0x16, 0x14, 0x7, 0x16, 0x16, 0x15, 0x14, 0x23, 0xFD, 0x60, 0x5E, 0x5D, 0x5C, 0x5F, 0x80, 0x53, 0x4A, 0xFE, 0xE8, 0xEB, 0x6B, 0x83, 0x62, 0x3B, 0x3F, 0xF0, 0x6, 0x70, 0x76, 0x39, 0x3C, 0x1, 0xD6, 0x80, 0x42, 0x3B, 0x3, 0xE9, 0x2, 0x28, 0x4B, 0x9C, 0x20, 0xE, 0x4A, 0x2B, 0x9E, 0x0, 0x1, 0xFD, 0x3, 0x4, 0xB1, 0xFE, 0x7B, 0x6, 0xD9, 0x0, 0x5, 0x0, 0x0, 0x1, 0x15, 0x23, 0x11, 0x23, 0x11, 0xFE, 0x7B, 0xE9, 0x8F, 0x6, 0xD9, 0x74, 0xFE, 0x4C, 0x2, 0x28, 0x0, 0x2, 0xFC, 0x87, 0x4, 0xC, 0xFE, 0xE9, 0x6, 0xD9, 0x0, 0x5, 0x0, 0x14, 0x0, 0x0, 0x1, 0x6, 0x7, 0x33, 0x11, 0x23, 0x3, 0x15, 0x23, 0x11, 0x33, 0x36, 0x36, 0x37, 0x37, 0x21, 0x11, 0x33, 0x11, 0x23, 0x35, 0xFD, 0x93, 0x7, 0x33, 0xB4, 0x78, 0x8E, 0x80, 0x33, 0x2B, 0x2A, 0x3, 0x4, 0x1, 0x86, 0x4D, 0x7F, 0x6, 0x15, 0x97, 0x59, 0x1, 0x40, 0xFE, 0x4C, 0xA5, 0x1, 0x19, 0x2F, 0x6E, 0x5F, 0xB8, 0xFE, 0x4C, 0xFE, 0xE7, 0xA5, 0x0, 0x1, 0xFC, 0x16, 0x4, 0xB1, 0xFF, 0x5E, 0x6, 0xD9, 0x0, 0x15, 0x0, 0x0, 0x1, 0x35, 0x23, 0x7, 0x23, 0x13, 0x3, 0x33, 0x17, 0x33, 0x35, 0x33, 0x15, 0x33, 0x37, 0x33, 0x3, 0x13, 0x23, 0x27, 0x23, 0x15, 0xFD, 0x72, 0x41, 0x77, 0xA4, 0xB5, 0xA4, 0x9C, 0x7C, 0x33, 0x8F, 0x35, 0x7B, 0x9D, 0xA4, 0xB4, 0xA4, 0x77, 0x42, 0x4, 0xB1, 0xD2, 0xD2, 0x1, 0x20, 0x1, 0x8, 0xD8, 0xD8, 0xD8, 0xD8, 0xFE, 0xF8, 0xFE, 0xE0, 0xD2, 0xD2, 0x0, 0x1, 0xFC, 0xD1, 0x4, 0xA8, 0xFE, 0x9F, 0x6, 0xE0, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x33, 0x16, 0x33, 0x32, 0x35, 0x34, 0x23, 0x23, 0x35, 0x33, 0x32, 0x34, 0x23, 0x22, 0x7, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0xFD, 0xB4, 0x52, 0x91, 0x83, 0x8, 0x5C, 0x58, 0x55, 0x5C, 0x5C, 0x4C, 0x4F, 0x58, 0x3, 0x84, 0x83, 0x58, 0x64, 0x7E, 0x56, 0x5F, 0x87, 0x4, 0xA8, 0x53, 0x5A, 0x40, 0x43, 0x3F, 0x66, 0x74, 0x36, 0x4D, 0x58, 0x52, 0x4E, 0x50, 0x24, 0x21, 0x5E, 0x4E, 0x57, 0x0, 0x1, 0xFC, 0xD4, 0x4, 0xB1, 0xFE, 0xC8, 0x6, 0xD9, 0x0, 0xC, 0x0, 0x0, 0x1, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x37, 0x33, 0x3, 0x13, 0xFE, 0x20, 0x7D, 0x3F, 0x90, 0x90, 0x34, 0x80, 0x9F, 0xAA, 0xBB, 0x4, 0xB1, 0xD2, 0xD2, 0x2, 0x28, 0xD9, 0xD9, 0xFE, 0xF8, 0xFE, 0xE0, 0x0, 0x1, 0xFC, 0x9E, 0x4, 0xB1, 0xFE, 0xB2, 0x6, 0xD9, 0x0, 0xF, 0x0, 0x0, 0x1, 0x27, 0x37, 0x36, 0x36, 0x37, 0x37, 0x21, 0x11, 0x23, 0x11, 0x23, 0x7, 0x6, 0x6, 0x23, 0xFC, 0xA0, 0x2, 0x12, 0x31, 0x21, 0x5, 0xA, 0x1, 0xA1, 0x8F, 0x8E, 0x7, 0x9, 0x5E, 0x70, 0x4, 0xB1, 0x7D, 0x2, 0x6, 0x55, 0x61, 0xED, 0xFD, 0xD8, 0x1, 0xB4, 0x96, 0x92, 0x8C, 0x0, 0x1, 0xFC, 0x66, 0x4, 0xB1, 0xFF, 0xA, 0x6, 0xD8, 0x0, 0xC, 0x0, 0x0, 0x1, 0x3, 0x11, 0x23, 0x11, 0x33, 0x13, 0x13, 0x33, 0x11, 0x23, 0x11, 0x3, 0xFD, 0x81, 0x8B, 0x90, 0xB6, 0x9C, 0x9D, 0xB5, 0x8F, 0x8C, 0x4, 0xB1, 0x1, 0x4E, 0xFE, 0xB2, 0x2, 0x27, 0xFE, 0x8B, 0x1, 0x75, 0xFD, 0xD9, 0x1, 0x4F, 0xFE, 0xB1, 0x0, 0x1, 0xFC, 0xC1, 0x4, 0xB1, 0xFE, 0xAF, 0x6, 0xD9, 0x0, 0xB, 0x0, 0x0, 0x1, 0x35, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x11, 0xFE, 0x20, 0xD0, 0x8F, 0x8F, 0xD0, 0x8F, 0x4, 0xB1, 0xDB, 0xDB, 0x2, 0x28, 0xD9, 0xD9, 0xFD, 0xD8, 0xFF, 0xFF, 0xFC, 0xB1, 0x4, 0xA3, 0xFE, 0xBF, 0x6, 0xDF, 0x0, 0x6, 0x2, 0x17, 0xEF, 0x0, 0x0, 0x1, 0xFC, 0xC1, 0x4, 0xB1, 0xFE, 0xAF, 0x6, 0xD9, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0xFE, 0x20, 0xD0, 0x8F, 0x1, 0xEE, 0x4, 0xB1, 0x1, 0xB4, 0xFE, 0x4C, 0x2, 0x28, 0xFD, 0xD8, 0xFF, 0xFF, 0xFC, 0xBF, 0x3, 0xBC, 0xFE, 0xBD, 0x6, 0xE0, 0x0, 0xF, 0x2, 0x1A, 0xFB, 0x7D, 0xB, 0x84, 0xC0, 0x0, 0xFF, 0xFF, 0xFC, 0xC2, 0x4, 0xA3, 0xFE, 0xAD, 0x6, 0xDF, 0x0, 0x6, 0x2, 0x19, 0xF6, 0x0, 0x0, 0x1, 0xFC, 0xC5, 0x4, 0xB1, 0xFE, 0xAB, 0x6, 0xD9, 0x0, 0x7, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x21, 0xFE, 0xAB, 0xAC, 0x8F, 0xAB, 0x1, 0xE6, 0x6, 0x65, 0xFE, 0x4C, 0x1, 0xB4, 0x74, 0xFF, 0xFF, 0xFC, 0xD4, 0x4, 0xB1, 0xFE, 0xDC, 0x6, 0xDB, 0x0, 0x6, 0x2, 0x20, 0xEE, 0x0, 0x0, 0x1, 0xFC, 0xB1, 0x4, 0xE, 0xFE, 0xEF, 0x6, 0xD9, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0xFE, 0xEB, 0x7B, 0xFE, 0x41, 0x90, 0xD0, 0x8F, 0x4F, 0x4, 0xE, 0xA3, 0x2, 0x28, 0xFE, 0x4C, 0x1, 0xB4, 0xFE, 0x4C, 0x0, 0x1, 0xFC, 0xAB, 0x4, 0xB1, 0xFE, 0x7C, 0x6, 0xDA, 0x0, 0x11, 0x0, 0x0, 0x1, 0x23, 0x35, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x33, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x35, 0x33, 0xFE, 0x7C, 0x90, 0x2D, 0x2B, 0x6B, 0x7E, 0x90, 0x2E, 0x37, 0x26, 0x26, 0x90, 0x4, 0xB1, 0xB6, 0x9, 0x69, 0x70, 0xA3, 0xA3, 0x3C, 0x29, 0x9, 0xFE, 0x0, 0x1, 0xFC, 0x49, 0x4, 0xB1, 0xFF, 0x27, 0x6, 0xD9, 0x0, 0xB, 0x0, 0x0, 0x1, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0xFC, 0x49, 0x90, 0x97, 0x90, 0x97, 0x90, 0x4, 0xB1, 0x2, 0x28, 0xFE, 0x4C, 0x1, 0xB4, 0xFE, 0x4C, 0x1, 0xB4, 0xFD, 0xD8, 0x0, 0x1, 0xFC, 0x34, 0x4, 0xE, 0xFF, 0x60, 0x6, 0xD9, 0x0, 0xF, 0x0, 0x0, 0x3, 0x23, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0xA4, 0x7B, 0xFD, 0x53, 0x8F, 0x97, 0x90, 0x97, 0x90, 0x4F, 0x4, 0xE, 0xA3, 0x2, 0x28, 0xFE, 0x4C, 0x1, 0xB4, 0xFE, 0x4C, 0x1, 0xB4, 0xFE, 0x4C, 0x0, 0x3, 0xFC, 0xB1, 0x4, 0xA3, 0xFE, 0xBF, 0x6, 0xDF, 0x0, 0xA, 0x0, 0xF, 0x0, 0x14, 0x0, 0x0, 0x0, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x3, 0x22, 0x7, 0x33, 0x26, 0x3, 0x32, 0x37, 0x23, 0x16, 0xFD, 0x3F, 0x8E, 0x8E, 0x78, 0x7A, 0x8E, 0x8E, 0x7A, 0x5F, 0x13, 0xE5, 0x13, 0x5F, 0x64, 0x10, 0xE9, 0x10, 0x4, 0xA3, 0x9C, 0x87, 0x7D, 0x9C, 0x9C, 0x88, 0x7C, 0x9C, 0x1, 0xC8, 0x6B, 0x6B, 0xFE, 0xAC, 0x75, 0x75, 0x0, 0x1, 0xFC, 0x19, 0x4, 0xA3, 0xFF, 0x8E, 0x6, 0xD9, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x21, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x22, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x33, 0x6, 0x6, 0xFD, 0x1B, 0x85, 0x7D, 0x7E, 0x83, 0x2, 0x74, 0xAB, 0x90, 0xFE, 0xC6, 0x71, 0x33, 0x3E, 0x59, 0xA, 0x88, 0x3, 0x85, 0x4, 0xA3, 0xA4, 0x71, 0x12, 0x71, 0x9E, 0x74, 0xFE, 0x4C, 0x1, 0xB4, 0xA3, 0xA, 0x43, 0x5E, 0x4D, 0x50, 0x71, 0x0, 0x2, 0xFC, 0xBF, 0x4, 0xA8, 0xFE, 0xB1, 0x6, 0xE0, 0x0, 0x9, 0x0, 0x23, 0x0, 0x0, 0x1, 0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x33, 0x35, 0x34, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x17, 0xFD, 0x9B, 0x25, 0x41, 0xC, 0x53, 0x37, 0x35, 0xD3, 0xA, 0x6, 0x38, 0x63, 0x54, 0x63, 0xEF, 0x5F, 0x50, 0x58, 0x8A, 0x7D, 0x68, 0x60, 0x7C, 0x15, 0x5, 0x16, 0x26, 0x16, 0x50, 0x30, 0x20, 0x3C, 0x64, 0x1B, 0x22, 0x47, 0x5A, 0x4B, 0xA8, 0x4, 0x22, 0x55, 0x42, 0x6, 0x4A, 0x62, 0x63, 0x63, 0xE3, 0x49, 0x3C, 0x0, 0x2, 0xFC, 0xBF, 0x4, 0xA3, 0xFE, 0xB1, 0x6, 0xDF, 0x0, 0x5, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x7, 0x33, 0x35, 0x26, 0x13, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x21, 0x16, 0x33, 0x32, 0x37, 0xFD, 0xBE, 0x5E, 0xF, 0xD8, 0x5, 0x81, 0x1B, 0x6B, 0x52, 0x81, 0x8D, 0x8F, 0x71, 0x78, 0x7A, 0xFE, 0x9E, 0xB, 0x7A, 0x5A, 0x30, 0x6, 0x6B, 0x76, 0x9, 0x6D, 0xFE, 0xA0, 0x27, 0x41, 0x99, 0x72, 0x15, 0x85, 0x97, 0x99, 0x77, 0x37, 0x80, 0x3E, 0x0, 0x1, 0xFC, 0x9C, 0x4, 0xB1, 0xFE, 0xD5, 0x6, 0xD9, 0x0, 0xE, 0x0, 0x0, 0x1, 0x3, 0x3, 0x23, 0x13, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x13, 0xFE, 0x40, 0x87, 0x88, 0x95, 0xBA, 0x69, 0x86, 0x89, 0x89, 0x6A, 0xBA, 0x4, 0xB1, 0x1, 0xA, 0xFE, 0xF6, 0x1, 0x49, 0x74, 0x6B, 0x6B, 0x74, 0xFE, 0xB7, 0x0, 0x2, 0xFC, 0x93, 0x4, 0xA8, 0xFE, 0xDD, 0x7, 0xC2, 0x0, 0x18, 0x0, 0x21, 0x0, 0x0, 0x0, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x27, 0x27, 0x33, 0x17, 0x16, 0x17, 0x36, 0x37, 0x37, 0x33, 0x7, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x26, 0x35, 0x34, 0x26, 0x27, 0x6, 0x6, 0x15, 0x14, 0xFD, 0x4D, 0x8B, 0x5E, 0x3D, 0x82, 0x25, 0x23, 0x92, 0x1A, 0x1A, 0x5F, 0x5F, 0x19, 0x1B, 0x92, 0x20, 0x24, 0x86, 0x3D, 0x5E, 0x8B, 0x4, 0x3B, 0x2C, 0x2C, 0x3B, 0x4, 0xA8, 0x67, 0x55, 0x49, 0x66, 0x31, 0x76, 0x7D, 0x8B, 0x75, 0x63, 0x5A, 0x5A, 0x5F, 0x79, 0x84, 0x80, 0x7A, 0x31, 0x66, 0x49, 0x55, 0x67, 0x74, 0x53, 0x21, 0x41, 0x25, 0x25, 0x41, 0x21, 0x53, 0x0, 0x2, 0xFC, 0x84, 0x4, 0xB1, 0xFE, 0xE3, 0x7, 0xEC, 0x0, 0x11, 0x0, 0x18, 0x0, 0x0, 0x1, 0x14, 0x6, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x20, 0x1, 0x33, 0x32, 0x35, 0x34, 0x23, 0x23, 0xFE, 0xE3, 0x86, 0x6B, 0xFE, 0xF8, 0x66, 0x66, 0x8F, 0x9B, 0x9B, 0x69, 0x1, 0x1, 0xFE, 0x96, 0x79, 0x62, 0x62, 0x79, 0x5, 0x77, 0x64, 0x62, 0x2, 0x5F, 0x67, 0x75, 0x75, 0x67, 0xD6, 0xFE, 0xE6, 0x57, 0x54, 0x0, 0x2, 0xFC, 0x78, 0x4, 0xA3, 0xFF, 0x71, 0x6, 0xDF, 0x0, 0x12, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x22, 0x26, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x34, 0x23, 0x22, 0x15, 0x14, 0xFE, 0x6A, 0x6D, 0x8A, 0xD, 0x5F, 0x8F, 0x8F, 0x60, 0x10, 0x88, 0x6A, 0x7A, 0x8E, 0x8E, 0x79, 0x78, 0x79, 0x76, 0x4, 0xA3, 0x80, 0x69, 0xDB, 0x2, 0x28, 0xD9, 0x65, 0x7A, 0x9C, 0x88, 0x7C, 0x9C, 0x74, 0xAF, 0xA5, 0xB0, 0xA4, 0x0, 0x2, 0xFC, 0x7F, 0x4, 0xA8, 0xFF, 0x69, 0x6, 0xE0, 0x0, 0x9, 0x0, 0x29, 0x0, 0x0, 0x1, 0x32, 0x36, 0x37, 0x35, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x26, 0x27, 0x6, 0x23, 0x22, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x11, 0x33, 0x36, 0x37, 0x33, 0x35, 0x34, 0x23, 0x22, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x17, 0xFE, 0x53, 0x25, 0x41, 0xC, 0x53, 0x36, 0x35, 0xD2, 0xA, 0x6, 0x38, 0x63, 0x9A, 0x19, 0x6D, 0x8F, 0x8F, 0x7E, 0x35, 0xA8, 0x5C, 0x50, 0x58, 0x8A, 0x7E, 0x68, 0x60, 0x7C, 0x14, 0x5, 0x16, 0x26, 0x16, 0x50, 0x30, 0x20, 0x3C, 0x64, 0x1B, 0x22, 0x47, 0x81, 0x78, 0x2, 0x28, 0xFE, 0xC4, 0x5A, 0x2, 0x22, 0x55, 0x42, 0x6, 0x4A, 0x62, 0x63, 0x63, 0xE3, 0x4C, 0x39, 0x0, 0x2, 0xFC, 0x92, 0x4, 0xB1, 0xFE, 0xE1, 0x6, 0xD9, 0x0, 0x4, 0x0, 0x10, 0x0, 0x0, 0x1, 0x7, 0x33, 0x27, 0x27, 0x3, 0x35, 0x23, 0x7, 0x23, 0x13, 0x33, 0x13, 0x23, 0x27, 0x23, 0x15, 0xFD, 0xAB, 0x31, 0x7D, 0x32, 0xD, 0x38, 0x2B, 0x31, 0x92, 0xDF, 0x90, 0xE0, 0x92, 0x32, 0x2C, 0x6, 0x1D, 0x85, 0x85, 0x29, 0xFE, 0x6B, 0x83, 0x83, 0x2, 0x28, 0xFD, 0xD8, 0x83, 0x83, 0x0, 0x2, 0xFC, 0x6C, 0x4, 0xB1, 0xFF, 0x4, 0x6, 0xD9, 0x0, 0x2, 0x0, 0x19, 0x0, 0x0, 0x1, 0x37, 0x23, 0x3, 0x23, 0x37, 0x36, 0x37, 0x27, 0x21, 0x7, 0x16, 0x17, 0x17, 0x23, 0x35, 0x34, 0x26, 0x23, 0x15, 0x23, 0x35, 0x23, 0x22, 0x6, 0x15, 0xFD, 0xB8, 0x47, 0x8E, 0x7C, 0x89, 0x1, 0xD, 0xBF, 0x9E, 0x2, 0x3A, 0x9F, 0xC0, 0xD, 0x1, 0x89, 0x35, 0x4B, 0x89, 0xD, 0x39, 0x37, 0x5, 0xEC, 0x83, 0xFE, 0x42, 0x76, 0xB1, 0xF, 0xF2, 0xF2, 0xF, 0xB1, 0x76, 0x57, 0x49, 0x2C, 0xCC, 0xCC, 0x2A, 0x4B, 0x0, 0x2, 0xFB, 0xCB, 0x4, 0xB1, 0xFF, 0x5F, 0x6, 0xD9, 0x0, 0x2, 0x0, 0x20, 0x0, 0x0, 0x1, 0x37, 0x23, 0x7, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x27, 0x21, 0x7, 0x16, 0x17, 0x17, 0x23, 0x35, 0x34, 0x26, 0x23, 0x15, 0x23, 0x35, 0x23, 0x22, 0x6, 0x15, 0x15, 0x23, 0x35, 0x34, 0xFE, 0x13, 0x47, 0x8E, 0xEF, 0x83, 0x8F, 0x8F, 0x1, 0x39, 0x9D, 0x2, 0x3A, 0x9F, 0xC0, 0xD, 0x1, 0x89, 0x35, 0x4B, 0x89, 0xD, 0x39, 0x37, 0x89, 0x5, 0xEC, 0x83, 0xF2, 0xCC, 0x2, 0x28, 0xF0, 0xF0, 0xF2, 0xF, 0xB1, 0x76, 0x57, 0x49, 0x2C, 0xCC, 0xCC, 0x2A, 0x4B, 0x57, 0x57, 0x46, 0x0, 0x1, 0x0, 0x50, 0x2, 0x8C, 0x2, 0xF9, 0x5, 0xAB, 0x0, 0x5, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x2, 0xF9, 0xFE, 0x1C, 0xC5, 0x2, 0xA9, 0x5, 0x4, 0xFD, 0x88, 0x3, 0x1F, 0x0, 0x2, 0x0, 0x50, 0x2, 0x8C, 0x2, 0xF9, 0x5, 0xAB, 0x0, 0x5, 0x0, 0xF, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x2, 0xF9, 0xFE, 0x1C, 0xC5, 0x2, 0xA9, 0xFE, 0x81, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x5, 0x4, 0xFD, 0x88, 0x3, 0x1F, 0xFE, 0x3F, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x1, 0x0, 0x50, 0x2, 0x8B, 0x2, 0x33, 0x5, 0xBB, 0x0, 0x5, 0x0, 0x0, 0x1, 0x23, 0x11, 0x1, 0x17, 0x1, 0x1, 0x15, 0xC5, 0x1, 0x67, 0x7C, 0xFE, 0xE2, 0x2, 0x8B, 0x1, 0xCA, 0x1, 0x66, 0x7D, 0xFE, 0xE1, 0x0, 0x1, 0x0, 0x50, 0x2, 0x8B, 0x2, 0x33, 0x5, 0xBB, 0x0, 0x5, 0x0, 0x0, 0x1, 0x11, 0x1, 0x37, 0x1, 0x11, 0x1, 0x6E, 0xFE, 0xE2, 0x7D, 0x1, 0x66, 0x2, 0x8B, 0x1, 0x95, 0x1, 0x1E, 0x7D, 0xFE, 0x9A, 0xFE, 0x36, 0x0, 0x2, 0x0, 0x50, 0x2, 0x8B, 0x2, 0x71, 0x5, 0xBB, 0x0, 0x5, 0x0, 0x11, 0x0, 0x0, 0x1, 0x23, 0x11, 0x1, 0x17, 0x1, 0x17, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0x15, 0xC5, 0x1, 0x67, 0x7C, 0xFE, 0xE2, 0x48, 0x49, 0x40, 0x41, 0x4A, 0x4A, 0x41, 0x40, 0x49, 0x2, 0x8B, 0x1, 0xCA, 0x1, 0x66, 0x7D, 0xFE, 0xE1, 0x53, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0x0, 0x50, 0x2, 0x8B, 0x2, 0xE7, 0x5, 0xBB, 0x0, 0x5, 0x0, 0x11, 0x0, 0x0, 0x1, 0x11, 0x1, 0x37, 0x1, 0x11, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x2, 0x22, 0xFE, 0xE2, 0x7D, 0x1, 0x66, 0xFD, 0x69, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0x2, 0x8B, 0x1, 0x95, 0x1, 0x1E, 0x7D, 0xFE, 0x9A, 0xFE, 0x36, 0x1, 0x41, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x1, 0x0, 0x50, 0x2, 0x8C, 0x4, 0xC7, 0x5, 0xAB, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x4, 0xC7, 0xFE, 0x27, 0xC5, 0xFE, 0x27, 0x4, 0x77, 0x5, 0x4, 0xFD, 0x88, 0x2, 0x78, 0xA7, 0x0, 0x2, 0x0, 0x50, 0x2, 0x8C, 0x4, 0xC7, 0x5, 0xAB, 0x0, 0x7, 0x0, 0x11, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x4, 0xC7, 0xFE, 0x27, 0xC5, 0xFE, 0x27, 0x4, 0x77, 0xFE, 0x8C, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x5, 0x4, 0xFD, 0x88, 0x2, 0x78, 0xA7, 0xFE, 0x3F, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0x0, 0x50, 0x2, 0x7E, 0x4, 0x35, 0x5, 0xBA, 0x0, 0x9, 0x0, 0x22, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x6, 0x6, 0x2, 0xE7, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0xFE, 0x7B, 0xA5, 0x6D, 0x5B, 0x4D, 0x55, 0x4F, 0x44, 0x2, 0xA9, 0x98, 0x5B, 0x80, 0x37, 0x5D, 0x4C, 0x52, 0x4F, 0x46, 0x2, 0xA8, 0x3, 0xEF, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0xFE, 0xC3, 0x53, 0x93, 0x39, 0x58, 0x65, 0x71, 0xB7, 0xAA, 0x2C, 0x26, 0x94, 0x39, 0x58, 0x65, 0x71, 0xB7, 0xAA, 0x0, 0x1, 0x0, 0x50, 0x2, 0x7E, 0x4, 0x35, 0x5, 0xBA, 0x0, 0x18, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x6, 0x6, 0x1, 0x62, 0xA5, 0x6D, 0x5B, 0x4D, 0x55, 0x4F, 0x44, 0x2, 0xA9, 0x98, 0x5B, 0x80, 0x37, 0x5D, 0x4C, 0x52, 0x4F, 0x46, 0x2, 0xA8, 0x2, 0x7E, 0x53, 0x93, 0x39, 0x58, 0x65, 0x71, 0xB7, 0xAA, 0x2C, 0x26, 0x94, 0x39, 0x58, 0x65, 0x71, 0xB7, 0xAA, 0x0, 0x1, 0x0, 0x50, 0x2, 0x7E, 0x4, 0x35, 0x5, 0xBA, 0x0, 0x18, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x3, 0x23, 0x9A, 0xA9, 0x46, 0x4F, 0x50, 0x4E, 0x5D, 0x37, 0x80, 0x5B, 0x9A, 0xA8, 0x1, 0x45, 0x4E, 0x55, 0x4D, 0x5B, 0x6B, 0x2, 0x7E, 0xAE, 0xBC, 0x68, 0x65, 0x58, 0x39, 0x94, 0x26, 0x2C, 0xAC, 0xB9, 0x6D, 0x65, 0x58, 0x39, 0x93, 0x53, 0x0, 0x2, 0x0, 0x50, 0x2, 0x8C, 0x3, 0x5B, 0x5, 0xAB, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x21, 0x11, 0x7, 0x11, 0x21, 0x11, 0x2, 0x96, 0xFE, 0x7F, 0xC5, 0x3, 0xB, 0x3, 0x33, 0x1, 0xD1, 0xFE, 0x2F, 0xA7, 0x3, 0x1F, 0xFC, 0xE1, 0x0, 0x1, 0x0, 0x50, 0x2, 0x7B, 0x3, 0x92, 0x5, 0xBB, 0x0, 0x3, 0x0, 0x0, 0x13, 0x37, 0x1, 0x7, 0x50, 0x7D, 0x2, 0xC5, 0x7D, 0x5, 0x3E, 0x7D, 0xFD, 0x3D, 0x7D, 0xFF, 0xFF, 0x0, 0x50, 0x2, 0x7B, 0x3, 0x92, 0x5, 0xBB, 0x0, 0x47, 0x5, 0xA2, 0x3, 0xE2, 0x0, 0x0, 0xC0, 0x0, 0x40, 0x0, 0x0, 0x7, 0x0, 0x5F, 0xFD, 0xE7, 0x5, 0xAD, 0x7, 0xF9, 0x0, 0x8, 0x0, 0xC, 0x0, 0x10, 0x0, 0x1C, 0x0, 0x20, 0x0, 0x24, 0x0, 0x2D, 0x0, 0x0, 0x1, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x7, 0x15, 0x17, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x1, 0x21, 0x6, 0x22, 0x27, 0x21, 0x35, 0x21, 0x36, 0x32, 0x17, 0x21, 0x1, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x1, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0x2, 0x93, 0x4F, 0x46, 0x80, 0x4A, 0x2, 0xA5, 0xFD, 0xF4, 0x2, 0xB5, 0xFC, 0xAF, 0x4, 0x54, 0xFD, 0xB1, 0x20, 0xC0, 0x20, 0xFE, 0x1, 0x1, 0xFF, 0x20, 0xC0, 0x20, 0x2, 0x4F, 0xFE, 0xFD, 0xFC, 0xAF, 0x2, 0xA8, 0xFD, 0xF3, 0x1, 0x7F, 0x4E, 0x47, 0x7F, 0x48, 0x3, 0x6, 0x59, 0x4C, 0x57, 0xBF, 0x3E, 0x4D, 0x72, 0x82, 0x5F, 0x84, 0xB7, 0xB7, 0xFE, 0xC4, 0xBA, 0xBA, 0xFD, 0xFB, 0x49, 0x49, 0xB9, 0x4A, 0x4A, 0xFE, 0xB5, 0xBA, 0xBA, 0xFE, 0xC1, 0xB7, 0xB7, 0xFE, 0xC4, 0x4C, 0x56, 0xC0, 0x3E, 0x4D, 0x6F, 0x80, 0x64, 0x0, 0x1, 0x0, 0x47, 0xFE, 0xC8, 0x5, 0x73, 0xFF, 0x6D, 0x0, 0x3, 0x0, 0x0, 0x5, 0x15, 0x21, 0x35, 0x5, 0x73, 0xFA, 0xD4, 0x93, 0xA5, 0xA5, 0x0, 0x1, 0x0, 0x47, 0xFD, 0xEC, 0x5, 0x73, 0xFF, 0x6D, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x5, 0x27, 0x37, 0x23, 0x35, 0x21, 0x5, 0x73, 0xFC, 0xE7, 0xFE, 0x81, 0x50, 0x99, 0xDD, 0x5, 0x2C, 0xFE, 0xC8, 0xDC, 0x8A, 0x52, 0xA5, 0x0, 0x1, 0x0, 0x45, 0xFD, 0xED, 0x5, 0x71, 0xFF, 0x6D, 0x0, 0x7, 0x0, 0x0, 0x1, 0x25, 0x21, 0x35, 0x21, 0x15, 0x23, 0x17, 0x4, 0xD5, 0xFE, 0x83, 0xFC, 0xED, 0x5, 0x2C, 0xE3, 0x97, 0xFD, 0xED, 0xDB, 0xA5, 0xA5, 0x51, 0x0, 0x1, 0x0, 0x50, 0xFE, 0xC7, 0x1, 0x73, 0x0, 0xF4, 0x0, 0xB, 0x0, 0x0, 0x37, 0x35, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x35, 0x32, 0x35, 0x34, 0x50, 0x77, 0xAC, 0xAC, 0x77, 0x7D, 0x52, 0xA2, 0x89, 0x91, 0x90, 0x83, 0xA2, 0x71, 0x78, 0x0, 0x3, 0x0, 0x50, 0x0, 0x74, 0x4, 0x48, 0x6, 0x1F, 0x0, 0x3, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x1, 0x1, 0x27, 0x1, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x4, 0x48, 0xFC, 0x84, 0x7C, 0x3, 0x7D, 0xFC, 0xAE, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x2, 0x5D, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x5, 0xD4, 0xFA, 0xA0, 0x4B, 0x5, 0x60, 0xFE, 0x7, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0xFE, 0x80, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x1, 0x0, 0x37, 0xFF, 0xDD, 0x5, 0x16, 0x6, 0x1F, 0x0, 0xF, 0x0, 0x0, 0x25, 0x6, 0x7, 0x6, 0x24, 0x27, 0x26, 0x37, 0x17, 0x6, 0x17, 0x1, 0x17, 0x1, 0x16, 0x37, 0x2, 0xF4, 0x42, 0x80, 0x81, 0xFE, 0xD8, 0x29, 0x29, 0x42, 0x96, 0x3B, 0x5C, 0x3, 0x6B, 0x7B, 0xFC, 0x97, 0x7C, 0x3A, 0x6F, 0x6D, 0x13, 0x12, 0xB0, 0x79, 0x78, 0x70, 0x5B, 0x63, 0x55, 0x5, 0x44, 0x4B, 0xFA, 0xBD, 0x2C, 0x62, 0xFF, 0xFF, 0x0, 0x3B, 0xFF, 0xEC, 0x5, 0x1A, 0x6, 0x2E, 0x0, 0xF, 0x5, 0xAA, 0x5, 0x51, 0x6, 0xB, 0xC0, 0x0, 0x0, 0x3, 0x0, 0x50, 0x0, 0x5, 0x2, 0xA9, 0x4, 0x43, 0x0, 0x9, 0x0, 0x10, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x3, 0x23, 0x13, 0x3, 0x33, 0x1, 0x15, 0x3, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x96, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x9E, 0xA8, 0xF7, 0xF7, 0xA8, 0x1, 0x20, 0x82, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x3, 0xC6, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0xFD, 0x3, 0x1, 0x90, 0x1, 0x8F, 0xFE, 0x7A, 0x13, 0xFE, 0x65, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0x0, 0x50, 0x1, 0x28, 0x2, 0x7D, 0x3, 0xAF, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x17, 0x5, 0x27, 0x5, 0x17, 0x5, 0x27, 0x2, 0x4B, 0x32, 0xFE, 0x5, 0x32, 0x1, 0xFB, 0x32, 0xFE, 0x5, 0x32, 0x3, 0xAF, 0xBD, 0x88, 0xBD, 0xBA, 0xBD, 0x88, 0xBD, 0x0, 0x3, 0x0, 0x48, 0xFF, 0x2E, 0x3, 0xA4, 0x5, 0xBD, 0x0, 0x7, 0x0, 0x19, 0x0, 0x1F, 0x0, 0x0, 0x0, 0x6, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x13, 0x21, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x36, 0x37, 0x21, 0x13, 0x33, 0x6, 0x6, 0x7, 0x1, 0x14, 0x17, 0x13, 0x6, 0x6, 0x2, 0x92, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x2B, 0xFE, 0xFF, 0x4, 0xB3, 0xC5, 0x9A, 0x5F, 0x37, 0x26, 0x1, 0x1, 0x6, 0xD, 0xF2, 0x2, 0x81, 0x68, 0xFE, 0x82, 0x89, 0x8, 0x3D, 0x54, 0x5, 0x4, 0x4D, 0x4D, 0x6E, 0x4B, 0x4B, 0xF9, 0xBC, 0xC1, 0xC, 0xC8, 0xAC, 0x85, 0xC2, 0x5A, 0x32, 0x77, 0x4B, 0xFD, 0x67, 0x84, 0xAF, 0x28, 0x1, 0x68, 0xA5, 0x18, 0x1, 0xB7, 0x3B, 0x6F, 0x0, 0x1, 0x0, 0x57, 0xFF, 0xE2, 0x5, 0xD, 0x6, 0x72, 0x0, 0x23, 0x0, 0x0, 0x5, 0x27, 0x37, 0x3, 0x37, 0x13, 0x37, 0x3, 0x37, 0x13, 0x37, 0x3, 0x37, 0x17, 0x37, 0x3, 0x37, 0x17, 0x37, 0x17, 0x7, 0x37, 0x17, 0x5, 0x7, 0x37, 0x17, 0x5, 0x7, 0x25, 0x17, 0x5, 0x7, 0x25, 0x17, 0x5, 0x1, 0x42, 0xB0, 0x63, 0x9E, 0xAE, 0x70, 0x3E, 0x85, 0xAE, 0x56, 0x3F, 0x6C, 0xAE, 0x3D, 0x40, 0x52, 0xAE, 0x23, 0x74, 0xB0, 0x74, 0x7F, 0x2F, 0xFE, 0xD3, 0x40, 0xE0, 0x2F, 0xFE, 0x72, 0x3E, 0x1, 0x45, 0x2F, 0xFE, 0xC, 0x3E, 0x1, 0xA3, 0x2F, 0xFD, 0xAE, 0x1E, 0x66, 0xAC, 0x2, 0x50, 0x2F, 0xFE, 0x5D, 0x6C, 0x1, 0xF3, 0x2F, 0xFE, 0xBA, 0x6C, 0x1, 0x8D, 0x2F, 0xE0, 0x6D, 0x1, 0x2D, 0x2E, 0x7F, 0xC9, 0x66, 0xC9, 0x21, 0xAD, 0x4F, 0x6F, 0x3B, 0xAD, 0x69, 0x6B, 0x57, 0xAE, 0x86, 0x6C, 0x70, 0xAE, 0x9E, 0x0, 0x3, 0x0, 0x64, 0x2, 0xA, 0x3, 0x2A, 0x5, 0xF, 0x0, 0xB, 0x0, 0x17, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x13, 0x15, 0x21, 0x35, 0x64, 0x44, 0x3A, 0x3B, 0x44, 0x44, 0x3B, 0x3A, 0x44, 0x1, 0xC9, 0x44, 0x3A, 0x3B, 0x44, 0x44, 0x3B, 0x3A, 0x44, 0x9E, 0xFD, 0xF3, 0x4, 0x98, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x30, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0xFE, 0x67, 0xC3, 0xC3, 0x0, 0x3, 0x0, 0x46, 0x1, 0xFC, 0x3, 0x23, 0x4, 0xE3, 0x0, 0x7, 0x0, 0x11, 0x0, 0x26, 0x0, 0x0, 0x12, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x37, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x6, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0xDB, 0x7F, 0xBE, 0x7E, 0x7E, 0xBE, 0x7F, 0x6D, 0x3F, 0x64, 0x3E, 0x3E, 0x64, 0x3F, 0x1, 0x46, 0x95, 0x80, 0x60, 0x3F, 0x50, 0x48, 0x36, 0x27, 0x34, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x4, 0x69, 0x7A, 0x7A, 0xAC, 0x76, 0x76, 0x56, 0x2B, 0x44, 0x43, 0x2C, 0x2E, 0x44, 0x44, 0xFE, 0xD5, 0xC, 0x6F, 0x91, 0x2C, 0x2D, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x1, 0x0, 0x50, 0xFE, 0xDD, 0x3, 0xC, 0x2, 0xBE, 0x0, 0x3, 0x0, 0x0, 0x13, 0x37, 0x1, 0x7, 0x50, 0x7D, 0x2, 0x3F, 0x7E, 0x2, 0x75, 0x49, 0xFC, 0x67, 0x48, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0xDD, 0x3, 0xC, 0x2, 0xBE, 0x0, 0x47, 0x5, 0xB2, 0x3, 0x5C, 0x0, 0x0, 0xC0, 0x0, 0x40, 0x0, 0x0, 0x2, 0x0, 0x4A, 0x2, 0x6E, 0x3, 0x27, 0x4, 0xAC, 0x0, 0x9, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x5, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x1, 0x2C, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x1, 0x66, 0x95, 0x81, 0x5F, 0x40, 0x51, 0x47, 0x36, 0x26, 0x34, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x4, 0x30, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x74, 0xC, 0x6F, 0x91, 0x2D, 0x2C, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x2, 0x0, 0x4A, 0x1, 0xAF, 0x3, 0x27, 0x3, 0xF3, 0x0, 0x14, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x2, 0x92, 0x95, 0x81, 0x5F, 0x40, 0x51, 0x47, 0x36, 0x26, 0x34, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0xFE, 0xAB, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x3, 0xF3, 0xC, 0x6F, 0x91, 0x2D, 0x2C, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0xFE, 0x65, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0xFF, 0xFF, 0x0, 0x99, 0xFE, 0xF2, 0x3, 0x7B, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x61, 0xEB, 0x0, 0x0, 0x7, 0x7, 0xA4, 0x0, 0x4D, 0xFF, 0x74, 0xFF, 0xFF, 0x0, 0x42, 0xFE, 0xF2, 0x3, 0x23, 0x5, 0xB0, 0x0, 0x27, 0x0, 0x61, 0x1, 0xCD, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0xB2, 0xFF, 0x74, 0x0, 0x1, 0x0, 0x50, 0x2, 0x51, 0x1, 0xE9, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x0, 0x1, 0x15, 0x23, 0x11, 0x23, 0x11, 0x1, 0xE9, 0xD4, 0xC5, 0x5, 0xB0, 0xA7, 0xFD, 0x48, 0x3, 0x5F, 0x0, 0x1, 0x0, 0x50, 0x2, 0x51, 0x1, 0xE9, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x0, 0x13, 0x35, 0x21, 0x11, 0x23, 0x11, 0x50, 0x1, 0x99, 0xC4, 0x5, 0x9, 0xA7, 0xFC, 0xA1, 0x2, 0xB8, 0x0, 0x1, 0x0, 0x50, 0xFE, 0xF2, 0x1, 0xE9, 0x2, 0x51, 0x0, 0x5, 0x0, 0x0, 0x5, 0x15, 0x21, 0x11, 0x33, 0x11, 0x1, 0xE9, 0xFE, 0x67, 0xC5, 0x67, 0xA7, 0x3, 0x5F, 0xFD, 0x48, 0x0, 0x1, 0x0, 0x50, 0xFE, 0xF2, 0x1, 0xE9, 0x2, 0x51, 0x0, 0x5, 0x0, 0x0, 0x13, 0x35, 0x33, 0x11, 0x33, 0x11, 0x50, 0xD5, 0xC4, 0xFE, 0xF2, 0xA7, 0x2, 0xB8, 0xFC, 0xA1, 0x0, 0x1, 0x0, 0x57, 0x0, 0x6D, 0x4, 0x63, 0x4, 0xE, 0x0, 0xF, 0x0, 0x0, 0x1, 0x15, 0x21, 0x22, 0x24, 0x35, 0x34, 0x24, 0x33, 0x21, 0x15, 0x21, 0x6, 0x11, 0x10, 0x17, 0x4, 0x63, 0xFD, 0xD2, 0xCA, 0xFE, 0xEC, 0x1, 0x14, 0xCA, 0x2, 0x2E, 0xFD, 0xCB, 0xF3, 0xF3, 0x1, 0x30, 0xC3, 0xF0, 0xE0, 0xDF, 0xF2, 0xC3, 0x4, 0xFE, 0xF6, 0xFE, 0xF7, 0x4, 0x0, 0x1, 0x0, 0x4E, 0x0, 0x6D, 0x4, 0x5A, 0x4, 0xE, 0x0, 0xF, 0x0, 0x0, 0x37, 0x35, 0x21, 0x36, 0x11, 0x10, 0x27, 0x21, 0x35, 0x21, 0x32, 0x4, 0x15, 0x14, 0x4, 0x23, 0x4E, 0x2, 0x35, 0xF3, 0xF3, 0xFD, 0xCB, 0x2, 0x2E, 0xCB, 0x1, 0x13, 0xFE, 0xED, 0xCB, 0x6D, 0xC3, 0x4, 0x1, 0x9, 0x1, 0xA, 0x4, 0xC3, 0xF2, 0xDF, 0xE0, 0xF0, 0xFF, 0xFF, 0x0, 0x81, 0xFE, 0x31, 0x4, 0x3A, 0x6, 0x5F, 0x0, 0x26, 0x0, 0xD, 0x0, 0x0, 0x0, 0x7, 0x0, 0xD, 0x1, 0x97, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x28, 0xFE, 0x31, 0x3, 0xE9, 0x6, 0x5F, 0x0, 0x26, 0x0, 0xE, 0x0, 0x0, 0x0, 0x7, 0x0, 0xE, 0x1, 0x97, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE3, 0x4, 0x43, 0x3, 0xED, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x4, 0x62, 0x0, 0x27, 0x1, 0xD4, 0x6, 0x14, 0x4, 0x62, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x9E, 0x1, 0x50, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE4, 0x4, 0x43, 0x3, 0xED, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x1, 0x51, 0x0, 0x27, 0x1, 0xD4, 0x6, 0x14, 0x1, 0x51, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x9E, 0x4, 0x62, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE2, 0x4, 0x43, 0x3, 0xED, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x4, 0x62, 0x0, 0x27, 0x1, 0xD4, 0x6, 0x14, 0x1, 0x4F, 0x0, 0x27, 0x1, 0xD4, 0x6, 0x14, 0x4, 0x62, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x28, 0x1, 0x4F, 0xFF, 0xFF, 0x0, 0x43, 0xFF, 0xE2, 0x4, 0x5E, 0x3, 0xED, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x2, 0xD9, 0x0, 0x27, 0x1, 0xD4, 0x4, 0xAB, 0x4, 0x62, 0x0, 0x27, 0x1, 0xD4, 0x6, 0x2F, 0x2, 0xD9, 0x0, 0x27, 0x1, 0xD4, 0x4, 0xAB, 0x1, 0x4F, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xAB, 0x2, 0xD9, 0x0, 0x2, 0x0, 0x3D, 0xFF, 0xF4, 0x3, 0x9F, 0x5, 0xC5, 0x0, 0x18, 0x0, 0x22, 0x0, 0x0, 0x1, 0x23, 0x26, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x13, 0x14, 0x6, 0x22, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x2, 0x62, 0xE3, 0x1, 0x1C, 0x39, 0x59, 0x93, 0xE3, 0xCC, 0xB7, 0xFA, 0x2, 0xF3, 0x1, 0x77, 0x48, 0xBC, 0x66, 0x3A, 0x5D, 0x34, 0x16, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x1, 0xA6, 0x4D, 0x69, 0x38, 0x57, 0xC9, 0x87, 0xBE, 0xCC, 0xC3, 0xBC, 0x60, 0x55, 0xC9, 0x58, 0x88, 0x3E, 0x56, 0x8B, 0xFE, 0x43, 0x37, 0x4B, 0x4B, 0x37, 0x38, 0x4B, 0x4B, 0x0, 0x1, 0x0, 0x50, 0x3, 0xFF, 0x1, 0x71, 0x6, 0xCF, 0x0, 0x13, 0x0, 0x0, 0x13, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x35, 0x34, 0x36, 0x33, 0x17, 0x22, 0x6, 0x15, 0x14, 0x16, 0x15, 0x14, 0x6, 0x73, 0x23, 0x2E, 0x40, 0x59, 0x8A, 0x5B, 0x27, 0x2E, 0x40, 0x59, 0x8D, 0x3, 0xFF, 0x83, 0x37, 0x26, 0x51, 0x6F, 0x5F, 0x5C, 0x75, 0x82, 0x37, 0x27, 0x4F, 0x76, 0x59, 0x5D, 0x75, 0xFF, 0xFF, 0x0, 0x46, 0x2, 0x3B, 0x2, 0x1, 0x3, 0xD7, 0x0, 0x7, 0x1, 0x8B, 0xFF, 0xCD, 0xFD, 0xAD, 0xFF, 0xFF, 0x0, 0x5E, 0x2, 0xD7, 0x1, 0x79, 0x3, 0xE4, 0x0, 0x7, 0x0, 0x13, 0xFF, 0xD6, 0x2, 0xE3, 0xFF, 0xFF, 0x0, 0x57, 0xFE, 0xE1, 0x1, 0x97, 0x1, 0x14, 0x0, 0xF, 0x0, 0x11, 0x1, 0xB4, 0xFF, 0xCC, 0xC0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0x1, 0xE1, 0x1, 0x6B, 0x2, 0xEE, 0x0, 0x7, 0x0, 0x13, 0xFF, 0xC8, 0x1, 0xED, 0xFF, 0xFF, 0x0, 0x46, 0x0, 0xB3, 0x1, 0x86, 0x2, 0xE6, 0x0, 0x7, 0x0, 0x11, 0x0, 0x29, 0x1, 0xFB, 0x0, 0x2, 0x0, 0x84, 0xFF, 0xEB, 0x1, 0xE1, 0x5, 0x84, 0x0, 0x9, 0x0, 0x11, 0x0, 0x0, 0x13, 0x37, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x15, 0x2, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0xA0, 0x1, 0x66, 0x57, 0x83, 0x2B, 0x3B, 0xF7, 0x4A, 0x86, 0x4B, 0x4B, 0x86, 0x4A, 0x3, 0x51, 0xAC, 0x66, 0xDA, 0x47, 0x4D, 0x43, 0x8F, 0x5F, 0xB5, 0xFD, 0x59, 0x4E, 0x4E, 0x72, 0x4D, 0x4D, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x2, 0xB5, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x2, 0xB5, 0xF2, 0xFE, 0x8D, 0x1, 0x73, 0xF2, 0x3, 0x73, 0xC7, 0x1, 0x76, 0x0, 0x1, 0x0, 0x99, 0x0, 0x0, 0x3, 0x4, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x3, 0x4, 0xFE, 0x88, 0xF3, 0xF3, 0x1, 0x78, 0x3, 0x73, 0xFC, 0x8D, 0x5, 0xB0, 0xFE, 0x8A, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x4, 0x2E, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x1, 0xC3, 0xFE, 0x8D, 0x1, 0x73, 0xF2, 0x1, 0x79, 0xFE, 0x87, 0x1, 0x76, 0xC7, 0x3, 0x73, 0xFC, 0x8D, 0xC7, 0xFE, 0x8A, 0x0, 0x2, 0x0, 0x5B, 0x0, 0x76, 0x4, 0x8A, 0x5, 0xC5, 0x0, 0xB, 0x0, 0x27, 0x0, 0x0, 0x1, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x27, 0x6, 0x15, 0x14, 0x16, 0x13, 0x26, 0x26, 0x10, 0x37, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x4, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x4, 0x17, 0x16, 0x15, 0x14, 0x4, 0x2, 0x8C, 0x64, 0xA9, 0x95, 0xC6, 0x85, 0x6B, 0x7D, 0x68, 0xDD, 0xFB, 0xAA, 0x85, 0x1, 0x13, 0xE6, 0xEC, 0x1, 0xF, 0xF2, 0x87, 0x82, 0x88, 0x7E, 0x76, 0x1, 0xAE, 0x77, 0x7C, 0xFE, 0xE6, 0x1, 0x44, 0x2C, 0x52, 0x4D, 0x60, 0x39, 0x2B, 0x2A, 0x7B, 0x58, 0x5B, 0xFE, 0xFB, 0x3E, 0xB3, 0x1, 0x70, 0x5A, 0x66, 0xB7, 0xAA, 0xCD, 0xDE, 0xCF, 0x61, 0x89, 0x69, 0x49, 0x53, 0x56, 0x77, 0x56, 0x5A, 0xB9, 0xA1, 0xB0, 0xFF, 0xFF, 0x0, 0xAE, 0x2, 0x6E, 0xB, 0x33, 0x3, 0x32, 0x0, 0x66, 0x5, 0x3A, 0xB0, 0x0, 0x66, 0x66, 0x40, 0x0, 0x0, 0x47, 0x5, 0x3A, 0x4, 0xE8, 0x0, 0x0, 0x66, 0x66, 0x40, 0x0, 0xFF, 0xFF, 0x0, 0xAE, 0x2, 0x6E, 0x10, 0x6A, 0x3, 0x32, 0x0, 0x66, 0x5, 0x3A, 0xB0, 0x0, 0x66, 0x66, 0x40, 0x0, 0x0, 0x67, 0x5, 0x3A, 0xA, 0x1F, 0x0, 0x0, 0x66, 0x66, 0x40, 0x0, 0x0, 0x47, 0x5, 0x3A, 0x4, 0xE8, 0x0, 0x0, 0x66, 0x66, 0x40, 0x0, 0x0, 0x1, 0x0, 0x50, 0xFF, 0x9E, 0x1, 0xF2, 0x1, 0x47, 0x0, 0xB, 0x0, 0x0, 0x5, 0x27, 0x7, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x7, 0x17, 0x1, 0xAF, 0x8E, 0x8E, 0x43, 0x8F, 0x8F, 0x43, 0x8E, 0x8E, 0x43, 0x8F, 0x8F, 0x62, 0x91, 0x91, 0x43, 0x92, 0x91, 0x43, 0x91, 0x91, 0x43, 0x91, 0x92, 0xFF, 0xFF, 0x0, 0x43, 0xFE, 0x5F, 0x1, 0x57, 0x6, 0xDF, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0xFF, 0xCC, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x2, 0xCF, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x7, 0x54, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x5, 0xD1, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x28, 0x4, 0x4E, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x28, 0x1, 0x4F, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x46, 0x1, 0x47, 0x6, 0x53, 0x0, 0x40, 0x0, 0x0, 0x36, 0x26, 0x35, 0x34, 0x36, 0x35, 0x34, 0x26, 0x35, 0x34, 0x36, 0x34, 0x26, 0x34, 0x36, 0x35, 0x34, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x15, 0x14, 0x16, 0x16, 0x17, 0x15, 0x14, 0x6, 0x6, 0x14, 0x16, 0x16, 0x17, 0x15, 0x14, 0x6, 0x6, 0x14, 0x16, 0x16, 0x14, 0x6, 0x6, 0x15, 0x14, 0x16, 0x16, 0x17, 0x15, 0x14, 0x6, 0x6, 0x15, 0x14, 0x17, 0x7, 0x26, 0x26, 0x35, 0x34, 0x36, 0xAA, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x6A, 0x4E, 0x33, 0x4D, 0x2D, 0x2B, 0x1, 0x2C, 0x2D, 0x2D, 0x2B, 0x1, 0x2C, 0x2D, 0x2D, 0x2C, 0x2C, 0x2D, 0x2D, 0x2B, 0x1, 0x2C, 0x2D, 0x4B, 0x33, 0x4D, 0x69, 0x5A, 0x1D, 0x4A, 0x4B, 0x4C, 0x4A, 0x37, 0x38, 0x4A, 0x4C, 0x4B, 0x4B, 0x6E, 0x4A, 0x98, 0x4A, 0x37, 0x38, 0x50, 0x55, 0x44, 0x6C, 0x12, 0x7C, 0x1D, 0x39, 0x2A, 0x35, 0x39, 0x30, 0x5, 0x32, 0x3C, 0x35, 0x54, 0x35, 0x39, 0x30, 0x5, 0x32, 0x3C, 0x35, 0x54, 0x35, 0x3C, 0x66, 0x3B, 0x34, 0x2B, 0x2A, 0x35, 0x39, 0x30, 0x5, 0x33, 0x3B, 0x35, 0x2A, 0x3B, 0x1A, 0x7D, 0x13, 0x6D, 0x48, 0x50, 0x4F, 0x0, 0x3, 0x0, 0x41, 0xFE, 0xF3, 0x4, 0x44, 0x5, 0xB0, 0x0, 0x5, 0x0, 0xB, 0x0, 0x2D, 0x0, 0x0, 0x1, 0x37, 0x11, 0x27, 0x7, 0x11, 0x1, 0x14, 0x17, 0x11, 0x6, 0x15, 0x1, 0x27, 0x11, 0x23, 0x11, 0x26, 0x26, 0x35, 0x35, 0x34, 0x36, 0x37, 0x35, 0x33, 0x15, 0x37, 0x17, 0x35, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x27, 0x11, 0x36, 0x37, 0x17, 0x6, 0x7, 0x11, 0x23, 0x11, 0x2, 0x69, 0x2B, 0x2C, 0x1A, 0xFE, 0xE5, 0x74, 0x74, 0x1, 0x38, 0x1D, 0xA7, 0x9F, 0xC7, 0xC7, 0x9F, 0xA7, 0x1D, 0x29, 0xA7, 0xA1, 0x68, 0x8E, 0x2A, 0x51, 0x59, 0x28, 0x72, 0x55, 0x9E, 0xA7, 0x2, 0x64, 0x2, 0x2, 0x26, 0x1, 0x1, 0xFD, 0xD9, 0x1, 0x2, 0x87, 0x49, 0x1, 0xC0, 0x4B, 0x82, 0xFE, 0x17, 0x1, 0xFD, 0x51, 0x2, 0xC8, 0x2D, 0xE1, 0x9E, 0x23, 0x9E, 0xE1, 0x2D, 0x7A, 0x61, 0x1, 0x1, 0x61, 0x74, 0x24, 0x6C, 0x8C, 0x33, 0x1C, 0xFE, 0x14, 0x1A, 0x26, 0x93, 0x4F, 0x27, 0xFD, 0x39, 0x2, 0xAF, 0xFF, 0xFF, 0x0, 0x64, 0x1, 0x76, 0x2, 0x71, 0x3, 0x5A, 0x0, 0x27, 0x0, 0x12, 0x0, 0x1D, 0xFF, 0x6C, 0x0, 0x7, 0x0, 0x12, 0x0, 0x1D, 0x0, 0x8D, 0x0, 0x1, 0x0, 0x5B, 0xFE, 0xAB, 0x1, 0x98, 0x0, 0xEB, 0x0, 0x8, 0x0, 0x0, 0x37, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x26, 0x27, 0x5B, 0xE5, 0x3, 0x55, 0x7F, 0x53, 0x69, 0x1, 0xEB, 0xCC, 0xA0, 0x87, 0x4D, 0x47, 0xDE, 0x64, 0x0, 0x2, 0x0, 0x5B, 0xFE, 0xAB, 0x2, 0xEE, 0x0, 0xEB, 0x0, 0x8, 0x0, 0x11, 0x0, 0x0, 0x25, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x26, 0x35, 0x25, 0x33, 0x15, 0x16, 0x17, 0x7, 0x26, 0x26, 0x27, 0x1, 0xB1, 0xE4, 0x2, 0x57, 0x80, 0x54, 0x69, 0xFE, 0xAA, 0xE5, 0x3, 0x55, 0x7F, 0x53, 0x69, 0x1, 0xEB, 0xC7, 0xA5, 0x87, 0x4D, 0x48, 0xE0, 0x65, 0xB3, 0xCC, 0xA0, 0x87, 0x4D, 0x47, 0xDE, 0x64, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x87, 0x4, 0x8C, 0x5, 0xB0, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x35, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0x31, 0x6, 0x6, 0x23, 0x22, 0x26, 0x1, 0xE7, 0x3D, 0x56, 0x2B, 0x7D, 0x4D, 0x92, 0x58, 0x6E, 0xBC, 0x59, 0x6D, 0xFC, 0x7D, 0x2, 0xF2, 0xFD, 0x14, 0x4, 0x1E, 0xFD, 0xE, 0x3, 0xA, 0x1, 0x7A, 0xA0, 0x70, 0xBE, 0xFE, 0xFC, 0x46, 0x2F, 0x8B, 0x51, 0x55, 0x6B, 0xB3, 0xA4, 0x4, 0x41, 0xCB, 0xA0, 0xFB, 0xBA, 0xCA, 0x97, 0xD8, 0x6B, 0x0, 0x1, 0x0, 0x52, 0xFE, 0x8C, 0x3, 0xC0, 0x4, 0x3A, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x35, 0x21, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0x31, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0x6D, 0x20, 0x32, 0x47, 0x82, 0x48, 0x85, 0x4B, 0x60, 0xA5, 0x4C, 0x34, 0x18, 0xFD, 0x4B, 0x2, 0x26, 0xFD, 0xE5, 0x3, 0x4E, 0xFD, 0xD6, 0x2, 0x3F, 0x62, 0x87, 0x66, 0xB1, 0xFE, 0xFC, 0x1E, 0x52, 0x7C, 0x55, 0x5B, 0x6B, 0x5B, 0x58, 0x9F, 0x2, 0xD7, 0xC4, 0x99, 0xFD, 0x22, 0xC3, 0xA5, 0xCA, 0x6B, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x87, 0x4, 0x8C, 0x5, 0xB0, 0x0, 0x26, 0x5, 0xD9, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0x0, 0x80, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0x8C, 0x3, 0xC0, 0x4, 0x3A, 0x0, 0x26, 0x5, 0xDA, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0x0, 0x15, 0xFF, 0x37, 0x0, 0x1, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0x8A, 0x5, 0xC4, 0x0, 0x24, 0x0, 0x0, 0x5, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x0, 0x33, 0x32, 0x4, 0x10, 0x4, 0x4, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x14, 0x6, 0x4, 0x2, 0x50, 0xEC, 0xFE, 0xE6, 0xEC, 0xFB, 0x9A, 0x95, 0x7F, 0x86, 0x8D, 0x86, 0xFC, 0x1, 0x16, 0xF7, 0xE7, 0x1, 0x1D, 0xFE, 0xF7, 0xFE, 0x66, 0x73, 0x86, 0x83, 0x86, 0xB7, 0xFD, 0xA8, 0xFE, 0xFA, 0x14, 0xD6, 0xB8, 0xAD, 0xD9, 0x49, 0x2D, 0x6B, 0x51, 0x56, 0x73, 0x89, 0x6B, 0xB6, 0x1, 0x7, 0xE3, 0xFE, 0xA0, 0xCA, 0x7F, 0x69, 0x57, 0x58, 0x6C, 0x7A, 0x8A, 0x99, 0xCD, 0x66, 0x0, 0x1, 0x0, 0x57, 0xFF, 0xEC, 0x3, 0xD6, 0x4, 0x4E, 0x0, 0x25, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x6, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x14, 0x6, 0x2, 0xD, 0xC7, 0xEF, 0xD4, 0xBC, 0x83, 0x5B, 0x58, 0x5C, 0x5F, 0x60, 0xF3, 0xE7, 0xCA, 0xC1, 0xE1, 0xD8, 0xB2, 0x8E, 0x54, 0x65, 0x5F, 0x51, 0x8A, 0x5, 0xEC, 0xEA, 0x14, 0xB8, 0x90, 0x91, 0x92, 0x28, 0x1C, 0x40, 0x35, 0x36, 0x52, 0x63, 0x3F, 0x92, 0xC6, 0xC3, 0x85, 0x88, 0x94, 0x25, 0x1E, 0x4C, 0x35, 0x3A, 0x4A, 0x50, 0x64, 0x86, 0xE4, 0x0, 0x1, 0x0, 0xA7, 0xFF, 0xEC, 0x2, 0x64, 0x5, 0xCC, 0x0, 0xD, 0x0, 0x0, 0x13, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x23, 0x22, 0x26, 0x35, 0xA7, 0xF8, 0x3F, 0x31, 0x2A, 0x2B, 0x43, 0x5D, 0x7C, 0xA1, 0x5, 0xCC, 0xFB, 0x5E, 0x49, 0x2B, 0xA, 0xBC, 0x18, 0x89, 0xA7, 0xFF, 0xFF, 0x0, 0xAA, 0xFF, 0xF4, 0x2, 0x62, 0x4, 0x3A, 0x0, 0x6, 0x2, 0x42, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x5, 0xB0, 0x0, 0xE, 0x0, 0x0, 0x1, 0x1, 0x21, 0x1, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x1, 0x21, 0x2, 0x6F, 0xFE, 0xB2, 0xFE, 0xE7, 0x1, 0xE2, 0xE6, 0xEC, 0xFE, 0xEC, 0xE6, 0x1, 0xE2, 0xFE, 0xE8, 0x2, 0xB1, 0xFD, 0x4F, 0x3, 0x8D, 0xAF, 0x1, 0x74, 0xFE, 0x8C, 0xAF, 0xFC, 0x73, 0x0, 0x1, 0x0, 0x14, 0x0, 0x0, 0x4, 0x3D, 0x4, 0x3A, 0x0, 0xE, 0x0, 0x0, 0x21, 0x1, 0x1, 0x21, 0x1, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x1, 0x3, 0x32, 0xFE, 0xF6, 0xFE, 0xF7, 0xFE, 0xF5, 0x1, 0x8D, 0xCE, 0xD9, 0xF3, 0xE0, 0xD0, 0x1, 0x8E, 0x2, 0x4, 0xFD, 0xFC, 0x2, 0xBA, 0xAB, 0xD5, 0xD5, 0xAB, 0xFD, 0x46, 0x0, 0x2, 0x0, 0x47, 0xFF, 0xEC, 0x4, 0x84, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x27, 0x0, 0x0, 0x24, 0x36, 0x35, 0x34, 0x26, 0x27, 0x27, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x37, 0x26, 0x27, 0x3, 0x21, 0x13, 0x16, 0x17, 0x36, 0x37, 0x13, 0x21, 0x3, 0x6, 0x7, 0x17, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0xD0, 0x68, 0x5C, 0x27, 0x4F, 0x83, 0x50, 0x69, 0x6A, 0xB7, 0xFE, 0xEC, 0x88, 0x49, 0x57, 0xB0, 0x5F, 0x6D, 0x1, 0xA, 0x5E, 0x42, 0x75, 0x79, 0x3D, 0x5E, 0x1, 0xA, 0x6F, 0x5C, 0xB0, 0x57, 0x50, 0x80, 0xFE, 0xEC, 0xB0, 0x63, 0x46, 0x3F, 0x59, 0x21, 0x43, 0x6E, 0x54, 0x3A, 0x46, 0x63, 0xC4, 0xB3, 0xB1, 0x6F, 0xA0, 0x3C, 0x48, 0xAC, 0xF9, 0x1, 0x28, 0xFE, 0xF4, 0xB8, 0x7B, 0x84, 0xAD, 0x1, 0xE, 0xFE, 0xD2, 0xEE, 0xB2, 0x48, 0x43, 0x9B, 0x6C, 0xB1, 0xB3, 0x0, 0x2, 0x0, 0x47, 0xFF, 0xEC, 0x4, 0x92, 0x6, 0x0, 0x0, 0xA, 0x0, 0x25, 0x0, 0x0, 0x24, 0x36, 0x35, 0x34, 0x27, 0x27, 0x7, 0x6, 0x15, 0x14, 0x16, 0x6, 0x24, 0x35, 0x34, 0x37, 0x37, 0x26, 0x2, 0x27, 0x27, 0x21, 0x17, 0x12, 0x17, 0x36, 0x13, 0x37, 0x21, 0x7, 0x6, 0x2, 0x7, 0x17, 0x16, 0x15, 0x14, 0x4, 0x2, 0xD6, 0x6A, 0x40, 0x94, 0x98, 0x3B, 0x69, 0x4C, 0xFE, 0xED, 0x83, 0xAB, 0x6B, 0xBE, 0x2B, 0x36, 0x1, 0x9, 0x2D, 0x36, 0xB9, 0xB9, 0x36, 0x2D, 0x1, 0xA, 0x37, 0x2B, 0xC0, 0x6A, 0xB3, 0x7C, 0xFE, 0xED, 0xB0, 0x63, 0x46, 0x40, 0x39, 0x80, 0x85, 0x33, 0x41, 0x46, 0x63, 0xC4, 0xB3, 0xB1, 0x8E, 0x6E, 0x8F, 0x67, 0x1, 0x1B, 0xC7, 0xDC, 0xCB, 0xFE, 0xEC, 0xBD, 0xBD, 0x1, 0x14, 0xCB, 0xDC, 0xC7, 0xFE, 0xE6, 0x67, 0x96, 0x69, 0x8D, 0xB1, 0xB3, 0x0, 0x1, 0x0, 0x68, 0xFF, 0xEB, 0x8, 0x29, 0x5, 0xC5, 0x0, 0x2C, 0x0, 0x0, 0x5, 0x22, 0x26, 0x27, 0x6, 0x6, 0x23, 0x20, 0x0, 0x11, 0x11, 0x10, 0x0, 0x21, 0x15, 0x22, 0x6, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x35, 0x20, 0x0, 0x11, 0x11, 0x10, 0x0, 0x5, 0xCC, 0x70, 0xCB, 0x48, 0x49, 0xCB, 0x70, 0xFE, 0xF4, 0xFE, 0xAF, 0x1, 0x52, 0x1, 0x11, 0xA9, 0xBE, 0xBD, 0xA4, 0x7F, 0x87, 0xFC, 0x86, 0x7F, 0xA4, 0xBD, 0xBE, 0xA9, 0x1, 0x11, 0x1, 0x52, 0xFE, 0xB0, 0x15, 0x45, 0x45, 0x45, 0x45, 0x1, 0x61, 0x1, 0x9, 0x1, 0x6, 0x1, 0xA, 0x1, 0x60, 0xCD, 0xF1, 0xAA, 0xFE, 0xF8, 0xAB, 0xF5, 0x88, 0x73, 0x1, 0x62, 0xFE, 0x9E, 0x73, 0x88, 0xF5, 0xAB, 0x1, 0x8, 0xAA, 0xF1, 0xCD, 0xFE, 0xA0, 0xFE, 0xF6, 0xFE, 0xFA, 0xFE, 0xF7, 0xFE, 0x9F, 0x0, 0x1, 0x0, 0x4F, 0xFF, 0xEB, 0x6, 0x7C, 0x4, 0x4E, 0x0, 0x2A, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x0, 0x33, 0x15, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x0, 0x17, 0x15, 0x14, 0x0, 0x4, 0x77, 0xA9, 0x68, 0x69, 0xA9, 0xF9, 0xFE, 0xF4, 0x1, 0x3, 0xEE, 0x87, 0x77, 0x7F, 0x93, 0x56, 0x42, 0xF3, 0x41, 0x57, 0x93, 0x7F, 0x77, 0x87, 0xED, 0x1, 0x1, 0x3, 0xFE, 0xF4, 0x15, 0x4D, 0x4D, 0x1, 0x45, 0xD8, 0x2A, 0xD8, 0x1, 0x44, 0xC4, 0xDD, 0x7B, 0x2A, 0x7C, 0xDD, 0x4C, 0x40, 0x1, 0x8, 0xFE, 0xF8, 0x40, 0x4C, 0xDD, 0x7C, 0x2A, 0x7B, 0xDD, 0xC4, 0xFE, 0xC2, 0xD5, 0x33, 0xD8, 0xFE, 0xBB, 0x0, 0x2, 0x0, 0x18, 0x0, 0x0, 0x5, 0xD4, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x14, 0x0, 0x0, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x16, 0x4, 0x15, 0x14, 0x4, 0x23, 0x25, 0x21, 0x32, 0x36, 0x34, 0x26, 0x23, 0x21, 0x1, 0xA3, 0xFE, 0x75, 0x2, 0x88, 0x1, 0x2D, 0xF6, 0x1, 0x11, 0xFE, 0xED, 0xF8, 0xFE, 0xD7, 0x1, 0x29, 0x8C, 0x83, 0x83, 0x8C, 0xFE, 0xD7, 0x4, 0xED, 0xC3, 0xFD, 0xD3, 0x1, 0xF3, 0xC9, 0xC8, 0xFE, 0xCA, 0x99, 0xCA, 0x8B, 0x0, 0x2, 0x0, 0x1F, 0x0, 0x0, 0x4, 0xEB, 0x4, 0x3A, 0x0, 0xC, 0x0, 0x14, 0x0, 0x0, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x23, 0x1, 0x58, 0xFE, 0xC7, 0x2, 0x2C, 0xF1, 0xCF, 0xE0, 0xE2, 0xD1, 0xED, 0xED, 0x69, 0x57, 0x57, 0x69, 0xED, 0x3, 0x77, 0xC3, 0xFE, 0xA8, 0x1, 0xCE, 0xA1, 0x9D, 0xD5, 0xC2, 0x6A, 0x84, 0x70, 0xFF, 0xFF, 0xFF, 0xCF, 0x0, 0x0, 0x7, 0x17, 0x5, 0xB0, 0x0, 0x27, 0x0, 0x2E, 0x5, 0x77, 0x0, 0x0, 0x0, 0x6, 0x5, 0xE7, 0xB7, 0x0, 0xFF, 0xFF, 0x0, 0x1F, 0x0, 0x0, 0x6, 0x92, 0x4, 0x3A, 0x0, 0x27, 0x0, 0x8E, 0x5, 0xF, 0x0, 0x0, 0x0, 0x6, 0x5, 0xE8, 0x0, 0x0, 0x0, 0x2, 0x0, 0x96, 0x0, 0x0, 0x6, 0x3F, 0x5, 0xB0, 0x0, 0x16, 0x0, 0x1E, 0x0, 0x0, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x16, 0x4, 0x15, 0x14, 0x4, 0x23, 0x25, 0x21, 0x32, 0x36, 0x34, 0x26, 0x23, 0x21, 0x2, 0xE, 0x7C, 0xFC, 0xFC, 0x7C, 0xFD, 0x1, 0x4F, 0xFE, 0xB1, 0x1, 0x2C, 0xF6, 0x1, 0x12, 0xFE, 0xEC, 0xF8, 0xFE, 0xD8, 0x1, 0x28, 0x8D, 0x82, 0x82, 0x8D, 0xFE, 0xD8, 0x4, 0x2E, 0xFB, 0xD2, 0x5, 0xB0, 0xB9, 0xB9, 0xB9, 0xC9, 0xAB, 0x1, 0xF3, 0xC9, 0xC8, 0xFE, 0xCA, 0x99, 0xCA, 0x8B, 0x0, 0x2, 0x0, 0x7D, 0x0, 0x0, 0x5, 0x8B, 0x6, 0x18, 0x0, 0x16, 0x0, 0x1E, 0x0, 0x0, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x23, 0x1, 0xF7, 0x87, 0xF3, 0xF3, 0x87, 0xF3, 0x1, 0x3E, 0xFE, 0xC2, 0xF2, 0xCF, 0xE0, 0xE2, 0xD1, 0xEE, 0xEE, 0x69, 0x57, 0x57, 0x69, 0xEE, 0x4, 0x2E, 0xFB, 0xD2, 0x6, 0x0, 0xFE, 0xF1, 0x1, 0x27, 0xFE, 0xD9, 0xC3, 0xFE, 0xB4, 0x1, 0xCE, 0xA1, 0x9D, 0xD5, 0xC2, 0x6A, 0x84, 0x70, 0x0, 0x2, 0x0, 0x66, 0xFF, 0xEC, 0x6, 0xD1, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x21, 0x0, 0x0, 0x25, 0x32, 0x12, 0x35, 0x35, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x5, 0x11, 0x23, 0x2, 0x0, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x13, 0x33, 0x11, 0x33, 0x11, 0x2, 0xC4, 0xA8, 0xB6, 0xB9, 0xA7, 0xA2, 0xBD, 0xBF, 0x3, 0xB3, 0xB9, 0x16, 0xFE, 0xBB, 0xFD, 0xFE, 0xF6, 0xFE, 0xAC, 0x1, 0x52, 0x1, 0xA, 0x1, 0x8, 0x1, 0x4B, 0x9, 0xB7, 0xFC, 0xBC, 0x1, 0x2, 0xF5, 0x4B, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0xBC, 0x2, 0x5D, 0xFE, 0xDA, 0xFE, 0xB5, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xFE, 0x98, 0xFE, 0xC4, 0x2, 0x90, 0xFA, 0x50, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x6, 0x47, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x21, 0x0, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x11, 0x21, 0x6, 0x0, 0x23, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x32, 0x0, 0x17, 0x21, 0x11, 0x33, 0x11, 0x1, 0x42, 0x7D, 0x89, 0x86, 0x7D, 0x7C, 0x89, 0x87, 0x7D, 0x4, 0x12, 0xFE, 0xE6, 0x15, 0xFE, 0xFC, 0xD9, 0xEB, 0xFE, 0xF7, 0x4, 0x1, 0xA, 0xEC, 0xD5, 0x1, 0x3, 0x1A, 0x1, 0x1C, 0xF3, 0x2, 0x12, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0xFD, 0xD9, 0x1, 0xC4, 0xCE, 0xFE, 0xF6, 0x1, 0x33, 0xE6, 0x22, 0xEC, 0x1, 0x3B, 0xFF, 0x0, 0xC6, 0x1, 0xB2, 0xFB, 0xC6, 0x0, 0x2, 0x0, 0x96, 0x0, 0x0, 0x7, 0x20, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x12, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x13, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x1, 0x33, 0x1, 0x21, 0x3, 0x21, 0x3, 0x5, 0x5B, 0xD3, 0xD3, 0xFE, 0x3B, 0x80, 0xDE, 0xFC, 0xFC, 0x1, 0x2B, 0x1, 0x59, 0xE3, 0x2, 0x27, 0xFE, 0xF8, 0x77, 0xFD, 0xCD, 0x76, 0x2, 0x1F, 0x2, 0x5D, 0xFD, 0xA3, 0xFD, 0xE1, 0x1, 0x54, 0xFE, 0xAC, 0x5, 0xB0, 0xFC, 0x6F, 0x3, 0x91, 0xFA, 0x50, 0x1, 0x54, 0xFE, 0xAC, 0x0, 0x2, 0x0, 0x7D, 0xFF, 0xEC, 0x5, 0xAC, 0x4, 0x4E, 0x0, 0x9, 0x0, 0x2D, 0x0, 0x0, 0x25, 0x32, 0x36, 0x37, 0x35, 0x23, 0x4, 0x15, 0x14, 0x16, 0x5, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x11, 0x33, 0x12, 0x25, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x17, 0x15, 0x3, 0xA9, 0x54, 0x7A, 0x19, 0x91, 0xFE, 0xFF, 0x58, 0x1, 0x5E, 0x12, 0xA, 0x73, 0xAA, 0x83, 0xBD, 0x21, 0xAA, 0xF3, 0xF3, 0xA6, 0x3F, 0x1, 0x8A, 0xB1, 0x5F, 0x5F, 0x56, 0x67, 0xF3, 0xF2, 0xCC, 0xB6, 0xED, 0x29, 0xAF, 0x51, 0x31, 0xCC, 0x5, 0xB0, 0x41, 0x58, 0xAF, 0x25, 0x41, 0x7A, 0x7E, 0x64, 0xCE, 0x4, 0x3A, 0xFD, 0x51, 0x1, 0x2, 0x8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0xBA, 0xBA, 0xFE, 0x20, 0x92, 0x57, 0x11, 0x0, 0x3, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x6, 0x0, 0xA, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x27, 0x21, 0x7, 0x5, 0x1, 0x33, 0x1, 0x3, 0x6B, 0xC1, 0xC1, 0x2, 0xC, 0x43, 0xFD, 0xF1, 0x43, 0xFE, 0xB2, 0x2, 0x26, 0xE3, 0x2, 0x28, 0x2, 0x54, 0x2, 0x29, 0xFD, 0xD7, 0xFE, 0x76, 0xC0, 0xC0, 0xCA, 0x5, 0xB0, 0xFA, 0x50, 0x0, 0x3, 0x0, 0x1C, 0x0, 0x0, 0x4, 0xAC, 0x4, 0x3A, 0x0, 0x2, 0x0, 0x6, 0x0, 0xA, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x27, 0x21, 0x7, 0x5, 0x1, 0x33, 0x1, 0x2, 0xF3, 0x8F, 0x8E, 0x1, 0x8F, 0x28, 0xFE, 0x4F, 0x28, 0xFE, 0xB8, 0x1, 0xCD, 0xF8, 0x1, 0xCB, 0x1, 0xD2, 0x1, 0x61, 0xFE, 0x9F, 0xFE, 0xE6, 0x63, 0x63, 0xB8, 0x4, 0x3A, 0xFB, 0xC6, 0x0, 0x3, 0x0, 0x80, 0x0, 0x0, 0x6, 0x6E, 0x5, 0xB0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x20, 0x0, 0x0, 0x1, 0x13, 0x21, 0x3, 0x22, 0x6, 0x7, 0x21, 0x26, 0x26, 0x23, 0x1, 0x11, 0x21, 0x11, 0x23, 0x11, 0x36, 0x24, 0x37, 0x33, 0x1, 0x21, 0x1, 0x33, 0x32, 0x4, 0x15, 0x11, 0x23, 0x11, 0x21, 0x11, 0x3, 0x7F, 0xE9, 0xFE, 0x2E, 0x1D, 0x62, 0x77, 0x16, 0x3, 0xDA, 0x16, 0x77, 0x62, 0xFE, 0x8D, 0xFE, 0x7A, 0xFC, 0x2, 0x1, 0x4, 0xDF, 0x22, 0xFE, 0x85, 0x4, 0xE5, 0xFE, 0x85, 0x17, 0xD5, 0x1, 0xC, 0xFC, 0xFE, 0x8C, 0x3, 0x3A, 0x1, 0xA9, 0xFD, 0x79, 0x3A, 0x4D, 0x4D, 0x3A, 0xFD, 0xA4, 0x1, 0x11, 0xFE, 0xEF, 0x1, 0x68, 0xF4, 0xCA, 0x3, 0x2, 0x87, 0xFD, 0x79, 0xCD, 0xFB, 0xFE, 0x9F, 0x1, 0x11, 0xFE, 0xEF, 0x0, 0x3, 0x0, 0x5C, 0x0, 0x0, 0x5, 0x3E, 0x4, 0x3B, 0x0, 0x2, 0x0, 0xA, 0x0, 0x22, 0x0, 0x0, 0x1, 0x13, 0x21, 0x3, 0x22, 0x6, 0x7, 0x21, 0x26, 0x26, 0x23, 0x1, 0x35, 0x21, 0x15, 0x23, 0x35, 0x36, 0x36, 0x37, 0x1, 0x33, 0x35, 0x21, 0x15, 0x33, 0x1, 0x16, 0x16, 0x17, 0x15, 0x23, 0x35, 0x21, 0x15, 0x2, 0xD4, 0x95, 0xFE, 0xD6, 0x14, 0x49, 0x61, 0x18, 0x2, 0xC8, 0x18, 0x61, 0x49, 0xFE, 0xE9, 0xFE, 0xF7, 0xF3, 0x2, 0xD5, 0xBE, 0xFE, 0xE9, 0xA8, 0x2, 0xC6, 0x86, 0xFE, 0xE9, 0xB7, 0xCF, 0x1, 0xF3, 0xFF, 0x0, 0x2, 0x69, 0x1, 0x22, 0xFE, 0x19, 0x29, 0x35, 0x35, 0x29, 0xFE, 0x5C, 0x96, 0x96, 0xB3, 0xDA, 0xC8, 0xB, 0x1, 0xDA, 0x1, 0x1, 0xFE, 0x25, 0xE, 0xC9, 0xDA, 0xAE, 0x96, 0x96, 0x0, 0x3, 0x0, 0x96, 0x0, 0x0, 0x7, 0x20, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x6, 0x0, 0x12, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x27, 0x21, 0x7, 0x5, 0x13, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x1, 0x33, 0x1, 0x5, 0x48, 0xC0, 0xC1, 0x2, 0xC, 0x44, 0xFD, 0xF2, 0x44, 0xFE, 0xB3, 0x95, 0xF3, 0xFC, 0xFC, 0x1, 0x3F, 0x1, 0x45, 0xE3, 0x2, 0x27, 0x2, 0x54, 0x2, 0x28, 0xFD, 0xD8, 0xFE, 0x71, 0xC5, 0xC5, 0xC5, 0x1, 0x8A, 0xFE, 0x76, 0x5, 0xB0, 0xFC, 0xA4, 0x3, 0x5C, 0xFA, 0x50, 0x0, 0x3, 0x0, 0x7D, 0x0, 0x0, 0x6, 0x4B, 0x4, 0x3A, 0x0, 0x2, 0x0, 0x6, 0x0, 0x12, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x27, 0x21, 0x7, 0x5, 0x13, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x1, 0x33, 0x1, 0x4, 0x92, 0x8F, 0x8E, 0x1, 0x8F, 0x28, 0xFE, 0x4F, 0x28, 0xFE, 0xB8, 0x79, 0xC4, 0xF3, 0xF3, 0x1, 0x12, 0x1, 0x6, 0xF8, 0x1, 0xCB, 0x1, 0xD2, 0x1, 0x61, 0xFE, 0x9F, 0xFE, 0xE6, 0x63, 0x63, 0xB8, 0x1, 0x1B, 0xFE, 0xE5, 0x4, 0x3A, 0xFD, 0x98, 0x2, 0x68, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x1E, 0xFE, 0x60, 0x5, 0x82, 0x5, 0xB0, 0x0, 0xE, 0x0, 0x0, 0x1, 0x23, 0x11, 0x6, 0x2, 0x7, 0x27, 0x36, 0x12, 0x12, 0x13, 0x33, 0x1, 0x23, 0x3, 0x3, 0x8D, 0xF2, 0x40, 0xD6, 0xAD, 0xBA, 0xBC, 0xE4, 0x8D, 0x39, 0xE7, 0x2, 0x17, 0xFB, 0xFA, 0xFE, 0x60, 0x4, 0x5E, 0xC6, 0xFE, 0xA2, 0xB8, 0x97, 0xC0, 0x1, 0x96, 0x1, 0xCF, 0x1, 0x12, 0xFA, 0x50, 0x2, 0xE7, 0x0, 0x1, 0x0, 0x22, 0xFE, 0x60, 0x4, 0xC0, 0x4, 0x3A, 0x0, 0xD, 0x0, 0x0, 0x1, 0x23, 0x11, 0x6, 0x6, 0x7, 0x27, 0x36, 0x12, 0x13, 0x33, 0x1, 0x23, 0x3, 0x3, 0x5, 0xF3, 0x35, 0xA0, 0x7B, 0xA0, 0xD9, 0xC7, 0x43, 0xEB, 0x1, 0xD0, 0xFC, 0xBF, 0xFE, 0x60, 0x3, 0x72, 0x84, 0xF0, 0x72, 0x9E, 0xDA, 0x1, 0xBF, 0x1, 0x17, 0xFB, 0xC6, 0x1, 0xF3, 0x0, 0x1, 0x0, 0x3B, 0xFE, 0xA1, 0x5, 0x65, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x13, 0x3, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x4F, 0x14, 0xB0, 0xFD, 0x2, 0x81, 0xFC, 0xFB, 0xD1, 0xFE, 0xA1, 0x2, 0x2C, 0x4, 0xE3, 0xFB, 0x1A, 0x4, 0xE6, 0xFA, 0x50, 0xFE, 0xA1, 0x0, 0x1, 0x0, 0x2E, 0xFE, 0xBF, 0x4, 0x4D, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x13, 0x3, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x42, 0x14, 0x93, 0xF3, 0x1, 0xA7, 0xF2, 0xFC, 0xD2, 0xFE, 0xBF, 0x2, 0x3, 0x3, 0x78, 0xFC, 0x89, 0x3, 0x77, 0xFB, 0xC6, 0xFE, 0xBF, 0x0, 0x2, 0x0, 0x24, 0xFE, 0x9A, 0x7, 0x4F, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x16, 0x0, 0x0, 0x25, 0x21, 0x11, 0x21, 0x3, 0x2, 0x1, 0x11, 0x21, 0x11, 0x23, 0x3, 0x33, 0x36, 0x12, 0x13, 0x13, 0x21, 0x15, 0x21, 0x11, 0x33, 0x3, 0x1, 0xB7, 0x2, 0x70, 0xFE, 0x57, 0x18, 0x1D, 0x2, 0x96, 0xFC, 0x41, 0xF3, 0x9, 0x76, 0x36, 0x84, 0x14, 0x26, 0x5, 0xC1, 0xFD, 0xD5, 0xB8, 0xD, 0xCA, 0x4, 0x1B, 0xFE, 0x55, 0xFE, 0x6F, 0xFC, 0xF1, 0x1, 0x66, 0xFE, 0x9A, 0x2, 0x30, 0x34, 0x1, 0x19, 0x1, 0x27, 0x2, 0x72, 0xCB, 0xFB, 0xE5, 0xFD, 0xD0, 0x0, 0x2, 0x0, 0x27, 0xFE, 0xBE, 0x5, 0xFE, 0x4, 0x3A, 0x0, 0x5, 0x0, 0x16, 0x0, 0x0, 0x25, 0x21, 0x11, 0x21, 0x7, 0x2, 0x3, 0x11, 0x23, 0x13, 0x33, 0x36, 0x36, 0x37, 0x13, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x1, 0x9F, 0x1, 0x9E, 0xFE, 0xEF, 0x5, 0xC, 0xFD, 0xF7, 0x1, 0x59, 0x54, 0x58, 0x7, 0xC, 0x4, 0xBE, 0xFE, 0x32, 0x96, 0xF3, 0xC3, 0x2, 0xA6, 0xB6, 0xFE, 0xC5, 0xFE, 0x88, 0xFE, 0xBE, 0x2, 0x5, 0x5E, 0xC9, 0xCD, 0x1, 0x83, 0xD1, 0xFD, 0x5A, 0xFD, 0xFB, 0x1, 0x42, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x7, 0x3A, 0x5, 0xB0, 0x0, 0x11, 0x0, 0x0, 0x33, 0x35, 0x37, 0x36, 0x36, 0x13, 0x13, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x3, 0x2, 0x2, 0x7, 0x2D, 0x31, 0x7B, 0x61, 0xD, 0x1B, 0x5, 0xD8, 0xFD, 0xD4, 0xFD, 0xFE, 0x43, 0x1B, 0x16, 0xC5, 0xE7, 0xCA, 0x5, 0xE, 0xF4, 0x1, 0x2E, 0x2, 0xB1, 0xCB, 0xFB, 0x1B, 0x4, 0xE5, 0xFD, 0xCB, 0xFE, 0x8C, 0xFE, 0xC7, 0x3, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x5, 0xE2, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x0, 0x33, 0x27, 0x37, 0x36, 0x36, 0x37, 0x13, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x3, 0x2, 0x6, 0x7, 0x23, 0x1, 0x27, 0x5F, 0x44, 0xA, 0x14, 0x4, 0xD8, 0xFE, 0x32, 0xF3, 0xFE, 0xCF, 0x15, 0x13, 0xAA, 0xAC, 0xCB, 0x3, 0x8, 0xC1, 0xD5, 0x1, 0xCE, 0xC4, 0xFC, 0x8A, 0x3, 0x76, 0xFE, 0x8B, 0xFE, 0xEB, 0xEA, 0x2, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x8, 0x98, 0x5, 0xB0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x21, 0x1, 0x1, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x13, 0x1, 0x23, 0x1, 0x1, 0x91, 0xFC, 0x1, 0x47, 0x1, 0xA4, 0x1, 0xA3, 0x3, 0x75, 0xFD, 0xD3, 0xFC, 0x18, 0xFE, 0x53, 0xB5, 0xFE, 0x53, 0x1, 0xE0, 0xFE, 0x20, 0x5, 0xB0, 0xFB, 0xA4, 0x4, 0x5C, 0xCB, 0xFB, 0x1B, 0x1, 0xE0, 0x2, 0x80, 0xFB, 0xA0, 0x4, 0x61, 0x0, 0x1, 0x0, 0x88, 0x0, 0x0, 0x7, 0x34, 0x4, 0x3A, 0x0, 0xE, 0x0, 0x0, 0x21, 0x1, 0x11, 0x23, 0x11, 0x21, 0x1, 0x1, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x1, 0x2, 0xA6, 0xFE, 0xD5, 0xF3, 0x1, 0x33, 0x1, 0x3D, 0x1, 0x41, 0x2, 0xFB, 0xFE, 0x34, 0xF2, 0xFE, 0xD5, 0x2, 0xD2, 0xFD, 0x2E, 0x4, 0x3A, 0xFC, 0xF1, 0x3, 0xF, 0xC4, 0xFC, 0x8A, 0x2, 0xCF, 0xFD, 0x31, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0xB8, 0x5, 0xA, 0xFD, 0x86, 0x0, 0x3, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x25, 0x0, 0x0, 0x5, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x27, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x2, 0x48, 0xEB, 0xFE, 0xF7, 0x4, 0x1, 0xA, 0xEC, 0xEF, 0x1, 0x9, 0xFE, 0xF7, 0xED, 0x87, 0x7D, 0x7D, 0x89, 0x87, 0x7C, 0x7D, 0x6, 0x45, 0x7C, 0x45, 0x45, 0x7C, 0x45, 0x14, 0x1, 0x33, 0xE6, 0x22, 0xEC, 0x1, 0x3B, 0xFE, 0xC5, 0xEC, 0x15, 0xEB, 0xFE, 0xC5, 0xC3, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x15, 0x91, 0xD2, 0x1, 0x6C, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x0, 0x4, 0x0, 0x66, 0xFF, 0xEF, 0x5, 0x75, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x25, 0x0, 0x2F, 0x0, 0x0, 0x1, 0x10, 0x0, 0x21, 0x20, 0x0, 0x3, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x27, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x5, 0x75, 0xFE, 0x9C, 0xFE, 0xDE, 0xFE, 0xE6, 0xFE, 0x94, 0x3, 0x1, 0x6B, 0x1, 0x1C, 0x1, 0x22, 0x1, 0x66, 0xFD, 0xD2, 0xB9, 0xB2, 0xD8, 0xDA, 0xB2, 0xB9, 0xD0, 0xFE, 0x9F, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0xFE, 0x9A, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x2, 0xB5, 0xFE, 0xAA, 0xFE, 0x90, 0x1, 0x6B, 0x1, 0x50, 0x53, 0x1, 0x56, 0x1, 0x71, 0xFE, 0x8F, 0xFE, 0xAA, 0x2, 0xFD, 0xF7, 0xF7, 0xFD, 0x4A, 0xFD, 0xF9, 0xF9, 0xFD, 0x22, 0x38, 0x4A, 0x4A, 0x38, 0x37, 0x49, 0x49, 0x37, 0x38, 0x4A, 0x4A, 0x38, 0x37, 0x49, 0x49, 0x0, 0x4, 0x0, 0x50, 0xFF, 0xEC, 0x5, 0x26, 0x4, 0x4E, 0x0, 0xC, 0x0, 0x1A, 0x0, 0x24, 0x0, 0x2E, 0x0, 0x0, 0x13, 0x34, 0x0, 0x21, 0x20, 0x0, 0x15, 0x15, 0x14, 0x0, 0x20, 0x0, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x5, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x50, 0x1, 0x46, 0x1, 0x24, 0x1, 0x26, 0x1, 0x46, 0xFE, 0xBB, 0xFD, 0xB6, 0xFE, 0xB9, 0xF3, 0xB9, 0xC0, 0xBF, 0xB9, 0xBA, 0xC0, 0xBE, 0xB9, 0x1, 0x96, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0xFE, 0xB1, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0x2, 0x27, 0xF1, 0x1, 0x36, 0xFE, 0xCA, 0xF1, 0x15, 0xF1, 0xFE, 0xCB, 0x1, 0x35, 0xF1, 0x9C, 0xC7, 0xC7, 0x9C, 0x15, 0x9A, 0xCA, 0xCA, 0x9A, 0xE, 0x38, 0x4A, 0x4A, 0x38, 0x37, 0x49, 0x49, 0x37, 0x38, 0x4A, 0x4A, 0x38, 0x37, 0x49, 0x49, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x8, 0xDB, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x27, 0x1, 0xB8, 0x5, 0xA, 0xFD, 0x86, 0x0, 0x27, 0x1, 0xB8, 0x8, 0xC5, 0xFD, 0x86, 0x0, 0x7, 0x0, 0x34, 0x3, 0xBC, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x7, 0x39, 0x4, 0x4E, 0x0, 0x27, 0x6, 0x2, 0x2, 0xFB, 0x0, 0x0, 0x0, 0x6, 0x6, 0x2, 0x0, 0x0, 0x0, 0xF, 0x0, 0x55, 0xFD, 0xE4, 0x9, 0x75, 0x6, 0x72, 0x0, 0x2B, 0x0, 0x39, 0x0, 0x47, 0x0, 0x53, 0x0, 0x5D, 0x0, 0x6B, 0x0, 0x79, 0x0, 0x87, 0x0, 0x91, 0x0, 0x9B, 0x0, 0xA7, 0x0, 0xB5, 0x0, 0xC3, 0x0, 0xCB, 0x0, 0xD5, 0x0, 0x0, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x37, 0x26, 0x26, 0x35, 0x35, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x7, 0x16, 0x16, 0x15, 0x15, 0x14, 0x6, 0x7, 0x16, 0x15, 0x14, 0x6, 0x1, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x21, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x21, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x21, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x21, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x12, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x24, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x6, 0x45, 0xE2, 0x7E, 0x7C, 0xE3, 0xDC, 0xF6, 0x29, 0xBA, 0xCE, 0xCE, 0xB9, 0x28, 0xF6, 0xDB, 0xE2, 0x7E, 0x7E, 0xE0, 0xDD, 0xF6, 0x28, 0xBA, 0xCD, 0xCE, 0xBA, 0x29, 0xF6, 0xFC, 0x66, 0x7D, 0x77, 0x78, 0x7D, 0x7C, 0x77, 0x76, 0x3, 0x3D, 0x7D, 0x76, 0x77, 0x7E, 0x7C, 0x76, 0x76, 0xFD, 0x47, 0x3E, 0x39, 0x3A, 0x3F, 0x3F, 0x3A, 0x39, 0x3E, 0x2, 0xBE, 0x3F, 0x72, 0x3F, 0x3F, 0x72, 0x3F, 0xFC, 0x5B, 0x7D, 0x76, 0x77, 0x7E, 0x7C, 0x77, 0x77, 0x3, 0x3D, 0x7C, 0x77, 0x77, 0x7E, 0x7C, 0x77, 0x76, 0x3, 0x3D, 0x7D, 0x76, 0x77, 0x7E, 0x7C, 0x76, 0x76, 0xFA, 0x88, 0x3E, 0x74, 0x3E, 0x3E, 0x74, 0x3E, 0x2, 0xBF, 0x3F, 0x72, 0x3F, 0x3F, 0x72, 0x3F, 0x2, 0xBE, 0x3F, 0x39, 0x3A, 0x3F, 0x3F, 0x3A, 0x39, 0x3F, 0xFC, 0x5B, 0x7D, 0x77, 0x78, 0x7D, 0x7C, 0x77, 0x76, 0x3, 0x3D, 0x7D, 0x76, 0x77, 0x7E, 0x7C, 0x76, 0x76, 0x5, 0x3F, 0x72, 0x3F, 0x3F, 0x72, 0x3F, 0xFD, 0x42, 0x3E, 0x39, 0x3A, 0x3F, 0x3F, 0x3A, 0x39, 0x3E, 0xFD, 0xE4, 0x8F, 0x8F, 0xFC, 0xBC, 0x15, 0x6B, 0x58, 0x16, 0xED, 0xAA, 0x15, 0xAA, 0xEF, 0x16, 0x57, 0x7D, 0xBD, 0xFC, 0x8F, 0x8F, 0xFC, 0xBD, 0x15, 0x68, 0x57, 0x17, 0xEF, 0xA9, 0x15, 0xAA, 0xEE, 0x15, 0x58, 0x80, 0xBC, 0xFC, 0x5, 0xC3, 0x98, 0x64, 0x16, 0x63, 0x9A, 0x9A, 0x63, 0x16, 0x64, 0x98, 0x98, 0x64, 0x16, 0x63, 0x9A, 0x9A, 0x63, 0x16, 0x64, 0x98, 0x1, 0x6, 0x32, 0x45, 0x45, 0x32, 0x31, 0x45, 0x45, 0x31, 0x32, 0x45, 0x45, 0x32, 0x31, 0x45, 0x45, 0xFC, 0xA8, 0x99, 0x64, 0x15, 0x63, 0x9B, 0x9B, 0x63, 0x15, 0x64, 0x99, 0x99, 0x64, 0x15, 0x63, 0x9B, 0x9B, 0x63, 0x15, 0x64, 0x99, 0x99, 0x64, 0x15, 0x63, 0x9B, 0x9B, 0x63, 0x15, 0x64, 0x99, 0x1, 0x6, 0x33, 0x44, 0x44, 0x33, 0x31, 0x44, 0x44, 0x31, 0x33, 0x44, 0x44, 0x33, 0x31, 0x44, 0x44, 0x31, 0x33, 0x44, 0x44, 0x33, 0x31, 0x44, 0x44, 0xFC, 0xA7, 0x97, 0x65, 0x16, 0x63, 0x9A, 0x9A, 0x63, 0x16, 0x65, 0x97, 0x97, 0x65, 0x16, 0x63, 0x9A, 0x9A, 0x63, 0x16, 0x65, 0x97, 0x1, 0x38, 0x45, 0x45, 0x64, 0x44, 0x44, 0x64, 0x45, 0x45, 0x64, 0x44, 0x44, 0x0, 0x1, 0xFB, 0x5D, 0x3, 0xD8, 0x0, 0x13, 0x5, 0xAC, 0x0, 0x7, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0xFC, 0x25, 0xC8, 0x4, 0xB6, 0xC8, 0xFC, 0xDA, 0x3, 0xD8, 0x1, 0xD4, 0xFE, 0x2C, 0x1, 0x16, 0x0, 0x8, 0xF9, 0x94, 0xFE, 0x4, 0x1, 0xDC, 0x6, 0x35, 0x0, 0xB, 0x0, 0x17, 0x0, 0x23, 0x0, 0x2F, 0x0, 0x3B, 0x0, 0x47, 0x0, 0x53, 0x0, 0x5F, 0x0, 0x0, 0x1, 0x17, 0x37, 0x33, 0x7, 0x17, 0x23, 0x27, 0x7, 0x23, 0x37, 0x27, 0x5, 0x17, 0x37, 0x33, 0x7, 0x17, 0x23, 0x27, 0x7, 0x23, 0x37, 0x27, 0x21, 0x17, 0x37, 0x33, 0x7, 0x17, 0x23, 0x27, 0x7, 0x23, 0x37, 0x27, 0x1, 0x17, 0x37, 0x33, 0x7, 0x17, 0x23, 0x27, 0x7, 0x23, 0x37, 0x27, 0x21, 0x17, 0x37, 0x33, 0x7, 0x17, 0x23, 0x27, 0x7, 0x23, 0x37, 0x27, 0x1, 0x17, 0x37, 0x33, 0x7, 0x17, 0x23, 0x27, 0x7, 0x23, 0x37, 0x27, 0x21, 0x17, 0x37, 0x33, 0x7, 0x17, 0x23, 0x27, 0x7, 0x23, 0x37, 0x27, 0x5, 0x17, 0x37, 0x33, 0x7, 0x17, 0x23, 0x27, 0x7, 0x23, 0x37, 0x27, 0xFD, 0x88, 0x30, 0x31, 0x8C, 0x6D, 0x70, 0x8A, 0x34, 0x34, 0x8C, 0x71, 0x6E, 0x2, 0xF7, 0x30, 0x31, 0x8A, 0x6E, 0x71, 0x8B, 0x35, 0x33, 0x8B, 0x70, 0x6D, 0xFB, 0xB5, 0x30, 0x2D, 0x90, 0x6D, 0x70, 0x8E, 0x30, 0x34, 0x8C, 0x71, 0x6E, 0x6, 0x5D, 0x30, 0x31, 0x8A, 0x6E, 0x71, 0x8B, 0x35, 0x33, 0x8B, 0x70, 0x6D, 0xF9, 0xC1, 0x30, 0x31, 0x8C, 0x6D, 0x70, 0x8A, 0x34, 0x34, 0x8C, 0x71, 0x6E, 0x6, 0x67, 0x30, 0x31, 0x8A, 0x6E, 0x71, 0x8B, 0x35, 0x33, 0x8B, 0x70, 0x6D, 0xFB, 0xA1, 0x30, 0x31, 0x8C, 0x6D, 0x70, 0x8A, 0x34, 0x34, 0x8C, 0x71, 0x6E, 0x3, 0x1, 0x30, 0x31, 0x8C, 0x6D, 0x70, 0x8A, 0x34, 0x34, 0x8C, 0x71, 0x6E, 0x6, 0x35, 0x60, 0x60, 0xB1, 0xB4, 0x65, 0x65, 0xB4, 0xB1, 0xDC, 0x60, 0x60, 0xB1, 0xB4, 0x65, 0x65, 0xB4, 0xB1, 0x60, 0x60, 0xB1, 0xB4, 0x65, 0x65, 0xB4, 0xB1, 0xFD, 0x81, 0x60, 0x60, 0xB1, 0xB4, 0x65, 0x65, 0xB4, 0xB1, 0x60, 0x60, 0xB1, 0xB4, 0x65, 0x65, 0xB4, 0xB1, 0xFD, 0x81, 0x61, 0x61, 0xB1, 0xB4, 0x64, 0x64, 0xB4, 0xB1, 0x61, 0x61, 0xB1, 0xB4, 0x64, 0x64, 0xB4, 0xB1, 0xF2, 0x61, 0x61, 0xB1, 0xB4, 0x64, 0x64, 0xB4, 0xB1, 0x0, 0x2, 0xFB, 0x5D, 0xFE, 0xB8, 0x0, 0x13, 0x5, 0xAC, 0x0, 0x7, 0x0, 0xF, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x3, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0xFC, 0x25, 0xC8, 0x4, 0xB6, 0xC8, 0xFC, 0xDA, 0xC8, 0xC8, 0x3, 0x26, 0xC8, 0xFB, 0x4A, 0x3, 0xD8, 0x1, 0xD4, 0xFE, 0x2C, 0x1, 0x16, 0xFB, 0x9E, 0xFE, 0xEA, 0x1, 0x16, 0xFE, 0x2C, 0x0, 0xA, 0xF9, 0x7A, 0xFE, 0x23, 0x1, 0xF9, 0x6, 0x3A, 0x0, 0xB, 0x0, 0xF, 0x0, 0x13, 0x0, 0x17, 0x0, 0x1B, 0x0, 0x1F, 0x0, 0x23, 0x0, 0x27, 0x0, 0x2B, 0x0, 0x2F, 0x0, 0x0, 0x1, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x1, 0x15, 0x21, 0x35, 0x21, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x21, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x21, 0x15, 0x21, 0x35, 0x1, 0x23, 0x11, 0x33, 0x1, 0x23, 0x11, 0x33, 0x1, 0x23, 0x11, 0x33, 0xFE, 0x90, 0x77, 0xC3, 0x78, 0x78, 0xC3, 0x77, 0x3, 0x69, 0xFE, 0x14, 0xFB, 0x59, 0xFE, 0x14, 0x8, 0x7F, 0xFE, 0x14, 0xFB, 0x59, 0xFE, 0x14, 0x8, 0x7F, 0xFE, 0x14, 0xFB, 0x59, 0xFE, 0x14, 0x4, 0x9F, 0xC3, 0xC3, 0xFE, 0xA2, 0xC3, 0xC3, 0x2, 0xBC, 0xC3, 0xC3, 0x5, 0x7, 0x71, 0x71, 0xC3, 0x70, 0x70, 0xFE, 0x31, 0xC3, 0xC3, 0xC3, 0xC3, 0xFE, 0xA2, 0xC3, 0xC3, 0xC3, 0xC3, 0xFE, 0xA2, 0xC3, 0xC3, 0xC3, 0xC3, 0xFC, 0xE4, 0x1, 0x88, 0xFE, 0x78, 0x1, 0x88, 0xFE, 0x78, 0x1, 0x88, 0x0, 0x2, 0x0, 0x50, 0x1, 0x8D, 0x3, 0x66, 0x5, 0x20, 0x0, 0xB, 0x0, 0x17, 0x0, 0x0, 0x13, 0x21, 0x37, 0x17, 0x21, 0x7, 0x17, 0x21, 0x7, 0x27, 0x21, 0x37, 0x33, 0x7, 0x33, 0x17, 0x37, 0x33, 0x27, 0x37, 0x23, 0x27, 0x7, 0x23, 0x50, 0x1, 0x7, 0x85, 0x84, 0x1, 0x6, 0x84, 0x84, 0xFE, 0xFA, 0x84, 0x85, 0xFE, 0xF9, 0x84, 0x8A, 0x3C, 0x7B, 0x3F, 0x40, 0x7B, 0x3E, 0x3E, 0x7B, 0x40, 0x3F, 0x7B, 0x4, 0x3A, 0xE6, 0xE6, 0xE5, 0xE2, 0xE6, 0xE6, 0xE2, 0x6C, 0x6C, 0x6C, 0x6C, 0x6D, 0x6E, 0x6E, 0x0, 0x1, 0xFC, 0xB8, 0x4, 0xA4, 0xFE, 0xA0, 0x6, 0xE0, 0x0, 0x19, 0x0, 0x0, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x26, 0x23, 0x22, 0x7, 0x33, 0x15, 0x23, 0x16, 0x33, 0x32, 0x37, 0xFE, 0xA0, 0x82, 0x61, 0x78, 0x8D, 0x8D, 0x78, 0x59, 0x8A, 0x81, 0x8, 0x5A, 0x65, 0xE, 0xA6, 0xA6, 0xD, 0x66, 0x5C, 0x6, 0x5, 0x74, 0x5E, 0x72, 0x9A, 0x7B, 0x12, 0x7B, 0x9A, 0x63, 0x5E, 0x4E, 0x78, 0x62, 0x7B, 0x5C, 0x0, 0x1, 0xFC, 0xBC, 0x4, 0xB1, 0xFE, 0xB3, 0x6, 0xD9, 0x0, 0x9, 0x0, 0x0, 0x1, 0x23, 0x11, 0x33, 0x11, 0x13, 0x33, 0x11, 0x23, 0x11, 0xFD, 0x4C, 0x90, 0x90, 0xD8, 0x8F, 0x8F, 0x4, 0xB1, 0x2, 0x28, 0xFE, 0xA8, 0x1, 0x58, 0xFD, 0xD8, 0x1, 0x54, 0x0, 0x3, 0xFC, 0xF9, 0x4, 0xB1, 0xFE, 0x80, 0x7, 0xAD, 0x0, 0x5, 0x0, 0xB, 0x0, 0xF, 0x0, 0x0, 0x0, 0x33, 0x32, 0x14, 0x23, 0x22, 0x26, 0x33, 0x32, 0x14, 0x23, 0x22, 0x5, 0x11, 0x23, 0x11, 0xFD, 0xDD, 0x51, 0x52, 0x52, 0x51, 0xE4, 0x51, 0x52, 0x52, 0x51, 0x1, 0xC, 0x8F, 0x7, 0xAD, 0x98, 0x98, 0x98, 0x3C, 0xFD, 0xD8, 0x2, 0x28, 0x0, 0x1, 0xFC, 0xA5, 0x3, 0xCC, 0xFE, 0xA8, 0x6, 0xDA, 0x0, 0x10, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x37, 0x3, 0x33, 0x13, 0x17, 0x13, 0x33, 0x3, 0x6, 0x6, 0xFD, 0x21, 0x1B, 0x27, 0x1F, 0x27, 0x2D, 0x18, 0xC5, 0x92, 0x66, 0x8, 0x75, 0x8E, 0xDE, 0x15, 0x48, 0x3, 0xCC, 0x9, 0x6D, 0x2, 0x22, 0x49, 0x2, 0x2F, 0xFE, 0xAA, 0x24, 0x1, 0x7A, 0xFD, 0x7F, 0x39, 0x54, 0x0, 0x2, 0xFC, 0x2E, 0x4, 0xB1, 0xFE, 0xD9, 0x6, 0xD9, 0x0, 0xB, 0x0, 0x12, 0x0, 0x0, 0x1, 0x11, 0x23, 0x35, 0x21, 0x15, 0x33, 0x20, 0x15, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x35, 0x34, 0x23, 0x23, 0xFC, 0xE0, 0xB2, 0x1, 0x41, 0x67, 0x1, 0x3, 0x87, 0x6A, 0x79, 0x79, 0x62, 0x62, 0x79, 0x4, 0xB1, 0x1, 0xBA, 0x6E, 0xA2, 0xC3, 0x62, 0x61, 0x6F, 0x55, 0x52, 0x0, 0x3, 0xFC, 0x67, 0x4, 0xB1, 0xFF, 0x31, 0x6, 0xD9, 0x0, 0x9, 0x0, 0xD, 0x0, 0x14, 0x0, 0x0, 0x1, 0x11, 0x33, 0x15, 0x33, 0x20, 0x15, 0x14, 0x6, 0x23, 0x1, 0x11, 0x23, 0x11, 0x1, 0x33, 0x32, 0x35, 0x34, 0x23, 0x23, 0xFC, 0x67, 0x8F, 0x69, 0x1, 0x1, 0x86, 0x6B, 0x1, 0xC2, 0x8F, 0xFE, 0x54, 0x79, 0x62, 0x62, 0x79, 0x4, 0xB1, 0x2, 0x28, 0xA2, 0xC3, 0x62, 0x61, 0x2, 0x28, 0xFD, 0xD8, 0x2, 0x28, 0xFE, 0x47, 0x55, 0x52, 0x0, 0x2, 0xFC, 0xE0, 0x4, 0xB1, 0xFE, 0xD9, 0x6, 0xD9, 0x0, 0x9, 0x0, 0x10, 0x0, 0x0, 0x1, 0x11, 0x33, 0x15, 0x33, 0x20, 0x15, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x35, 0x34, 0x23, 0x23, 0xFC, 0xE0, 0x8F, 0x67, 0x1, 0x3, 0x87, 0x6A, 0x79, 0x79, 0x62, 0x62, 0x79, 0x4, 0xB1, 0x2, 0x28, 0xA2, 0xC3, 0x62, 0x61, 0x6F, 0x55, 0x52, 0x0, 0x1, 0xFC, 0x32, 0x4, 0xA7, 0xFF, 0x3B, 0x6, 0xD9, 0x0, 0x17, 0x0, 0x0, 0x1, 0x22, 0x27, 0x6, 0x23, 0x22, 0x27, 0x11, 0x33, 0x11, 0x14, 0x32, 0x35, 0x11, 0x33, 0x11, 0x14, 0x32, 0x35, 0x11, 0x33, 0x11, 0x14, 0x6, 0xFE, 0x55, 0x60, 0x3D, 0x3B, 0x65, 0xE0, 0x6, 0x8F, 0xAE, 0x8F, 0xAE, 0x8F, 0x73, 0x4, 0xA7, 0x4B, 0x4B, 0xDA, 0x1, 0x58, 0xFE, 0xB5, 0x73, 0x73, 0x1, 0x4B, 0xFE, 0xB5, 0x73, 0x73, 0x1, 0x4B, 0xFE, 0xB6, 0x7C, 0x6C, 0xFF, 0xFF, 0xFC, 0x75, 0x4, 0xCC, 0xFE, 0xFA, 0x5, 0xE7, 0x0, 0x7, 0x1, 0x89, 0xFB, 0xFF, 0x0, 0x0, 0x0, 0x1, 0xFC, 0x99, 0x4, 0x69, 0xFE, 0xD9, 0x5, 0xE4, 0x0, 0xF, 0x0, 0x0, 0x1, 0x23, 0x37, 0x6, 0x23, 0x22, 0x26, 0x37, 0x33, 0x6, 0x16, 0x33, 0x32, 0x37, 0x37, 0x33, 0xFE, 0x82, 0x99, 0x1E, 0x23, 0x25, 0x7A, 0xAC, 0xB, 0x9B, 0x2, 0x3D, 0x4E, 0x39, 0x2C, 0x13, 0x99, 0x4, 0x69, 0x6F, 0xA, 0x91, 0x85, 0x3A, 0x5E, 0x16, 0x47, 0xFF, 0xFF, 0x0, 0x50, 0x4, 0xCC, 0x2, 0xD5, 0x5, 0xE7, 0x0, 0x6, 0x1, 0x89, 0xDA, 0x0, 0xFF, 0xFF, 0x0, 0x47, 0x4, 0x69, 0x2, 0x87, 0x5, 0xE4, 0x0, 0x7, 0x6, 0x16, 0x3, 0xAE, 0x0, 0x0, 0x0, 0x2, 0x0, 0x24, 0xFE, 0x9A, 0x5, 0xDC, 0x6, 0xCE, 0x0, 0x5, 0x0, 0x16, 0x0, 0x0, 0x25, 0x21, 0x11, 0x21, 0x3, 0x2, 0x1, 0x11, 0x21, 0x11, 0x23, 0x3, 0x33, 0x36, 0x12, 0x13, 0x13, 0x33, 0x3, 0x21, 0x11, 0x33, 0x3, 0x1, 0xB6, 0x2, 0x71, 0xFE, 0x57, 0x1B, 0x1E, 0x2, 0x9A, 0xFC, 0x41, 0xF3, 0x9, 0x76, 0x37, 0x83, 0x14, 0x37, 0xFC, 0x11, 0x2, 0x9A, 0xB8, 0xD, 0xCA, 0x4, 0x1B, 0xFE, 0x4A, 0xFE, 0x79, 0xFC, 0xF2, 0x1, 0x66, 0xFE, 0x9A, 0x2, 0x30, 0x35, 0x1, 0x1D, 0x1, 0x30, 0x3, 0x82, 0xFE, 0xE2, 0xFB, 0x1A, 0xFD, 0xD0, 0x0, 0x2, 0x0, 0x27, 0xFE, 0xBE, 0x4, 0xC6, 0x5, 0x7A, 0x0, 0x5, 0x0, 0x16, 0x0, 0x0, 0x25, 0x21, 0x11, 0x21, 0x7, 0x2, 0x3, 0x11, 0x23, 0x11, 0x33, 0x36, 0x36, 0x37, 0x13, 0x33, 0x3, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x1, 0x9F, 0x1, 0x9E, 0xFE, 0xEE, 0x6, 0xE, 0xF9, 0xF7, 0x5A, 0x55, 0x56, 0x7, 0x15, 0xF2, 0x9, 0x1, 0xFF, 0x96, 0xF3, 0xC3, 0x2, 0xA6, 0xCF, 0xFE, 0xD8, 0xFE, 0x8E, 0xFE, 0xBE, 0x2, 0x5, 0x5F, 0xCA, 0xCA, 0x2, 0xC4, 0xFE, 0xC0, 0xFC, 0x89, 0xFD, 0xFB, 0x1, 0x42, 0x0, 0x1, 0x0, 0x4D, 0xFE, 0x4B, 0x4, 0x86, 0x5, 0xC4, 0x0, 0x25, 0x0, 0x0, 0x25, 0x34, 0x26, 0x24, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x0, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x0, 0x23, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x20, 0x3, 0x8A, 0x91, 0xFE, 0xA5, 0xC2, 0x62, 0x1, 0x1A, 0xE6, 0xF8, 0x1, 0x13, 0xFC, 0x84, 0x8D, 0x85, 0x7C, 0xB0, 0x8F, 0xEE, 0xE2, 0xFE, 0xDF, 0xF1, 0x8D, 0xFC, 0x9E, 0xFC, 0xB9, 0x7A, 0x1, 0xE, 0x38, 0x79, 0xAD, 0xC1, 0xA0, 0xB8, 0x7B, 0xDE, 0xF4, 0xFE, 0xF8, 0xB3, 0x6B, 0x87, 0x8C, 0x7D, 0x83, 0x9C, 0x51, 0x86, 0xFD, 0xC7, 0xEA, 0xFE, 0xFD, 0x66, 0xCB, 0x98, 0x87, 0x78, 0x0, 0x1, 0x0, 0x4D, 0xFE, 0x4B, 0x3, 0xCC, 0x4, 0x4E, 0x0, 0x24, 0x0, 0x0, 0x5, 0x34, 0x26, 0x24, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x2, 0xDD, 0x7C, 0xFE, 0xE2, 0x67, 0x6B, 0xE1, 0xC1, 0xCB, 0xE6, 0xF3, 0x60, 0x5F, 0xB4, 0x66, 0x83, 0xC1, 0xC4, 0xEB, 0xCB, 0xDF, 0xEA, 0xEC, 0x5, 0x89, 0x52, 0x60, 0x64, 0x29, 0x6C, 0x83, 0x91, 0x63, 0x67, 0xB4, 0xAF, 0xCA, 0xC6, 0x92, 0x3F, 0x63, 0xC2, 0x50, 0x84, 0x42, 0x61, 0xEA, 0xA0, 0xB3, 0xD7, 0xE4, 0x86, 0x65, 0x4F, 0x72, 0x0, 0x1, 0x0, 0x49, 0xFF, 0xEC, 0x9, 0x90, 0x5, 0xC4, 0x0, 0x36, 0x0, 0x0, 0x1, 0x14, 0x4, 0x23, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x25, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x33, 0x32, 0x4, 0x15, 0x14, 0x7, 0x33, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x16, 0x4, 0x7F, 0xFE, 0xCB, 0xF0, 0x81, 0xF3, 0x9D, 0xFD, 0x98, 0x7C, 0x8E, 0x9A, 0xFE, 0xF6, 0xB9, 0xAB, 0x8A, 0x78, 0x83, 0x8F, 0x6C, 0x94, 0xFC, 0x1, 0x2D, 0xCF, 0xF0, 0x1, 0x1F, 0x59, 0xEA, 0xFD, 0x8A, 0x1, 0xAD, 0x1, 0x36, 0xFE, 0xD, 0x2, 0x1F, 0xFE, 0xD0, 0xFE, 0x43, 0xAC, 0xFD, 0xBF, 0x44, 0x1, 0x98, 0xCD, 0xDF, 0x58, 0xBB, 0x95, 0x5B, 0x83, 0x81, 0x61, 0xE5, 0x6, 0xC7, 0x79, 0x61, 0x56, 0x7F, 0x72, 0x5B, 0xBE, 0xDA, 0xD3, 0xCC, 0x7A, 0x5E, 0x2, 0x63, 0xFD, 0x9D, 0x2, 0x63, 0xFD, 0x47, 0xFD, 0x9, 0x2, 0x70, 0xFD, 0x90, 0x2, 0x70, 0x58, 0x0, 0x1, 0x0, 0x4E, 0xFF, 0xEC, 0x7, 0xFE, 0x4, 0x4D, 0x0, 0x35, 0x0, 0x0, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x33, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x16, 0x3, 0xC4, 0xF7, 0xC5, 0x6D, 0xCB, 0x82, 0xF2, 0x6E, 0x61, 0x64, 0x5E, 0xB7, 0xB3, 0xBB, 0x9C, 0x4D, 0x62, 0x52, 0x6C, 0xF2, 0xFA, 0xAF, 0xC4, 0xE5, 0x2E, 0xA5, 0xF3, 0x6C, 0x1, 0x2A, 0x1, 0x2D, 0xFE, 0x78, 0x1, 0xA8, 0xFE, 0xC5, 0xFE, 0xD3, 0x7B, 0xF3, 0x7F, 0x1B, 0x1, 0x32, 0x9A, 0xAC, 0x48, 0x97, 0x76, 0x3D, 0x5E, 0x5D, 0x3A, 0x92, 0x2, 0xB0, 0x4, 0x82, 0x34, 0x57, 0x4D, 0x3E, 0x98, 0xAE, 0xA1, 0x9A, 0x4A, 0x3D, 0x1, 0xAF, 0xFE, 0x51, 0x1, 0xAF, 0xFD, 0xFA, 0xFD, 0xCC, 0x1, 0xAD, 0xFE, 0x53, 0x1, 0xAD, 0x36, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x5, 0xD0, 0x5, 0xB0, 0x0, 0x20, 0x0, 0x0, 0x21, 0x23, 0x11, 0x6, 0x23, 0x22, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x5, 0xD0, 0xFD, 0x4A, 0x3F, 0x9D, 0x62, 0x3B, 0x96, 0x31, 0xDD, 0xE7, 0x1, 0xFC, 0x64, 0x6F, 0x33, 0x31, 0x2B, 0xFC, 0x5D, 0x6F, 0x40, 0x3F, 0xFD, 0x2, 0x24, 0x11, 0x32, 0x18, 0x1A, 0xD4, 0xFB, 0x1, 0xCE, 0xFE, 0x36, 0x90, 0x78, 0x9, 0x65, 0x9A, 0x1, 0xCA, 0xFE, 0x36, 0x90, 0x78, 0xF, 0x2, 0xC3, 0x0, 0x1, 0x0, 0x36, 0x0, 0x0, 0x4, 0xEB, 0x4, 0x3B, 0x0, 0x1F, 0x0, 0x0, 0x21, 0x23, 0x11, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x4, 0xEB, 0xF3, 0x36, 0x33, 0x83, 0x57, 0x79, 0x70, 0xC3, 0xD3, 0xF3, 0x48, 0x5A, 0x2A, 0x2A, 0x22, 0xF2, 0x46, 0x59, 0x35, 0x35, 0xF3, 0x1, 0x5D, 0x9, 0x29, 0x29, 0xC0, 0xDB, 0x1, 0x4C, 0xFE, 0xB4, 0x6E, 0x6A, 0x8, 0x55, 0x7B, 0x1, 0x4C, 0xFE, 0xB4, 0x6E, 0x6A, 0x9, 0x2, 0x1A, 0x0, 0x2, 0x0, 0x24, 0xFE, 0x4B, 0x6, 0xF2, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x2F, 0x0, 0x0, 0x25, 0x21, 0x11, 0x21, 0x3, 0x2, 0x1, 0x22, 0x26, 0x35, 0x33, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0x23, 0x31, 0x21, 0x11, 0x23, 0x3, 0x33, 0x36, 0x12, 0x13, 0x13, 0x21, 0x11, 0x33, 0x20, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x1, 0xB6, 0x2, 0x71, 0xFE, 0x57, 0x1A, 0x1E, 0x3, 0xB0, 0x64, 0xA8, 0x8E, 0x6, 0x72, 0x6C, 0x66, 0x61, 0x61, 0x5B, 0x54, 0x40, 0x4C, 0x4D, 0xFB, 0xFC, 0xF3, 0x9, 0x76, 0x36, 0x82, 0x14, 0x28, 0x3, 0x96, 0xBD, 0x1, 0x6, 0x6B, 0x76, 0x94, 0xCA, 0x4, 0x1B, 0xFE, 0x57, 0xFE, 0x6D, 0xFC, 0xA2, 0x5C, 0x64, 0x46, 0x49, 0x44, 0x1, 0x77, 0x1, 0x3E, 0x3C, 0x45, 0xFE, 0x9A, 0x2, 0x30, 0x34, 0x1, 0x19, 0x1, 0x27, 0x2, 0x72, 0xFB, 0x1A, 0xB5, 0x5A, 0x2A, 0x25, 0x6B, 0x55, 0x61, 0x0, 0x2, 0x0, 0x27, 0xFE, 0x4B, 0x5, 0xDD, 0x4, 0x3A, 0x0, 0x5, 0x0, 0x2F, 0x0, 0x0, 0x25, 0x5, 0x11, 0x21, 0x7, 0x2, 0x1, 0x22, 0x26, 0x35, 0x33, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0x23, 0x21, 0x11, 0x23, 0x13, 0x33, 0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x1, 0xA1, 0x1, 0x9C, 0xFE, 0xF0, 0x6, 0xD, 0x2, 0xC4, 0x5D, 0xAC, 0x8E, 0x6, 0x72, 0x6C, 0x66, 0x61, 0x61, 0x5B, 0x54, 0x3D, 0x46, 0x35, 0xFC, 0xEE, 0xF7, 0x1, 0x5A, 0x53, 0x5B, 0x6, 0xA, 0x2, 0xF0, 0xA7, 0x70, 0x8B, 0x6A, 0x75, 0x8E, 0xC4, 0x1, 0x2, 0xA6, 0xD3, 0xFE, 0xDC, 0xFC, 0xD9, 0x5C, 0x64, 0x46, 0x49, 0x44, 0x1, 0x77, 0x1, 0x3E, 0x3C, 0x45, 0xFE, 0xBE, 0x2, 0x6, 0x5D, 0xC9, 0xCD, 0x1, 0x83, 0xFC, 0x89, 0x5A, 0x56, 0x58, 0x2A, 0x25, 0x6B, 0x55, 0x61, 0x0, 0x1, 0x0, 0x2D, 0xFE, 0x4B, 0x5, 0x7A, 0x5, 0xB0, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x6, 0x4, 0x19, 0x44, 0x3B, 0xE, 0x26, 0x3D, 0x7B, 0x1, 0x66, 0x60, 0x92, 0x4B, 0xF3, 0xFE, 0x3C, 0x4, 0x7D, 0xFE, 0x3A, 0x71, 0xBF, 0xA1, 0xC4, 0x1, 0xBC, 0xFE, 0x4B, 0x11, 0xC5, 0xC, 0xA9, 0x2, 0xE2, 0x83, 0x65, 0x69, 0xFC, 0xE1, 0x4, 0xED, 0xC3, 0xC3, 0xFE, 0xC2, 0x9F, 0xC4, 0xE3, 0xFD, 0x1A, 0xB6, 0xC0, 0x0, 0x1, 0x0, 0x24, 0xFE, 0x4B, 0x4, 0xFD, 0x4, 0x3A, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x6, 0x3, 0x9C, 0x49, 0x3C, 0xA, 0x25, 0x37, 0x3B, 0x52, 0x62, 0x5D, 0x92, 0x48, 0xF3, 0xFE, 0xA6, 0x3, 0xAD, 0xFE, 0xA0, 0x76, 0xB6, 0xA0, 0xC0, 0xCF, 0xFE, 0x4B, 0x11, 0xB1, 0xB, 0x53, 0x56, 0x1, 0x90, 0x83, 0x6F, 0x81, 0xFE, 0x54, 0x3, 0x79, 0xC1, 0xC1, 0xFE, 0xF0, 0x8A, 0xD0, 0xEA, 0xFE, 0x72, 0xC2, 0x9E, 0x0, 0x1, 0x0, 0x2D, 0xFF, 0xEC, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x11, 0x0, 0x0, 0x21, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x3, 0xD3, 0x46, 0x53, 0x84, 0xC7, 0xFE, 0x3E, 0x4, 0x83, 0xFE, 0x3B, 0x5C, 0x34, 0x1D, 0x3B, 0x14, 0x9F, 0xB1, 0x3, 0xA9, 0xCB, 0xCB, 0xFC, 0x57, 0x55, 0x32, 0xB, 0x0, 0x1, 0x0, 0x24, 0xFF, 0xEC, 0x3, 0xD1, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x0, 0x21, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x3, 0x5B, 0x46, 0x4F, 0x84, 0xC4, 0xFE, 0xA6, 0x3, 0xAD, 0xFE, 0xA0, 0x5E, 0x34, 0x1D, 0x3B, 0x14, 0xAC, 0xB8, 0x2, 0x29, 0xC1, 0xC1, 0xFD, 0xD6, 0x5C, 0x3E, 0xB, 0x0, 0x1, 0x0, 0x93, 0xFE, 0x65, 0x5, 0xF5, 0x5, 0xB0, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x20, 0x25, 0x37, 0x16, 0x4, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x4, 0x3, 0x63, 0xFE, 0x90, 0xFE, 0xC2, 0x54, 0x75, 0x1, 0x38, 0xB8, 0x94, 0xFF, 0x18, 0xFB, 0xAA, 0xFC, 0x2, 0x81, 0xFD, 0x8F, 0x27, 0x32, 0xB6, 0xFE, 0xD4, 0xFE, 0x65, 0x8F, 0xC1, 0x34, 0x4B, 0x3D, 0x44, 0x25, 0x24, 0x5, 0xB0, 0xFB, 0x1A, 0x4, 0xE6, 0xFB, 0x1A, 0x3E, 0x78, 0x44, 0x8A, 0x9F, 0x42, 0x0, 0x1, 0x0, 0x87, 0xFE, 0x6D, 0x4, 0xE6, 0x4, 0x3A, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x20, 0x25, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x6, 0x2, 0xC5, 0xFE, 0xDB, 0xFE, 0xF9, 0x4B, 0x68, 0xE1, 0x94, 0x8B, 0xAE, 0x18, 0xFC, 0xA5, 0xF3, 0x1, 0xA7, 0xF3, 0x7F, 0x24, 0x2F, 0x9B, 0xF9, 0xFE, 0x6D, 0x7C, 0xB4, 0x32, 0x39, 0x44, 0x41, 0x25, 0x24, 0x4, 0x3A, 0xFC, 0x89, 0x3, 0x77, 0xFC, 0x8C, 0x3E, 0x74, 0x44, 0x81, 0x9C, 0x46, 0x0, 0x1, 0x0, 0x2D, 0xFE, 0xCA, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x17, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x23, 0x22, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x97, 0x3E, 0x5E, 0x6C, 0x9E, 0x73, 0x8B, 0xFE, 0x3E, 0x4, 0x83, 0xFE, 0x3B, 0xF8, 0x51, 0x41, 0x2C, 0x42, 0x2B, 0xFE, 0xF8, 0x2E, 0x6C, 0x75, 0x5E, 0x8E, 0x4, 0x4E, 0xCB, 0xCB, 0xFB, 0x1B, 0x56, 0x32, 0x28, 0x1C, 0x0, 0x1, 0x0, 0x24, 0xFE, 0xCA, 0x3, 0xD1, 0x4, 0x3A, 0x0, 0x18, 0x0, 0x0, 0x25, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x23, 0x22, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x1, 0x7E, 0xFE, 0xA6, 0x3, 0xAD, 0xFE, 0xA0, 0xF3, 0x51, 0x41, 0x2C, 0x44, 0x29, 0x1B, 0x3E, 0x5E, 0x6C, 0x9E, 0x73, 0x7F, 0x97, 0x2, 0xE2, 0xC1, 0xC1, 0xFC, 0x87, 0x56, 0x32, 0x28, 0x1C, 0x74, 0x2E, 0x6C, 0x75, 0x5D, 0x8F, 0x0, 0x1, 0x0, 0x1B, 0x0, 0x0, 0x6, 0x38, 0x5, 0xB0, 0x0, 0x15, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x6, 0x23, 0x22, 0x24, 0x27, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x6, 0x38, 0xFD, 0x9E, 0xB4, 0xF3, 0xFE, 0xE3, 0x2, 0xFE, 0x44, 0x4, 0x58, 0xFE, 0x61, 0x8A, 0x8B, 0xA9, 0xA9, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x3E, 0x29, 0xD6, 0xF5, 0x1, 0x5, 0xCB, 0xCB, 0xFE, 0x9A, 0x6D, 0x29, 0x2, 0xA7, 0x0, 0x1, 0x0, 0x11, 0x0, 0x0, 0x4, 0xEC, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x4, 0xEC, 0xF3, 0x63, 0x63, 0xD2, 0xF6, 0xFE, 0xA6, 0x3, 0x84, 0xFE, 0xC9, 0x6A, 0x6B, 0x64, 0x62, 0x4, 0x3A, 0xFB, 0xC6, 0x1, 0x6A, 0x16, 0xC9, 0xD2, 0x89, 0xC2, 0xC2, 0x89, 0x76, 0x62, 0x17, 0x2, 0xC, 0x0, 0x1, 0x0, 0x85, 0x0, 0x0, 0x4, 0xE8, 0x5, 0xC4, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x36, 0x33, 0x32, 0x4, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0xDE, 0xB2, 0xAB, 0xFC, 0xD6, 0xA9, 0x45, 0x3B, 0xA, 0x32, 0x2F, 0x3D, 0x5B, 0xAC, 0xB1, 0xF0, 0x1, 0x18, 0x2, 0xFC, 0x87, 0x3, 0x33, 0x2B, 0xFC, 0xF8, 0x4, 0x4E, 0xB6, 0xC0, 0x11, 0xC2, 0xC, 0x53, 0x5C, 0x7C, 0x2B, 0xCC, 0xFC, 0xFD, 0xCB, 0x2, 0x2E, 0x97, 0x6E, 0x0, 0x1, 0x0, 0x7E, 0x0, 0x0, 0x3, 0xFD, 0x6, 0x1F, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0x4B, 0x93, 0x48, 0xF2, 0xCF, 0x91, 0x4E, 0x37, 0x9, 0x2A, 0x32, 0x3A, 0x54, 0x76, 0xB7, 0xA0, 0xC0, 0xF3, 0x62, 0x3, 0x88, 0x83, 0xFC, 0xFB, 0x4, 0xC0, 0xC2, 0x9D, 0x10, 0xB1, 0xB, 0x53, 0x56, 0xFC, 0x8A, 0xD0, 0xEA, 0xFD, 0x6C, 0x2, 0x96, 0x83, 0x6F, 0x0, 0x1, 0x0, 0x93, 0xFE, 0x65, 0x7, 0xC6, 0x5, 0xB0, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x20, 0x25, 0x37, 0x16, 0x4, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x4, 0x5, 0x34, 0xFE, 0x92, 0xFE, 0xC0, 0x54, 0x75, 0x1, 0x39, 0xB8, 0x94, 0xFF, 0x19, 0xF9, 0xD9, 0xFD, 0x1, 0xBD, 0xFC, 0x1, 0xB9, 0xFC, 0x6F, 0x27, 0x32, 0xB6, 0xFE, 0xD4, 0xFE, 0x65, 0x8F, 0xC1, 0x34, 0x4B, 0x3D, 0x44, 0x25, 0x24, 0x5, 0xB0, 0xFB, 0x1A, 0x4, 0xE6, 0xFB, 0x1A, 0x4, 0xE6, 0xFB, 0x1A, 0x3E, 0x78, 0x44, 0x8A, 0x9F, 0x42, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x6D, 0x6, 0xD0, 0x4, 0x3A, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x20, 0x25, 0x37, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x6, 0x4, 0xB0, 0xFE, 0xDA, 0xFE, 0xF9, 0x4C, 0x68, 0xE0, 0x94, 0x8B, 0xAE, 0x18, 0xFA, 0xB1, 0xF2, 0x1, 0x53, 0xF3, 0x1, 0x53, 0xF2, 0x83, 0x25, 0x2E, 0x9B, 0xF9, 0xFE, 0x6D, 0x7C, 0xB4, 0x32, 0x39, 0x44, 0x41, 0x27, 0x22, 0x4, 0x3A, 0xFC, 0x89, 0x3, 0x77, 0xFC, 0x89, 0x3, 0x77, 0xFC, 0x89, 0x3F, 0x70, 0x44, 0x81, 0x9C, 0x46, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x8, 0xE0, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x0, 0x34, 0x3, 0xC1, 0x0, 0x0, 0x0, 0x3, 0x0, 0x50, 0xFF, 0xEC, 0x7, 0x3D, 0x4, 0x4E, 0x0, 0x16, 0x0, 0x24, 0x0, 0x32, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x0, 0x17, 0x15, 0x14, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x5, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x5, 0x46, 0xF4, 0x8B, 0x8B, 0xF4, 0xEB, 0xFE, 0xF7, 0x4, 0x1, 0xA, 0xEC, 0xF5, 0x8C, 0x40, 0xC1, 0x7C, 0xEC, 0x1, 0x9, 0x4, 0xFE, 0xF6, 0xFE, 0xE, 0x7D, 0x88, 0x87, 0x7D, 0x7D, 0x89, 0x87, 0x7C, 0xFD, 0x2, 0x7D, 0x88, 0x87, 0x7D, 0x7D, 0x89, 0x87, 0x7C, 0x14, 0xAD, 0xAD, 0x1, 0x33, 0xE6, 0x22, 0xEC, 0x1, 0x3B, 0xAE, 0x51, 0x5D, 0xFE, 0xCD, 0xE7, 0x22, 0xEB, 0xFE, 0xC5, 0x2, 0x26, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x15, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x0, 0x5, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x12, 0x0, 0x16, 0x0, 0x1B, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x25, 0x11, 0x6, 0x6, 0x7, 0x21, 0x2, 0x27, 0x11, 0x3, 0x11, 0x21, 0x16, 0x16, 0x5, 0x36, 0x13, 0x21, 0x5, 0x1F, 0xFE, 0xB5, 0xFE, 0xF0, 0xFE, 0xF6, 0xFE, 0xAC, 0x1, 0x52, 0x1, 0xA, 0x1, 0x10, 0x1, 0x4D, 0xFD, 0x51, 0x75, 0x8D, 0xA, 0x2, 0xBD, 0x12, 0xF8, 0xA7, 0xFE, 0xF4, 0x6, 0x8E, 0x1, 0x1F, 0xFE, 0xC, 0xFE, 0xF6, 0x2, 0xB3, 0xFE, 0xB4, 0xFE, 0x85, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xFE, 0x84, 0xFE, 0xB4, 0x39, 0x1, 0xB5, 0x1C, 0xDD, 0xBC, 0x1, 0x7A, 0x3A, 0xFE, 0x4C, 0xFD, 0x91, 0x1, 0xC8, 0xC3, 0xE8, 0x1E, 0x3B, 0x1, 0x8E, 0x0, 0x5, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x12, 0x0, 0x17, 0x0, 0x1C, 0x0, 0x21, 0x0, 0x0, 0x13, 0x34, 0x0, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x23, 0x22, 0x0, 0x27, 0x25, 0x11, 0x6, 0x6, 0x7, 0x21, 0x26, 0x26, 0x27, 0x11, 0x3, 0x11, 0x23, 0x16, 0x16, 0x17, 0x36, 0x36, 0x37, 0x23, 0x50, 0x1, 0xA, 0xEC, 0xEF, 0x1, 0x9, 0xFE, 0xF7, 0xED, 0xEB, 0xFE, 0xF7, 0x4, 0x1, 0xA3, 0x4D, 0x54, 0xB, 0x2, 0x1, 0xC, 0x55, 0x4D, 0xA7, 0xAC, 0xB, 0x54, 0xF4, 0x4E, 0x55, 0xB, 0xAE, 0x2, 0x27, 0xEC, 0x1, 0x3B, 0xFE, 0xC5, 0xEC, 0x15, 0xEB, 0xFE, 0xC5, 0x1, 0x33, 0xE6, 0x6C, 0x1, 0xC, 0x1B, 0x92, 0x5F, 0x5F, 0x92, 0x1B, 0xFE, 0xF4, 0xFE, 0x4C, 0x1, 0xC, 0x60, 0x91, 0x1C, 0x1A, 0x92, 0x61, 0x0, 0x2, 0x0, 0x28, 0x2, 0x8C, 0x3, 0xA0, 0x5, 0xAD, 0x0, 0xB, 0x0, 0x14, 0x0, 0x0, 0x13, 0x11, 0x23, 0x35, 0x21, 0x11, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0xF6, 0xCE, 0x1, 0x93, 0xAB, 0x94, 0xA6, 0xAC, 0x98, 0xA1, 0x91, 0x4B, 0x45, 0x40, 0x47, 0x9A, 0x2, 0x8C, 0x2, 0x7A, 0xA7, 0xFE, 0xFF, 0xA6, 0xDA, 0xA0, 0xA7, 0x3D, 0x2E, 0x2C, 0x3B, 0x0, 0x2, 0x0, 0x64, 0x2, 0x8C, 0x3, 0xF, 0x5, 0xAD, 0x0, 0x9, 0x0, 0x12, 0x0, 0x0, 0x13, 0x11, 0x33, 0x11, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x27, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x64, 0xC5, 0xAB, 0x95, 0xA6, 0xAC, 0x98, 0xA2, 0x91, 0x4C, 0x44, 0x40, 0x46, 0x9B, 0x2, 0x8C, 0x3, 0x21, 0xFE, 0xFF, 0xA6, 0xDA, 0xA0, 0xA7, 0x3D, 0x2E, 0x2C, 0x3B, 0x0, 0x1, 0xFC, 0x78, 0x4, 0xA4, 0xFF, 0x51, 0x6, 0xE0, 0x0, 0x1F, 0x0, 0x0, 0x3, 0x14, 0x6, 0x23, 0x22, 0x26, 0x27, 0x23, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x26, 0x23, 0x22, 0x7, 0x33, 0x15, 0x23, 0x16, 0x33, 0x32, 0x37, 0xAF, 0x83, 0x61, 0x6E, 0x89, 0xC, 0x62, 0x90, 0x90, 0x64, 0xE, 0x89, 0x6B, 0x58, 0x8B, 0x82, 0x8, 0x59, 0x66, 0xE, 0xA7, 0xA7, 0xD, 0x66, 0x5C, 0x6, 0x5, 0x74, 0x5E, 0x72, 0x82, 0x6A, 0xDF, 0x2, 0x28, 0xD9, 0x65, 0x7B, 0x63, 0x5E, 0x4E, 0x78, 0x62, 0x7B, 0x5C, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x60, 0x2, 0x8, 0x0, 0x9C, 0x0, 0x11, 0x0, 0x0, 0x1, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x33, 0x15, 0x23, 0x22, 0x15, 0x14, 0x16, 0x33, 0x33, 0x2, 0x8, 0xAF, 0x85, 0x84, 0x85, 0x84, 0xAF, 0xAE, 0x7B, 0x3B, 0x3E, 0xB0, 0xFE, 0x60, 0xA3, 0x71, 0x13, 0x71, 0xA4, 0x74, 0xB4, 0x43, 0x5D, 0x0, 0x2, 0x0, 0x50, 0xFD, 0xD5, 0x2, 0x8, 0x0, 0x9C, 0x0, 0x10, 0x0, 0x14, 0x0, 0x0, 0x1, 0x23, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x15, 0x23, 0x22, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x15, 0x21, 0x35, 0x2, 0x8, 0xB3, 0x82, 0x83, 0x85, 0x84, 0xAF, 0xAD, 0x7C, 0x3B, 0x3E, 0xB0, 0xFE, 0x6B, 0xFE, 0x84, 0x1, 0x99, 0x78, 0x6C, 0x9A, 0x73, 0xA0, 0x3D, 0x56, 0xAF, 0x72, 0x72, 0xFF, 0xFF, 0x0, 0x50, 0x3, 0x9A, 0x2, 0x8, 0x5, 0xD6, 0x0, 0x7, 0x6, 0x38, 0x0, 0x0, 0x5, 0x3A, 0x0, 0x2, 0x0, 0x50, 0x2, 0xEA, 0x2, 0x8, 0x5, 0xD5, 0x0, 0x11, 0x0, 0x15, 0x0, 0x0, 0x1, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x33, 0x15, 0x23, 0x22, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x15, 0x21, 0x35, 0x2, 0x8, 0xAF, 0x85, 0x84, 0x85, 0x84, 0xAF, 0xAE, 0x7B, 0x3B, 0x3E, 0xB0, 0xFE, 0x6B, 0x3, 0x99, 0xA4, 0x71, 0x13, 0x71, 0xA3, 0x73, 0xB4, 0x43, 0x5E, 0xAF, 0x74, 0x74, 0x0, 0x1, 0x0, 0x50, 0x3, 0x9A, 0x2, 0x8, 0x5, 0xD6, 0x0, 0x11, 0x0, 0x0, 0x13, 0x35, 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x50, 0xAF, 0x7A, 0x3B, 0x3D, 0xB1, 0xAF, 0x84, 0x85, 0x84, 0x85, 0x3, 0x9A, 0x74, 0xB3, 0x42, 0x5F, 0x74, 0xA4, 0x71, 0x12, 0x71, 0xA4, 0x0, 0x2, 0x0, 0x50, 0x2, 0xEA, 0x2, 0xE, 0x5, 0xD6, 0x0, 0x11, 0x0, 0x15, 0x0, 0x0, 0x13, 0x35, 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x17, 0x15, 0x21, 0x35, 0x56, 0xAF, 0x7A, 0x3B, 0x3D, 0xB1, 0xAF, 0x84, 0x85, 0x84, 0x85, 0xE0, 0xFE, 0x6B, 0x3, 0x9A, 0x74, 0xB3, 0x42, 0x5F, 0x74, 0xA4, 0x71, 0x12, 0x71, 0xA4, 0x3C, 0x74, 0x74, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x60, 0x2, 0x8, 0x0, 0x9C, 0x0, 0x11, 0x0, 0x0, 0x13, 0x35, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x50, 0xB1, 0x78, 0x3B, 0x3D, 0xB1, 0xAF, 0x84, 0x85, 0x84, 0x85, 0xFE, 0x60, 0x74, 0x1, 0xB2, 0x41, 0x60, 0x74, 0xA4, 0x71, 0x13, 0x71, 0xA3, 0x0, 0x2, 0x0, 0x50, 0xFD, 0xD5, 0x2, 0xE, 0x0, 0x9C, 0x0, 0x11, 0x0, 0x15, 0x0, 0x0, 0x13, 0x35, 0x33, 0x32, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x17, 0x15, 0x21, 0x35, 0x56, 0xAD, 0x7C, 0x3B, 0x3D, 0xB1, 0xAF, 0x84, 0x85, 0x84, 0x85, 0xE0, 0xFE, 0x6B, 0xFE, 0x85, 0x74, 0x9F, 0x3B, 0x55, 0x74, 0x99, 0x6B, 0xF, 0x6A, 0x9A, 0x3C, 0x74, 0x74, 0x0, 0x2, 0x0, 0x32, 0xFE, 0xF2, 0x2, 0x6C, 0x5, 0xC4, 0x0, 0x9, 0x0, 0xD, 0x0, 0x0, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x11, 0x23, 0x11, 0x32, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x2, 0x3A, 0xA8, 0x5, 0x48, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x9C, 0xF9, 0x42, 0x6, 0xBE, 0x0, 0x2, 0x0, 0x3C, 0xFE, 0xF2, 0x2, 0x76, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xF, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x2, 0x76, 0xA7, 0xFE, 0x6D, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0x5, 0xB0, 0xF9, 0x42, 0x6, 0xBE, 0xFE, 0x1C, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0x0, 0x3C, 0xFE, 0xF2, 0x2, 0x76, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xF, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x2, 0x76, 0xA7, 0xFE, 0x6D, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0x5, 0xB0, 0xF9, 0x42, 0x6, 0xBE, 0xFC, 0xA1, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0x0, 0x3C, 0xFE, 0xF2, 0x2, 0x76, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xF, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x2, 0x76, 0xA7, 0xFE, 0x6D, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0x5, 0xB0, 0xF9, 0x42, 0x6, 0xBE, 0xFB, 0x25, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0x0, 0x3C, 0xFE, 0xE5, 0x2, 0x76, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xD, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x0, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x2, 0x76, 0xA7, 0xFE, 0x6D, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0x5, 0xB0, 0xF9, 0x42, 0x6, 0xBE, 0xF9, 0xE4, 0x48, 0x48, 0x68, 0x47, 0x47, 0x0, 0x2, 0x0, 0x99, 0xFE, 0xF2, 0x2, 0x9C, 0x5, 0xC4, 0x0, 0x9, 0x0, 0xD, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x1, 0x89, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x48, 0xA8, 0x5, 0x48, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x9C, 0xF9, 0x42, 0x6, 0xBE, 0x0, 0x2, 0x0, 0x99, 0xFE, 0xF2, 0x2, 0x9C, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xD, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x41, 0xA8, 0xF0, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x5, 0xB0, 0xF9, 0x42, 0x6, 0xBE, 0xFE, 0x1C, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0x0, 0x99, 0xFE, 0xF2, 0x2, 0x9C, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xD, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x41, 0xA8, 0xF0, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x5, 0xB0, 0xF9, 0x42, 0x6, 0xBE, 0xFC, 0xA1, 0x35, 0x47, 0x47, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0x0, 0x99, 0xFE, 0xF2, 0x2, 0x9C, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xD, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x41, 0xA8, 0xF0, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x5, 0xB0, 0xF9, 0x42, 0x6, 0xBE, 0xFB, 0x25, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0x0, 0x2, 0x0, 0x99, 0xFE, 0xE5, 0x2, 0x9C, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xB, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x12, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x1, 0x41, 0xA8, 0xF0, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x5, 0xB0, 0xF9, 0x42, 0x6, 0xBE, 0xF9, 0xE4, 0x48, 0x48, 0x68, 0x47, 0x47, 0x0, 0x1, 0x0, 0x99, 0xFE, 0xF2, 0x3, 0x4A, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x3, 0x4A, 0xFD, 0xF7, 0xA8, 0x2, 0xB1, 0x5, 0x12, 0xF9, 0xE0, 0x6, 0xBE, 0x0, 0x1, 0x0, 0x99, 0xFE, 0xF2, 0x3, 0x4A, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x3, 0x4A, 0xFD, 0xF7, 0xA8, 0xA8, 0x2, 0x9, 0x3, 0x8A, 0xFB, 0x68, 0x6, 0xBE, 0xFE, 0x78, 0x0, 0x1, 0x0, 0x99, 0xFE, 0xF2, 0x3, 0x4A, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x3, 0x4A, 0xFD, 0xF7, 0xA8, 0xA8, 0x2, 0x9, 0x2, 0x2, 0xFC, 0xF0, 0x6, 0xBE, 0xFC, 0xF0, 0x0, 0x1, 0x0, 0x99, 0xFE, 0xF2, 0x3, 0x4A, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x25, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x3, 0x4A, 0xFD, 0xF7, 0xA8, 0xA8, 0x2, 0x9, 0x7A, 0xFE, 0x78, 0x6, 0xBE, 0xFB, 0x68, 0x0, 0x1, 0x0, 0x99, 0xFE, 0xF2, 0x3, 0x4A, 0x5, 0xB0, 0x0, 0x5, 0x0, 0x0, 0x13, 0x11, 0x33, 0x11, 0x21, 0x15, 0x99, 0xA8, 0x2, 0x9, 0xFE, 0xF2, 0x6, 0xBE, 0xF9, 0xE0, 0x9E, 0x0, 0x2, 0x0, 0x50, 0x2, 0x8C, 0x2, 0x67, 0x5, 0xB1, 0x0, 0x3, 0x0, 0xD, 0x0, 0x0, 0x1, 0x33, 0x11, 0x23, 0x0, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x1, 0xB2, 0xB5, 0xB5, 0xFE, 0x9E, 0x3B, 0x37, 0x36, 0x3D, 0x3D, 0x36, 0x37, 0x3B, 0x5, 0xB1, 0xFC, 0xDB, 0x1, 0xC0, 0x3E, 0x3E, 0x5C, 0x3D, 0x3D, 0x0, 0x2, 0x0, 0x55, 0x2, 0x80, 0x3, 0xF, 0x5, 0x3B, 0x0, 0x3, 0x0, 0xB, 0x0, 0x0, 0x1, 0x17, 0x1, 0x27, 0x12, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x2, 0x8D, 0x82, 0xFD, 0xC7, 0x81, 0xB, 0x3C, 0x6C, 0x3D, 0x3D, 0x6C, 0x3C, 0x5, 0x3B, 0x82, 0xFD, 0xC7, 0x82, 0x1, 0xBF, 0x3D, 0x3D, 0x5C, 0x3D, 0x3D, 0x0, 0x2, 0x0, 0x50, 0x3, 0x54, 0x3, 0x75, 0x5, 0x56, 0x0, 0x9, 0x0, 0xD, 0x0, 0x0, 0x0, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x5, 0x15, 0x21, 0x35, 0x1, 0x6F, 0x3B, 0x37, 0x36, 0x3D, 0x3D, 0x36, 0x37, 0x3B, 0x2, 0x6, 0xFC, 0xDB, 0x5, 0x19, 0x3D, 0x3D, 0x5C, 0x3D, 0x3D, 0xB3, 0xB6, 0xB6, 0x0, 0x1, 0x0, 0x50, 0x3, 0x5E, 0x2, 0xF9, 0x4, 0xD6, 0x0, 0x5, 0x0, 0x0, 0x13, 0x35, 0x21, 0x35, 0x33, 0x11, 0x50, 0x2, 0x1, 0xA8, 0x3, 0x5E, 0x92, 0xE6, 0xFE, 0x88, 0x0, 0x1, 0x0, 0x50, 0x2, 0xB8, 0x2, 0xAC, 0x5, 0xBD, 0x0, 0x8, 0x0, 0x0, 0x1, 0x27, 0x11, 0x23, 0x11, 0x7, 0x35, 0x1, 0x1, 0x2, 0xAC, 0xE3, 0x97, 0xE2, 0x1, 0x2E, 0x1, 0x2E, 0x3, 0xCD, 0xE2, 0xFE, 0x9, 0x1, 0xF6, 0xE1, 0xC3, 0x1, 0x2D, 0xFE, 0xD3, 0x0, 0x1, 0x0, 0x50, 0x2, 0xB8, 0x2, 0xAC, 0x5, 0xBD, 0x0, 0x8, 0x0, 0x0, 0x1, 0x1, 0x35, 0x17, 0x11, 0x33, 0x11, 0x37, 0x15, 0x1, 0x7E, 0xFE, 0xD2, 0xE2, 0x97, 0xE3, 0x2, 0xB8, 0x1, 0x2D, 0xC3, 0xE1, 0x1, 0xF6, 0xFE, 0x9, 0xE2, 0xC3, 0x0, 0x2, 0x0, 0x64, 0x2, 0x7D, 0x1, 0x42, 0x6, 0xBB, 0x0, 0x3, 0x0, 0xD, 0x0, 0x0, 0x1, 0x3, 0x23, 0x3, 0x3, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x3B, 0x11, 0xAD, 0x12, 0x7, 0x3B, 0x68, 0x3B, 0x3B, 0x68, 0x3B, 0x6, 0xBB, 0xFD, 0x3, 0x2, 0xFD, 0xFC, 0x2A, 0x2D, 0x3E, 0x3E, 0x2D, 0x2B, 0x3D, 0x3D, 0x0, 0x2, 0x0, 0x64, 0x2, 0x8C, 0x1, 0x42, 0x6, 0xCA, 0x0, 0x9, 0x0, 0xD, 0x0, 0x0, 0x12, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x17, 0x13, 0x23, 0x13, 0x9F, 0x3B, 0x3B, 0x68, 0x3B, 0x3B, 0x23, 0x11, 0xD0, 0x12, 0x5, 0xF7, 0x3E, 0x2D, 0x2C, 0x3C, 0x3C, 0x2C, 0x2D, 0x3E, 0x6E, 0xFD, 0x3, 0x2, 0xFD, 0x0, 0x2, 0x0, 0x64, 0x1, 0x4C, 0x1, 0x42, 0x5, 0x8A, 0x0, 0x9, 0x0, 0xD, 0x0, 0x0, 0x12, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x17, 0x13, 0x23, 0x13, 0x9F, 0x3B, 0x3B, 0x68, 0x3B, 0x3B, 0x23, 0x11, 0xD0, 0x12, 0x4, 0xB7, 0x3E, 0x2D, 0x2C, 0x3C, 0x3C, 0x2C, 0x2D, 0x3E, 0x6E, 0xFD, 0x3, 0x2, 0xFD, 0x0, 0x1, 0x0, 0x50, 0x3, 0xF4, 0x4, 0xAE, 0x6, 0x99, 0x0, 0x9, 0x0, 0x0, 0x1, 0x35, 0x27, 0x11, 0x23, 0x11, 0x1, 0x7, 0x25, 0x15, 0x1, 0xE0, 0xD2, 0xBE, 0x4, 0x5E, 0x34, 0xFE, 0x24, 0x4, 0x83, 0xDD, 0x39, 0xFE, 0x5B, 0x2, 0xA5, 0xFE, 0xCF, 0xBD, 0x81, 0xA9, 0x0, 0x1, 0x0, 0x50, 0xFD, 0xEF, 0x4, 0xAE, 0x1, 0x56, 0x0, 0x9, 0x0, 0x0, 0x1, 0x1, 0x11, 0x33, 0x11, 0x17, 0x35, 0x33, 0x11, 0x5, 0x4, 0x7A, 0xFB, 0xD6, 0xBE, 0xD2, 0xBE, 0x2, 0x10, 0xFD, 0xEF, 0x1, 0x22, 0x2, 0x45, 0xFE, 0x53, 0x39, 0xEC, 0xFE, 0xE0, 0x90, 0x0, 0x2, 0x0, 0x65, 0x0, 0x60, 0x2, 0x65, 0x5, 0xB0, 0x0, 0xF, 0x0, 0x1F, 0x0, 0x0, 0x13, 0x27, 0x33, 0x16, 0x16, 0x17, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x36, 0x35, 0x34, 0x27, 0x3, 0x27, 0x33, 0x16, 0x16, 0x17, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x36, 0x35, 0x34, 0x27, 0x66, 0x1, 0x57, 0xD9, 0xCF, 0x1, 0xF4, 0xD3, 0x36, 0x86, 0x85, 0xAE, 0x5F, 0x1, 0x57, 0xD9, 0xCF, 0x1, 0xF4, 0xD3, 0x36, 0x86, 0x85, 0xAE, 0x4, 0xEE, 0xC2, 0x2, 0x97, 0x7E, 0x2, 0x91, 0x97, 0x49, 0xB5, 0x29, 0x4C, 0x34, 0x66, 0x4, 0xFD, 0x3A, 0xC2, 0x2, 0x97, 0x7E, 0x2, 0x91, 0x97, 0x49, 0xB5, 0x29, 0x4C, 0x34, 0x66, 0x4, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x1, 0xEF, 0x4, 0x3A, 0x0, 0xE, 0x0, 0x1D, 0x0, 0x0, 0x13, 0x27, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x36, 0x35, 0x34, 0x27, 0x3, 0x27, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x36, 0x35, 0x34, 0x27, 0x55, 0x1, 0x4B, 0xAF, 0xA1, 0xBA, 0xB3, 0x32, 0x6E, 0x51, 0x58, 0x62, 0x1, 0x4B, 0xAF, 0xA1, 0xBA, 0xB3, 0x32, 0x6E, 0x51, 0x58, 0x3, 0x93, 0xA7, 0x2, 0x7E, 0x65, 0x68, 0x7D, 0x41, 0xA6, 0x26, 0x32, 0x28, 0x37, 0x6, 0xFD, 0xBE, 0xA7, 0x2, 0x7E, 0x65, 0x68, 0x7D, 0x41, 0xA6, 0x26, 0x32, 0x28, 0x37, 0x6, 0x0, 0x1, 0x0, 0x57, 0x2, 0x4D, 0x2, 0x5A, 0x5, 0xB0, 0x0, 0xE, 0x0, 0x0, 0x1, 0x15, 0x23, 0x6, 0x15, 0x14, 0x16, 0x17, 0x7, 0x26, 0x2, 0x35, 0x34, 0x36, 0x33, 0x2, 0x57, 0x5D, 0xB0, 0x91, 0x7F, 0x81, 0xAD, 0xD5, 0xD5, 0xDF, 0x5, 0xB0, 0xC2, 0x4, 0x71, 0x58, 0xA9, 0x76, 0xB5, 0xA1, 0x1, 0x2, 0x9A, 0x89, 0x9D, 0x0, 0x1, 0x0, 0x50, 0x1, 0x9F, 0x1, 0xF4, 0x4, 0x3A, 0x0, 0xE, 0x0, 0x0, 0x1, 0x7, 0x23, 0x6, 0x15, 0x14, 0x16, 0x17, 0x7, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x1, 0xEB, 0x1, 0x42, 0x79, 0x61, 0x64, 0x86, 0x80, 0x9E, 0xA7, 0xB5, 0x4, 0x3A, 0xA7, 0x1, 0x41, 0x2D, 0x86, 0x6F, 0x90, 0x86, 0xC7, 0x69, 0x67, 0x7E, 0x0, 0x1, 0x0, 0x95, 0xFE, 0x4B, 0x5, 0x19, 0x5, 0xB0, 0x0, 0x15, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x6, 0x3, 0x83, 0x7B, 0x4A, 0x4B, 0x42, 0x68, 0x69, 0xFD, 0x75, 0xFC, 0xFC, 0x2, 0x8B, 0xFD, 0xCA, 0xFE, 0x4B, 0x1C, 0xBC, 0x10, 0x4A, 0x64, 0x2, 0xC7, 0xFD, 0x78, 0x5, 0xB0, 0xFD, 0xA2, 0x2, 0x5E, 0xFA, 0x11, 0xC5, 0xB1, 0x0, 0x1, 0x0, 0x7E, 0xFE, 0x4B, 0x3, 0xFD, 0x6, 0x0, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x6, 0x2, 0x68, 0x7B, 0x4A, 0x4B, 0x42, 0x6C, 0x6E, 0x62, 0x5D, 0x93, 0x48, 0xF2, 0xF2, 0x76, 0xB7, 0x9F, 0xC0, 0x1, 0xC9, 0xFE, 0x4B, 0x1C, 0xBC, 0x10, 0x4A, 0x64, 0x2, 0xFA, 0x71, 0x5C, 0x83, 0xFC, 0xFB, 0x6, 0x0, 0xFD, 0xC4, 0x8A, 0xB6, 0xDA, 0xFD, 0x3, 0xC5, 0xB1, 0x0, 0x1, 0x0, 0x2D, 0xFE, 0x4D, 0x5, 0xF1, 0x5, 0xB0, 0x0, 0x24, 0x0, 0x0, 0x1, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x21, 0x17, 0x1, 0x17, 0x16, 0x16, 0x15, 0x14, 0x4, 0x3, 0xDD, 0x7F, 0xE1, 0x8D, 0xF7, 0x7E, 0x7B, 0x86, 0x94, 0x9A, 0x92, 0x8E, 0x1, 0x5B, 0xFE, 0x50, 0xFC, 0xFE, 0x3E, 0x4, 0x83, 0xFE, 0x3B, 0x2, 0xDC, 0x1, 0xFE, 0x87, 0xA, 0xB9, 0xDF, 0xFE, 0xD4, 0xFE, 0x4D, 0x48, 0x9A, 0x7A, 0x3E, 0x58, 0x91, 0x6E, 0x90, 0x7E, 0xAC, 0x1, 0xA7, 0xFC, 0x8D, 0x4, 0xE5, 0xCB, 0xCB, 0xAB, 0x9E, 0xFE, 0x2C, 0x1, 0xE, 0xE0, 0xC8, 0xD7, 0xED, 0x0, 0x1, 0x0, 0x8, 0xFE, 0x4D, 0x5, 0x88, 0x5, 0x41, 0x0, 0x2D, 0x0, 0x0, 0x1, 0x22, 0x24, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x17, 0x1, 0x17, 0x16, 0x16, 0x15, 0x14, 0x4, 0x3, 0x81, 0xBA, 0xFE, 0xD8, 0xF1, 0x7B, 0x76, 0x84, 0x93, 0x9D, 0x93, 0x8F, 0x1, 0x6F, 0xFD, 0x65, 0x40, 0x31, 0x2A, 0x2B, 0x46, 0x5A, 0x79, 0x9F, 0xB3, 0xB3, 0xF2, 0x3, 0xB0, 0x1, 0xFE, 0x81, 0x3, 0xCA, 0xDC, 0xFE, 0xDC, 0xFE, 0x4D, 0xA3, 0xB5, 0x3D, 0x58, 0x91, 0x6D, 0x93, 0x85, 0xA5, 0x1, 0xBC, 0xFD, 0xA3, 0x49, 0x2B, 0xA, 0xBC, 0x18, 0x89, 0xA7, 0x2, 0x6B, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0x9B, 0xFE, 0x29, 0x1, 0xC, 0xEC, 0xC1, 0xD6, 0xEB, 0x0, 0x1, 0x0, 0x59, 0xFF, 0xEC, 0x4, 0x20, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x0, 0x1, 0x14, 0x4, 0x23, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x4, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x20, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x4, 0x20, 0xFE, 0xE0, 0xBE, 0xD0, 0xFE, 0xE7, 0x6E, 0x87, 0x71, 0x6E, 0x1, 0x3, 0xD0, 0xCA, 0x1, 0x6, 0xF3, 0x7F, 0x61, 0xDD, 0x7A, 0x7D, 0x90, 0x89, 0xFE, 0xEC, 0x83, 0x70, 0x6C, 0x82, 0x1, 0x87, 0xCB, 0xD0, 0xDF, 0xCD, 0x6B, 0xBC, 0x2D, 0x33, 0xB2, 0x55, 0xCD, 0xD1, 0xE2, 0xAD, 0x5E, 0x6E, 0xDB, 0x62, 0x7D, 0xC0, 0xEF, 0x70, 0x79, 0x78, 0x60, 0x0, 0x1, 0x0, 0x54, 0xFE, 0xA3, 0x4, 0x3A, 0x4, 0x8D, 0x0, 0x17, 0x0, 0x0, 0x1, 0x15, 0x23, 0x4, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x20, 0x0, 0x11, 0x34, 0x36, 0x37, 0x1, 0x37, 0x21, 0x15, 0x21, 0x2, 0xE9, 0x5A, 0xFE, 0xBE, 0xC6, 0xAD, 0xA7, 0x96, 0x3D, 0xCA, 0xC0, 0xFE, 0xFA, 0xFE, 0xAA, 0xDF, 0x99, 0xFE, 0xAB, 0x1, 0x3, 0x77, 0xFD, 0xBA, 0x2, 0x55, 0x7B, 0x8, 0xFE, 0xE1, 0x90, 0xB6, 0x58, 0xBA, 0x68, 0x1, 0x17, 0x1, 0x3, 0xBE, 0xEA, 0x19, 0x1, 0x80, 0x8F, 0xC4, 0x0, 0x2, 0x0, 0x35, 0xFF, 0xEC, 0x3, 0xA3, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x13, 0x0, 0x0, 0x1, 0x21, 0x11, 0x7, 0x3, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x21, 0x27, 0x1, 0x33, 0x11, 0x14, 0x6, 0x1, 0x33, 0x1, 0x7D, 0x11, 0x53, 0x5F, 0x41, 0x2D, 0x2B, 0x50, 0x5C, 0xFD, 0x8B, 0x6, 0x2, 0x74, 0xFA, 0xC8, 0x2, 0x8, 0x2, 0x5D, 0x1E, 0xFB, 0xA5, 0x12, 0xBF, 0x9, 0x3E, 0x52, 0x94, 0x3, 0xD8, 0xFB, 0x96, 0xBB, 0x9F, 0x0, 0x2, 0x0, 0x35, 0xFE, 0x4B, 0x3, 0xA3, 0x4, 0x3B, 0x0, 0x3, 0x0, 0x14, 0x0, 0x0, 0x25, 0x21, 0x11, 0x7, 0x3, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x21, 0x27, 0x1, 0x33, 0x11, 0x14, 0x6, 0x1, 0x30, 0x1, 0x80, 0x17, 0x6B, 0x44, 0x3E, 0x26, 0x25, 0x4C, 0x6D, 0xFD, 0x8B, 0x6, 0x2, 0x74, 0xFA, 0xD7, 0xC4, 0x2, 0x3A, 0x28, 0xFB, 0x75, 0x11, 0xC0, 0x9, 0x4A, 0x64, 0x3F, 0x94, 0x3, 0xA7, 0xFB, 0x86, 0xB6, 0xC0, 0x0, 0x3, 0x0, 0x35, 0xFF, 0x2C, 0x4, 0xDA, 0x5, 0xB0, 0x0, 0x3, 0x0, 0xC, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x21, 0x11, 0x7, 0x1, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0x5, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x21, 0x27, 0x1, 0x33, 0x11, 0x33, 0x15, 0x23, 0x6, 0x6, 0x1, 0x33, 0x1, 0x7D, 0x11, 0x2, 0x3B, 0x4F, 0x46, 0x80, 0x4A, 0x2, 0xFE, 0x3B, 0x5F, 0x41, 0x2D, 0x2B, 0x50, 0x5C, 0xFD, 0x8B, 0x6, 0x2, 0x74, 0xFA, 0xD1, 0xD1, 0x1, 0xC7, 0x2, 0x8, 0x2, 0x5D, 0x1E, 0xFC, 0x85, 0x4B, 0x57, 0xBF, 0x3F, 0x4E, 0x70, 0x83, 0x5F, 0xE0, 0x12, 0xBF, 0x9, 0x3E, 0x52, 0x94, 0x3, 0xD8, 0xFC, 0x58, 0xC4, 0xBA, 0x9E, 0x0, 0x3, 0x0, 0x35, 0xFD, 0xE8, 0x4, 0xDA, 0x4, 0x3B, 0x0, 0x3, 0x0, 0xC, 0x0, 0x21, 0x0, 0x0, 0x25, 0x21, 0x11, 0x7, 0x1, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x21, 0x27, 0x1, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x6, 0x6, 0x1, 0x30, 0x1, 0x80, 0x17, 0x2, 0x41, 0x4F, 0x46, 0x80, 0x4A, 0x2, 0xFE, 0x1D, 0x44, 0x3E, 0x26, 0x25, 0x4C, 0x6D, 0xFD, 0x8B, 0x6, 0x2, 0x74, 0xFA, 0xD2, 0xD2, 0x2, 0xD7, 0xC4, 0x2, 0x3A, 0x28, 0xFC, 0xB2, 0x4C, 0x56, 0xC0, 0x3E, 0x4D, 0x72, 0x82, 0x5F, 0xFE, 0xC3, 0x11, 0xC0, 0x9, 0x4A, 0x64, 0x3F, 0x94, 0x3, 0xA7, 0xFC, 0x89, 0xC4, 0x46, 0xB2, 0xBD, 0x0, 0x1, 0x0, 0x85, 0x0, 0x0, 0x3, 0x4D, 0x4, 0x3A, 0x0, 0x9, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x3, 0xE, 0xFE, 0x6A, 0xF3, 0x2, 0xC8, 0xFE, 0x2B, 0x1, 0x96, 0x1, 0x89, 0xFE, 0x77, 0x4, 0x3A, 0xC4, 0xFE, 0xC9, 0xFF, 0xFF, 0x0, 0x4C, 0xFF, 0xEC, 0x3, 0xCA, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x58, 0x0, 0x0, 0x0, 0x3, 0x0, 0x12, 0x0, 0x0, 0x8, 0x6C, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x5, 0x0, 0x14, 0x0, 0x0, 0x1, 0x3, 0x3, 0x21, 0xB, 0x3, 0x21, 0x3, 0x21, 0x1, 0x33, 0x1, 0x1, 0x33, 0x1, 0x21, 0x3, 0x21, 0x13, 0x3, 0x7E, 0xD4, 0xD3, 0x4, 0xCF, 0xD3, 0xD3, 0xC5, 0x77, 0xFD, 0xCC, 0x76, 0xFE, 0xF8, 0x2, 0x26, 0xE3, 0x1, 0x24, 0x1, 0x22, 0xE3, 0x2, 0x28, 0xFE, 0xF8, 0x77, 0xFD, 0xD5, 0x81, 0x2, 0x1F, 0x2, 0x5E, 0xFD, 0xA2, 0x2, 0x5D, 0xFD, 0xA3, 0xFD, 0xE1, 0x1, 0x54, 0xFE, 0xAC, 0x5, 0xB0, 0xFC, 0xFD, 0x3, 0x3, 0xFA, 0x50, 0x1, 0x54, 0xFE, 0xAC, 0x0, 0x4, 0x0, 0x5B, 0xFF, 0xEC, 0x6, 0x81, 0x4, 0x4E, 0x0, 0xA, 0x0, 0x14, 0x0, 0x1D, 0x0, 0x45, 0x0, 0x0, 0x1, 0x36, 0x37, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x13, 0x32, 0x36, 0x37, 0x35, 0x23, 0x4, 0x15, 0x14, 0x16, 0x20, 0x36, 0x37, 0x35, 0x23, 0x6, 0x15, 0x14, 0x16, 0x5, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x24, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x17, 0x15, 0x3, 0xD3, 0x66, 0x8B, 0xA1, 0x64, 0x65, 0x5C, 0x6D, 0xAB, 0x54, 0x7A, 0x19, 0x91, 0xFE, 0xFF, 0x58, 0xFE, 0x22, 0x7A, 0x19, 0x94, 0xFF, 0x58, 0x3, 0xE4, 0x12, 0xA, 0x72, 0xAB, 0x6E, 0xA9, 0x2D, 0x2E, 0xA0, 0x73, 0xA2, 0xCE, 0x1, 0x2, 0xEA, 0x99, 0x5F, 0x5F, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0xC7, 0x71, 0x7F, 0xC7, 0xB9, 0xF1, 0x29, 0x2, 0x72, 0x22, 0x1, 0x47, 0x55, 0x65, 0x62, 0x60, 0xFD, 0xDB, 0x51, 0x31, 0xCC, 0x5, 0xB0, 0x41, 0x58, 0x51, 0x31, 0xCC, 0x6, 0xAF, 0x41, 0x58, 0xAF, 0x25, 0x40, 0x79, 0x5A, 0x4B, 0x40, 0x65, 0xBA, 0x8A, 0xAD, 0xB8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0x67, 0x67, 0xBA, 0xBA, 0xFE, 0x20, 0x92, 0x57, 0x11, 0x0, 0x3, 0x0, 0x12, 0xFF, 0xEC, 0x8, 0x44, 0x5, 0xC4, 0x0, 0x12, 0x0, 0x20, 0x0, 0x23, 0x0, 0x0, 0x5, 0x22, 0x24, 0x27, 0x21, 0x3, 0x21, 0x1, 0x33, 0x13, 0x36, 0x24, 0x33, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x13, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x5, 0x3, 0x3, 0x5, 0xE9, 0xBA, 0xFE, 0xE6, 0x49, 0xFD, 0xC4, 0x76, 0xFE, 0xF8, 0x2, 0x26, 0xE3, 0x98, 0x3E, 0x1, 0x2A, 0xCC, 0x1, 0x10, 0x1, 0x4D, 0xFE, 0xB5, 0x4E, 0xB9, 0xA7, 0xA2, 0xBC, 0xBE, 0xA2, 0xA8, 0xB6, 0xFC, 0x36, 0xD3, 0xD3, 0x14, 0xBC, 0xAC, 0xFE, 0xAC, 0x5, 0xB0, 0xFE, 0x64, 0xCD, 0xE3, 0xFE, 0x84, 0xFE, 0xB4, 0x49, 0xFE, 0xB4, 0xFE, 0x85, 0x3, 0x12, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0x94, 0x2, 0x5E, 0xFD, 0xA2, 0x0, 0x3, 0x0, 0x5B, 0xFF, 0xEC, 0x6, 0xCE, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x30, 0x0, 0x3B, 0x0, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x22, 0x26, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x24, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x25, 0x32, 0x36, 0x37, 0x26, 0x27, 0x23, 0x20, 0x15, 0x14, 0x16, 0x3, 0xD3, 0x7D, 0x88, 0x87, 0x7C, 0x7C, 0x89, 0x87, 0x7C, 0x1, 0x5, 0x87, 0xCD, 0x40, 0x29, 0xC2, 0x8E, 0xA2, 0xCE, 0x1, 0x2, 0xEA, 0x99, 0x5F, 0x5F, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0xE1, 0x70, 0x86, 0xCF, 0xEF, 0x1, 0x9, 0xFE, 0xF7, 0xFC, 0x38, 0x66, 0x85, 0xC, 0x12, 0x2, 0x83, 0xFE, 0xF0, 0x59, 0x2, 0x12, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0xFD, 0xC5, 0x6B, 0x5D, 0x4A, 0x7E, 0xBA, 0x8A, 0xAD, 0xB8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0x80, 0x80, 0xFE, 0xC5, 0xEC, 0x15, 0xEB, 0xFE, 0xC5, 0xC3, 0x75, 0x43, 0x47, 0x4F, 0xB5, 0x41, 0x58, 0x0, 0x2, 0xFF, 0xF6, 0xFF, 0xEC, 0x7, 0xE8, 0x5, 0xB0, 0x0, 0x14, 0x0, 0x17, 0x0, 0x0, 0x5, 0x22, 0x24, 0x27, 0x21, 0x3, 0x21, 0x1, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x4, 0x1, 0x11, 0x1, 0x5, 0xC7, 0xC5, 0xFE, 0xE1, 0x2B, 0xFE, 0x18, 0xB8, 0xFE, 0xDE, 0x3, 0x43, 0x1, 0x6A, 0x9F, 0x85, 0x87, 0x9D, 0xFD, 0xFE, 0xC2, 0xFC, 0xFE, 0xFE, 0x9C, 0x14, 0xB6, 0xB3, 0xFE, 0xAB, 0x5, 0xB0, 0xFC, 0x33, 0x9C, 0x91, 0x91, 0x9C, 0x3, 0xCD, 0xFC, 0x33, 0xFA, 0xFD, 0x2, 0x3F, 0x2, 0x92, 0xFD, 0x6E, 0x0, 0x2, 0x0, 0x5B, 0xFF, 0xEC, 0x6, 0x60, 0x4, 0x4E, 0x0, 0xA, 0x0, 0x31, 0x0, 0x0, 0x25, 0x32, 0x36, 0x37, 0x26, 0x35, 0x23, 0x20, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x24, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x1, 0xFD, 0x54, 0x78, 0x1A, 0x3, 0x83, 0xFE, 0xF0, 0x59, 0x3, 0xD5, 0x6, 0x6A, 0xC6, 0xD1, 0x58, 0x32, 0xAD, 0x72, 0xA2, 0xCE, 0x1, 0x2, 0xEA, 0x99, 0x5F, 0x5F, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0xB6, 0xEC, 0x68, 0x44, 0xAF, 0x40, 0xF3, 0xAF, 0x51, 0x36, 0x23, 0xA4, 0xB5, 0x41, 0x58, 0xAF, 0x6B, 0x7F, 0x90, 0x3B, 0x55, 0xBA, 0x8A, 0xAD, 0xB8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0xBA, 0xBA, 0xFE, 0xA3, 0x75, 0x55, 0x7F, 0x3, 0x8, 0xFB, 0xC6, 0x0, 0x2, 0x0, 0x12, 0x0, 0x0, 0x7, 0x53, 0x5, 0xB0, 0x0, 0x2, 0x0, 0xD, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x3, 0x21, 0x3, 0x21, 0x1, 0x33, 0x1, 0x1, 0x21, 0x1, 0x3, 0x84, 0xD6, 0xD7, 0x2, 0x69, 0x76, 0xFD, 0xC6, 0x76, 0xFE, 0xF8, 0x2, 0x26, 0xFD, 0x1, 0x96, 0x1, 0x72, 0x1, 0x16, 0xFD, 0xF4, 0x2, 0x1F, 0x2, 0x6A, 0xFD, 0x96, 0xFD, 0xE1, 0x1, 0x54, 0xFE, 0xAC, 0x5, 0xB0, 0xFB, 0x8B, 0x4, 0x75, 0xFA, 0x50, 0x0, 0x2, 0x0, 0x5B, 0xFF, 0xEC, 0x6, 0x43, 0x4, 0x4E, 0x0, 0x8, 0x0, 0x27, 0x0, 0x0, 0x24, 0x36, 0x37, 0x35, 0x23, 0x6, 0x15, 0x14, 0x16, 0x5, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x24, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x37, 0x1, 0x33, 0x1, 0x2, 0x4D, 0x7A, 0x19, 0x94, 0xFF, 0x58, 0x1, 0x5F, 0x12, 0xA, 0x73, 0xAA, 0xA2, 0xCE, 0x1, 0x2, 0xEA, 0x99, 0x5F, 0x5F, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0xB5, 0xE7, 0x5A, 0x1, 0x1F, 0xFE, 0xFD, 0xE8, 0xAF, 0x51, 0x31, 0xCC, 0x6, 0xAF, 0x41, 0x58, 0xAF, 0x25, 0x41, 0x7A, 0xBA, 0x8A, 0xAD, 0xB8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0xBA, 0xBA, 0xFD, 0xF3, 0xF7, 0x2, 0x76, 0xFB, 0xC6, 0x0, 0x3, 0x0, 0x12, 0x0, 0x0, 0x7, 0x53, 0x5, 0xB0, 0x0, 0x2, 0x0, 0xE, 0x0, 0x11, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x3, 0x21, 0x3, 0x21, 0x1, 0x33, 0x1, 0x21, 0x13, 0x21, 0x1, 0x3, 0x37, 0x23, 0x3, 0x42, 0x94, 0x95, 0x2, 0x27, 0xBB, 0xFE, 0x51, 0xBC, 0xFE, 0xF8, 0x2, 0x26, 0xFD, 0x1, 0x1, 0x1, 0x1D, 0xEA, 0x1, 0x16, 0xFD, 0xF4, 0x7C, 0x49, 0x99, 0x2, 0xDD, 0x1, 0xAC, 0xFE, 0x54, 0xFD, 0x23, 0x2, 0x1D, 0xFD, 0xE3, 0x5, 0xB0, 0xFD, 0x2D, 0x2, 0xD3, 0xFA, 0x50, 0x1, 0x3B, 0xE2, 0x0, 0x3, 0x0, 0x5B, 0xFF, 0xEC, 0x6, 0x43, 0x4, 0x4E, 0x0, 0x3, 0x0, 0xC, 0x0, 0x2B, 0x0, 0x0, 0x1, 0x37, 0x23, 0x11, 0x4, 0x36, 0x37, 0x35, 0x23, 0x6, 0x15, 0x14, 0x16, 0x5, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x24, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x33, 0x13, 0x33, 0x1, 0x4, 0x2B, 0x1A, 0x79, 0xFE, 0x81, 0x7A, 0x19, 0x94, 0xFF, 0x58, 0x1, 0x5F, 0x12, 0xA, 0x73, 0xAA, 0xA2, 0xCE, 0x1, 0x2, 0xEA, 0x99, 0x5F, 0x5F, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0xB5, 0xE7, 0xBD, 0xBC, 0xFE, 0xFD, 0xE8, 0x1, 0xC4, 0x39, 0xFE, 0xCA, 0x18, 0x51, 0x31, 0xCC, 0x6, 0xAF, 0x41, 0x58, 0xAF, 0x25, 0x41, 0x7A, 0xBA, 0x8A, 0xAD, 0xB8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0xBA, 0xBA, 0x45, 0x1, 0xA5, 0xFB, 0xC6, 0x0, 0x2, 0x0, 0x12, 0xFE, 0x4B, 0x7, 0x5D, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x17, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x37, 0x37, 0x3, 0x21, 0x3, 0x21, 0x1, 0x33, 0x1, 0x1, 0x21, 0x1, 0x6, 0x6, 0x3, 0x7E, 0xD4, 0xD3, 0x1, 0xD7, 0x2C, 0x55, 0x2E, 0x54, 0x55, 0x26, 0x16, 0x7B, 0xFD, 0xCB, 0x76, 0xFE, 0xF8, 0x2, 0x26, 0xE3, 0x1, 0xA6, 0x1, 0x95, 0x1, 0x7, 0xFD, 0xB2, 0x2E, 0xA7, 0x2, 0x1F, 0x2, 0x5E, 0xFD, 0xA2, 0xFC, 0x2C, 0x11, 0xBD, 0x4, 0x42, 0x63, 0x3B, 0x1, 0x5F, 0xFE, 0xAC, 0x5, 0xB0, 0xFB, 0xA8, 0x4, 0x58, 0xF9, 0xB7, 0x7F, 0x9D, 0x0, 0x2, 0x0, 0x5B, 0xFE, 0x4B, 0x6, 0x4D, 0x4, 0x4E, 0x0, 0x8, 0x0, 0x2D, 0x0, 0x0, 0x24, 0x36, 0x37, 0x35, 0x23, 0x4, 0x15, 0x14, 0x16, 0x13, 0x22, 0x27, 0x35, 0x17, 0x32, 0x37, 0x37, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x24, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x1, 0x33, 0x1, 0x2, 0x2, 0x4D, 0x7A, 0x19, 0x91, 0xFF, 0x0, 0x56, 0x8A, 0x2C, 0x55, 0x2E, 0xAA, 0x5A, 0x9, 0x9, 0x70, 0xA5, 0xA2, 0xCE, 0x1, 0x2, 0xEA, 0x99, 0x5F, 0x5F, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0xB5, 0xE7, 0x1, 0x84, 0xFD, 0xFD, 0x8A, 0x92, 0xAF, 0x51, 0x31, 0xCC, 0x5, 0xB2, 0x41, 0x56, 0xFD, 0x9C, 0x11, 0xBC, 0x3, 0x72, 0xC, 0xCB, 0x72, 0xBA, 0x8A, 0xAD, 0xB8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0xBA, 0xBA, 0xFE, 0x16, 0x3, 0x4A, 0xFB, 0x2F, 0xFE, 0xE2, 0x0, 0x2, 0x0, 0x4D, 0xFF, 0xEC, 0x4, 0xD3, 0x5, 0xC4, 0x0, 0xB, 0x0, 0x27, 0x0, 0x0, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x5, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x34, 0x2, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x0, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x20, 0x0, 0x1, 0xE9, 0x49, 0x40, 0x41, 0x49, 0x49, 0x41, 0x40, 0x49, 0xFE, 0x64, 0xFC, 0x11, 0x86, 0x9D, 0xAB, 0xAC, 0x1, 0x9C, 0xB1, 0xA3, 0x89, 0x12, 0xFC, 0x14, 0x1, 0x1A, 0x1, 0xC, 0x1, 0xD, 0x1, 0x3E, 0xFE, 0xBD, 0xFE, 0xED, 0xFE, 0xFA, 0xFE, 0xEC, 0x2, 0xD6, 0x35, 0x48, 0x48, 0x35, 0x34, 0x47, 0x47, 0xC1, 0x8B, 0x9D, 0xFA, 0xE4, 0x7D, 0xDA, 0x1, 0xA, 0x96, 0x8C, 0xD5, 0x1, 0x19, 0xFE, 0x8B, 0xFE, 0xC5, 0x76, 0xFE, 0xC5, 0xFE, 0x89, 0x1, 0x1B, 0x0, 0x2, 0x0, 0x3B, 0xFF, 0xEC, 0x3, 0xE1, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x27, 0x0, 0x0, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x5, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x2, 0x23, 0x22, 0x24, 0x1, 0x72, 0x42, 0x3B, 0x3C, 0x42, 0x42, 0x3C, 0x3B, 0x42, 0xFE, 0xC9, 0xE5, 0x5, 0x7A, 0x58, 0x95, 0x62, 0x62, 0x95, 0x63, 0x6F, 0x5, 0xE5, 0x5, 0xF1, 0xC4, 0xF7, 0xF3, 0x2, 0xF3, 0xFA, 0xB4, 0xFF, 0x0, 0x2, 0x19, 0x32, 0x45, 0x45, 0x32, 0x31, 0x45, 0x45, 0x82, 0x4F, 0x68, 0xD9, 0x83, 0x24, 0x81, 0xDB, 0x7D, 0x57, 0xB3, 0xE4, 0xFE, 0xC4, 0xDD, 0x2A, 0xDF, 0xFE, 0xC0, 0xDD, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x5, 0x65, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x30, 0x4D, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x84, 0x1, 0xE1, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x4, 0x99, 0x6, 0x0, 0x0, 0x26, 0x0, 0x50, 0x62, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x84, 0x2, 0x6, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x14, 0x0, 0x0, 0x1, 0x37, 0x27, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x17, 0x37, 0x17, 0x7, 0x1, 0x21, 0x3, 0x7, 0x2, 0x2B, 0x9F, 0x93, 0xA6, 0xFC, 0xFC, 0x8D, 0x1, 0xAA, 0x1, 0x32, 0xFD, 0xE3, 0xA8, 0x9A, 0x6C, 0xA4, 0x1, 0x31, 0xFE, 0xD4, 0xC1, 0x94, 0x1, 0x1E, 0x84, 0xD4, 0xB0, 0xFE, 0x3A, 0x5, 0xB0, 0xFD, 0x54, 0xAE, 0x1, 0xFE, 0xFD, 0x7C, 0xEE, 0x80, 0x83, 0x89, 0xFE, 0x4E, 0x1, 0x16, 0x7C, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x4, 0x36, 0x6, 0x0, 0x0, 0x14, 0x0, 0x0, 0x25, 0x37, 0x27, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x17, 0x37, 0x17, 0x7, 0x13, 0x21, 0x27, 0x7, 0x1, 0xB5, 0x8C, 0x64, 0x6E, 0xF2, 0xF2, 0x4D, 0x1, 0x2B, 0x1, 0x24, 0xFE, 0x6E, 0x75, 0xBB, 0x6C, 0xC5, 0xE6, 0xFE, 0xE7, 0x7C, 0x80, 0xCC, 0x74, 0x92, 0x71, 0xFE, 0x9F, 0x6, 0x0, 0xFC, 0x8A, 0x60, 0x1, 0x50, 0xFE, 0x3D, 0xA6, 0x9C, 0x84, 0xA4, 0xFE, 0xBB, 0xB4, 0x6B, 0x0, 0x1, 0x0, 0x14, 0x0, 0x0, 0x5, 0x66, 0x5, 0xB0, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x37, 0x27, 0x7, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x37, 0x1, 0x21, 0x1, 0x17, 0x37, 0x17, 0x7, 0x1, 0x21, 0x3, 0x7, 0x2, 0x78, 0x9F, 0x93, 0xA5, 0xFD, 0xCE, 0xCE, 0xFD, 0xD3, 0xD3, 0x8C, 0x1, 0xAA, 0x1, 0x32, 0xFD, 0xE3, 0xA8, 0x9A, 0x6C, 0xA4, 0x1, 0x32, 0xFE, 0xD3, 0xC1, 0x94, 0x1, 0x1E, 0x84, 0xD4, 0xAF, 0xFE, 0x39, 0x4, 0x68, 0xAA, 0x9E, 0x9E, 0xAA, 0xFE, 0x9E, 0xAC, 0x1, 0xFE, 0xFD, 0x7D, 0xEF, 0x80, 0x83, 0x88, 0xFE, 0x4D, 0x1, 0x16, 0x7C, 0x0, 0x1, 0x0, 0x14, 0x0, 0x0, 0x4, 0x99, 0x6, 0x0, 0x0, 0x1C, 0x0, 0x0, 0x25, 0x37, 0x27, 0x7, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x37, 0x1, 0x21, 0x1, 0x17, 0x37, 0x17, 0x7, 0x13, 0x21, 0x27, 0x7, 0x2, 0x18, 0x8C, 0x65, 0x6D, 0xF2, 0xCC, 0xCC, 0xF2, 0xE0, 0xE0, 0x4D, 0x1, 0x2B, 0x1, 0x24, 0xFE, 0x6D, 0x76, 0xBB, 0x6C, 0xC5, 0xE6, 0xFE, 0xE7, 0x7C, 0x80, 0xCC, 0x74, 0x92, 0x70, 0xFE, 0x9E, 0x4, 0x8D, 0xAA, 0xC9, 0xC9, 0xAA, 0xFD, 0xFD, 0x60, 0x1, 0x50, 0xFE, 0x3E, 0xA7, 0x9C, 0x84, 0xA4, 0xFE, 0xBB, 0xB4, 0x6B, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x4, 0xC0, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x1, 0x5B, 0xC6, 0xFC, 0xC6, 0x2, 0x69, 0xFC, 0x9B, 0x2, 0x8F, 0x3, 0x21, 0xFD, 0xAA, 0xFD, 0x70, 0xCA, 0x0, 0x1, 0x0, 0x64, 0x0, 0x0, 0x2, 0x17, 0x6, 0x1, 0x0, 0x7, 0x0, 0x0, 0x1, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x1, 0x24, 0xC0, 0xF3, 0xC0, 0xF3, 0x2, 0xB4, 0x3, 0x4D, 0xFD, 0x76, 0xFC, 0x89, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x4, 0x76, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x4F, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x84, 0x2, 0x8, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x2, 0xB2, 0x6, 0x0, 0x0, 0x26, 0x0, 0x51, 0x5D, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x84, 0x2, 0x19, 0x0, 0x3, 0x0, 0x14, 0xFF, 0xEC, 0x6, 0x56, 0x5, 0xC4, 0x0, 0x6, 0x0, 0xC, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x26, 0x26, 0x3, 0x20, 0x13, 0x21, 0x16, 0x16, 0x1, 0x23, 0x2, 0x0, 0x21, 0x22, 0x0, 0x3, 0x23, 0x35, 0x33, 0x12, 0x0, 0x33, 0x20, 0x0, 0x13, 0x33, 0x3, 0x34, 0x98, 0xBA, 0xB, 0x2, 0xBB, 0xB, 0xB7, 0x9A, 0x1, 0x43, 0x19, 0xFD, 0x45, 0xD, 0xBB, 0x3, 0xB7, 0xC7, 0x11, 0xFE, 0xBA, 0xFE, 0xFE, 0xFD, 0xFE, 0xB3, 0x12, 0xC6, 0xC6, 0x10, 0x1, 0x4C, 0xFE, 0x1, 0x3, 0x1, 0x48, 0x10, 0xC7, 0x4, 0xF3, 0xE1, 0xD8, 0xD8, 0xE1, 0xFB, 0xC9, 0x1, 0xB4, 0xD5, 0xDF, 0x1, 0xB4, 0xFE, 0xD2, 0xFE, 0xAA, 0x1, 0x56, 0x1, 0x2E, 0xCA, 0x1, 0x31, 0x1, 0x59, 0xFE, 0xA7, 0xFE, 0xCF, 0x0, 0x3, 0x0, 0x1B, 0xFF, 0xEC, 0x5, 0x2F, 0x4, 0x4E, 0x0, 0x6, 0x0, 0xD, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x26, 0x26, 0x3, 0x32, 0x36, 0x37, 0x21, 0x16, 0x16, 0x1, 0x23, 0x6, 0x0, 0x23, 0x22, 0x0, 0x27, 0x23, 0x35, 0x33, 0x36, 0x0, 0x33, 0x32, 0x0, 0x17, 0x33, 0x2, 0xA4, 0x71, 0x7B, 0x10, 0x1, 0xFA, 0x10, 0x7C, 0x70, 0x73, 0x7C, 0xF, 0xFE, 0x2, 0xF, 0x7C, 0x2, 0xFE, 0x97, 0x17, 0xFE, 0xFD, 0xD8, 0xD9, 0xFE, 0xFC, 0x17, 0x97, 0x99, 0x19, 0x1, 0x2, 0xD5, 0xD7, 0x1, 0x3, 0x18, 0x99, 0x3, 0x8B, 0x98, 0x70, 0x70, 0x98, 0xFD, 0x24, 0x9C, 0x75, 0x75, 0x9C, 0x1, 0x11, 0xCC, 0xFE, 0xF8, 0x1, 0x8, 0xCC, 0xC3, 0xC8, 0x1, 0x3, 0xFE, 0xFD, 0xC8, 0x0, 0x3, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xCC, 0x5, 0xC5, 0x0, 0x16, 0x0, 0x1F, 0x0, 0x2D, 0x0, 0x0, 0x5, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x15, 0x15, 0x10, 0x0, 0x13, 0x22, 0x7, 0x16, 0x17, 0x36, 0x35, 0x34, 0x26, 0x3, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x2, 0xC4, 0xFE, 0xF6, 0xFE, 0xAC, 0x1, 0x52, 0x1, 0xA, 0xB2, 0x88, 0x4E, 0x72, 0x74, 0x9C, 0x6E, 0x50, 0x11, 0xFE, 0xB5, 0xE8, 0x30, 0x24, 0x52, 0x2F, 0x4B, 0x45, 0xCD, 0xB9, 0xA7, 0xA2, 0xBD, 0xBF, 0xA2, 0xA8, 0xB6, 0x14, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0x54, 0x55, 0x94, 0x73, 0x59, 0x8D, 0x1A, 0x5C, 0x66, 0x49, 0xFE, 0xB4, 0xFE, 0x85, 0x5, 0x4D, 0x21, 0x57, 0x7C, 0x1E, 0x56, 0x37, 0x49, 0xFD, 0xC5, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0x0, 0x3, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0xF5, 0x4, 0x9A, 0x0, 0x15, 0x0, 0x1E, 0x0, 0x2C, 0x0, 0x0, 0x5, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x15, 0x14, 0x0, 0x13, 0x22, 0x7, 0x16, 0x17, 0x36, 0x35, 0x34, 0x26, 0x1, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x2, 0x48, 0xEB, 0xFE, 0xF7, 0x4, 0x1, 0xA, 0xEC, 0x6F, 0x5D, 0x4F, 0x88, 0x6E, 0x9E, 0x6E, 0x50, 0x7, 0xFE, 0xF7, 0xB4, 0x3B, 0x25, 0x5B, 0x2F, 0x4E, 0x45, 0xFE, 0x2C, 0x86, 0x7D, 0x7C, 0x89, 0x87, 0x7D, 0x7D, 0x14, 0x1, 0x33, 0xE6, 0x22, 0xEC, 0x1, 0x3B, 0x26, 0x72, 0x87, 0x85, 0x5E, 0x88, 0x18, 0x33, 0x4B, 0xEB, 0xFE, 0xC5, 0x4, 0x22, 0x2E, 0x4D, 0x7A, 0x1D, 0x58, 0x37, 0x49, 0xFC, 0xA1, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x15, 0x91, 0xD2, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x8, 0xDB, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x0, 0x34, 0x3, 0xBC, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x7, 0x39, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x0, 0x54, 0x2, 0xFB, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x5, 0x20, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x35, 0x4C, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x84, 0xFE, 0x75, 0xFF, 0xFF, 0x0, 0xD, 0xFE, 0x60, 0x4, 0x94, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x55, 0x63, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x7D, 0xFC, 0x75, 0x0, 0x2, 0x0, 0x28, 0x0, 0x0, 0x5, 0xEA, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x20, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x1, 0x11, 0x23, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x34, 0x36, 0x33, 0x11, 0x21, 0x32, 0x0, 0x15, 0x14, 0x4, 0x23, 0x2, 0xA8, 0x1, 0x30, 0x93, 0x82, 0x82, 0x93, 0xFE, 0xD0, 0xFD, 0xD, 0x67, 0x44, 0x11, 0xC0, 0x1C, 0xD9, 0xAA, 0x2, 0x2D, 0xFE, 0x1, 0x14, 0xFE, 0xEC, 0xFE, 0x4, 0xE5, 0xFE, 0x3, 0x8A, 0x6D, 0x66, 0xA0, 0xFD, 0x38, 0xFD, 0xE3, 0x2, 0x1D, 0x62, 0x5B, 0x53, 0x44, 0x4A, 0x79, 0xBF, 0x9D, 0x2, 0xC8, 0xFE, 0xFA, 0xC9, 0xD3, 0xF1, 0x0, 0x2, 0x0, 0x22, 0xFE, 0x60, 0x5, 0x6C, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x2B, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x3, 0x78, 0x8B, 0x76, 0x76, 0x83, 0x94, 0x42, 0x5F, 0x90, 0x7F, 0x70, 0xF3, 0x34, 0x23, 0x3D, 0x3A, 0x10, 0xBC, 0x1B, 0xAB, 0x6D, 0x3B, 0x42, 0xE0, 0xA, 0x6C, 0xB7, 0xCE, 0xDA, 0xE1, 0xAE, 0xD4, 0x90, 0x15, 0x92, 0xCF, 0x7B, 0xFD, 0xC7, 0x26, 0xC2, 0x20, 0xFE, 0x54, 0x2, 0x11, 0x16, 0x6C, 0x54, 0x4D, 0x4B, 0x47, 0x7D, 0xAA, 0xB8, 0x17, 0x2, 0xFC, 0x6D, 0x81, 0xFE, 0xD0, 0xF7, 0x15, 0xEC, 0xFE, 0xC6, 0x0, 0x2, 0x0, 0x28, 0x0, 0x0, 0x5, 0xF1, 0x6, 0xF, 0x0, 0x8, 0x0, 0x26, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x1, 0x11, 0x23, 0x11, 0x26, 0x26, 0x35, 0x34, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x15, 0x14, 0x33, 0x11, 0x21, 0x32, 0x0, 0x15, 0x14, 0x4, 0x23, 0x2, 0xAE, 0x1, 0x30, 0x93, 0x82, 0x82, 0x93, 0xFE, 0xD0, 0xFD, 0x9F, 0xDC, 0x68, 0x47, 0x2F, 0x93, 0x51, 0x57, 0x65, 0xB3, 0x2, 0x2D, 0xFE, 0x1, 0x15, 0xFE, 0xEB, 0xFE, 0x4, 0xE5, 0xFE, 0x3, 0x8A, 0x6D, 0x66, 0xA0, 0xFD, 0x38, 0xFD, 0xE3, 0x2, 0x1D, 0x1, 0x7F, 0xA7, 0x76, 0xB7, 0x55, 0x44, 0x54, 0x2A, 0x87, 0x4D, 0x92, 0x59, 0x6D, 0xBC, 0x59, 0x6D, 0x2, 0xC8, 0xFE, 0xFA, 0xC9, 0xD3, 0xF1, 0x0, 0x2, 0x0, 0x2B, 0xFE, 0x60, 0x5, 0x57, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x30, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x2E, 0x2, 0x35, 0x34, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x15, 0x14, 0x16, 0x17, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x3, 0x64, 0x8B, 0x76, 0x76, 0x83, 0x94, 0x42, 0x6F, 0x8F, 0x82, 0x7C, 0xF3, 0x56, 0xAB, 0x71, 0x66, 0x3D, 0x2F, 0x90, 0x52, 0x55, 0x5E, 0x5C, 0x43, 0xDF, 0xB, 0x6C, 0xB7, 0xCE, 0xD9, 0xDA, 0xAF, 0xD3, 0x90, 0x15, 0x92, 0xCF, 0x7B, 0xFD, 0xC2, 0x20, 0xC3, 0x1C, 0xFE, 0x58, 0x1, 0xF3, 0x1C, 0x49, 0x76, 0x61, 0x6B, 0xB2, 0x5C, 0x36, 0x47, 0x2B, 0x88, 0x4C, 0x87, 0x53, 0x60, 0xB6, 0x50, 0x36, 0x47, 0x19, 0x3, 0x24, 0x6D, 0x81, 0xFE, 0xD0, 0xF8, 0x14, 0xEC, 0xFE, 0xC6, 0x0, 0x2, 0x0, 0x60, 0xFE, 0x75, 0x5, 0x9A, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x28, 0x0, 0x0, 0x1, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x13, 0x27, 0x7, 0x27, 0x37, 0x27, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x15, 0x14, 0x2, 0x7, 0x17, 0x37, 0x17, 0x7, 0x17, 0x4, 0x1C, 0xB9, 0xA7, 0xA2, 0xBC, 0xBE, 0xA2, 0xA8, 0xB6, 0xDF, 0x94, 0x94, 0x7C, 0x89, 0x9F, 0x3F, 0x44, 0xFE, 0xF6, 0xFE, 0xAC, 0x1, 0x52, 0x1, 0xA, 0x1, 0x10, 0x1, 0x4D, 0x84, 0x76, 0x57, 0xA9, 0x7B, 0x9C, 0x9A, 0x2, 0xFE, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0xFB, 0xE5, 0x76, 0x99, 0x77, 0x8E, 0x7F, 0xD, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xFE, 0x84, 0xFE, 0xB4, 0x49, 0xCE, 0xFE, 0xCE, 0x58, 0x45, 0xAE, 0x78, 0xA1, 0x7A, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x60, 0x4, 0xD7, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x56, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0x1, 0xA9, 0xFC, 0x75, 0x0, 0x2, 0x0, 0x60, 0xFE, 0x82, 0x6, 0xCD, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x31, 0x0, 0x0, 0x1, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x13, 0x27, 0x7, 0x27, 0x37, 0x27, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x11, 0x15, 0x14, 0x2, 0x7, 0x17, 0x1, 0x36, 0x37, 0x36, 0x26, 0x27, 0x37, 0x16, 0x17, 0x14, 0x7, 0x1, 0x17, 0x4, 0x1B, 0xB9, 0xA7, 0xA1, 0xBD, 0xBF, 0xA1, 0xA8, 0xB6, 0xDF, 0x93, 0x8B, 0x7F, 0x7E, 0x9B, 0x3F, 0x44, 0xFE, 0xF6, 0xFE, 0xAD, 0x1, 0x51, 0x1, 0xA, 0x1, 0x10, 0x1, 0x4E, 0x84, 0x76, 0x55, 0x1, 0x19, 0x6F, 0xB, 0xA, 0x52, 0x2E, 0x9D, 0x9E, 0x1, 0xBF, 0xFE, 0xF3, 0x96, 0x2, 0xFE, 0xF5, 0x1, 0x0, 0xFF, 0x0, 0xF5, 0x4B, 0xF5, 0xFE, 0xFE, 0x1, 0x2, 0xF5, 0xFB, 0xE5, 0x75, 0x8B, 0x7E, 0x7E, 0x7B, 0xD, 0x1, 0x7B, 0x1, 0x4C, 0x49, 0x1, 0x4C, 0x1, 0x7C, 0xFE, 0x84, 0xFE, 0xB4, 0x49, 0xCE, 0xFE, 0xCE, 0x58, 0x44, 0x1, 0x19, 0x6F, 0x58, 0x58, 0x8F, 0x3C, 0x73, 0xC4, 0xAA, 0xA6, 0xC4, 0xFE, 0xF3, 0x77, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x60, 0x5, 0x9B, 0x4, 0x4E, 0x0, 0x1F, 0x0, 0x2B, 0x0, 0x0, 0x1, 0x23, 0x35, 0x7, 0x27, 0x37, 0x35, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x37, 0x36, 0x37, 0x36, 0x26, 0x27, 0x37, 0x16, 0x12, 0x7, 0x7, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x4, 0x3, 0xF3, 0x80, 0x7E, 0xFE, 0x6A, 0xAA, 0xCA, 0xE2, 0xE1, 0xCD, 0xB4, 0x6B, 0xD, 0xD9, 0x58, 0x6C, 0xA, 0xA, 0x52, 0x2E, 0x9E, 0x9E, 0x4, 0xCF, 0xC9, 0xFE, 0x36, 0x92, 0x45, 0x46, 0x8F, 0x83, 0x76, 0x74, 0xFE, 0x60, 0xA3, 0x7A, 0x7E, 0xF4, 0x62, 0x71, 0x1, 0x3A, 0xED, 0x14, 0xF7, 0x1, 0x30, 0x7E, 0x6A, 0xFC, 0xAA, 0x54, 0x68, 0x57, 0x56, 0x91, 0x3C, 0x73, 0xC4, 0xFE, 0xA8, 0xC6, 0xC0, 0xC4, 0x7C, 0x1, 0xEA, 0x76, 0xD2, 0x92, 0x15, 0x91, 0xD2, 0x0, 0x1, 0x0, 0x14, 0x0, 0x0, 0x3, 0xF9, 0x5, 0xC4, 0x0, 0x15, 0x0, 0x0, 0x21, 0x21, 0x1, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x21, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x1, 0x3, 0xF9, 0xFE, 0xFC, 0xFE, 0x52, 0xAF, 0xE5, 0x76, 0x88, 0x65, 0x8B, 0x59, 0x80, 0xCB, 0x1, 0x10, 0xE6, 0xFD, 0xC6, 0x8C, 0x1, 0x79, 0x2, 0x6F, 0x56, 0xA8, 0x91, 0x66, 0x94, 0x44, 0x4A, 0x93, 0xC7, 0xEC, 0xCA, 0xA9, 0xE0, 0x55, 0xFD, 0xDD, 0x0, 0x1, 0x0, 0xD, 0x0, 0x0, 0x3, 0x1E, 0x4, 0x46, 0x0, 0x16, 0x0, 0x0, 0x21, 0x21, 0x1, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x1, 0x3, 0x1E, 0xFE, 0xFB, 0xFE, 0xC4, 0x86, 0x9D, 0x58, 0x43, 0x42, 0x62, 0x3D, 0x77, 0x4B, 0xAB, 0x73, 0xAB, 0xD3, 0x8C, 0x64, 0x1, 0x1A, 0x1, 0xD4, 0x36, 0x7F, 0x5E, 0x4D, 0x4D, 0x2A, 0x29, 0x92, 0x3C, 0x4A, 0xBA, 0xA1, 0x7B, 0x99, 0x35, 0xFE, 0x67, 0x0, 0x1, 0x0, 0x22, 0xFE, 0x60, 0x4, 0xE2, 0x5, 0xC5, 0x0, 0x1D, 0x0, 0x0, 0x21, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x36, 0x12, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x4, 0x15, 0x14, 0x0, 0x7, 0x21, 0x11, 0x33, 0x11, 0x33, 0x4, 0xE2, 0xAE, 0xFC, 0xFC, 0xFA, 0xBD, 0xFC, 0x7D, 0x86, 0x7A, 0x7F, 0x6B, 0x5C, 0x93, 0xD2, 0xCC, 0x1, 0x13, 0xFE, 0xEC, 0xDC, 0x1, 0xC2, 0xFC, 0xAE, 0xFE, 0x60, 0x1, 0xA0, 0xAF, 0xB7, 0x1, 0x10, 0xF3, 0x8D, 0x74, 0x89, 0x3E, 0xAF, 0x61, 0xDB, 0xE3, 0xD9, 0xFE, 0x6D, 0xD1, 0x1, 0x8E, 0xFE, 0x72, 0x0, 0x1, 0x0, 0x22, 0xFE, 0x60, 0x4, 0xE2, 0x6, 0x1F, 0x0, 0x1B, 0x0, 0x0, 0x21, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x0, 0x0, 0x35, 0x10, 0x21, 0x22, 0x7, 0x27, 0x36, 0x33, 0x32, 0x4, 0x15, 0x14, 0x0, 0x7, 0x21, 0x11, 0x33, 0x11, 0x33, 0x4, 0xE2, 0xB7, 0xF3, 0xFC, 0xFA, 0x1, 0x21, 0x1, 0x1B, 0xFE, 0xFF, 0x7A, 0x69, 0x68, 0x95, 0xC2, 0xD4, 0x1, 0x14, 0xFE, 0xE6, 0xDF, 0x1, 0xD0, 0xF3, 0xB7, 0xFE, 0x60, 0x1, 0xA0, 0xA8, 0x1, 0x14, 0x1, 0xC0, 0xD5, 0x1, 0xB, 0x40, 0xA3, 0x60, 0xD6, 0xE8, 0xDC, 0xFE, 0x22, 0xE4, 0x1, 0x95, 0xFE, 0x6B, 0x0, 0x1, 0x0, 0x12, 0xFF, 0x83, 0x5, 0x1D, 0x6, 0x1D, 0x0, 0xE, 0x0, 0x0, 0x21, 0x27, 0x7, 0x23, 0x13, 0x1, 0x21, 0x13, 0x1, 0x33, 0x1, 0x17, 0x1, 0x21, 0x1, 0x2, 0x1C, 0x21, 0x46, 0xC0, 0xA1, 0xFE, 0x7C, 0x1, 0x15, 0xE7, 0x1, 0xB, 0xBF, 0xFE, 0x95, 0x29, 0x1, 0x71, 0x1, 0x16, 0xFD, 0xF4, 0x5C, 0xD9, 0x1, 0xF2, 0x4, 0x3B, 0xFD, 0x35, 0x3, 0x38, 0xFB, 0x9F, 0x7E, 0x4, 0x72, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x17, 0xFF, 0x83, 0x3, 0xDB, 0x5, 0x1, 0x0, 0xE, 0x0, 0x0, 0x21, 0x27, 0x7, 0x23, 0x13, 0x3, 0x33, 0x13, 0x13, 0x33, 0x3, 0x17, 0x13, 0x33, 0x1, 0x1, 0x91, 0x1F, 0x3F, 0xB7, 0x94, 0xF9, 0xFB, 0x6A, 0xA3, 0xB6, 0xFD, 0x24, 0xE4, 0xFB, 0xFE, 0x89, 0x58, 0xD5, 0x1, 0xEF, 0x2, 0xC8, 0xFE, 0xA3, 0x2, 0x24, 0xFC, 0xAB, 0x77, 0x3, 0x5, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x31, 0xFE, 0x4B, 0x6, 0xE5, 0x5, 0xB0, 0x0, 0x16, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x37, 0x37, 0x23, 0x1, 0x1, 0x23, 0x1, 0x33, 0x13, 0x1, 0x33, 0x1, 0x13, 0x33, 0x1, 0x2, 0x4, 0x27, 0x2C, 0x55, 0x2E, 0x59, 0x68, 0x17, 0xE, 0x17, 0xFE, 0xEB, 0xFE, 0xE5, 0xF2, 0xFE, 0xB0, 0xFB, 0xE2, 0x1, 0x16, 0xD4, 0x1, 0x10, 0xE2, 0xFB, 0xFE, 0x90, 0x49, 0xFE, 0x4B, 0x11, 0xBD, 0x4, 0x44, 0x67, 0x40, 0x4, 0x26, 0xFB, 0xDA, 0x5, 0xB0, 0xFB, 0xBD, 0x4, 0x43, 0xFB, 0xC5, 0x4, 0x3B, 0xF9, 0xD4, 0xFE, 0xC7, 0xFF, 0xFF, 0x0, 0x17, 0xFE, 0x4B, 0x6, 0xAB, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5B, 0x0, 0x0, 0x0, 0x7, 0x0, 0x5E, 0x2, 0xD4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x4A, 0xFF, 0xEB, 0x4, 0x3D, 0x7, 0x8C, 0x0, 0x2E, 0x0, 0x0, 0x5, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x25, 0x23, 0x26, 0x24, 0x35, 0x34, 0x24, 0x33, 0x32, 0x16, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x3D, 0x77, 0xE1, 0x90, 0xFA, 0x83, 0x6B, 0x7A, 0x89, 0x96, 0x8D, 0x8D, 0x1, 0x2D, 0x71, 0xF6, 0xFE, 0xF4, 0x1, 0x1E, 0xE2, 0x7D, 0xE1, 0x8E, 0xFA, 0x88, 0x6A, 0x7C, 0x87, 0x89, 0x84, 0x1, 0xBF, 0x1, 0xFE, 0xAE, 0xB5, 0xC6, 0xFE, 0xDF, 0x15, 0x58, 0xBC, 0x95, 0x59, 0x7F, 0x81, 0x64, 0x86, 0x73, 0xAE, 0xED, 0x2, 0xD4, 0xD4, 0xD0, 0xDD, 0x5C, 0xBB, 0x8F, 0x5A, 0x7B, 0x7D, 0x5F, 0x7E, 0x6D, 0x9B, 0xFE, 0xEC, 0x1C, 0xD1, 0xBC, 0xD0, 0xE1, 0x0, 0x1, 0x0, 0x51, 0xFE, 0x4B, 0x4, 0x4A, 0x6, 0x9E, 0x0, 0x2D, 0x0, 0x0, 0x1, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x1, 0x23, 0x26, 0x24, 0x35, 0x34, 0x24, 0x33, 0x32, 0x16, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x5, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x4A, 0x77, 0xE1, 0x90, 0xF3, 0x85, 0x70, 0x80, 0x8E, 0x9B, 0x93, 0x8E, 0x1, 0x61, 0xAE, 0xF4, 0xFE, 0xF6, 0x1, 0x1E, 0xE2, 0x7D, 0xE1, 0x8E, 0xF3, 0x8B, 0x6E, 0x83, 0x8A, 0x1, 0xC, 0x1, 0xC9, 0x1, 0xFE, 0x89, 0xCA, 0xDD, 0xFE, 0xDF, 0xFE, 0x4B, 0x58, 0xBB, 0x95, 0x5E, 0x87, 0x85, 0x64, 0x97, 0x82, 0xAB, 0x1, 0x84, 0x3, 0xE0, 0xD0, 0xCF, 0xDD, 0x5D, 0xBB, 0x8E, 0x60, 0x83, 0x85, 0x65, 0xF3, 0x5, 0x9B, 0xFE, 0x5C, 0x17, 0xE7, 0xC5, 0xCC, 0xE0, 0x0, 0x2, 0x0, 0x14, 0x0, 0x0, 0x4, 0xCE, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x21, 0x16, 0x4, 0x15, 0x14, 0x4, 0x23, 0x1, 0xD7, 0xF6, 0x91, 0x7D, 0x7D, 0x91, 0xF6, 0xF3, 0xD0, 0xD0, 0xF3, 0xDB, 0xDB, 0x1, 0x2, 0xF3, 0x1, 0x2, 0xFE, 0xF8, 0xF9, 0x3, 0xA3, 0xFE, 0x4C, 0x8A, 0x52, 0x53, 0x85, 0xFD, 0x89, 0xFE, 0xD4, 0x4, 0xB6, 0xAB, 0x4F, 0x4F, 0xAB, 0x50, 0x3, 0xE7, 0xAF, 0xB3, 0xEE, 0x0, 0x2, 0x0, 0x14, 0xFE, 0x60, 0x4, 0x99, 0x6, 0x0, 0x0, 0xB, 0x0, 0x23, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x3, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x23, 0x22, 0x27, 0x2, 0xB0, 0x83, 0x74, 0x76, 0x83, 0x94, 0x42, 0x43, 0x43, 0xF3, 0xD1, 0xD1, 0xF3, 0xDA, 0xDA, 0x6B, 0xAF, 0xCE, 0xD9, 0xD9, 0xCB, 0xB1, 0x6C, 0xAF, 0xD3, 0x91, 0x14, 0x92, 0xCF, 0x7B, 0xFE, 0x20, 0x7E, 0xFD, 0xB1, 0x6, 0x60, 0xAB, 0x95, 0x95, 0xAB, 0xE8, 0x76, 0xFE, 0xD0, 0xF8, 0x14, 0xEC, 0xFE, 0xC6, 0x75, 0x0, 0x2, 0x0, 0x14, 0xFF, 0x38, 0x4, 0xCE, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x16, 0x4, 0x15, 0x14, 0x4, 0x23, 0x23, 0x15, 0x33, 0x1, 0xD7, 0xF6, 0x91, 0x7D, 0x7D, 0x91, 0x1B, 0xDB, 0xF3, 0xD0, 0xD0, 0xF3, 0xFE, 0xF5, 0x1, 0x4, 0xFE, 0xF8, 0xF9, 0xF6, 0xDB, 0x3, 0xD6, 0xFE, 0x19, 0x95, 0x5C, 0x5F, 0x97, 0xFC, 0x2A, 0xC8, 0xC8, 0xAB, 0x5, 0x5, 0xFE, 0xE9, 0x2, 0xF8, 0xBD, 0xBE, 0xF8, 0x81, 0x0, 0x2, 0x0, 0x14, 0xFE, 0x60, 0x4, 0x99, 0x6, 0x0, 0x0, 0xB, 0x0, 0x23, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x13, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x23, 0x22, 0x27, 0x15, 0x33, 0x2, 0xB0, 0x83, 0x74, 0x76, 0x83, 0x95, 0x41, 0x43, 0x97, 0xDA, 0xF3, 0xD1, 0xD1, 0xF3, 0x6B, 0xAF, 0xCE, 0xD9, 0xD9, 0xCB, 0xB1, 0x6C, 0xDA, 0xAF, 0xD3, 0x91, 0x14, 0x92, 0xCF, 0x7E, 0xFE, 0x25, 0x80, 0xFE, 0x46, 0x95, 0x95, 0xAB, 0x6, 0x60, 0xFD, 0xD8, 0x76, 0xFE, 0xD0, 0xF8, 0x14, 0xEC, 0xFE, 0xC6, 0x75, 0xC1, 0x0, 0x1, 0x0, 0x95, 0xFE, 0x60, 0x4, 0x6E, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x23, 0x11, 0x33, 0x11, 0x1, 0x21, 0x1, 0x1, 0x91, 0xFC, 0xFC, 0x1, 0xCF, 0x1, 0xE, 0xFD, 0x23, 0xFE, 0x60, 0x7, 0x50, 0xFC, 0x7, 0x3, 0xF9, 0xF9, 0xFB, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x60, 0x3, 0xCB, 0x4, 0x3A, 0x0, 0x7, 0x0, 0x0, 0x1, 0x23, 0x11, 0x33, 0x11, 0x1, 0x33, 0x1, 0x1, 0x70, 0xF3, 0xF3, 0x1, 0x60, 0xFB, 0xFD, 0xA5, 0xFE, 0x60, 0x5, 0xDA, 0xFC, 0xE9, 0x3, 0x17, 0xFB, 0x29, 0x0, 0x1, 0x0, 0x25, 0x0, 0x0, 0x3, 0xC9, 0x5, 0xC5, 0x0, 0x22, 0x0, 0x0, 0x33, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x25, 0x23, 0x35, 0x33, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x15, 0x14, 0x4, 0x23, 0x73, 0x1, 0x30, 0x8D, 0x9C, 0xFE, 0xF5, 0x8A, 0x81, 0x86, 0x78, 0x5A, 0x71, 0x5D, 0x6F, 0xFA, 0x1, 0x8, 0xBB, 0xDC, 0xEF, 0x7B, 0x6D, 0xFE, 0xFE, 0xCB, 0xF1, 0xCB, 0x72, 0x6B, 0xE1, 0x6, 0xC9, 0x1, 0x72, 0x60, 0x56, 0x72, 0x6C, 0x59, 0xBD, 0xDA, 0xDB, 0xB7, 0x67, 0xA5, 0x2F, 0x5C, 0xFC, 0xD3, 0xCD, 0x0, 0x1, 0x0, 0x21, 0xFE, 0x6D, 0x3, 0x6C, 0x4, 0x4D, 0x0, 0x23, 0x0, 0x0, 0x13, 0x35, 0x33, 0x36, 0x36, 0x35, 0x10, 0x25, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x4, 0x23, 0x6E, 0xF6, 0x91, 0x85, 0xFE, 0xEF, 0x76, 0x90, 0x69, 0x67, 0x4D, 0x5A, 0x45, 0x54, 0xF2, 0xE4, 0xA5, 0xC4, 0xD7, 0x65, 0x55, 0x70, 0x71, 0xFE, 0xFE, 0xEC, 0xFE, 0x6D, 0xBC, 0x1, 0x8E, 0x6A, 0x1, 0x1, 0x6, 0xA9, 0x8A, 0x6B, 0x56, 0x75, 0x58, 0x3B, 0x98, 0xB6, 0xD4, 0xAA, 0x69, 0xA9, 0x30, 0x33, 0xC1, 0x80, 0xBB, 0xF1, 0x0, 0x2, 0x0, 0x46, 0xFF, 0xEC, 0x4, 0x1C, 0x5, 0xC5, 0x0, 0x7, 0x0, 0x20, 0x0, 0x0, 0x1, 0x33, 0x32, 0x35, 0x34, 0x23, 0x22, 0x7, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x21, 0x35, 0x21, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x10, 0x5, 0x23, 0x11, 0x14, 0x6, 0x2, 0x60, 0x39, 0x9A, 0x67, 0x6A, 0x2, 0xFE, 0x7D, 0x50, 0x47, 0x7, 0x34, 0x3A, 0xA8, 0x1, 0xFE, 0xE9, 0x1, 0x17, 0x9B, 0xCA, 0xA7, 0xAC, 0xFE, 0x94, 0x50, 0xCC, 0x4, 0x17, 0x8A, 0x69, 0x86, 0xFB, 0x68, 0x15, 0xBD, 0x9, 0xB5, 0x1, 0xF2, 0xBB, 0x2F, 0x94, 0xEB, 0xAD, 0x7F, 0xFE, 0xCC, 0x9, 0xFE, 0x10, 0xC3, 0xBD, 0x0, 0x2, 0x0, 0x49, 0xFE, 0x4B, 0x4, 0x18, 0x5, 0xFB, 0x0, 0xA, 0x0, 0x24, 0x0, 0x0, 0x1, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x21, 0x35, 0x21, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x23, 0x11, 0x14, 0x6, 0x2, 0x57, 0x3F, 0x53, 0x4C, 0x3D, 0x2F, 0x36, 0x3C, 0xFE, 0x88, 0x46, 0x43, 0x6, 0x2E, 0x33, 0xA6, 0x1, 0xFE, 0xE5, 0x1, 0x1B, 0x9A, 0xC7, 0xA7, 0xAC, 0xC4, 0xBF, 0x3E, 0xC8, 0x4, 0x3E, 0x57, 0x40, 0x38, 0x40, 0x53, 0x44, 0xF9, 0x95, 0x10, 0xC1, 0x8, 0xB5, 0x3, 0xC1, 0xB4, 0x3E, 0x95, 0xEA, 0xAF, 0x7F, 0x99, 0xAA, 0xFC, 0x41, 0xBA, 0xC6, 0x0, 0x2, 0x0, 0x4D, 0xFF, 0xEC, 0x4, 0x4D, 0x5, 0xC4, 0x0, 0x14, 0x0, 0x21, 0x0, 0x0, 0x5, 0x27, 0x3E, 0x2, 0x37, 0x6, 0x23, 0x22, 0x0, 0x35, 0x34, 0x0, 0x33, 0x32, 0x0, 0x11, 0x15, 0x10, 0x2, 0x4, 0x3, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x1, 0xA0, 0x3E, 0x63, 0xC1, 0x95, 0x20, 0x7C, 0xA6, 0xCC, 0xFF, 0x0, 0x1, 0x18, 0xE5, 0xD7, 0x1, 0x2C, 0xBE, 0xFE, 0xC9, 0xF, 0x61, 0x84, 0x21, 0x94, 0x6E, 0x7B, 0x87, 0x83, 0x14, 0xC9, 0x17, 0x4C, 0x98, 0x88, 0x60, 0x1, 0x10, 0xE9, 0xCF, 0x1, 0x24, 0xFE, 0xCD, 0xFE, 0xF9, 0x69, 0xFE, 0xE4, 0xFE, 0xAD, 0xA9, 0x2, 0x95, 0x35, 0x27, 0x9E, 0xB0, 0xAB, 0xA6, 0x82, 0x7A, 0xB3, 0x0, 0x2, 0x0, 0x40, 0xFE, 0x4B, 0x4, 0x40, 0x4, 0x4E, 0x0, 0x13, 0x0, 0x20, 0x0, 0x0, 0x1, 0x27, 0x36, 0x24, 0x37, 0x6, 0x23, 0x22, 0x0, 0x35, 0x34, 0x0, 0x33, 0x32, 0x0, 0x11, 0x15, 0x10, 0x2, 0x4, 0x3, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x1, 0x94, 0x3F, 0x99, 0x1, 0x1A, 0x32, 0x7C, 0x9F, 0xCE, 0xFE, 0xEF, 0x1, 0x19, 0xE5, 0xD7, 0x1, 0x2B, 0xBD, 0xFE, 0xC9, 0xF, 0x6A, 0x8A, 0x1D, 0x99, 0x74, 0x82, 0x8C, 0x93, 0xFE, 0x4B, 0xC9, 0x27, 0xC0, 0xCC, 0x66, 0x1, 0x10, 0xE9, 0xCF, 0x1, 0x25, 0xFE, 0xCD, 0xFE, 0xF9, 0x6A, 0xFE, 0xF9, 0xFE, 0x94, 0xCF, 0x2, 0xB6, 0x41, 0x2D, 0x95, 0xAA, 0xC0, 0xB7, 0x7A, 0x82, 0xBA, 0x0, 0x2, 0x0, 0x56, 0x1, 0x4C, 0x3, 0x4C, 0x5, 0xBE, 0x0, 0x12, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x27, 0x36, 0x36, 0x37, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x10, 0x0, 0x3, 0x32, 0x37, 0x35, 0x34, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x1, 0x57, 0x38, 0x7D, 0xB2, 0x24, 0x54, 0x65, 0xA1, 0xC2, 0xD0, 0xA9, 0x9F, 0xDE, 0xFE, 0xF6, 0x73, 0x73, 0x45, 0xB6, 0x5B, 0x5B, 0x5B, 0x1, 0x4C, 0x9D, 0x25, 0x8B, 0x78, 0x3A, 0xC9, 0xAC, 0x9A, 0xD8, 0xE3, 0xC2, 0x4E, 0xFE, 0xF1, 0xFE, 0xBA, 0x2, 0x3, 0x37, 0x73, 0xF4, 0x70, 0x5B, 0x60, 0x73, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x60, 0x5, 0x86, 0x6, 0x0, 0x0, 0xD, 0x0, 0x2A, 0x0, 0x0, 0x25, 0x32, 0x37, 0x26, 0x35, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x22, 0x27, 0x3, 0x23, 0x13, 0x26, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x14, 0x17, 0x13, 0x33, 0x3, 0x16, 0x37, 0x2, 0x37, 0x9E, 0x44, 0x8, 0x44, 0x94, 0x84, 0x73, 0x72, 0x3, 0x61, 0x54, 0x44, 0x85, 0xBF, 0x96, 0x58, 0x2F, 0x6E, 0xE1, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xF3, 0x1D, 0xA6, 0xBF, 0xC8, 0x26, 0x31, 0xB3, 0x97, 0x36, 0x41, 0x1, 0x45, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xC7, 0xA, 0xFE, 0x6A, 0x1, 0xCB, 0x30, 0x56, 0xC5, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0x2, 0x29, 0xFB, 0xC2, 0x60, 0x3C, 0x1, 0xFA, 0xFD, 0x9C, 0x6, 0x2, 0x0, 0x1, 0x0, 0x8C, 0xFE, 0x60, 0x3, 0x0, 0x6, 0x0, 0x0, 0x11, 0x0, 0x0, 0x5, 0x22, 0x27, 0x3, 0x23, 0x13, 0x26, 0x3, 0x11, 0x33, 0x11, 0x14, 0x17, 0x13, 0x33, 0x3, 0x16, 0x37, 0x2, 0x90, 0x54, 0x44, 0x85, 0xBF, 0x96, 0xBC, 0x2, 0xF3, 0x1D, 0xA5, 0xBF, 0xC8, 0x27, 0x31, 0x14, 0xA, 0xFE, 0x6A, 0x1, 0xCB, 0x66, 0x1, 0x2A, 0x4, 0x45, 0xFB, 0xC2, 0x60, 0x3B, 0x1, 0xF9, 0xFD, 0x9C, 0x6, 0x2, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x60, 0x7, 0xFB, 0x4, 0x4E, 0x0, 0x2C, 0x0, 0x0, 0x5, 0x22, 0x27, 0x3, 0x23, 0x13, 0x26, 0x3, 0x11, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x17, 0x13, 0x33, 0x3, 0x16, 0x37, 0x7, 0x8B, 0x54, 0x44, 0x85, 0xC0, 0x97, 0xBA, 0x4, 0x1, 0x68, 0x5A, 0x53, 0x69, 0x14, 0xF3, 0x68, 0x5A, 0x93, 0x3D, 0xF2, 0xE4, 0x7, 0x73, 0xC6, 0xD7, 0x51, 0x77, 0xD6, 0xA5, 0xBD, 0x2, 0x1C, 0xA6, 0xBF, 0xC8, 0x27, 0x31, 0x14, 0xA, 0xFE, 0x6A, 0x1, 0xCC, 0x64, 0x1, 0x23, 0x1, 0xB, 0x77, 0x53, 0x5A, 0x48, 0xFD, 0x1A, 0x2, 0xBC, 0x72, 0x5A, 0x78, 0xFC, 0xF0, 0x4, 0x3A, 0x71, 0x85, 0xA5, 0xA5, 0xB6, 0xD2, 0xFE, 0xFA, 0x5F, 0x3B, 0x1, 0xFA, 0xFD, 0x9D, 0x6, 0x2, 0x0, 0x1, 0x0, 0x7A, 0xFE, 0x60, 0x5, 0x79, 0x4, 0x4E, 0x0, 0x1F, 0x0, 0x0, 0x5, 0x22, 0x27, 0x3, 0x23, 0x13, 0x26, 0x3, 0x11, 0x26, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x17, 0x13, 0x33, 0x3, 0x16, 0x37, 0x5, 0xA, 0x55, 0x44, 0x85, 0xBF, 0x96, 0xB8, 0x5, 0x1, 0x60, 0x5E, 0x91, 0x49, 0xF3, 0xE5, 0x8, 0x77, 0xC2, 0x9C, 0xBC, 0x1, 0x1C, 0xA5, 0xBF, 0xC8, 0x28, 0x31, 0x14, 0xA, 0xFE, 0x6A, 0x1, 0xCC, 0x64, 0x1, 0x21, 0x1, 0xD, 0x70, 0x5A, 0x84, 0xFC, 0xFC, 0x4, 0x3A, 0x7C, 0x90, 0xB3, 0xDA, 0xFE, 0xFF, 0x5F, 0x3A, 0x1, 0xF9, 0xFD, 0x9D, 0x6, 0x2, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x3, 0x83, 0x5, 0xB, 0x0, 0x13, 0x0, 0x0, 0x1, 0x13, 0x6, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x37, 0x37, 0x33, 0x7, 0x16, 0x17, 0x7, 0x26, 0x27, 0x3, 0x1, 0xC7, 0x65, 0x8B, 0x32, 0xF2, 0xE8, 0x7, 0x5A, 0xB4, 0x3E, 0xBE, 0x44, 0x2D, 0x24, 0x1, 0x60, 0x38, 0x63, 0x2, 0x2B, 0x1, 0x34, 0x14, 0x6B, 0xFD, 0x20, 0x4, 0x3A, 0x86, 0x92, 0x8, 0xBD, 0xD2, 0xB, 0xE, 0xE5, 0x19, 0x7, 0xFE, 0xD0, 0x0, 0x2, 0x0, 0x76, 0xFE, 0x60, 0x5, 0x64, 0x4, 0x3A, 0x0, 0x7, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x1, 0x21, 0x3, 0x23, 0x13, 0x1, 0x23, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x7, 0x17, 0x13, 0x33, 0x1, 0x33, 0x1, 0x69, 0xC1, 0x6B, 0x6C, 0xCF, 0x3, 0xD, 0xFE, 0xC8, 0xB6, 0xC3, 0xD7, 0xFE, 0xFD, 0xF9, 0xF3, 0x1, 0xB3, 0xD8, 0xF3, 0xD0, 0x98, 0xE9, 0xBF, 0xFE, 0xF7, 0xE4, 0x3, 0x76, 0xFE, 0xD3, 0x58, 0x48, 0x8A, 0x3, 0xFC, 0x8A, 0xFE, 0x60, 0x1, 0xE8, 0x1, 0x3E, 0xFE, 0x7A, 0x4, 0x3A, 0xA3, 0x9B, 0xD8, 0x5A, 0xBD, 0x2, 0x13, 0xFD, 0xA1, 0x0, 0x1, 0x0, 0x8, 0xFF, 0xEC, 0x3, 0xBB, 0x5, 0x41, 0x0, 0x1D, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x37, 0x33, 0x7, 0x33, 0x15, 0x23, 0x3, 0x23, 0x13, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x73, 0x46, 0x5A, 0x79, 0x9F, 0xB3, 0xB3, 0xF2, 0xE5, 0x44, 0xBE, 0x44, 0x6B, 0xA5, 0x71, 0xC0, 0x72, 0xAA, 0x40, 0x31, 0x2A, 0x2B, 0x4, 0x18, 0x89, 0xA7, 0x2, 0x6B, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0xD1, 0xD1, 0xB3, 0xFE, 0xA4, 0x1, 0x5C, 0xFD, 0xA3, 0x49, 0x2B, 0xA, 0x0, 0x2, 0x0, 0x1B, 0x0, 0x0, 0x4, 0x1F, 0x5, 0xC4, 0x0, 0x1F, 0x0, 0x2A, 0x0, 0x0, 0x33, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x27, 0x1, 0x21, 0x1, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x13, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x1B, 0x2, 0x22, 0x74, 0x7B, 0x24, 0x50, 0x15, 0xFE, 0xF8, 0xFE, 0xE6, 0x1, 0x75, 0x75, 0x56, 0x6E, 0xC3, 0xA3, 0xAD, 0xD0, 0x4B, 0x40, 0x76, 0x94, 0xFF, 0xDC, 0x20, 0x57, 0x4B, 0x4D, 0x49, 0x52, 0x51, 0xBC, 0x76, 0x60, 0x23, 0x6E, 0x3C, 0xF, 0xFE, 0x9D, 0x1, 0xE1, 0x54, 0x3E, 0x9A, 0x68, 0x83, 0xC1, 0xC2, 0xAD, 0x55, 0x9C, 0x5B, 0x52, 0xAE, 0x7F, 0xB5, 0xD5, 0x3, 0x7E, 0x7F, 0x5B, 0x45, 0x64, 0x56, 0x34, 0x5F, 0x3D, 0x0, 0x2, 0x0, 0x6A, 0xFF, 0xEC, 0x5, 0x1C, 0x6, 0xA3, 0x0, 0x13, 0x0, 0x21, 0x0, 0x0, 0x5, 0x20, 0x0, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x17, 0x26, 0x27, 0x37, 0x16, 0x4, 0x12, 0x11, 0x15, 0x10, 0x0, 0x25, 0x32, 0x12, 0x35, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x2, 0xC4, 0xFE, 0xF7, 0xFE, 0xAF, 0xA3, 0x1, 0xE, 0xA0, 0x31, 0x36, 0x91, 0xE8, 0x52, 0xDB, 0x1, 0x6C, 0xDA, 0xFE, 0xB7, 0xFE, 0xF1, 0xA5, 0xB5, 0x40, 0x76, 0x92, 0x9A, 0xD4, 0xBF, 0x14, 0x1, 0x66, 0x1, 0x33, 0xDE, 0x1, 0x34, 0xA1, 0x9, 0x75, 0x44, 0xBB, 0x3A, 0xE5, 0xFE, 0x8B, 0xFE, 0xEF, 0x4B, 0xFE, 0xB4, 0xFE, 0x85, 0xD1, 0x1, 0x2, 0xF4, 0x4D, 0xB4, 0x8C, 0x2B, 0xEA, 0xFB, 0xDC, 0xED, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEB, 0x4, 0x62, 0x5, 0x51, 0x0, 0x13, 0x0, 0x20, 0x0, 0x0, 0x5, 0x22, 0x0, 0x35, 0x34, 0x0, 0x33, 0x32, 0x17, 0x26, 0x24, 0x27, 0x37, 0x16, 0x4, 0x12, 0x15, 0x15, 0x10, 0x0, 0x27, 0x32, 0x36, 0x35, 0x35, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x2, 0x55, 0xE6, 0xFE, 0xE1, 0x1, 0x13, 0xDC, 0x8D, 0x71, 0x49, 0xFE, 0xDB, 0x94, 0x4C, 0xD2, 0x1, 0x4A, 0xBF, 0xFE, 0xD3, 0xDC, 0x80, 0x96, 0x20, 0x8D, 0x6E, 0x80, 0x91, 0x91, 0x15, 0x1, 0x1D, 0xCC, 0xE4, 0x1, 0x15, 0x51, 0x90, 0x67, 0x1B, 0xC3, 0x2A, 0xA1, 0xFE, 0xE0, 0xEB, 0x57, 0xFE, 0xFD, 0xFE, 0xCA, 0xC3, 0xDF, 0xA5, 0x70, 0x2C, 0x43, 0xB7, 0x86, 0x70, 0xB6, 0x0, 0x1, 0x0, 0x99, 0xFE, 0x60, 0x4, 0x8B, 0x5, 0xC4, 0x0, 0x12, 0x0, 0x0, 0x21, 0x21, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x20, 0x17, 0x7, 0x26, 0x26, 0x23, 0x22, 0x7, 0x11, 0x21, 0x3, 0xB8, 0xFD, 0xDD, 0xFC, 0xFC, 0xBB, 0xAE, 0x1, 0xA, 0x83, 0x95, 0x30, 0x79, 0x5F, 0xA9, 0xB0, 0x2, 0x23, 0xFE, 0x60, 0x7, 0x50, 0x30, 0x44, 0x92, 0xA1, 0x2F, 0x33, 0x42, 0xFC, 0x19, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x60, 0x3, 0x37, 0x4, 0x4E, 0x0, 0x11, 0x0, 0x0, 0x21, 0x21, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x21, 0x3, 0x13, 0xFE, 0x5C, 0xF2, 0xDE, 0xB, 0x6D, 0xB7, 0x62, 0x4B, 0x2, 0x62, 0x59, 0xBF, 0x4C, 0x1, 0xA4, 0xFE, 0x60, 0x5, 0xDA, 0x83, 0x97, 0x1A, 0xE0, 0x20, 0x8E, 0xFD, 0xDD, 0x0, 0x1, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0xB6, 0x5, 0xB0, 0x0, 0x21, 0x0, 0x0, 0x5, 0x22, 0x24, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x24, 0x24, 0x35, 0x34, 0x37, 0x23, 0x35, 0x21, 0x15, 0x21, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0xB0, 0x8C, 0xFE, 0xFA, 0xA8, 0xFD, 0xB7, 0x86, 0x83, 0x86, 0x73, 0xFE, 0x61, 0xFE, 0xFC, 0x3E, 0x97, 0x4, 0x63, 0xFD, 0x4D, 0x5A, 0x95, 0x9A, 0xFB, 0xEC, 0xFE, 0xE6, 0x14, 0x66, 0xCD, 0x99, 0x8A, 0x7A, 0x6C, 0x58, 0x57, 0x69, 0x81, 0xCA, 0xAE, 0x60, 0x54, 0xCB, 0xCB, 0x3B, 0x78, 0x51, 0x6B, 0x2D, 0x49, 0xD9, 0xAD, 0xB8, 0xD6, 0x0, 0x1, 0x0, 0x30, 0xFF, 0xF3, 0x4, 0x9B, 0x5, 0xB7, 0x0, 0x21, 0x0, 0x0, 0x5, 0x21, 0x35, 0x21, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x4, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x4, 0x16, 0x15, 0x14, 0x7, 0x33, 0x4, 0x9B, 0xFB, 0x9D, 0x2, 0xB3, 0x5A, 0x98, 0x99, 0xF7, 0xED, 0x1, 0x19, 0xED, 0x8C, 0x1, 0x5, 0xA8, 0xFC, 0xB7, 0x86, 0x84, 0x85, 0x72, 0x1, 0xA7, 0xFC, 0x3D, 0x96, 0xD, 0xCB, 0x3B, 0x78, 0x52, 0x6B, 0x2D, 0x48, 0xD8, 0xAE, 0xB9, 0xD5, 0x66, 0xCC, 0x9A, 0x8A, 0x7A, 0x6C, 0x58, 0x56, 0x6A, 0x84, 0xC8, 0xAD, 0x60, 0x54, 0x0, 0x1, 0x0, 0x42, 0xFE, 0x60, 0x3, 0xE6, 0x4, 0x4E, 0x0, 0x20, 0x0, 0x0, 0x1, 0x21, 0x35, 0x21, 0x36, 0x35, 0x34, 0x26, 0x24, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x7, 0x33, 0x3, 0xE6, 0xFC, 0x67, 0x2, 0x19, 0x47, 0x7B, 0xFE, 0xE2, 0x67, 0x6B, 0xE0, 0xC1, 0xCB, 0xE6, 0xF2, 0x60, 0x5F, 0xB4, 0x64, 0x81, 0xC3, 0xC5, 0x33, 0x7D, 0xFE, 0x60, 0xC1, 0x43, 0x73, 0x6C, 0x83, 0x91, 0x63, 0x67, 0xB4, 0xAF, 0xCA, 0xC6, 0x92, 0x3F, 0x63, 0xC2, 0x50, 0x83, 0x41, 0x62, 0xE9, 0x99, 0x66, 0x57, 0xFF, 0xFF, 0x0, 0x2E, 0x0, 0x0, 0x3, 0xC0, 0x5, 0xB0, 0x0, 0xF, 0x0, 0x31, 0x4, 0x55, 0x5, 0xB0, 0xC0, 0x0, 0xFF, 0xFF, 0x0, 0x83, 0xFE, 0x3A, 0x1, 0x76, 0x4, 0x3A, 0x0, 0x7, 0x0, 0x51, 0xFF, 0xF7, 0xFE, 0x3A, 0x0, 0x1, 0x0, 0x95, 0xFE, 0x60, 0x4, 0xF3, 0x5, 0xC4, 0x0, 0x11, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x4, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0xEA, 0xA9, 0xB0, 0xFC, 0xFC, 0xBD, 0xAC, 0xE4, 0x1, 0x15, 0xFC, 0x84, 0x4, 0xF3, 0x42, 0xF9, 0xAF, 0x7, 0x50, 0x30, 0x44, 0xD7, 0xF8, 0xFC, 0xB, 0x3, 0xF5, 0x93, 0x6B, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x60, 0x3, 0xFC, 0x4, 0x4E, 0x0, 0x11, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0x4A, 0x92, 0x49, 0xF2, 0xE4, 0x8, 0x77, 0xC3, 0x9C, 0xBC, 0x1, 0xF3, 0x62, 0x3, 0x88, 0x86, 0xFB, 0x5E, 0x5, 0xDA, 0x7D, 0x91, 0xB3, 0xDA, 0xFD, 0x3F, 0x2, 0xBE, 0x70, 0x5A, 0x0, 0x1, 0x0, 0x95, 0xFE, 0x60, 0x3, 0x6C, 0x5, 0xC4, 0x0, 0xD, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x2, 0xEA, 0xA9, 0xB0, 0xFC, 0xFC, 0xBB, 0xA7, 0x52, 0x27, 0x38, 0x4, 0xF3, 0x42, 0xF9, 0xAF, 0x7, 0x50, 0x30, 0x44, 0xC, 0xD2, 0xD, 0x0, 0x1, 0x0, 0x7D, 0xFE, 0x60, 0x2, 0xB5, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x2, 0x51, 0xA9, 0x39, 0xF2, 0xE8, 0x6, 0x56, 0x9E, 0x31, 0x25, 0x2, 0x32, 0x3, 0x64, 0x80, 0xFB, 0x7C, 0x5, 0xDA, 0x7A, 0x8E, 0xD, 0xE5, 0x8, 0x0, 0x1, 0x0, 0x86, 0xFF, 0xEC, 0x5, 0x10, 0x5, 0xB0, 0x0, 0x18, 0x0, 0x0, 0x1, 0x6, 0x0, 0x20, 0x0, 0x11, 0x35, 0x34, 0x12, 0x37, 0x23, 0x35, 0x21, 0x15, 0x21, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x37, 0x5, 0xB, 0x13, 0xFE, 0xE4, 0xFD, 0xE8, 0xFE, 0xC2, 0x7F, 0x69, 0xE8, 0x4, 0x8A, 0xFE, 0x13, 0xC1, 0xDE, 0x9C, 0xB0, 0xA3, 0x89, 0x13, 0x1, 0xDA, 0xD4, 0xFE, 0xE6, 0x1, 0x6B, 0x1, 0x31, 0x47, 0xA7, 0x1, 0x16, 0x5A, 0xCA, 0xCA, 0xFE, 0xE1, 0xFE, 0x41, 0xD0, 0xFF, 0x0, 0x97, 0x8B, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x6, 0x4, 0x3A, 0x0, 0x19, 0x0, 0x0, 0x1, 0x6, 0x4, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x36, 0x37, 0x23, 0x35, 0x21, 0x15, 0x21, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x4, 0x4, 0x5, 0xFF, 0x0, 0xB4, 0xFA, 0xF2, 0x54, 0x53, 0xB6, 0x3, 0xB6, 0xFE, 0x6E, 0x82, 0xA1, 0x62, 0x95, 0x59, 0x7A, 0x4, 0x1, 0x66, 0x9D, 0xDD, 0x1, 0x26, 0xC5, 0x23, 0x6E, 0xC7, 0x4A, 0xC1, 0xC1, 0xDD, 0xA4, 0x1C, 0x70, 0xBD, 0x68, 0x4F, 0xFF, 0xFF, 0x0, 0x49, 0xFE, 0x98, 0x2, 0xF8, 0xFF, 0xB8, 0x0, 0x7, 0x1, 0x77, 0xFF, 0xB4, 0xF9, 0xB7, 0x0, 0x2, 0x0, 0x6B, 0x1, 0x7, 0x1, 0x51, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x17, 0x0, 0x0, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x6B, 0x3C, 0x36, 0x38, 0x3C, 0x3C, 0x38, 0x36, 0x3C, 0x3C, 0x36, 0x38, 0x3C, 0x3C, 0x38, 0x36, 0x3C, 0x3, 0xE1, 0x2F, 0x3E, 0x3E, 0x2F, 0x2E, 0x3D, 0x3D, 0xFD, 0xBF, 0x2F, 0x3E, 0x3E, 0x2F, 0x2E, 0x3D, 0x3D, 0x0, 0x2, 0x0, 0x57, 0x1, 0xC9, 0x2, 0x7A, 0x3, 0x95, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x2, 0x7A, 0xFD, 0xDD, 0x2, 0x23, 0xFD, 0xDD, 0x3, 0x95, 0xA3, 0xA3, 0xFE, 0xD8, 0xA4, 0xA4, 0x0, 0x1, 0x0, 0x50, 0x3, 0x4D, 0x1, 0xD, 0x6, 0x18, 0x0, 0x5, 0x0, 0x0, 0x1, 0x15, 0x3, 0x23, 0x3, 0x35, 0x1, 0xD, 0x1D, 0x83, 0x1D, 0x6, 0x18, 0x91, 0xFD, 0xC6, 0x2, 0x3A, 0x91, 0x0, 0x1, 0x0, 0x50, 0x2, 0x93, 0x1, 0xD, 0x4, 0xEC, 0x0, 0x5, 0x0, 0x0, 0x1, 0x15, 0x3, 0x23, 0x3, 0x35, 0x1, 0xD, 0x1D, 0x83, 0x1D, 0x4, 0xEC, 0x91, 0xFE, 0x38, 0x1, 0xC8, 0x91, 0x0, 0x1, 0x0, 0x8E, 0x0, 0x0, 0x4, 0xF1, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x4, 0xF1, 0xFC, 0xFC, 0x99, 0xFC, 0x2, 0x6B, 0xFC, 0x2, 0x3B, 0x3, 0x75, 0xFD, 0x56, 0x2, 0xAA, 0x0, 0x2, 0x0, 0x28, 0xFF, 0xEC, 0x3, 0xAB, 0x6, 0x0, 0x0, 0x9, 0x0, 0x25, 0x0, 0x0, 0x1, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x33, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x1, 0xD8, 0x34, 0x38, 0x29, 0x38, 0x6B, 0x2, 0x35, 0x4A, 0x63, 0x7F, 0xA7, 0x7D, 0x8A, 0xA9, 0xAD, 0x9A, 0x39, 0x30, 0xF3, 0xE0, 0xE0, 0x45, 0x39, 0x30, 0x32, 0x2, 0xE3, 0x4D, 0x30, 0x3F, 0x32, 0x2C, 0x5E, 0xFD, 0x21, 0x18, 0x89, 0xA7, 0x1, 0x13, 0x8E, 0x80, 0x78, 0x99, 0xA, 0x1, 0xBC, 0xFC, 0xE3, 0xB4, 0xFE, 0xFB, 0x49, 0x2B, 0xA, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x99, 0x5, 0xDB, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x4, 0x8B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0x99, 0x4, 0xBE, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x3, 0x6E, 0x0, 0x0, 0x0, 0x1, 0x0, 0x14, 0xFF, 0xEC, 0x5, 0x60, 0x5, 0xC4, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x6, 0x0, 0x21, 0x20, 0x0, 0x3, 0x23, 0x35, 0x33, 0x12, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x33, 0x15, 0x23, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x5, 0x5F, 0x13, 0xFE, 0xE5, 0xFE, 0xF4, 0xFE, 0xF8, 0xFE, 0xC3, 0x6, 0xC6, 0xC6, 0x9, 0x1, 0x42, 0x1, 0xC, 0x1, 0x5, 0x1, 0x14, 0x16, 0xFC, 0x10, 0x86, 0x9D, 0xA7, 0xAB, 0x6, 0xD9, 0xD9, 0x4, 0x9C, 0xAC, 0xA3, 0x89, 0x12, 0x1, 0xDA, 0xD4, 0xFE, 0xE6, 0x1, 0x69, 0x1, 0x32, 0xAB, 0x1, 0x2D, 0x1, 0x65, 0xFE, 0xE5, 0xDA, 0x8C, 0x9D, 0xEE, 0xD8, 0xAB, 0xD1, 0xFE, 0x97, 0x8B, 0x0, 0x1, 0x0, 0x14, 0xFF, 0xEC, 0x4, 0x72, 0x4, 0x4E, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x6, 0x4, 0x23, 0x22, 0x2, 0x27, 0x23, 0x35, 0x33, 0x36, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x33, 0x15, 0x23, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x4, 0x72, 0x5, 0xFF, 0x0, 0xB4, 0xEA, 0xF2, 0xF, 0xBA, 0xBC, 0x13, 0xF2, 0xE3, 0xC5, 0xF0, 0x5, 0xE5, 0x5, 0x70, 0x63, 0x7E, 0x6A, 0xA, 0xEF, 0xF1, 0x8, 0x68, 0x85, 0x59, 0x79, 0x5, 0x1, 0x66, 0x9D, 0xDD, 0x1, 0x1A, 0xCA, 0xAB, 0xC4, 0x1, 0xF, 0xE4, 0xB3, 0x57, 0x7D, 0xA4, 0x6C, 0xAB, 0x73, 0xAE, 0x68, 0x4F, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x52, 0x3, 0xF5, 0x4, 0x4E, 0x0, 0x27, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x33, 0x11, 0x14, 0x6, 0x2, 0xB8, 0x3C, 0x33, 0x1D, 0x23, 0x44, 0x60, 0x6D, 0x84, 0xFA, 0xF2, 0xF3, 0xF9, 0xC5, 0xF0, 0x4, 0xE4, 0x5, 0x70, 0x63, 0x94, 0x63, 0x62, 0x96, 0x58, 0x7A, 0x5, 0xE4, 0xB6, 0xFE, 0x52, 0xF, 0xA3, 0x7, 0x3F, 0x56, 0x99, 0x3F, 0x1, 0x40, 0xDF, 0x24, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x83, 0xD9, 0x68, 0x4F, 0xFE, 0x2C, 0x9B, 0xA5, 0x0, 0x1, 0x0, 0x7A, 0xFE, 0x4B, 0x4, 0xB2, 0x6, 0x0, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x35, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x33, 0x11, 0x14, 0x6, 0x3, 0x5F, 0x40, 0x36, 0x23, 0x21, 0x90, 0x2, 0xB9, 0x62, 0x5D, 0x93, 0x48, 0xF2, 0xF2, 0x76, 0xB7, 0x9F, 0xC0, 0x1, 0xB9, 0xC1, 0xFE, 0x4B, 0x10, 0xB0, 0x8, 0x99, 0x64, 0x2, 0xBB, 0x71, 0x5C, 0x83, 0xFC, 0xFB, 0x6, 0x0, 0xFD, 0xC3, 0x8B, 0xB6, 0xDA, 0xFE, 0xD, 0xFE, 0xD5, 0xA5, 0xB0, 0x0, 0x3, 0x0, 0x28, 0x0, 0x0, 0x5, 0xB9, 0x5, 0xB0, 0x0, 0x7, 0x0, 0xF, 0x0, 0x2B, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x27, 0x1, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x34, 0x36, 0x33, 0x11, 0x21, 0x32, 0x4, 0x15, 0x14, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x4, 0x23, 0x2, 0xA8, 0xF8, 0x76, 0x85, 0xF2, 0xFE, 0xFF, 0x1, 0x19, 0x7D, 0x7F, 0xE7, 0xFD, 0xD5, 0xD, 0x67, 0x44, 0x10, 0xBF, 0x1C, 0xD9, 0xAA, 0x1, 0xF2, 0xEE, 0x1, 0xC, 0x6C, 0x67, 0x7D, 0x78, 0xFE, 0xF4, 0xEC, 0x4, 0xE5, 0xFE, 0x67, 0x6B, 0x61, 0xC8, 0x5, 0xFD, 0xAC, 0xFE, 0x39, 0x7C, 0x64, 0xE2, 0x5, 0xFD, 0x6F, 0x2, 0x92, 0x70, 0x5D, 0x4D, 0x4B, 0x4A, 0x7A, 0xBF, 0x9C, 0x2, 0x64, 0xBE, 0xCC, 0x63, 0xA1, 0x2B, 0x21, 0xBB, 0x72, 0xD0, 0xD9, 0x0, 0x2, 0x0, 0x42, 0xFF, 0x7F, 0x5, 0x54, 0x6, 0x0, 0x0, 0xA, 0x0, 0x27, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x5, 0x14, 0x17, 0x23, 0x26, 0x26, 0x35, 0x34, 0x12, 0x37, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x23, 0x22, 0x27, 0x7, 0x23, 0x11, 0x6, 0x6, 0x3, 0x71, 0x87, 0x69, 0x66, 0x8C, 0x7C, 0x62, 0x44, 0xFE, 0x3B, 0x1F, 0xC9, 0xC, 0x18, 0xD6, 0x86, 0xF3, 0x7B, 0xA1, 0xD1, 0xD6, 0xD7, 0xCE, 0xBD, 0x6C, 0xC, 0xDC, 0x55, 0x39, 0xB3, 0xCA, 0xAA, 0x8F, 0xD2, 0x50, 0xFE, 0x8, 0x8D, 0x44, 0x6B, 0x85, 0x1F, 0x90, 0x4A, 0xFA, 0x1, 0x69, 0x7A, 0x2, 0xAB, 0xFE, 0x0, 0x4E, 0xFE, 0xCD, 0xF4, 0x15, 0xEF, 0xFE, 0xC9, 0x89, 0x75, 0x2, 0x50, 0x76, 0xF6, 0x0, 0x1, 0x0, 0x1B, 0xFE, 0x4B, 0x4, 0xE5, 0x5, 0xB0, 0x0, 0x16, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x6, 0xF2, 0x46, 0x3A, 0x23, 0x21, 0x91, 0x1, 0xFE, 0xD3, 0x1, 0x2D, 0x3, 0x9D, 0xFD, 0x60, 0x2, 0x49, 0xFD, 0xB7, 0xC1, 0xFE, 0x4B, 0x10, 0xB0, 0x8, 0x9B, 0x2, 0xCB, 0xCA, 0x2, 0x7D, 0xCB, 0xFE, 0x4E, 0xCA, 0xFD, 0x37, 0xAD, 0xA8, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x2, 0xD7, 0x6, 0x15, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x2, 0xA1, 0xDB, 0xF4, 0xA5, 0xA5, 0xA5, 0xA5, 0xCC, 0xB0, 0x43, 0x46, 0x6, 0x2A, 0x34, 0xAB, 0x2, 0xDB, 0xDB, 0xDB, 0x2, 0x0, 0xFE, 0x0, 0x2, 0x0, 0xB4, 0xD3, 0xB3, 0x67, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xA8, 0x6B, 0xB3, 0xD3, 0x0, 0x2, 0x0, 0x58, 0xFF, 0xEB, 0x4, 0xFC, 0x5, 0xC3, 0x0, 0x19, 0x0, 0x2E, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x24, 0x35, 0x34, 0x37, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x17, 0x35, 0x33, 0x11, 0x16, 0x33, 0x37, 0x17, 0x6, 0x25, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x4, 0x15, 0x14, 0x16, 0x4, 0x79, 0x80, 0x3B, 0x78, 0xC8, 0xF0, 0xFE, 0xCA, 0xFC, 0x6B, 0x7A, 0x1, 0x1F, 0xF0, 0x96, 0x70, 0xFC, 0x3, 0x46, 0x1B, 0x18, 0x38, 0xFD, 0xBA, 0x7F, 0x87, 0x98, 0x6E, 0x8E, 0x85, 0x79, 0x8A, 0x44, 0x52, 0xFE, 0xF5, 0x9B, 0x15, 0x62, 0x62, 0xDF, 0xCD, 0xFE, 0x56, 0x31, 0xA6, 0x62, 0xCE, 0xD1, 0x42, 0x2F, 0xFB, 0x84, 0x7B, 0x4, 0xB3, 0x1F, 0xC7, 0x84, 0x5E, 0x2, 0x9A, 0x5C, 0x6E, 0x7C, 0x59, 0x5E, 0x7C, 0xC7, 0x6, 0xE5, 0x61, 0x84, 0x0, 0x2, 0x0, 0x53, 0xFF, 0xEB, 0x4, 0x39, 0x4, 0x4D, 0x0, 0x19, 0x0, 0x2D, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x35, 0x33, 0x11, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x25, 0x32, 0x36, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x33, 0x15, 0x23, 0x6, 0x15, 0x14, 0x16, 0x3, 0xBA, 0x73, 0x3C, 0x5F, 0xA4, 0xBF, 0xF6, 0xB9, 0xA6, 0xDD, 0xAC, 0x7B, 0x60, 0xF3, 0x3, 0x46, 0x14, 0x6, 0x19, 0x33, 0xFE, 0x2, 0x59, 0x61, 0x8, 0x74, 0x5C, 0x58, 0x49, 0x9F, 0x35, 0x30, 0xB7, 0x5E, 0x15, 0x50, 0x4F, 0xAC, 0x9A, 0xBA, 0x41, 0x4C, 0x99, 0x9A, 0xA1, 0x2E, 0x1B, 0xFC, 0xFA, 0x7B, 0x5, 0xB4, 0x1F, 0xBB, 0x4F, 0x36, 0x1, 0xDC, 0x3E, 0x4D, 0x57, 0x34, 0x83, 0x3, 0xB0, 0x2, 0x92, 0x3A, 0x5D, 0x0, 0x2, 0x0, 0x58, 0xFF, 0xEC, 0x4, 0xDA, 0x5, 0xC4, 0x0, 0x11, 0x0, 0x26, 0x0, 0x0, 0x5, 0x22, 0x24, 0x35, 0x34, 0x37, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x25, 0x32, 0x12, 0x35, 0x35, 0x34, 0x2, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x33, 0x15, 0x23, 0x4, 0x15, 0x14, 0x16, 0x2, 0x77, 0xEE, 0xFE, 0xCF, 0xF9, 0x6A, 0x79, 0x1, 0x1E, 0xF1, 0x1, 0xD, 0x1, 0x50, 0xFE, 0xB0, 0xFE, 0xEA, 0xAD, 0xBB, 0xBC, 0xA7, 0x8E, 0x80, 0x78, 0x8A, 0x3A, 0x47, 0xFE, 0xF5, 0x96, 0x14, 0xDF, 0xCD, 0xFC, 0x57, 0x30, 0xA5, 0x64, 0xCC, 0xD4, 0xFE, 0x84, 0xFE, 0xB4, 0x49, 0xFE, 0xB4, 0xFE, 0x85, 0xCB, 0x1, 0x7, 0xF5, 0x4B, 0xF5, 0x1, 0x5, 0x7F, 0x57, 0x61, 0x78, 0xC6, 0x6, 0xE5, 0x61, 0x80, 0x0, 0x2, 0x0, 0x4F, 0xFF, 0xEC, 0x3, 0xEF, 0x4, 0x4E, 0x0, 0x13, 0x0, 0x24, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x33, 0x15, 0x23, 0x6, 0x15, 0x14, 0x16, 0x17, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x1, 0xF9, 0x87, 0x7D, 0x7D, 0x89, 0x52, 0x50, 0x9F, 0x35, 0x30, 0xB7, 0x59, 0x5E, 0xBE, 0xEC, 0xB9, 0xA6, 0xE1, 0xB4, 0xEF, 0x1, 0x9, 0xFE, 0xF7, 0xAF, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0x50, 0x34, 0x83, 0x3, 0xB0, 0x2, 0x8E, 0x3D, 0x55, 0xC3, 0xAC, 0x9A, 0xBA, 0x41, 0x4C, 0x99, 0x9A, 0xA2, 0xFE, 0xC5, 0xEC, 0x15, 0xEB, 0xFE, 0xC5, 0x0, 0x1, 0x0, 0x44, 0xFF, 0xEC, 0x4, 0x86, 0x5, 0xB0, 0x0, 0x1B, 0x0, 0x0, 0x5, 0x22, 0x24, 0x35, 0x34, 0x36, 0x37, 0x1, 0x35, 0x21, 0x1, 0x33, 0x17, 0x23, 0x6, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x2, 0x2, 0x8C, 0xFA, 0xFE, 0xEF, 0x8E, 0x7E, 0xFE, 0xB7, 0x1, 0xE, 0x1, 0x28, 0x6C, 0x2, 0x61, 0x84, 0x86, 0x81, 0x8E, 0x90, 0x6E, 0xFC, 0xFB, 0x14, 0xEE, 0xD6, 0x8F, 0xC7, 0x34, 0x2, 0x69, 0xD, 0xFD, 0xC2, 0xCC, 0x1, 0x87, 0x65, 0x6F, 0x8E, 0xB3, 0x8B, 0x3, 0xB6, 0xFC, 0x4A, 0xEB, 0xFE, 0xDD, 0x0, 0x1, 0x0, 0x27, 0xFF, 0xEC, 0x3, 0xE0, 0x4, 0x3A, 0x0, 0x19, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x34, 0x37, 0x1, 0x33, 0x13, 0x33, 0x15, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x6, 0x2, 0xD, 0xCE, 0xE8, 0xD0, 0xFF, 0x0, 0xFD, 0xEB, 0x68, 0x77, 0x5E, 0x57, 0x5C, 0x61, 0x77, 0x6F, 0xF2, 0xED, 0x14, 0xC5, 0x95, 0xD4, 0x57, 0x1, 0xC9, 0xFE, 0x5E, 0xB4, 0x61, 0x38, 0x39, 0x65, 0x8C, 0x5B, 0x2, 0xA6, 0xFD, 0x5A, 0xB6, 0xF2, 0x0, 0x1, 0x0, 0x14, 0xFF, 0xEC, 0x6, 0x5, 0x5, 0xC4, 0x0, 0x25, 0x0, 0x0, 0x25, 0x6, 0x6, 0x23, 0x22, 0x0, 0x3, 0x7, 0x35, 0x37, 0x35, 0x12, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x2, 0x7, 0x15, 0x25, 0x15, 0x5, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x5, 0x40, 0x2E, 0xF5, 0xF5, 0xF3, 0xFE, 0xB5, 0x26, 0xB0, 0xA6, 0x4, 0x1, 0x3E, 0x1, 0x16, 0x1, 0xB, 0x1, 0x9, 0x1A, 0xF8, 0x13, 0x89, 0x95, 0xB1, 0xAC, 0x1, 0x4, 0x4C, 0xFB, 0xB8, 0x12, 0xC3, 0x9F, 0x83, 0x76, 0x1B, 0xFE, 0xD4, 0x2, 0x27, 0xBE, 0x3D, 0x95, 0x1, 0x20, 0x1, 0xA, 0x28, 0x90, 0x26, 0x73, 0x1, 0x46, 0x1, 0x67, 0xFE, 0xFA, 0xCB, 0x71, 0x95, 0xFE, 0xFF, 0xEA, 0x30, 0xFC, 0x90, 0xFB, 0xC6, 0xD3, 0x3C, 0x1C, 0x80, 0xBF, 0x0, 0x3, 0x0, 0x14, 0xFE, 0x56, 0x5, 0x2D, 0x4, 0x4E, 0x0, 0x7, 0x0, 0xE, 0x0, 0x31, 0x0, 0x0, 0x1, 0x25, 0x35, 0x26, 0x23, 0x22, 0x6, 0x15, 0x13, 0x32, 0x37, 0x35, 0x5, 0x16, 0x16, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x6, 0x23, 0x22, 0x26, 0x27, 0x7, 0x35, 0x37, 0x26, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x37, 0x15, 0x7, 0x11, 0x14, 0x4, 0x1, 0xA3, 0x1, 0xD5, 0x43, 0x95, 0x84, 0x79, 0xFB, 0x95, 0x45, 0xFE, 0x3F, 0x19, 0x71, 0x3F, 0x59, 0xF3, 0x48, 0x73, 0x6F, 0xA4, 0x79, 0x8D, 0x6A, 0xAE, 0x95, 0xD0, 0x2D, 0xBA, 0xA0, 0x4, 0xE9, 0xC9, 0xBA, 0x69, 0xA, 0xDC, 0xC2, 0xC2, 0xFE, 0xEF, 0x2, 0x0, 0x7C, 0x90, 0x7C, 0xD0, 0x92, 0xFE, 0x8D, 0x7F, 0xB9, 0x77, 0x56, 0x6B, 0xFD, 0xA3, 0x51, 0x62, 0x91, 0x85, 0x85, 0x7F, 0x49, 0x76, 0xB5, 0x95, 0x31, 0x91, 0x2A, 0x28, 0x3E, 0xF7, 0x1, 0x31, 0x7F, 0x6B, 0xFE, 0x83, 0x33, 0x91, 0x33, 0xFD, 0xF2, 0xDB, 0xED, 0x0, 0x2, 0x0, 0x14, 0x0, 0x0, 0x5, 0x4B, 0x5, 0xB0, 0x0, 0x3, 0x0, 0x18, 0x0, 0x0, 0x1, 0x25, 0x27, 0x7, 0x1, 0x3, 0x5, 0x15, 0x23, 0x35, 0x7, 0x35, 0x37, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x13, 0x25, 0x15, 0x5, 0x1, 0x1, 0xC4, 0x1, 0x15, 0x6F, 0xA6, 0x2, 0x5B, 0xF2, 0xFE, 0x97, 0xFC, 0xB4, 0xB4, 0xFC, 0x8D, 0x1, 0xA9, 0x1, 0x33, 0xFD, 0xE3, 0xC2, 0x1, 0x66, 0xFE, 0xEF, 0x1, 0x24, 0x1, 0x8B, 0x4A, 0xA1, 0xB0, 0xFE, 0x3A, 0x1, 0x5D, 0x61, 0xFC, 0xB9, 0x30, 0x8F, 0x30, 0x4, 0x68, 0xFD, 0x54, 0xAE, 0x1, 0xFE, 0xFD, 0x7C, 0xFE, 0xEC, 0x5F, 0x8F, 0x49, 0xFE, 0x61, 0x0, 0x2, 0x0, 0x14, 0x0, 0x0, 0x4, 0x84, 0x6, 0x0, 0x0, 0x3, 0x0, 0x18, 0x0, 0x0, 0x1, 0x37, 0x27, 0x7, 0x1, 0x27, 0x5, 0x15, 0x23, 0x35, 0x7, 0x35, 0x37, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x17, 0x25, 0x15, 0x7, 0x13, 0x1, 0xBD, 0xAC, 0x3F, 0x6D, 0x1, 0xAD, 0xAD, 0xFF, 0x0, 0xF3, 0xB6, 0xB6, 0xF3, 0x4D, 0x1, 0x2A, 0x1, 0x25, 0xFE, 0x6D, 0x8B, 0x1, 0x27, 0xD1, 0xDD, 0x1, 0x48, 0x2D, 0x5D, 0x70, 0xFE, 0x9E, 0xFB, 0x44, 0xB7, 0x76, 0x30, 0x91, 0x30, 0x4, 0xF9, 0xFC, 0x8A, 0x60, 0x1, 0x50, 0xFE, 0x3E, 0xC5, 0x4E, 0x90, 0x38, 0xFE, 0xC7, 0x0, 0x3, 0x0, 0x14, 0x0, 0x0, 0x6, 0xD, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x5, 0x0, 0x19, 0x0, 0x0, 0x1, 0x11, 0x37, 0x1, 0x11, 0x7, 0x13, 0x1, 0x5, 0x11, 0x23, 0x11, 0x7, 0x35, 0x37, 0x11, 0x33, 0x1, 0x37, 0x11, 0x33, 0x11, 0x37, 0x15, 0x7, 0x11, 0x1, 0xC6, 0xC4, 0x1, 0xC7, 0x96, 0x94, 0xFE, 0x89, 0xFE, 0xEE, 0xFD, 0xB5, 0xB5, 0xFD, 0x1, 0xA8, 0xE3, 0xFB, 0xC1, 0xC1, 0x4, 0x9, 0xFE, 0x93, 0x35, 0xFE, 0xD3, 0x1, 0x16, 0x28, 0xFD, 0x6E, 0x2, 0x55, 0x49, 0xFD, 0xF4, 0x1, 0xC8, 0x30, 0x90, 0x30, 0x3, 0x58, 0xFD, 0x5D, 0x3D, 0x2, 0x66, 0xFD, 0xDD, 0x34, 0x90, 0x34, 0xFD, 0x3, 0x0, 0x2, 0x0, 0x14, 0x0, 0x0, 0x5, 0x2D, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x22, 0x7, 0x15, 0x25, 0x35, 0x34, 0x26, 0x13, 0x11, 0x5, 0x11, 0x23, 0x11, 0x7, 0x35, 0x37, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x37, 0x15, 0x7, 0x11, 0x2, 0xA5, 0x91, 0x49, 0x1, 0x99, 0x61, 0x61, 0xFE, 0x67, 0xF3, 0xC4, 0xC4, 0xE5, 0x8, 0x77, 0xC3, 0x9A, 0xBC, 0x2, 0xD6, 0xD6, 0x3, 0x88, 0x84, 0xED, 0x6D, 0x3A, 0x70, 0x5A, 0xFC, 0x78, 0x1, 0xF6, 0x6C, 0xFE, 0x76, 0x1, 0x49, 0x34, 0x8E, 0x34, 0x2, 0x63, 0x7D, 0x91, 0xB2, 0xD8, 0x39, 0x8D, 0x39, 0xFD, 0xC9, 0x0, 0x3, 0x0, 0x14, 0x0, 0x0, 0x5, 0x73, 0x5, 0xB0, 0x0, 0x4, 0x0, 0xA, 0x0, 0x20, 0x0, 0x0, 0x1, 0x15, 0x25, 0x26, 0x27, 0x5, 0x5, 0x15, 0x21, 0x32, 0x36, 0x13, 0x1, 0x21, 0x11, 0x23, 0x11, 0x7, 0x35, 0x37, 0x11, 0x21, 0x20, 0x17, 0x37, 0x15, 0x7, 0x17, 0x14, 0x6, 0x7, 0x1, 0x15, 0x1, 0xC8, 0x1, 0xF8, 0x3D, 0xB2, 0x1, 0xB, 0xFD, 0xEC, 0x1, 0x3, 0x89, 0x88, 0x2A, 0xFE, 0xDC, 0xFE, 0xE6, 0xFD, 0xB7, 0xB7, 0x2, 0x0, 0x1, 0x84, 0x68, 0xBC, 0x9D, 0x2, 0x8E, 0x7D, 0x1, 0x47, 0x4, 0xE5, 0xFC, 0x86, 0x74, 0x2, 0xFA, 0x8E, 0x61, 0x88, 0xFC, 0x7C, 0x2, 0x31, 0xFD, 0xCF, 0x3, 0x19, 0x31, 0x8C, 0x31, 0x2, 0xB, 0xFE, 0x32, 0x8C, 0x2A, 0x35, 0x92, 0xC6, 0x34, 0xFD, 0xA0, 0xD, 0x0, 0x1, 0x0, 0x15, 0x0, 0x0, 0x3, 0x13, 0x4, 0x4E, 0x0, 0x15, 0x0, 0x0, 0x1, 0x5, 0x11, 0x23, 0x11, 0x7, 0x35, 0x37, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x25, 0x3, 0x7, 0xFE, 0xC7, 0xF3, 0xC6, 0xC6, 0xE8, 0x7, 0x57, 0x9C, 0x31, 0x25, 0x1, 0x33, 0x30, 0xA7, 0x3A, 0x1, 0x39, 0x1, 0xDE, 0x53, 0xFE, 0x75, 0x1, 0x4A, 0x35, 0x8C, 0x35, 0x2, 0x64, 0x79, 0x8D, 0xD, 0xE5, 0x8, 0x7F, 0xCE, 0x53, 0x0, 0x1, 0x0, 0x14, 0xFF, 0xEC, 0x5, 0x7F, 0x5, 0xC4, 0x0, 0x2D, 0x0, 0x0, 0x5, 0x22, 0x24, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x27, 0x5, 0x35, 0x25, 0x26, 0x26, 0x35, 0x34, 0x24, 0x33, 0x32, 0x0, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x17, 0x25, 0x15, 0x5, 0x4, 0x15, 0x14, 0x4, 0x2, 0xE0, 0x8B, 0xFE, 0xFA, 0xA8, 0xFC, 0xB8, 0x85, 0x84, 0x85, 0x7A, 0xC0, 0x48, 0xFD, 0xAD, 0x1, 0x91, 0x61, 0x70, 0x1, 0x1D, 0xE7, 0xF7, 0x1, 0x16, 0xFC, 0x86, 0x8E, 0x85, 0x7F, 0x99, 0x9C, 0x5, 0x2, 0x74, 0xFE, 0x63, 0x1, 0x4, 0xFE, 0xE7, 0x14, 0x66, 0xCD, 0x99, 0x8A, 0x7A, 0x6C, 0x58, 0x5A, 0x6A, 0x3A, 0x18, 0xA0, 0x8C, 0x6C, 0x3A, 0xA0, 0x71, 0xB0, 0xE3, 0xFE, 0xF9, 0xB6, 0x6B, 0x89, 0x73, 0x56, 0x52, 0x6C, 0x2D, 0x1, 0xA8, 0x8C, 0x6F, 0x82, 0xF7, 0xB8, 0xD6, 0x0, 0x1, 0x0, 0x14, 0xFF, 0xEC, 0x4, 0xBF, 0x4, 0x4E, 0x0, 0x2A, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x27, 0x5, 0x35, 0x25, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x25, 0x15, 0x5, 0x16, 0x15, 0x14, 0x6, 0x2, 0x6D, 0xDE, 0xEA, 0xEB, 0x5, 0x8B, 0x50, 0x60, 0x64, 0x55, 0x96, 0x24, 0xFD, 0xEF, 0x1, 0x3D, 0x89, 0xE1, 0xC1, 0xCB, 0xE6, 0xF2, 0x60, 0x5F, 0x5C, 0x58, 0x55, 0x9B, 0x2, 0x19, 0xFE, 0xCA, 0x9A, 0xEE, 0x14, 0xE4, 0x86, 0x64, 0x50, 0x4A, 0x3A, 0x35, 0x4D, 0x1F, 0x8, 0x8C, 0x8A, 0x54, 0x54, 0x91, 0x85, 0xC3, 0xC6, 0x92, 0x3F, 0x63, 0x52, 0x36, 0x33, 0x40, 0x22, 0x8E, 0x8A, 0x52, 0x55, 0xA4, 0x90, 0xB8, 0x0, 0x1, 0x0, 0x1B, 0x0, 0x0, 0x5, 0xF4, 0x5, 0xB0, 0x0, 0x17, 0x0, 0x0, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x34, 0x36, 0x37, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x4, 0xF8, 0xFD, 0x75, 0xFC, 0x17, 0x55, 0x40, 0x7, 0xA2, 0xF, 0x94, 0xA7, 0x1, 0x17, 0x2, 0x8B, 0xFC, 0x2, 0x88, 0xFD, 0x78, 0x4, 0xF4, 0x5C, 0x41, 0x1B, 0x25, 0x33, 0x4F, 0x79, 0x9D, 0x1, 0xFD, 0xA2, 0x2, 0x5E, 0xFA, 0x50, 0xFF, 0xFF, 0x0, 0x49, 0xFF, 0xEC, 0x4, 0x7F, 0x5, 0xC4, 0x0, 0x6, 0x2, 0x71, 0x0, 0x0, 0x0, 0x2, 0x0, 0x66, 0xFE, 0x4C, 0x4, 0xF6, 0x5, 0xC4, 0x0, 0xC, 0x0, 0x26, 0x0, 0x0, 0x25, 0x32, 0x36, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x12, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x20, 0x37, 0x35, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x32, 0x17, 0x37, 0x33, 0x11, 0x14, 0x4, 0x2, 0xB1, 0x68, 0xAB, 0x36, 0x6F, 0xCE, 0xAB, 0xAC, 0x1, 0x9B, 0xC9, 0x81, 0xF6, 0x5E, 0x79, 0xA4, 0xB6, 0x1, 0x2D, 0x6, 0x88, 0xC1, 0xFE, 0xF3, 0xFE, 0xC2, 0x1, 0x44, 0x1, 0x13, 0xC8, 0x8D, 0xC, 0xD8, 0xFE, 0xDC, 0xB8, 0x4C, 0x39, 0x3, 0x4A, 0x71, 0xFA, 0xE4, 0x7D, 0xDA, 0xFE, 0xF5, 0xFD, 0x94, 0x55, 0x62, 0x98, 0x86, 0xFA, 0x3A, 0x5D, 0x1, 0x76, 0x1, 0x3B, 0x76, 0x1, 0x3A, 0x1, 0x77, 0x68, 0x54, 0xFA, 0x6E, 0xDD, 0xF5, 0x0, 0x2, 0x0, 0x28, 0x0, 0x0, 0x5, 0x65, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x35, 0x34, 0x23, 0x22, 0x6, 0x15, 0x14, 0x33, 0x13, 0x11, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x21, 0x15, 0x1, 0xD3, 0x67, 0x26, 0x3A, 0x68, 0x5F, 0x78, 0x8A, 0xA9, 0xAD, 0x9A, 0x36, 0x2E, 0xFD, 0xEE, 0xEE, 0x2, 0x95, 0x2, 0xE7, 0x49, 0x6C, 0x2F, 0x2C, 0x5A, 0xFD, 0x19, 0x2, 0x2B, 0x92, 0x80, 0x78, 0x99, 0x9, 0x1, 0x6B, 0xFD, 0x37, 0xBC, 0xFE, 0x9F, 0xCA, 0x0, 0x1, 0xFF, 0xF3, 0x0, 0x0, 0x4, 0x77, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x0, 0x21, 0x21, 0x1, 0x1, 0x21, 0x1, 0x37, 0x11, 0x33, 0x11, 0x23, 0x11, 0x7, 0x1, 0x44, 0xFE, 0xCE, 0x2, 0x1C, 0xFD, 0xC5, 0x1, 0x2C, 0x1, 0xB5, 0xA6, 0xFD, 0xFD, 0x8C, 0x2, 0x84, 0x3, 0x2C, 0xFD, 0x8A, 0xAF, 0x1, 0xC7, 0xFA, 0x50, 0x2, 0xAA, 0xAC, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x4, 0xB0, 0xFB, 0x7D, 0x1, 0xC2, 0xFC, 0x1, 0xC5, 0xCB, 0x4, 0xE5, 0xFB, 0x1B, 0x0, 0x1, 0x0, 0x3C, 0x2, 0x5F, 0x5, 0xEC, 0x3, 0x51, 0x0, 0x3, 0x0, 0x0, 0x13, 0x21, 0x15, 0x21, 0x3C, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x51, 0xF2, 0x0, 0x2, 0x0, 0x35, 0x2, 0x8C, 0x4, 0xC4, 0x6, 0xC1, 0x0, 0x3, 0x0, 0x17, 0x0, 0x0, 0x1, 0x35, 0x21, 0x15, 0x1, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x3, 0x75, 0xFE, 0xF, 0x1, 0xF1, 0xFE, 0xF, 0xC4, 0x8B, 0x8B, 0xC4, 0x1, 0xF1, 0xC4, 0x8B, 0x8B, 0x4, 0xFB, 0x68, 0x68, 0xFD, 0x91, 0x1, 0xC9, 0xFE, 0x37, 0x2, 0xD7, 0xA7, 0xB7, 0xB7, 0xB7, 0xB7, 0xA7, 0xFD, 0x29, 0xFF, 0xFF, 0x0, 0x3C, 0x2, 0x7C, 0x5, 0x47, 0x5, 0xBC, 0x0, 0x26, 0x3, 0x81, 0x0, 0x0, 0x0, 0x7, 0x3, 0x78, 0x2, 0x31, 0x0, 0x0, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x6, 0x16, 0x4, 0x3A, 0x0, 0xF, 0x0, 0x0, 0x25, 0x23, 0x15, 0x21, 0x35, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x6, 0x16, 0xB4, 0xFB, 0xAB, 0x90, 0xF3, 0x1, 0x5F, 0xF4, 0x1, 0x5F, 0xF4, 0x1, 0x1, 0x1, 0x4, 0x39, 0xFC, 0x88, 0x3, 0x78, 0xFC, 0x88, 0x3, 0x78, 0x0, 0x1, 0x0, 0x34, 0x0, 0x0, 0x3, 0xD1, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x2, 0xD4, 0xFD, 0xB6, 0x2, 0x4A, 0xFD, 0x60, 0x3, 0x9D, 0x2, 0x69, 0xCA, 0x1, 0xB2, 0xCB, 0xFA, 0x50, 0x0, 0x2, 0x0, 0x4A, 0x0, 0x0, 0x4, 0x89, 0x5, 0xB0, 0x0, 0xA, 0x0, 0x13, 0x0, 0x0, 0x21, 0x23, 0x11, 0x21, 0x26, 0x24, 0x35, 0x34, 0x0, 0x33, 0x21, 0x3, 0x11, 0x21, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x4, 0x89, 0xFC, 0xFE, 0xCA, 0xFA, 0xFE, 0xED, 0x1, 0x15, 0xFD, 0x2, 0x2D, 0xFC, 0xFE, 0xCF, 0x93, 0x81, 0x81, 0x93, 0x2, 0x1D, 0x1, 0xF1, 0xD2, 0xC9, 0x1, 0x6, 0xFD, 0x38, 0x1, 0xFD, 0xA0, 0x66, 0x6D, 0x8A, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x6, 0x6B, 0x5, 0xB0, 0x0, 0xE, 0x0, 0x0, 0x33, 0x11, 0x33, 0x11, 0x3, 0x1, 0x33, 0x1, 0x3, 0x11, 0x33, 0x11, 0x21, 0x1, 0x1, 0x95, 0xFC, 0x19, 0x1, 0xAD, 0xB5, 0x1, 0xAD, 0x18, 0xFC, 0xFE, 0xB8, 0xFE, 0x5D, 0xFE, 0x5C, 0x5, 0xB0, 0xFE, 0x20, 0xFD, 0x7F, 0x4, 0x61, 0xFB, 0xA0, 0x2, 0x80, 0x1, 0xE0, 0xFA, 0x50, 0x4, 0x5C, 0xFB, 0xA4, 0x0, 0x1, 0x0, 0xA4, 0x0, 0x0, 0x1, 0xA0, 0x6, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0xA0, 0xFC, 0x6, 0x0, 0xFA, 0x0, 0x6, 0x0, 0x0, 0x1, 0x0, 0x75, 0x0, 0x0, 0x9, 0x11, 0x5, 0xB0, 0x0, 0x13, 0x0, 0x0, 0x21, 0x1, 0x3, 0x23, 0x13, 0x33, 0x1, 0x13, 0x33, 0x1, 0x13, 0x33, 0x3, 0x23, 0x35, 0x7, 0x1, 0x3, 0x23, 0x35, 0x4, 0x1, 0xFD, 0xD6, 0x66, 0xFC, 0x8C, 0xFC, 0x2, 0x2C, 0x66, 0xF8, 0x2, 0x2C, 0x66, 0xF8, 0x8C, 0xF8, 0x2, 0xFD, 0xD6, 0x66, 0xF8, 0x4, 0x27, 0xFB, 0xD9, 0x5, 0xB0, 0xFB, 0xD9, 0x4, 0x27, 0xFB, 0xD9, 0x4, 0x27, 0xFA, 0x50, 0x2, 0x2, 0x4, 0x25, 0xFB, 0xDB, 0x2, 0x0, 0x1, 0x0, 0x18, 0x1, 0xE3, 0x4, 0x49, 0x3, 0x4A, 0x0, 0xC, 0x0, 0x0, 0x1, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x24, 0x20, 0x4, 0x4, 0x49, 0xB3, 0x24, 0x9D, 0xA4, 0xAE, 0x91, 0x26, 0xB4, 0x38, 0x1, 0x4, 0x1, 0xBA, 0x1, 0x4, 0x1, 0xE3, 0x3C, 0x8D, 0x8D, 0x3C, 0x89, 0xDE, 0xDE, 0x0, 0x3, 0x0, 0x1B, 0xFF, 0xEB, 0x5, 0x2E, 0x4, 0x4E, 0x0, 0x6, 0x0, 0xD, 0x0, 0x29, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x26, 0x3, 0x32, 0x37, 0x35, 0x21, 0x16, 0x16, 0x5, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x2, 0x27, 0x23, 0x35, 0x33, 0x36, 0x12, 0x20, 0x17, 0x37, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x33, 0x32, 0x37, 0x2, 0xA9, 0x6B, 0x6F, 0x11, 0x1, 0xBB, 0x45, 0x8D, 0x8D, 0x45, 0xFE, 0x3F, 0x6, 0x6F, 0x2, 0xBB, 0x33, 0x4C, 0xA3, 0x34, 0x68, 0xC0, 0xC3, 0xD9, 0x9, 0xAA, 0xAF, 0x17, 0xD5, 0x1, 0x6C, 0x66, 0x13, 0xD1, 0xC2, 0xC2, 0x49, 0xE, 0xC, 0x3, 0x8B, 0x99, 0x73, 0x80, 0x8C, 0xFD, 0x23, 0x89, 0x9D, 0x7E, 0xA8, 0xA4, 0x1F, 0xA3, 0xA3, 0x1, 0x11, 0xD8, 0xAB, 0xCF, 0x1, 0x0, 0x97, 0x83, 0xFE, 0x45, 0xAB, 0x90, 0x8B, 0x4, 0x0, 0x3, 0x0, 0x5B, 0xFF, 0xEC, 0x6, 0x8E, 0x4, 0x4E, 0x0, 0x28, 0x0, 0x31, 0x0, 0x39, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, 0x21, 0x15, 0x14, 0x2, 0x24, 0x36, 0x37, 0x35, 0x23, 0x6, 0x15, 0x14, 0x16, 0x21, 0x32, 0x36, 0x35, 0x35, 0x21, 0x16, 0x16, 0x4, 0xBF, 0xE6, 0x89, 0x2D, 0xC6, 0x92, 0xA2, 0xCE, 0xFF, 0xE7, 0x9F, 0x5F, 0x5F, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0xE0, 0x6F, 0x89, 0xD3, 0xA2, 0xCB, 0x34, 0x83, 0x66, 0xA9, 0x76, 0x8F, 0xE, 0x2, 0xB7, 0xE3, 0xFC, 0xA2, 0x79, 0x1A, 0x96, 0xFD, 0x58, 0x3, 0x1A, 0x79, 0x65, 0xFE, 0x39, 0xC, 0x79, 0x14, 0xB8, 0x49, 0x6F, 0xBA, 0x8A, 0xA9, 0xA4, 0x1, 0x5E, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0x81, 0x81, 0x7F, 0x4D, 0x7D, 0x86, 0x99, 0x74, 0x7C, 0xEA, 0xFE, 0xD4, 0xC3, 0x50, 0x31, 0xA0, 0x5, 0x83, 0x41, 0x58, 0x98, 0x5E, 0x2B, 0x89, 0x98, 0x0, 0x2, 0x0, 0x7D, 0xFF, 0xEC, 0x3, 0x50, 0x4, 0x4E, 0x0, 0x7, 0x0, 0xA, 0x0, 0x0, 0x5, 0x25, 0x11, 0x25, 0x1, 0x1, 0x15, 0x5, 0x1, 0x11, 0x37, 0x2, 0xA7, 0xFD, 0xD6, 0x1, 0x97, 0x1, 0x3C, 0xFE, 0x1F, 0x1, 0x83, 0xFE, 0x7D, 0xA1, 0x14, 0x55, 0x3, 0x2C, 0xE1, 0xFE, 0x3A, 0xFE, 0xF1, 0x7E, 0x44, 0x2, 0xE2, 0xFE, 0xBD, 0x5E, 0x0, 0x2, 0x0, 0x1B, 0xFF, 0xEC, 0x4, 0xFD, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x22, 0x0, 0x0, 0x1, 0x22, 0x7, 0x21, 0x35, 0x26, 0x26, 0x1, 0x6, 0x6, 0x23, 0x22, 0x24, 0x27, 0x23, 0x35, 0x33, 0x35, 0x36, 0x0, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x2, 0x9E, 0xB6, 0x36, 0x1, 0xC0, 0x5, 0x60, 0x1, 0x44, 0x34, 0xCC, 0xA2, 0xC6, 0xFE, 0xFD, 0x2A, 0xA1, 0x8F, 0x4, 0x1, 0x1F, 0xD0, 0xE8, 0xDD, 0xFD, 0x3B, 0x3, 0x60, 0xFC, 0xBB, 0x1F, 0x86, 0x61, 0xA9, 0x66, 0x3, 0x8B, 0xC2, 0xC, 0x44, 0x72, 0xFD, 0x2D, 0x4C, 0x80, 0xD0, 0xA5, 0x99, 0x33, 0xFB, 0x1, 0x26, 0xFE, 0xFB, 0xCB, 0x4F, 0x35, 0x99, 0x50, 0x62, 0x86, 0x0, 0x2, 0x0, 0x2F, 0xFF, 0xEC, 0x5, 0x3C, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x26, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x26, 0x26, 0x1, 0x6, 0x6, 0x23, 0x22, 0x0, 0x27, 0x6, 0x6, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x24, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x3, 0x6D, 0x64, 0x7A, 0x12, 0x1, 0xCF, 0x5, 0x61, 0x1, 0x45, 0x34, 0xCC, 0xA2, 0xE6, 0xFE, 0xEE, 0xC, 0x57, 0x38, 0x10, 0xBC, 0x1B, 0xCA, 0x91, 0x1C, 0x1, 0xE, 0xBA, 0xEC, 0xE2, 0xFD, 0x3D, 0xA, 0x95, 0x80, 0xA9, 0x66, 0x3, 0x8B, 0x8C, 0x7C, 0x12, 0x5F, 0x97, 0xFD, 0x2D, 0x4C, 0x80, 0x1, 0x14, 0xD1, 0x5, 0x67, 0x58, 0x61, 0x37, 0x47, 0x7D, 0xB2, 0x95, 0x3, 0xD5, 0xF6, 0xFE, 0xD4, 0xEA, 0x67, 0x7D, 0xA5, 0x86, 0xFF, 0xFF, 0x0, 0x2D, 0x0, 0x0, 0x2, 0xD7, 0x6, 0x15, 0x0, 0x6, 0x0, 0x4B, 0x0, 0x0, 0x0, 0x3, 0x0, 0x50, 0xFE, 0x4B, 0x4, 0xDC, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x23, 0x0, 0x2A, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x13, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x35, 0x23, 0x22, 0x14, 0x2, 0x39, 0x92, 0x45, 0x46, 0x8F, 0x83, 0x76, 0x74, 0xF1, 0x99, 0xAE, 0x2F, 0x98, 0xA7, 0xE1, 0xCD, 0xB4, 0x6B, 0xD, 0xD9, 0xD9, 0xD9, 0x96, 0xC8, 0x6B, 0x61, 0x6B, 0xAF, 0x7C, 0x1, 0xEA, 0x76, 0xD2, 0x92, 0x15, 0x91, 0xD2, 0xFD, 0x9C, 0x99, 0x78, 0x5D, 0x41, 0x29, 0x1, 0x25, 0xCA, 0x15, 0xF7, 0x1, 0x30, 0x7E, 0x6A, 0xFC, 0x30, 0xB4, 0x13, 0x87, 0xD1, 0xAF, 0x77, 0x45, 0xBC, 0x0, 0x1, 0x0, 0x35, 0x0, 0x0, 0x3, 0x88, 0x6, 0x0, 0x0, 0x25, 0x0, 0x0, 0x1, 0x22, 0x27, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x15, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x27, 0x35, 0x32, 0x16, 0x15, 0x14, 0x6, 0x2, 0x99, 0x20, 0x1D, 0xF3, 0x1F, 0x2F, 0x4C, 0x27, 0x3C, 0x60, 0x9D, 0x80, 0x72, 0x23, 0x1F, 0xF3, 0x1E, 0x27, 0x4E, 0x32, 0x23, 0x68, 0x86, 0x81, 0x1, 0xC7, 0xA, 0xFE, 0x2F, 0x3, 0x5D, 0x3E, 0x79, 0x43, 0x5C, 0x9, 0xB7, 0xAC, 0xAD, 0x9C, 0xA7, 0xA, 0x1, 0xAB, 0xFC, 0xC5, 0x3B, 0x76, 0x46, 0x3F, 0x1, 0xC4, 0xB3, 0x9D, 0x87, 0xAC, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x3, 0x3D, 0x6, 0x0, 0x0, 0x2B, 0x0, 0x0, 0x1, 0x27, 0x11, 0x23, 0x11, 0x27, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x17, 0x35, 0x27, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x17, 0x11, 0x33, 0x11, 0x33, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x23, 0x27, 0x15, 0x33, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x2, 0x4C, 0x1C, 0xF3, 0x15, 0x28, 0x38, 0xA4, 0x89, 0x67, 0x29, 0x15, 0x28, 0x38, 0xA4, 0x89, 0x67, 0x29, 0xF3, 0x8, 0x29, 0x39, 0xA3, 0x8A, 0x67, 0x1C, 0x8, 0x29, 0x39, 0xA3, 0x8A, 0x1, 0xCB, 0x1, 0xFE, 0x34, 0x2, 0x26, 0x1, 0x3B, 0x2F, 0x8, 0x72, 0x9C, 0x4, 0x99, 0x1, 0x3B, 0x2F, 0x8, 0x72, 0x9C, 0x4, 0x1, 0xEF, 0xFD, 0xB9, 0x3B, 0x2F, 0xC, 0x73, 0x97, 0x1, 0x97, 0x3B, 0x2F, 0xC, 0x73, 0x97, 0x0, 0x3, 0x0, 0x35, 0x0, 0x0, 0x2, 0x6B, 0x6, 0x0, 0x0, 0x11, 0x0, 0x16, 0x0, 0x1A, 0x0, 0x0, 0x21, 0x23, 0x11, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x11, 0x33, 0x11, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x25, 0x14, 0x17, 0x35, 0x6, 0x4, 0x27, 0x15, 0x36, 0x1, 0xCC, 0xF3, 0x48, 0x5C, 0x5C, 0x48, 0xF3, 0x47, 0x58, 0x58, 0x47, 0xFE, 0xEE, 0x1F, 0x1F, 0x1, 0x2C, 0x1A, 0x1A, 0x1, 0xE0, 0x1E, 0x80, 0x57, 0x56, 0x82, 0x20, 0x2, 0x33, 0xFD, 0xCC, 0x1F, 0x82, 0x56, 0x57, 0x7F, 0x1E, 0xF4, 0x32, 0x28, 0xB7, 0x29, 0x2, 0x27, 0xB1, 0x26, 0x0, 0x2, 0x0, 0x7D, 0xFF, 0xEC, 0x7, 0x76, 0x4, 0x4E, 0x0, 0x2C, 0x0, 0x34, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x35, 0x23, 0x22, 0x15, 0x14, 0x5, 0x5D, 0x88, 0x9B, 0x9C, 0x75, 0x5F, 0x75, 0x5F, 0x5B, 0x72, 0x15, 0xF3, 0x68, 0x5A, 0x93, 0x3D, 0xF2, 0xE4, 0x7, 0x73, 0xC6, 0xDA, 0x50, 0x37, 0xAF, 0x76, 0xAB, 0xCA, 0x1, 0xD9, 0xD9, 0x8C, 0xB7, 0x50, 0x4A, 0x4D, 0x14, 0x98, 0x78, 0x80, 0x8F, 0xB3, 0x78, 0x52, 0x5C, 0x49, 0xFD, 0x1D, 0x2, 0xBC, 0x72, 0x5A, 0x78, 0xFC, 0xF0, 0x4, 0x3A, 0x71, 0x85, 0xA8, 0x4D, 0x5B, 0xB8, 0xD5, 0xB6, 0xB5, 0x12, 0x87, 0xD1, 0xAF, 0x71, 0x4A, 0x5E, 0x5D, 0x0, 0x2, 0x0, 0x7D, 0xFF, 0xEC, 0x4, 0xF4, 0x4, 0x4E, 0x0, 0x1F, 0x0, 0x27, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x35, 0x23, 0x22, 0x15, 0x14, 0x2, 0xDC, 0x88, 0x9B, 0x9C, 0x74, 0x60, 0x6B, 0x5F, 0x53, 0x7B, 0x22, 0xF2, 0xDE, 0xB, 0x7C, 0xCF, 0x9F, 0xCA, 0x2, 0xD8, 0xD8, 0x8D, 0xB7, 0x51, 0x4A, 0x4D, 0x14, 0x98, 0x78, 0x80, 0x8F, 0x9F, 0x78, 0x66, 0x52, 0x44, 0xFD, 0xE, 0x4, 0x3A, 0x83, 0x97, 0xBF, 0xDE, 0xA6, 0xB5, 0x12, 0x87, 0xD1, 0xAF, 0x72, 0x49, 0x5E, 0x5D, 0x0, 0x2, 0x0, 0x7D, 0xFE, 0x4B, 0x4, 0xEB, 0x4, 0x4E, 0x0, 0x1F, 0x0, 0x27, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x11, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x35, 0x23, 0x6, 0x15, 0x14, 0x2, 0xC5, 0x94, 0xA6, 0xA9, 0x7F, 0x6C, 0x6E, 0x5C, 0x4E, 0x76, 0x22, 0xF2, 0xE4, 0x8, 0x76, 0xC3, 0xA1, 0xCF, 0xD9, 0xD9, 0x92, 0xC4, 0x63, 0x59, 0x62, 0xFE, 0x4B, 0x99, 0x78, 0x80, 0x8E, 0x2, 0x4B, 0x76, 0x5D, 0x4E, 0x41, 0xFD, 0x7, 0x4, 0x3A, 0x7F, 0x93, 0xB9, 0xE1, 0xFD, 0xB6, 0xB4, 0x13, 0x87, 0xD1, 0xAF, 0x71, 0x4B, 0x1, 0x5E, 0x5D, 0x0, 0x2, 0x0, 0x7D, 0xFF, 0xEC, 0x3, 0x81, 0x4, 0x4E, 0x0, 0x5, 0x0, 0x9, 0x0, 0x0, 0x5, 0x25, 0x11, 0x37, 0x5, 0x11, 0x25, 0x5, 0x11, 0x25, 0x2, 0x8E, 0xFD, 0xEF, 0xF2, 0x2, 0x12, 0xFD, 0xEE, 0x1, 0x1F, 0xFE, 0xE1, 0x14, 0x55, 0x3, 0x2C, 0xE1, 0x55, 0xFC, 0xD4, 0x2E, 0x36, 0x2, 0x7A, 0x35, 0x0, 0x3, 0x0, 0x86, 0xFF, 0x76, 0x3, 0xAE, 0x4, 0xBC, 0x0, 0x2, 0x0, 0x5, 0x0, 0x13, 0x0, 0x0, 0x1, 0x27, 0x11, 0x17, 0x17, 0x11, 0x25, 0x37, 0x5, 0x37, 0x33, 0x7, 0x17, 0x11, 0x7, 0x25, 0x7, 0x23, 0x37, 0x27, 0x2, 0x68, 0xD7, 0x3E, 0xE1, 0xFD, 0xEF, 0xF2, 0x1, 0x3D, 0x4F, 0x91, 0x5B, 0x50, 0xF3, 0xFE, 0xBA, 0x53, 0x91, 0x5E, 0x45, 0x3, 0x4C, 0x28, 0xFE, 0x22, 0xA7, 0x2A, 0x1, 0xF2, 0xB6, 0xE1, 0x34, 0xA2, 0xB7, 0xC, 0xFC, 0xD4, 0xE1, 0x34, 0xAA, 0xC0, 0xB, 0x0, 0x2, 0x0, 0x25, 0xFF, 0x83, 0x3, 0xBB, 0x5, 0x1, 0x0, 0x9, 0x0, 0x1E, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x27, 0x3, 0x16, 0x17, 0x22, 0x27, 0x7, 0x23, 0x1, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x37, 0x33, 0x7, 0x16, 0x12, 0x15, 0x15, 0x14, 0x2, 0x1, 0xCA, 0x95, 0x69, 0x39, 0x4C, 0xED, 0x39, 0x3B, 0x61, 0x56, 0x31, 0xBD, 0x1, 0x69, 0x38, 0x38, 0x83, 0x3F, 0x90, 0x6B, 0x3F, 0xBD, 0x4A, 0x9A, 0x9A, 0xF8, 0xAF, 0xD9, 0x84, 0x22, 0x62, 0xB3, 0x2B, 0xFD, 0x5F, 0x1E, 0xC3, 0x23, 0x8C, 0x4, 0x1, 0xD, 0x29, 0x9D, 0x31, 0x32, 0xB3, 0xD3, 0x38, 0xFE, 0xE8, 0xB0, 0x22, 0xDF, 0xFE, 0xBF, 0x0, 0x3, 0x0, 0x50, 0xFF, 0xEC, 0x7, 0xE, 0x4, 0x4E, 0x0, 0x1E, 0x0, 0x2C, 0x0, 0x34, 0x0, 0x0, 0x1, 0x14, 0x2, 0x23, 0x22, 0x27, 0x6, 0x6, 0x23, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x32, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x7, 0x26, 0x23, 0x22, 0x6, 0x7, 0x21, 0x5, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x32, 0x36, 0x37, 0x35, 0x21, 0x16, 0x16, 0x7, 0xE, 0xE3, 0xEC, 0xE8, 0x8B, 0x41, 0xC4, 0x7F, 0xEB, 0xFE, 0xF7, 0x4, 0x1, 0xA, 0xEC, 0xF8, 0x8B, 0x43, 0xCC, 0x83, 0xA2, 0xCB, 0x34, 0x83, 0x68, 0xA7, 0x80, 0x95, 0xA, 0x2, 0xC3, 0xFA, 0x34, 0x7D, 0x89, 0x86, 0x7D, 0x7C, 0x89, 0x87, 0x7D, 0x3, 0xFD, 0x79, 0x61, 0x4, 0xFE, 0x32, 0x12, 0x7A, 0x2, 0x2, 0xEA, 0xFE, 0xD4, 0xB3, 0x53, 0x60, 0x1, 0x33, 0xE6, 0x22, 0xEC, 0x1, 0x3B, 0xB1, 0x52, 0x5F, 0x7F, 0x4D, 0x7D, 0x86, 0xA5, 0x7D, 0x57, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0xFE, 0x88, 0x98, 0x5E, 0x12, 0x7C, 0x8C, 0x0, 0x4, 0x0, 0x5D, 0xFF, 0x83, 0x6, 0xF1, 0x5, 0x1, 0x0, 0x7, 0x0, 0xF, 0x0, 0x17, 0x0, 0x41, 0x0, 0x0, 0x1, 0x14, 0x17, 0x13, 0x27, 0x22, 0x6, 0x15, 0x13, 0x32, 0x36, 0x35, 0x35, 0x34, 0x27, 0x3, 0x5, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, 0x16, 0x5, 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x27, 0x6, 0x6, 0x27, 0x22, 0x2, 0x35, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, 0x16, 0x16, 0x15, 0x14, 0x0, 0x4, 0x3, 0x41, 0xE0, 0x24, 0x87, 0x76, 0xFF, 0x87, 0x76, 0x40, 0xDF, 0xFD, 0x41, 0x5B, 0x74, 0x12, 0xFE, 0x4B, 0x64, 0x3, 0x51, 0x34, 0x31, 0x28, 0xBD, 0x3F, 0x42, 0x31, 0x3F, 0xB7, 0x6D, 0xE2, 0xE2, 0x2, 0xAA, 0xA, 0x87, 0x80, 0x6B, 0x8C, 0x38, 0x4F, 0x35, 0xC6, 0x91, 0x7E, 0xC3, 0x41, 0x3E, 0xBF, 0x7D, 0x35, 0x31, 0x42, 0xBC, 0x58, 0x6F, 0x76, 0xFE, 0xFD, 0x2, 0x14, 0xA5, 0x5E, 0x2, 0x7A, 0x2, 0xD2, 0x93, 0xFE, 0x88, 0xD5, 0x8F, 0x15, 0xA4, 0x5F, 0xFD, 0x86, 0x2, 0x93, 0x6F, 0x19, 0x60, 0x89, 0xC3, 0x9, 0x73, 0xB3, 0x2B, 0x41, 0x55, 0x61, 0x1, 0x1, 0xF, 0xD9, 0x8F, 0x7C, 0xAD, 0x36, 0x26, 0x9E, 0x2F, 0x52, 0x60, 0x53, 0x53, 0x60, 0x9, 0xBA, 0xF9, 0x46, 0xFB, 0xB3, 0xEB, 0xFE, 0xC4, 0x0, 0x4, 0x0, 0x5D, 0xFF, 0xEC, 0x6, 0xF1, 0x4, 0x50, 0x0, 0x6, 0x0, 0xD, 0x0, 0x15, 0x0, 0x37, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x26, 0x26, 0x3, 0x32, 0x36, 0x37, 0x21, 0x16, 0x16, 0x21, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, 0x16, 0x5, 0x22, 0x26, 0x27, 0x6, 0x6, 0x27, 0x22, 0x2, 0x35, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x5, 0x0, 0x79, 0x77, 0xB, 0x1, 0xF8, 0xB, 0x78, 0x78, 0x71, 0x77, 0xF, 0xFE, 0x10, 0xF, 0x78, 0xFD, 0x91, 0x5B, 0x74, 0x12, 0xFE, 0x4B, 0x64, 0x3, 0x51, 0x7E, 0xC0, 0x3F, 0x41, 0xB7, 0x6C, 0xE2, 0xE2, 0x2, 0xAA, 0xA, 0x87, 0x80, 0x6B, 0x8C, 0x38, 0x4F, 0x35, 0xC6, 0x91, 0x7D, 0xC3, 0x42, 0x3F, 0xBF, 0x7C, 0xED, 0x1, 0x4, 0xFE, 0xFD, 0x3, 0x8D, 0xAB, 0x7D, 0x7D, 0xAB, 0xFD, 0x23, 0x99, 0x71, 0x71, 0x99, 0x93, 0x6F, 0x19, 0x60, 0x89, 0xC3, 0x5D, 0x51, 0x52, 0x5D, 0x1, 0x1, 0xF, 0xD9, 0x8F, 0x7C, 0xAD, 0x36, 0x26, 0x9E, 0x2F, 0x52, 0x5C, 0x50, 0x50, 0x5C, 0xFE, 0xC5, 0xEC, 0x15, 0xEB, 0xFE, 0xC4, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x6, 0x74, 0x4, 0x4E, 0x0, 0x21, 0x0, 0x2F, 0x0, 0x0, 0x5, 0x22, 0x27, 0x6, 0x23, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x15, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x26, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x4, 0x7E, 0xA5, 0x79, 0x79, 0xA0, 0xEA, 0xFE, 0xF7, 0x4, 0x1, 0xA, 0xEC, 0x88, 0x7C, 0x7D, 0x88, 0x4B, 0x41, 0x4D, 0x1, 0xA, 0xEC, 0xEF, 0x1, 0x9, 0xFE, 0xF7, 0xFE, 0xE, 0x7D, 0x88, 0x87, 0x7D, 0x7D, 0x89, 0x87, 0x7C, 0x14, 0x52, 0x52, 0x1, 0x33, 0xE6, 0x22, 0xEC, 0x1, 0x3B, 0xC3, 0xD5, 0x8F, 0x15, 0x91, 0xD2, 0x2A, 0x86, 0xB3, 0x15, 0xEC, 0x1, 0x3B, 0xFE, 0xC5, 0xEC, 0x15, 0xEB, 0xFE, 0xC5, 0x2, 0x26, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x0, 0x3, 0x0, 0x50, 0xFF, 0x83, 0x6, 0x74, 0x5, 0x1, 0x0, 0x7, 0x0, 0xF, 0x0, 0x3A, 0x0, 0x0, 0x1, 0x14, 0x17, 0x13, 0x27, 0x22, 0x6, 0x15, 0x1, 0x32, 0x36, 0x35, 0x35, 0x34, 0x27, 0x3, 0x17, 0x22, 0x27, 0x7, 0x23, 0x37, 0x27, 0x6, 0x23, 0x22, 0x0, 0x27, 0x35, 0x34, 0x0, 0x33, 0x15, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x26, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, 0x16, 0x12, 0x15, 0x15, 0x14, 0x0, 0x3, 0x79, 0x3E, 0xDD, 0x18, 0x87, 0x7C, 0x1, 0x5, 0x87, 0x7D, 0x4F, 0xE2, 0x2D, 0x3A, 0x35, 0x29, 0xBD, 0x40, 0x9, 0x79, 0xA0, 0xEA, 0xFE, 0xF7, 0x4, 0x1, 0xA, 0xEC, 0x88, 0x7C, 0x7D, 0x88, 0x4B, 0x41, 0x4D, 0x1, 0xA, 0xEC, 0x2F, 0x2C, 0x41, 0xBD, 0x56, 0x76, 0x7F, 0xFE, 0xF7, 0x2, 0x12, 0x9C, 0x5E, 0x2, 0x72, 0x1, 0xD5, 0x8F, 0xFE, 0x88, 0xD2, 0x91, 0x15, 0xB1, 0x5E, 0xFD, 0x7D, 0xC7, 0xA, 0x73, 0xB5, 0x6, 0x52, 0x1, 0x33, 0xE6, 0x22, 0xEC, 0x1, 0x3B, 0xC3, 0xD5, 0x8F, 0x15, 0x91, 0xD2, 0x2A, 0x86, 0xB3, 0x15, 0xEC, 0x1, 0x3B, 0x7, 0xBA, 0xF4, 0x45, 0xFF, 0x0, 0xA2, 0x14, 0xEB, 0xFE, 0xC5, 0x0, 0x1, 0x0, 0x35, 0x0, 0x0, 0x4, 0x23, 0x4, 0x3A, 0x0, 0x14, 0x0, 0x0, 0x21, 0x23, 0x35, 0x34, 0x12, 0x37, 0x11, 0x33, 0x11, 0x16, 0x12, 0x15, 0x15, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x28, 0xF3, 0xC8, 0xB5, 0xF3, 0xB6, 0xC8, 0xF3, 0x7C, 0x89, 0x87, 0x7C, 0x15, 0xCC, 0x1, 0x27, 0x27, 0x2, 0xB, 0xFD, 0xF5, 0x27, 0xFE, 0xD9, 0xCC, 0x15, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x0, 0x2, 0x0, 0x99, 0xFE, 0x60, 0x4, 0x55, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x23, 0x26, 0x35, 0x11, 0x26, 0x27, 0x23, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x17, 0x11, 0x14, 0x17, 0x1, 0x11, 0x33, 0x32, 0x35, 0x34, 0x27, 0x4, 0x55, 0xFB, 0x1E, 0x1, 0xBC, 0xF3, 0xF3, 0x1, 0xBE, 0xD8, 0xF3, 0x9B, 0xA4, 0x3, 0x27, 0xFD, 0x37, 0xCC, 0xD8, 0xCE, 0xFE, 0x60, 0x23, 0x96, 0x1, 0xC0, 0xAB, 0x2, 0xFE, 0x7A, 0x4, 0x3A, 0xA4, 0x9E, 0xBB, 0x59, 0x3F, 0xC6, 0xFE, 0x52, 0x97, 0x2A, 0x5, 0x9, 0xFE, 0xC9, 0xA3, 0x90, 0x4, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x1, 0xED, 0x4, 0x3A, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x33, 0x17, 0x36, 0x37, 0x15, 0x6, 0x7, 0x1, 0x6F, 0xF2, 0xE8, 0x6, 0x33, 0x4F, 0x58, 0x26, 0x4, 0x3A, 0x7A, 0x55, 0x22, 0xE3, 0x1D, 0x53, 0x0, 0x1, 0x0, 0x7D, 0x0, 0x0, 0x3, 0x7F, 0x4, 0x4E, 0x0, 0x17, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x7, 0x23, 0x26, 0x26, 0x2, 0x4, 0x6A, 0x2B, 0xF2, 0xE1, 0x7, 0x46, 0x70, 0x4F, 0x39, 0x2F, 0x4E, 0x3E, 0x21, 0x2D, 0x22, 0x37, 0x15, 0x7A, 0x16, 0x2A, 0x3, 0x64, 0x6E, 0xFD, 0xA, 0x4, 0x3A, 0x58, 0x6C, 0x42, 0x42, 0x1B, 0xDE, 0xF, 0x2F, 0x17, 0x18, 0x0, 0x2, 0x0, 0x28, 0xFF, 0xEC, 0x3, 0xF4, 0x4, 0x4E, 0x0, 0x1A, 0x0, 0x21, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x35, 0x23, 0x6, 0x14, 0x1, 0x62, 0x94, 0xA6, 0xA9, 0x7E, 0x6D, 0xE1, 0xA, 0x5D, 0x9A, 0x31, 0x25, 0x2, 0x32, 0x30, 0xA8, 0x3A, 0xD9, 0xD9, 0x91, 0xC4, 0x63, 0x59, 0x62, 0x14, 0x98, 0x78, 0x80, 0x8F, 0x2, 0x2F, 0x77, 0x8B, 0xD, 0xE5, 0x8, 0x7F, 0xDA, 0xB5, 0x12, 0x87, 0xD1, 0xAF, 0x70, 0x4B, 0x1, 0xBA, 0x0, 0x2, 0x0, 0x28, 0xFF, 0xEC, 0x4, 0xBE, 0x4, 0x4E, 0x0, 0x24, 0x0, 0x2B, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x7, 0x23, 0x26, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x15, 0x23, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x35, 0x23, 0x6, 0x14, 0x1, 0x62, 0x94, 0xA6, 0xA9, 0x7E, 0x6D, 0xE1, 0x7, 0x46, 0x70, 0x4F, 0x39, 0x2F, 0x4E, 0x3E, 0x21, 0x2D, 0x22, 0x37, 0x15, 0x7A, 0x16, 0x2A, 0x26, 0x6A, 0x2B, 0xD9, 0xD9, 0x91, 0xC4, 0x63, 0x59, 0x62, 0x14, 0x98, 0x78, 0x80, 0x8F, 0x2, 0x2F, 0x57, 0x6B, 0x42, 0x42, 0x1B, 0xDE, 0xF, 0x2F, 0x17, 0x18, 0x6D, 0xEC, 0xB5, 0x12, 0x87, 0xD1, 0xAF, 0x70, 0x4B, 0x1, 0xBA, 0x0, 0x1, 0x0, 0x1F, 0xFF, 0xEB, 0x4, 0x25, 0x4, 0x46, 0x0, 0x16, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x11, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x37, 0x33, 0x11, 0x16, 0x33, 0x37, 0x17, 0x6, 0x3, 0xA3, 0x70, 0x80, 0x75, 0xBA, 0xA0, 0xC5, 0xF7, 0x64, 0x43, 0xC5, 0x31, 0xF6, 0x3, 0x46, 0x1B, 0x18, 0x33, 0x15, 0xA4, 0xB5, 0x1, 0xE4, 0x72, 0xC6, 0xCA, 0x6F, 0x5A, 0xBD, 0xFC, 0xFA, 0x7B, 0x4, 0xB3, 0x1F, 0x0, 0x2, 0x0, 0x1F, 0xFF, 0xEB, 0x5, 0xC3, 0x4, 0x46, 0x0, 0x17, 0x0, 0x23, 0x0, 0x0, 0x4, 0x26, 0x35, 0x11, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x37, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x3, 0x9C, 0xE9, 0x75, 0xBA, 0xA0, 0xC5, 0xF7, 0x64, 0x43, 0xC5, 0x31, 0xF6, 0x46, 0x4E, 0xA1, 0xE5, 0xE5, 0xA0, 0x47, 0x64, 0x64, 0x47, 0x49, 0x69, 0x69, 0x15, 0xD6, 0xA5, 0x1, 0xC2, 0x72, 0xC6, 0xCA, 0x6F, 0x5A, 0xBD, 0xFE, 0x90, 0x1B, 0xDC, 0xA4, 0xA5, 0xD5, 0xC9, 0x63, 0x4F, 0x52, 0x64, 0x64, 0x52, 0x4E, 0x64, 0x0, 0x1, 0xFF, 0xD8, 0xFF, 0xEC, 0x2, 0xF4, 0x6, 0x15, 0x0, 0x15, 0x0, 0x0, 0x17, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x14, 0x6, 0x61, 0x43, 0x46, 0x6, 0x2A, 0x34, 0xAD, 0x1, 0xC5, 0xAD, 0x3F, 0x59, 0x19, 0x2A, 0x32, 0xA2, 0x1, 0xCB, 0x14, 0x12, 0xBE, 0x8, 0xAA, 0x3, 0x43, 0xB5, 0xBF, 0x15, 0xB9, 0xB, 0xAF, 0xFC, 0xBD, 0xB5, 0xBF, 0x0, 0x1, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x0, 0x21, 0x27, 0x6, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x3, 0x12, 0x6, 0x6A, 0xC6, 0x9E, 0xC6, 0x1, 0xF3, 0x67, 0x45, 0xAE, 0x40, 0xF3, 0x6A, 0x7E, 0xBA, 0xD5, 0x2, 0xBF, 0xFD, 0x43, 0x75, 0x55, 0x7D, 0x1, 0xDE, 0xFC, 0xF2, 0x0, 0x2, 0x0, 0x1B, 0xFF, 0xEC, 0x4, 0xEE, 0x4, 0x3A, 0x0, 0x7, 0x0, 0x1D, 0x0, 0x0, 0x25, 0x32, 0x37, 0x35, 0x21, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x26, 0x27, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x2, 0x61, 0xAE, 0x40, 0xFE, 0x66, 0x67, 0x1, 0x41, 0x6, 0x6A, 0xC6, 0x9E, 0xC6, 0x1, 0xA7, 0xA7, 0xF3, 0x1, 0x9A, 0xF3, 0xAC, 0xAC, 0xB3, 0x7D, 0xC3, 0x76, 0x75, 0x55, 0xB3, 0x6A, 0x7E, 0xBA, 0xD5, 0x78, 0xAB, 0x1, 0x9C, 0xFE, 0x64, 0x70, 0x70, 0xAB, 0xFE, 0xD, 0x0, 0x2, 0x0, 0x77, 0xFF, 0xEC, 0x6, 0x74, 0x4, 0x4E, 0x0, 0x9, 0x0, 0x28, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x1, 0x27, 0x6, 0x23, 0x22, 0x27, 0x6, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x2, 0xEE, 0x48, 0x82, 0x49, 0x49, 0x82, 0x48, 0x2, 0xA2, 0x7, 0x73, 0xC5, 0xD8, 0x51, 0x77, 0xD6, 0xA5, 0xBE, 0x1, 0xF3, 0x6A, 0x59, 0x53, 0x69, 0x14, 0xF3, 0x69, 0x5A, 0x93, 0x3C, 0xF2, 0x3, 0xCD, 0x38, 0x49, 0x49, 0x38, 0x37, 0x49, 0x49, 0xFC, 0x6A, 0x71, 0x85, 0xA5, 0xA5, 0xB8, 0xD4, 0x2, 0xC2, 0xFD, 0x42, 0x78, 0x52, 0x5A, 0x48, 0x1, 0x84, 0xFE, 0xA6, 0x72, 0x5A, 0x78, 0x3, 0x10, 0xFB, 0xC6, 0xFF, 0xFF, 0x0, 0x7D, 0xFF, 0xEC, 0x6, 0x7A, 0x4, 0x4E, 0x0, 0xF, 0x7, 0x11, 0x6, 0xF1, 0x4, 0x3A, 0xC0, 0x0, 0x0, 0x1, 0x0, 0x14, 0xFF, 0xEC, 0x4, 0x67, 0x4, 0x4E, 0x0, 0x19, 0x0, 0x0, 0x21, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x26, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x20, 0x13, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x3, 0x81, 0x5, 0x6B, 0xC5, 0xA0, 0xC5, 0x4, 0x84, 0x25, 0x26, 0x3C, 0x46, 0x1, 0x3A, 0x9, 0x68, 0x44, 0xAF, 0x40, 0xF3, 0x6A, 0x7E, 0xBC, 0xD7, 0x1, 0x66, 0xA1, 0x9, 0xC0, 0x11, 0xFE, 0x9E, 0xFE, 0x91, 0x75, 0x55, 0x7F, 0x3, 0x8, 0xFB, 0xC6, 0x0, 0x1, 0x0, 0x1F, 0xFE, 0x60, 0x3, 0xEA, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x1, 0x13, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x3, 0x21, 0x1, 0x1, 0x1, 0x38, 0xCA, 0xCF, 0x1, 0xE, 0xFE, 0xB5, 0x1, 0x56, 0xFE, 0xF4, 0xD8, 0xD9, 0xFE, 0xF2, 0x1, 0x57, 0xFE, 0xB5, 0x4, 0x3A, 0xFE, 0x4, 0x1, 0xFC, 0xFD, 0x1F, 0xFD, 0x7, 0x2, 0xD, 0xFD, 0xF3, 0x2, 0xF9, 0x2, 0xE1, 0x0, 0x2, 0x0, 0x1F, 0xFE, 0x4B, 0x4, 0xFA, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x22, 0x26, 0x27, 0x27, 0x3, 0x21, 0x1, 0x1, 0x21, 0x13, 0x13, 0x21, 0x1, 0x13, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x26, 0x36, 0x34, 0x26, 0x22, 0x6, 0x14, 0x16, 0x3, 0xE8, 0x91, 0xA6, 0x46, 0x65, 0xD9, 0xFE, 0xF2, 0x1, 0x57, 0xFE, 0xB5, 0x1, 0xD, 0xCA, 0xCF, 0x1, 0xE, 0xFE, 0xB5, 0x92, 0x50, 0x72, 0x71, 0xA1, 0xA1, 0x42, 0x3F, 0x3F, 0x5C, 0x41, 0x41, 0xFE, 0x4B, 0x8D, 0xA4, 0xF1, 0xFD, 0xF3, 0x2, 0xF9, 0x2, 0xE1, 0xFE, 0x4, 0x1, 0xFC, 0xFD, 0x1F, 0xFE, 0xC2, 0x52, 0xA1, 0x70, 0x71, 0xA0, 0x9F, 0x3A, 0x72, 0x3B, 0x3B, 0x72, 0x3A, 0x0, 0x1, 0x0, 0xA, 0xFE, 0x60, 0x3, 0xED, 0x4, 0x3A, 0x0, 0xF, 0x0, 0x0, 0x5, 0x15, 0x21, 0x35, 0x33, 0x1, 0x1, 0x21, 0x13, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x3, 0x1, 0xC0, 0xFE, 0x4A, 0x65, 0x1, 0xA, 0xFE, 0xB5, 0x1, 0xC, 0xCB, 0xCF, 0x1, 0xE, 0xFE, 0xB4, 0x1, 0x57, 0xFE, 0xF4, 0xD9, 0x92, 0xF6, 0xAA, 0xAA, 0x2, 0x4F, 0x2, 0xE1, 0xFE, 0x4, 0x1, 0xFC, 0xFD, 0x1F, 0xFD, 0x7, 0x2, 0xD, 0xFE, 0x9D, 0x0, 0x2, 0x0, 0x1F, 0xFF, 0xEC, 0x4, 0xD7, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x21, 0x0, 0x0, 0x5, 0x22, 0x26, 0x27, 0x27, 0x3, 0x21, 0x1, 0x1, 0x21, 0x13, 0x13, 0x21, 0x1, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x3, 0xC5, 0x8B, 0x9B, 0x40, 0x5B, 0xD7, 0xFE, 0xF2, 0x1, 0x56, 0xFE, 0xB6, 0x1, 0xD, 0xCA, 0xCE, 0x1, 0xD, 0xFE, 0xB6, 0x56, 0x51, 0x8B, 0x71, 0xA1, 0xA1, 0x6F, 0x2D, 0x40, 0x40, 0x2D, 0x2F, 0x41, 0x41, 0x14, 0x80, 0x6C, 0x9A, 0xFE, 0x8E, 0x2, 0x26, 0x2, 0x14, 0xFE, 0x9C, 0x1, 0x64, 0xFD, 0xEC, 0x8A, 0x72, 0xA1, 0x71, 0x70, 0xA0, 0x9E, 0x3A, 0x3A, 0x39, 0x3B, 0x3B, 0x39, 0x3A, 0x3A, 0x0, 0x1, 0xFF, 0xDE, 0xFE, 0x60, 0x4, 0x9E, 0x4, 0x3A, 0x0, 0xB, 0x0, 0x0, 0x1, 0x13, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x1, 0x21, 0x1, 0x1, 0x1, 0xED, 0xCA, 0xCE, 0x1, 0xD, 0xFE, 0xB6, 0x1, 0x56, 0xFE, 0xF3, 0xD8, 0xFE, 0x36, 0xFE, 0xEF, 0x2, 0x4C, 0xFE, 0xB6, 0x4, 0x3A, 0xFE, 0x9C, 0x1, 0x64, 0xFD, 0xEC, 0xFD, 0xDA, 0x1, 0x72, 0xFC, 0xEE, 0x3, 0xC6, 0x2, 0x14, 0x0, 0x2, 0xFF, 0xDE, 0xFE, 0x60, 0x5, 0x8C, 0x4, 0x3A, 0x0, 0x15, 0x0, 0x21, 0x0, 0x0, 0x1, 0x1, 0x21, 0x1, 0x1, 0x21, 0x13, 0x13, 0x21, 0x1, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x27, 0x5, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x2, 0xB9, 0xFE, 0x36, 0xFE, 0xEF, 0x2, 0x4C, 0xFE, 0xB6, 0x1, 0xD, 0xCA, 0xCE, 0x1, 0xD, 0xFE, 0xB6, 0x56, 0x52, 0x8A, 0x71, 0xA1, 0xA2, 0x74, 0x8B, 0x97, 0x40, 0x1, 0x68, 0x2D, 0x40, 0x40, 0x2D, 0x2F, 0x41, 0x41, 0x1, 0x72, 0xFC, 0xEE, 0x3, 0xC6, 0x2, 0x14, 0xFE, 0x9C, 0x1, 0x64, 0xFD, 0xEC, 0x89, 0x71, 0xA1, 0x71, 0x70, 0xA0, 0x80, 0x6C, 0x4E, 0x3A, 0x3A, 0x39, 0x3B, 0x3B, 0x39, 0x3A, 0x3A, 0x0, 0x1, 0xFF, 0xBE, 0xFE, 0x60, 0x4, 0x88, 0x4, 0x3A, 0x0, 0xF, 0x0, 0x0, 0x1, 0x21, 0x35, 0x33, 0x1, 0x1, 0x21, 0x13, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x1, 0x33, 0x1, 0xB0, 0xFE, 0xE, 0x72, 0x1, 0xE5, 0xFE, 0xB6, 0x1, 0xC, 0xCA, 0xCE, 0x1, 0xE, 0xFE, 0xB5, 0x1, 0x56, 0xFE, 0xF4, 0xD8, 0xFE, 0x99, 0x73, 0xFE, 0x60, 0xAA, 0x3, 0x1C, 0x2, 0x14, 0xFE, 0x9C, 0x1, 0x64, 0xFD, 0xEC, 0xFD, 0xDA, 0x1, 0x72, 0xFD, 0x98, 0x0, 0x1, 0x0, 0xD, 0xFE, 0x4B, 0x3, 0x76, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x0, 0x13, 0x22, 0x27, 0x35, 0x17, 0x32, 0x36, 0x37, 0x37, 0x1, 0x21, 0x13, 0x17, 0x13, 0x21, 0x1, 0x2, 0x7, 0xDA, 0x23, 0x52, 0x2D, 0x58, 0x55, 0x1C, 0x28, 0xFE, 0x8A, 0x1, 0xA, 0xCB, 0xC, 0x82, 0x1, 0x6, 0xFE, 0xB8, 0x5C, 0xCB, 0xFE, 0x4B, 0x11, 0xBC, 0x3, 0x41, 0x4F, 0x72, 0x4, 0x23, 0xFD, 0x63, 0x34, 0x1, 0xAB, 0xFC, 0x56, 0xFE, 0xF8, 0x15, 0x0, 0x2, 0x0, 0x50, 0x2, 0xEE, 0x2, 0xD6, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x17, 0x0, 0x0, 0x1, 0x33, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x11, 0x34, 0x26, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x20, 0x16, 0x15, 0x2, 0x1F, 0xB7, 0xAE, 0xFE, 0xD6, 0xAE, 0xB6, 0x40, 0x9A, 0x3F, 0x3F, 0x9A, 0x40, 0xB6, 0xAE, 0x1, 0x2A, 0xAE, 0x5, 0xB0, 0x7C, 0x9E, 0x9E, 0x7C, 0x37, 0x54, 0x54, 0xFD, 0x75, 0x37, 0x54, 0x54, 0x37, 0x7D, 0x9E, 0x9E, 0x7D, 0x0, 0x1, 0x0, 0x64, 0x1, 0x4C, 0x2, 0xFA, 0x7, 0x2E, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x2, 0x3F, 0x46, 0x4F, 0x27, 0x1D, 0x47, 0x45, 0x3D, 0x62, 0x28, 0xC5, 0xC5, 0x4C, 0x82, 0x78, 0x8B, 0x1, 0x4C, 0x11, 0xB4, 0x9, 0x50, 0x1, 0xFE, 0x69, 0x54, 0x59, 0xFD, 0xD2, 0x4, 0xA2, 0xFE, 0x1B, 0x71, 0x91, 0xA2, 0xFD, 0xBF, 0xFA, 0x0, 0x1, 0x0, 0x35, 0x2, 0x8C, 0x2, 0xA9, 0x7, 0x2E, 0x0, 0x23, 0x0, 0x0, 0x1, 0x22, 0x27, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x17, 0x15, 0x22, 0x26, 0x35, 0x34, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x35, 0x32, 0x16, 0x15, 0x14, 0x6, 0x1, 0xF9, 0x11, 0x11, 0xC5, 0x15, 0x1E, 0x38, 0x18, 0x25, 0x46, 0x69, 0xB3, 0x16, 0x14, 0xC5, 0xF, 0x18, 0x3A, 0x34, 0x4B, 0x5A, 0x60, 0x3, 0xEE, 0x5, 0xFE, 0x99, 0x2, 0x95, 0x2C, 0x59, 0x31, 0x46, 0x5, 0x88, 0x80, 0x80, 0xEF, 0x7, 0x1, 0x56, 0xFD, 0x67, 0x16, 0x5D, 0x5B, 0x2, 0x91, 0x85, 0x74, 0x63, 0x80, 0x0, 0x1, 0x0, 0x35, 0x2, 0x8C, 0x2, 0x4A, 0x7, 0x2E, 0x0, 0x15, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x17, 0x11, 0x33, 0x11, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x1, 0xA4, 0xC6, 0x3, 0x1D, 0x28, 0x61, 0x56, 0x45, 0xE, 0xC6, 0x1D, 0x28, 0x61, 0x57, 0x4, 0xA6, 0xFD, 0xE6, 0x2, 0x5D, 0x30, 0x22, 0x19, 0x44, 0x69, 0x1, 0x1, 0xD2, 0xFD, 0xED, 0x30, 0x22, 0x1E, 0x44, 0x65, 0x0, 0x1, 0x0, 0x28, 0x2, 0x7F, 0x3, 0x4A, 0x5, 0xBA, 0x0, 0x18, 0x0, 0x0, 0x1, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x23, 0x22, 0x7, 0x35, 0x36, 0x33, 0x32, 0x17, 0x15, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x2, 0xA8, 0x17, 0x4C, 0x8E, 0x78, 0x8C, 0x47, 0x1D, 0x27, 0x4F, 0x46, 0xB6, 0x5, 0x4, 0x7F, 0x61, 0x28, 0xC6, 0x2, 0x8C, 0x79, 0x86, 0x91, 0xA2, 0xFC, 0x50, 0x9, 0xB4, 0x11, 0xED, 0xF8, 0xAF, 0x58, 0x2, 0x2F, 0xFC, 0xDF, 0x0, 0x2, 0x0, 0x56, 0xFF, 0xEC, 0x4, 0x7A, 0x4, 0x4F, 0x0, 0xA, 0x0, 0x21, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x2, 0x3C, 0x8B, 0x44, 0x44, 0x8D, 0x83, 0x6D, 0x6E, 0x1, 0x76, 0x14, 0x66, 0xB6, 0xCD, 0xDB, 0xDC, 0xCA, 0xBF, 0x68, 0x35, 0xA3, 0x4C, 0x33, 0x19, 0xA, 0x10, 0x46, 0x3, 0xAF, 0x8C, 0x1, 0xC9, 0x88, 0xBF, 0xA2, 0x9B, 0xE1, 0xAF, 0x83, 0x97, 0x1, 0x43, 0xFC, 0x15, 0xE7, 0x1, 0x28, 0xA1, 0xA1, 0x1F, 0xB3, 0x4, 0x7B, 0xFC, 0xFA, 0x0, 0x1, 0x0, 0x68, 0x0, 0x0, 0x4, 0x8E, 0x4, 0x4E, 0x0, 0x1E, 0x0, 0x0, 0x21, 0x21, 0x35, 0x33, 0x26, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x0, 0x15, 0x15, 0x14, 0x7, 0x33, 0x15, 0x21, 0x35, 0x36, 0x13, 0x35, 0x34, 0x26, 0x23, 0x20, 0x11, 0x15, 0x10, 0x17, 0x2, 0x45, 0xFE, 0x31, 0xA6, 0xB4, 0x1, 0x16, 0xFC, 0xFD, 0x1, 0x17, 0xB3, 0xAC, 0xFE, 0x2F, 0xD1, 0x6, 0x83, 0x90, 0xFE, 0xEF, 0xDC, 0xC4, 0x91, 0xFE, 0x18, 0xC4, 0x1, 0x1F, 0xFE, 0xE1, 0xC3, 0x19, 0xFE, 0x91, 0xC4, 0xC8, 0x41, 0x1, 0x24, 0x30, 0x88, 0xA4, 0xFE, 0xC7, 0x13, 0xFE, 0xD3, 0x48, 0xFF, 0xFF, 0x0, 0xA2, 0x0, 0xAB, 0x1, 0xBD, 0x5, 0x8, 0x0, 0x27, 0x0, 0x13, 0x0, 0x1A, 0x0, 0xB7, 0x0, 0x7, 0x0, 0x13, 0x0, 0x1A, 0x4, 0x7, 0x0, 0x2, 0x0, 0x64, 0x2, 0x80, 0x2, 0x3E, 0x4, 0x3A, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x2, 0x3E, 0x9C, 0xA1, 0x9D, 0x4, 0x3A, 0xFE, 0x46, 0x1, 0xBA, 0xFE, 0x46, 0x1, 0xBA, 0x0, 0x1, 0x0, 0x46, 0xFF, 0x66, 0x1, 0x5A, 0x1, 0x6, 0x0, 0x8, 0x0, 0x0, 0x1, 0x15, 0x14, 0x6, 0x7, 0x27, 0x36, 0x37, 0x35, 0x1, 0x5A, 0x4E, 0x47, 0x7F, 0x49, 0x2, 0x1, 0x6, 0x4B, 0x57, 0xBF, 0x3F, 0x4E, 0x6F, 0x84, 0x5F, 0xFF, 0xFF, 0x0, 0x2D, 0x0, 0x0, 0x5, 0x1B, 0x6, 0x15, 0x0, 0x26, 0x0, 0x4B, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4B, 0x2, 0x44, 0x0, 0x0, 0x0, 0x2, 0x0, 0x19, 0x0, 0x0, 0x4, 0x18, 0x6, 0x15, 0x0, 0x3, 0x0, 0x18, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x7, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x4, 0x18, 0xF3, 0x9F, 0xD5, 0xF3, 0xA5, 0xA5, 0x1, 0xE8, 0xCC, 0x7C, 0xB6, 0x26, 0x8A, 0x71, 0xCF, 0x4, 0xD5, 0x4, 0x3A, 0xFB, 0xC6, 0x4, 0x3A, 0xB3, 0xFC, 0x79, 0x3, 0x87, 0xB3, 0x48, 0xC4, 0xCF, 0x3C, 0xC8, 0x30, 0xBB, 0x4C, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x4, 0x2D, 0x6, 0x15, 0x0, 0x16, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x32, 0x5, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x2, 0xA1, 0xDB, 0xF4, 0xA5, 0xA5, 0x2, 0xD8, 0xC2, 0x92, 0x1, 0x2D, 0xF3, 0x67, 0x49, 0xC0, 0x4, 0xDB, 0x3, 0x87, 0xFC, 0x79, 0x3, 0x87, 0xB3, 0x67, 0xB4, 0xC0, 0x2F, 0xFA, 0x1A, 0x5, 0x40, 0xD, 0xAC, 0x67, 0x0, 0x2, 0x0, 0x2D, 0x0, 0x0, 0x6, 0x94, 0x6, 0x15, 0x0, 0x3, 0x0, 0x29, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x21, 0x35, 0x36, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x15, 0x23, 0x11, 0x6, 0x94, 0xF3, 0xFD, 0x99, 0xFE, 0x8C, 0xF4, 0xA5, 0xA5, 0xCC, 0xB0, 0x43, 0x46, 0x6, 0x2A, 0x34, 0xAB, 0x2, 0x1, 0x74, 0x1, 0xE8, 0xCC, 0x7C, 0xB6, 0x26, 0x8A, 0x71, 0xCF, 0x4, 0xD5, 0xD5, 0x4, 0x3A, 0xFB, 0xC6, 0x4, 0x3A, 0xFB, 0xC6, 0x3, 0x87, 0xFC, 0x79, 0x3, 0x87, 0xB3, 0x67, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xA8, 0x6B, 0x48, 0xC4, 0xCF, 0x3C, 0xC8, 0x30, 0xBB, 0x4C, 0xB3, 0xFC, 0x79, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x6, 0x94, 0x6, 0x15, 0x0, 0x27, 0x0, 0x0, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x15, 0x21, 0x35, 0x36, 0x36, 0x33, 0x32, 0x5, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x7, 0x15, 0x33, 0x15, 0x23, 0x11, 0x3, 0x3A, 0xFE, 0x8C, 0xF4, 0xA5, 0xA5, 0xCC, 0xB0, 0x43, 0x46, 0x6, 0x2A, 0x34, 0xAB, 0x2, 0x1, 0x74, 0x1, 0xD7, 0xC3, 0x92, 0x1, 0x2D, 0xF3, 0x67, 0x49, 0xC0, 0x4, 0xDB, 0xDB, 0x3, 0x87, 0xFC, 0x79, 0x3, 0x87, 0xB3, 0x67, 0xB5, 0xBF, 0x12, 0xBE, 0x8, 0xA8, 0x6B, 0x63, 0xB7, 0xC1, 0x2F, 0xFA, 0x1A, 0x5, 0x40, 0xD, 0xAC, 0x67, 0xB3, 0xFC, 0x79, 0x0, 0x1, 0x0, 0x2D, 0xFF, 0xEC, 0x4, 0xD1, 0x6, 0x15, 0x0, 0x25, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x26, 0x23, 0x22, 0x15, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x4, 0xD1, 0x43, 0x5C, 0x79, 0x9F, 0xB3, 0xB3, 0x42, 0x70, 0xA3, 0xF3, 0xA5, 0xA5, 0x1, 0xC5, 0xAD, 0x73, 0xF3, 0x61, 0xBF, 0xBF, 0x3F, 0x32, 0x29, 0x2B, 0x4, 0x18, 0x89, 0xA7, 0x2, 0x6B, 0xB3, 0xF9, 0x1F, 0xB1, 0xFB, 0x5F, 0x3, 0x87, 0xB3, 0x6B, 0xB2, 0xBE, 0x3E, 0x2B, 0xFE, 0x8E, 0xB3, 0xFD, 0xA3, 0x49, 0x2B, 0xA, 0x0, 0x1, 0x0, 0x4C, 0xFF, 0xEC, 0x6, 0x80, 0x6, 0x18, 0x0, 0x4B, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x15, 0x31, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x5, 0xE0, 0x79, 0x9F, 0xAC, 0xAC, 0xB8, 0x56, 0x50, 0x2E, 0x2B, 0xF3, 0x60, 0x5F, 0x5C, 0x58, 0x5F, 0x7F, 0xBC, 0xD3, 0xEE, 0xC7, 0xDF, 0xEA, 0xEC, 0x5, 0x8A, 0x50, 0x60, 0x65, 0x55, 0x8E, 0xB0, 0xD9, 0xE0, 0xC1, 0x5C, 0x4D, 0x2D, 0xCF, 0xB8, 0xA8, 0xB7, 0x48, 0xBF, 0xBF, 0x3F, 0x31, 0x2A, 0x2B, 0x43, 0x14, 0x9D, 0xB5, 0x2, 0x49, 0xB3, 0x59, 0xCA, 0x5A, 0x3E, 0x4D, 0x89, 0x94, 0x65, 0x3F, 0x63, 0x52, 0x6C, 0x40, 0x1B, 0x28, 0x92, 0x91, 0x90, 0xB8, 0xE4, 0x86, 0x64, 0x50, 0x4A, 0x3A, 0x35, 0x4C, 0x1E, 0x25, 0x93, 0x89, 0x85, 0xC3, 0x17, 0x6C, 0x4F, 0x7A, 0xAC, 0x77, 0xB2, 0x5B, 0x5A, 0xB3, 0xFD, 0xB7, 0x50, 0x38, 0xA, 0xBC, 0x18, 0x0, 0x1, 0xFC, 0xF4, 0x4, 0x84, 0x0, 0x0, 0x6, 0x0, 0x0, 0x7, 0x0, 0x0, 0x11, 0x15, 0x20, 0x4, 0x7, 0x23, 0x36, 0x24, 0xFF, 0x0, 0xFE, 0xE9, 0x25, 0xD0, 0x28, 0x1, 0x8D, 0x6, 0x0, 0xA7, 0x76, 0x5F, 0xB2, 0xCA, 0x0, 0x1, 0x0, 0x0, 0x4, 0x84, 0x3, 0xC, 0x6, 0x0, 0x0, 0x7, 0x0, 0x0, 0x11, 0x35, 0x20, 0x4, 0x17, 0x23, 0x26, 0x24, 0x1, 0x57, 0x1, 0x8D, 0x28, 0xD1, 0x23, 0xFE, 0xE7, 0x5, 0x59, 0xA7, 0xCA, 0xB2, 0x5F, 0x76, 0xFF, 0xFF, 0xFB, 0xC3, 0x4, 0x8E, 0x0, 0x0, 0x5, 0xAB, 0x0, 0x7, 0x7, 0x36, 0x0, 0x0, 0x6, 0x40, 0xFF, 0xFF, 0x0, 0x0, 0x4, 0xA6, 0x4, 0x3D, 0x5, 0xC3, 0x0, 0x7, 0x7, 0x37, 0x0, 0x0, 0x6, 0x40, 0x0, 0x1, 0xFD, 0xB8, 0x5, 0x13, 0xFF, 0xD3, 0x5, 0xB1, 0x0, 0x3, 0x0, 0x0, 0x3, 0x15, 0x21, 0x35, 0x2D, 0xFD, 0xE5, 0x5, 0xB1, 0x9E, 0x9E, 0x0, 0x1, 0xFB, 0x9C, 0x5, 0x13, 0xFD, 0xB8, 0x5, 0xB1, 0x0, 0x3, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0xFD, 0xB8, 0xFD, 0xE4, 0x5, 0xB1, 0x9E, 0x9E, 0x0, 0x1, 0xFB, 0x9C, 0x5, 0x13, 0xFF, 0xD3, 0x5, 0xB1, 0x0, 0x3, 0x0, 0x0, 0x3, 0x15, 0x21, 0x35, 0x2D, 0xFB, 0xC9, 0x5, 0xB1, 0x9E, 0x9E, 0x0, 0x1, 0xFC, 0xEE, 0xFE, 0x5C, 0x0, 0x0, 0xFF, 0xA2, 0x0, 0x7, 0x0, 0x0, 0x11, 0x15, 0x20, 0x24, 0x27, 0x33, 0x16, 0x4, 0xFE, 0xBD, 0xFE, 0x7B, 0x4A, 0xB6, 0x39, 0x1, 0x32, 0xFE, 0xEC, 0x90, 0xC9, 0x7D, 0x37, 0x7F, 0x0, 0x1, 0x0, 0x0, 0xFE, 0x5C, 0x3, 0x11, 0xFF, 0xA2, 0x0, 0x7, 0x0, 0x0, 0x5, 0x33, 0x6, 0x4, 0x21, 0x35, 0x32, 0x24, 0x2, 0x5B, 0xB6, 0x4A, 0xFE, 0x7C, 0xFE, 0xBD, 0xEF, 0x1, 0x35, 0x5E, 0x7D, 0xC9, 0x90, 0x7F, 0x0, 0x1, 0xFB, 0xC3, 0xFE, 0x4E, 0x0, 0x0, 0xFF, 0x6B, 0x0, 0xD, 0x0, 0x0, 0x15, 0x15, 0x25, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x32, 0x17, 0xFE, 0x8A, 0x98, 0x70, 0x87, 0x96, 0x2A, 0x78, 0x2E, 0xD7, 0xAC, 0x66, 0x9C, 0xC9, 0x9E, 0x25, 0xF, 0x4B, 0x34, 0x31, 0x5B, 0x91, 0xE, 0x0, 0x1, 0x0, 0x0, 0xFE, 0x66, 0x4, 0x3D, 0xFF, 0x83, 0x0, 0xD, 0x0, 0x0, 0x11, 0x35, 0x16, 0x4, 0x33, 0x32, 0x36, 0x37, 0x17, 0x6, 0x6, 0x23, 0x22, 0x24, 0xB6, 0x1, 0x72, 0x54, 0x88, 0x96, 0x2B, 0x78, 0x2E, 0xD9, 0xAB, 0x74, 0xFE, 0xD1, 0xFE, 0x99, 0x9E, 0x1A, 0x1A, 0x4C, 0x34, 0x35, 0x5C, 0x8C, 0x1B, 0xFF, 0xFF, 0xFD, 0xB8, 0xFE, 0xCF, 0xFF, 0xD3, 0xFF, 0x6D, 0x0, 0x7, 0x7, 0x31, 0x0, 0x0, 0xF9, 0xBC, 0xFF, 0xFF, 0xFB, 0x9C, 0xFE, 0xCF, 0xFD, 0xB8, 0xFF, 0x6D, 0x0, 0x7, 0x7, 0x32, 0x0, 0x0, 0xF9, 0xBC, 0xFF, 0xFF, 0xFB, 0x9C, 0xFE, 0xD0, 0xFF, 0xD3, 0xFF, 0x6E, 0x0, 0x7, 0x7, 0x33, 0x0, 0x0, 0xF9, 0xBD, 0x0, 0x16, 0x0, 0x5A, 0xFE, 0x72, 0x7, 0xED, 0x5, 0xAE, 0x0, 0x3, 0x0, 0x7, 0x0, 0xB, 0x0, 0x11, 0x0, 0x17, 0x0, 0x1B, 0x0, 0x1F, 0x0, 0x2D, 0x0, 0x37, 0x0, 0x3E, 0x0, 0x42, 0x0, 0x46, 0x0, 0x4D, 0x0, 0x5C, 0x0, 0x60, 0x0, 0x64, 0x0, 0x70, 0x0, 0x76, 0x0, 0x7C, 0x0, 0x80, 0x0, 0x84, 0x0, 0x88, 0x0, 0x0, 0x1, 0x21, 0x35, 0x21, 0x5, 0x21, 0x35, 0x21, 0x5, 0x21, 0x35, 0x21, 0x5, 0x23, 0x35, 0x21, 0x11, 0x23, 0x21, 0x23, 0x11, 0x21, 0x15, 0x23, 0x11, 0x15, 0x23, 0x35, 0x21, 0x15, 0x23, 0x35, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x23, 0x22, 0x7, 0x15, 0x14, 0x33, 0x32, 0x37, 0x37, 0x15, 0x33, 0x32, 0x35, 0x34, 0x27, 0x5, 0x15, 0x23, 0x35, 0x21, 0x15, 0x23, 0x35, 0x5, 0x15, 0x33, 0x32, 0x35, 0x34, 0x23, 0x1, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x33, 0x32, 0x36, 0x35, 0x5, 0x15, 0x23, 0x35, 0x21, 0x15, 0x23, 0x35, 0x5, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x23, 0x1, 0x21, 0x35, 0x33, 0x35, 0x33, 0x1, 0x21, 0x11, 0x33, 0x15, 0x33, 0x5, 0x21, 0x35, 0x21, 0x5, 0x21, 0x35, 0x21, 0x5, 0x21, 0x35, 0x21, 0x6, 0x3E, 0xFE, 0xEA, 0x1, 0x16, 0xFE, 0x70, 0xFE, 0xEB, 0x1, 0x15, 0xFE, 0x70, 0xFE, 0xEC, 0x1, 0x14, 0x4, 0x60, 0xC7, 0x1, 0x36, 0x6F, 0xF9, 0x4D, 0x71, 0x1, 0x35, 0xC4, 0x71, 0x7, 0x93, 0x6F, 0xFB, 0xBA, 0x7F, 0x66, 0x67, 0x81, 0x80, 0x66, 0x67, 0x80, 0x5C, 0x8B, 0x88, 0x2, 0x8C, 0x87, 0x2, 0xFE, 0x5D, 0x76, 0x73, 0x3, 0xB3, 0x6F, 0xF9, 0x4D, 0x71, 0x3, 0x80, 0x7E, 0x67, 0x67, 0x2, 0x3E, 0x5C, 0x6B, 0x50, 0x58, 0x6D, 0x5D, 0x68, 0x29, 0x36, 0xFA, 0x35, 0x71, 0x7, 0x93, 0x6F, 0xFB, 0xFD, 0xBC, 0x62, 0x72, 0x54, 0x66, 0xD2, 0x3, 0xA2, 0xFE, 0xCA, 0xC7, 0x6F, 0xF9, 0xA2, 0xFE, 0xCB, 0x71, 0xC4, 0x3, 0x1F, 0xFE, 0xEB, 0x1, 0x15, 0xFE, 0x70, 0xFE, 0xEC, 0x1, 0x14, 0x3, 0x20, 0xFE, 0xEA, 0x1, 0x16, 0x5, 0x3A, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0xFE, 0xE3, 0x1, 0x1D, 0x74, 0xFE, 0xDA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFD, 0xC0, 0x61, 0x7A, 0x7A, 0x61, 0x70, 0x61, 0x7A, 0x7A, 0x61, 0x93, 0x8F, 0x74, 0x93, 0x8F, 0xFD, 0x97, 0x50, 0x46, 0x1, 0x31, 0xFC, 0xFC, 0xFC, 0xFC, 0xAC, 0xA9, 0x53, 0x56, 0x1, 0x33, 0xFE, 0x86, 0x4F, 0x5C, 0x51, 0x53, 0x5B, 0x37, 0x2B, 0x87, 0xF9, 0xF9, 0xF9, 0xF9, 0x26, 0x2, 0x25, 0x49, 0x4D, 0x53, 0x21, 0x1A, 0x66, 0x9B, 0xFD, 0x76, 0x71, 0xCA, 0xFE, 0xC5, 0x1, 0x3B, 0xCA, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x0, 0x5, 0x0, 0x5C, 0xFD, 0xD5, 0x7, 0xD7, 0x8, 0x73, 0x0, 0x3, 0x0, 0x7, 0x0, 0x1F, 0x0, 0x23, 0x0, 0x27, 0x0, 0x0, 0x1, 0x35, 0x33, 0x15, 0x9, 0x3, 0x3, 0x33, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x33, 0x36, 0x36, 0x33, 0x32, 0x15, 0x14, 0x7, 0x6, 0x6, 0x13, 0x35, 0x23, 0x15, 0x13, 0x35, 0x33, 0x15, 0x4, 0x1E, 0x4, 0xFC, 0x3A, 0x3, 0xBC, 0x3, 0xBF, 0xFC, 0x41, 0x77, 0xCA, 0x19, 0x29, 0x44, 0x62, 0xA7, 0x95, 0x7F, 0xB1, 0x2, 0xCB, 0x2, 0x3E, 0x27, 0x71, 0x5D, 0x46, 0x43, 0xC9, 0xCA, 0x7F, 0x4, 0x8, 0x6F, 0x4, 0x4, 0xFA, 0x14, 0x3, 0xCF, 0xFC, 0x31, 0xFC, 0x31, 0x2, 0xDE, 0x33, 0x3E, 0x1B, 0x25, 0x81, 0x52, 0x80, 0x97, 0x7D, 0x8D, 0x37, 0x30, 0x74, 0x5F, 0x3C, 0x31, 0x59, 0xFE, 0x9C, 0xAA, 0xAA, 0xFD, 0x48, 0x4, 0x4, 0x0, 0x2, 0x0, 0x74, 0x3, 0x89, 0x4, 0xC5, 0x5, 0xB9, 0x0, 0x1A, 0x0, 0x27, 0x0, 0x0, 0x1, 0x32, 0x37, 0x33, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x3, 0x11, 0x23, 0x11, 0x33, 0x13, 0x13, 0x33, 0x11, 0x23, 0x11, 0x3, 0x3, 0xE9, 0x60, 0xC, 0x6F, 0x4, 0x7B, 0x5C, 0x77, 0x77, 0x77, 0x77, 0x62, 0x75, 0x5, 0x70, 0x4, 0x37, 0x31, 0x46, 0x39, 0x38, 0xFD, 0xCC, 0x8C, 0x6E, 0x88, 0x90, 0x92, 0x83, 0x6F, 0x87, 0x3, 0xE4, 0x61, 0x52, 0x6A, 0x95, 0x69, 0x35, 0x69, 0x94, 0x6B, 0x59, 0x2C, 0x3E, 0x67, 0x3C, 0x35, 0x3D, 0x66, 0x4F, 0x1, 0x5A, 0xFE, 0xA6, 0x2, 0x1B, 0xFE, 0x83, 0x1, 0x7D, 0xFD, 0xE5, 0x1, 0x4B, 0xFE, 0xB5, 0x0, 0x3, 0x0, 0x74, 0x3, 0x95, 0x4, 0xCC, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x16, 0x0, 0x20, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x1, 0x3, 0x11, 0x23, 0x11, 0x33, 0x13, 0x13, 0x33, 0x11, 0x23, 0x11, 0x3, 0x21, 0x11, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x3, 0x87, 0x5D, 0x35, 0x44, 0x44, 0x35, 0xFD, 0x8A, 0x8C, 0x6E, 0x88, 0x90, 0x92, 0x83, 0x6F, 0x87, 0x1, 0x6E, 0xCB, 0x64, 0x84, 0x84, 0x64, 0x5, 0x57, 0xFE, 0x97, 0x4B, 0x39, 0x61, 0x39, 0x4B, 0xFE, 0x3E, 0x1, 0x5A, 0xFE, 0xA6, 0x2, 0x1B, 0xFE, 0x83, 0x1, 0x7D, 0xFD, 0xE5, 0x1, 0x4B, 0xFE, 0xB5, 0x2, 0x1B, 0x7B, 0x62, 0x61, 0x62, 0x7B, 0x0, 0x1, 0x0, 0x25, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x17, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x6C, 0xFE, 0x65, 0xA8, 0x1, 0x99, 0xEE, 0xF3, 0x1, 0x1F, 0x1, 0x74, 0x2, 0xB7, 0x66, 0xFD, 0x4E, 0xDC, 0x3, 0x8E, 0x0, 0x1, 0x0, 0x3C, 0x0, 0x0, 0x2, 0xB2, 0x3, 0x20, 0x0, 0x15, 0x0, 0x0, 0x25, 0x15, 0x21, 0x35, 0x1, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x20, 0x16, 0x15, 0x14, 0x6, 0x7, 0x7, 0x2, 0xB2, 0xFD, 0x9C, 0x1, 0x2C, 0x63, 0x6A, 0x40, 0x3C, 0xBB, 0xA2, 0x1, 0x1C, 0x9E, 0x67, 0x61, 0x91, 0x95, 0x95, 0x7E, 0x1, 0x13, 0x5C, 0x3F, 0x5F, 0x45, 0x32, 0x6E, 0x9E, 0x81, 0x72, 0x52, 0x80, 0x51, 0x75, 0x0, 0x1, 0x0, 0x81, 0x0, 0x0, 0x2, 0x3, 0x3, 0x14, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x7, 0x35, 0x25, 0x2, 0x3, 0xBA, 0xC8, 0x1, 0x6F, 0x3, 0x14, 0xFC, 0xEC, 0x2, 0x3B, 0x31, 0x93, 0x77, 0x0, 0x2, 0x0, 0x4C, 0xFF, 0xF5, 0x2, 0xAA, 0x3, 0x20, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x1, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x27, 0x34, 0x23, 0x22, 0x7, 0x15, 0x14, 0x33, 0x32, 0x37, 0x2, 0xAA, 0xA8, 0x86, 0x87, 0xA9, 0xA8, 0x86, 0x87, 0xA9, 0xBA, 0x76, 0x72, 0x2, 0x76, 0x70, 0x4, 0x1, 0x3E, 0xA9, 0xA0, 0xA0, 0xA9, 0x98, 0xA8, 0xA2, 0xA2, 0xA8, 0xB, 0xA9, 0xA3, 0xB4, 0xA9, 0x9B, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xF5, 0x3, 0xB7, 0x4, 0x9D, 0x0, 0x13, 0x0, 0x20, 0x0, 0x0, 0x5, 0x35, 0x32, 0x36, 0x37, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x10, 0x0, 0x21, 0x13, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x1, 0x18, 0xDB, 0xC0, 0xF, 0x63, 0x92, 0xBC, 0xC1, 0xE7, 0xCA, 0xD0, 0xE6, 0xFE, 0xCA, 0xFE, 0xAA, 0xD9, 0x44, 0x65, 0x18, 0x72, 0x52, 0x5B, 0x65, 0x61, 0xB, 0xC3, 0x8E, 0x90, 0x5C, 0xDA, 0xAC, 0xAA, 0xF3, 0xFF, 0xDD, 0x47, 0xFE, 0xD0, 0xFE, 0xAB, 0x2, 0x3D, 0x3C, 0x29, 0x58, 0x77, 0x74, 0x81, 0x59, 0x56, 0x78, 0x0, 0x3, 0x0, 0x59, 0xFF, 0xF0, 0x3, 0xC4, 0x4, 0x9D, 0x0, 0x14, 0x0, 0x1F, 0x0, 0x2A, 0x0, 0x0, 0x4, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x3, 0x34, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x13, 0x34, 0x26, 0x22, 0x6, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x55, 0xFC, 0x6C, 0x5C, 0xAC, 0xE6, 0xB2, 0xB3, 0xE7, 0xAC, 0x5C, 0x6D, 0xFB, 0x15, 0x5A, 0x4D, 0xA4, 0x58, 0x4E, 0x4D, 0x58, 0x1D, 0x6C, 0xB0, 0x69, 0x69, 0x5A, 0x58, 0x6A, 0x10, 0xAA, 0xA6, 0x61, 0x90, 0x28, 0x54, 0xAA, 0x9E, 0xA8, 0xA8, 0x9E, 0xAA, 0x55, 0x27, 0x90, 0x61, 0xA6, 0xAA, 0x3, 0x5A, 0x41, 0x4F, 0x90, 0x43, 0x51, 0x51, 0xFE, 0x4C, 0x4A, 0x56, 0x56, 0x4A, 0x4B, 0x55, 0x55, 0x0, 0x1, 0x0, 0x3A, 0x0, 0x0, 0x3, 0xD0, 0x4, 0x8D, 0x0, 0x6, 0x0, 0x0, 0x1, 0x15, 0x1, 0x21, 0x1, 0x21, 0x35, 0x3, 0xD0, 0xFD, 0xFF, 0xFF, 0x0, 0x2, 0x2, 0xFD, 0x69, 0x4, 0x8D, 0x87, 0xFB, 0xFA, 0x3, 0xC9, 0xC4, 0x0, 0x2, 0x0, 0x61, 0xFF, 0xF0, 0x3, 0xD7, 0x4, 0x9A, 0x0, 0x13, 0x0, 0x1F, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x35, 0x10, 0x0, 0x21, 0x33, 0x15, 0x7, 0x4, 0x3, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x16, 0x2, 0x25, 0xD3, 0xF1, 0x1, 0x46, 0x1, 0x4D, 0x20, 0x3C, 0xFE, 0x9F, 0x21, 0x6B, 0xA1, 0xBD, 0xB8, 0xE8, 0xCE, 0x5B, 0x6A, 0x65, 0x60, 0x47, 0x6E, 0x19, 0x76, 0x10, 0xFE, 0xD4, 0x4E, 0x1, 0x2C, 0x1, 0x5E, 0xC7, 0x1, 0x11, 0xFE, 0xD8, 0x6D, 0xE4, 0xA2, 0xAA, 0xE6, 0xC3, 0x74, 0xB0, 0x6E, 0x40, 0x2C, 0x2D, 0x7D, 0x7C, 0x0, 0x1, 0x0, 0x67, 0xFF, 0xF0, 0x3, 0xD2, 0x4, 0x8D, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x27, 0x13, 0x21, 0x15, 0x21, 0x7, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x24, 0x27, 0x33, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x1, 0x4A, 0xC2, 0x49, 0x2, 0xC4, 0xFE, 0x5, 0x21, 0x68, 0x62, 0xBC, 0xD3, 0xD5, 0xDF, 0xA8, 0xFE, 0xFB, 0xA, 0xEF, 0xF, 0xB9, 0x66, 0x5B, 0x70, 0x69, 0x4E, 0x4E, 0x2, 0xC, 0x2F, 0x2, 0x52, 0xC7, 0xF3, 0x2B, 0xCC, 0xB5, 0x9E, 0xEF, 0xAF, 0xA1, 0x8D, 0x77, 0x57, 0x59, 0x71, 0x28, 0x0, 0x2, 0x0, 0x31, 0x0, 0x0, 0x3, 0xED, 0x4, 0x8D, 0x0, 0x3, 0x0, 0xE, 0x0, 0x0, 0x1, 0x21, 0x11, 0x7, 0x1, 0x23, 0x15, 0x23, 0x35, 0x21, 0x27, 0x1, 0x33, 0x11, 0x33, 0x1, 0x24, 0x1, 0x3B, 0x14, 0x1, 0xA2, 0x9B, 0xF3, 0xFD, 0xDB, 0x9, 0x2, 0x2A, 0xF7, 0x9B, 0x1, 0xBD, 0x1, 0x9A, 0x21, 0xFD, 0xC3, 0xF9, 0xF9, 0x9A, 0x2, 0xFA, 0xFD, 0x30, 0x0, 0x1, 0x0, 0x3F, 0xFF, 0xF0, 0x3, 0xBD, 0x4, 0x9D, 0x0, 0x26, 0x0, 0x0, 0x5, 0x22, 0x24, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x15, 0x14, 0x4, 0x1, 0xF6, 0xA8, 0xFE, 0xF1, 0xF3, 0x6E, 0x5E, 0x62, 0x69, 0xDE, 0x83, 0x7F, 0x69, 0x66, 0x5A, 0x61, 0x51, 0x6A, 0xF2, 0xF4, 0xB4, 0xC2, 0xF0, 0x62, 0x5F, 0xD6, 0xFE, 0xFB, 0x10, 0xA5, 0xB3, 0x40, 0x55, 0x57, 0x49, 0xA5, 0x2, 0xAF, 0x58, 0x46, 0x40, 0x53, 0x45, 0x3C, 0x95, 0xAF, 0xA9, 0xA3, 0x4F, 0x86, 0x26, 0x3E, 0xD2, 0xA3, 0xB3, 0x0, 0x1, 0x0, 0x43, 0x0, 0x0, 0x3, 0xD8, 0x4, 0x9D, 0x0, 0x17, 0x0, 0x0, 0x25, 0x15, 0x21, 0x35, 0x1, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x5, 0x3, 0xD8, 0xFC, 0x85, 0x1, 0xA9, 0xB1, 0x5C, 0x54, 0x6C, 0x65, 0xF3, 0xEC, 0xD3, 0xC8, 0xE0, 0x97, 0x82, 0xFF, 0x0, 0xC3, 0xC3, 0xA6, 0x1, 0x8E, 0x9E, 0x6C, 0x44, 0x58, 0x6C, 0x53, 0x9F, 0xE3, 0xBD, 0x9F, 0x76, 0xBF, 0x77, 0xD2, 0x0, 0x1, 0x0, 0x96, 0x0, 0x0, 0x2, 0xC4, 0x4, 0x8D, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x5, 0x35, 0x25, 0x2, 0xC4, 0xF3, 0xFE, 0xC5, 0x2, 0x12, 0x4, 0x8D, 0xFB, 0x73, 0x3, 0x70, 0x53, 0xC3, 0xAD, 0x0, 0x2, 0x0, 0x59, 0xFF, 0xF0, 0x3, 0xC3, 0x4, 0x9D, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x1, 0x10, 0x6, 0x23, 0x22, 0x26, 0x27, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x27, 0x10, 0x23, 0x22, 0x3, 0x11, 0x10, 0x33, 0x32, 0x13, 0x3, 0xC3, 0xEF, 0xC5, 0xC2, 0xF3, 0x1, 0xF1, 0xC3, 0xC4, 0xF1, 0x1, 0xF3, 0xC3, 0xBC, 0x5, 0xC3, 0xBB, 0x6, 0x1, 0xE2, 0xFF, 0x0, 0xF2, 0xF0, 0xFE, 0xCE, 0xFE, 0xF3, 0xF1, 0xFC, 0x12, 0x1, 0x17, 0xFE, 0xF7, 0xFE, 0xFD, 0xFE, 0xE6, 0x1, 0x6, 0x0, 0x1, 0x0, 0x41, 0x0, 0x0, 0x3, 0xF3, 0x4, 0x8D, 0x0, 0x9, 0x0, 0x0, 0x33, 0x35, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x21, 0x15, 0x41, 0x2, 0x6D, 0xFD, 0x95, 0x3, 0x9F, 0xFD, 0x97, 0x2, 0x7A, 0x8E, 0x3, 0x3B, 0xC4, 0x89, 0xFC, 0xBF, 0xC3, 0x0, 0x1, 0x0, 0x5, 0x0, 0x0, 0x4, 0x37, 0x4, 0x8D, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x2, 0x94, 0xF3, 0xFE, 0x64, 0x1, 0xB, 0x1, 0xE, 0x1, 0xE, 0x1, 0xB, 0xFE, 0x5D, 0x1, 0xA3, 0x2, 0xEA, 0xFD, 0xEE, 0x2, 0x12, 0xFD, 0x9, 0x0, 0x1, 0x0, 0x16, 0x0, 0x0, 0x4, 0x4A, 0x4, 0x8D, 0x0, 0xB, 0x0, 0x0, 0x1, 0x13, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x3, 0x21, 0x1, 0x1, 0x1, 0x38, 0xF0, 0xF2, 0x1, 0x1B, 0xFE, 0x89, 0x1, 0x8C, 0xFE, 0xE0, 0xFF, 0xFA, 0xFE, 0xE5, 0x1, 0x81, 0xFE, 0x87, 0x4, 0x8D, 0xFE, 0x6E, 0x1, 0x92, 0xFD, 0xBE, 0xFD, 0xB5, 0x1, 0x99, 0xFE, 0x67, 0x2, 0x4B, 0x2, 0x42, 0x0, 0x1, 0x0, 0x29, 0x0, 0x0, 0x5, 0xE6, 0x4, 0x8D, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x33, 0x13, 0x13, 0x33, 0x13, 0x13, 0x33, 0x1, 0x23, 0x3, 0x3, 0x1, 0x42, 0xFE, 0xE7, 0xEC, 0xB0, 0xD8, 0xD6, 0xD7, 0xAF, 0xED, 0xFE, 0xE6, 0xEB, 0xD9, 0xDB, 0x4, 0x8D, 0xFC, 0x9D, 0x3, 0x63, 0xFC, 0x9F, 0x3, 0x61, 0xFB, 0x73, 0x3, 0x42, 0xFC, 0xBE, 0x0, 0x1, 0x0, 0x9, 0x0, 0x0, 0x4, 0x72, 0x4, 0x8D, 0x0, 0x8, 0x0, 0x0, 0x21, 0x1, 0x21, 0x1, 0x17, 0x37, 0x1, 0x21, 0x1, 0x1, 0xC2, 0xFE, 0x47, 0x1, 0x2, 0x1, 0x1F, 0x14, 0x12, 0x1, 0x21, 0x1, 0x1, 0xFE, 0x47, 0x4, 0x8D, 0xFC, 0xAC, 0x4F, 0x4C, 0x3, 0x57, 0xFB, 0x73, 0x0, 0x1, 0x0, 0x67, 0xFF, 0xF0, 0x4, 0x1E, 0x4, 0x8D, 0x0, 0x10, 0x0, 0x0, 0x1, 0x33, 0x11, 0x14, 0x4, 0x23, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x3, 0x2B, 0xF3, 0xFE, 0xF0, 0xCB, 0xD0, 0xFE, 0xF4, 0xF2, 0x7E, 0x6C, 0xE4, 0x4, 0x4, 0x8D, 0xFD, 0x0, 0xCA, 0xD3, 0xD3, 0xCA, 0x3, 0x0, 0xFD, 0x0, 0x73, 0x67, 0xD2, 0x0, 0x1, 0x0, 0x25, 0x0, 0x0, 0x4, 0x16, 0x4, 0x8D, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x4, 0x16, 0xFE, 0x7E, 0xF2, 0xFE, 0x83, 0x3, 0xF1, 0x3, 0xC9, 0xFC, 0x37, 0x3, 0xC9, 0xC4, 0x0, 0x1, 0x0, 0x3F, 0xFF, 0xF0, 0x3, 0xEF, 0x4, 0x9D, 0x0, 0x26, 0x0, 0x0, 0x1, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3, 0x2, 0x5F, 0x92, 0xCE, 0xDC, 0xF5, 0xC4, 0xD5, 0xFA, 0xF3, 0x6D, 0x70, 0x6A, 0x63, 0x7B, 0x8A, 0xCB, 0xCD, 0xF6, 0xCD, 0x79, 0xE3, 0x91, 0xF3, 0x8C, 0x75, 0x6D, 0x62, 0x1, 0x32, 0x3F, 0x51, 0x23, 0x32, 0xA2, 0x97, 0x93, 0xBA, 0xCA, 0x9D, 0x49, 0x65, 0x56, 0x38, 0x3C, 0x4C, 0x22, 0x32, 0xAC, 0x97, 0x99, 0xAE, 0x50, 0xA7, 0x82, 0x67, 0x5A, 0x53, 0x0, 0x2, 0x0, 0x76, 0x0, 0x0, 0x4, 0x3A, 0x4, 0x8D, 0x0, 0x8, 0x0, 0x17, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x13, 0x3, 0x23, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x1, 0x15, 0x1, 0x69, 0xD6, 0x6B, 0x6C, 0x69, 0x6F, 0xF7, 0xEC, 0xE0, 0xF3, 0x1, 0xC8, 0xD8, 0xF3, 0x78, 0x68, 0x1, 0x11, 0x3, 0xC9, 0xFE, 0xA3, 0x5E, 0x4F, 0x50, 0x60, 0xFC, 0x37, 0x1, 0xA9, 0xFE, 0x57, 0x4, 0x8D, 0xB5, 0xAC, 0x7F, 0x9B, 0x2C, 0xFE, 0x25, 0xB, 0x0, 0x2, 0x0, 0x4D, 0xFF, 0x2F, 0x4, 0x6D, 0x4, 0x9D, 0x0, 0x12, 0x0, 0x20, 0x0, 0x0, 0x5, 0x25, 0x6, 0x23, 0x22, 0x0, 0x11, 0x35, 0x10, 0x0, 0x33, 0x32, 0x0, 0x11, 0x15, 0x14, 0x6, 0x7, 0x17, 0x3, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x3, 0xCE, 0xFE, 0xF7, 0x31, 0x36, 0xE9, 0xFE, 0xD8, 0x1, 0x26, 0xE9, 0xEC, 0x1, 0x25, 0x6F, 0x62, 0xCE, 0xEF, 0x97, 0x88, 0x85, 0x98, 0x9A, 0x85, 0x87, 0x96, 0xD1, 0xC9, 0x8, 0x1, 0x32, 0x1, 0xA, 0x34, 0x1, 0xA, 0x1, 0x33, 0xFE, 0xCD, 0xFE, 0xF6, 0x34, 0xA1, 0xF2, 0x49, 0x99, 0x2, 0xAB, 0xB5, 0xC1, 0xC1, 0xB5, 0x36, 0xB5, 0xC3, 0xC3, 0xB5, 0x0, 0x2, 0x0, 0x76, 0x0, 0x0, 0x4, 0x2C, 0x4, 0x8D, 0x0, 0x8, 0x0, 0x13, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x1, 0x69, 0xF3, 0x74, 0x6A, 0x6A, 0x74, 0xF3, 0xF3, 0x1, 0xE6, 0xDC, 0xF4, 0xF4, 0xDC, 0x3, 0xC9, 0xFE, 0x95, 0x60, 0x4C, 0x4B, 0x74, 0xFD, 0xD1, 0xFE, 0x66, 0x4, 0x8D, 0xDA, 0xA7, 0xA9, 0xC9, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x4, 0x9D, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x10, 0x0, 0x23, 0x22, 0x0, 0x11, 0x35, 0x10, 0x0, 0x33, 0x32, 0x0, 0x11, 0x27, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x4, 0x6F, 0xFE, 0xDE, 0xEC, 0xE9, 0xFE, 0xD8, 0x1, 0x26, 0xE9, 0xEC, 0x1, 0x24, 0xF2, 0x97, 0x87, 0x85, 0x98, 0x9A, 0x85, 0x87, 0x95, 0x2, 0x2C, 0xFE, 0xF6, 0xFE, 0xCE, 0x1, 0x32, 0x1, 0xA, 0x34, 0x1, 0xA, 0x1, 0x33, 0xFE, 0xCD, 0xFE, 0xF6, 0x2, 0xB5, 0xC1, 0xC1, 0xB5, 0x36, 0xB5, 0xC3, 0xC3, 0xB5, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x4, 0x67, 0x4, 0x8D, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x11, 0x23, 0x11, 0x33, 0x1, 0x11, 0x4, 0x67, 0xF2, 0xFD, 0xF4, 0xF3, 0xF3, 0x2, 0xC, 0x4, 0x8D, 0xFB, 0x73, 0x3, 0x1C, 0xFC, 0xE4, 0x4, 0x8D, 0xFC, 0xE4, 0x3, 0x1C, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x5, 0x90, 0x4, 0x8D, 0x0, 0xE, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x21, 0x1, 0x1, 0x21, 0x11, 0x23, 0x11, 0x13, 0x1, 0x23, 0x1, 0x1, 0x69, 0xF3, 0x1, 0x3D, 0x1, 0x50, 0x1, 0x4F, 0x1, 0x3E, 0xF3, 0x19, 0xFE, 0xA1, 0xA9, 0xFE, 0xA2, 0x1, 0x3C, 0xFE, 0xC4, 0x4, 0x8D, 0xFC, 0xB6, 0x3, 0x4A, 0xFB, 0x73, 0x1, 0x3C, 0x2, 0x36, 0xFC, 0x8E, 0x3, 0x71, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x3, 0x94, 0x4, 0x8D, 0x0, 0x5, 0x0, 0x0, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x76, 0xF3, 0x2, 0x2B, 0x4, 0x8D, 0xFC, 0x36, 0xC3, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x4, 0x69, 0x4, 0x8D, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x37, 0x1, 0x21, 0x1, 0x1, 0x3, 0x47, 0xFE, 0xAA, 0x88, 0xF3, 0xF3, 0x6F, 0x1, 0x4E, 0x1, 0x2D, 0xFE, 0x42, 0x1, 0xD4, 0x1, 0xDB, 0x84, 0xFE, 0xA9, 0x4, 0x8D, 0xFD, 0xFD, 0x87, 0x1, 0x7C, 0xFD, 0xF7, 0xFD, 0x7C, 0x0, 0x1, 0x0, 0x25, 0xFF, 0xF0, 0x3, 0x65, 0x4, 0x8D, 0x0, 0xD, 0x0, 0x0, 0x1, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x33, 0x32, 0x37, 0x2, 0x71, 0xF4, 0xEA, 0xAB, 0xBB, 0xF0, 0xF3, 0xB8, 0xA0, 0x1, 0x4, 0x8D, 0xFC, 0xE1, 0xB5, 0xC9, 0xB3, 0xBD, 0xAD, 0xB9, 0x0, 0x1, 0x0, 0x85, 0x0, 0x0, 0x1, 0x78, 0x4, 0x8D, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x78, 0xF3, 0x4, 0x8D, 0xFB, 0x73, 0x4, 0x8D, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x4, 0x68, 0x4, 0x8D, 0x0, 0xB, 0x0, 0x0, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x3, 0x76, 0xFD, 0xF3, 0xF3, 0xF3, 0x2, 0xD, 0xF2, 0x1, 0xDB, 0xFE, 0x25, 0x4, 0x8D, 0xFE, 0x12, 0x1, 0xEE, 0xFB, 0x73, 0x0, 0x1, 0x0, 0x55, 0xFF, 0xF0, 0x4, 0x49, 0x4, 0x9D, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x11, 0x6, 0x6, 0x23, 0x22, 0x0, 0x11, 0x35, 0x10, 0x0, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x20, 0x3, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x23, 0x35, 0x4, 0x49, 0x2B, 0xDD, 0xD0, 0xF0, 0xFE, 0xD4, 0x1, 0x1A, 0xF0, 0xEF, 0xE5, 0x15, 0xEC, 0x10, 0x6F, 0x79, 0xFE, 0xEC, 0x8, 0xA2, 0x92, 0x65, 0x60, 0x15, 0xF8, 0x2, 0x65, 0xFE, 0x2E, 0x31, 0x72, 0x1, 0x26, 0x1, 0xE, 0x45, 0x1, 0xD, 0x1, 0x27, 0xD9, 0xAA, 0x58, 0x68, 0xFE, 0xA5, 0x5B, 0xB5, 0xBC, 0x27, 0x12, 0xC7, 0xB2, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x3, 0x9E, 0x4, 0x8D, 0x0, 0x9, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x3, 0x5C, 0xFE, 0xD, 0xF3, 0x3, 0x28, 0xFD, 0xCB, 0x1, 0xF3, 0x1, 0xDB, 0xFE, 0x25, 0x4, 0x8D, 0xC4, 0xFE, 0xD6, 0x0, 0x1, 0x0, 0x3F, 0xFF, 0x13, 0x3, 0xEF, 0x5, 0x73, 0x0, 0x2B, 0x0, 0x0, 0x5, 0x23, 0x35, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x2, 0x7F, 0xA0, 0xA2, 0xFE, 0xF3, 0x8C, 0x75, 0x6D, 0x62, 0x5F, 0x92, 0xCE, 0xDC, 0xCF, 0xA9, 0xA0, 0xAB, 0xC5, 0xF3, 0x6D, 0x70, 0x6A, 0x63, 0x7B, 0x8A, 0xCB, 0xCD, 0xC7, 0xA9, 0xED, 0xE1, 0x11, 0xB6, 0xAE, 0x67, 0x5A, 0x53, 0x37, 0x3F, 0x51, 0x23, 0x32, 0xA2, 0x97, 0x86, 0xB4, 0x10, 0xD9, 0xDC, 0x16, 0xC1, 0x8A, 0x49, 0x65, 0x56, 0x38, 0x3C, 0x4C, 0x22, 0x32, 0xAC, 0x97, 0x89, 0xA9, 0x11, 0x0, 0x1, 0x0, 0x39, 0x0, 0x0, 0x4, 0x1A, 0x4, 0x9D, 0x0, 0x1F, 0x0, 0x0, 0x21, 0x21, 0x35, 0x33, 0x36, 0x36, 0x27, 0x35, 0x23, 0x35, 0x33, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x17, 0x17, 0x21, 0x15, 0x21, 0x16, 0x7, 0x21, 0x4, 0x1A, 0xFC, 0x64, 0xA, 0x35, 0x1F, 0x3, 0xA0, 0x9B, 0x3, 0x7, 0xDD, 0xBA, 0xCD, 0xCE, 0xF3, 0x62, 0x45, 0x4C, 0x57, 0x4, 0x4, 0x1, 0x81, 0xFE, 0x85, 0x7, 0x50, 0x2, 0x96, 0xC4, 0xE, 0xBA, 0x53, 0x7, 0x93, 0x69, 0xD2, 0xE9, 0xDD, 0xB3, 0x71, 0x5A, 0x7E, 0x78, 0x69, 0x93, 0xB0, 0x72, 0x0, 0x1, 0x0, 0xA, 0x0, 0x0, 0x3, 0x9A, 0x4, 0x8D, 0x0, 0x18, 0x0, 0x0, 0x25, 0x21, 0x15, 0x23, 0x35, 0x21, 0x35, 0x21, 0x35, 0x27, 0x21, 0x35, 0x33, 0x1, 0x21, 0x13, 0x13, 0x33, 0x1, 0x33, 0x15, 0x21, 0x7, 0x15, 0x21, 0x3, 0x53, 0xFE, 0xF4, 0xF2, 0xFE, 0xF5, 0x1, 0xB, 0x4, 0xFE, 0xF9, 0xC5, 0xFE, 0xFB, 0x1, 0x1, 0xC7, 0xC9, 0xFF, 0xFE, 0xFA, 0xBF, 0xFF, 0x0, 0xC, 0x1, 0xC, 0xD9, 0xD9, 0xD9, 0x92, 0x3D, 0xA, 0x93, 0x2, 0x48, 0xFE, 0x1, 0x1, 0xFF, 0xFD, 0xB8, 0x93, 0x1A, 0x2D, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x3, 0x97, 0x4, 0x8D, 0x0, 0x5, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x3, 0x97, 0xFD, 0xD2, 0xF3, 0x3, 0x21, 0x3, 0xC9, 0xFC, 0x37, 0x4, 0x8D, 0x0, 0x2, 0x0, 0x9, 0x0, 0x0, 0x4, 0x72, 0x4, 0x8D, 0x0, 0x3, 0x0, 0x8, 0x0, 0x0, 0x33, 0x1, 0x33, 0x1, 0x1, 0x3, 0x21, 0x3, 0x27, 0x9, 0x1, 0xB9, 0xF7, 0x1, 0xB9, 0xFD, 0xB8, 0xDD, 0x1, 0xE2, 0xDF, 0x12, 0x4, 0x8D, 0xFB, 0x73, 0x3, 0x54, 0xFD, 0x70, 0x2, 0x93, 0x4C, 0x0, 0x3, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x4, 0x9D, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x10, 0x0, 0x23, 0x22, 0x0, 0x11, 0x35, 0x10, 0x0, 0x33, 0x32, 0x0, 0x11, 0x27, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x27, 0x15, 0x21, 0x35, 0x4, 0x6F, 0xFE, 0xDE, 0xEC, 0xE9, 0xFE, 0xD8, 0x1, 0x26, 0xE9, 0xEC, 0x1, 0x24, 0xF2, 0x97, 0x87, 0x85, 0x98, 0x9A, 0x85, 0x87, 0x95, 0x45, 0xFE, 0x5A, 0x2, 0x2C, 0xFE, 0xF6, 0xFE, 0xCE, 0x1, 0x32, 0x1, 0xA, 0x34, 0x1, 0xA, 0x1, 0x33, 0xFE, 0xCD, 0xFE, 0xF6, 0x2, 0xB5, 0xC1, 0xC1, 0xB5, 0x36, 0xB5, 0xC3, 0xC3, 0xB5, 0x77, 0xC4, 0xC4, 0x0, 0x1, 0x0, 0x9, 0x0, 0x0, 0x4, 0x72, 0x4, 0x8D, 0x0, 0x8, 0x0, 0x0, 0x21, 0x21, 0x1, 0x33, 0x1, 0x21, 0x1, 0x27, 0x7, 0x1, 0xB, 0xFE, 0xFE, 0x1, 0xB9, 0xF7, 0x1, 0xB9, 0xFE, 0xFF, 0xFE, 0xDF, 0x12, 0x14, 0x4, 0x8D, 0xFB, 0x73, 0x3, 0x57, 0x4C, 0x4F, 0x0, 0x3, 0x0, 0x43, 0x0, 0x0, 0x3, 0x56, 0x4, 0x8D, 0x0, 0x3, 0x0, 0x7, 0x0, 0xB, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x1, 0x15, 0x21, 0x35, 0x3, 0x56, 0xFC, 0xED, 0x2, 0xC9, 0xFD, 0x7E, 0x2, 0xCC, 0xFC, 0xED, 0x4, 0x8D, 0xC4, 0xC4, 0xFE, 0x32, 0xC3, 0xC3, 0xFE, 0x5, 0xC4, 0xC4, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x4, 0x62, 0x4, 0x8D, 0x0, 0x7, 0x0, 0x0, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x3, 0x6E, 0xFD, 0xFB, 0xF3, 0x3, 0xEC, 0x3, 0xC9, 0xFC, 0x37, 0x4, 0x8D, 0xFB, 0x73, 0x0, 0x1, 0x0, 0x45, 0x0, 0x1, 0x3, 0xE7, 0x4, 0x8D, 0x0, 0xC, 0x0, 0x0, 0x37, 0x35, 0x1, 0x1, 0x35, 0x21, 0x15, 0x21, 0x1, 0x15, 0x1, 0x21, 0x15, 0x45, 0x1, 0x3E, 0xFE, 0xC2, 0x3, 0x7B, 0xFD, 0xBB, 0x1, 0x16, 0xFE, 0xE5, 0x2, 0x71, 0x1, 0x98, 0x1, 0xB6, 0x1, 0xA7, 0x97, 0xC4, 0xFE, 0x90, 0x14, 0xFE, 0x7F, 0xC3, 0x0, 0x3, 0x0, 0x51, 0x0, 0x0, 0x5, 0x4D, 0x4, 0x8D, 0x0, 0x11, 0x0, 0x18, 0x0, 0x1F, 0x0, 0x0, 0x21, 0x23, 0x35, 0x26, 0x24, 0x35, 0x34, 0x24, 0x37, 0x35, 0x33, 0x15, 0x16, 0x4, 0x15, 0x14, 0x4, 0x7, 0x1, 0x6, 0x16, 0x17, 0x11, 0x6, 0x6, 0x5, 0x34, 0x26, 0x27, 0x11, 0x36, 0x36, 0x3, 0x49, 0xF2, 0xDF, 0xFE, 0xD9, 0x1, 0x27, 0xDF, 0xF2, 0xDE, 0x1, 0x26, 0xFE, 0xDA, 0xDE, 0xFD, 0xF9, 0x1, 0x93, 0x83, 0x83, 0x91, 0x3, 0x18, 0x90, 0x82, 0x82, 0x90, 0x6D, 0xD, 0xED, 0xDD, 0xDB, 0xEA, 0xD, 0x77, 0x77, 0xE, 0xE8, 0xDA, 0xDD, 0xEE, 0xE, 0x1, 0xD7, 0x8A, 0x84, 0x9, 0x2, 0x29, 0x9, 0x82, 0x85, 0x86, 0x81, 0x9, 0xFD, 0xD7, 0xA, 0x85, 0x0, 0x1, 0x0, 0x51, 0x0, 0x0, 0x5, 0x4, 0x4, 0x8D, 0x0, 0x16, 0x0, 0x0, 0x21, 0x23, 0x11, 0x26, 0x2, 0x11, 0x11, 0x33, 0x11, 0x12, 0x17, 0x11, 0x33, 0x11, 0x36, 0x36, 0x35, 0x11, 0x33, 0x11, 0x6, 0x2, 0x7, 0x3, 0x24, 0xF3, 0xE5, 0xFB, 0xF3, 0x6, 0xE7, 0xF3, 0x80, 0x6D, 0xF3, 0x3, 0xFB, 0xE2, 0x1, 0x18, 0x17, 0x1, 0x2B, 0x1, 0x5, 0x1, 0x2E, 0xFE, 0xC1, 0xFE, 0xBD, 0x2C, 0x2, 0xAE, 0xFD, 0x52, 0x18, 0xC2, 0xA6, 0x1, 0x2E, 0xFE, 0xC6, 0xFB, 0xFE, 0xDB, 0x1A, 0x0, 0x1, 0x0, 0x5F, 0x0, 0x0, 0x4, 0x84, 0x4, 0x9D, 0x0, 0x1F, 0x0, 0x0, 0x21, 0x21, 0x35, 0x33, 0x26, 0x26, 0x35, 0x35, 0x34, 0x0, 0x20, 0x0, 0x15, 0x15, 0x10, 0x7, 0x33, 0x15, 0x21, 0x35, 0x36, 0x13, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x10, 0x17, 0x2, 0x3C, 0xFE, 0x30, 0xB1, 0x59, 0x65, 0x1, 0x15, 0x1, 0xFA, 0x1, 0x16, 0xBC, 0xB6, 0xFE, 0x2F, 0xDE, 0x6, 0x88, 0x98, 0x96, 0x89, 0xEA, 0xC4, 0x4A, 0xE0, 0x8C, 0x22, 0xD3, 0x1, 0x2E, 0xFE, 0xD2, 0xD2, 0x23, 0xFE, 0xE7, 0x9D, 0xC4, 0xC8, 0x41, 0x1, 0x4A, 0x3B, 0x92, 0xB8, 0xB8, 0x92, 0x2A, 0xFE, 0xAB, 0x47, 0x0, 0x1, 0x0, 0x25, 0xFF, 0xEC, 0x5, 0x53, 0x4, 0x8D, 0x0, 0x18, 0x0, 0x0, 0x1, 0x14, 0x4, 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x36, 0x33, 0x32, 0x16, 0x5, 0x53, 0xFE, 0xFE, 0xD9, 0x72, 0x76, 0xE9, 0x81, 0x85, 0xF3, 0xFE, 0xA7, 0x3, 0xAC, 0xFE, 0xA0, 0x86, 0x91, 0xCE, 0xFD, 0x1, 0x69, 0xCA, 0xB3, 0xBD, 0x54, 0x69, 0xD9, 0x26, 0xFD, 0xE7, 0x3, 0xC9, 0xC4, 0xC4, 0xEC, 0x26, 0xC9, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x44, 0x4, 0x9D, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x6, 0x6, 0x23, 0x22, 0x0, 0x11, 0x35, 0x10, 0x0, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x3, 0x21, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x4, 0x43, 0xF, 0xFD, 0xE7, 0xED, 0xFE, 0xED, 0x1, 0x19, 0xEC, 0xE8, 0xF4, 0x13, 0xF3, 0xA, 0x6F, 0x83, 0xFA, 0x17, 0x1, 0x80, 0xFE, 0x80, 0x9, 0x80, 0x83, 0x80, 0x75, 0xB, 0x1, 0x85, 0xB2, 0xE3, 0x1, 0x2D, 0x1, 0x3, 0x4C, 0x1, 0x3, 0x1, 0x2E, 0xE9, 0xB3, 0x61, 0x78, 0xFE, 0xCF, 0xC3, 0x93, 0xA0, 0x6A, 0x68, 0x0, 0x2, 0x0, 0x25, 0x0, 0x0, 0x7, 0x15, 0x4, 0x8D, 0x0, 0x17, 0x0, 0x20, 0x0, 0x0, 0x33, 0x35, 0x37, 0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x6, 0x23, 0x21, 0x11, 0x21, 0x3, 0x2, 0x2, 0x7, 0x25, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x25, 0x27, 0x6B, 0x47, 0xA, 0x13, 0x3, 0x3B, 0xF9, 0xD0, 0x78, 0x7E, 0xF6, 0xD8, 0xFE, 0x1C, 0xFE, 0xA4, 0xE, 0xF, 0xA7, 0xDE, 0x3, 0xF1, 0xF1, 0x70, 0x6B, 0x6B, 0x70, 0xF1, 0xCD, 0x3, 0x8, 0xC3, 0xF6, 0x1, 0xFC, 0xFE, 0x6C, 0x2, 0x64, 0x69, 0xAA, 0xA8, 0xD8, 0x3, 0xC9, 0xFE, 0xA0, 0xFE, 0xC4, 0xFE, 0xD7, 0x4, 0xC4, 0x73, 0x4B, 0x49, 0x6A, 0x0, 0x2, 0x0, 0x76, 0x0, 0x0, 0x7, 0x19, 0x4, 0x8D, 0x0, 0x8, 0x0, 0x1C, 0x0, 0x0, 0x25, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x3, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x6, 0x23, 0x4, 0x5A, 0xF1, 0x70, 0x6B, 0x6B, 0x70, 0xF1, 0xF3, 0xFE, 0x2, 0xF3, 0xF3, 0x1, 0xFE, 0xF3, 0xF9, 0xD0, 0x78, 0x7E, 0xF6, 0xD8, 0xC4, 0x73, 0x4B, 0x49, 0x6A, 0xFD, 0xCB, 0x1, 0xDB, 0xFE, 0x25, 0x4, 0x8D, 0xFE, 0x12, 0x1, 0xEE, 0xFE, 0x6C, 0x2, 0x64, 0x69, 0xAA, 0xA8, 0xD8, 0x0, 0x1, 0x0, 0x25, 0x0, 0x0, 0x5, 0x53, 0x4, 0x8D, 0x0, 0x15, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x3, 0x77, 0x81, 0x85, 0xF3, 0xFE, 0xA7, 0x3, 0xAC, 0xFE, 0xA0, 0x86, 0x8F, 0xD0, 0xFD, 0xF3, 0x74, 0x2, 0x3F, 0x26, 0xFD, 0xE7, 0x3, 0xC9, 0xC4, 0xC4, 0xEC, 0x26, 0xC6, 0xE2, 0xFE, 0xA5, 0x1, 0x5B, 0x7D, 0x67, 0x0, 0x1, 0x0, 0x76, 0xFE, 0x9F, 0x4, 0x62, 0x4, 0x8D, 0x0, 0xB, 0x0, 0x0, 0x21, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x4, 0x62, 0xFE, 0x8A, 0xF3, 0xFE, 0x7D, 0xF3, 0x2, 0x5, 0xF4, 0xFE, 0x9F, 0x1, 0x61, 0x4, 0x8D, 0xFC, 0x37, 0x3, 0xC9, 0x0, 0x2, 0x0, 0x76, 0x0, 0x0, 0x4, 0x29, 0x4, 0x8D, 0x0, 0xB, 0x0, 0x14, 0x0, 0x0, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x33, 0x16, 0x16, 0x10, 0x6, 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x11, 0x76, 0x3, 0x3C, 0xFD, 0xB7, 0xF9, 0xD4, 0xF3, 0xF7, 0xD8, 0x71, 0x6B, 0x6B, 0x71, 0xF1, 0x4, 0x8D, 0xC2, 0xE0, 0x2, 0xC5, 0xFE, 0xAA, 0xCE, 0xC4, 0x69, 0x4E, 0x4A, 0x62, 0xFE, 0x9D, 0x0, 0x2, 0x0, 0x27, 0xFE, 0xAE, 0x5, 0x16, 0x4, 0x8D, 0x0, 0x5, 0x0, 0x14, 0x0, 0x0, 0x25, 0x21, 0x11, 0x21, 0x3, 0x2, 0x3, 0x11, 0x23, 0x13, 0x33, 0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x1, 0x9D, 0x1, 0xF0, 0xFE, 0xA1, 0x8, 0x11, 0xFA, 0xF4, 0x1, 0x5C, 0x67, 0x47, 0x6, 0xA, 0x3, 0x3E, 0x96, 0xF3, 0xC4, 0x3, 0x5, 0xFE, 0xEC, 0xFE, 0xC3, 0xFE, 0x88, 0xFE, 0xAE, 0x2, 0x16, 0x72, 0xEE, 0xCD, 0x1, 0x9C, 0xFC, 0x37, 0xFD, 0xEA, 0x1, 0x52, 0x0, 0x1, 0x0, 0x1B, 0x0, 0x0, 0x6, 0x20, 0x4, 0x8D, 0x0, 0x15, 0x0, 0x0, 0x21, 0x11, 0x23, 0x3, 0x21, 0x1, 0x1, 0x21, 0x13, 0x33, 0x11, 0x33, 0x11, 0x33, 0x13, 0x21, 0x1, 0x1, 0x21, 0x3, 0x23, 0x11, 0x2, 0xA4, 0x60, 0xFC, 0xFE, 0xD3, 0x1, 0x5C, 0xFE, 0xC3, 0x1, 0x1F, 0xF6, 0x55, 0xF3, 0x54, 0xF6, 0x1, 0x1F, 0xFE, 0xC3, 0x1, 0x5D, 0xFE, 0xD3, 0xFD, 0x5F, 0x1, 0xD6, 0xFE, 0x2A, 0x2, 0x55, 0x2, 0x38, 0xFE, 0x20, 0x1, 0xE0, 0xFE, 0x20, 0x1, 0xE0, 0xFD, 0xD1, 0xFD, 0xA2, 0x1, 0xD6, 0xFE, 0x2A, 0x0, 0x1, 0x0, 0x43, 0xFF, 0xF0, 0x3, 0xE8, 0x4, 0x9D, 0x0, 0x27, 0x0, 0x0, 0x5, 0x22, 0x26, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x9, 0x69, 0xD2, 0x8B, 0xF3, 0x5, 0x7A, 0x56, 0x77, 0x73, 0xE0, 0x94, 0x9D, 0xC5, 0x65, 0x76, 0x4F, 0x72, 0xF3, 0xFB, 0xBA, 0xCD, 0xFF, 0x6E, 0x5C, 0x6F, 0x6E, 0xFE, 0xEC, 0x10, 0x40, 0x97, 0x80, 0x50, 0x43, 0x57, 0x47, 0xA7, 0x3, 0xB0, 0x5, 0x93, 0x3E, 0x56, 0x3E, 0x43, 0x9B, 0xAB, 0x9F, 0x9E, 0x59, 0x8C, 0x26, 0x25, 0x90, 0x5C, 0xAA, 0xAA, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x4, 0x6E, 0x4, 0x8D, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x33, 0x11, 0x1, 0x33, 0x11, 0x23, 0x11, 0x1, 0x69, 0xF3, 0xF3, 0x2, 0x12, 0xF3, 0xF3, 0x4, 0x8D, 0xFC, 0xDF, 0x3, 0x21, 0xFB, 0x73, 0x3, 0x22, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x4, 0x40, 0x4, 0x8D, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x3, 0x12, 0xFE, 0xC1, 0x6A, 0xF3, 0xF3, 0x64, 0x1, 0x38, 0x1, 0x1C, 0xFE, 0x72, 0x1, 0xAD, 0x1, 0xD6, 0xFE, 0x2A, 0x4, 0x8D, 0xFE, 0x20, 0x1, 0xE0, 0xFD, 0xC5, 0xFD, 0xAE, 0x0, 0x1, 0x0, 0x25, 0x0, 0x0, 0x4, 0x56, 0x4, 0x8D, 0x0, 0xF, 0x0, 0x0, 0x33, 0x35, 0x37, 0x36, 0x36, 0x37, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0x3, 0x2, 0x2, 0x7, 0x25, 0x27, 0x6A, 0x47, 0xA, 0x14, 0x3, 0x3B, 0xF3, 0xFE, 0xA3, 0xE, 0x10, 0xA7, 0xDA, 0xCD, 0x4, 0xC, 0xBB, 0xFB, 0x1, 0xFA, 0xFB, 0x73, 0x3, 0xC9, 0xFE, 0xA0, 0xFE, 0xC6, 0xFE, 0xD6, 0x5, 0x0, 0x1, 0x0, 0x20, 0xFF, 0xEC, 0x4, 0x3A, 0x4, 0x8D, 0x0, 0xF, 0x0, 0x0, 0x5, 0x27, 0x37, 0x17, 0x32, 0x36, 0x37, 0x1, 0x21, 0x13, 0x17, 0x13, 0x21, 0x1, 0x6, 0x6, 0x1, 0x40, 0x67, 0x2, 0x57, 0x3B, 0x41, 0x16, 0xFE, 0x5C, 0x1, 0xE, 0xFB, 0x13, 0xF4, 0x1, 0xA, 0xFE, 0x6C, 0x34, 0x8E, 0x14, 0x5, 0xC1, 0x4, 0x38, 0x29, 0x3, 0x7E, 0xFD, 0xBE, 0x37, 0x2, 0x79, 0xFC, 0x76, 0x73, 0xA4, 0x0, 0x1, 0x0, 0x76, 0xFE, 0xAE, 0x5, 0x25, 0x4, 0x8D, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x5, 0x11, 0xDE, 0xFC, 0x43, 0xF3, 0x2, 0x5, 0xF4, 0xC3, 0xFE, 0xAE, 0x1, 0x52, 0x4, 0x8D, 0xFC, 0x37, 0x3, 0xC9, 0xFC, 0x37, 0x0, 0x1, 0x0, 0x41, 0x0, 0x0, 0x4, 0x16, 0x4, 0x8D, 0x0, 0x11, 0x0, 0x0, 0x21, 0x23, 0x11, 0x6, 0x23, 0x22, 0x24, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x4, 0x16, 0xF3, 0x84, 0x82, 0xDB, 0xFE, 0xFF, 0xF3, 0x75, 0x74, 0x81, 0x85, 0xF3, 0x1, 0xAB, 0x26, 0xC5, 0xE2, 0x1, 0x61, 0xFE, 0xA0, 0x7C, 0x69, 0x26, 0x2, 0x1F, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x6, 0xF, 0x4, 0x8D, 0x0, 0xB, 0x0, 0x0, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x76, 0xF3, 0x1, 0x60, 0xF3, 0x1, 0x60, 0xF3, 0x4, 0x8D, 0xFC, 0x37, 0x3, 0xC9, 0xFC, 0x37, 0x3, 0xC9, 0xFB, 0x73, 0x0, 0x1, 0x0, 0x76, 0xFE, 0xAE, 0x6, 0xD2, 0x4, 0x8D, 0x0, 0xF, 0x0, 0x0, 0x1, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x6, 0xBE, 0xDE, 0xFA, 0x96, 0xF3, 0x1, 0x60, 0xF3, 0x1, 0x60, 0xF3, 0xC3, 0xFE, 0xAE, 0x1, 0x52, 0x4, 0x8D, 0xFC, 0x37, 0x3, 0xC9, 0xFC, 0x37, 0x3, 0xC9, 0xFC, 0x37, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x5, 0x1B, 0x4, 0x8D, 0x0, 0xD, 0x0, 0x16, 0x0, 0x0, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x6, 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x11, 0x1, 0x69, 0xFE, 0xA1, 0x2, 0x52, 0xF9, 0xD0, 0x78, 0x7E, 0xF6, 0xD8, 0x71, 0x6B, 0x6B, 0x71, 0xF1, 0x3, 0xC9, 0xC4, 0xFE, 0x6C, 0x2, 0x64, 0x69, 0xAA, 0xA8, 0xD8, 0xC4, 0x73, 0x4B, 0x49, 0x6A, 0xFE, 0x8F, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x5, 0xAA, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x84, 0x0, 0x0, 0x0, 0x7, 0x7, 0x5F, 0x4, 0x32, 0x0, 0x0, 0x0, 0x2, 0x0, 0x76, 0x0, 0x0, 0x4, 0x29, 0x4, 0x8D, 0x0, 0xB, 0x0, 0x14, 0x0, 0x0, 0x33, 0x11, 0x33, 0x11, 0x33, 0x16, 0x16, 0x17, 0x15, 0x14, 0x6, 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x11, 0x76, 0xF3, 0xF5, 0xD5, 0xF5, 0x1, 0xF7, 0xD8, 0x71, 0x6B, 0x6B, 0x71, 0xF1, 0x4, 0x8D, 0xFE, 0x6C, 0x1, 0xCF, 0xA7, 0x2, 0xA8, 0xD8, 0xC4, 0x73, 0x4B, 0x49, 0x6A, 0xFE, 0x8F, 0x0, 0x1, 0x0, 0x3D, 0xFF, 0xF0, 0x4, 0x31, 0x4, 0x9D, 0x0, 0x1C, 0x0, 0x0, 0x5, 0x22, 0x26, 0x27, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x21, 0x35, 0x21, 0x2, 0x23, 0x22, 0x6, 0x7, 0x23, 0x36, 0x36, 0x33, 0x32, 0x0, 0x11, 0x15, 0x10, 0x0, 0x2, 0x30, 0xE7, 0xFD, 0xF, 0xF3, 0xC, 0x74, 0x80, 0x83, 0x80, 0x9, 0xFE, 0x80, 0x1, 0x80, 0x17, 0xFA, 0x82, 0x6F, 0xB, 0xF2, 0x12, 0xF4, 0xE8, 0xED, 0x1, 0x19, 0xFE, 0xED, 0x10, 0xE3, 0xB2, 0x68, 0x6A, 0xA0, 0x93, 0xC3, 0x1, 0x31, 0x78, 0x61, 0xB3, 0xE9, 0xFE, 0xD2, 0xFE, 0xFD, 0x4C, 0xFE, 0xFD, 0xFE, 0xD3, 0x0, 0x2, 0x0, 0x76, 0xFF, 0xF0, 0x6, 0x42, 0x4, 0x9D, 0x0, 0x13, 0x0, 0x21, 0x0, 0x0, 0x5, 0x22, 0x0, 0x27, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x36, 0x0, 0x33, 0x32, 0x0, 0x11, 0x15, 0x10, 0x0, 0x13, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x4, 0x33, 0xD9, 0xFE, 0xE1, 0x16, 0xBC, 0xF3, 0xF3, 0xBC, 0x14, 0x1, 0x1F, 0xD9, 0xEC, 0x1, 0x25, 0xFE, 0xDD, 0x30, 0x97, 0x87, 0x85, 0x98, 0x9A, 0x85, 0x87, 0x95, 0x10, 0x1, 0x9, 0xE9, 0xFE, 0x1E, 0x4, 0x8D, 0xFE, 0x19, 0xEB, 0x1, 0xC, 0xFE, 0xCD, 0xFE, 0xF6, 0x34, 0xFE, 0xF6, 0xFE, 0xCE, 0x2, 0x72, 0xB5, 0xC1, 0xC1, 0xB5, 0x36, 0xB5, 0xC3, 0xC3, 0xB5, 0x0, 0x2, 0x0, 0x44, 0x0, 0x0, 0x4, 0x12, 0x4, 0x8D, 0x0, 0x7, 0x0, 0x14, 0x0, 0x0, 0x1, 0x11, 0x23, 0x22, 0x6, 0x14, 0x16, 0x33, 0x13, 0x11, 0x23, 0x3, 0x21, 0x1, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x3, 0x1F, 0xDC, 0x6A, 0x63, 0x63, 0x6A, 0xDC, 0xF1, 0xE6, 0xFE, 0xFC, 0x1, 0x16, 0xD7, 0xEE, 0xD3, 0x1, 0xCE, 0x2, 0x80, 0x1, 0x49, 0x5E, 0x92, 0x59, 0xFD, 0x80, 0x1, 0xBD, 0xFE, 0x43, 0x2, 0xC, 0x55, 0xD0, 0xA3, 0xB9, 0xFB, 0x73, 0x0, 0x1, 0x0, 0xA, 0x0, 0x0, 0x4, 0x0, 0x4, 0x8D, 0x0, 0xD, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x2, 0xA8, 0xD6, 0xF3, 0xD5, 0xD5, 0x3, 0x21, 0xFD, 0xD2, 0xD6, 0x1, 0xE6, 0xFE, 0x1A, 0x1, 0xE6, 0xAB, 0x1, 0xFC, 0xC4, 0xFE, 0xC8, 0x0, 0x1, 0x0, 0x1B, 0xFE, 0xAE, 0x6, 0x6D, 0x4, 0x8D, 0x0, 0x19, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x3, 0x23, 0x11, 0x23, 0x11, 0x23, 0x3, 0x21, 0x1, 0x1, 0x21, 0x13, 0x33, 0x11, 0x33, 0x11, 0x33, 0x13, 0x21, 0x1, 0x13, 0x33, 0x6, 0x6D, 0xD0, 0xAA, 0xFD, 0x5F, 0xF3, 0x60, 0xFC, 0xFE, 0xD3, 0x1, 0x5C, 0xFE, 0xC3, 0x1, 0x1F, 0xF6, 0x55, 0xF3, 0x54, 0xF6, 0x1, 0x1F, 0xFE, 0xC3, 0xED, 0xBD, 0xFE, 0xAE, 0x1, 0x52, 0x1, 0xD6, 0xFE, 0x2A, 0x1, 0xD6, 0xFE, 0x2A, 0x2, 0x55, 0x2, 0x38, 0xFE, 0x20, 0x1, 0xE0, 0xFE, 0x20, 0x1, 0xE0, 0xFD, 0xD1, 0xFE, 0x64, 0x0, 0x1, 0x0, 0x76, 0xFE, 0xAE, 0x4, 0x7D, 0x4, 0x8D, 0x0, 0x10, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x33, 0x4, 0x7D, 0xD0, 0x9B, 0xFE, 0xC1, 0x6A, 0xF3, 0xF3, 0x64, 0x1, 0x38, 0x1, 0x1C, 0xFE, 0x72, 0x1, 0x21, 0xC9, 0xFE, 0xAE, 0x1, 0x52, 0x1, 0xD6, 0xFE, 0x2A, 0x4, 0x8D, 0xFE, 0x20, 0x1, 0xE0, 0xFD, 0xC5, 0xFE, 0x70, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x4, 0xFE, 0x4, 0x8D, 0x0, 0x14, 0x0, 0x0, 0x1, 0x35, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x35, 0x33, 0x15, 0x33, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x23, 0x15, 0x1, 0xB1, 0x48, 0xF3, 0xF3, 0x48, 0xA2, 0x37, 0x1, 0x38, 0x1, 0x1D, 0xFE, 0x72, 0x1, 0xAD, 0xFE, 0xD1, 0xFE, 0xC2, 0x3E, 0x1, 0xB, 0xCB, 0xFE, 0x2A, 0x4, 0x8D, 0xFE, 0x20, 0xDE, 0xDE, 0x1, 0xE0, 0xFD, 0xC5, 0xFD, 0xAE, 0x1, 0xD6, 0xCB, 0x0, 0x1, 0x0, 0x25, 0x0, 0x0, 0x5, 0x4F, 0x4, 0x8D, 0x0, 0xE, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x4, 0x20, 0xFE, 0xC2, 0x6A, 0xF3, 0xFE, 0xA0, 0x2, 0x53, 0x63, 0x1, 0x38, 0x1, 0x1D, 0xFE, 0x72, 0x1, 0xAD, 0x1, 0xD6, 0xFE, 0x2A, 0x3, 0xCA, 0xC3, 0xFE, 0x20, 0x1, 0xE0, 0xFD, 0xC6, 0xFD, 0xAD, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEB, 0x5, 0x99, 0x4, 0xA5, 0x0, 0xA, 0x0, 0x2D, 0x0, 0x0, 0x1, 0x10, 0x17, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x3, 0x1, 0x22, 0x27, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x33, 0x15, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x37, 0x26, 0x3, 0x35, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x7, 0x16, 0x33, 0x3, 0x2D, 0xBE, 0xA0, 0x3, 0x56, 0x58, 0xAE, 0x5, 0x2, 0x6C, 0xE3, 0xAF, 0x8F, 0xAB, 0xFE, 0xDC, 0xFE, 0xA7, 0x1, 0xA, 0xD9, 0x70, 0x80, 0xCC, 0xBE, 0x36, 0xC0, 0x2, 0xE0, 0xBC, 0xC2, 0xE2, 0xA3, 0x54, 0x67, 0x2, 0x85, 0xFE, 0xF2, 0x6E, 0x73, 0xF1, 0x3D, 0xA2, 0x8E, 0xFE, 0xE6, 0xFD, 0x2F, 0x3A, 0x3E, 0x1, 0x3E, 0x1, 0x22, 0x2E, 0x1, 0x2, 0x1, 0x2A, 0xCB, 0xB5, 0xB1, 0x26, 0xCA, 0xCE, 0x2, 0xAB, 0x1, 0x1E, 0x2C, 0xED, 0x1, 0xA, 0xFE, 0xFE, 0xF2, 0x44, 0xFF, 0xAF, 0xB, 0xFF, 0xFF, 0x0, 0x5, 0x0, 0x0, 0x4, 0x37, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x4F, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0x0, 0x3B, 0xFE, 0xD4, 0x0, 0x1, 0x0, 0x16, 0xFE, 0xAE, 0x4, 0x8C, 0x4, 0x8D, 0x0, 0xF, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x3, 0x3, 0x21, 0x1, 0x1, 0x21, 0x13, 0x13, 0x21, 0x1, 0x1, 0x33, 0x4, 0x8C, 0xD0, 0x92, 0xFF, 0xFA, 0xFE, 0xE5, 0x1, 0x81, 0xFE, 0x87, 0x1, 0x1A, 0xF0, 0xF2, 0x1, 0x1B, 0xFE, 0x89, 0x1, 0x9, 0xC5, 0xFE, 0xAE, 0x1, 0x52, 0x1, 0x99, 0xFE, 0x67, 0x2, 0x4B, 0x2, 0x42, 0xFE, 0x6E, 0x1, 0x92, 0xFD, 0xBE, 0xFE, 0x77, 0x0, 0x1, 0x0, 0x25, 0xFE, 0xAE, 0x6, 0x2E, 0x4, 0x8D, 0x0, 0xF, 0x0, 0x0, 0x25, 0x3, 0x23, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x6, 0x2E, 0x14, 0xDD, 0xFC, 0x43, 0xFE, 0xA5, 0x3, 0xA2, 0xFE, 0xAC, 0x2, 0x5, 0xF3, 0xC4, 0xFD, 0xEA, 0x1, 0x52, 0x3, 0xC9, 0xC4, 0xC4, 0xFC, 0xFB, 0x3, 0xC9, 0xFC, 0x37, 0x0, 0x1, 0x0, 0x41, 0x0, 0x0, 0x4, 0x16, 0x4, 0x8D, 0x0, 0x16, 0x0, 0x0, 0x21, 0x23, 0x11, 0x6, 0x7, 0x15, 0x23, 0x35, 0x26, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x35, 0x33, 0x15, 0x36, 0x37, 0x11, 0x33, 0x4, 0x16, 0xF3, 0x50, 0x52, 0xA3, 0xBF, 0xDE, 0xF3, 0xAA, 0xA3, 0x4F, 0x53, 0xF3, 0x1, 0xAB, 0x17, 0x9, 0xCC, 0xC8, 0xD, 0xC7, 0xD1, 0x1, 0x61, 0xFE, 0xA0, 0xC8, 0x19, 0xF3, 0xF1, 0x8, 0x18, 0x2, 0x1F, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x4, 0x4B, 0x4, 0x8D, 0x0, 0x11, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x4, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0x6F, 0x81, 0x85, 0xF3, 0xF3, 0x84, 0x82, 0xDC, 0x1, 0x0, 0xF3, 0x74, 0x2, 0x46, 0x26, 0xFD, 0xE0, 0x4, 0x8D, 0xFE, 0x57, 0x26, 0xC6, 0xE2, 0xFE, 0x9E, 0x1, 0x62, 0x7D, 0x67, 0x0, 0x2, 0x0, 0xB, 0xFF, 0xF0, 0x5, 0xA8, 0x4, 0xA4, 0x0, 0x7, 0x0, 0x23, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x34, 0x26, 0x1, 0x6, 0x6, 0x23, 0x20, 0x0, 0x27, 0x26, 0x26, 0x35, 0x33, 0x14, 0x16, 0x17, 0x36, 0x0, 0x33, 0x32, 0x0, 0x13, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x3, 0x92, 0x82, 0x9D, 0x9, 0x2, 0x4B, 0x95, 0x1, 0x13, 0x20, 0xBD, 0x8D, 0xFE, 0xF8, 0xFE, 0xC3, 0xD, 0xB8, 0xB4, 0xC1, 0x54, 0x57, 0xF, 0x1, 0x33, 0xD8, 0xFF, 0x1, 0x16, 0x2, 0xFC, 0xC2, 0x7, 0xA3, 0xB5, 0x6A, 0x91, 0x2E, 0x3, 0xDE, 0xA5, 0x8C, 0x17, 0x85, 0x95, 0xFC, 0x5F, 0x12, 0x3B, 0x1, 0x12, 0xE9, 0xD, 0xE6, 0xB0, 0x5C, 0x76, 0xC, 0xE4, 0x1, 0x10, 0xFE, 0xE8, 0xFE, 0xFF, 0xA1, 0x88, 0xA7, 0x29, 0x13, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x82, 0x4, 0xA4, 0x0, 0x15, 0x0, 0x1D, 0x0, 0x0, 0x5, 0x22, 0x0, 0x3, 0x35, 0x21, 0x26, 0x26, 0x23, 0x22, 0x6, 0x7, 0x27, 0x36, 0x36, 0x33, 0x20, 0x0, 0x15, 0x15, 0x14, 0x0, 0x27, 0x32, 0x36, 0x37, 0x21, 0x15, 0x14, 0x16, 0x2, 0x66, 0xFE, 0xFE, 0xEA, 0x2, 0x3, 0x3E, 0x7, 0xA4, 0xB5, 0x69, 0x90, 0x2F, 0x41, 0x22, 0xC1, 0x92, 0x1, 0xD, 0x1, 0x3B, 0xFE, 0xC7, 0xE3, 0x82, 0x9D, 0x9, 0xFD, 0xB4, 0x96, 0x10, 0x1, 0x18, 0x1, 0x1, 0xA1, 0x89, 0xA7, 0x2A, 0x13, 0xBA, 0x12, 0x3B, 0xFE, 0xD9, 0xFB, 0x75, 0xF5, 0xFE, 0xD8, 0xC6, 0xA5, 0x8C, 0x17, 0x85, 0x95, 0x0, 0x1, 0x0, 0x43, 0xFF, 0xEC, 0x3, 0xE9, 0x4, 0x8D, 0x0, 0x19, 0x0, 0x0, 0x5, 0x22, 0x26, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x23, 0x35, 0x1, 0x21, 0x35, 0x21, 0x17, 0x1, 0x16, 0x16, 0x15, 0x14, 0x4, 0x2, 0x9, 0x69, 0xD2, 0x8B, 0xF2, 0x5, 0x7A, 0x5B, 0xE6, 0xDE, 0x8F, 0x1, 0x6, 0xFD, 0xDD, 0x3, 0x53, 0x1, 0xFE, 0xC6, 0xB3, 0xB1, 0xFE, 0xEB, 0x14, 0x42, 0x98, 0x81, 0x50, 0x49, 0xAD, 0xAC, 0x4, 0xBB, 0x1, 0x3, 0xC4, 0x9B, 0xFE, 0xC0, 0x16, 0xCC, 0x7C, 0xB6, 0xB2, 0x0, 0x3, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x4, 0x9D, 0x0, 0xD, 0x0, 0x12, 0x0, 0x18, 0x0, 0x0, 0x1, 0x10, 0x0, 0x23, 0x22, 0x0, 0x11, 0x35, 0x10, 0x0, 0x33, 0x32, 0x0, 0x11, 0x1, 0x22, 0x3, 0x21, 0x2, 0x3, 0x32, 0x13, 0x21, 0x16, 0x16, 0x4, 0x6F, 0xFE, 0xDE, 0xEC, 0xE9, 0xFE, 0xD8, 0x1, 0x26, 0xE9, 0xEC, 0x1, 0x24, 0xFD, 0xF0, 0xFD, 0x1D, 0x2, 0x35, 0x1D, 0xFC, 0xFA, 0x1F, 0xFD, 0xCC, 0xF, 0x95, 0x2, 0x2C, 0xFE, 0xF6, 0xFE, 0xCE, 0x1, 0x32, 0x1, 0xA, 0x34, 0x1, 0xA, 0x1, 0x33, 0xFE, 0xCD, 0xFE, 0xF6, 0x1, 0x78, 0xFE, 0xCF, 0x1, 0x31, 0xFC, 0xDC, 0x1, 0x2F, 0x92, 0x9D, 0x0, 0x1, 0x0, 0x39, 0x0, 0x0, 0x4, 0x1A, 0x4, 0x9D, 0x0, 0x27, 0x0, 0x0, 0x21, 0x21, 0x35, 0x33, 0x36, 0x37, 0x23, 0x35, 0x33, 0x35, 0x27, 0x23, 0x35, 0x33, 0x27, 0x26, 0x36, 0x33, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x17, 0x17, 0x21, 0x15, 0x21, 0x17, 0x17, 0x21, 0x15, 0x21, 0x6, 0x7, 0x21, 0x4, 0x1A, 0xFC, 0x64, 0xA, 0x35, 0x12, 0x96, 0xA0, 0x2, 0x9E, 0x99, 0x1, 0x7, 0xDD, 0xBA, 0xCD, 0xCE, 0xF3, 0x62, 0x45, 0x4C, 0x57, 0x4, 0x2, 0x1, 0x83, 0xFE, 0x82, 0x3, 0x1, 0x1, 0x7A, 0xFE, 0x74, 0x13, 0x25, 0x2, 0x96, 0xC4, 0xF, 0x6A, 0x93, 0xF, 0x49, 0x93, 0x27, 0xD2, 0xE9, 0xD7, 0xAE, 0x6B, 0x55, 0x7E, 0x78, 0x27, 0x93, 0x42, 0x16, 0x93, 0x45, 0x34, 0x0, 0x1, 0x0, 0x47, 0xFF, 0xF0, 0x3, 0xB1, 0x4, 0x9E, 0x0, 0x21, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x24, 0x27, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x36, 0x24, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x16, 0x33, 0x32, 0x37, 0x3, 0xB0, 0x72, 0x71, 0xD3, 0xFE, 0xFD, 0x19, 0x97, 0x91, 0x91, 0x97, 0x1A, 0x1, 0x1, 0xD2, 0x6C, 0x7A, 0x17, 0x5E, 0x71, 0xD6, 0x23, 0x1, 0x7D, 0xFE, 0x7C, 0x1, 0x84, 0xFE, 0x83, 0x22, 0xD9, 0x55, 0x73, 0xF, 0x1F, 0xD1, 0xC3, 0x93, 0x5B, 0x93, 0xC5, 0xD4, 0x20, 0xBE, 0x1B, 0xD6, 0x93, 0x5B, 0x93, 0xD1, 0x1B, 0x0, 0x4, 0x0, 0x76, 0x0, 0x0, 0x7, 0xC7, 0x4, 0x9E, 0x0, 0xC, 0x0, 0x1A, 0x0, 0x24, 0x0, 0x28, 0x0, 0x0, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x11, 0x23, 0x1, 0x11, 0x23, 0x11, 0x33, 0x1, 0x11, 0x1, 0x15, 0x21, 0x35, 0x5, 0x12, 0xBB, 0x9F, 0xA1, 0xBA, 0xB9, 0xFE, 0xC0, 0xBC, 0xAF, 0x55, 0x58, 0x56, 0x54, 0x55, 0x57, 0x56, 0x55, 0xFE, 0xA6, 0xF2, 0xFD, 0xF4, 0xF3, 0xF3, 0x2, 0xC, 0x4, 0x13, 0xFD, 0xC6, 0x3, 0x4F, 0x92, 0xBD, 0xBD, 0x92, 0x4C, 0x92, 0xBC, 0xBC, 0x92, 0x51, 0x6B, 0x6B, 0x51, 0x4C, 0x50, 0x6B, 0x6B, 0x50, 0x1, 0x3E, 0xFB, 0x73, 0x3, 0x1C, 0xFC, 0xE4, 0x4, 0x8D, 0xFC, 0xE4, 0x3, 0x1C, 0xFC, 0xD1, 0x95, 0x95, 0x0, 0x2, 0x0, 0x4D, 0xFF, 0xEE, 0x4, 0x50, 0x4, 0x9D, 0x0, 0x13, 0x0, 0x28, 0x0, 0x0, 0x13, 0x35, 0x21, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x23, 0x10, 0x21, 0x32, 0x16, 0x15, 0x14, 0x7, 0x33, 0x15, 0x1, 0x22, 0x26, 0x35, 0x34, 0x37, 0x23, 0x35, 0x21, 0x15, 0x21, 0x6, 0x15, 0x14, 0x33, 0x32, 0x36, 0x37, 0x33, 0x14, 0x6, 0x4E, 0x2, 0x87, 0x2B, 0x4E, 0x57, 0xAB, 0x3, 0xF2, 0x1, 0xA1, 0xD2, 0xC4, 0x2D, 0x8B, 0xFE, 0x13, 0xEB, 0xD6, 0x2E, 0x83, 0x4, 0x2, 0xFD, 0x76, 0x2A, 0xC4, 0x4C, 0x73, 0x2, 0xF2, 0xED, 0x2, 0x72, 0x93, 0x29, 0x41, 0x2D, 0x3F, 0x7A, 0x1, 0x3C, 0xA0, 0x74, 0x45, 0x3F, 0x93, 0xFD, 0x7C, 0xA0, 0x7B, 0x48, 0x3B, 0x93, 0x93, 0x28, 0x48, 0x6B, 0x32, 0x47, 0xA6, 0x96, 0x0, 0x2, 0x0, 0x28, 0x0, 0x0, 0x4, 0xAA, 0x4, 0x8D, 0x0, 0x8, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x13, 0x21, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x23, 0x15, 0x21, 0x1, 0xEB, 0xF8, 0x6D, 0x67, 0x67, 0x6D, 0x14, 0xFE, 0xF4, 0xF3, 0xD0, 0xD0, 0xD0, 0xD0, 0x1, 0xEB, 0xD5, 0xF2, 0xF2, 0xD5, 0xF8, 0x1, 0xC, 0x3, 0xCA, 0xFE, 0x89, 0x73, 0x49, 0x4A, 0x71, 0xFC, 0xCF, 0x99, 0x99, 0xB7, 0x4D, 0xB6, 0x2, 0x3A, 0xD4, 0xA5, 0xA6, 0xD1, 0x4D, 0x0, 0x2, 0x0, 0x25, 0x0, 0x0, 0x3, 0xD1, 0x4, 0x8D, 0x0, 0x3, 0x0, 0xB, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x3, 0xD1, 0xFC, 0x54, 0x3, 0xAC, 0xFE, 0xA1, 0xF3, 0xFE, 0xA6, 0x3, 0xAC, 0x4, 0x8D, 0xC3, 0xC3, 0xFE, 0x18, 0xFD, 0x5B, 0x2, 0xA5, 0xC3, 0x0, 0x1, 0x0, 0x37, 0xFF, 0xF5, 0x2, 0xA9, 0x3, 0x20, 0x0, 0x24, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x1, 0x69, 0x70, 0xC2, 0xBB, 0x45, 0x3B, 0x3F, 0x3E, 0x86, 0x5C, 0x5C, 0x78, 0x36, 0x3E, 0x2F, 0x41, 0xBA, 0xAD, 0x79, 0x89, 0xAA, 0x87, 0x94, 0xB7, 0xB, 0x70, 0x80, 0x25, 0x36, 0x38, 0x2A, 0x64, 0x2, 0x80, 0x2, 0x5F, 0x23, 0x35, 0x27, 0x23, 0x6B, 0x74, 0x73, 0x6E, 0x77, 0x33, 0x29, 0x8F, 0x6F, 0x79, 0x0, 0x2, 0x0, 0x35, 0x0, 0x0, 0x2, 0xBF, 0x3, 0x15, 0x0, 0x3, 0x0, 0xE, 0x0, 0x0, 0x13, 0x33, 0x35, 0x7, 0x1, 0x23, 0x15, 0x23, 0x35, 0x21, 0x27, 0x1, 0x33, 0x11, 0x33, 0xEB, 0xBA, 0xE, 0x1, 0x28, 0x60, 0xBA, 0xFE, 0x9A, 0xA, 0x1, 0x6E, 0xBC, 0x60, 0x1, 0x3B, 0xF3, 0x17, 0xFE, 0x8D, 0xA4, 0xA4, 0x78, 0x1, 0xF9, 0xFE, 0x26, 0x0, 0x1, 0x0, 0x4F, 0xFF, 0xF5, 0x2, 0xAE, 0x3, 0x15, 0x0, 0x1B, 0x0, 0x0, 0x13, 0x27, 0x13, 0x21, 0x15, 0x21, 0x7, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x27, 0x33, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0xF7, 0x94, 0x34, 0x1, 0xEC, 0xFE, 0xAC, 0x15, 0x44, 0x42, 0x82, 0x8C, 0x93, 0x9B, 0x74, 0xB9, 0x4, 0xB9, 0x7, 0x71, 0x41, 0x33, 0x84, 0x34, 0x34, 0x1, 0x5B, 0x25, 0x1, 0x95, 0x95, 0x95, 0x1C, 0x87, 0x7A, 0x6A, 0xA7, 0x7A, 0x6D, 0x52, 0x4A, 0x33, 0x7C, 0x1B, 0x0, 0x2, 0x0, 0x4E, 0xFF, 0xF5, 0x2, 0xB9, 0x3, 0x22, 0x0, 0x13, 0x0, 0x1E, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x35, 0x34, 0x36, 0x33, 0x33, 0x15, 0x22, 0x6, 0x7, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x27, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0x7, 0x15, 0x14, 0x1, 0x8B, 0x8E, 0xAF, 0xFC, 0xCC, 0x1C, 0x84, 0x94, 0xF, 0x46, 0x6C, 0x7D, 0x7F, 0xA5, 0x8E, 0x37, 0x43, 0x7A, 0x2D, 0x43, 0xF, 0xB, 0xA2, 0x9D, 0x34, 0xDF, 0xDB, 0x98, 0x55, 0x6E, 0x46, 0x95, 0x73, 0x74, 0x9C, 0x95, 0x48, 0x34, 0x73, 0x24, 0x18, 0x23, 0x90, 0x0, 0x1, 0x0, 0x37, 0x0, 0x0, 0x2, 0xAE, 0x3, 0x15, 0x0, 0x6, 0x0, 0x0, 0x1, 0x15, 0x1, 0x23, 0x1, 0x21, 0x35, 0x2, 0xAE, 0xFE, 0xAD, 0xC4, 0x1, 0x53, 0xFE, 0x4D, 0x3, 0x15, 0x68, 0xFD, 0x53, 0x2, 0x7F, 0x96, 0x0, 0x3, 0x0, 0x4C, 0xFF, 0xF5, 0x2, 0xAA, 0x3, 0x20, 0x0, 0x13, 0x0, 0x1A, 0x0, 0x23, 0x0, 0x0, 0x5, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x16, 0x15, 0x14, 0x6, 0x3, 0x34, 0x23, 0x22, 0x15, 0x14, 0x32, 0x17, 0x34, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x1, 0x7B, 0x81, 0xAE, 0x85, 0x73, 0xA0, 0x7C, 0x7D, 0xA0, 0x72, 0x85, 0xAC, 0x21, 0x63, 0x61, 0xC4, 0x14, 0x42, 0x35, 0x74, 0x75, 0x76, 0xB, 0x72, 0x73, 0x82, 0x3B, 0x39, 0x72, 0x6D, 0x71, 0x71, 0x6D, 0x73, 0x38, 0x3B, 0x82, 0x73, 0x72, 0x2, 0x41, 0x55, 0x55, 0x58, 0xF4, 0x2E, 0x30, 0x5E, 0x60, 0x0, 0x2, 0x0, 0x47, 0xFF, 0xF7, 0x2, 0xA4, 0x3, 0x20, 0x0, 0x13, 0x0, 0x1D, 0x0, 0x0, 0x17, 0x35, 0x32, 0x36, 0x37, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x15, 0x14, 0x6, 0x7, 0x13, 0x32, 0x37, 0x35, 0x34, 0x23, 0x22, 0x6, 0x15, 0x14, 0xD5, 0x85, 0x81, 0xC, 0x43, 0x59, 0x7C, 0x88, 0xA5, 0x88, 0x87, 0xA9, 0xEA, 0xD2, 0x92, 0x4D, 0x23, 0x76, 0x36, 0x3E, 0x9, 0x94, 0x49, 0x62, 0x39, 0x8C, 0x7C, 0x74, 0xA7, 0xA1, 0xA2, 0x34, 0xE4, 0xCD, 0x1, 0x1, 0x92, 0x34, 0x45, 0x88, 0x4F, 0x38, 0x7A, 0x0, 0x1, 0x0, 0x90, 0x2, 0x87, 0x3, 0x2E, 0x3, 0x32, 0x0, 0x3, 0x0, 0x0, 0x1, 0x15, 0x21, 0x35, 0x3, 0x2E, 0xFD, 0x62, 0x3, 0x32, 0xAB, 0xAB, 0x0, 0x3, 0x0, 0x96, 0x4, 0x48, 0x2, 0xA2, 0x6, 0x96, 0x0, 0x3, 0x0, 0xC, 0x0, 0x17, 0x0, 0x0, 0x1, 0x37, 0x33, 0x7, 0x5, 0x34, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x6, 0x1, 0x18, 0xA5, 0xE5, 0xF5, 0xFE, 0xE9, 0x6F, 0x9A, 0x6B, 0x6B, 0x9A, 0x6F, 0x64, 0x33, 0x25, 0x24, 0x30, 0x54, 0x25, 0x33, 0x5, 0xD3, 0xC3, 0xC3, 0xDD, 0x4D, 0x64, 0x64, 0x9A, 0x61, 0x62, 0x4C, 0x25, 0x31, 0x31, 0x25, 0x59, 0x32, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x4, 0x8D, 0x0, 0xB, 0x0, 0x0, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x76, 0x3, 0x3C, 0xFD, 0xB7, 0x1, 0xF6, 0xFE, 0xA, 0x2, 0x4D, 0x4, 0x8D, 0xC4, 0xFE, 0xF3, 0xC3, 0xFE, 0xCA, 0xC3, 0x0, 0x3, 0x0, 0xA, 0xFE, 0x4A, 0x4, 0x1C, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x37, 0x0, 0x44, 0x0, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x14, 0x6, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x27, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x21, 0x17, 0x23, 0x16, 0x15, 0x15, 0x14, 0x6, 0x23, 0x22, 0x27, 0x6, 0x15, 0x14, 0x33, 0x33, 0x16, 0x16, 0x1, 0x32, 0x36, 0x35, 0x34, 0x27, 0x25, 0x27, 0x6, 0x6, 0x15, 0x14, 0x16, 0x1, 0x38, 0x71, 0x61, 0x5F, 0x71, 0x73, 0x5F, 0x5E, 0x72, 0x2, 0xDA, 0x81, 0xF4, 0xAF, 0xEB, 0xF9, 0x6D, 0x4A, 0x33, 0x49, 0x2D, 0xBC, 0x2, 0xF8, 0xCA, 0x57, 0x4B, 0x1, 0x70, 0x2, 0x89, 0x39, 0xF7, 0xCB, 0x4F, 0x47, 0x24, 0x7E, 0xB6, 0xBD, 0xD1, 0xFD, 0xDC, 0x99, 0x99, 0x91, 0xFE, 0xEC, 0x31, 0x24, 0x31, 0x7A, 0x2, 0xCD, 0x44, 0x6D, 0x6D, 0x44, 0x16, 0x48, 0x67, 0x67, 0x48, 0xFC, 0xC6, 0x50, 0xA2, 0x6D, 0xA6, 0x6E, 0x5D, 0x7F, 0x23, 0x30, 0x4A, 0x49, 0x60, 0x1F, 0x67, 0xC3, 0x1A, 0xA0, 0xCB, 0x14, 0x9A, 0x53, 0x6A, 0x16, 0x97, 0xD6, 0x12, 0x22, 0x2F, 0x4D, 0x1, 0x95, 0xFE, 0xC7, 0x68, 0x35, 0x6C, 0x9, 0x2, 0x6, 0x12, 0x49, 0x30, 0x3A, 0x55, 0x0, 0x2, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x5F, 0x4, 0x4E, 0x0, 0xC, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x26, 0x26, 0x23, 0x22, 0x6, 0x1, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x3, 0x13, 0x1, 0x4A, 0x6D, 0x83, 0x74, 0x6C, 0x12, 0xD, 0x70, 0x73, 0x84, 0x6E, 0x2, 0x38, 0x1F, 0x6F, 0xF1, 0xCE, 0xDF, 0xDF, 0xD0, 0xEC, 0x6E, 0x1C, 0xDD, 0x6C, 0x73, 0x1, 0xFA, 0x8B, 0xC1, 0xCF, 0x82, 0x2E, 0x88, 0xD6, 0xE0, 0xFD, 0x55, 0xC4, 0xD9, 0x1, 0x28, 0xE8, 0x14, 0xFC, 0x1, 0x43, 0xD6, 0xC2, 0xFD, 0xE2, 0xFD, 0xE4, 0x0, 0x2, 0x0, 0x9B, 0x0, 0x0, 0x4, 0xF2, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x1, 0x11, 0x23, 0x11, 0x21, 0x32, 0x4, 0x15, 0x14, 0x7, 0x16, 0x16, 0x15, 0x15, 0x14, 0x17, 0x15, 0x21, 0x26, 0x26, 0x35, 0x34, 0x23, 0x1, 0x97, 0x1, 0x14, 0x90, 0x81, 0x78, 0x89, 0xFE, 0xDC, 0xFC, 0x2, 0x29, 0xF5, 0x1, 0x0, 0xF6, 0x83, 0x66, 0x46, 0xFE, 0xFD, 0x27, 0x18, 0xF1, 0x4, 0xE5, 0xFE, 0x3C, 0x71, 0x6D, 0x67, 0x7F, 0xFD, 0x71, 0xFD, 0xAA, 0x5, 0xB0, 0xDA, 0xCC, 0xE1, 0x66, 0x28, 0xB8, 0x7B, 0x68, 0xA9, 0x3C, 0x1B, 0x21, 0x85, 0xB3, 0xFD, 0x0, 0x1, 0x0, 0x9B, 0x0, 0x0, 0x5, 0x30, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x4, 0x0, 0xFE, 0x44, 0xAD, 0xFC, 0xFC, 0x8B, 0x1, 0xAD, 0x1, 0x36, 0xFE, 0xC, 0x2, 0x1F, 0x2, 0x70, 0xFD, 0x90, 0x5, 0xB0, 0xFD, 0x9D, 0x2, 0x63, 0xFD, 0x46, 0xFD, 0xA, 0x0, 0x1, 0x0, 0x81, 0x0, 0x0, 0x4, 0x36, 0x6, 0x0, 0x0, 0xC, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x3, 0x1B, 0xFE, 0xC8, 0x6F, 0xF3, 0xF3, 0x68, 0x1, 0x10, 0x1, 0x1B, 0xFE, 0x9F, 0x1, 0x90, 0x1, 0xDA, 0xFE, 0x26, 0x6, 0x0, 0xFC, 0x9C, 0x1, 0x9E, 0xFE, 0x13, 0xFD, 0xB3, 0x0, 0x1, 0x0, 0x9B, 0x0, 0x0, 0x5, 0x12, 0x5, 0xB0, 0x0, 0xB, 0x0, 0x0, 0x21, 0x1, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x3, 0xDA, 0xFD, 0xBD, 0xFC, 0xFC, 0x6, 0x2, 0x19, 0x1, 0x39, 0xFD, 0xA5, 0x2, 0x7E, 0x2, 0x9D, 0xFD, 0x63, 0x5, 0xB0, 0xFD, 0x7F, 0x2, 0x81, 0xFD, 0x35, 0xFD, 0x1B, 0x0, 0x1, 0x0, 0x81, 0x0, 0x0, 0x4, 0x22, 0x6, 0x18, 0x0, 0xA, 0x0, 0x0, 0x21, 0x1, 0x11, 0x23, 0x11, 0x33, 0x11, 0x1, 0x21, 0x1, 0x1, 0x2, 0xFE, 0xFE, 0x76, 0xF3, 0xF3, 0x1, 0x58, 0x1, 0x2B, 0xFE, 0x4F, 0x1, 0xDC, 0x1, 0xEA, 0xFE, 0x16, 0x6, 0x18, 0xFC, 0x85, 0x1, 0x9D, 0xFE, 0xE, 0xFD, 0xB8, 0x0, 0x2, 0x0, 0x76, 0x0, 0x0, 0x4, 0x2B, 0x4, 0x8D, 0x0, 0x8, 0x0, 0x12, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x35, 0x10, 0x25, 0x1, 0x11, 0x21, 0x32, 0x0, 0x15, 0x15, 0x14, 0x0, 0x21, 0x1, 0x69, 0x83, 0xAE, 0x9E, 0xFE, 0xC7, 0xFE, 0x77, 0x1, 0x7B, 0xFD, 0x1, 0x3D, 0xFE, 0xC2, 0xFE, 0xFF, 0x3, 0xC9, 0xFC, 0xFA, 0xBB, 0xAE, 0x36, 0x1, 0x5F, 0x8, 0xFC, 0x37, 0x4, 0x8D, 0xFE, 0xCD, 0xFA, 0x34, 0xFA, 0xFE, 0xCE, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x44, 0x4, 0x9D, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x33, 0x6, 0x6, 0x23, 0x22, 0x0, 0x11, 0x35, 0x10, 0x0, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x20, 0x3, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3, 0x50, 0xF3, 0xF, 0xFD, 0xE7, 0xED, 0xFE, 0xED, 0x1, 0x19, 0xEC, 0xE8, 0xF4, 0x13, 0xF3, 0xA, 0x6F, 0x83, 0xFE, 0xF4, 0x7, 0x7F, 0x8F, 0x80, 0x75, 0x1, 0x85, 0xB2, 0xE3, 0x1, 0x2D, 0x1, 0x3, 0x4C, 0x1, 0x3, 0x1, 0x2E, 0xE9, 0xB3, 0x61, 0x78, 0xFE, 0xA5, 0x5F, 0xAE, 0xBF, 0x6A, 0x0, 0x3, 0x0, 0x76, 0x0, 0x0, 0x4, 0xA, 0x4, 0x8D, 0x0, 0x6, 0x0, 0xE, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x35, 0x34, 0x27, 0x3, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x1, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x1, 0x69, 0xCC, 0xC6, 0xC3, 0xCF, 0xE5, 0x65, 0x65, 0xB8, 0xFE, 0x16, 0x1, 0xAF, 0xD4, 0xF5, 0x57, 0x5A, 0x6B, 0x62, 0xE9, 0xD3, 0x3, 0xC9, 0xFE, 0xDD, 0x8F, 0x91, 0x3, 0xFE, 0x32, 0xFE, 0xC8, 0x54, 0x42, 0x9E, 0x4, 0xFE, 0x5, 0x4, 0x8D, 0x9D, 0xA3, 0x4E, 0x84, 0x23, 0x1A, 0x9A, 0x55, 0xAA, 0xA5, 0x0, 0x2, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x4, 0x8D, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x1, 0x2, 0xF8, 0xAA, 0xA9, 0x1, 0xFA, 0x60, 0xFE, 0x20, 0x60, 0xF6, 0x1, 0xD7, 0xDF, 0x1, 0xD5, 0x1, 0xB2, 0x1, 0xBA, 0xFE, 0x46, 0xFE, 0x4E, 0xFA, 0xFA, 0x4, 0x8D, 0xFB, 0x73, 0x0, 0x1, 0x0, 0x94, 0x4, 0x6A, 0x1, 0xA9, 0x6, 0x2B, 0x0, 0x8, 0x0, 0x0, 0x13, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x7, 0x15, 0x94, 0x5B, 0x38, 0x82, 0x3F, 0x2, 0x4, 0x6A, 0x85, 0x62, 0xB0, 0x2A, 0x53, 0x6D, 0x7C, 0x85, 0x0, 0x2, 0x0, 0x76, 0x4, 0xD5, 0x3, 0x0, 0x6, 0x7F, 0x0, 0x3, 0x0, 0x10, 0x0, 0x0, 0x1, 0x27, 0x33, 0x17, 0x17, 0x33, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x8C, 0xA9, 0xB6, 0x73, 0x42, 0xB2, 0xAF, 0xFE, 0xD4, 0xAF, 0xB0, 0x43, 0x52, 0x50, 0x43, 0x5, 0xBF, 0xC0, 0xC0, 0xE, 0x61, 0x7B, 0x7B, 0x61, 0x2C, 0x43, 0x43, 0x0, 0x3, 0xFC, 0x5A, 0x4, 0xCB, 0xFF, 0x18, 0x6, 0xA2, 0x0, 0x3, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x3, 0x15, 0x21, 0x35, 0x3, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0xF0, 0xFD, 0x51, 0x7, 0x41, 0x76, 0x42, 0x42, 0x76, 0x41, 0x1, 0xC4, 0x42, 0x76, 0x42, 0x42, 0x76, 0x42, 0x6, 0xA2, 0x9E, 0x9E, 0xFE, 0x9C, 0x2F, 0x43, 0x43, 0x2F, 0x30, 0x41, 0x41, 0x2E, 0x30, 0x42, 0x42, 0x30, 0x2F, 0x42, 0x42, 0x0, 0x3, 0xFC, 0x5A, 0x4, 0xCB, 0xFF, 0x18, 0x6, 0x65, 0x0, 0x3, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x1, 0x37, 0x33, 0x7, 0x5, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0xFD, 0x67, 0x7F, 0xC4, 0xB6, 0xFE, 0x66, 0x41, 0x76, 0x42, 0x42, 0x76, 0x41, 0x1, 0xC4, 0x42, 0x76, 0x42, 0x42, 0x76, 0x42, 0x5, 0x92, 0xD3, 0xD3, 0x54, 0x2F, 0x43, 0x43, 0x2F, 0x30, 0x41, 0x41, 0x2E, 0x30, 0x42, 0x42, 0x30, 0x2F, 0x42, 0x42, 0x0, 0x3, 0xFC, 0x5A, 0x4, 0xCB, 0xFF, 0x18, 0x6, 0xA1, 0x0, 0x8, 0x0, 0x12, 0x0, 0x1C, 0x0, 0x0, 0x1, 0x17, 0x37, 0x33, 0x15, 0x5, 0x23, 0x25, 0x35, 0x3, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0xFD, 0x2C, 0x8B, 0x8C, 0xCF, 0xFE, 0xF4, 0x9D, 0xFE, 0xF5, 0x4, 0x41, 0x76, 0x42, 0x42, 0x76, 0x41, 0x1, 0xC4, 0x42, 0x76, 0x42, 0x42, 0x76, 0x42, 0x6, 0xA1, 0x78, 0x78, 0x12, 0xDF, 0xDE, 0x13, 0xFE, 0x9D, 0x2F, 0x43, 0x43, 0x2F, 0x30, 0x41, 0x41, 0x2E, 0x30, 0x42, 0x42, 0x30, 0x2F, 0x42, 0x42, 0x0, 0x3, 0xFC, 0x5A, 0x4, 0xCB, 0xFF, 0x18, 0x6, 0x65, 0x0, 0x3, 0x0, 0xD, 0x0, 0x17, 0x0, 0x0, 0x1, 0x17, 0x23, 0x27, 0x3, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0xFD, 0x8B, 0x7F, 0x8D, 0xB5, 0x6E, 0x41, 0x76, 0x42, 0x42, 0x76, 0x41, 0x1, 0xC4, 0x42, 0x76, 0x42, 0x42, 0x76, 0x42, 0x6, 0x65, 0xD3, 0xD3, 0xFE, 0xD9, 0x2F, 0x43, 0x43, 0x2F, 0x30, 0x41, 0x41, 0x2E, 0x30, 0x42, 0x42, 0x30, 0x2F, 0x42, 0x42, 0x0, 0x2, 0xFC, 0x61, 0x4, 0xCB, 0xFF, 0x10, 0x6, 0x9E, 0x0, 0x3, 0x0, 0xD, 0x0, 0x0, 0x3, 0x15, 0x21, 0x35, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0xF0, 0xFD, 0x51, 0xDB, 0x41, 0x76, 0x42, 0x42, 0x76, 0x41, 0x6, 0x9E, 0x9E, 0x9E, 0xFE, 0x9E, 0x30, 0x42, 0x42, 0x30, 0x2F, 0x42, 0x42, 0x0, 0x2, 0xFC, 0x9C, 0x4, 0xBD, 0xFE, 0xD6, 0x6, 0x8C, 0x0, 0x3, 0x0, 0x17, 0x0, 0x0, 0x1, 0x37, 0x33, 0x7, 0x17, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0xFD, 0x67, 0x7F, 0xC4, 0xB6, 0x7B, 0x67, 0x5D, 0x49, 0x50, 0x52, 0x41, 0x1F, 0x2A, 0x68, 0x5B, 0x4A, 0x42, 0x63, 0x3F, 0x1E, 0x2C, 0x5, 0xB9, 0xD3, 0xD3, 0x18, 0x1E, 0x49, 0x6D, 0x47, 0x32, 0x25, 0x1C, 0x47, 0x71, 0x47, 0x32, 0x0, 0x2, 0xFC, 0x61, 0x4, 0xBF, 0xFF, 0x10, 0x6, 0x5F, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x17, 0x23, 0x27, 0x1, 0x15, 0x21, 0x35, 0xFD, 0x7A, 0x8A, 0x89, 0xCA, 0x2, 0x5F, 0xFD, 0x51, 0x6, 0x5F, 0xC0, 0xC0, 0xFE, 0xFE, 0x9E, 0x9E, 0x0, 0x2, 0xFC, 0x61, 0x4, 0xBF, 0xFF, 0x10, 0x6, 0x5F, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x37, 0x33, 0x7, 0x5, 0x15, 0x21, 0x35, 0xFD, 0x67, 0x7F, 0xC4, 0xB6, 0x1, 0x1C, 0xFD, 0x51, 0x5, 0x9F, 0xC0, 0xC0, 0x42, 0x9E, 0x9E, 0x0, 0x3, 0xFC, 0x5A, 0x4, 0xBF, 0xFF, 0x18, 0x6, 0xA0, 0x0, 0x9, 0x0, 0x13, 0x0, 0x17, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x17, 0x15, 0x21, 0x35, 0xFC, 0x5A, 0x41, 0x76, 0x42, 0x42, 0x76, 0x41, 0x1, 0xC4, 0x42, 0x76, 0x42, 0x42, 0x76, 0x42, 0xF2, 0xFD, 0x51, 0x6, 0x2E, 0x30, 0x42, 0x42, 0x30, 0x2F, 0x42, 0x42, 0x2E, 0x30, 0x42, 0x42, 0x30, 0x2F, 0x42, 0x42, 0xA1, 0x9E, 0x9E, 0x0, 0x2, 0xFC, 0xAA, 0x4, 0xED, 0xFE, 0xEA, 0x6, 0x79, 0x0, 0x9, 0x0, 0xD, 0x0, 0x0, 0x0, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x17, 0x13, 0x33, 0x3, 0xFC, 0xAA, 0x41, 0x3C, 0x3A, 0x42, 0x42, 0x3A, 0x3C, 0x41, 0xDB, 0x8E, 0xD7, 0xC9, 0x6, 0x37, 0x42, 0x42, 0x60, 0x41, 0x41, 0xEA, 0x1, 0x4, 0xFE, 0xFC, 0x0, 0x2, 0xFC, 0x5E, 0x4, 0xC3, 0xFF, 0x12, 0x6, 0xC1, 0x0, 0x7, 0x0, 0x10, 0x0, 0x0, 0x0, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x7, 0x17, 0x37, 0x33, 0x15, 0x5, 0x23, 0x25, 0x35, 0xFD, 0x3C, 0x41, 0x76, 0x42, 0x42, 0x76, 0x41, 0x10, 0x8B, 0x8C, 0xCF, 0xFE, 0xF4, 0x9D, 0xFE, 0xF5, 0x6, 0x7F, 0x42, 0x42, 0x60, 0x41, 0x41, 0x6C, 0x78, 0x78, 0x11, 0xDF, 0xDE, 0x12, 0x0, 0x2, 0x0, 0x7B, 0x4, 0xE8, 0x4, 0x8C, 0x6, 0x91, 0x0, 0x3, 0x0, 0xA, 0x0, 0x0, 0x1, 0x13, 0x33, 0x3, 0x5, 0x25, 0x33, 0x5, 0x23, 0x27, 0x7, 0x3, 0x16, 0x97, 0xDF, 0xD8, 0xFC, 0xC7, 0x1, 0x22, 0xA2, 0x1, 0x22, 0xD4, 0x9F, 0x9F, 0x5, 0x86, 0x1, 0xB, 0xFE, 0xF5, 0x9E, 0xF9, 0xF9, 0x8E, 0x8E, 0x0, 0x2, 0xFF, 0x4B, 0x4, 0xDB, 0x3, 0x5C, 0x6, 0x84, 0x0, 0x3, 0x0, 0xA, 0x0, 0x0, 0x13, 0x13, 0x23, 0x3, 0x5, 0x5, 0x23, 0x27, 0x7, 0x23, 0x25, 0x2A, 0x97, 0x9E, 0xD8, 0x2, 0xEF, 0x1, 0x22, 0xD4, 0x9F, 0x9F, 0xD4, 0x1, 0x22, 0x6, 0x84, 0xFE, 0xF5, 0x1, 0xB, 0xB0, 0xF9, 0x8E, 0x8E, 0xF9, 0x0, 0x2, 0x0, 0x76, 0x4, 0xE8, 0x4, 0xA, 0x6, 0xCB, 0x0, 0xC, 0x0, 0x13, 0x0, 0x0, 0x1, 0x23, 0x27, 0x36, 0x35, 0x34, 0x23, 0x37, 0x20, 0x15, 0x14, 0x6, 0x7, 0x25, 0x5, 0x23, 0x27, 0x7, 0x23, 0x25, 0x3, 0x89, 0x89, 0x7, 0x77, 0x81, 0x6, 0x1, 0x15, 0x50, 0x31, 0xFE, 0xBE, 0x1, 0x15, 0xC1, 0xB2, 0xB3, 0xC0, 0x1, 0x15, 0x5, 0x6E, 0x7D, 0x7, 0x33, 0x3E, 0x68, 0xA4, 0x3E, 0x3A, 0x7, 0x39, 0xF9, 0xA1, 0xA1, 0xF9, 0x0, 0x2, 0x0, 0x76, 0x4, 0xE8, 0x3, 0x5C, 0x6, 0xD2, 0x0, 0x13, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x7, 0x5, 0x23, 0x27, 0x7, 0x23, 0x25, 0x2, 0x92, 0x5B, 0x56, 0x41, 0x46, 0x4F, 0x3A, 0x1B, 0x2A, 0x5A, 0x55, 0x40, 0x3B, 0x5E, 0x37, 0x1B, 0x2A, 0x5F, 0x1, 0x29, 0xC1, 0xB2, 0xB3, 0xC0, 0x1, 0x29, 0x6, 0xD2, 0x1F, 0x3B, 0x62, 0x43, 0x2C, 0x1B, 0x18, 0x3B, 0x64, 0x41, 0x2E, 0xE2, 0xEC, 0x8E, 0x8E, 0xEC, 0x0, 0x2, 0xFC, 0x61, 0x4, 0xBD, 0xFF, 0x10, 0x6, 0xA2, 0x0, 0x3, 0x0, 0x17, 0x0, 0x0, 0x3, 0x15, 0x21, 0x35, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0xF0, 0xFD, 0x51, 0x2, 0xE, 0x67, 0x5D, 0x49, 0x50, 0x52, 0x41, 0x1F, 0x2A, 0x68, 0x5B, 0x4A, 0x42, 0x63, 0x3F, 0x1E, 0x2C, 0x6, 0xA2, 0x9E, 0x9E, 0xFE, 0xFF, 0x1E, 0x49, 0x6D, 0x47, 0x32, 0x25, 0x1C, 0x47, 0x71, 0x47, 0x32, 0x0, 0x1, 0x0, 0x76, 0x0, 0x0, 0x3, 0x97, 0x5, 0xC4, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x3, 0x97, 0xFD, 0xD2, 0xF3, 0x2, 0x2E, 0xF3, 0x3, 0xC9, 0xFC, 0x37, 0x4, 0x8D, 0x1, 0x37, 0x0, 0x2, 0x0, 0x76, 0x4, 0xD3, 0x3, 0x0, 0x6, 0x7F, 0x0, 0x3, 0x0, 0x10, 0x0, 0x0, 0x1, 0x37, 0x33, 0x7, 0x17, 0x33, 0x14, 0x6, 0x20, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x1, 0x77, 0x72, 0xB7, 0xA9, 0x57, 0xB2, 0xAF, 0xFE, 0xD4, 0xAF, 0xB0, 0x43, 0x52, 0x50, 0x43, 0x5, 0xBF, 0xC0, 0xC0, 0xF, 0x61, 0x7C, 0x7C, 0x61, 0x2C, 0x43, 0x43, 0x0, 0x2, 0x0, 0x76, 0x4, 0xD5, 0x2, 0xF6, 0x7, 0x8, 0x0, 0xC, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x23, 0x27, 0x36, 0x35, 0x34, 0x23, 0x37, 0x20, 0x15, 0x14, 0x6, 0x7, 0x17, 0x33, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x2, 0x8, 0x9E, 0x8, 0x87, 0x93, 0x7, 0x1, 0x3D, 0x5B, 0x36, 0x3F, 0xAE, 0xAB, 0x95, 0x94, 0xAC, 0xAD, 0x43, 0x50, 0x4F, 0x43, 0x5, 0xC9, 0x76, 0x6, 0x2D, 0x37, 0x5F, 0x93, 0x37, 0x34, 0x6, 0x54, 0x61, 0x7A, 0x7A, 0x61, 0x2B, 0x42, 0x42, 0x0, 0x3, 0xFC, 0x5A, 0x4, 0xBD, 0xFF, 0x18, 0x6, 0xC1, 0x0, 0x7, 0x0, 0x11, 0x0, 0x25, 0x0, 0x0, 0x0, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x17, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0xFC, 0x5A, 0x41, 0x76, 0x42, 0x42, 0x76, 0x41, 0x1, 0xC4, 0x42, 0x76, 0x42, 0x42, 0x76, 0x42, 0x51, 0x67, 0x5D, 0x49, 0x50, 0x52, 0x41, 0x1F, 0x2A, 0x68, 0x5B, 0x4A, 0x42, 0x63, 0x3F, 0x1E, 0x2C, 0x6, 0x7F, 0x42, 0x42, 0x60, 0x41, 0x41, 0x2E, 0x30, 0x43, 0x43, 0x30, 0x2F, 0x41, 0x41, 0x7D, 0x1E, 0x49, 0x6D, 0x47, 0x32, 0x25, 0x1C, 0x47, 0x71, 0x47, 0x32, 0xFF, 0xFF, 0x0, 0x4C, 0x2, 0x8D, 0x2, 0xAA, 0x5, 0xB8, 0x0, 0x7, 0x7, 0x43, 0x0, 0x0, 0x2, 0x98, 0xFF, 0xFF, 0x0, 0x35, 0x2, 0x98, 0x2, 0xBF, 0x5, 0xAD, 0x0, 0x7, 0x7, 0x9E, 0x0, 0x0, 0x2, 0x98, 0xFF, 0xFF, 0x0, 0x4F, 0x2, 0x8D, 0x2, 0xAE, 0x5, 0xAD, 0x0, 0x7, 0x7, 0x9F, 0x0, 0x0, 0x2, 0x98, 0xFF, 0xFF, 0x0, 0x4E, 0x2, 0x8D, 0x2, 0xB9, 0x5, 0xBA, 0x0, 0x7, 0x7, 0xA0, 0x0, 0x0, 0x2, 0x98, 0xFF, 0xFF, 0x0, 0x37, 0x2, 0x98, 0x2, 0xAE, 0x5, 0xAD, 0x0, 0x7, 0x7, 0xA1, 0x0, 0x0, 0x2, 0x98, 0xFF, 0xFF, 0x0, 0x4C, 0x2, 0x8D, 0x2, 0xAA, 0x5, 0xB8, 0x0, 0x7, 0x7, 0xA2, 0x0, 0x0, 0x2, 0x98, 0xFF, 0xFF, 0x0, 0x47, 0x2, 0x8F, 0x2, 0xA4, 0x5, 0xB8, 0x0, 0x7, 0x7, 0xA3, 0x0, 0x0, 0x2, 0x98, 0x0, 0x1, 0x0, 0x6C, 0xFF, 0xEB, 0x5, 0x26, 0x5, 0xC5, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x33, 0x6, 0x0, 0x21, 0x20, 0x0, 0x11, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x4, 0x29, 0xFC, 0x16, 0xFE, 0xDE, 0xFE, 0xF9, 0xFE, 0xEE, 0xFE, 0x98, 0x1, 0x62, 0x1, 0x12, 0x1, 0x6, 0x1, 0x2A, 0x16, 0xFD, 0x13, 0x99, 0x9D, 0xAC, 0xCC, 0xD2, 0xAC, 0x9D, 0x92, 0x1, 0xDA, 0xDD, 0xFE, 0xEE, 0x1, 0x87, 0x1, 0x4A, 0x37, 0x1, 0x4A, 0x1, 0x88, 0xFE, 0xEA, 0xE0, 0x8C, 0x9F, 0xFE, 0xE7, 0xEC, 0x39, 0xEC, 0xFE, 0xE5, 0x9D, 0x0, 0x1, 0x0, 0x6C, 0xFF, 0xEB, 0x5, 0x26, 0x5, 0xC5, 0x0, 0x20, 0x0, 0x0, 0x1, 0x11, 0x6, 0x4, 0x23, 0x22, 0x24, 0x2, 0x35, 0x35, 0x10, 0x0, 0x21, 0x20, 0x0, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x36, 0x37, 0x11, 0x21, 0x35, 0x5, 0x26, 0x2C, 0xFE, 0xFB, 0xE8, 0xBF, 0xFE, 0xCF, 0xB1, 0x1, 0x66, 0x1, 0x13, 0x1, 0x11, 0x1, 0x14, 0x1C, 0xF9, 0x13, 0x95, 0x9D, 0xA9, 0xD7, 0xED, 0xB8, 0x7A, 0x8A, 0x19, 0xFE, 0xDD, 0x2, 0xE4, 0xFD, 0xD9, 0x3D, 0x95, 0xB1, 0x1, 0x47, 0xE0, 0x25, 0x1, 0x54, 0x1, 0x89, 0xFE, 0xF9, 0xCB, 0x71, 0x96, 0xFE, 0xE2, 0xF2, 0x27, 0xF3, 0xFE, 0xE5, 0x39, 0x1C, 0x1, 0x1B, 0xBF, 0x0, 0x2, 0x0, 0x9B, 0x0, 0x0, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x13, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x12, 0x35, 0x35, 0x34, 0x2, 0x23, 0x1, 0x11, 0x21, 0x20, 0x0, 0x13, 0x15, 0x10, 0x0, 0x21, 0x1, 0x97, 0xAE, 0xE9, 0xEC, 0xEC, 0xDD, 0xFE, 0x4A, 0x1, 0xBE, 0x1, 0x35, 0x1, 0x89, 0x1, 0xFE, 0x73, 0xFE, 0xC2, 0x4, 0xE5, 0xFB, 0xE5, 0x1, 0x1C, 0xDD, 0x2B, 0xE6, 0x1, 0x11, 0xFB, 0x1B, 0x5, 0xB0, 0xFE, 0x77, 0xFE, 0xC6, 0x2A, 0xFE, 0xC4, 0xFE, 0x79, 0x0, 0x2, 0x0, 0x6C, 0xFF, 0xEB, 0x5, 0x72, 0x5, 0xC5, 0x0, 0x10, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x14, 0x2, 0x4, 0x23, 0x22, 0x24, 0x2, 0x35, 0x35, 0x34, 0x12, 0x24, 0x33, 0x20, 0x0, 0x13, 0x7, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x5, 0x72, 0xA6, 0xFE, 0xDF, 0xBB, 0xB6, 0xFE, 0xDC, 0xAA, 0xA9, 0x1, 0x23, 0xB6, 0x1, 0x15, 0x1, 0x6B, 0x4, 0xFA, 0xDA, 0xB0, 0xA9, 0xDE, 0xE0, 0xA9, 0xB1, 0xD7, 0x2, 0xC3, 0xD2, 0xFE, 0xB7, 0xBD, 0xBD, 0x1, 0x49, 0xD2, 0x2A, 0xD2, 0x1, 0x49, 0xBD, 0xFE, 0x69, 0xFE, 0xCB, 0xA, 0xE2, 0x1, 0x24, 0xFE, 0xDC, 0xE2, 0x2C, 0xE4, 0xFE, 0xDB, 0x1, 0x25, 0xE4, 0x0, 0x2, 0x0, 0x6C, 0xFF, 0x3, 0x5, 0x72, 0x5, 0xC5, 0x0, 0x14, 0x0, 0x22, 0x0, 0x0, 0x5, 0x25, 0x6, 0x23, 0x22, 0x24, 0x2, 0x35, 0x35, 0x34, 0x12, 0x24, 0x33, 0x20, 0x0, 0x13, 0x15, 0x14, 0x2, 0x7, 0x17, 0x3, 0x34, 0x2, 0x23, 0x22, 0x2, 0x15, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x4, 0x9C, 0xFE, 0xD6, 0x3F, 0x43, 0xB6, 0xFE, 0xDC, 0xAA, 0xA9, 0x1, 0x23, 0xB6, 0x1, 0x17, 0x1, 0x6A, 0x3, 0x9A, 0x85, 0xEE, 0xC9, 0xDA, 0xB0, 0xA9, 0xDE, 0xE0, 0xA9, 0xB1, 0xD7, 0xFD, 0xF5, 0xD, 0xBA, 0x1, 0x4B, 0xD7, 0x21, 0xD8, 0x1, 0x4A, 0xBB, 0xFE, 0x69, 0xFE, 0xC3, 0x2A, 0xCF, 0xFE, 0xBD, 0x5D, 0xC1, 0x3, 0x53, 0xEB, 0x1, 0x20, 0xFE, 0xE0, 0xEB, 0x23, 0xEB, 0xFE, 0xDE, 0x1, 0x22, 0xEB, 0x0, 0x1, 0x0, 0x98, 0x0, 0x0, 0x2, 0xEF, 0x4, 0x8D, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x5, 0x35, 0x25, 0x2, 0xEF, 0xF2, 0xFE, 0x9B, 0x2, 0x38, 0x4, 0x8D, 0xFB, 0x73, 0x3, 0x69, 0x7A, 0xCD, 0xD1, 0x0, 0x1, 0x0, 0x6F, 0x0, 0x0, 0x4, 0x2D, 0x4, 0x9F, 0x0, 0x18, 0x0, 0x0, 0x25, 0x15, 0x21, 0x35, 0x1, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x1, 0x4, 0x2D, 0xFC, 0x5F, 0x1, 0xF3, 0x53, 0x35, 0x5B, 0x69, 0x64, 0x7D, 0xF3, 0x1, 0x5, 0xCF, 0xD6, 0xDF, 0x7B, 0x7A, 0xFE, 0xE1, 0xC2, 0xC2, 0xA0, 0x1, 0xB2, 0x49, 0x68, 0x39, 0x3B, 0x66, 0x74, 0x64, 0xAD, 0xED, 0xBF, 0x94, 0x6E, 0xB2, 0x6A, 0xFF, 0x0, 0x0, 0x1, 0x0, 0xF, 0xFE, 0xA3, 0x3, 0xF3, 0x4, 0x8D, 0x0, 0x17, 0x0, 0x0, 0x1, 0x1, 0x21, 0x35, 0x21, 0x15, 0x1, 0x16, 0x16, 0x15, 0x10, 0x0, 0x21, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x10, 0x25, 0x23, 0x1, 0x51, 0x1, 0x4D, 0xFD, 0xBA, 0x3, 0x77, 0xFE, 0x9D, 0x9E, 0xE9, 0xFE, 0xB2, 0xFE, 0xFF, 0xC6, 0xCF, 0x39, 0x9F, 0xAB, 0xA8, 0xC0, 0xFE, 0xAF, 0x58, 0x2, 0x55, 0x1, 0x74, 0xC4, 0x8F, 0xFE, 0x80, 0x19, 0xEA, 0xBE, 0xFE, 0xFD, 0xFE, 0xE9, 0x67, 0xB6, 0x58, 0xBB, 0x90, 0x1, 0x20, 0x7, 0x0, 0x2, 0x0, 0x36, 0xFE, 0xC3, 0x4, 0x8B, 0x4, 0x8D, 0x0, 0x3, 0x0, 0xE, 0x0, 0x0, 0x25, 0x21, 0x11, 0x7, 0x1, 0x23, 0x11, 0x23, 0x11, 0x21, 0x27, 0x1, 0x33, 0x11, 0x33, 0x1, 0x3A, 0x1, 0xA9, 0x17, 0x1, 0xBF, 0xB5, 0xF3, 0xFD, 0x59, 0x6, 0x2, 0xA5, 0xFB, 0xB5, 0xC3, 0x2, 0x7F, 0x2A, 0xFC, 0xE7, 0xFE, 0xC4, 0x1, 0x3C, 0x94, 0x3, 0xFA, 0xFC, 0x36, 0x0, 0x1, 0x0, 0x67, 0xFE, 0xA0, 0x4, 0x1E, 0x4, 0x8C, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x27, 0x13, 0x21, 0x15, 0x21, 0x3, 0x36, 0x37, 0x36, 0x12, 0x15, 0x14, 0x0, 0x21, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x1, 0x52, 0xCA, 0x5A, 0x3, 0x29, 0xFD, 0x9A, 0x2D, 0x60, 0x8B, 0xD1, 0xEA, 0xFE, 0xF2, 0xFE, 0xF0, 0xE6, 0xB3, 0x4A, 0x82, 0xBF, 0x9B, 0x9F, 0x87, 0x80, 0x5E, 0x5D, 0x1, 0x64, 0x11, 0x3, 0x17, 0xD1, 0xFE, 0xA9, 0x32, 0x2, 0x2, 0xFE, 0xF7, 0xE3, 0xD6, 0xFE, 0xC8, 0x75, 0xB1, 0x63, 0xC1, 0x88, 0x7F, 0xA9, 0x3C, 0x0, 0x1, 0x0, 0x43, 0xFE, 0xC3, 0x4, 0x11, 0x4, 0x8D, 0x0, 0x6, 0x0, 0x0, 0x1, 0x15, 0x1, 0x23, 0x1, 0x21, 0x35, 0x4, 0x11, 0xFD, 0xB5, 0xF3, 0x2, 0x3E, 0xFD, 0x32, 0x4, 0x8D, 0x87, 0xFA, 0xBD, 0x5, 0x7, 0xC3, 0x0, 0x2, 0x0, 0x76, 0x4, 0xD0, 0x2, 0xF8, 0x6, 0xDD, 0x0, 0x13, 0x0, 0x21, 0x0, 0x0, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x3, 0x33, 0x14, 0x6, 0x23, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x2, 0x72, 0x67, 0x5D, 0x49, 0x50, 0x53, 0x41, 0x1E, 0x2B, 0x67, 0x5C, 0x49, 0x42, 0x63, 0x3F, 0x1E, 0x2C, 0x29, 0xAF, 0xAC, 0x95, 0x94, 0xAD, 0xAE, 0x42, 0x51, 0x50, 0x42, 0x6, 0xDD, 0x1E, 0x49, 0x6D, 0x47, 0x32, 0x25, 0x1C, 0x48, 0x70, 0x46, 0x31, 0xFE, 0xF8, 0x63, 0x7D, 0x7D, 0x63, 0x2C, 0x43, 0x43, 0x0, 0x1, 0x0, 0x5D, 0xFE, 0x99, 0x1, 0x50, 0x0, 0xB5, 0x0, 0x3, 0x0, 0x0, 0x25, 0x11, 0x23, 0x11, 0x1, 0x50, 0xF3, 0xB5, 0xFD, 0xE4, 0x2, 0x1C, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xF0, 0x6, 0x6D, 0x4, 0x9D, 0x0, 0x9, 0x0, 0x21, 0x0, 0x0, 0x25, 0x37, 0x11, 0x27, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x17, 0x22, 0x0, 0x11, 0x35, 0x10, 0x0, 0x33, 0x32, 0x16, 0x33, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x22, 0x6, 0x2, 0x61, 0xCD, 0xCF, 0x85, 0x98, 0x9A, 0x85, 0xE9, 0xFE, 0xD8, 0x1, 0x26, 0xE9, 0x40, 0xD9, 0x74, 0x2, 0x7E, 0xFD, 0xB7, 0x1, 0xF6, 0xFE, 0xA, 0x2, 0x4C, 0xFD, 0x81, 0x77, 0xD5, 0xB4, 0x8, 0x3, 0x13, 0x9, 0xC1, 0xB5, 0x36, 0xB5, 0xC3, 0xC4, 0x1, 0x32, 0x1, 0xA, 0x34, 0x1, 0xA, 0x1, 0x33, 0x10, 0xC4, 0xFE, 0xF3, 0xC3, 0xFE, 0xCA, 0xC3, 0x10, 0x0, 0x2, 0x0, 0x74, 0xFE, 0xB3, 0x4, 0x54, 0x4, 0xA1, 0x0, 0xC, 0x0, 0x23, 0x0, 0x0, 0x1, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x13, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x37, 0x6, 0x23, 0x22, 0x2, 0x35, 0x34, 0x0, 0x33, 0x32, 0x0, 0x13, 0x15, 0x10, 0x0, 0x2, 0x5F, 0x61, 0x80, 0x21, 0x8D, 0x7A, 0x6A, 0x89, 0x82, 0x1B, 0x9B, 0x87, 0x2F, 0x7D, 0x5B, 0x93, 0xC1, 0x1B, 0x74, 0xA9, 0xD4, 0xF3, 0x1, 0x11, 0xCA, 0xE0, 0x1, 0x22, 0x3, 0xFE, 0xAC, 0x1, 0x61, 0x46, 0x31, 0xAD, 0xAD, 0xAC, 0xAB, 0x98, 0x81, 0xB9, 0xFD, 0x52, 0x3D, 0xB5, 0x2F, 0xC0, 0xC8, 0x5A, 0x1, 0x15, 0xE2, 0xEF, 0x1, 0x17, 0xFE, 0xE8, 0xFE, 0xEB, 0xDA, 0xFE, 0x8E, 0xFE, 0x8B, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x5, 0xC4, 0x0, 0x13, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x13, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0xFE, 0x81, 0xC4, 0x28, 0xFC, 0xEE, 0xB, 0x4D, 0xE6, 0x8C, 0xD3, 0xF8, 0x1, 0xFD, 0x94, 0x4, 0xF1, 0x97, 0x77, 0xFC, 0x1D, 0x5, 0xB0, 0xB6, 0x5C, 0x6E, 0xE8, 0xFE, 0xED, 0xFC, 0x37, 0x3, 0xB5, 0xAC, 0x90, 0x0, 0x1, 0x0, 0x95, 0xFF, 0xEC, 0x5, 0x19, 0x5, 0xB0, 0x0, 0x13, 0x0, 0x0, 0x21, 0x27, 0x6, 0x6, 0x23, 0x22, 0x26, 0x3, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x33, 0x11, 0x4, 0x2A, 0xA, 0x4E, 0xE5, 0x87, 0xD3, 0xFD, 0x1, 0xFC, 0x9C, 0x85, 0x73, 0xCD, 0x2A, 0xFD, 0xA1, 0x55, 0x60, 0xEC, 0x1, 0x17, 0x3, 0xC1, 0xFC, 0x52, 0xAF, 0x91, 0x87, 0x6D, 0x3, 0xFA, 0xFA, 0x50, 0x0, 0x2, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xD, 0x5, 0xC4, 0x0, 0xA, 0x0, 0x29, 0x0, 0x0, 0x25, 0x32, 0x36, 0x37, 0x11, 0x23, 0x6, 0x6, 0x15, 0x14, 0x16, 0x5, 0x26, 0x27, 0x6, 0x6, 0x23, 0x22, 0x24, 0x35, 0x34, 0x24, 0x25, 0x21, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x24, 0x21, 0x32, 0x4, 0x15, 0x11, 0x14, 0x17, 0x15, 0x2, 0x70, 0x8A, 0xCC, 0x23, 0xF6, 0xD4, 0xBE, 0x8C, 0x2, 0x20, 0x14, 0xA, 0x41, 0xD5, 0x95, 0xD0, 0xFE, 0xF2, 0x1, 0x3D, 0x1, 0x3F, 0x1, 0x7, 0x96, 0x9E, 0x91, 0xA5, 0xF9, 0x1, 0x2D, 0x1, 0xE, 0xEF, 0x1, 0x34, 0x29, 0xBC, 0x6D, 0x3C, 0x1, 0x27, 0x2, 0x6E, 0x78, 0x68, 0x80, 0xBC, 0x2E, 0x52, 0x3B, 0x59, 0xEA, 0xC4, 0xDA, 0xDD, 0x2, 0x7E, 0x85, 0x9F, 0x78, 0x80, 0xC8, 0xFF, 0xFA, 0xFB, 0xFD, 0x3D, 0x9E, 0x5D, 0x11, 0x0, 0x2, 0x0, 0x65, 0xFF, 0xEA, 0x5, 0x30, 0x5, 0xC4, 0x0, 0x7, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x34, 0x26, 0x1, 0x6, 0x6, 0x23, 0x20, 0x0, 0x11, 0x35, 0x34, 0x12, 0x24, 0x17, 0x4, 0x0, 0x13, 0x15, 0x21, 0x16, 0x12, 0x33, 0x32, 0x36, 0x37, 0x2, 0xD3, 0xA9, 0xB9, 0xE, 0x2, 0xD1, 0xA0, 0x1, 0x5F, 0x6D, 0xEE, 0xA9, 0xFE, 0xC4, 0xFE, 0xB2, 0xA4, 0x1, 0x1A, 0xB0, 0x1, 0x29, 0x1, 0x31, 0x3, 0xFC, 0x31, 0x5, 0xC2, 0xCF, 0x80, 0xB5, 0x3C, 0x4, 0xEB, 0xEC, 0xAF, 0x26, 0x9E, 0xD7, 0xFB, 0xD4, 0x61, 0x74, 0x1, 0x85, 0x1, 0x30, 0x74, 0xCB, 0x1, 0x37, 0xAF, 0x1, 0x1, 0xFE, 0xA3, 0xFE, 0xC6, 0xA2, 0xBE, 0xFE, 0xF7, 0x62, 0x35, 0x0, 0x1, 0x0, 0x95, 0x0, 0x0, 0x8, 0x15, 0x5, 0xC4, 0x0, 0x21, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x36, 0x33, 0x20, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x13, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x6, 0x7, 0x13, 0x23, 0x11, 0x34, 0x26, 0x2, 0xD9, 0x73, 0xB0, 0x25, 0xFC, 0xEE, 0xA, 0x49, 0xD2, 0x80, 0x1, 0x16, 0x63, 0x4C, 0xEB, 0x8F, 0xC6, 0xE7, 0x1, 0xFC, 0x84, 0x7A, 0x73, 0xB1, 0x25, 0x1, 0xFC, 0x84, 0x4, 0xF1, 0x8B, 0x6F, 0xFC, 0x9, 0x5, 0xB0, 0xA7, 0x56, 0x65, 0xDB, 0x63, 0x78, 0xE2, 0xFE, 0xF4, 0xFC, 0x2A, 0x3, 0xC2, 0xA5, 0x8A, 0x8C, 0x70, 0xFC, 0xB, 0x3, 0xC2, 0xA5, 0x8A, 0x0, 0x1, 0xFF, 0xAF, 0xFE, 0x4B, 0x1, 0x8E, 0x0, 0xCD, 0x0, 0xC, 0x0, 0x0, 0x37, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x9B, 0xF3, 0xBB, 0xA5, 0x45, 0x3A, 0xE, 0x26, 0x3D, 0x78, 0x3, 0xCD, 0xFE, 0xF4, 0xB6, 0xC0, 0x11, 0xC5, 0xC, 0xA4, 0xFF, 0xFF, 0x0, 0x39, 0xFE, 0xA3, 0x4, 0x1D, 0x4, 0x8D, 0x0, 0x6, 0x7, 0xD6, 0x2A, 0x0, 0xFF, 0xFF, 0x0, 0x6B, 0xFE, 0xA0, 0x4, 0x22, 0x4, 0x8C, 0x0, 0x6, 0x7, 0xD8, 0x4, 0x0, 0xFF, 0xFF, 0x0, 0x2C, 0xFE, 0xC3, 0x4, 0x81, 0x4, 0x8D, 0x0, 0x6, 0x7, 0xD7, 0xF6, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0x0, 0x0, 0x4, 0x24, 0x4, 0x9F, 0x0, 0x6, 0x7, 0xD5, 0xF7, 0x0, 0xFF, 0xFF, 0x0, 0x63, 0xFE, 0xC3, 0x4, 0x31, 0x4, 0x8D, 0x0, 0x6, 0x7, 0xD9, 0x20, 0x0, 0xFF, 0xFF, 0x0, 0x35, 0xFF, 0xEB, 0x4, 0x58, 0x4, 0xA0, 0x0, 0x6, 0x8, 0x99, 0xD2, 0x0, 0xFF, 0xFF, 0x0, 0x6F, 0xFF, 0xEC, 0x4, 0x30, 0x5, 0xB7, 0x0, 0x6, 0x0, 0x1B, 0xF9, 0x0, 0xFF, 0xFF, 0x0, 0x59, 0xFE, 0xB3, 0x4, 0x39, 0x4, 0xA1, 0x0, 0x6, 0x7, 0xDD, 0xE5, 0x0, 0xFF, 0xFF, 0x0, 0x69, 0xFF, 0xEC, 0x4, 0x23, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x1D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xE4, 0x0, 0x0, 0x3, 0x3B, 0x4, 0x8D, 0x0, 0x6, 0x7, 0xD4, 0x4C, 0x0, 0xFF, 0xFF, 0xFF, 0xB5, 0xFE, 0x4B, 0x1, 0x94, 0x4, 0x3A, 0x0, 0x6, 0x0, 0xEC, 0x0, 0x0, 0x0, 0x1, 0x0, 0x90, 0xFE, 0x52, 0x2, 0x91, 0x4, 0x3A, 0x0, 0x10, 0x0, 0x0, 0x1, 0x20, 0x3, 0x35, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x6, 0x2, 0x17, 0xFE, 0xD9, 0x8, 0x58, 0xF3, 0x35, 0x55, 0x3E, 0x26, 0x20, 0x39, 0xFE, 0x52, 0x1, 0x4E, 0x60, 0x4, 0x3A, 0xFC, 0x84, 0xFE, 0xF4, 0x5F, 0x46, 0x7, 0xB1, 0x11, 0xFF, 0xFF, 0x0, 0x1E, 0xFE, 0x4B, 0x2, 0xCE, 0x4, 0x3A, 0x0, 0x26, 0x0, 0xEC, 0x69, 0x0, 0x0, 0x6, 0x7, 0xA4, 0xA0, 0x89, 0xFF, 0xFF, 0x0, 0x1A, 0x0, 0x0, 0x2, 0xB8, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x8E, 0x64, 0x0, 0x0, 0x6, 0x7, 0xA4, 0x8A, 0x89, 0xFF, 0xFF, 0xFF, 0xB5, 0xFE, 0x4B, 0x1, 0x94, 0x4, 0x3A, 0x0, 0x6, 0x0, 0xEC, 0x0, 0x0, 0x0, 0x2, 0x0, 0x1E, 0xFE, 0x4B, 0x3, 0x99, 0x4, 0x3A, 0x0, 0x10, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x14, 0x6, 0x27, 0x32, 0x35, 0x35, 0x23, 0x22, 0x15, 0x14, 0x16, 0x1, 0x65, 0x9A, 0xAD, 0xA9, 0x8A, 0x7D, 0xF3, 0xD8, 0xD8, 0x96, 0xC9, 0x6C, 0x62, 0x6B, 0x38, 0xFE, 0x4B, 0x99, 0x78, 0x80, 0x8E, 0x3, 0xD0, 0xFC, 0x30, 0xB4, 0x13, 0x87, 0xD1, 0xAF, 0x77, 0x45, 0x5E, 0x2C, 0x32, 0x0, 0x1, 0x0, 0x8D, 0x2, 0x30, 0x1, 0x52, 0x5, 0x54, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x52, 0xC5, 0x5, 0x54, 0xFC, 0xDC, 0x3, 0x24, 0xFF, 0xFF, 0x0, 0x90, 0x0, 0x0, 0x1, 0x83, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x1, 0x0, 0x28, 0x2, 0x8C, 0x2, 0x42, 0x5, 0xAD, 0x0, 0xB, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x2, 0x42, 0xAC, 0xC5, 0xA9, 0xA9, 0xC5, 0xAC, 0x4, 0xB, 0xFE, 0x81, 0x1, 0x7F, 0xA0, 0x1, 0x2, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFA, 0xFE, 0x5C, 0x1, 0x83, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8C, 0xD1, 0xA, 0xFF, 0xFF, 0x0, 0x90, 0x0, 0x0, 0x1, 0x83, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x1, 0x0, 0x88, 0xFF, 0x38, 0x1, 0x4D, 0x2, 0x59, 0x0, 0x3, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x4D, 0xC5, 0x2, 0x59, 0xFC, 0xDF, 0x3, 0x21, 0xFF, 0xFF, 0xFF, 0xB5, 0xFE, 0x4B, 0x1, 0x94, 0x4, 0x3A, 0x0, 0x6, 0x0, 0xEC, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x3D, 0x2, 0x7D, 0x5, 0xAD, 0x0, 0xF, 0x0, 0x18, 0x0, 0x0, 0x13, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x14, 0x6, 0x27, 0x32, 0x36, 0x35, 0x35, 0x23, 0x22, 0x15, 0x14, 0xFB, 0x67, 0x94, 0x9D, 0x6A, 0x27, 0xC5, 0x8A, 0x8A, 0x70, 0x90, 0x24, 0x17, 0x21, 0x50, 0x1, 0x3D, 0x6A, 0x67, 0x77, 0x7C, 0x2, 0xAC, 0xFD, 0x54, 0xA7, 0x83, 0x9A, 0xA3, 0x2C, 0x22, 0x2C, 0x40, 0x3A, 0x0, 0x1, 0x0, 0x22, 0x1, 0x4C, 0x1, 0x7E, 0x5, 0xB0, 0x0, 0xC, 0x0, 0x0, 0x13, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0xB9, 0xC5, 0x79, 0x83, 0x31, 0x2F, 0x16, 0x21, 0x60, 0x5, 0xB0, 0xFC, 0xC9, 0x86, 0xA7, 0xD, 0xA6, 0x6, 0x80, 0x0, 0x1, 0x0, 0x22, 0xFD, 0xF5, 0x1, 0x7E, 0x2, 0x59, 0x0, 0xC, 0x0, 0x0, 0x13, 0x33, 0x11, 0x14, 0x6, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0xB9, 0xC5, 0x79, 0x83, 0x36, 0x2A, 0x1B, 0x1C, 0x60, 0x2, 0x59, 0xFC, 0xC9, 0x86, 0xA7, 0xD, 0xA5, 0x6, 0x81, 0x0, 0x1, 0x0, 0x76, 0xFF, 0xEB, 0x4, 0x16, 0x4, 0x9D, 0x0, 0x22, 0x0, 0x0, 0x5, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x35, 0x13, 0x26, 0x23, 0x22, 0x15, 0x11, 0x23, 0x11, 0x31, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x3, 0x16, 0x16, 0x15, 0x14, 0x6, 0x2, 0x8E, 0x7B, 0x6C, 0x45, 0x4B, 0x48, 0x50, 0x58, 0x7C, 0x74, 0x54, 0xCA, 0x43, 0x54, 0xB1, 0xEF, 0x1, 0xD1, 0xD0, 0x89, 0xCE, 0x55, 0xF8, 0x9A, 0xB0, 0xE1, 0x15, 0x36, 0xBB, 0x31, 0x66, 0x51, 0x57, 0x48, 0xA2, 0x1, 0x1, 0x39, 0xFC, 0xFD, 0x1F, 0x2, 0xED, 0xD8, 0xD8, 0x74, 0x5D, 0xFE, 0xD5, 0x15, 0xA1, 0x87, 0xB7, 0xC2, 0x0, 0x1, 0x0, 0x25, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x7, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xEE, 0xFE, 0x67, 0xA8, 0x1, 0x9B, 0x1, 0x94, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x8F, 0xDD, 0xFD, 0x4E, 0x66, 0x2, 0xB7, 0x1, 0x74, 0x1, 0x1F, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x21, 0x23, 0x1, 0x37, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFC, 0xD9, 0xA8, 0x2, 0x7F, 0xF3, 0x5, 0x4A, 0x66, 0xFB, 0xD0, 0x4, 0x30, 0x0, 0x1, 0x0, 0xA, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x1, 0x27, 0x1, 0x21, 0x11, 0x23, 0x3, 0x54, 0xFE, 0xFA, 0xFE, 0x76, 0xBA, 0x1, 0xB7, 0x2, 0x86, 0xF3, 0x4, 0xE9, 0xFB, 0x17, 0x3A, 0x5, 0x76, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x8D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x37, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0x4F, 0xA8, 0x1, 0x35, 0xEA, 0xF3, 0x3, 0x76, 0xFE, 0xFE, 0x2, 0xD6, 0x66, 0xFD, 0xEB, 0xDA, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x1, 0x37, 0x1, 0x3, 0x54, 0xF3, 0xF3, 0xFE, 0x74, 0xFE, 0x50, 0xA8, 0x1, 0x78, 0x3, 0x3B, 0x2, 0x75, 0xFA, 0x50, 0x2, 0x75, 0x2, 0xD5, 0x66, 0xFD, 0x8B, 0x0, 0x1, 0x0, 0x9D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x1, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xF6, 0xFE, 0x53, 0xA8, 0x1, 0x5, 0x1, 0x9, 0xF4, 0x4, 0x37, 0xFE, 0x41, 0x2, 0xD2, 0x66, 0xFE, 0x3C, 0x1, 0xC4, 0x0, 0x1, 0x0, 0x87, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x1, 0x37, 0x1, 0x37, 0x11, 0x33, 0x11, 0x23, 0x11, 0x2, 0x3E, 0xFE, 0x49, 0xB9, 0x1, 0x5D, 0xB7, 0xF3, 0xF3, 0x5, 0x76, 0x3A, 0xFB, 0xA5, 0xAC, 0x3, 0xAF, 0xFA, 0x50, 0x1, 0x1, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x27, 0x1, 0x4, 0x47, 0xF3, 0xFD, 0x81, 0xA8, 0x3, 0x27, 0x5, 0xB0, 0xFA, 0x50, 0x4, 0x30, 0xFB, 0xD0, 0x66, 0x5, 0x4A, 0x0, 0x1, 0x0, 0xA7, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x13, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xF8, 0xFE, 0x5B, 0xB7, 0x1, 0x11, 0xE5, 0xF3, 0x1, 0xC3, 0xFE, 0x3D, 0x4, 0x2A, 0x4B, 0xFD, 0x3F, 0x1, 0x87, 0x2, 0x75, 0x0, 0x1, 0x0, 0x98, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x13, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xE9, 0xFE, 0x5B, 0xB7, 0xFC, 0x1, 0x9, 0xF3, 0x2, 0xAC, 0xFD, 0x54, 0x4, 0x2A, 0x4B, 0xFD, 0x75, 0x2, 0x8B, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x90, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x13, 0x1, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xDC, 0xFE, 0x60, 0xB7, 0xE3, 0x1, 0x2A, 0xF3, 0x3, 0x66, 0xFC, 0x9A, 0x4, 0x2A, 0x4B, 0xFD, 0xB2, 0x3, 0x89, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x25, 0x11, 0x33, 0x11, 0x21, 0x1, 0x37, 0x1, 0x3, 0x54, 0xF3, 0xFD, 0x81, 0xFE, 0x5C, 0xB6, 0x1, 0x7A, 0xC7, 0x4, 0xE9, 0xFA, 0x50, 0x4, 0x2A, 0x4B, 0xFC, 0x52, 0x0, 0x1, 0x0, 0x99, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x11, 0x1, 0x1, 0x37, 0x1, 0x37, 0x11, 0x33, 0x11, 0x3, 0x54, 0xFE, 0xEA, 0xFE, 0x5B, 0xB7, 0x1, 0x3B, 0xC9, 0xF3, 0x1, 0x1, 0xFE, 0xFF, 0x4, 0x2A, 0x4B, 0xFC, 0xD1, 0xBB, 0x3, 0xAF, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x8E, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x27, 0x1, 0x27, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xE7, 0xFE, 0xC9, 0xA8, 0x1, 0xAF, 0x1, 0x17, 0xF3, 0x3, 0xAF, 0xD6, 0xFD, 0xF0, 0x65, 0x2, 0xD6, 0xFE, 0xFF, 0x1, 0x1, 0x0, 0x1, 0x0, 0x7A, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x27, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xDB, 0xFE, 0xF3, 0xA8, 0x1, 0xAE, 0x1, 0x2C, 0xF3, 0x2, 0x73, 0x1, 0xD5, 0xFE, 0x2D, 0x65, 0x2, 0xD6, 0xFE, 0x1B, 0x1, 0xE5, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x21, 0x1, 0x27, 0x1, 0x4, 0x47, 0xF3, 0xFE, 0xE4, 0xFE, 0x88, 0xA8, 0x1, 0xB0, 0x5, 0xB0, 0xFA, 0x50, 0x4, 0xE9, 0xFD, 0x8C, 0x65, 0x2, 0xD6, 0x0, 0x1, 0x0, 0x8D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x3, 0x27, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xD2, 0xF1, 0xA8, 0x1, 0xA9, 0x1, 0x1E, 0xF3, 0x1, 0x3B, 0x2, 0xDB, 0xFE, 0x5F, 0x65, 0x2, 0xD6, 0xFD, 0x56, 0x2, 0xAA, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x1, 0x3, 0x27, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xB6, 0xDE, 0xA8, 0x1, 0xAC, 0x1, 0x24, 0xF3, 0x3, 0xEF, 0xFE, 0x86, 0x65, 0x2, 0xD6, 0xFC, 0x8E, 0x3, 0x72, 0x0, 0x1, 0x0, 0x86, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x13, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0x48, 0xB9, 0x1, 0x1F, 0xF6, 0xF3, 0x2, 0xAC, 0xFD, 0x54, 0x5, 0x76, 0x3A, 0xFC, 0x6A, 0x2, 0x5B, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x96, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x13, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xFA, 0xFE, 0x48, 0xB9, 0x1, 0x34, 0xD1, 0xF3, 0x1, 0xC3, 0xFE, 0x3E, 0x5, 0x75, 0x3A, 0xFC, 0x24, 0x1, 0x67, 0x2, 0x75, 0x0, 0x1, 0x0, 0x8D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x27, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xEA, 0xFE, 0xCB, 0xA8, 0x1, 0xB1, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x3B, 0xDA, 0xFD, 0xEB, 0x66, 0x2, 0xD6, 0xFE, 0xFF, 0x3, 0x75, 0x0, 0x1, 0x0, 0x9D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF4, 0xFE, 0xF7, 0xFE, 0xFB, 0xA8, 0x1, 0xAD, 0x1, 0xA, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0xC4, 0xFE, 0x3C, 0x66, 0x2, 0xD2, 0xFE, 0x41, 0x4, 0x37, 0x0, 0x1, 0x0, 0x31, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x7, 0x1, 0x27, 0x1, 0x1, 0x4, 0x47, 0xF3, 0xDF, 0xFE, 0x73, 0xB7, 0x1, 0x8E, 0x1, 0x95, 0x5, 0xB0, 0xFA, 0x50, 0x4, 0xAE, 0xCD, 0xFC, 0x1F, 0x4B, 0x3, 0xF1, 0x1, 0x74, 0x0, 0x1, 0x0, 0x7E, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x1, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xE1, 0xFE, 0x49, 0xB9, 0x1, 0x8, 0x1, 0x15, 0xF3, 0x3, 0x66, 0xFC, 0x9A, 0x5, 0x76, 0x3A, 0xFC, 0xB5, 0x3, 0x4B, 0x0, 0x1, 0x0, 0x9E, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x1, 0x7, 0x27, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x8E, 0xC5, 0x7F, 0x1, 0x96, 0x1, 0x20, 0xF3, 0x4, 0x66, 0xB7, 0x8D, 0x1, 0x74, 0xFC, 0x8E, 0x3, 0x72, 0x0, 0x1, 0x0, 0xA7, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x7, 0x27, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xAD, 0xDC, 0x7E, 0x1, 0x95, 0x1, 0x18, 0xF3, 0x1, 0x3B, 0x3, 0x3E, 0xCA, 0x8D, 0x1, 0x74, 0xFD, 0x56, 0x2, 0xAA, 0x0, 0x1, 0x0, 0xB7, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x17, 0x1, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xF8, 0xFE, 0x6B, 0x7E, 0xE8, 0x1, 0x36, 0xF4, 0x4, 0x37, 0xFE, 0x3E, 0x1, 0x74, 0x8D, 0xD6, 0x2, 0x10, 0x0, 0x1, 0x0, 0x8E, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x37, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xE9, 0xFE, 0x51, 0xA8, 0x1, 0x37, 0xE7, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x1, 0xFE, 0xFF, 0x2, 0xD6, 0x65, 0xFD, 0xF0, 0xD7, 0x3, 0xAE, 0x0, 0x1, 0x0, 0x33, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x1, 0x37, 0x1, 0x3, 0x54, 0xF3, 0xF3, 0xFE, 0x74, 0xFE, 0x6B, 0x7F, 0x1, 0x58, 0x3, 0x3B, 0x2, 0x75, 0xFA, 0x50, 0x2, 0x75, 0x1, 0x74, 0x8D, 0xFE, 0xC5, 0x0, 0x1, 0x0, 0xA8, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0x6A, 0x7F, 0x1, 0x17, 0x1, 0x16, 0xF3, 0x3, 0x76, 0xFE, 0xFE, 0x1, 0x74, 0x8D, 0xFE, 0xFF, 0x1, 0x1, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x38, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x1, 0x1, 0x37, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x55, 0xFE, 0x8F, 0x7F, 0x1, 0x96, 0x1, 0x7, 0xF3, 0x2, 0xCE, 0x1, 0x53, 0x8D, 0xFE, 0x8D, 0xFE, 0x45, 0x4, 0x30, 0x0, 0x1, 0x0, 0x39, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x1, 0x37, 0x1, 0x11, 0x33, 0x11, 0x23, 0x3, 0x54, 0xFC, 0xE5, 0x7E, 0x2, 0x9D, 0xF3, 0xF3, 0x1, 0x1F, 0x2, 0xDC, 0x8D, 0xFD, 0x9A, 0x3, 0x8E, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x94, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x7, 0x27, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xB3, 0xF4, 0x7F, 0x1, 0x95, 0x1, 0x2B, 0xF3, 0x2, 0x75, 0x2, 0x1C, 0xE2, 0x8D, 0x1, 0x74, 0xFE, 0x1B, 0x1, 0xE5, 0x0, 0x1, 0x0, 0xA8, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x27, 0x1, 0x5, 0x35, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xEB, 0xFE, 0xE8, 0x7F, 0x1, 0x95, 0x1, 0x17, 0xF3, 0x3, 0xAF, 0x1, 0x0, 0xFF, 0x0, 0x8D, 0x1, 0x74, 0xFF, 0xFF, 0x0, 0x1, 0x0, 0x37, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x21, 0x1, 0x27, 0x1, 0x4, 0x47, 0xF3, 0xFE, 0xBA, 0xFE, 0xA7, 0x7E, 0x1, 0x95, 0x5, 0xB0, 0xFA, 0x50, 0x4, 0xE9, 0xFE, 0xC6, 0x8D, 0x1, 0x74, 0x0, 0x1, 0x0, 0x78, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x37, 0x1, 0x11, 0x33, 0x3, 0x1B, 0xF3, 0xFE, 0x50, 0xA8, 0x1, 0x8, 0xF3, 0x2, 0x75, 0x2, 0xD5, 0x66, 0xFE, 0x44, 0x1, 0xBC, 0x0, 0x1, 0x0, 0x93, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x37, 0x5, 0x35, 0x33, 0x3, 0x1B, 0xF3, 0xFE, 0x6B, 0x7F, 0x1, 0x16, 0xF3, 0x3, 0xAF, 0x1, 0x74, 0x8D, 0xFF, 0xFF, 0x0, 0x1, 0x0, 0xBA, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x21, 0x35, 0x21, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0x8B, 0xFE, 0xDB, 0x1, 0x93, 0x1, 0x7, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x75, 0xC6, 0xFE, 0x45, 0x4, 0x30, 0x0, 0x1, 0x0, 0x71, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x21, 0x23, 0x1, 0x37, 0x13, 0x11, 0x33, 0x3, 0x1B, 0xF3, 0xFE, 0x49, 0xBA, 0xFD, 0xF3, 0x5, 0x76, 0x3A, 0xFC, 0xD8, 0x3, 0x28, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x37, 0x13, 0x11, 0x33, 0x3, 0x1B, 0xF3, 0xFE, 0x5C, 0xB6, 0xEE, 0xF3, 0x1, 0x3B, 0x4, 0x2A, 0x4B, 0xFD, 0xAB, 0x2, 0x55, 0x0, 0x1, 0x0, 0x33, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x21, 0x1, 0x27, 0x1, 0x21, 0x11, 0x33, 0x11, 0x23, 0x3, 0x54, 0xFE, 0xB6, 0xFE, 0xA8, 0x7F, 0x1, 0x95, 0x1, 0x8C, 0xF3, 0xF3, 0x2, 0x75, 0xFE, 0xC5, 0x8D, 0x1, 0x74, 0x2, 0x75, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x39, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x33, 0x11, 0x23, 0x11, 0x1, 0x27, 0x3, 0x54, 0xF3, 0xF3, 0xFD, 0x63, 0x7E, 0x4, 0x91, 0x1, 0x1F, 0xFA, 0x50, 0x3, 0x8F, 0xFD, 0x99, 0x8D, 0x0, 0x1, 0x0, 0x38, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x27, 0x1, 0x1, 0x4, 0x47, 0xF3, 0xFE, 0xF9, 0xFE, 0x6A, 0x7F, 0x1, 0x71, 0x1, 0xAB, 0x5, 0xB0, 0xFA, 0x50, 0x4, 0x30, 0xFE, 0x45, 0xFE, 0x8D, 0x8D, 0x1, 0x53, 0x2, 0xCE, 0x0, 0x1, 0x0, 0x90, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x3, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xD6, 0xE3, 0xB7, 0x1, 0xA0, 0x1, 0x24, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x89, 0xFD, 0xB2, 0x4B, 0x4, 0x2A, 0xFC, 0x9A, 0x3, 0x66, 0x0, 0x1, 0x0, 0xAB, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x5, 0x21, 0x35, 0x21, 0x1, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0x6D, 0x1, 0x54, 0x1, 0x55, 0xF3, 0x4, 0xAE, 0xFF, 0xC6, 0x1, 0x3B, 0x0, 0x1, 0x0, 0xAB, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x21, 0x35, 0x21, 0x5, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xAB, 0xFE, 0xAC, 0x1, 0x93, 0x1, 0x16, 0xF3, 0x2, 0x75, 0x1, 0x3A, 0xC7, 0xFF, 0x2, 0x39, 0x0, 0x1, 0x0, 0xB2, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x21, 0x35, 0x21, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x8B, 0xFE, 0xD3, 0x1, 0x9B, 0x1, 0x7, 0xF3, 0x1, 0x3B, 0x2, 0x74, 0xC7, 0xFE, 0x44, 0x2, 0xF6, 0x0, 0x1, 0x0, 0xBC, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x1, 0x21, 0x35, 0x21, 0x13, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x8D, 0xFE, 0xDB, 0x1, 0xAA, 0xEE, 0xF3, 0x3, 0xAF, 0xC6, 0xFD, 0xAB, 0x3, 0x90, 0x0, 0x1, 0x0, 0xA7, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xE5, 0xFE, 0xEF, 0xB7, 0x1, 0xA5, 0x1, 0x8, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x75, 0x1, 0x87, 0xFD, 0x3F, 0x4B, 0x4, 0x2A, 0xFE, 0x3E, 0x1, 0xC2, 0x0, 0x1, 0x0, 0x99, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x33, 0x11, 0x23, 0x11, 0x27, 0x1, 0x27, 0x1, 0x1, 0x3, 0x54, 0xF3, 0xF3, 0xC9, 0xFE, 0xC5, 0xB7, 0x1, 0xA5, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0xAF, 0xBB, 0xFC, 0xD1, 0x4B, 0x4, 0x2A, 0xFE, 0xFF, 0x0, 0x1, 0x0, 0xB7, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x7, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF4, 0xFE, 0xCA, 0xE8, 0x7E, 0x1, 0x95, 0x1, 0x8, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x10, 0xD6, 0x8D, 0x1, 0x74, 0xFE, 0x3E, 0x4, 0x37, 0x0, 0x1, 0x0, 0xA, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x25, 0x11, 0x33, 0x11, 0x21, 0x1, 0x37, 0x1, 0x3, 0x54, 0xF3, 0xFD, 0x7A, 0xFE, 0x49, 0xBA, 0x1, 0x8A, 0xC7, 0x4, 0xE9, 0xFA, 0x50, 0x5, 0x76, 0x3A, 0xFB, 0x17, 0x0, 0x1, 0x0, 0xBC, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x21, 0x35, 0x21, 0x13, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x8D, 0xFE, 0xDB, 0x1, 0xAA, 0xEE, 0xF3, 0x1, 0x3B, 0x3, 0xAE, 0xC7, 0xFD, 0xAB, 0x2, 0x55, 0x0, 0x1, 0x0, 0xAB, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x1, 0x21, 0x35, 0x21, 0x13, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x76, 0xFE, 0xE1, 0x1, 0xAC, 0xFD, 0xF3, 0x4, 0xE9, 0xC7, 0xFC, 0xD8, 0x3, 0x28, 0x0, 0x1, 0x0, 0xAB, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x21, 0x35, 0x21, 0x5, 0x35, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xAB, 0xFE, 0xAC, 0x1, 0x93, 0x1, 0x16, 0xF3, 0x3, 0xAF, 0x1, 0x3A, 0xC7, 0xFF, 0xFF, 0x0, 0x1, 0x0, 0xB2, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x21, 0x35, 0x21, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x8B, 0xFE, 0xD3, 0x1, 0x9B, 0x1, 0x7, 0xF3, 0x2, 0x75, 0x2, 0x74, 0xC7, 0xFE, 0x44, 0x1, 0xBC, 0x0, 0x1, 0x0, 0x47, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x37, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFC, 0xF3, 0x7F, 0x2, 0x8E, 0xF3, 0x2, 0x59, 0x2, 0xCA, 0x8D, 0xFD, 0xAB, 0x2, 0x55, 0x0, 0x1, 0x0, 0x37, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x1, 0x37, 0x1, 0x3, 0x54, 0xF3, 0xF3, 0xFE, 0x78, 0xFE, 0x6B, 0x7E, 0x1, 0x59, 0x4, 0x75, 0x1, 0x3B, 0xFA, 0x50, 0x3, 0xAF, 0x1, 0x74, 0x8D, 0xFE, 0xC5, 0x0, 0x1, 0x0, 0xA8, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x1, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0x6A, 0x7F, 0x1, 0x17, 0x1, 0x16, 0xF3, 0x4, 0xB0, 0xFE, 0xFF, 0x1, 0x74, 0x8D, 0xFE, 0xFE, 0x1, 0x2, 0x0, 0x1, 0x0, 0xA7, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xE5, 0xFE, 0xEF, 0xB7, 0x1, 0xA5, 0x1, 0x8, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x3B, 0x1, 0x86, 0xFD, 0x3F, 0x4B, 0x4, 0x2B, 0xFE, 0x3E, 0x2, 0xFC, 0x0, 0x1, 0x0, 0x99, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x27, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xC9, 0xFE, 0xC5, 0xB7, 0x1, 0xA5, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x75, 0xBB, 0xFC, 0xD0, 0x4B, 0x4, 0x2A, 0xFE, 0xFF, 0x2, 0x3C, 0x0, 0x1, 0x0, 0x1D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x21, 0x1, 0x27, 0x1, 0x21, 0x11, 0x33, 0x11, 0x23, 0x3, 0x54, 0xFE, 0xF9, 0xFE, 0x86, 0xB6, 0x1, 0xA4, 0x1, 0x93, 0xF3, 0xF3, 0x3, 0xAF, 0xFC, 0x51, 0x4B, 0x4, 0x2B, 0x1, 0x3A, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x67, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x1, 0x1, 0x37, 0x1, 0x13, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x7B, 0xFE, 0x98, 0x7F, 0x1, 0x96, 0xD8, 0xF3, 0x3, 0xD8, 0x1, 0x4B, 0x8D, 0xFE, 0x8E, 0xFD, 0xE2, 0x3, 0x90, 0x0, 0x1, 0x0, 0x49, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x13, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x64, 0xFE, 0x91, 0x7D, 0x1, 0x95, 0xF9, 0xF3, 0x1, 0x1F, 0x2, 0xB2, 0x1, 0x52, 0x8D, 0xFE, 0x8E, 0xFE, 0x61, 0x3, 0x11, 0x0, 0x1, 0x0, 0x78, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x27, 0x1, 0x11, 0x3, 0x1B, 0xF3, 0xFE, 0xF8, 0xA8, 0x1, 0xB0, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0xF6, 0xFE, 0x44, 0x66, 0x2, 0xD5, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x93, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x5, 0x27, 0x1, 0x11, 0x3, 0x1B, 0xF3, 0xFE, 0xEA, 0x7F, 0x1, 0x95, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x39, 0xFF, 0x8D, 0x1, 0x74, 0x2, 0x75, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x27, 0x1, 0x3, 0x1B, 0xF3, 0xEE, 0xB6, 0x1, 0xA4, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x90, 0xFD, 0xAB, 0x4B, 0x4, 0x2A, 0x0, 0x1, 0x0, 0x93, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x37, 0x1, 0x11, 0x3, 0x1B, 0xF3, 0xFE, 0x6B, 0x7F, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x74, 0x8E, 0xFF, 0x0, 0x4, 0xAE, 0x0, 0x1, 0x0, 0xBC, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x21, 0x35, 0x21, 0x1, 0x4, 0x47, 0xF3, 0xEE, 0xFE, 0x56, 0x1, 0x25, 0x1, 0x73, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x90, 0xFD, 0xAB, 0xC7, 0x3, 0xAE, 0x0, 0x1, 0x0, 0x9D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xF6, 0xFE, 0xFB, 0xA8, 0x1, 0xAE, 0x1, 0x9, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x3B, 0x1, 0xC4, 0xFE, 0x3C, 0x65, 0x2, 0xD2, 0xFE, 0x42, 0x2, 0xFC, 0x0, 0x1, 0x0, 0x8D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x3, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xD4, 0xF3, 0xA8, 0x1, 0xAC, 0x1, 0x1B, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0xDE, 0xFE, 0x5C, 0x66, 0x2, 0xD5, 0xFD, 0x55, 0x3, 0xE6, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x21, 0x1, 0x27, 0x1, 0x21, 0x11, 0x33, 0x11, 0x23, 0x3, 0x54, 0xFE, 0xE4, 0xFE, 0x88, 0xA8, 0x1, 0xB0, 0x1, 0x8C, 0xF3, 0xF3, 0x3, 0xAF, 0xFD, 0x8B, 0x66, 0x2, 0xD6, 0x1, 0x3A, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x8E, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x27, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xEA, 0xFE, 0xCC, 0xA8, 0x1, 0xB0, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x75, 0xDA, 0xFD, 0xEC, 0x65, 0x2, 0xD6, 0xFE, 0xFE, 0x2, 0x3C, 0x0, 0x1, 0x0, 0x23, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x7, 0x1, 0x27, 0x1, 0x1, 0x4, 0x47, 0xF3, 0xEE, 0xFE, 0x65, 0xA8, 0x1, 0x9D, 0x1, 0x94, 0x5, 0xB0, 0xFA, 0x50, 0x4, 0xAE, 0xDC, 0xFD, 0x4F, 0x66, 0x2, 0xB5, 0x1, 0x74, 0x0, 0x1, 0x0, 0xA8, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x5, 0x1, 0x37, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xE9, 0xFE, 0x6B, 0x7F, 0x1, 0x18, 0x1, 0x15, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x39, 0xFF, 0x1, 0x74, 0x8D, 0xFF, 0x0, 0x1, 0x0, 0x2, 0x75, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x21, 0x1, 0x27, 0x1, 0x21, 0x11, 0x33, 0x11, 0x23, 0x3, 0x54, 0xFE, 0xE4, 0xFE, 0x88, 0xA8, 0x1, 0xB0, 0x1, 0x8C, 0xF3, 0xF3, 0x2, 0x75, 0xFD, 0x8B, 0x66, 0x2, 0xD5, 0x2, 0x75, 0xFA, 0x50, 0x0, 0x1, 0x0, 0xA7, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x37, 0x17, 0x1, 0x4, 0x47, 0xF3, 0xFE, 0xE8, 0xFE, 0x6B, 0x7E, 0xDC, 0x1, 0x53, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0xE5, 0xFD, 0x56, 0x1, 0x74, 0x8D, 0xCA, 0x3, 0x3E, 0x0, 0x1, 0x0, 0x96, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xD1, 0xFE, 0xCC, 0xB9, 0x1, 0xB8, 0x1, 0x6, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x75, 0x1, 0x67, 0xFC, 0x24, 0x3A, 0x5, 0x75, 0xFE, 0x3F, 0x1, 0xC2, 0x0, 0x1, 0x0, 0x86, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xF6, 0xFE, 0xE1, 0xB9, 0x1, 0xB8, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x3B, 0x2, 0x5C, 0xFC, 0x69, 0x3A, 0x5, 0x76, 0xFD, 0x54, 0x2, 0xAC, 0x0, 0x1, 0x0, 0x7E, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xEB, 0xFE, 0xF8, 0xB9, 0x1, 0xB7, 0x1, 0x1F, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x4B, 0xFC, 0xB5, 0x3A, 0x5, 0x76, 0xFC, 0x9A, 0x3, 0x66, 0x0, 0x1, 0x0, 0x3C, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x33, 0x11, 0x23, 0x1, 0x37, 0x3, 0x54, 0xF3, 0xF3, 0xFC, 0xE8, 0x7F, 0x1, 0x2, 0x4, 0xAE, 0xFA, 0x50, 0x2, 0xD9, 0x8D, 0x0, 0x1, 0x0, 0x2C, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x21, 0x1, 0x37, 0x1, 0x21, 0x11, 0x33, 0x11, 0x23, 0x3, 0x54, 0xFE, 0x6D, 0xFE, 0x6B, 0x7F, 0x1, 0x58, 0x1, 0x51, 0xF3, 0xF3, 0x1, 0x3B, 0x1, 0x74, 0x8D, 0xFE, 0xC6, 0x3, 0xAE, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x98, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x3, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xF7, 0xFC, 0xB7, 0x1, 0xA5, 0x1, 0x17, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x3B, 0x2, 0x8B, 0xFD, 0x75, 0x4B, 0x4, 0x2A, 0xFD, 0x54, 0x2, 0xAC, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x21, 0x1, 0x27, 0x1, 0x21, 0x11, 0x23, 0x3, 0x54, 0xFF, 0x0, 0xFE, 0x86, 0xB6, 0x1, 0xA4, 0x2, 0x7F, 0xF3, 0x4, 0xE9, 0xFC, 0x52, 0x4B, 0x4, 0x2A, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x78, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x37, 0x1, 0x11, 0x3, 0x1B, 0xF3, 0xFE, 0x50, 0xA8, 0x1, 0x8, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0xD6, 0x65, 0xFE, 0x45, 0x4, 0x30, 0x0, 0x1, 0x0, 0x93, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x37, 0x5, 0x11, 0x3, 0x1B, 0xF3, 0xFE, 0x6B, 0x7F, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x3B, 0x1, 0x74, 0x8D, 0xFF, 0x3, 0x73, 0x0, 0x1, 0x0, 0x94, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x37, 0x17, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xD5, 0xFE, 0x6B, 0x7F, 0xF4, 0x1, 0x4D, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0xE5, 0xFE, 0x1B, 0x1, 0x74, 0x8E, 0xE3, 0x2, 0x1C, 0x2, 0x75, 0x0, 0x1, 0x0, 0xA7, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x37, 0x17, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xE8, 0xFE, 0x6B, 0x7E, 0xDC, 0x1, 0x53, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0xAA, 0xFD, 0x56, 0x1, 0x74, 0x8E, 0xCB, 0x3, 0x3E, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x78, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x27, 0x1, 0x33, 0x3, 0x1B, 0xF3, 0xFE, 0xF8, 0xA8, 0x1, 0xB0, 0xF3, 0x4, 0x30, 0xFE, 0x45, 0x65, 0x2, 0xD6, 0x0, 0x1, 0x0, 0xA8, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x35, 0x5, 0x1, 0x37, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xE9, 0xFE, 0x6B, 0x7F, 0x1, 0x18, 0x1, 0x15, 0x5, 0xB0, 0xFA, 0x50, 0xFF, 0xFF, 0x1, 0x74, 0x8E, 0xFE, 0xFF, 0x1, 0x1, 0x3, 0xAE, 0x0, 0x1, 0x0, 0x87, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x1, 0x11, 0x33, 0x11, 0x23, 0x11, 0x27, 0x1, 0x27, 0x2, 0x3E, 0x1, 0x16, 0xF3, 0xF3, 0xB7, 0xFE, 0xA3, 0xB9, 0x5, 0xB0, 0xFE, 0xFF, 0x1, 0x1, 0xFA, 0x50, 0x3, 0xAF, 0xAC, 0xFB, 0xA5, 0x3A, 0x0, 0x1, 0x0, 0x93, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x5, 0x27, 0x1, 0x11, 0x33, 0x3, 0x1B, 0xF3, 0xFE, 0xEA, 0x7F, 0x1, 0x95, 0xF3, 0x3, 0x73, 0xFF, 0x8D, 0x1, 0x74, 0x1, 0x3B, 0x0, 0x1, 0x0, 0xAB, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x5, 0x21, 0x35, 0x21, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0x6D, 0x1, 0x54, 0x1, 0x55, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x39, 0xFF, 0xC7, 0x1, 0x3A, 0x2, 0x75, 0x0, 0x1, 0x0, 0xA8, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0xE9, 0x7F, 0x1, 0x96, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x3B, 0x1, 0x2, 0xFE, 0xFE, 0x8D, 0x1, 0x74, 0xFE, 0xFF, 0x3, 0x75, 0x0, 0x1, 0x0, 0xAB, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x21, 0x35, 0x21, 0x5, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xAB, 0xFE, 0xAC, 0x1, 0x93, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x3B, 0x1, 0x3A, 0xC7, 0xFF, 0x3, 0x73, 0x0, 0x1, 0x0, 0xBA, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x21, 0x35, 0x21, 0x1, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xF9, 0xFE, 0x6D, 0x1, 0x25, 0x1, 0x75, 0xF3, 0x4, 0x30, 0xFE, 0x45, 0xC6, 0x2, 0x75, 0x0, 0x1, 0x0, 0xAB, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x5, 0x21, 0x35, 0x21, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0x6D, 0x1, 0x54, 0x1, 0x55, 0xF3, 0x3, 0x73, 0xFF, 0xC7, 0x1, 0x3A, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x21, 0x1, 0x37, 0x1, 0x21, 0x11, 0x33, 0x4, 0x47, 0xFD, 0x81, 0xFE, 0x50, 0xA8, 0x1, 0x78, 0x1, 0x1C, 0xF3, 0x2, 0xD6, 0x65, 0xFD, 0x8C, 0x4, 0xE9, 0x0, 0x1, 0x0, 0x8D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x37, 0x13, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xE2, 0xFE, 0x57, 0xA8, 0xF1, 0x1, 0x2E, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0xAA, 0xFD, 0x56, 0x2, 0xD6, 0x65, 0xFE, 0x5F, 0x2, 0xDB, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x7A, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xD4, 0xFE, 0x52, 0xA8, 0x1, 0xD, 0x1, 0x25, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0xE5, 0xFE, 0x1B, 0x2, 0xD6, 0x65, 0xFE, 0x2D, 0x1, 0xD5, 0x2, 0x73, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x37, 0x13, 0x1, 0x4, 0x47, 0xF3, 0xFE, 0xDC, 0xFE, 0x54, 0xA8, 0xDE, 0x1, 0x4A, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x72, 0xFC, 0x8E, 0x2, 0xD6, 0x65, 0xFE, 0x86, 0x3, 0xEF, 0x0, 0x1, 0x0, 0x94, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x37, 0x17, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xD5, 0xFE, 0x6B, 0x7F, 0xF4, 0x1, 0x4D, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x1F, 0xFE, 0x1B, 0x1, 0x74, 0x8D, 0xE2, 0x2, 0x1C, 0x1, 0x3B, 0x0, 0x1, 0x0, 0xAB, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x21, 0x35, 0x21, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xAB, 0xFE, 0xAC, 0x1, 0x93, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x3B, 0xC7, 0xFF, 0x0, 0x4, 0xAE, 0x0, 0x1, 0x0, 0x98, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x13, 0x1, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xE9, 0xFE, 0x5B, 0xB7, 0xFC, 0x1, 0x9, 0xF3, 0x3, 0xE6, 0xFD, 0x55, 0x4, 0x2A, 0x4B, 0xFD, 0x75, 0x2, 0x8B, 0x0, 0x1, 0x0, 0x99, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x37, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0x5B, 0xB7, 0x1, 0x3B, 0xC9, 0xF3, 0x2, 0x3C, 0xFE, 0xFF, 0x4, 0x2A, 0x4B, 0xFC, 0xD0, 0xBB, 0x2, 0x75, 0x0, 0x1, 0x0, 0xA7, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x13, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xF8, 0xFE, 0x5B, 0xB7, 0x1, 0x11, 0xE5, 0xF3, 0x2, 0xFC, 0xFE, 0x3E, 0x4, 0x2B, 0x4B, 0xFD, 0x3F, 0x1, 0x86, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x1, 0x37, 0x1, 0x3, 0x54, 0xF3, 0xF3, 0xFE, 0x74, 0xFE, 0x50, 0xA8, 0x1, 0x78, 0x2, 0x1, 0x3, 0xAF, 0xFA, 0x50, 0x1, 0x3A, 0x2, 0xD6, 0x66, 0xFD, 0x8B, 0x0, 0x1, 0x0, 0x23, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x1, 0x1, 0x37, 0x1, 0x17, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x6C, 0xFE, 0x63, 0xA8, 0x1, 0x9B, 0xEE, 0xF3, 0x1, 0x74, 0x2, 0xB5, 0x66, 0xFD, 0x4F, 0xDC, 0x4, 0xAE, 0x0, 0x1, 0x0, 0x9D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xF7, 0xFE, 0x52, 0xA8, 0x1, 0x5, 0x1, 0xA, 0xF3, 0x2, 0xFC, 0xFE, 0x42, 0x2, 0xD2, 0x65, 0xFE, 0x3C, 0x1, 0xC4, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x8E, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x1, 0x37, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0x50, 0xA8, 0x1, 0x34, 0xEA, 0xF3, 0x2, 0x3C, 0xFE, 0xFE, 0x2, 0xD6, 0x65, 0xFD, 0xEC, 0xDA, 0x2, 0x75, 0x0, 0x1, 0x0, 0x8D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x37, 0x13, 0x1, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xE5, 0xFE, 0x54, 0xA8, 0xF3, 0x1, 0x2C, 0xF3, 0x3, 0xE6, 0xFD, 0x55, 0x2, 0xD5, 0x66, 0xFE, 0x5C, 0x2, 0xDE, 0x0, 0x1, 0x0, 0x31, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x1, 0x1, 0x37, 0x1, 0x17, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0x6B, 0xFE, 0x72, 0xB7, 0x1, 0x8D, 0xDF, 0xF3, 0x1, 0x74, 0x3, 0xF1, 0x4B, 0xFC, 0x1F, 0xCD, 0x4, 0xAE, 0x0, 0x1, 0x0, 0x1D, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x1, 0x37, 0x1, 0x3, 0x54, 0xF3, 0xF3, 0xFE, 0x6D, 0xFE, 0x5C, 0xB6, 0x1, 0x7A, 0x2, 0x1, 0x3, 0xAF, 0xFA, 0x50, 0x1, 0x3A, 0x4, 0x2B, 0x4B, 0xFC, 0x51, 0x0, 0x1, 0x0, 0x93, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x35, 0x5, 0x27, 0x1, 0x11, 0x3, 0x1B, 0xF3, 0xFE, 0xEA, 0x7F, 0x1, 0x95, 0x5, 0xB0, 0xFA, 0x50, 0xFF, 0xFF, 0x8D, 0x1, 0x75, 0x3, 0xAE, 0x0, 0x1, 0x0, 0x9E, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x1, 0x37, 0x17, 0x1, 0x4, 0x47, 0xF3, 0xFE, 0xE0, 0xFE, 0x6A, 0x7F, 0xC5, 0x1, 0x72, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x72, 0xFC, 0x8E, 0x1, 0x74, 0x8E, 0xB8, 0x4, 0x66, 0x0, 0x1, 0x0, 0x78, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x27, 0x1, 0x11, 0x3, 0x1B, 0xF3, 0xFE, 0xF8, 0xA8, 0x1, 0xB0, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0xBC, 0xFE, 0x44, 0x66, 0x2, 0xD5, 0x2, 0x75, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x27, 0x1, 0x11, 0x3, 0x1B, 0xF3, 0xEE, 0xB6, 0x1, 0xA4, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x55, 0xFD, 0xAB, 0x4B, 0x4, 0x2A, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x71, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x27, 0x1, 0x3, 0x1B, 0xF3, 0xFD, 0xBA, 0x1, 0xB7, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x28, 0xFC, 0xD8, 0x3A, 0x5, 0x76, 0x0, 0x1, 0x0, 0xA8, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0xE9, 0x7F, 0x1, 0x96, 0x1, 0x16, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0x2, 0xFE, 0xFE, 0x8D, 0x1, 0x75, 0xFE, 0xFE, 0x4, 0xB0, 0x0, 0x1, 0x0, 0x37, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x21, 0x1, 0x27, 0x1, 0x21, 0x11, 0x33, 0x11, 0x23, 0x3, 0x54, 0xFE, 0xBA, 0xFE, 0xA7, 0x7E, 0x1, 0x95, 0x1, 0x88, 0xF3, 0xF3, 0x1, 0x3B, 0xFE, 0xC5, 0x8D, 0x1, 0x75, 0x3, 0xAE, 0xFA, 0x50, 0x0, 0x1, 0x0, 0x67, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x1, 0x27, 0x1, 0x1, 0x4, 0x47, 0xF3, 0xD8, 0xFE, 0x6A, 0x7F, 0x1, 0x68, 0x1, 0x85, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x90, 0xFD, 0xE2, 0xFE, 0x8E, 0x8D, 0x1, 0x4B, 0x3, 0xD8, 0x0, 0x1, 0x0, 0x47, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x27, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFD, 0x72, 0x7F, 0x3, 0xD, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x55, 0xFD, 0xAB, 0x8D, 0x2, 0xCA, 0x2, 0x59, 0x0, 0x1, 0x0, 0x49, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x1, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xF9, 0xFE, 0x6B, 0x7D, 0x1, 0x6F, 0x1, 0x9C, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x11, 0xFE, 0x61, 0xFE, 0x8E, 0x8D, 0x1, 0x52, 0x2, 0xB2, 0x1, 0x1F, 0x0, 0x1, 0x0, 0x37, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x21, 0x1, 0x37, 0x1, 0x21, 0x11, 0x33, 0x4, 0x47, 0xFD, 0x85, 0xFE, 0x6B, 0x7E, 0x1, 0x59, 0x1, 0x46, 0xF3, 0x1, 0x74, 0x8E, 0xFE, 0xC5, 0x4, 0xE9, 0x0, 0x1, 0x0, 0x98, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x1, 0x3, 0x27, 0x1, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xF7, 0xFC, 0xB7, 0x1, 0xA5, 0x1, 0x17, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x8B, 0xFD, 0x75, 0x4B, 0x4, 0x2A, 0xFD, 0x55, 0x3, 0xE6, 0x0, 0x1, 0x0, 0xAB, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x35, 0x5, 0x21, 0x35, 0x21, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xEA, 0xFE, 0x6D, 0x1, 0x54, 0x1, 0x55, 0x5, 0xB0, 0xFA, 0x50, 0xFF, 0xFF, 0xC7, 0x1, 0x3B, 0x3, 0xAE, 0x0, 0x1, 0x0, 0x3C, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x1, 0x27, 0x1, 0x33, 0x11, 0x23, 0x3, 0x54, 0xFD, 0x67, 0x7F, 0x3, 0x18, 0xF3, 0xF3, 0x4, 0xAE, 0xFD, 0x9C, 0x8D, 0x2, 0xD9, 0xFA, 0x50, 0x0, 0x1, 0x0, 0xA8, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x1, 0x27, 0x1, 0x5, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xEB, 0xFE, 0xE8, 0x7F, 0x1, 0x95, 0x1, 0x17, 0xF3, 0x2, 0x75, 0x1, 0x0, 0xFF, 0x0, 0x8D, 0x1, 0x74, 0xFF, 0x2, 0x39, 0x0, 0x1, 0x0, 0x2C, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x1, 0x27, 0x1, 0x3, 0x54, 0xF3, 0xF3, 0xFE, 0xAF, 0xFE, 0xA8, 0x7F, 0x1, 0x95, 0x4, 0x75, 0x1, 0x3B, 0xFA, 0x50, 0x3, 0xAF, 0xFE, 0xC5, 0x8D, 0x1, 0x74, 0x0, 0x1, 0x0, 0xA7, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x21, 0x23, 0x1, 0x7, 0x27, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xAD, 0xDC, 0x7E, 0x1, 0x95, 0x1, 0x18, 0xF3, 0x3, 0x3F, 0xCB, 0x8D, 0x1, 0x74, 0xFD, 0x56, 0x3, 0xE5, 0x0, 0x1, 0x0, 0x94, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x7, 0x27, 0x1, 0x1, 0x11, 0x33, 0x4, 0x47, 0xF3, 0xFE, 0xB3, 0xF4, 0x7F, 0x1, 0x95, 0x1, 0x2B, 0xF3, 0x1, 0x3B, 0x2, 0x1C, 0xE2, 0x8D, 0x1, 0x74, 0xFE, 0x1C, 0x3, 0x1E, 0x0, 0x1, 0x0, 0xAB, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x8, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x21, 0x35, 0x21, 0x1, 0x4, 0x47, 0xF3, 0xFD, 0xFE, 0x54, 0x1, 0x1F, 0x1, 0x8A, 0x5, 0xB0, 0xFA, 0x50, 0x3, 0x28, 0xFC, 0xD8, 0xC7, 0x4, 0xE9, 0x0, 0x1, 0x0, 0xBC, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x3, 0x21, 0x35, 0x21, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xEE, 0xFE, 0x56, 0x1, 0x25, 0x1, 0x73, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0x55, 0xFD, 0xAB, 0xC7, 0x3, 0xAE, 0x1, 0x3B, 0x0, 0x1, 0x0, 0xB2, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x21, 0x35, 0x21, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xF9, 0xFE, 0x65, 0x1, 0x2D, 0x1, 0x75, 0x5, 0xB0, 0xFA, 0x50, 0x1, 0xBC, 0xFE, 0x44, 0xC7, 0x2, 0x74, 0x2, 0x75, 0x0, 0x1, 0x0, 0x78, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x37, 0x1, 0x11, 0x33, 0x3, 0x1B, 0xF3, 0xFE, 0x50, 0xA8, 0x1, 0x8, 0xF3, 0x1, 0x3B, 0x2, 0xD5, 0x66, 0xFE, 0x44, 0x2, 0xF6, 0x0, 0x1, 0x0, 0x84, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x21, 0x23, 0x1, 0x37, 0x13, 0x11, 0x33, 0x3, 0x1B, 0xF3, 0xFE, 0x5C, 0xB6, 0xEE, 0xF3, 0x4, 0x2A, 0x4B, 0xFD, 0xAB, 0x3, 0x90, 0x0, 0x1, 0x0, 0xB2, 0x0, 0x0, 0x4, 0x47, 0x5, 0xB0, 0x0, 0x9, 0x0, 0x0, 0x1, 0x11, 0x23, 0x11, 0x1, 0x21, 0x35, 0x21, 0x1, 0x11, 0x4, 0x47, 0xF3, 0xFE, 0xF9, 0xFE, 0x65, 0x1, 0x2D, 0x1, 0x75, 0x5, 0xB0, 0xFA, 0x50, 0x2, 0xF6, 0xFE, 0x44, 0xC7, 0x2, 0x74, 0x1, 0x3B, 0x0, 0x1, 0x0, 0x93, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x21, 0x23, 0x11, 0x5, 0x27, 0x1, 0x33, 0x3, 0x1B, 0xF3, 0xFE, 0xEA, 0x7F, 0x1, 0x95, 0xF3, 0x4, 0xAE, 0xFF, 0x8D, 0x1, 0x74, 0x0, 0x1, 0x0, 0x93, 0x0, 0x0, 0x3, 0x1B, 0x5, 0xB0, 0x0, 0x7, 0x0, 0x0, 0x21, 0x23, 0x11, 0x1, 0x37, 0x5, 0x11, 0x33, 0x3, 0x1B, 0xF3, 0xFE, 0x6B, 0x7F, 0x1, 0x16, 0xF3, 0x2, 0x75, 0x1, 0x74, 0x8D, 0xFF, 0x2, 0x39, 0x0, 0x3, 0xFB, 0x8F, 0x4, 0x94, 0x0, 0x31, 0x6, 0x41, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x30, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x8A, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFC, 0x9A, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0x2, 0x63, 0x95, 0x81, 0x5F, 0x40, 0x50, 0x48, 0x36, 0x26, 0x34, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x4, 0x94, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6C, 0x10, 0x10, 0x6C, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x1, 0x17, 0xC, 0x6F, 0x91, 0x2C, 0x2D, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x5, 0xFA, 0xC2, 0x4, 0x94, 0x0, 0xFE, 0x6, 0x41, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x29, 0x0, 0x37, 0x0, 0x4C, 0x0, 0x0, 0x13, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x7, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x44, 0xE, 0x22, 0x3F, 0x3E, 0x23, 0xE, 0x39, 0x81, 0x81, 0xFE, 0xFF, 0xE, 0x22, 0x3F, 0x3E, 0x23, 0xE, 0x39, 0x81, 0x81, 0xFC, 0x8F, 0x39, 0x81, 0x81, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0xD6, 0x39, 0x81, 0x81, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x3, 0x31, 0x95, 0x81, 0x5F, 0x40, 0x50, 0x48, 0x36, 0x26, 0x34, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x4, 0x94, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6C, 0x10, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6C, 0x10, 0x10, 0x6C, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x4A, 0x10, 0x6C, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x1, 0x17, 0xC, 0x6F, 0x91, 0x2C, 0x2D, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x3, 0xFB, 0x5E, 0x4, 0x94, 0x0, 0xC, 0x6, 0x41, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x1F, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x25, 0x15, 0x21, 0x35, 0xAF, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFC, 0x8E, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0x2, 0xE8, 0xFD, 0x51, 0x4, 0x94, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6C, 0x10, 0x10, 0x6C, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0xD3, 0x9E, 0x9E, 0x0, 0x4, 0xFB, 0x1B, 0x4, 0x94, 0xFF, 0xB4, 0x6, 0x41, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x27, 0x0, 0x33, 0x0, 0x0, 0x1, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0xFE, 0xF9, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFC, 0xA3, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0x20, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x1, 0xC9, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x4, 0x94, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6C, 0x10, 0x10, 0x6C, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x78, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x30, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x0, 0x3, 0xFB, 0x6A, 0x4, 0x94, 0x0, 0xD, 0x6, 0x41, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x24, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x13, 0x17, 0x37, 0x33, 0x15, 0x5, 0x23, 0x25, 0x35, 0xAE, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFC, 0x98, 0x39, 0x81, 0x81, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0xFB, 0x8C, 0x8B, 0xD0, 0xFE, 0xF3, 0x9D, 0xFE, 0xF6, 0x4, 0x94, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6C, 0x10, 0x10, 0x6C, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x1, 0x14, 0x8F, 0x8F, 0x12, 0xFC, 0xFB, 0x13, 0x0, 0x3, 0xFB, 0xD6, 0xFD, 0xF2, 0xFF, 0xD5, 0xFF, 0xBA, 0x0, 0xB, 0x0, 0x19, 0x0, 0x27, 0x0, 0x0, 0x5, 0x33, 0x11, 0x14, 0x33, 0x37, 0x15, 0x6, 0x23, 0x22, 0x26, 0x35, 0x5, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xFD, 0x60, 0xA4, 0x33, 0x2B, 0x22, 0x30, 0x4D, 0x63, 0x1, 0xBA, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFD, 0x3D, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0x46, 0xFE, 0xF6, 0x48, 0x4, 0x6E, 0xC, 0x57, 0x63, 0xB5, 0x49, 0x11, 0x3F, 0x3F, 0x3B, 0x3D, 0x11, 0x4C, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x59, 0x6D, 0xF, 0x4C, 0x11, 0x3F, 0x39, 0x3F, 0x3F, 0x11, 0x0, 0x4, 0xFB, 0xE, 0xFE, 0x30, 0xFF, 0xC3, 0xFF, 0xDD, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x23, 0x0, 0x2B, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0x24, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0xF8, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFC, 0x87, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0x2C, 0x43, 0x76, 0x44, 0x44, 0x76, 0x43, 0x1, 0xC9, 0x43, 0x76, 0x44, 0x44, 0x76, 0x43, 0xFE, 0x30, 0x49, 0x11, 0x3F, 0x3F, 0x3B, 0x3D, 0x11, 0x4C, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x59, 0x6D, 0xF, 0x4C, 0x11, 0x3F, 0x39, 0x3F, 0x3F, 0x11, 0xC7, 0x45, 0x45, 0x64, 0x43, 0x43, 0x63, 0x45, 0x45, 0x64, 0x43, 0x43, 0x0, 0x3, 0xFB, 0x9A, 0xFE, 0x29, 0xFF, 0xC9, 0xFF, 0xD6, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x23, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, 0x32, 0x16, 0x14, 0x6, 0x22, 0x26, 0xF2, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFD, 0xC, 0x39, 0x81, 0x81, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0xB9, 0x49, 0x82, 0x49, 0x49, 0x82, 0x49, 0xFE, 0x29, 0x49, 0x11, 0x3F, 0x3F, 0x3B, 0x3D, 0x11, 0x4C, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x59, 0x6D, 0xF, 0x4C, 0x11, 0x3F, 0x39, 0x3F, 0x3F, 0x11, 0xD0, 0x49, 0x49, 0x68, 0x47, 0x47, 0x0, 0x4, 0xFB, 0xA0, 0xFE, 0x22, 0xFF, 0xD3, 0xFF, 0xCF, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x25, 0x0, 0x2F, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, 0x33, 0x32, 0x16, 0x14, 0x6, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x6, 0xE8, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFD, 0x9, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0x74, 0x7E, 0x5F, 0x5E, 0x80, 0x80, 0x5E, 0x5F, 0x7E, 0x6D, 0x3E, 0x64, 0x3E, 0x3E, 0x64, 0x3E, 0xFE, 0x22, 0x49, 0x11, 0x3F, 0x3F, 0x3B, 0x3D, 0x11, 0x4C, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x59, 0x6D, 0xF, 0x4C, 0x11, 0x3F, 0x39, 0x3F, 0x3F, 0x11, 0xDD, 0x7A, 0x7A, 0xAC, 0x76, 0x76, 0x56, 0x2C, 0x43, 0x43, 0x2C, 0x2E, 0x44, 0x44, 0x0, 0x3, 0xFB, 0xA6, 0xFE, 0xE, 0xFF, 0xD9, 0xFF, 0xC2, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x1F, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x1, 0x11, 0x23, 0x11, 0xE1, 0xE, 0x22, 0x3F, 0x3E, 0x23, 0xE, 0x39, 0x81, 0x81, 0xFD, 0x9, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x40, 0x22, 0x1, 0x9C, 0xA7, 0xFE, 0x15, 0x49, 0x11, 0x3F, 0x3F, 0x3B, 0x3D, 0x11, 0x4C, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x59, 0x6D, 0xF, 0x4C, 0x11, 0x3F, 0x39, 0x3F, 0x3F, 0x11, 0x1, 0x55, 0xFE, 0x5B, 0x1, 0xA5, 0x0, 0x3, 0xFB, 0x78, 0xFE, 0x1B, 0x0, 0x0, 0xFF, 0xC8, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x28, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x25, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x20, 0x16, 0xBB, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFC, 0xB3, 0x39, 0x81, 0x81, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x2, 0xBB, 0xB7, 0x40, 0x4C, 0x4D, 0x40, 0xB6, 0xAE, 0x1, 0x2A, 0xAE, 0xFE, 0x1B, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3D, 0x11, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x11, 0x3F, 0x3A, 0x3E, 0x3F, 0x11, 0x1E, 0x37, 0x53, 0x53, 0x37, 0x7C, 0x9E, 0x9E, 0x0, 0x3, 0xFB, 0x50, 0xFE, 0x15, 0x0, 0x20, 0xFF, 0xC2, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x30, 0x0, 0x0, 0x3, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0x9A, 0xE, 0x22, 0x3F, 0x3E, 0x23, 0xE, 0x39, 0x81, 0x81, 0xFC, 0x6C, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x40, 0x22, 0x2, 0x73, 0x94, 0x80, 0x5F, 0x41, 0x50, 0x47, 0x36, 0x26, 0x35, 0x95, 0x7F, 0x60, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0xFE, 0x15, 0x49, 0x11, 0x3F, 0x3F, 0x3B, 0x3D, 0x11, 0x4C, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x59, 0x6D, 0xF, 0x4C, 0x11, 0x3F, 0x39, 0x3F, 0x3F, 0x11, 0x1, 0x35, 0xC, 0x6F, 0x91, 0x2C, 0x2D, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x3, 0xFC, 0x2C, 0xFE, 0x18, 0x0, 0x4D, 0x0, 0x96, 0x0, 0x3, 0x0, 0x11, 0x0, 0x1F, 0x0, 0x0, 0x27, 0x1, 0x27, 0x1, 0x13, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xC8, 0xFE, 0xA1, 0x7E, 0x1, 0x64, 0xD3, 0xD, 0x22, 0x3F, 0x3F, 0x22, 0xD, 0x3A, 0x81, 0x81, 0xFD, 0x1B, 0x3A, 0x81, 0x81, 0x3A, 0xD, 0x23, 0x3E, 0x3F, 0x22, 0x4B, 0xFD, 0xCD, 0x49, 0x2, 0x35, 0xFD, 0x9D, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3D, 0x11, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x11, 0x3F, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x3, 0xFC, 0x19, 0xFE, 0x10, 0x0, 0x3E, 0x0, 0x96, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x29, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x13, 0x17, 0x3, 0x16, 0x15, 0x14, 0x6, 0x25, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xFD, 0xD2, 0x33, 0x48, 0x43, 0x31, 0xFC, 0x78, 0xFA, 0x9, 0x48, 0x1, 0x7D, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFD, 0x16, 0x39, 0x81, 0x81, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0xFE, 0x10, 0x48, 0x33, 0x32, 0x47, 0x3, 0x1, 0x8F, 0x4B, 0xFE, 0x70, 0x17, 0x19, 0x33, 0x48, 0x2C, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3D, 0x11, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x11, 0x3F, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x4, 0xFB, 0x6D, 0xFD, 0xF2, 0xFF, 0xF0, 0xFF, 0xBA, 0x0, 0xB, 0x0, 0x17, 0x0, 0x25, 0x0, 0x33, 0x0, 0x0, 0x5, 0x33, 0x11, 0x14, 0x33, 0x37, 0x15, 0x6, 0x23, 0x22, 0x26, 0x35, 0x1, 0x33, 0x11, 0x14, 0x33, 0x37, 0x15, 0x6, 0x23, 0x22, 0x26, 0x35, 0x5, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xFD, 0xDD, 0xA4, 0x33, 0x2B, 0x22, 0x30, 0x4D, 0x63, 0xFE, 0xAC, 0xA3, 0x34, 0x2B, 0x24, 0x2E, 0x4D, 0x63, 0x2, 0xAC, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFC, 0xB8, 0x39, 0x81, 0x81, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x46, 0xFE, 0xF6, 0x48, 0x4, 0x6E, 0xC, 0x57, 0x63, 0x1, 0xE, 0xFE, 0xF6, 0x48, 0x4, 0x6E, 0xC, 0x57, 0x63, 0xB4, 0x49, 0x11, 0x3F, 0x3F, 0x3B, 0x3D, 0x11, 0x4C, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x59, 0x6D, 0xF, 0x4C, 0x11, 0x3E, 0x3A, 0x3F, 0x3F, 0x11, 0x0, 0x2, 0x0, 0x63, 0xFF, 0xEB, 0x4, 0x86, 0x4, 0xA0, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x10, 0x0, 0x23, 0x22, 0x0, 0x3, 0x35, 0x10, 0x0, 0x33, 0x32, 0x0, 0x13, 0x27, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x4, 0x86, 0xFE, 0xD3, 0xE3, 0xE1, 0xFE, 0xD0, 0x2, 0x1, 0x2F, 0xE2, 0xE1, 0x1, 0x2E, 0x3, 0xF3, 0xA2, 0x7D, 0x7C, 0xA3, 0xA5, 0x7C, 0x7D, 0xA0, 0x2, 0x3E, 0xFE, 0xD8, 0xFE, 0xD5, 0x1, 0x28, 0x1, 0x23, 0x17, 0x1, 0x29, 0x1, 0x2A, 0xFE, 0xDB, 0xFE, 0xDE, 0x5, 0xC4, 0xBB, 0xBB, 0xC4, 0x2F, 0xC4, 0xBD, 0xBD, 0xC4, 0x0, 0x2, 0xFC, 0x11, 0x0, 0x0, 0x0, 0x0, 0x1, 0xAD, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x23, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xBB, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFD, 0x4D, 0x39, 0x82, 0x82, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x2, 0xFB, 0x5E, 0x0, 0x0, 0x0, 0x0, 0x1, 0xAD, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x23, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xBB, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFC, 0x9A, 0x39, 0x82, 0x82, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x2, 0xFA, 0x4E, 0x0, 0x0, 0x0, 0x0, 0x1, 0xAD, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x23, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xBB, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFB, 0x8A, 0x39, 0x82, 0x82, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x4, 0xFA, 0x81, 0x0, 0x0, 0x0, 0x0, 0x1, 0xAD, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x29, 0x0, 0x37, 0x0, 0x0, 0x23, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x5, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xBB, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFB, 0xBD, 0x39, 0x82, 0x82, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x3, 0x33, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFD, 0x4D, 0x39, 0x82, 0x82, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x4A, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x4, 0xF9, 0xCE, 0x0, 0x0, 0x0, 0x0, 0x1, 0xAD, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x29, 0x0, 0x37, 0x0, 0x0, 0x23, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x5, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xBB, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFB, 0xA, 0x39, 0x82, 0x82, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x3, 0xE6, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFC, 0x9A, 0x39, 0x82, 0x82, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x4A, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x4, 0xF8, 0xBE, 0x0, 0x0, 0x0, 0x0, 0x1, 0xAD, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x29, 0x0, 0x37, 0x0, 0x0, 0x23, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x5, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0xBB, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xF9, 0xFA, 0x39, 0x82, 0x82, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x4, 0xF6, 0xE, 0x22, 0x40, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFB, 0x8A, 0x39, 0x82, 0x82, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x4A, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x1, 0x0, 0x3A, 0x0, 0x0, 0x3, 0xEB, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x0, 0x1, 0x15, 0x1, 0x23, 0x1, 0x21, 0x35, 0x3, 0xEB, 0xFD, 0xD3, 0xF3, 0x2, 0x2C, 0xFD, 0x43, 0x5, 0xB0, 0x86, 0xFA, 0xD6, 0x4, 0xED, 0xC3, 0x0, 0x2, 0x0, 0x7D, 0xFF, 0xEC, 0x4, 0x46, 0x6, 0x0, 0x0, 0xF, 0x0, 0x1B, 0x0, 0x0, 0x5, 0x22, 0x27, 0x7, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x17, 0x15, 0x14, 0x2, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x2, 0x8D, 0xC0, 0x6D, 0x11, 0xD2, 0xF2, 0x6A, 0xB2, 0xCF, 0xEA, 0x2, 0xEB, 0xFE, 0xF4, 0x87, 0x7E, 0x7F, 0x88, 0x9A, 0x44, 0x47, 0x14, 0x8F, 0x7B, 0x6, 0x0, 0xFD, 0xD2, 0x7C, 0xFE, 0xD5, 0xF4, 0x1D, 0xEC, 0xFE, 0xC6, 0xC7, 0xCE, 0x91, 0x15, 0x96, 0xCB, 0x87, 0xFE, 0x3B, 0x89, 0x0, 0x1, 0x0, 0x51, 0xFF, 0xEC, 0x4, 0x1, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x32, 0x36, 0x37, 0x33, 0x6, 0x4, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x2, 0x42, 0x59, 0x7C, 0x5, 0xE5, 0x7, 0xFE, 0xFF, 0xB5, 0xFA, 0xF9, 0xFA, 0xF9, 0xC5, 0xF1, 0x7, 0xE5, 0x5, 0x73, 0x63, 0x94, 0x69, 0x68, 0xAF, 0x68, 0x4F, 0x9D, 0xDD, 0x1, 0x40, 0xDF, 0x24, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x83, 0xD9, 0x0, 0x2, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x17, 0x6, 0x0, 0x0, 0xB, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x11, 0x33, 0x11, 0x2, 0x4B, 0x92, 0x47, 0x46, 0x91, 0x84, 0x87, 0x86, 0x1, 0x7D, 0x11, 0x6E, 0xB9, 0xC4, 0xF9, 0xF9, 0xC6, 0xAB, 0x6A, 0xF3, 0xB3, 0x80, 0x1, 0xD9, 0x7C, 0xCC, 0x96, 0x15, 0x90, 0xCE, 0xB3, 0x75, 0x89, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x76, 0x2, 0x28, 0xFA, 0x0, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x56, 0x4, 0x17, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x26, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x20, 0x13, 0x35, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x6, 0x0, 0x7, 0x2, 0x4A, 0x95, 0x45, 0x44, 0x94, 0x84, 0x86, 0x85, 0x5D, 0x4C, 0xBE, 0x4D, 0x35, 0x80, 0x92, 0x1, 0xA, 0x6, 0x6A, 0xAE, 0xC6, 0xF6, 0xF6, 0xC8, 0xBF, 0x6A, 0x10, 0xD0, 0x1, 0xFE, 0xFE, 0xE9, 0xB3, 0x7F, 0x1, 0xDB, 0x7B, 0xCB, 0x96, 0x15, 0x91, 0xCE, 0xFD, 0xA3, 0x2B, 0x31, 0xAF, 0x4C, 0x1, 0x2C, 0x21, 0x76, 0x1, 0x3A, 0xEC, 0x15, 0xF7, 0x1, 0x30, 0x86, 0x72, 0xFC, 0x15, 0xF1, 0xFE, 0xFA, 0x2, 0x0, 0x2, 0x0, 0x4C, 0xFF, 0xEC, 0x4, 0x55, 0x4, 0x4E, 0x0, 0xC, 0x0, 0x1A, 0x0, 0x0, 0x13, 0x34, 0x0, 0x33, 0x32, 0x0, 0x17, 0x15, 0x14, 0x0, 0x20, 0x0, 0x35, 0x17, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x4C, 0x1, 0x18, 0xEB, 0xEE, 0x1, 0x17, 0x1, 0xFE, 0xE9, 0xFE, 0x26, 0xFE, 0xE8, 0xF3, 0x8A, 0x88, 0x87, 0x8A, 0x8A, 0x89, 0x87, 0x89, 0x2, 0x27, 0xEC, 0x1, 0x3B, 0xFE, 0xC7, 0xEB, 0x18, 0xEB, 0xFE, 0xC5, 0x1, 0x3B, 0xEC, 0x1, 0x91, 0xD2, 0xD2, 0x91, 0x15, 0x8F, 0xD5, 0xD5, 0x8F, 0x0, 0x2, 0x0, 0x7D, 0xFE, 0x60, 0x4, 0x45, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x17, 0x22, 0x27, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x12, 0x15, 0x15, 0x14, 0x2, 0x2, 0x48, 0x83, 0x87, 0x89, 0x83, 0x94, 0x43, 0x45, 0xD8, 0xB1, 0x6C, 0xF2, 0xD9, 0xD, 0x6E, 0xB9, 0xCE, 0xED, 0xEE, 0xAF, 0xD2, 0x91, 0x15, 0x96, 0xCB, 0x79, 0xFE, 0x1A, 0x7A, 0xC3, 0x75, 0xFD, 0xFF, 0x5, 0xDA, 0x70, 0x84, 0xFE, 0xD0, 0xF8, 0x14, 0xEC, 0xFE, 0xC6, 0x0, 0x2, 0x0, 0x50, 0xFE, 0x60, 0x4, 0x17, 0x4, 0x4E, 0x0, 0xF, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x23, 0x11, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x1, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x4, 0x17, 0xF3, 0x6A, 0xAB, 0xCA, 0xF5, 0xF4, 0xCD, 0xB7, 0x6C, 0x10, 0xD3, 0xFE, 0x36, 0x90, 0x47, 0x48, 0x8D, 0x83, 0x8A, 0x88, 0xFE, 0x60, 0x1, 0xFD, 0x71, 0x1, 0x39, 0xED, 0x14, 0xF7, 0x1, 0x31, 0x82, 0x6E, 0xFC, 0x75, 0x77, 0x1, 0xF3, 0x72, 0xCF, 0x96, 0x15, 0x90, 0xD2, 0x0, 0x2, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x34, 0x26, 0x1, 0x6, 0x6, 0x23, 0x22, 0x0, 0x35, 0x35, 0x34, 0x0, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x2, 0x3D, 0x65, 0x7C, 0x10, 0x1, 0xCF, 0x64, 0x1, 0x2A, 0x31, 0xB4, 0x85, 0xFC, 0xFE, 0xD9, 0x1, 0x1B, 0xCE, 0xEC, 0xE3, 0xFD, 0x3E, 0xD, 0xA3, 0x95, 0x54, 0x93, 0x31, 0x3, 0x8B, 0x8C, 0x7C, 0x19, 0x60, 0x8F, 0xFC, 0xCD, 0x25, 0x47, 0x1, 0x31, 0xE7, 0x29, 0xFA, 0x1, 0x27, 0xFE, 0xE4, 0xE0, 0x81, 0x7E, 0xA4, 0x30, 0x1F, 0x0, 0x2, 0x0, 0x51, 0xFE, 0x56, 0x4, 0x5, 0x4, 0x4E, 0x0, 0xB, 0x0, 0x25, 0x0, 0x0, 0x25, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x13, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x20, 0x13, 0x35, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x37, 0x33, 0x11, 0x14, 0x0, 0x2, 0x37, 0x98, 0x43, 0x42, 0x97, 0x83, 0x72, 0x70, 0x5E, 0x46, 0xB1, 0x47, 0x35, 0x77, 0x82, 0x1, 0xA, 0x6, 0x6A, 0xAE, 0xC7, 0xE2, 0xE2, 0xC9, 0xBF, 0x69, 0x10, 0xD1, 0xFE, 0xFA, 0xB3, 0x85, 0x1, 0xD0, 0x80, 0xCB, 0x96, 0x15, 0x91, 0xCE, 0xFD, 0xA3, 0x25, 0x2A, 0xAF, 0x3F, 0x1, 0x1F, 0x2F, 0x77, 0x1, 0x3A, 0xEC, 0x15, 0xF7, 0x1, 0x30, 0x85, 0x71, 0xFC, 0xC, 0xEF, 0xFE, 0xFF, 0x0, 0x1, 0x0, 0x3E, 0xFE, 0x4A, 0x4, 0x66, 0x4, 0x4A, 0x0, 0x1E, 0x0, 0x0, 0x1, 0x6, 0x27, 0x26, 0x26, 0x27, 0x27, 0x3, 0x23, 0x1, 0x3, 0x26, 0x26, 0x23, 0x7, 0x27, 0x36, 0x33, 0x32, 0x16, 0x16, 0x17, 0x17, 0x13, 0x33, 0x1, 0x13, 0x16, 0x17, 0x16, 0x37, 0x4, 0x3E, 0x2B, 0x36, 0x7B, 0x7C, 0x32, 0x64, 0xF9, 0xF7, 0x1, 0x7C, 0xA8, 0x19, 0x59, 0x3E, 0x43, 0x3, 0x48, 0x3C, 0x6A, 0x77, 0x44, 0x15, 0x5D, 0xE0, 0xF5, 0xFE, 0x9F, 0xC6, 0x34, 0x4E, 0x2B, 0x26, 0xFE, 0x59, 0xF, 0x3, 0x6, 0xB5, 0x73, 0xE6, 0xFD, 0xFF, 0x3, 0xC, 0x1, 0x81, 0x3F, 0x56, 0x5, 0xBB, 0x12, 0x5B, 0x7F, 0x30, 0xD3, 0x1, 0xCD, 0xFD, 0x2A, 0xFE, 0x3F, 0x7F, 0x7, 0x4, 0x5, 0xFF, 0xFF, 0x0, 0x5A, 0x0, 0x0, 0x2, 0xB2, 0x5, 0xB5, 0x0, 0x6, 0x0, 0x16, 0xB2, 0x0, 0x0, 0x3, 0x0, 0x5, 0x0, 0x0, 0x4, 0xC1, 0x6, 0x0, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x32, 0x0, 0x0, 0x1, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x25, 0x27, 0x11, 0x23, 0x11, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x17, 0x11, 0x33, 0x11, 0x33, 0x32, 0x36, 0x35, 0x17, 0x14, 0x6, 0x4, 0x6, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFC, 0x80, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x40, 0x22, 0x2, 0x20, 0x1A, 0xF3, 0x27, 0x34, 0x95, 0x7F, 0x5F, 0x12, 0xF3, 0x9, 0x26, 0x36, 0x95, 0x80, 0x2, 0x42, 0x4A, 0x11, 0x3E, 0x3F, 0x3C, 0x3E, 0x10, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x10, 0x40, 0x3A, 0x3E, 0x3F, 0x11, 0x17, 0x1, 0xFD, 0x5C, 0x2, 0xFC, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x1, 0x2, 0x60, 0xFD, 0x47, 0x3A, 0x2E, 0xC, 0x70, 0x90, 0x0, 0x4, 0x0, 0x50, 0xFF, 0xEC, 0x5, 0x8B, 0x6, 0x0, 0x0, 0xC, 0x0, 0x19, 0x0, 0x25, 0x0, 0x3D, 0x0, 0x0, 0x1, 0x36, 0x36, 0x35, 0x34, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x21, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x15, 0x14, 0x16, 0x17, 0x13, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x5, 0x27, 0x6, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x4, 0xD7, 0x1B, 0x32, 0x4D, 0xD, 0x34, 0x73, 0x73, 0x34, 0xFC, 0xF7, 0x34, 0x73, 0x73, 0x34, 0xE, 0x4E, 0x33, 0x1B, 0x4E, 0x95, 0x45, 0x44, 0x94, 0x84, 0x73, 0x72, 0x1, 0x73, 0xB, 0x6C, 0xB7, 0xC3, 0xE6, 0xE5, 0xC6, 0xAC, 0x6A, 0xFC, 0xFC, 0xF3, 0xAF, 0xAF, 0x4, 0xA8, 0xE, 0x33, 0x33, 0x50, 0x26, 0x4B, 0xD, 0x62, 0x52, 0x51, 0x5F, 0xE, 0xE, 0x5F, 0x51, 0x52, 0x62, 0xD, 0x4B, 0x27, 0x4F, 0x33, 0x33, 0xE, 0xFC, 0xB, 0x86, 0x1, 0xCD, 0x82, 0xD0, 0x92, 0x15, 0x91, 0xCD, 0xB3, 0x70, 0x84, 0x1, 0x39, 0xEC, 0x15, 0xF7, 0x1, 0x31, 0x77, 0xF1, 0xAB, 0x8D, 0x8D, 0xAB, 0xFB, 0x38, 0x0, 0x3, 0x0, 0x7A, 0xFD, 0xF6, 0x5, 0x5, 0x4, 0x4E, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x36, 0x0, 0x0, 0x1, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x37, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x23, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x14, 0x6, 0x4, 0x4A, 0xE, 0x23, 0x3F, 0x3F, 0x23, 0xE, 0x3A, 0x81, 0x81, 0xFD, 0x54, 0x39, 0x81, 0x81, 0x39, 0xE, 0x23, 0x3E, 0x3F, 0x22, 0xBB, 0x44, 0x3B, 0xE, 0x26, 0x3D, 0x7B, 0x1, 0x66, 0x60, 0x91, 0x4B, 0xF3, 0xDE, 0xE, 0x71, 0xC5, 0xA1, 0xC4, 0x1, 0xBC, 0xFD, 0xF6, 0x4A, 0x11, 0x3E, 0x3F, 0x3B, 0x3E, 0x11, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x11, 0x3F, 0x3A, 0x3E, 0x3F, 0x11, 0xB, 0x11, 0xC5, 0xC, 0xA9, 0x2, 0xE2, 0x83, 0x65, 0x67, 0xFC, 0xDF, 0x4, 0x3A, 0x95, 0xA9, 0xC4, 0xE3, 0xFD, 0x1A, 0xB6, 0xC0, 0xFF, 0xFF, 0x0, 0x5, 0xFD, 0xFF, 0x5, 0xB6, 0x4, 0x4E, 0x0, 0x27, 0x0, 0xDC, 0x0, 0x91, 0x0, 0x0, 0x0, 0x7, 0x3, 0x2E, 0x5, 0x16, 0xFD, 0x3A, 0x0, 0x4, 0x0, 0x5, 0xFF, 0xEC, 0x5, 0x4E, 0x6, 0x0, 0x0, 0xC, 0x0, 0x19, 0x0, 0x31, 0x0, 0x3C, 0x0, 0x0, 0x1, 0x36, 0x36, 0x35, 0x34, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x21, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x15, 0x14, 0x16, 0x17, 0x1, 0x14, 0x2, 0x23, 0x22, 0x27, 0x7, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x36, 0x33, 0x32, 0x12, 0x17, 0x1, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x7, 0x11, 0x16, 0x3, 0xA7, 0x1C, 0x32, 0x4E, 0xE, 0x34, 0x73, 0x73, 0x34, 0xFC, 0xF7, 0x34, 0x73, 0x73, 0x34, 0xE, 0x4E, 0x33, 0x1B, 0x4, 0x94, 0xD8, 0xCE, 0xBC, 0x6C, 0xC, 0xDC, 0xBB, 0xBB, 0xF3, 0xF0, 0xF0, 0x6A, 0xB1, 0xD0, 0xD7, 0x1, 0xFE, 0x1D, 0x87, 0x69, 0x66, 0x8C, 0x9C, 0x42, 0x43, 0x4, 0xA8, 0xE, 0x33, 0x33, 0x50, 0x26, 0x4B, 0xD, 0x62, 0x52, 0x51, 0x5F, 0xE, 0xE, 0x5F, 0x51, 0x52, 0x62, 0xD, 0x4B, 0x27, 0x4F, 0x33, 0x33, 0xE, 0xFD, 0x6A, 0xEF, 0xFE, 0xC9, 0x89, 0x75, 0x4, 0xC0, 0xAB, 0x95, 0x95, 0xAB, 0xED, 0x7B, 0xFE, 0xD0, 0xF3, 0xFE, 0x88, 0xCA, 0xAA, 0x8F, 0xD2, 0x8B, 0xFE, 0x43, 0x8D, 0x0, 0x3, 0x0, 0x5, 0xFD, 0xF6, 0x3, 0xF4, 0x4, 0x4E, 0x0, 0x17, 0x0, 0x25, 0x0, 0x33, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x17, 0x36, 0x33, 0x32, 0x17, 0x7, 0x26, 0x23, 0x22, 0x7, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x13, 0x27, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x16, 0x16, 0x15, 0x14, 0x6, 0x5, 0x26, 0x26, 0x35, 0x34, 0x36, 0x37, 0x17, 0x6, 0x6, 0x15, 0x14, 0x16, 0x17, 0x2, 0xDF, 0x36, 0x46, 0x7D, 0xD6, 0xE8, 0x7, 0x57, 0x9C, 0x31, 0x25, 0x2, 0x32, 0x30, 0xA7, 0x3A, 0x5C, 0x41, 0x23, 0x1C, 0x5A, 0xE, 0x22, 0x3F, 0x3E, 0x23, 0xE, 0x39, 0x82, 0x82, 0xFD, 0x4E, 0x3A, 0x81, 0x81, 0x3A, 0xE, 0x23, 0x3F, 0x40, 0x22, 0xFE, 0x58, 0xD, 0x8D, 0xB3, 0x4, 0xAF, 0x79, 0x8D, 0xD, 0xE5, 0x8, 0x7E, 0xFC, 0xA5, 0x56, 0x40, 0x6, 0xFE, 0xFB, 0x4A, 0x11, 0x3E, 0x3F, 0x3B, 0x3E, 0x11, 0x4B, 0xF, 0x6B, 0x5B, 0x5C, 0x6D, 0xF, 0xF, 0x6D, 0x5C, 0x5A, 0x6C, 0xF, 0x4B, 0x11, 0x3F, 0x3A, 0x3E, 0x3F, 0x11, 0x0, 0x3, 0x0, 0x5D, 0xFF, 0xEE, 0x4, 0xB7, 0x4, 0x9D, 0x0, 0xA, 0x0, 0x12, 0x0, 0x30, 0x0, 0x0, 0x1, 0x14, 0x16, 0x17, 0x37, 0x36, 0x35, 0x34, 0x26, 0x22, 0x6, 0x13, 0x32, 0x37, 0x3, 0x7, 0x6, 0x15, 0x14, 0x5, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x7, 0x7, 0x17, 0x36, 0x35, 0x33, 0x14, 0x7, 0x17, 0x1, 0x94, 0x39, 0x2A, 0x41, 0x48, 0x40, 0x72, 0x3A, 0x74, 0x74, 0x57, 0xFC, 0x48, 0x40, 0x2, 0x5C, 0x4A, 0x9A, 0xCC, 0xBF, 0xDF, 0x67, 0x5A, 0x36, 0x45, 0x58, 0xB6, 0x9D, 0x9B, 0xB9, 0xA4, 0x40, 0xE7, 0x39, 0xD5, 0x80, 0xC8, 0x3, 0x75, 0x29, 0x49, 0x2A, 0x2C, 0x34, 0x40, 0x2A, 0x3C, 0x42, 0xFD, 0x15, 0x2D, 0x1, 0x4, 0x31, 0x31, 0x45, 0x8A, 0xB2, 0x4C, 0x5E, 0xAF, 0x82, 0x64, 0x84, 0x3E, 0x25, 0x48, 0x7F, 0x5A, 0x73, 0x9F, 0xA2, 0x78, 0x93, 0x71, 0x2C, 0xF0, 0x62, 0x86, 0xDD, 0x9E, 0xD0, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x3, 0x9F, 0x4, 0x8D, 0x0, 0xD, 0x0, 0x0, 0x33, 0x11, 0x7, 0x35, 0x37, 0x11, 0x33, 0x11, 0x37, 0x15, 0x7, 0x11, 0x21, 0x15, 0x81, 0x7D, 0x7D, 0xF3, 0xF9, 0xF9, 0x2, 0x2B, 0x2, 0x9, 0x26, 0x93, 0x26, 0x1, 0xF1, 0xFE, 0x59, 0x4B, 0x93, 0x4B, 0xFE, 0x70, 0xC3, 0x0, 0x2, 0xFF, 0xF0, 0x0, 0x0, 0x6, 0x4, 0x4, 0x8D, 0x0, 0x2, 0x0, 0x12, 0x0, 0x0, 0x1, 0x3, 0x1, 0x1, 0x3, 0x21, 0x3, 0x21, 0x1, 0x21, 0x15, 0x21, 0x13, 0x21, 0x15, 0x21, 0x13, 0x21, 0x15, 0x2, 0xEE, 0x13, 0xFE, 0xFE, 0x1, 0x27, 0xA, 0xFE, 0x83, 0x84, 0xFE, 0xFB, 0x2, 0x6F, 0x3, 0x77, 0xFD, 0xF6, 0xA, 0x1, 0xC3, 0xFE, 0x45, 0xC, 0x2, 0x1A, 0x1, 0xC8, 0x2, 0x2, 0xFD, 0xFE, 0xFE, 0x38, 0x1, 0x7, 0xFE, 0xF9, 0x4, 0x8D, 0xC1, 0xFE, 0xF4, 0xC1, 0xFE, 0xC2, 0xC1, 0x0, 0x2, 0x0, 0x76, 0x0, 0x0, 0x3, 0xD3, 0x4, 0x8D, 0x0, 0x8, 0x0, 0x15, 0x0, 0x0, 0x1, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x3, 0x15, 0x23, 0x11, 0x33, 0x15, 0x33, 0x16, 0x16, 0x15, 0x14, 0x6, 0x23, 0x1, 0x69, 0x99, 0x74, 0x6B, 0x6B, 0x74, 0x99, 0xF3, 0xF3, 0x9D, 0xDB, 0xF2, 0xF4, 0xDD, 0x3, 0x13, 0xFE, 0x94, 0x65, 0x4E, 0x49, 0x70, 0xFD, 0xD0, 0xE3, 0x4, 0x8D, 0xB6, 0x1, 0xD7, 0xA3, 0xAC, 0xCD, 0x0, 0x3, 0x0, 0x50, 0xFF, 0xC8, 0x4, 0x6F, 0x4, 0xBB, 0x0, 0x8, 0x0, 0x11, 0x0, 0x27, 0x0, 0x0, 0x1, 0x14, 0x17, 0x1, 0x26, 0x23, 0x22, 0x6, 0x15, 0x1, 0x32, 0x36, 0x35, 0x35, 0x34, 0x27, 0x1, 0x16, 0x17, 0x22, 0x27, 0x7, 0x23, 0x37, 0x26, 0x27, 0x35, 0x10, 0x0, 0x33, 0x32, 0x17, 0x37, 0x33, 0x7, 0x16, 0x17, 0x15, 0x10, 0x0, 0x1, 0x42, 0x28, 0x1, 0x9B, 0x43, 0x63, 0x85, 0x98, 0x1, 0x1F, 0x87, 0x95, 0x23, 0xFE, 0x68, 0x42, 0x5D, 0x9D, 0x79, 0x4D, 0xA5, 0x88, 0x8F, 0x2, 0x1, 0x26, 0xE9, 0xA3, 0x7B, 0x49, 0xA4, 0x85, 0x89, 0x1, 0xFE, 0xDE, 0x2, 0x2C, 0x80, 0x59, 0x2, 0x51, 0x34, 0xC1, 0xB5, 0xFE, 0x52, 0xC3, 0xB5, 0x36, 0x7A, 0x55, 0xFD, 0xB3, 0x30, 0xC4, 0x47, 0x6F, 0xC4, 0x9A, 0xFF, 0x3B, 0x1, 0xA, 0x1, 0x33, 0x4B, 0x69, 0xC0, 0x9A, 0xFD, 0x38, 0xFE, 0xF6, 0xFE, 0xCE, 0x0, 0x2, 0x0, 0x32, 0x0, 0x0, 0x4, 0xD8, 0x4, 0x8D, 0x0, 0x3, 0x0, 0x17, 0x0, 0x0, 0x1, 0x35, 0x21, 0x15, 0x1, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x3, 0x8B, 0xFD, 0xF4, 0x2, 0xC, 0xFD, 0xF4, 0xF3, 0x5A, 0x5A, 0xF3, 0x2, 0xC, 0xF3, 0x5A, 0x5A, 0x2, 0x9F, 0xB0, 0xB0, 0xFD, 0x61, 0x1, 0xDB, 0xFE, 0x25, 0x3, 0x4F, 0xAB, 0x93, 0x93, 0x93, 0x93, 0xAB, 0xFC, 0xB1, 0x0, 0x1, 0x0, 0x76, 0xFE, 0x4B, 0x4, 0x67, 0x4, 0x8D, 0x0, 0x13, 0x0, 0x0, 0x1, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x35, 0x1, 0x11, 0x23, 0x11, 0x33, 0x1, 0x11, 0x33, 0x11, 0x14, 0x6, 0x3, 0x7, 0x45, 0x3A, 0xE, 0x26, 0x3D, 0x78, 0x3, 0xFD, 0xF5, 0xF3, 0xF3, 0x2, 0xC, 0xF2, 0xBB, 0xFE, 0x4B, 0x11, 0xC5, 0xC, 0xA4, 0x49, 0x3, 0x1A, 0xFC, 0xE4, 0x4, 0x8D, 0xFC, 0xE4, 0x3, 0x1C, 0xFB, 0x34, 0xB6, 0xC0, 0x0, 0x2, 0xFD, 0x40, 0x4, 0xD2, 0xFF, 0x20, 0x7, 0x4C, 0x0, 0x9, 0x0, 0xD, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x13, 0x13, 0x21, 0x1, 0xFD, 0x40, 0x45, 0x7C, 0x45, 0x45, 0x7C, 0x45, 0x8, 0xC3, 0x1, 0x15, 0xFE, 0xEB, 0x6, 0xD1, 0x35, 0x46, 0x46, 0x35, 0x34, 0x46, 0x46, 0xFE, 0x35, 0x1, 0x2E, 0xFE, 0xD2, 0x0, 0x3, 0xFC, 0x4A, 0x4, 0xDB, 0xFF, 0x27, 0x7, 0x22, 0x0, 0xB, 0x0, 0x17, 0x0, 0x2C, 0x0, 0x0, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x17, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0xFC, 0x57, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x1, 0xC9, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x72, 0x95, 0x80, 0x60, 0x41, 0x50, 0x47, 0x35, 0x27, 0x34, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x6, 0xAB, 0x32, 0x45, 0x45, 0x32, 0x31, 0x45, 0x45, 0x30, 0x32, 0x44, 0x44, 0x32, 0x31, 0x45, 0x45, 0x84, 0xC, 0x6F, 0x91, 0x2D, 0x2C, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x3, 0xFC, 0x57, 0x4, 0xE0, 0xFF, 0x1D, 0x7, 0x2D, 0x0, 0x3, 0x0, 0xF, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x13, 0x21, 0x1, 0x5, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0xFD, 0x3D, 0xC3, 0x1, 0x15, 0xFE, 0xEB, 0xFE, 0x57, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x1, 0xC9, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x5, 0xFE, 0x1, 0x2F, 0xFE, 0xD1, 0xA8, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x30, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x0, 0x2, 0xFC, 0x57, 0x4, 0xE1, 0xFF, 0x1A, 0x7, 0x3B, 0x0, 0x9, 0x0, 0x12, 0x0, 0x0, 0x1, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0x7, 0x17, 0x37, 0x33, 0x15, 0x1, 0x23, 0x1, 0x35, 0xFD, 0x35, 0x45, 0x7C, 0x45, 0x45, 0x7C, 0x45, 0x10, 0x93, 0x92, 0xD0, 0xFE, 0xE9, 0x97, 0xFE, 0xEB, 0x6, 0xC0, 0x35, 0x46, 0x46, 0x35, 0x34, 0x46, 0x46, 0x8A, 0x9B, 0x9B, 0xB, 0xFE, 0xEA, 0x1, 0x17, 0xA, 0x0, 0x2, 0xFC, 0x65, 0x4, 0xE0, 0xFF, 0x13, 0x6, 0xE4, 0x0, 0x3, 0x0, 0xD, 0x0, 0x0, 0x3, 0x15, 0x21, 0x35, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x6, 0x22, 0x26, 0xED, 0xFD, 0x52, 0xD0, 0x45, 0x7C, 0x45, 0x45, 0x7C, 0x45, 0x6, 0xE4, 0x9E, 0x9E, 0xFE, 0x76, 0x35, 0x46, 0x46, 0x35, 0x34, 0x46, 0x46, 0x0, 0x2, 0xFC, 0x5F, 0x5, 0xC, 0xFF, 0x13, 0x7, 0x2D, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x13, 0x23, 0x1, 0x1, 0x15, 0x21, 0x35, 0xFD, 0x73, 0xC4, 0xCA, 0xFE, 0xF2, 0x2, 0xB4, 0xFD, 0x52, 0x7, 0x2D, 0xFE, 0xD1, 0x1, 0x2F, 0xFE, 0x7D, 0x9E, 0x9E, 0x0, 0x3, 0xFC, 0x57, 0x4, 0xE0, 0xFF, 0x1D, 0x6, 0xDA, 0x0, 0x3, 0x0, 0xF, 0x0, 0x1B, 0x0, 0x0, 0x3, 0x15, 0x21, 0x35, 0x3, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0xED, 0xFD, 0x52, 0xE, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x1, 0xC9, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x6, 0xDA, 0x9E, 0x9E, 0xFE, 0x7C, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x30, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x0, 0x3, 0xFC, 0x57, 0x4, 0xE0, 0xFF, 0x1D, 0x7, 0x2D, 0x0, 0x3, 0x0, 0xF, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x13, 0x23, 0x1, 0x3, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0xFD, 0x73, 0xC4, 0xCA, 0xFE, 0xF2, 0x8, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x1, 0xC9, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x7, 0x2D, 0xFE, 0xD1, 0x1, 0x2F, 0xFE, 0x29, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x30, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x0, 0x2, 0xFC, 0x65, 0x5, 0xC, 0xFF, 0x15, 0x7, 0x2D, 0x0, 0x3, 0x0, 0x7, 0x0, 0x0, 0x1, 0x13, 0x21, 0x1, 0x5, 0x15, 0x21, 0x35, 0xFD, 0x3D, 0xC3, 0x1, 0x15, 0xFE, 0xEB, 0x1, 0x13, 0xFD, 0x52, 0x5, 0xFE, 0x1, 0x2F, 0xFE, 0xD1, 0x54, 0x9E, 0x9E, 0x0, 0x2, 0xFC, 0x4A, 0x4, 0xDB, 0xFF, 0x27, 0x7, 0x2, 0x0, 0x3, 0x0, 0x18, 0x0, 0x0, 0x3, 0x15, 0x21, 0x35, 0x1, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0xED, 0xFD, 0x52, 0x2, 0x2D, 0x95, 0x80, 0x60, 0x41, 0x50, 0x47, 0x35, 0x27, 0x34, 0x95, 0x7F, 0x5F, 0x52, 0x6F, 0x4D, 0x26, 0x36, 0x7, 0x2, 0x9E, 0x9E, 0xFE, 0xF3, 0xC, 0x6F, 0x91, 0x2D, 0x2C, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x3, 0xFC, 0x57, 0x5, 0xC, 0xFF, 0x1D, 0x6, 0xFA, 0x0, 0xB, 0x0, 0x17, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x17, 0x15, 0x21, 0x35, 0xFC, 0x57, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x1, 0xC9, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0xF3, 0xFD, 0x52, 0x6, 0x83, 0x32, 0x45, 0x45, 0x32, 0x31, 0x45, 0x45, 0x30, 0x32, 0x44, 0x44, 0x32, 0x31, 0x45, 0x45, 0xA7, 0x9E, 0x9E, 0x0, 0x2, 0xFC, 0x50, 0x4, 0xDB, 0xFF, 0x2D, 0x7, 0x55, 0x0, 0x3, 0x0, 0x18, 0x0, 0x0, 0x1, 0x13, 0x21, 0x1, 0x17, 0x17, 0x14, 0x6, 0x23, 0x22, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x27, 0x34, 0x36, 0x33, 0x32, 0x16, 0x33, 0x32, 0x36, 0xFD, 0x43, 0xC4, 0x1, 0x14, 0xFE, 0xEC, 0x91, 0x95, 0x80, 0x5F, 0x41, 0x50, 0x48, 0x35, 0x26, 0x35, 0x95, 0x7F, 0x60, 0x51, 0x6F, 0x4D, 0x27, 0x35, 0x6, 0x26, 0x1, 0x2F, 0xFE, 0xD1, 0x31, 0xC, 0x6F, 0x91, 0x2D, 0x2C, 0x39, 0x2E, 0x8, 0x6E, 0x96, 0x59, 0x39, 0x0, 0x3, 0xFC, 0x57, 0x4, 0xE0, 0xFF, 0x1D, 0x7, 0x2E, 0x0, 0x8, 0x0, 0x14, 0x0, 0x20, 0x0, 0x0, 0x1, 0x17, 0x37, 0x33, 0x15, 0x1, 0x23, 0x1, 0x35, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x23, 0x22, 0x26, 0xFD, 0x25, 0x93, 0x92, 0xD0, 0xFE, 0xE9, 0x97, 0xFE, 0xEB, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x1, 0xC9, 0x43, 0x3B, 0x3A, 0x45, 0x45, 0x3A, 0x3B, 0x43, 0x7, 0x2E, 0x9B, 0x9B, 0xA, 0xFE, 0xE9, 0x1, 0x18, 0x9, 0xFE, 0x28, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0x30, 0x32, 0x45, 0x45, 0x32, 0x31, 0x44, 0x44, 0xFF, 0xFF, 0x0, 0x47, 0x2, 0xA, 0x2, 0x54, 0x2, 0xCD, 0x0, 0x6, 0x0, 0x12, 0x0, 0x0, 0x0, 0x2, 0x0, 0x15, 0x0, 0x0, 0x4, 0xF0, 0x5, 0xB0, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x21, 0x11, 0x33, 0x32, 0x12, 0x37, 0x35, 0x34, 0x26, 0x23, 0x23, 0x11, 0x21, 0x1, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x2, 0xB3, 0xFE, 0xFC, 0xA6, 0xCC, 0xD0, 0x2, 0xCF, 0xC4, 0xB1, 0x1, 0x4, 0xFE, 0x0, 0x9E, 0x9E, 0x1, 0xAD, 0x1, 0x25, 0x1, 0x6B, 0xFE, 0x93, 0xFE, 0xD2, 0x2, 0x8C, 0xFE, 0x3E, 0x1, 0x0, 0xE1, 0x53, 0xEC, 0xFB, 0xFE, 0x52, 0xFC, 0xC9, 0x2, 0x8C, 0xAB, 0x2, 0x79, 0xFE, 0x87, 0xFE, 0xC5, 0x49, 0xFE, 0xC5, 0xFE, 0x88, 0x0, 0x2, 0x0, 0x15, 0x0, 0x0, 0x4, 0xF0, 0x5, 0xB0, 0x0, 0xD, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x21, 0x11, 0x33, 0x32, 0x12, 0x37, 0x35, 0x34, 0x26, 0x23, 0x23, 0x11, 0x21, 0x1, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x20, 0x0, 0x11, 0x15, 0x10, 0x0, 0x21, 0x2, 0xB3, 0xFE, 0xFC, 0xA6, 0xCC, 0xD0, 0x2, 0xCF, 0xC4, 0xB1, 0x1, 0x4, 0xFE, 0x0, 0x9E, 0x9E, 0x1, 0xAD, 0x1, 0x25, 0x1, 0x6B, 0xFE, 0x93, 0xFE, 0xD2, 0x2, 0x8C, 0xFE, 0x3E, 0x1, 0x0, 0xE1, 0x53, 0xEC, 0xFB, 0xFE, 0x52, 0xFC, 0xC9, 0x2, 0x8C, 0xAB, 0x2, 0x79, 0xFE, 0x87, 0xFE, 0xC5, 0x49, 0xFE, 0xC5, 0xFE, 0x88, 0x0, 0x1, 0xFF, 0xF2, 0x0, 0x0, 0x4, 0x17, 0x6, 0x0, 0x0, 0x19, 0x0, 0x0, 0x1, 0x22, 0x7, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x23, 0x11, 0x34, 0x26, 0x2, 0x65, 0x93, 0x48, 0xF2, 0xA6, 0xA6, 0xF2, 0x1, 0x6, 0xFE, 0xFA, 0x76, 0xB7, 0x9F, 0xC0, 0x1, 0xF3, 0x62, 0x3, 0x88, 0x83, 0xFC, 0xFB, 0x4, 0xC7, 0xAB, 0x8E, 0x8E, 0xAB, 0xFE, 0xFC, 0x8B, 0xB6, 0xDA, 0xFD, 0x42, 0x2, 0xBB, 0x71, 0x5C, 0x0, 0x1, 0x0, 0x2D, 0x0, 0x0, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0xF, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x33, 0x3, 0xBA, 0xCF, 0xFC, 0xD3, 0xD3, 0xFE, 0x3E, 0x4, 0x83, 0xFE, 0x3B, 0xCF, 0x3, 0x12, 0xFC, 0xEE, 0x3, 0x12, 0xAB, 0x1, 0x28, 0xCB, 0xCB, 0xFE, 0xD8, 0x0, 0x1, 0xFF, 0xE8, 0xFF, 0xEC, 0x2, 0x86, 0x5, 0x41, 0x0, 0x1D, 0x0, 0x0, 0x25, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x2, 0x73, 0x46, 0x5A, 0x79, 0x9F, 0xD3, 0xD3, 0xB3, 0xB3, 0xF2, 0xBF, 0xBF, 0xD9, 0xD9, 0x40, 0x31, 0x2A, 0x2B, 0x4, 0x18, 0x89, 0xA7, 0x1, 0x1B, 0xAB, 0xA5, 0xB3, 0x1, 0x7, 0xFE, 0xF9, 0xB3, 0xA5, 0xAB, 0xFE, 0xF3, 0x49, 0x2B, 0xA, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x36, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x22, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x36, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xC1, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x37, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0xC2, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x2B, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0xC4, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x3, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xEE, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x94, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8B, 0x1, 0x57, 0x1, 0x6A, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0xB1, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA5, 0x1, 0x5D, 0x1, 0x1B, 0xFF, 0xFF, 0x0, 0x66, 0xFE, 0x39, 0x4, 0xEC, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x28, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x1, 0xC9, 0xFF, 0xF9, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x3E, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xE8, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x3E, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x87, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x3F, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0x88, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0xB, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xB4, 0x1, 0x3E, 0xFF, 0xFF, 0xFF, 0xC7, 0x0, 0x0, 0x1, 0xA0, 0x7, 0x3E, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0xFF, 0x96, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x2, 0x7E, 0x7, 0x3E, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x0, 0x35, 0x1, 0x3E, 0xFF, 0xFF, 0xFF, 0xCB, 0x0, 0x0, 0x2, 0x7A, 0x7, 0x3F, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0xFF, 0x36, 0x1, 0x3E, 0xFF, 0xFF, 0xFF, 0xC0, 0x0, 0x0, 0x2, 0x86, 0x7, 0xB, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0xFF, 0x62, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x7, 0x2B, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0xED, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x36, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x39, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x36, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xD8, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x37, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0xD9, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x2B, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0xDB, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x3, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x5, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x36, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x10, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x36, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xAF, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x37, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0xB0, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x3, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xDC, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x7, 0x36, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x87, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x0, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xAC, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x0, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x4B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x1, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x4C, 0x0, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x5, 0xF5, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x4E, 0x0, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x5, 0xCD, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x78, 0x0, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x5E, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8B, 0x0, 0xE1, 0x0, 0x34, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x7B, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA5, 0x0, 0xE7, 0xFF, 0xE5, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x39, 0x3, 0xF5, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x48, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x1, 0x3D, 0xFF, 0xF9, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x6, 0x0, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xA0, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x6, 0x0, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x3F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x6, 0x1, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x40, 0x0, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x5, 0xCD, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x6C, 0x0, 0xFF, 0xFF, 0xFF, 0xB2, 0x0, 0x0, 0x1, 0x8B, 0x5, 0xF9, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x6, 0x0, 0x45, 0x81, 0xF9, 0xFF, 0xFF, 0x0, 0x90, 0x0, 0x0, 0x2, 0x69, 0x5, 0xF9, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x6, 0x0, 0x76, 0x20, 0xF9, 0xFF, 0xFF, 0xFF, 0xB6, 0x0, 0x0, 0x2, 0x65, 0x5, 0xFA, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0xFF, 0x21, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xAB, 0x0, 0x0, 0x2, 0x71, 0x5, 0xC6, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0xFF, 0x4D, 0xFF, 0xF9, 0xFF, 0xFF, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x5, 0xF5, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x55, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x0, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xB5, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x0, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x54, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x1, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x55, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x5, 0xF5, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x57, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x5, 0xCD, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x6, 0x0, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xAE, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x6, 0x0, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x4D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x6, 0x1, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x4E, 0x0, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x5, 0xCD, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x7A, 0x0, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x6, 0x0, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x16, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x5, 0xCD, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x43, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x6, 0xE3, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xBE, 0x1, 0x39, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x5, 0xAD, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x48, 0x3, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x1D, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xF5, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x5, 0xE7, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x1, 0x89, 0x7F, 0x0, 0x0, 0x2, 0x0, 0x12, 0xFE, 0x52, 0x5, 0x43, 0x5, 0xB0, 0x0, 0x2, 0x0, 0x19, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x3, 0x21, 0x3, 0x21, 0x1, 0x33, 0x1, 0x23, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x3, 0x7E, 0xD4, 0xD3, 0x3, 0x42, 0x49, 0x5C, 0x58, 0x7B, 0x97, 0x74, 0xFD, 0xCC, 0x76, 0xFE, 0xF8, 0x2, 0x26, 0xE3, 0x2, 0x28, 0x3E, 0x45, 0x5D, 0x47, 0x2C, 0x2E, 0x2, 0x1F, 0x2, 0x5E, 0xFD, 0xA2, 0xFC, 0x5F, 0x2C, 0x66, 0x63, 0x8D, 0x62, 0x1, 0x4A, 0xFE, 0xAC, 0x5, 0xB0, 0xFA, 0x50, 0x2D, 0x5F, 0x3B, 0x44, 0x17, 0x0, 0x2, 0x0, 0x5B, 0xFE, 0x52, 0x3, 0xFC, 0x4, 0x4E, 0x0, 0x8, 0x0, 0x35, 0x0, 0x0, 0x24, 0x36, 0x37, 0x35, 0x23, 0x6, 0x15, 0x14, 0x16, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x27, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x24, 0x33, 0x33, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x17, 0x15, 0x23, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x2, 0x4D, 0x7A, 0x19, 0x94, 0xFF, 0x58, 0x2, 0x41, 0x49, 0x5C, 0x58, 0x7B, 0x93, 0x10, 0x9, 0x73, 0xAA, 0xA2, 0xCE, 0x1, 0x2, 0xEA, 0x99, 0x5F, 0x5F, 0x57, 0x67, 0xF2, 0xF1, 0xCD, 0xB6, 0xED, 0x29, 0x2A, 0x45, 0x5D, 0x47, 0x2C, 0x2E, 0xAF, 0x51, 0x31, 0xCC, 0x6, 0xAF, 0x41, 0x58, 0xFD, 0xCF, 0x2C, 0x66, 0x63, 0x8C, 0x60, 0x25, 0x3A, 0x7A, 0xBA, 0x8A, 0xAD, 0xB8, 0x47, 0x55, 0x65, 0x56, 0x3E, 0x80, 0xCC, 0xBA, 0xBA, 0xFE, 0x20, 0x92, 0x57, 0x11, 0x2D, 0x5F, 0x3B, 0x44, 0x17, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x4, 0xEC, 0x7, 0x4B, 0x0, 0x26, 0x0, 0x28, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xC0, 0x1, 0x4B, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x3, 0xF5, 0x6, 0x0, 0x0, 0x26, 0x0, 0x48, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x29, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x4, 0xEC, 0x7, 0x4C, 0x0, 0x26, 0x0, 0x28, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0xC1, 0x1, 0x4B, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x3, 0xF5, 0x6, 0x1, 0x0, 0x26, 0x0, 0x48, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x2A, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x4, 0xEC, 0x7, 0x28, 0x0, 0x26, 0x0, 0x28, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0xA7, 0x1, 0x53, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x3, 0xF5, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x48, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x10, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x4, 0xEC, 0x7, 0x4D, 0x0, 0x26, 0x0, 0x28, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0xD9, 0x1, 0x4B, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x3, 0xF5, 0x6, 0x2, 0x0, 0x26, 0x0, 0x48, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x42, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xD2, 0x7, 0x40, 0x0, 0x26, 0x0, 0x29, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0x68, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x5, 0x5B, 0x6, 0x1, 0x0, 0x26, 0x0, 0x49, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x4, 0x1, 0x4, 0xFB, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x6, 0xEB, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0x84, 0x1, 0x41, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x5, 0xAD, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x3C, 0x3, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x25, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xBB, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x5, 0xE7, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x1, 0x89, 0x73, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x1B, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x6E, 0x1, 0x46, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x26, 0x0, 0x8, 0x0, 0x1, 0x0, 0x95, 0xFE, 0x52, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x23, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x3, 0xF1, 0x49, 0x5C, 0x58, 0x7B, 0x88, 0xFD, 0x94, 0x3, 0xB1, 0xFD, 0x4B, 0x2, 0x56, 0xFD, 0xAA, 0x2, 0xBC, 0x70, 0x45, 0x5D, 0x47, 0x2C, 0x2E, 0xFE, 0x7E, 0x2C, 0x66, 0x63, 0x85, 0x60, 0x5, 0xB0, 0xCB, 0xFE, 0x6D, 0xC7, 0xFE, 0x3F, 0xCA, 0x2D, 0x5F, 0x3B, 0x44, 0x17, 0x0, 0x2, 0x0, 0x54, 0xFE, 0x6D, 0x4, 0xC, 0x4, 0x4E, 0x0, 0x7, 0x0, 0x2B, 0x0, 0x0, 0x1, 0x22, 0x6, 0x7, 0x21, 0x35, 0x26, 0x26, 0x13, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x2, 0x35, 0x35, 0x10, 0x0, 0x33, 0x32, 0x12, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x7, 0x31, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x2, 0x3D, 0x64, 0x7A, 0x12, 0x1, 0xCE, 0x4, 0x61, 0x9E, 0x49, 0x5C, 0x58, 0x7B, 0x51, 0xDD, 0xFC, 0x1, 0x1B, 0xCE, 0xEC, 0xE3, 0xFD, 0x3D, 0xA, 0x95, 0x80, 0xA7, 0x68, 0x83, 0x46, 0x74, 0x45, 0x5D, 0x47, 0x2C, 0x2E, 0x3, 0x8B, 0x8C, 0x7C, 0x12, 0x5F, 0x97, 0xFB, 0xE, 0x2C, 0x66, 0x63, 0x67, 0x50, 0xF, 0x1, 0x27, 0xD4, 0x29, 0x1, 0x1, 0x1, 0x2D, 0xFE, 0xD4, 0xEA, 0x67, 0x7D, 0xA5, 0x86, 0x7D, 0x67, 0x36, 0x2D, 0x5F, 0x3B, 0x44, 0x17, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x40, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0xA0, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x6, 0x2, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x58, 0x0, 0xFF, 0xFF, 0x0, 0x6A, 0xFF, 0xEC, 0x4, 0xF0, 0x7, 0x4C, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0xBE, 0x1, 0x4B, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0x56, 0x4, 0xD, 0x6, 0x1, 0x0, 0x26, 0x0, 0x4C, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x40, 0x0, 0xFF, 0xFF, 0x0, 0x6A, 0xFF, 0xEC, 0x4, 0xF0, 0x7, 0x32, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xF1, 0x1, 0x4B, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0x56, 0x4, 0xD, 0x5, 0xE7, 0x0, 0x26, 0x0, 0x4C, 0x0, 0x0, 0x0, 0x6, 0x1, 0x89, 0x73, 0x0, 0xFF, 0xFF, 0x0, 0x6A, 0xFF, 0xEC, 0x4, 0xF0, 0x7, 0x28, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0xA4, 0x1, 0x53, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0x56, 0x4, 0xD, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x4C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x26, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x6A, 0xFD, 0xF0, 0x4, 0xF0, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0xE4, 0xFE, 0x8A, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0x56, 0x4, 0xD, 0x6, 0xA8, 0x0, 0x26, 0x0, 0x4C, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB2, 0x1, 0x28, 0x0, 0x7D, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x7, 0x3F, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0xE2, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x7, 0x5F, 0x0, 0x26, 0x0, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0x17, 0x1, 0x5E, 0xFF, 0xFF, 0xFF, 0xB2, 0x0, 0x0, 0x2, 0x90, 0x7, 0x33, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0xFF, 0x38, 0x1, 0x3E, 0xFF, 0xFF, 0xFF, 0x9D, 0x0, 0x0, 0x2, 0x7B, 0x5, 0xEE, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0xFF, 0x23, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xCE, 0x0, 0x0, 0x2, 0x7C, 0x6, 0xEB, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0xFF, 0x32, 0x1, 0x41, 0xFF, 0xFF, 0xFF, 0xB9, 0x0, 0x0, 0x2, 0x67, 0x5, 0xA6, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0xFF, 0x1D, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xDF, 0x0, 0x0, 0x2, 0x64, 0x7, 0x25, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0xFF, 0x69, 0x1, 0x3E, 0xFF, 0xFF, 0xFF, 0xCA, 0x0, 0x0, 0x2, 0x4F, 0x5, 0xE0, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0xFF, 0x54, 0xFF, 0xF9, 0xFF, 0xFF, 0x0, 0x15, 0xFE, 0x59, 0x1, 0xA0, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8C, 0xEC, 0x7, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0x52, 0x1, 0x91, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x4E, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8C, 0xD5, 0x0, 0xFF, 0xFF, 0x0, 0x9E, 0x0, 0x0, 0x1, 0xA4, 0x7, 0x1B, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x0, 0x1C, 0x1, 0x46, 0xFF, 0xFF, 0x0, 0xA4, 0xFF, 0xEC, 0x6, 0x27, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x2F, 0x2, 0x42, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7D, 0xFE, 0x4B, 0x3, 0x92, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x4E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4F, 0x2, 0xC, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x2D, 0xFF, 0xEC, 0x4, 0xAB, 0x7, 0x38, 0x0, 0x26, 0x0, 0x2F, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x1, 0x67, 0x1, 0x37, 0xFF, 0xFF, 0xFF, 0xB5, 0xFE, 0x4B, 0x2, 0x6A, 0x5, 0xDF, 0x0, 0x26, 0x0, 0xEC, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0xFF, 0x26, 0xFF, 0xDE, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x43, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x30, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x9D, 0xFE, 0xDD, 0xFF, 0xFF, 0x0, 0x7D, 0xFE, 0x2D, 0x4, 0x37, 0x6, 0x0, 0x0, 0x26, 0x0, 0x50, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x2D, 0xFE, 0xC7, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x27, 0x7, 0x36, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x0, 0x28, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x8B, 0x0, 0x0, 0x2, 0x63, 0x7, 0x91, 0x0, 0x26, 0x0, 0x51, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x0, 0x1A, 0x1, 0x91, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x1, 0x4, 0x27, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x6E, 0xFE, 0x9B, 0xFF, 0xFF, 0x0, 0x57, 0xFE, 0x1, 0x1, 0x7F, 0x6, 0x0, 0x0, 0x26, 0x0, 0x51, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x0, 0x11, 0xFE, 0x9B, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x27, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x2, 0x9, 0x4, 0xAA, 0xFF, 0xFF, 0x0, 0x8C, 0x0, 0x0, 0x2, 0xE6, 0x6, 0x1, 0x0, 0x26, 0x0, 0x51, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x8C, 0x4, 0xFB, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x27, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0xCA, 0xFD, 0xD4, 0xFF, 0xFF, 0x0, 0x8C, 0x0, 0x0, 0x2, 0xEC, 0x6, 0x0, 0x0, 0x26, 0x0, 0x51, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x64, 0xFD, 0xAF, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x7, 0x36, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xEA, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x6, 0x0, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x52, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFD, 0xFE, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0xDC, 0xFE, 0x98, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0x1, 0x3, 0xF9, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x42, 0xFE, 0x9B, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x7, 0x38, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x1, 0x3, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x6, 0x2, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x6B, 0x0, 0xFF, 0xFF, 0xFF, 0xA4, 0x0, 0x0, 0x3, 0xF9, 0x6, 0x2, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0xFF, 0x5E, 0x4, 0xFC, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x6, 0xE3, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xD5, 0x1, 0x39, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x5, 0xAD, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x51, 0x3, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x1D, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x1, 0xC, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x5, 0xE7, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0x88, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x35, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8E, 0x1, 0x63, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x5, 0xFF, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8E, 0x0, 0xDF, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xDE, 0x7, 0x36, 0x0, 0x26, 0x0, 0x37, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x70, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x7D, 0x0, 0x0, 0x2, 0xF6, 0x6, 0x0, 0x0, 0x26, 0x0, 0x57, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x0, 0xAD, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x1, 0x4, 0xDE, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x37, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x6F, 0xFE, 0x9B, 0xFF, 0xFF, 0x0, 0x51, 0xFE, 0x1, 0x2, 0xB5, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x57, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x0, 0xB, 0xFE, 0x9B, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xDE, 0x7, 0x38, 0x0, 0x26, 0x0, 0x37, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0x89, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x38, 0x0, 0x0, 0x2, 0xFB, 0x6, 0x2, 0x0, 0x26, 0x0, 0x57, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0xC6, 0x0, 0xFF, 0xFF, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0x8A, 0x7, 0x36, 0x0, 0x26, 0x0, 0x38, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x8E, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x4C, 0xFF, 0xEC, 0x3, 0xCA, 0x6, 0x0, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x39, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0x8A, 0x7, 0x37, 0x0, 0x26, 0x0, 0x38, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0x8F, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x4C, 0xFF, 0xEC, 0x3, 0xCA, 0x6, 0x1, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x3A, 0x0, 0xFF, 0xFF, 0x0, 0x4A, 0xFE, 0x40, 0x4, 0x8A, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x38, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x1, 0x9E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x4C, 0xFE, 0x36, 0x3, 0xCA, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x1, 0x44, 0xFF, 0xF6, 0xFF, 0xFF, 0x0, 0x4A, 0xFD, 0xF7, 0x4, 0x8A, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x38, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x8A, 0xFE, 0x91, 0xFF, 0xFF, 0x0, 0x4C, 0xFD, 0xED, 0x3, 0xCA, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x30, 0xFE, 0x87, 0xFF, 0xFF, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0x8A, 0x7, 0x38, 0x0, 0x26, 0x0, 0x38, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0xA7, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x4C, 0xFF, 0xEC, 0x3, 0xCA, 0x6, 0x2, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x52, 0x0, 0xFF, 0xFF, 0x0, 0x2D, 0xFD, 0xFB, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x39, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x78, 0xFE, 0x95, 0xFF, 0xFF, 0x0, 0x8, 0xFD, 0xF7, 0x2, 0x73, 0x5, 0x41, 0x0, 0x26, 0x0, 0x59, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x0, 0xC9, 0xFE, 0x91, 0xFF, 0xFF, 0x0, 0x2D, 0xFE, 0x44, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x39, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x1, 0x8C, 0x0, 0x4, 0xFF, 0xFF, 0x0, 0x8, 0xFE, 0x40, 0x2, 0xA6, 0x5, 0x41, 0x0, 0x26, 0x0, 0x59, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x0, 0xDD, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x2D, 0x0, 0x0, 0x4, 0xB0, 0x7, 0x38, 0x0, 0x26, 0x0, 0x39, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0x99, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x8, 0xFF, 0xEC, 0x3, 0x27, 0x6, 0x82, 0x0, 0x26, 0x0, 0x59, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0xCD, 0x5, 0x7C, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x2B, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0xB2, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x5, 0xF5, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x50, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x6, 0xE3, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xAC, 0x1, 0x39, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x5, 0xAD, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x4A, 0x3, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x1D, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xE3, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x5, 0xE7, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x94, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8B, 0x1, 0x45, 0x1, 0x6A, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x6, 0x5E, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8B, 0x0, 0xE3, 0x0, 0x34, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x35, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8E, 0x1, 0x3A, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x4, 0x2F, 0x5, 0xFF, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8E, 0x0, 0xD8, 0x0, 0x0, 0x0, 0x1, 0x0, 0x7E, 0xFE, 0x8A, 0x4, 0xBE, 0x5, 0xB0, 0x0, 0x20, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x37, 0x22, 0x24, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x6, 0x7, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x6, 0x3, 0x3E, 0x58, 0x7B, 0x36, 0xED, 0xFE, 0xCB, 0x1, 0xFB, 0x9F, 0x85, 0x87, 0x9D, 0xFD, 0x92, 0x77, 0x3B, 0x4D, 0x47, 0x2C, 0x2E, 0x15, 0x49, 0xFE, 0x8A, 0x66, 0x63, 0x54, 0x45, 0xFC, 0xF8, 0x3, 0xD0, 0xFC, 0x33, 0x9C, 0x91, 0x91, 0x9C, 0x3, 0xCD, 0xFC, 0x33, 0xA5, 0xDF, 0x39, 0x28, 0x58, 0x35, 0x44, 0x17, 0x8E, 0x2C, 0x0, 0x1, 0x0, 0x77, 0xFE, 0x52, 0x3, 0xF7, 0x4, 0x3A, 0x0, 0x20, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x27, 0x6, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x23, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x3, 0xF7, 0x49, 0x5C, 0x58, 0x7B, 0x93, 0x6, 0x6A, 0xC6, 0x9E, 0xC6, 0x1, 0xF3, 0x67, 0x45, 0xAE, 0x40, 0xF3, 0x14, 0x45, 0x5D, 0x47, 0x2C, 0x2E, 0xFE, 0x7E, 0x2C, 0x66, 0x63, 0x8C, 0x60, 0x63, 0x7E, 0xBA, 0xD5, 0x2, 0xBF, 0xFD, 0x43, 0x75, 0x55, 0x7D, 0x3, 0xA, 0xFB, 0xC6, 0x2D, 0x5F, 0x3B, 0x44, 0x17, 0xFF, 0xFF, 0x0, 0x31, 0x0, 0x0, 0x6, 0xE5, 0x7, 0x37, 0x0, 0x26, 0x0, 0x3C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x1, 0xA7, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x5, 0xCD, 0x6, 0x1, 0x0, 0x26, 0x0, 0x5C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x1, 0xA, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x7, 0x37, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0x88, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x6, 0x1, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x17, 0x0, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x7, 0x3, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xB4, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x50, 0x0, 0x0, 0x4, 0x8C, 0x7, 0x36, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x83, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x52, 0x0, 0x0, 0x3, 0xC0, 0x6, 0x0, 0x0, 0x26, 0x0, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x1B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0x0, 0x0, 0x4, 0x8C, 0x7, 0x13, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x6A, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x52, 0x0, 0x0, 0x3, 0xC0, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x2, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x50, 0x0, 0x0, 0x4, 0x8C, 0x7, 0x38, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0x9C, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x52, 0x0, 0x0, 0x3, 0xC0, 0x6, 0x2, 0x0, 0x26, 0x0, 0x5F, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x34, 0x0, 0xFF, 0xFF, 0xFF, 0xF6, 0x0, 0x0, 0x7, 0x57, 0x7, 0x42, 0x0, 0x26, 0x0, 0x82, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x2, 0xBB, 0x1, 0x42, 0xFF, 0xFF, 0x0, 0x48, 0xFF, 0xEB, 0x6, 0x85, 0x6, 0x1, 0x0, 0x26, 0x0, 0x87, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x2, 0x70, 0x0, 0x1, 0xFF, 0xFF, 0x0, 0x6A, 0xFF, 0xA1, 0x5, 0x22, 0x7, 0x80, 0x0, 0x26, 0x0, 0x84, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xDF, 0x1, 0x80, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0x76, 0x4, 0x3E, 0x5, 0xFD, 0x0, 0x26, 0x0, 0x8A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x30, 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xA6, 0x0, 0x0, 0x4, 0x2B, 0x4, 0x8D, 0x0, 0x26, 0x7, 0xAE, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x16, 0xFF, 0x6D, 0xFF, 0xFF, 0xFF, 0xA6, 0x0, 0x0, 0x4, 0x2B, 0x4, 0x8D, 0x0, 0x26, 0x7, 0xAE, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x16, 0xFF, 0x6D, 0xFF, 0xFF, 0x0, 0x25, 0x0, 0x0, 0x4, 0x16, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x54, 0x0, 0x0, 0x0, 0x6, 0x7, 0xA4, 0x32, 0xBC, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x6, 0x1E, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xC6, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x6, 0x1E, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x65, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x6, 0x1F, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x66, 0x1E, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x6, 0x13, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x68, 0x1E, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x5, 0xEB, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0x92, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x6, 0x7C, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8B, 0x0, 0xFB, 0x0, 0x52, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x6, 0x99, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA5, 0x1, 0x1, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x3F, 0x4, 0x44, 0x4, 0x9D, 0x0, 0x26, 0x7, 0xAF, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x1, 0x6B, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x6, 0x1E, 0x0, 0x26, 0x7, 0xA6, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0x96, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x6, 0x1E, 0x0, 0x26, 0x7, 0xA6, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x35, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x6, 0x1F, 0x0, 0x26, 0x7, 0xA6, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x36, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x5, 0xEB, 0x0, 0x26, 0x7, 0xA6, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x62, 0x1E, 0xFF, 0xFF, 0xFF, 0xA5, 0x0, 0x0, 0x1, 0x7E, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0xFF, 0x74, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x84, 0x0, 0x0, 0x2, 0x5C, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x6, 0x0, 0x76, 0x13, 0x1E, 0xFF, 0xFF, 0xFF, 0xA9, 0x0, 0x0, 0x2, 0x58, 0x6, 0x1F, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0xFF, 0x14, 0x0, 0x1E, 0xFF, 0xFF, 0xFF, 0x9E, 0x0, 0x0, 0x2, 0x64, 0x5, 0xEB, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0xFF, 0x40, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x67, 0x6, 0x13, 0x0, 0x26, 0x7, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0x87, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x59, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xD4, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x59, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x73, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x6, 0x1F, 0x0, 0x26, 0x7, 0x59, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x74, 0x1E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x6, 0x13, 0x0, 0x26, 0x7, 0x59, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x76, 0x1E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x5, 0xEB, 0x0, 0x26, 0x7, 0x59, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xA0, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x67, 0xFF, 0xF0, 0x4, 0x1E, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x53, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xB5, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x67, 0xFF, 0xF0, 0x4, 0x1E, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x53, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x54, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x67, 0xFF, 0xF0, 0x4, 0x1E, 0x6, 0x1F, 0x0, 0x26, 0x7, 0x53, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x55, 0x1E, 0xFF, 0xFF, 0x0, 0x67, 0xFF, 0xF0, 0x4, 0x1E, 0x5, 0xEB, 0x0, 0x26, 0x7, 0x53, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0x81, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x5, 0x0, 0x0, 0x4, 0x37, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x4F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x2D, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x5, 0xCB, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x62, 0x21, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x6, 0x5, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0x99, 0x0, 0x1E, 0x0, 0x2, 0x0, 0x9, 0xFE, 0x52, 0x4, 0x94, 0x4, 0x8D, 0x0, 0x2, 0x0, 0x19, 0x0, 0x0, 0x1, 0x3, 0x3, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x27, 0x21, 0x7, 0x23, 0x1, 0x33, 0x1, 0x23, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x2, 0xF8, 0xAA, 0xA9, 0x2, 0xCE, 0x49, 0x5C, 0x58, 0x7B, 0x9E, 0x5A, 0xFE, 0x20, 0x60, 0xF6, 0x1, 0xD7, 0xDF, 0x1, 0xD5, 0x35, 0x45, 0x5D, 0x47, 0x2C, 0x2E, 0x1, 0xB2, 0x1, 0xBA, 0xFE, 0x46, 0xFC, 0xCC, 0x2C, 0x66, 0x63, 0x8F, 0x65, 0xEB, 0xFA, 0x4, 0x8D, 0xFB, 0x73, 0x2D, 0x5F, 0x3B, 0x44, 0x17, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x44, 0x6, 0x1E, 0x0, 0x26, 0x7, 0xAF, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x63, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x44, 0x6, 0x1F, 0x0, 0x26, 0x7, 0xAF, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x64, 0x1E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x44, 0x5, 0xFB, 0x0, 0x26, 0x7, 0xAF, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x4A, 0x0, 0x26, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x44, 0x6, 0x20, 0x0, 0x26, 0x7, 0xAF, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x7C, 0x1E, 0xFF, 0xFF, 0x0, 0x6A, 0x0, 0x0, 0x4, 0x2B, 0x6, 0x20, 0x0, 0x26, 0x7, 0xAE, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0xF8, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x5, 0xCB, 0x0, 0x26, 0x7, 0xA6, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x32, 0x21, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x6, 0x5, 0x0, 0x26, 0x7, 0xA6, 0x0, 0x0, 0x0, 0x6, 0x1, 0x89, 0x69, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x5, 0xFB, 0x0, 0x26, 0x7, 0xA6, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x1C, 0x0, 0x26, 0x0, 0x1, 0x0, 0x76, 0xFE, 0x52, 0x3, 0xB6, 0x4, 0x8D, 0x0, 0x1B, 0x0, 0x0, 0x1, 0x6, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x23, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x3, 0x6B, 0x49, 0x5C, 0x58, 0x7B, 0x88, 0xFD, 0xFB, 0x3, 0x3C, 0xFD, 0xB7, 0x1, 0xF6, 0xFE, 0xA, 0x2, 0x4D, 0x5F, 0x45, 0x5D, 0x47, 0x2C, 0x2E, 0xFE, 0x7E, 0x2C, 0x66, 0x63, 0x85, 0x60, 0x4, 0x8D, 0xC4, 0xFE, 0xF3, 0xC3, 0xFE, 0xCA, 0xC3, 0x2D, 0x5F, 0x3B, 0x44, 0x17, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x6, 0x20, 0x0, 0x26, 0x7, 0xA6, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x4E, 0x1E, 0xFF, 0xFF, 0x0, 0x55, 0xFF, 0xF0, 0x4, 0x49, 0x6, 0x1F, 0x0, 0x26, 0x7, 0x61, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x68, 0x1E, 0xFF, 0xFF, 0x0, 0x55, 0xFF, 0xF0, 0x4, 0x49, 0x6, 0x5, 0x0, 0x26, 0x7, 0x61, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0x9B, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x55, 0xFF, 0xF0, 0x4, 0x49, 0x5, 0xFB, 0x0, 0x26, 0x7, 0x61, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x4E, 0x0, 0x26, 0xFF, 0xFF, 0x0, 0x55, 0xFD, 0xF6, 0x4, 0x49, 0x4, 0x9D, 0x0, 0x26, 0x7, 0x61, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x6A, 0xFE, 0x90, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x68, 0x6, 0x1F, 0x0, 0x26, 0x7, 0x60, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x7A, 0x1E, 0xFF, 0xFF, 0xFF, 0x90, 0x0, 0x0, 0x2, 0x6E, 0x6, 0x13, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0xFF, 0x16, 0x0, 0x1E, 0xFF, 0xFF, 0xFF, 0xAC, 0x0, 0x0, 0x2, 0x5A, 0x5, 0xCB, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0xFF, 0x10, 0x0, 0x21, 0xFF, 0xFF, 0xFF, 0xBD, 0x0, 0x0, 0x2, 0x42, 0x6, 0x5, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0xFF, 0x47, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x14, 0xFE, 0x52, 0x1, 0x8C, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8C, 0xEB, 0x0, 0xFF, 0xFF, 0x0, 0x7C, 0x0, 0x0, 0x1, 0x82, 0x5, 0xFB, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8A, 0xFA, 0x26, 0xFF, 0xFF, 0x0, 0x25, 0xFF, 0xF0, 0x4, 0x37, 0x6, 0x1F, 0x0, 0x26, 0x7, 0x5E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0xF3, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0xFD, 0xFE, 0x4, 0x69, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x5D, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x13, 0xFE, 0x98, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0x94, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x5C, 0x0, 0x0, 0x0, 0x6, 0x0, 0x76, 0x9, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0xFD, 0xFF, 0x3, 0x94, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x5C, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x11, 0xFE, 0x99, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0x94, 0x4, 0x8F, 0x0, 0x26, 0x7, 0x5C, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x94, 0x3, 0x89, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0x94, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x5C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x72, 0xFD, 0x46, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x67, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x84, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0xFD, 0xF8, 0x4, 0x67, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x79, 0xFE, 0x92, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x67, 0x6, 0x20, 0x0, 0x26, 0x7, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0x9D, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x5, 0xCB, 0x0, 0x26, 0x7, 0x59, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x70, 0x21, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x6, 0x5, 0x0, 0x26, 0x7, 0x59, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xA7, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x6, 0x1D, 0x0, 0x26, 0x7, 0x59, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8E, 0x0, 0xFE, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x52, 0x4, 0x6F, 0x4, 0x9D, 0x0, 0x26, 0x7, 0x59, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x1, 0x39, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x3A, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x56, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x17, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0xFD, 0xFF, 0x4, 0x3A, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x56, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x19, 0xFE, 0x99, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x3A, 0x6, 0x20, 0x0, 0x26, 0x7, 0x56, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x30, 0x1E, 0xFF, 0xFF, 0x0, 0x3F, 0xFF, 0xF0, 0x3, 0xEF, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x55, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x40, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x3F, 0xFF, 0xF0, 0x3, 0xEF, 0x6, 0x1F, 0x0, 0x26, 0x7, 0x55, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x41, 0x1E, 0xFF, 0xFF, 0x0, 0x3F, 0xFE, 0x40, 0x3, 0xEF, 0x4, 0x9D, 0x0, 0x26, 0x7, 0x55, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x1, 0x50, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x3F, 0xFF, 0xF0, 0x3, 0xEF, 0x6, 0x20, 0x0, 0x26, 0x7, 0x55, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x59, 0x1E, 0xFF, 0xFF, 0x0, 0x25, 0xFD, 0xFE, 0x4, 0x16, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x54, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x26, 0xFE, 0x98, 0xFF, 0xFF, 0x0, 0x25, 0x0, 0x0, 0x4, 0x16, 0x6, 0x20, 0x0, 0x26, 0x7, 0x54, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x48, 0x1E, 0xFF, 0xFF, 0x0, 0x25, 0xFE, 0x47, 0x4, 0x16, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x54, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x1, 0x3A, 0x0, 0x7, 0xFF, 0xFF, 0x0, 0x67, 0xFF, 0xF0, 0x4, 0x1E, 0x6, 0x13, 0x0, 0x26, 0x7, 0x53, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x57, 0x1E, 0xFF, 0xFF, 0x0, 0x67, 0xFF, 0xF0, 0x4, 0x1E, 0x5, 0xCB, 0x0, 0x26, 0x7, 0x53, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x51, 0x21, 0xFF, 0xFF, 0x0, 0x67, 0xFF, 0xF0, 0x4, 0x1E, 0x6, 0x5, 0x0, 0x26, 0x7, 0x53, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0x88, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x67, 0xFF, 0xF0, 0x4, 0x1E, 0x6, 0x7C, 0x0, 0x26, 0x7, 0x53, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8B, 0x0, 0xEA, 0x0, 0x52, 0xFF, 0xFF, 0x0, 0x67, 0xFF, 0xF0, 0x4, 0x36, 0x6, 0x1D, 0x0, 0x26, 0x7, 0x53, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8E, 0x0, 0xDF, 0x0, 0x1E, 0x0, 0x1, 0x0, 0x67, 0xFE, 0x83, 0x4, 0x1E, 0x4, 0x8D, 0x0, 0x1F, 0x0, 0x0, 0x1, 0x22, 0x26, 0x35, 0x34, 0x37, 0x26, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x33, 0x11, 0x14, 0x6, 0x7, 0x6, 0x6, 0x15, 0x14, 0x33, 0x32, 0x37, 0x17, 0x6, 0x2, 0xBA, 0x58, 0x7B, 0x3F, 0xC4, 0xFB, 0xF2, 0x7E, 0x6C, 0xE4, 0x4, 0xF3, 0x87, 0x70, 0x37, 0x47, 0x47, 0x2C, 0x2E, 0x15, 0x49, 0xFE, 0x83, 0x66, 0x63, 0x5B, 0x4A, 0x7, 0xD2, 0xC3, 0x3, 0x0, 0xFD, 0x0, 0x73, 0x67, 0xD2, 0x3, 0x8, 0xFD, 0x0, 0x8C, 0xBC, 0x2D, 0x27, 0x54, 0x33, 0x44, 0x17, 0x8E, 0x2C, 0xFF, 0xFF, 0x0, 0x29, 0x0, 0x0, 0x5, 0xE6, 0x6, 0x1F, 0x0, 0x26, 0x7, 0x51, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x1, 0x18, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x5, 0x0, 0x0, 0x4, 0x37, 0x6, 0x1F, 0x0, 0x26, 0x7, 0x4F, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x2E, 0x1E, 0xFF, 0xFF, 0x0, 0x5, 0x0, 0x0, 0x4, 0x37, 0x5, 0xEB, 0x0, 0x26, 0x7, 0x4F, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x5A, 0x1E, 0xFF, 0xFF, 0x0, 0x41, 0x0, 0x0, 0x3, 0xF3, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x4E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x30, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x41, 0x0, 0x0, 0x3, 0xF3, 0x5, 0xFB, 0x0, 0x26, 0x7, 0x4E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x17, 0x0, 0x26, 0xFF, 0xFF, 0x0, 0x41, 0x0, 0x0, 0x3, 0xF3, 0x6, 0x20, 0x0, 0x26, 0x7, 0x4E, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x49, 0x1E, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x6, 0x40, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x6, 0x2, 0x2D, 0xBE, 0xFF, 0xFF, 0xFF, 0xFE, 0xE7, 0x0, 0x0, 0x4, 0x4D, 0x6, 0x42, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0x20, 0x0, 0x1, 0xFF, 0xFF, 0xFE, 0xF0, 0x0, 0x0, 0x5, 0x19, 0x6, 0x41, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0x29, 0x0, 0x0, 0xFF, 0xFF, 0xFE, 0xF2, 0x0, 0x0, 0x1, 0xA0, 0x6, 0x43, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0x2B, 0x0, 0x2, 0xFF, 0xFF, 0xFF, 0xBC, 0xFF, 0xEC, 0x5, 0x33, 0x6, 0x40, 0x0, 0x26, 0x0, 0x34, 0x14, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x45, 0x0, 0x0, 0x5, 0x3A, 0x6, 0x40, 0x0, 0x26, 0x0, 0x3E, 0x64, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x0, 0x0, 0x4, 0xF1, 0x6, 0x40, 0x0, 0x26, 0x2, 0x39, 0x14, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0xFF, 0xF4, 0x2, 0xDA, 0x6, 0x9A, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2E, 0xFF, 0x1F, 0xFF, 0xEB, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x26, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xA3, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x27, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0x0, 0x0, 0x4, 0x8C, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x3F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x30, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x6, 0x6B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x32, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x33, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x34, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xD4, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x35, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x2D, 0x0, 0x0, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x39, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x3E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x29, 0x0, 0x0, 0x4, 0xEA, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x3D, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xC0, 0x0, 0x0, 0x2, 0x86, 0x7, 0xB, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0xFF, 0x62, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x7, 0x3, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xB4, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x6, 0x41, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2D, 0x1, 0x50, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x6, 0x40, 0x0, 0x26, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2D, 0x1, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x6, 0x41, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2D, 0x1, 0x23, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xAA, 0xFF, 0xF4, 0x2, 0x62, 0x6, 0x2C, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x2, 0x2D, 0xF, 0xEB, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0xA1, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x2, 0x2E, 0x1C, 0xF2, 0xFF, 0xFF, 0x0, 0x8E, 0x0, 0x0, 0x4, 0x6B, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x8F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x54, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x93, 0xFE, 0x60, 0x4, 0x1F, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x77, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x17, 0x0, 0x0, 0x3, 0xDB, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x5B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x3E, 0xFE, 0x4A, 0x4, 0x66, 0x4, 0x4A, 0x0, 0x6, 0x8, 0xAA, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xCD, 0xFF, 0xF4, 0x2, 0x93, 0x5, 0xB8, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0xFF, 0x6F, 0xFF, 0xEB, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x5, 0xBF, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x6C, 0xF2, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x41, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2D, 0x1, 0x21, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0x33, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2D, 0x1, 0xC, 0xFF, 0xF2, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0x31, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2D, 0x2, 0x2B, 0xFF, 0xF0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0xB, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xB4, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x9B, 0x0, 0x0, 0x4, 0x38, 0x7, 0x3E, 0x0, 0x26, 0x2, 0x30, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x82, 0x1, 0x3E, 0x0, 0x1, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0x8A, 0x5, 0xC4, 0x0, 0x25, 0x0, 0x0, 0x1, 0x34, 0x26, 0x24, 0x24, 0x35, 0x34, 0x24, 0x33, 0x32, 0x0, 0x15, 0x23, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x14, 0x16, 0x17, 0x16, 0x16, 0x15, 0x14, 0x4, 0x23, 0x22, 0x24, 0x26, 0x35, 0x33, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3, 0x8D, 0x72, 0xFE, 0x60, 0xFE, 0xFD, 0x1, 0x1D, 0xE7, 0xF7, 0x1, 0x16, 0xFC, 0x86, 0x8E, 0x85, 0x7F, 0x98, 0x99, 0xF7, 0xED, 0xFE, 0xE7, 0xED, 0x8B, 0xFE, 0xFA, 0xA9, 0xFD, 0xB8, 0x85, 0x84, 0x85, 0x1, 0x78, 0x57, 0x69, 0x81, 0xCA, 0xAE, 0xB0, 0xE3, 0xFE, 0xF9, 0xB6, 0x6B, 0x89, 0x73, 0x56, 0x52, 0x6B, 0x2D, 0x48, 0xD8, 0xAE, 0xB8, 0xD6, 0x66, 0xCD, 0x99, 0x8A, 0x7A, 0x6C, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2E, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xC0, 0x0, 0x0, 0x2, 0x86, 0x7, 0xB, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0xFF, 0x62, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x2D, 0xFF, 0xEC, 0x3, 0xE5, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x9B, 0x0, 0x0, 0x5, 0x30, 0x5, 0xB0, 0x0, 0x6, 0x7, 0xAA, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x7, 0x37, 0x0, 0x26, 0x0, 0x30, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x6D, 0x1, 0x37, 0xFF, 0xFF, 0x0, 0x3A, 0xFF, 0xEB, 0x4, 0xDE, 0x7, 0x25, 0x0, 0x26, 0x2, 0x74, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xD9, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x26, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xA3, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x27, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x9B, 0x0, 0x0, 0x4, 0x38, 0x5, 0xB0, 0x0, 0x6, 0x2, 0x30, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0xD, 0x7, 0x25, 0x0, 0x26, 0x2, 0x72, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x1, 0x1C, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x6, 0x6B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x32, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x34, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x9B, 0x0, 0x0, 0x5, 0x15, 0x5, 0xB0, 0x0, 0x6, 0x2, 0x35, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xD4, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x35, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x4, 0xEC, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x28, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x2D, 0x0, 0x0, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x39, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x29, 0x0, 0x0, 0x4, 0xEA, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x3D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x46, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x4A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x86, 0x0, 0x0, 0x4, 0x13, 0x5, 0xD9, 0x0, 0x26, 0x2, 0x86, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0x97, 0xFF, 0xF2, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x54, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7D, 0xFE, 0x60, 0x4, 0x31, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x55, 0x0, 0x0, 0x0, 0x1, 0x0, 0x50, 0xFF, 0xEC, 0x3, 0xF5, 0x4, 0x4E, 0x0, 0x1B, 0x0, 0x0, 0x25, 0x32, 0x36, 0x37, 0x33, 0x6, 0x4, 0x23, 0x22, 0x2, 0x35, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x22, 0x6, 0x15, 0x15, 0x14, 0x16, 0x2, 0x3A, 0x58, 0x7A, 0x5, 0xE4, 0x4, 0xFF, 0x0, 0xB5, 0xFA, 0xF2, 0xF3, 0xF9, 0xC5, 0xF0, 0x4, 0xE4, 0x5, 0x70, 0x63, 0x94, 0x63, 0x62, 0xAF, 0x68, 0x4F, 0x9D, 0xDD, 0x1, 0x40, 0xDF, 0x24, 0xDE, 0x1, 0x41, 0xE4, 0xB3, 0x57, 0x7D, 0xDB, 0x81, 0x24, 0x83, 0xD9, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x5E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x1F, 0x0, 0x0, 0x3, 0xE9, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x5D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x5, 0xCD, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x6C, 0x0, 0xFF, 0xFF, 0x0, 0x85, 0x0, 0x0, 0x3, 0x4D, 0x5, 0xF2, 0x0, 0x26, 0x2, 0x82, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x0, 0xC1, 0xFF, 0xF2, 0xFF, 0xFF, 0x0, 0x4C, 0xFF, 0xEC, 0x3, 0xCA, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x58, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7D, 0x0, 0x0, 0x1, 0x91, 0x5, 0xD5, 0x0, 0x6, 0x0, 0x4E, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xAB, 0x0, 0x0, 0x2, 0x71, 0x5, 0xC6, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0xFF, 0x4D, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xB4, 0xFE, 0x4B, 0x1, 0x86, 0x5, 0xD5, 0x0, 0x6, 0x0, 0x4F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8F, 0x0, 0x0, 0x4, 0x65, 0x5, 0xF2, 0x0, 0x26, 0x2, 0x87, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x44, 0xFF, 0xF2, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x5, 0xE7, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x6, 0x1, 0x89, 0x4A, 0x0, 0xFF, 0xFF, 0x0, 0x31, 0x0, 0x0, 0x6, 0xE5, 0x7, 0x36, 0x0, 0x26, 0x0, 0x3C, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x2, 0x7, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x5, 0xCD, 0x6, 0x0, 0x0, 0x26, 0x0, 0x5C, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x6A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x31, 0x0, 0x0, 0x6, 0xE5, 0x7, 0x36, 0x0, 0x26, 0x0, 0x3C, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x2, 0xA6, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x5, 0xCD, 0x6, 0x0, 0x0, 0x26, 0x0, 0x5C, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x2, 0x9, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x31, 0x0, 0x0, 0x6, 0xE5, 0x7, 0x3, 0x0, 0x26, 0x0, 0x3C, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0xD3, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x5, 0xCD, 0x5, 0xCD, 0x0, 0x26, 0x0, 0x5C, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x36, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x7, 0x36, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xE8, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x6, 0x0, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x6, 0x0, 0x45, 0x77, 0x0, 0xFF, 0xFF, 0x0, 0x53, 0x3, 0xFC, 0x1, 0xB, 0x6, 0x0, 0x0, 0x6, 0x0, 0xC, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x65, 0x3, 0xF5, 0x2, 0x41, 0x6, 0x0, 0x0, 0x6, 0x0, 0x7, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x90, 0xFF, 0xF2, 0x3, 0xC8, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x6, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6, 0x2, 0x25, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xB0, 0xFE, 0x4B, 0x2, 0x73, 0x5, 0xE0, 0x0, 0x26, 0x0, 0xEC, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0xFF, 0x3E, 0xFF, 0xDE, 0xFF, 0xFF, 0x0, 0x34, 0x4, 0x0, 0x1, 0x66, 0x6, 0x0, 0x0, 0x6, 0x4, 0x63, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x6, 0x6B, 0x7, 0x36, 0x0, 0x26, 0x0, 0x32, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x2, 0x8F, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x7D, 0x0, 0x0, 0x6, 0x7A, 0x6, 0x0, 0x0, 0x26, 0x0, 0x52, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x2, 0xA0, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0xFE, 0x6D, 0x5, 0x43, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0xA4, 0x1, 0x7B, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x5B, 0xFE, 0x72, 0x3, 0xFC, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x1, 0xA4, 0x0, 0xAD, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x3E, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xE8, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0xD, 0x7, 0x3E, 0x0, 0x26, 0x2, 0x72, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x49, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x6, 0x0, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xA0, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x86, 0x0, 0x0, 0x4, 0x13, 0x5, 0xF2, 0x0, 0x26, 0x2, 0x86, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xC4, 0xFF, 0xF2, 0xFF, 0xFF, 0x0, 0x44, 0x0, 0x0, 0x5, 0x5D, 0x5, 0xB0, 0x0, 0x6, 0x2, 0x38, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x22, 0x5, 0x7F, 0x4, 0x3A, 0x0, 0x6, 0x2, 0x4C, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x10, 0x0, 0x0, 0x4, 0xF4, 0x6, 0xFD, 0x0, 0x26, 0x2, 0xAF, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x4, 0x4B, 0x1, 0xF, 0xFF, 0xFF, 0xFF, 0xF2, 0x0, 0x0, 0x4, 0x19, 0x5, 0xD0, 0x0, 0x26, 0x2, 0xB0, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x3, 0xE7, 0xFF, 0xE2, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x4B, 0x8, 0x65, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x0, 0x5E, 0x4, 0x8E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFE, 0x4B, 0x9, 0x5D, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x0, 0x5E, 0x5, 0x86, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x49, 0xFE, 0x37, 0x4, 0x7F, 0x5, 0xC4, 0x0, 0x26, 0x2, 0x71, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x1, 0x92, 0xFF, 0x9E, 0xFF, 0xFF, 0x0, 0x4E, 0xFE, 0x38, 0x3, 0xC4, 0x4, 0x4D, 0x0, 0x26, 0x2, 0x85, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x1, 0x39, 0xFF, 0x9F, 0xFF, 0xFF, 0x0, 0x66, 0xFE, 0x3A, 0x4, 0xEC, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x28, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x1, 0xD5, 0xFF, 0xA1, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x3A, 0x3, 0xF5, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x48, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x1, 0x49, 0xFF, 0xA1, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x3E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x21, 0xFE, 0x5F, 0x3, 0xF5, 0x4, 0x3A, 0x0, 0x6, 0x2, 0x3C, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x17, 0x0, 0x0, 0x7, 0x9C, 0x7, 0x25, 0x0, 0x26, 0x2, 0x70, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x2, 0x1D, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x1E, 0x0, 0x0, 0x6, 0x5C, 0x5, 0xD9, 0x0, 0x26, 0x2, 0x84, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x1, 0x86, 0xFF, 0xF2, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x1D, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xF5, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x5, 0xE7, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x1, 0x89, 0x7F, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x3, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xEE, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x5, 0xCD, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x78, 0x0, 0xFF, 0xFF, 0xFF, 0xF6, 0x0, 0x0, 0x7, 0x57, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x82, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x48, 0xFF, 0xEB, 0x6, 0x85, 0x4, 0x4F, 0x0, 0x6, 0x0, 0x87, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x25, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xBB, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x5, 0xE7, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x1, 0x89, 0x73, 0x0, 0xFF, 0xFF, 0x0, 0x51, 0xFF, 0xEB, 0x5, 0x1E, 0x6, 0xDC, 0x0, 0x26, 0x2, 0xEF, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xC2, 0x1, 0xF, 0xFF, 0xFF, 0x0, 0x5A, 0xFF, 0xEB, 0x3, 0xF8, 0x4, 0x50, 0x0, 0x6, 0x1, 0xE, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5A, 0xFF, 0xEB, 0x3, 0xF8, 0x5, 0xCE, 0x0, 0x26, 0x1, 0xE, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x69, 0x1, 0xFF, 0xFF, 0x0, 0x17, 0x0, 0x0, 0x7, 0x9C, 0x7, 0xB, 0x0, 0x26, 0x2, 0x70, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x2, 0x16, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x1E, 0x0, 0x0, 0x6, 0x5C, 0x5, 0xBF, 0x0, 0x26, 0x2, 0x84, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x7F, 0xFF, 0xF2, 0xFF, 0xFF, 0x0, 0x49, 0xFF, 0xEC, 0x4, 0x7F, 0x7, 0x18, 0x0, 0x26, 0x2, 0x71, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xA4, 0x1, 0x4B, 0xFF, 0xFF, 0x0, 0x4E, 0xFF, 0xEC, 0x3, 0xC4, 0x5, 0xCC, 0x0, 0x26, 0x2, 0x85, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x4F, 0xFF, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0xD, 0x6, 0xEB, 0x0, 0x26, 0x2, 0x72, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xE5, 0x1, 0x41, 0xFF, 0xFF, 0x0, 0x86, 0x0, 0x0, 0x4, 0x13, 0x5, 0x9F, 0x0, 0x26, 0x2, 0x86, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x60, 0xF5, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0xD, 0x7, 0xB, 0x0, 0x26, 0x2, 0x72, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x15, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x86, 0x0, 0x0, 0x4, 0x13, 0x5, 0xBF, 0x0, 0x26, 0x2, 0x86, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0x90, 0xFF, 0xF2, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x3, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x5, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x5, 0xCD, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5F, 0xFF, 0xEC, 0x5, 0x18, 0x5, 0xC4, 0x0, 0x6, 0x2, 0xAD, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0x3D, 0x4, 0x4E, 0x0, 0x6, 0x2, 0xAE, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5F, 0xFF, 0xEC, 0x5, 0x18, 0x5, 0xC4, 0x0, 0x6, 0x2, 0xAD, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5F, 0xFF, 0xEC, 0x5, 0x18, 0x7, 0x8, 0x0, 0x26, 0x2, 0xAD, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x13, 0x1, 0x3B, 0xFF, 0xFF, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0x3D, 0x5, 0xCD, 0x0, 0x26, 0x2, 0xAE, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x74, 0x0, 0xFF, 0xFF, 0x0, 0x6B, 0xFF, 0xEC, 0x4, 0xF1, 0x7, 0x19, 0x0, 0x26, 0x2, 0x7D, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xE4, 0x1, 0x4C, 0xFF, 0xFF, 0x0, 0x52, 0xFF, 0xEB, 0x3, 0xE9, 0x5, 0xCD, 0x0, 0x26, 0x2, 0x95, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x59, 0x0, 0xFF, 0xFF, 0x0, 0x3A, 0xFF, 0xEB, 0x4, 0xDE, 0x6, 0xEB, 0x0, 0x26, 0x2, 0x74, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xA2, 0x1, 0x41, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x5, 0xAD, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x13, 0x3, 0xFF, 0xFF, 0x0, 0x3A, 0xFF, 0xEB, 0x4, 0xDE, 0x7, 0xB, 0x0, 0x26, 0x2, 0x74, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xD2, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x5, 0xCD, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x43, 0x0, 0xFF, 0xFF, 0x0, 0x3A, 0xFF, 0xEB, 0x4, 0xDE, 0x7, 0x3D, 0x0, 0x26, 0x2, 0x74, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8E, 0x1, 0x30, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xF8, 0x5, 0xFF, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8E, 0x0, 0xA1, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8E, 0x0, 0x0, 0x4, 0xEF, 0x7, 0xB, 0x0, 0x26, 0x2, 0x77, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x10, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x5F, 0x0, 0x0, 0x3, 0xE1, 0x5, 0xBF, 0x0, 0x26, 0x2, 0x8F, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x67, 0xF2, 0xFF, 0xFF, 0x0, 0x9C, 0x0, 0x0, 0x6, 0x59, 0x7, 0xB, 0x0, 0x26, 0x2, 0x7B, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0xC2, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x8F, 0x0, 0x0, 0x5, 0xCA, 0x5, 0xBF, 0x0, 0x26, 0x2, 0x93, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x74, 0xFF, 0xF2, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x4, 0x6, 0x0, 0x0, 0x6, 0x0, 0x49, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0xFE, 0x96, 0x5, 0x43, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0xF, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x5B, 0xFE, 0x9B, 0x3, 0xFC, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x41, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0xBC, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x5, 0x5, 0x1, 0x3C, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x86, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x4, 0x8F, 0x0, 0x6, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x4A, 0x7, 0xB1, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xBF, 0x0, 0xBE, 0x1, 0x20, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x4, 0xD4, 0x6, 0x7B, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x7, 0xBF, 0x48, 0xEA, 0xFF, 0xFF, 0x0, 0xE, 0x0, 0x0, 0x5, 0x43, 0x7, 0xAF, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC0, 0x0, 0xC3, 0x1, 0x2B, 0xFF, 0xFF, 0xFF, 0x98, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x79, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC0, 0x4D, 0xF5, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0xDD, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC1, 0x0, 0xC2, 0x1, 0x12, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x4, 0x56, 0x6, 0xA7, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC1, 0x4C, 0xDC, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0xD6, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC2, 0x0, 0xC3, 0x1, 0x4, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0xA0, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC2, 0x4D, 0xCE, 0xFF, 0xFF, 0x0, 0x12, 0xFE, 0x96, 0x5, 0x43, 0x7, 0x37, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x27, 0x1, 0x77, 0x0, 0xC2, 0x1, 0x36, 0x0, 0x7, 0x1, 0xD4, 0x5, 0xF, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x5B, 0xFE, 0x9B, 0x3, 0xFC, 0x6, 0x1, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x26, 0x1, 0x77, 0x4C, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x41, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0xAF, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC5, 0x0, 0xEF, 0x1, 0x30, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x79, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC5, 0x79, 0xFA, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0xAF, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB3, 0x0, 0xEF, 0x1, 0x30, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x79, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x7, 0xB3, 0x79, 0xFA, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x8, 0x3E, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC6, 0x0, 0xEE, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x7, 0x8, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC6, 0x78, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x8, 0x19, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDA, 0x0, 0xF0, 0x1, 0x3C, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0xE3, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x7, 0xDA, 0x7A, 0x6, 0xFF, 0xFF, 0x0, 0x12, 0xFE, 0x96, 0x5, 0x43, 0x7, 0x1D, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x27, 0x1, 0x89, 0x0, 0xF5, 0x1, 0x36, 0x0, 0x7, 0x1, 0xD4, 0x5, 0xF, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x5B, 0xFE, 0x9B, 0x3, 0xFC, 0x5, 0xE7, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x26, 0x1, 0x89, 0x7F, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x41, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x9D, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xCC, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x54, 0xFE, 0x93, 0x4, 0xC, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x91, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0xC4, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x4, 0xCB, 0x1, 0x44, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x6, 0x86, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x4, 0x83, 0x0, 0x6, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x33, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0x8A, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x5, 0xF5, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x42, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x10, 0x7, 0xB9, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xBF, 0x0, 0x84, 0x1, 0x28, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC8, 0x6, 0x7B, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x7, 0xBF, 0x3C, 0xEA, 0xFF, 0xFF, 0xFF, 0xD4, 0x0, 0x0, 0x4, 0x4D, 0x7, 0xB7, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC0, 0x0, 0x89, 0x1, 0x33, 0xFF, 0xFF, 0xFF, 0x8C, 0xFF, 0xEC, 0x4, 0xC, 0x6, 0x79, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC0, 0x41, 0xF5, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x92, 0x7, 0xE5, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC1, 0x0, 0x88, 0x1, 0x1A, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0x4A, 0x6, 0xA7, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC1, 0x40, 0xDC, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0xDE, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC2, 0x0, 0x89, 0x1, 0xC, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x6, 0xA0, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC2, 0x41, 0xCE, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x9D, 0x4, 0x4D, 0x7, 0x3F, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x27, 0x1, 0x77, 0x0, 0x88, 0x1, 0x3E, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xCC, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x54, 0xFE, 0x93, 0x4, 0xC, 0x6, 0x1, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x26, 0x1, 0x77, 0x40, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x91, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x2, 0x12, 0x7, 0xC4, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x3, 0x79, 0x1, 0x44, 0xFF, 0xFF, 0x0, 0x90, 0x0, 0x0, 0x1, 0xFD, 0x6, 0x7F, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x3, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x94, 0xFE, 0x9A, 0x1, 0xA8, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x79, 0x0, 0x7, 0xFF, 0xFF, 0x0, 0x79, 0xFE, 0x9D, 0x1, 0x91, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x4E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x5E, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x66, 0xFE, 0x93, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0x1F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x8F, 0x4, 0x3E, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0xBC, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x5, 0x1C, 0x1, 0x3C, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x86, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x4, 0x98, 0x0, 0x6, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x61, 0x7, 0xB1, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xBF, 0x0, 0xD5, 0x1, 0x20, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0xDD, 0x6, 0x7B, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x6, 0x7, 0xBF, 0x51, 0xEA, 0xFF, 0xFF, 0x0, 0x25, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0xAF, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC0, 0x0, 0xDA, 0x1, 0x2B, 0xFF, 0xFF, 0xFF, 0xA1, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x79, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC0, 0x56, 0xF5, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0xDD, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC1, 0x0, 0xD9, 0x1, 0x12, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x5F, 0x6, 0xA7, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC1, 0x55, 0xDC, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0xD6, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC2, 0x0, 0xDA, 0x1, 0x4, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0xA0, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x6, 0x7, 0xC2, 0x56, 0xCE, 0xFF, 0xFF, 0x0, 0x66, 0xFE, 0x93, 0x5, 0x1F, 0x7, 0x37, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x27, 0x1, 0x77, 0x0, 0xD9, 0x1, 0x36, 0x0, 0x7, 0x1, 0xD4, 0x5, 0x1F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x8F, 0x4, 0x3E, 0x6, 0x1, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x26, 0x1, 0x77, 0x55, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x9F, 0xFF, 0xFC, 0xFF, 0xFF, 0x0, 0x58, 0xFF, 0xEC, 0x5, 0xAA, 0x7, 0x34, 0x0, 0x26, 0x0, 0xB4, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xD3, 0x1, 0x34, 0xFF, 0xFF, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0xBC, 0x6, 0x0, 0x0, 0x26, 0x0, 0xB5, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x58, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x58, 0xFF, 0xEC, 0x5, 0xAA, 0x7, 0x34, 0x0, 0x26, 0x0, 0xB4, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x34, 0x1, 0x34, 0xFF, 0xFF, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0xBC, 0x6, 0x0, 0x0, 0x26, 0x0, 0xB5, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xB9, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x58, 0xFF, 0xEC, 0x5, 0xAA, 0x7, 0xBA, 0x0, 0x26, 0x0, 0xB4, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x5, 0x17, 0x1, 0x3A, 0xFF, 0xFF, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0xBC, 0x6, 0x86, 0x0, 0x26, 0x0, 0xB5, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x4, 0x9C, 0x0, 0x6, 0xFF, 0xFF, 0x0, 0x58, 0xFF, 0xEC, 0x5, 0xAA, 0x7, 0x29, 0x0, 0x26, 0x0, 0xB4, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0xD6, 0x1, 0x34, 0xFF, 0xFF, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0xBC, 0x5, 0xF5, 0x0, 0x26, 0x0, 0xB5, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x5B, 0x0, 0xFF, 0xFF, 0x0, 0x58, 0xFE, 0x93, 0x5, 0xAA, 0x6, 0x2E, 0x0, 0x26, 0x0, 0xB4, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0x8, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x4F, 0xFE, 0x89, 0x4, 0xBC, 0x4, 0xA9, 0x0, 0x26, 0x0, 0xB5, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x9C, 0xFF, 0xF6, 0xFF, 0xFF, 0x0, 0x7E, 0xFE, 0x93, 0x4, 0xBE, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xF3, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x77, 0xFE, 0x93, 0x3, 0xF7, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x43, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0xBC, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x4, 0xF3, 0x1, 0x3C, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x6, 0x86, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x4, 0x91, 0x0, 0x6, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x6, 0x3D, 0x7, 0x42, 0x0, 0x26, 0x0, 0xC3, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xD6, 0x1, 0x42, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x5, 0x29, 0x5, 0xEB, 0x0, 0x26, 0x0, 0xC4, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x56, 0xFF, 0xEB, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x6, 0x3D, 0x7, 0x42, 0x0, 0x26, 0x0, 0xC3, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x37, 0x1, 0x42, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x5, 0x29, 0x5, 0xEB, 0x0, 0x26, 0x0, 0xC4, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xB7, 0xFF, 0xEB, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x6, 0x3D, 0x7, 0xC8, 0x0, 0x26, 0x0, 0xC3, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x5, 0x1A, 0x1, 0x48, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x5, 0x29, 0x6, 0x71, 0x0, 0x26, 0x0, 0xC4, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x4, 0x9A, 0xFF, 0xF1, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x6, 0x3D, 0x7, 0x37, 0x0, 0x26, 0x0, 0xC3, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0xD9, 0x1, 0x42, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x5, 0x29, 0x5, 0xE0, 0x0, 0x26, 0x0, 0xC4, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x59, 0xEB, 0xFF, 0xFF, 0x0, 0x7E, 0xFE, 0x89, 0x6, 0x3D, 0x6, 0x1, 0x0, 0x26, 0x0, 0xC3, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0x1A, 0xFF, 0xF6, 0xFF, 0xFF, 0x0, 0x77, 0xFE, 0x93, 0x5, 0x29, 0x4, 0x94, 0x0, 0x26, 0x0, 0xC4, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x8F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8, 0xFE, 0xA3, 0x4, 0xD6, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xC7, 0x0, 0x10, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0xC, 0x3, 0xD7, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0x48, 0xFF, 0x79, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x7, 0xBC, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x4, 0xCB, 0x1, 0x3C, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x6, 0x86, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xBA, 0x4, 0x5A, 0x0, 0x6, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x7, 0x2B, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0x8A, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x5, 0xF5, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x19, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0xAC, 0x4, 0xB3, 0x6, 0x0, 0x0, 0x26, 0x0, 0x49, 0x0, 0x0, 0x0, 0x27, 0x7, 0xA4, 0x1, 0x85, 0x2, 0x41, 0x0, 0x7, 0x0, 0x44, 0x0, 0x98, 0xFF, 0x6C, 0xFF, 0xFF, 0x0, 0x2D, 0xFE, 0x99, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x39, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x2, 0x4E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x24, 0xFE, 0x99, 0x3, 0xD1, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x8C, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x1, 0xE6, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8E, 0xFE, 0x99, 0x4, 0xEF, 0x5, 0xB0, 0x0, 0x26, 0x2, 0x77, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x2, 0xD0, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5F, 0xFE, 0x99, 0x3, 0xE1, 0x4, 0x3B, 0x0, 0x26, 0x2, 0x8F, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x1, 0xC6, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x9B, 0xFE, 0x99, 0x4, 0x38, 0x5, 0xB0, 0x0, 0x26, 0x2, 0x30, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x1, 0x8, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x85, 0xFE, 0x99, 0x3, 0x4D, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x82, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x0, 0xED, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x17, 0xFE, 0x3F, 0x5, 0xBD, 0x5, 0xC4, 0x0, 0x26, 0x2, 0xE3, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x2, 0xEC, 0xFF, 0xA6, 0xFF, 0xFF, 0xFF, 0xCA, 0xFE, 0x44, 0x4, 0x8B, 0x4, 0x4E, 0x0, 0x26, 0x2, 0xE4, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x1, 0xF4, 0xFF, 0xAB, 0xFF, 0xFF, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x6, 0x0, 0x0, 0x6, 0x0, 0x4D, 0x0, 0x0, 0x0, 0x2, 0xFF, 0xD0, 0x0, 0x0, 0x4, 0xC2, 0x5, 0xB0, 0x0, 0x12, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x14, 0x4, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x21, 0x16, 0x4, 0x1, 0x21, 0x32, 0x36, 0x34, 0x26, 0x23, 0x21, 0x4, 0xC2, 0xFE, 0xEC, 0xF8, 0xFD, 0xDB, 0xC1, 0xC1, 0xFD, 0xE0, 0xE0, 0x1, 0x2C, 0xF6, 0x1, 0x12, 0xFC, 0xCC, 0x1, 0x28, 0x8D, 0x82, 0x82, 0x8D, 0xFE, 0xD8, 0x1, 0xC6, 0xC8, 0xFE, 0x4, 0x46, 0xAB, 0xBF, 0xBF, 0xAB, 0xC3, 0x1, 0xF3, 0xFE, 0x3B, 0x99, 0xCA, 0x8B, 0x0, 0x2, 0xFF, 0xD0, 0x0, 0x0, 0x4, 0xC2, 0x5, 0xB0, 0x0, 0x12, 0x0, 0x1A, 0x0, 0x0, 0x1, 0x14, 0x4, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x21, 0x16, 0x4, 0x1, 0x21, 0x32, 0x36, 0x34, 0x26, 0x23, 0x21, 0x4, 0xC2, 0xFE, 0xEC, 0xF8, 0xFD, 0xDB, 0xC1, 0xC1, 0xFD, 0xE0, 0xE0, 0x1, 0x2C, 0xF6, 0x1, 0x12, 0xFC, 0xCC, 0x1, 0x28, 0x8D, 0x82, 0x82, 0x8D, 0xFE, 0xD8, 0x1, 0xC6, 0xC8, 0xFE, 0x4, 0x46, 0xAB, 0xBF, 0xBF, 0xAB, 0xC3, 0x1, 0xF3, 0xFE, 0x3B, 0x99, 0xCA, 0x8B, 0x0, 0x1, 0xFF, 0xF0, 0x0, 0x0, 0x4, 0x38, 0x5, 0xB0, 0x0, 0xD, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x2, 0x8E, 0xF7, 0xFC, 0xAB, 0xAB, 0x3, 0x9D, 0xFD, 0x5F, 0xF7, 0x2, 0x9F, 0xFD, 0x61, 0x2, 0x9F, 0xAB, 0x2, 0x66, 0xCB, 0xFE, 0x65, 0x0, 0x1, 0xFF, 0xE2, 0x0, 0x0, 0x3, 0x4D, 0x4, 0x3A, 0x0, 0xD, 0x0, 0x0, 0x1, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x2, 0x80, 0xFE, 0xF8, 0xF3, 0xA3, 0xA3, 0x2, 0xC8, 0xFE, 0x2B, 0x1, 0x8, 0x1, 0xD0, 0xFE, 0x30, 0x1, 0xD0, 0xAB, 0x1, 0xBF, 0xC4, 0xFB, 0x0, 0x1, 0xFF, 0xF7, 0x0, 0x0, 0x5, 0x44, 0x5, 0xB0, 0x0, 0x14, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x1, 0x21, 0x1, 0x1, 0x4, 0x14, 0xFE, 0x44, 0xAD, 0xFC, 0xB8, 0xB8, 0xFC, 0xEA, 0xEA, 0x8B, 0x1, 0xAD, 0x1, 0x36, 0xFE, 0xC, 0x2, 0x1F, 0x2, 0x70, 0xFD, 0x90, 0x4, 0x3E, 0xAB, 0xC7, 0xC7, 0xAB, 0xF1, 0x2, 0x63, 0xFD, 0x46, 0xFD, 0xA, 0x0, 0x1, 0xFF, 0xC2, 0x0, 0x0, 0x4, 0x4A, 0x6, 0x0, 0x0, 0x14, 0x0, 0x0, 0x21, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x33, 0x1, 0x21, 0x1, 0x1, 0x3, 0x2F, 0xFE, 0xC8, 0x6F, 0xF3, 0xD3, 0xD3, 0xF3, 0xD8, 0xD8, 0x68, 0x1, 0x10, 0x1, 0x1B, 0xFE, 0x9F, 0x1, 0x90, 0x1, 0xDA, 0xFE, 0x26, 0x4, 0xBA, 0xAB, 0x9B, 0x9B, 0xAB, 0xFD, 0xE2, 0x1, 0x9E, 0xFE, 0x13, 0xFD, 0xB3, 0x0, 0x1, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x5, 0xB0, 0x0, 0xE, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x33, 0x3, 0xC5, 0xD7, 0xFE, 0xC9, 0x79, 0xFE, 0x68, 0x1, 0x19, 0x1, 0x4E, 0x1, 0x4F, 0x1, 0x18, 0xFE, 0x68, 0x87, 0x2, 0x4, 0xFD, 0xFC, 0x2, 0x4, 0xAB, 0x3, 0x1, 0xFD, 0x4F, 0x2, 0xB1, 0xFC, 0xFF, 0x0, 0x1, 0x0, 0x21, 0xFE, 0x5F, 0x3, 0xF5, 0x4, 0x3A, 0x0, 0xE, 0x0, 0x0, 0x5, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x1, 0x33, 0x13, 0x13, 0x33, 0x1, 0x33, 0x3, 0x61, 0xDD, 0xF2, 0xCF, 0xA4, 0xFE, 0xBA, 0xFB, 0xF3, 0xEC, 0xFA, 0xFE, 0xBD, 0xAF, 0x2, 0xFE, 0x61, 0x1, 0x9F, 0xAB, 0x3, 0x91, 0xFD, 0x4, 0x2, 0xFC, 0xFC, 0x6F, 0x0, 0x1, 0x0, 0x29, 0x0, 0x0, 0x4, 0xEA, 0x5, 0xB0, 0x0, 0x11, 0x0, 0x0, 0x1, 0x1, 0x21, 0x1, 0x23, 0x35, 0x33, 0x1, 0x21, 0x1, 0x1, 0x21, 0x1, 0x33, 0x15, 0x23, 0x1, 0x21, 0x2, 0x8A, 0xFE, 0xC6, 0xFE, 0xD9, 0x1, 0x96, 0x81, 0x73, 0xFE, 0x83, 0x1, 0x24, 0x1, 0x32, 0x1, 0x31, 0x1, 0x24, 0xFE, 0x83, 0x7A, 0x88, 0x1, 0x96, 0xFE, 0xD9, 0x2, 0x17, 0xFD, 0xE9, 0x2, 0x94, 0xAB, 0x2, 0x71, 0xFD, 0xF2, 0x2, 0xE, 0xFD, 0x8F, 0xAB, 0xFD, 0x6C, 0x0, 0x1, 0x0, 0x1F, 0x0, 0x0, 0x3, 0xE9, 0x4, 0x3A, 0x0, 0x11, 0x0, 0x0, 0x1, 0x3, 0x21, 0x1, 0x23, 0x35, 0x33, 0x1, 0x21, 0x13, 0x13, 0x21, 0x1, 0x33, 0x15, 0x23, 0x1, 0x21, 0x2, 0x4, 0xD7, 0xFE, 0xF2, 0x1, 0x24, 0x89, 0x83, 0xFE, 0xEE, 0x1, 0xD, 0xCA, 0xCE, 0x1, 0xD, 0xFE, 0xEE, 0x8D, 0x93, 0x1, 0x24, 0xFE, 0xF3, 0x1, 0x72, 0xFE, 0x8E, 0x1, 0xD6, 0xAB, 0x1, 0xB9, 0xFE, 0x9C, 0x1, 0x64, 0xFE, 0x47, 0xAB, 0xFE, 0x2A, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x4, 0x4D, 0x0, 0x6, 0x2, 0x3E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x2, 0x0, 0x0, 0x4, 0x31, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2B, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA4, 0xFF, 0x72, 0xFE, 0x68, 0xFF, 0xFF, 0x0, 0x82, 0x2, 0x6E, 0x5, 0xCF, 0x3, 0x32, 0x0, 0x6, 0x4, 0x5F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x51, 0x0, 0x0, 0x4, 0x41, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x17, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x16, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x18, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x35, 0x0, 0x0, 0x4, 0x59, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x19, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x81, 0xFF, 0xEC, 0x4, 0x3A, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x1A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8A, 0xFF, 0xEC, 0x4, 0x4B, 0x5, 0xB7, 0x0, 0x6, 0x0, 0x1B, 0x14, 0x0, 0xFF, 0xFF, 0x0, 0x7D, 0xFF, 0xEC, 0x4, 0x37, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x1D, 0x14, 0x0, 0xFF, 0xFF, 0x0, 0x5E, 0xFF, 0xF9, 0x4, 0x13, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x1E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7D, 0xFF, 0xEC, 0x4, 0x36, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x15, 0x14, 0x0, 0xFF, 0xFF, 0x0, 0x73, 0xFD, 0xF2, 0x1, 0x75, 0xFF, 0x9C, 0x0, 0x6, 0x4, 0x3B, 0x0, 0x0, 0x0, 0x1, 0x0, 0x90, 0xFF, 0xEC, 0x2, 0x9B, 0x6, 0x0, 0x0, 0xC, 0x0, 0x0, 0x1, 0x11, 0x16, 0x33, 0x32, 0x37, 0x17, 0x6, 0x23, 0x22, 0x26, 0x35, 0x11, 0x1, 0x83, 0x1, 0xA2, 0x28, 0x34, 0x19, 0x5B, 0x3D, 0xAD, 0xC6, 0x6, 0x0, 0xFB, 0x5E, 0xAF, 0xB, 0xB9, 0x15, 0xBF, 0xB5, 0x4, 0xA0, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x4, 0x4E, 0x0, 0x6, 0x2, 0x40, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x8, 0x3A, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x7, 0x0, 0x2F, 0x4, 0x55, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x4B, 0x5, 0xDB, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4F, 0x4, 0x55, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8C, 0xFE, 0x4B, 0x3, 0x92, 0x6, 0x0, 0x0, 0x26, 0x0, 0x51, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4F, 0x2, 0xC, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x9, 0x94, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x0, 0x2F, 0x5, 0xAF, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x4B, 0x7, 0x35, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4F, 0x5, 0xAF, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0x4B, 0x5, 0xF9, 0x5, 0xD5, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x7, 0x0, 0x4F, 0x4, 0x73, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x38, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0xDA, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x2, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x64, 0x0, 0xFF, 0xFF, 0xFF, 0xC0, 0x0, 0x0, 0x2, 0x83, 0x7, 0x40, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0xFF, 0x4E, 0x1, 0x3E, 0xFF, 0xFF, 0xFF, 0xAB, 0x0, 0x0, 0x2, 0x6E, 0x5, 0xFB, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0xFF, 0x39, 0xFF, 0xF9, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x38, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0xF1, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x2, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x6D, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x38, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0xC8, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x6, 0x2, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x66, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0xF3, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB4, 0x4, 0xE3, 0x1, 0x51, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x6, 0xDA, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x8, 0xBF, 0x4, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0xB6, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB5, 0x4, 0xE3, 0x1, 0x51, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x7, 0x2D, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x8, 0xBB, 0x4, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0xF2, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB6, 0x4, 0xE3, 0x1, 0x51, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x7, 0x2E, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x8, 0xC5, 0x4, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0xB6, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB7, 0x4, 0xE3, 0x1, 0x51, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x7, 0x2D, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x8, 0xC0, 0x4, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5A, 0xFF, 0xEB, 0x3, 0xF8, 0x4, 0x50, 0x0, 0x6, 0x1, 0xE, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0xF3, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB4, 0x4, 0xF5, 0x1, 0x51, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0xDA, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x8, 0xBF, 0x4, 0x7F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0xF2, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB8, 0x4, 0xF5, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0xEC, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x8, 0xBD, 0x4, 0x7F, 0x0, 0x8, 0xFF, 0xFF, 0xFF, 0xF6, 0x0, 0x0, 0x7, 0x57, 0x6, 0xEF, 0x0, 0x26, 0x0, 0x82, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x1, 0xB8, 0x1, 0x45, 0xFF, 0xFF, 0x0, 0x48, 0xFF, 0xEB, 0x6, 0x85, 0x5, 0xAE, 0x0, 0x26, 0x0, 0x87, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x1, 0x6D, 0x0, 0x4, 0xFF, 0xFF, 0x0, 0x6A, 0xFF, 0xEC, 0x4, 0xF0, 0x7, 0x4D, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0xD6, 0x1, 0x4B, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0x56, 0x4, 0xD, 0x6, 0x2, 0x0, 0x26, 0x0, 0x4C, 0x0, 0x0, 0x0, 0x6, 0x1, 0x78, 0x58, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x7, 0x39, 0x0, 0x26, 0x0, 0x30, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0x86, 0x1, 0x37, 0xFF, 0xFF, 0x0, 0x7D, 0x0, 0x0, 0x4, 0x37, 0x7, 0x3F, 0x0, 0x26, 0x0, 0x50, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0x84, 0x1, 0x3D, 0xFF, 0xFF, 0x0, 0x66, 0xFE, 0x52, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x1, 0x92, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x4E, 0x4, 0x3E, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x1, 0x12, 0xFF, 0xFC, 0xFF, 0xFF, 0x0, 0x66, 0xFE, 0x52, 0x5, 0x1F, 0x6, 0xE3, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x27, 0x1, 0x8C, 0x1, 0x92, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xD5, 0x1, 0x39, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x4E, 0x4, 0x3E, 0x5, 0xAD, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x27, 0x1, 0x8C, 0x1, 0x12, 0xFF, 0xFC, 0x0, 0x6, 0x0, 0x71, 0x51, 0x3, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x9, 0xC6, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x29, 0x0, 0x0, 0x0, 0x7, 0x0, 0x3F, 0x5, 0x3A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x8, 0xFA, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x29, 0x0, 0x0, 0x0, 0x7, 0x0, 0x5F, 0x5, 0x3A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x8, 0x45, 0x6, 0x0, 0x0, 0x26, 0x0, 0x49, 0x0, 0x0, 0x0, 0x7, 0x0, 0x5F, 0x4, 0x85, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x6A, 0xFF, 0xEC, 0x4, 0xF0, 0x7, 0x4B, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xBD, 0x1, 0x4B, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0x56, 0x4, 0xD, 0x6, 0x0, 0x0, 0x26, 0x0, 0x4C, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x3F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x7, 0x36, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x4B, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x6, 0x0, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0xB3, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x21, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x4, 0x78, 0x1, 0x33, 0xFF, 0xFF, 0x0, 0xD, 0xFF, 0xEC, 0x3, 0xFC, 0x5, 0xEB, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x4, 0x2, 0xFF, 0xFD, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x50, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x4, 0xF5, 0x1, 0xA0, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x6, 0x1A, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x4, 0x7F, 0x0, 0x6A, 0xFF, 0xFF, 0x0, 0x49, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x29, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x4, 0x3E, 0x1, 0x3B, 0xFF, 0xFF, 0x0, 0x1, 0xFF, 0xEC, 0x4, 0xC, 0x5, 0xEB, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x3, 0xF6, 0xFF, 0xFD, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0x58, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x4, 0xBB, 0x1, 0xA8, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x6, 0x1A, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x4, 0x73, 0x0, 0x6A, 0xFF, 0xFF, 0xFE, 0xF7, 0x0, 0x0, 0x2, 0x1F, 0x7, 0x29, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x2, 0xEC, 0x1, 0x3B, 0xFF, 0xFF, 0xFE, 0xE2, 0x0, 0x0, 0x2, 0xA, 0x5, 0xE4, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x2, 0xD7, 0xFF, 0xF6, 0xFF, 0xFF, 0xFF, 0xDE, 0x0, 0x0, 0x2, 0x64, 0x7, 0x58, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x3, 0x69, 0x1, 0xA8, 0xFF, 0xFF, 0xFF, 0xC9, 0x0, 0x0, 0x2, 0x4F, 0x6, 0x13, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x3, 0x54, 0x0, 0x63, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x21, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x4, 0x8F, 0x1, 0x33, 0xFF, 0xFF, 0x0, 0x16, 0xFF, 0xEC, 0x4, 0x3E, 0x5, 0xEB, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x4, 0xB, 0xFF, 0xFD, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x50, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x5, 0xC, 0x1, 0xA0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x1A, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x4, 0x88, 0x0, 0x6A, 0xFF, 0xFF, 0x0, 0x32, 0x0, 0x0, 0x4, 0xDE, 0x7, 0x21, 0x0, 0x26, 0x0, 0x37, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x4, 0x27, 0x1, 0x33, 0xFF, 0xFF, 0xFF, 0x6F, 0x0, 0x0, 0x2, 0xB5, 0x5, 0xEB, 0x0, 0x26, 0x0, 0x57, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x3, 0x64, 0xFF, 0xFD, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xDE, 0x7, 0x50, 0x0, 0x26, 0x0, 0x37, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x4, 0xA4, 0x1, 0xA0, 0xFF, 0xFF, 0x0, 0x56, 0x0, 0x0, 0x2, 0xDC, 0x6, 0x1A, 0x0, 0x26, 0x0, 0x57, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x3, 0xE1, 0x0, 0x6A, 0xFF, 0xFF, 0x0, 0x71, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x21, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x4, 0x66, 0x1, 0x33, 0xFF, 0xFF, 0x0, 0xF, 0xFF, 0xEC, 0x3, 0xF7, 0x5, 0xEB, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC0, 0x4, 0x4, 0xFF, 0xFD, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0x50, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x4, 0xE3, 0x1, 0xA0, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x6, 0x1A, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xC2, 0x4, 0x81, 0x0, 0x6A, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x7, 0x40, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0xFA, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x7, 0x60, 0x0, 0x26, 0x0, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x0, 0x2F, 0x1, 0x5E, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x13, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0xA8, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x3, 0xFC, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x32, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x4A, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x1, 0x93, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x54, 0xFE, 0x40, 0x4, 0xC, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x7A, 0x1, 0x58, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0xF3, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB4, 0x5, 0xC, 0x1, 0x51, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0xDA, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x8, 0xBF, 0x4, 0x88, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0xF6, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC3, 0x5, 0xC, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x7, 0x2, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x8, 0xC2, 0x4, 0x88, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0x13, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0xBF, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x3B, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0xF2, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB8, 0x5, 0xC, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0xEC, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x8, 0xBD, 0x4, 0x88, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x6, 0xE3, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0x84, 0x1, 0x39, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x5, 0xAD, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x13, 0x3, 0xFF, 0xFF, 0x0, 0x4F, 0xFF, 0xEC, 0x4, 0x3D, 0x4, 0x4E, 0x0, 0x6, 0x2, 0xAE, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x8F, 0x0, 0x0, 0x4, 0x3B, 0x4, 0x3A, 0x0, 0x6, 0x2, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x86, 0x0, 0x0, 0x4, 0x11, 0x4, 0x3A, 0x0, 0x6, 0x2, 0x8A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x2D, 0xFF, 0xEC, 0x3, 0xE5, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x2F, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xF, 0x0, 0x0, 0x5, 0x2, 0x6, 0x40, 0x0, 0x26, 0x2, 0x51, 0x64, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x0, 0x0, 0x4, 0x9E, 0x7, 0xF, 0x0, 0x26, 0x2, 0x51, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0x78, 0x1, 0x42, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x3, 0xF5, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x48, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xB4, 0xFE, 0x4B, 0x1, 0x86, 0x5, 0xD5, 0x0, 0x6, 0x0, 0x4F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5F, 0xFF, 0xEC, 0x5, 0x18, 0x5, 0xC4, 0x0, 0x6, 0x2, 0xAD, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x7F, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x85, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x83, 0xFE, 0x60, 0x4, 0x37, 0x6, 0x0, 0x0, 0x6, 0x0, 0x8B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x4, 0xEC, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x28, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x6, 0x6B, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x32, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x60, 0xFF, 0x4, 0x5, 0x1B, 0x5, 0xC4, 0x0, 0x6, 0x0, 0x36, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x60, 0x4, 0x3, 0x4, 0x4E, 0x0, 0x6, 0x0, 0x56, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x31, 0x0, 0x0, 0x6, 0xE5, 0x5, 0xB0, 0x0, 0x6, 0x0, 0x3C, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x5, 0xCD, 0x4, 0x3A, 0x0, 0x6, 0x0, 0x5C, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xA3, 0x7, 0x1F, 0x0, 0x26, 0x0, 0x27, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x59, 0x1, 0x4A, 0xFF, 0xFF, 0x0, 0x7D, 0xFF, 0xEC, 0x4, 0x32, 0x7, 0x1A, 0x0, 0x26, 0x0, 0x47, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x88, 0x1, 0x45, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x9D, 0x4, 0xA3, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x27, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xBB, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x7D, 0xFE, 0x89, 0x4, 0x32, 0x6, 0x0, 0x0, 0x26, 0x0, 0x47, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xCC, 0xFF, 0xF6, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0xCB, 0x4, 0xA3, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x27, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0xAB, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x7D, 0xFE, 0xB7, 0x4, 0x32, 0x6, 0x0, 0x0, 0x26, 0x0, 0x47, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0xBC, 0xFF, 0xF6, 0xFF, 0xFF, 0x0, 0x66, 0xFE, 0x39, 0x4, 0xEC, 0x7, 0x4B, 0x0, 0x26, 0x0, 0x28, 0x0, 0x0, 0x0, 0x27, 0x0, 0x7A, 0x1, 0xC9, 0xFF, 0xF9, 0x0, 0x7, 0x0, 0x76, 0x1, 0xC0, 0x1, 0x4B, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x39, 0x3, 0xF5, 0x6, 0x0, 0x0, 0x26, 0x0, 0x48, 0x0, 0x0, 0x0, 0x27, 0x0, 0x7A, 0x1, 0x3D, 0xFF, 0xF9, 0x0, 0x7, 0x0, 0x76, 0x1, 0x29, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xD2, 0x7, 0x1B, 0x0, 0x26, 0x0, 0x29, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x36, 0x1, 0x46, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x4, 0x7, 0x1A, 0x0, 0x26, 0x0, 0x49, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x8, 0x1, 0x45, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x9D, 0x4, 0xD2, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x29, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x95, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x93, 0x4, 0x4, 0x6, 0x0, 0x0, 0x26, 0x0, 0x49, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xB5, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0xCB, 0x4, 0xD2, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x29, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0x85, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0xC1, 0x4, 0x4, 0x6, 0x0, 0x0, 0x26, 0x0, 0x49, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0xA5, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x1, 0x4, 0xD2, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x29, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x48, 0xFE, 0x9B, 0xFF, 0xFF, 0x0, 0x50, 0xFD, 0xF7, 0x4, 0x4, 0x6, 0x0, 0x0, 0x26, 0x0, 0x49, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x68, 0xFE, 0x91, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x80, 0x4, 0xD2, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x29, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x4, 0x85, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x76, 0x4, 0x4, 0x6, 0x0, 0x0, 0x26, 0x0, 0x49, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x4, 0xA5, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0xBE, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xBA, 0x4, 0xBB, 0x1, 0x5F, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x7, 0x30, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x8, 0xBE, 0x4, 0x73, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x4D, 0x7, 0xBE, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xBB, 0x4, 0xBB, 0x1, 0x5F, 0xFF, 0xFF, 0x0, 0x54, 0xFF, 0xEC, 0x4, 0xC, 0x7, 0x30, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x8, 0xC1, 0x4, 0x73, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x80, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x4, 0xBC, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x54, 0xFE, 0x76, 0x4, 0xC, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x4, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x83, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE1, 0x4, 0xBC, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x54, 0xFE, 0x79, 0x4, 0xC, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE1, 0x4, 0x81, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x4A, 0x4, 0x4D, 0x7, 0x25, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x27, 0x0, 0x7A, 0x1, 0x93, 0x0, 0xA, 0x0, 0x7, 0x1, 0x89, 0x0, 0xBB, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x54, 0xFE, 0x40, 0x4, 0xC, 0x5, 0xE7, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x27, 0x0, 0x7A, 0x1, 0x58, 0x0, 0x0, 0x0, 0x6, 0x1, 0x89, 0x73, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0x31, 0x7, 0x1F, 0x0, 0x26, 0x0, 0x2B, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x6E, 0x1, 0x4A, 0xFF, 0xFF, 0x0, 0x2D, 0x0, 0x0, 0x2, 0xD7, 0x7, 0x91, 0x0, 0x26, 0x0, 0x4B, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x0, 0xDB, 0x1, 0xBC, 0xFF, 0xFF, 0x0, 0x6A, 0xFF, 0xEC, 0x4, 0xF0, 0x6, 0xF8, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xBA, 0x1, 0x4E, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0x56, 0x4, 0xD, 0x5, 0xAD, 0x0, 0x26, 0x0, 0x4C, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x3C, 0x3, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x7, 0x1B, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0xC8, 0x1, 0x46, 0xFF, 0xFF, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x7, 0x3B, 0x0, 0x26, 0x0, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x0, 0xFD, 0x1, 0x66, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x9D, 0x5, 0x19, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0x27, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0x9D, 0x3, 0xF9, 0x6, 0x0, 0x0, 0x26, 0x0, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xA3, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x7, 0xB, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0xE, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x7, 0x2B, 0x0, 0x26, 0x0, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0x43, 0x1, 0x5E, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x95, 0x5, 0x19, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDF, 0x5, 0x17, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0x95, 0x3, 0xF9, 0x6, 0x0, 0x0, 0x26, 0x0, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDF, 0x4, 0x93, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x7, 0x37, 0x0, 0x26, 0x0, 0x30, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x6D, 0x1, 0x37, 0xFF, 0xFF, 0x0, 0x7D, 0x0, 0x0, 0x4, 0x37, 0x7, 0x3D, 0x0, 0x26, 0x0, 0x50, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x6B, 0x1, 0x3D, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0xDF, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x30, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xEA, 0x0, 0x4C, 0xFF, 0xFF, 0x0, 0x7D, 0xFE, 0xC9, 0x4, 0x37, 0x6, 0x0, 0x0, 0x26, 0x0, 0x50, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x7A, 0x0, 0x36, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xD, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x30, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0xDA, 0x0, 0x4C, 0xFF, 0xFF, 0x0, 0x7D, 0xFE, 0xF7, 0x4, 0x37, 0x6, 0x0, 0x0, 0x26, 0x0, 0x50, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0x6A, 0x0, 0x36, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x9D, 0x4, 0x27, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xBB, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x79, 0xFE, 0x9D, 0x1, 0x8D, 0x6, 0x0, 0x0, 0x26, 0x0, 0x51, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x5E, 0x0, 0xA, 0xFF, 0xFF, 0xFF, 0xC1, 0xFE, 0x9D, 0x4, 0x27, 0x6, 0xE3, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x27, 0x1, 0xD4, 0x4, 0xBB, 0x0, 0xA, 0x0, 0x7, 0x0, 0x71, 0xFF, 0x25, 0x1, 0x39, 0xFF, 0xFF, 0xFF, 0xB3, 0xFE, 0x9D, 0x2, 0x61, 0x7, 0x3E, 0x0, 0x26, 0x0, 0x51, 0x0, 0x0, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x5E, 0x0, 0xA, 0x0, 0x7, 0x0, 0x71, 0xFF, 0x17, 0x1, 0x94, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0xCB, 0x4, 0x27, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0xAB, 0x0, 0xA, 0xFF, 0xFF, 0xFF, 0xB0, 0xFE, 0xCB, 0x2, 0x5E, 0x6, 0x0, 0x0, 0x26, 0x0, 0x51, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x3, 0x4E, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x80, 0x4, 0x27, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x31, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x4, 0xAB, 0x0, 0xA, 0xFF, 0xFF, 0xFF, 0xAF, 0xFE, 0x80, 0x2, 0x5E, 0x6, 0x0, 0x0, 0x26, 0x0, 0x51, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x3, 0x4E, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x6, 0x6B, 0x7, 0x13, 0x0, 0x26, 0x0, 0x32, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x2, 0x76, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x7D, 0x0, 0x0, 0x6, 0x7A, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x52, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x2, 0x87, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x9D, 0x6, 0x6B, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x32, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0xD7, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x7D, 0xFE, 0x9D, 0x6, 0x7A, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x52, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0xDB, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x18, 0x7, 0x13, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0xD1, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x7A, 0x0, 0x0, 0x3, 0xF9, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x39, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x9A, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0x29, 0x0, 0x7, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0x9D, 0x3, 0xF9, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x8F, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0xC8, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x5, 0x19, 0x0, 0x7, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0xCB, 0x3, 0xF9, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0x7F, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x7D, 0x5, 0x18, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x5, 0x19, 0x0, 0x7, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0x80, 0x3, 0xF9, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x53, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x4, 0x7F, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0xDF, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB9, 0x5, 0x6, 0x1, 0x53, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x7, 0x55, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x8, 0xC4, 0x4, 0x82, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x8, 0xE, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xC7, 0x5, 0xC, 0x1, 0x4D, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x7, 0x22, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x8, 0xBA, 0x4, 0x88, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0xB6, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xBA, 0x5, 0xC, 0x1, 0x57, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x7, 0x30, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x8, 0xBE, 0x4, 0x88, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0x1F, 0x7, 0xB6, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x7, 0xBB, 0x5, 0xC, 0x1, 0x57, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x7, 0x30, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x8, 0xC1, 0x4, 0x88, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xD4, 0x7, 0x42, 0x0, 0x26, 0x0, 0x35, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x72, 0x1, 0x42, 0xFF, 0xFF, 0x0, 0x7D, 0xFE, 0x60, 0x4, 0x31, 0x5, 0xF6, 0x0, 0x26, 0x0, 0x55, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x9C, 0xFF, 0xF6, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xD4, 0x7, 0x1F, 0x0, 0x26, 0x0, 0x35, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x59, 0x1, 0x4A, 0xFF, 0xFF, 0x0, 0x7D, 0xFE, 0x60, 0x4, 0x31, 0x5, 0xD3, 0x0, 0x26, 0x0, 0x55, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x83, 0xFF, 0xFE, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x4, 0xDE, 0x7, 0x13, 0x0, 0x26, 0x0, 0x37, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x57, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x7D, 0x0, 0x0, 0x2, 0xB5, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x57, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x0, 0x94, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x9D, 0x4, 0xDE, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x37, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xBC, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x73, 0xFE, 0x9D, 0x2, 0xB5, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x57, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x58, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x9D, 0x4, 0xDE, 0x6, 0xE3, 0x0, 0x26, 0x0, 0x37, 0x0, 0x0, 0x0, 0x27, 0x1, 0xD4, 0x4, 0xBC, 0x0, 0xA, 0x0, 0x7, 0x0, 0x71, 0x0, 0x6D, 0x1, 0x39, 0xFF, 0xFF, 0x0, 0x46, 0xFE, 0x9D, 0x2, 0xF4, 0x5, 0xAD, 0x0, 0x26, 0x0, 0x57, 0x0, 0x0, 0x0, 0x27, 0x1, 0xD4, 0x3, 0x58, 0x0, 0xA, 0x0, 0x6, 0x0, 0x71, 0xAA, 0x3, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0xCB, 0x4, 0xDE, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x37, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0xAC, 0x0, 0xA, 0xFF, 0xFF, 0xFF, 0xAA, 0xFE, 0xCB, 0x2, 0xB5, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x57, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x3, 0x48, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0x8A, 0x7, 0x13, 0x0, 0x26, 0x0, 0x38, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x75, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x4C, 0xFF, 0xEC, 0x3, 0xCA, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x20, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x4A, 0xFE, 0x93, 0x4, 0x8A, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x38, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xD7, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x4C, 0xFE, 0x89, 0x3, 0xCA, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x7D, 0xFF, 0xF6, 0xFF, 0xFF, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0x8A, 0x7, 0xAE, 0x0, 0x26, 0x0, 0x38, 0x0, 0x0, 0x0, 0x7, 0x7, 0xBD, 0x4, 0xB7, 0x1, 0x35, 0xFF, 0xFF, 0x0, 0x4C, 0xFF, 0xEC, 0x3, 0xCA, 0x7, 0x4C, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x7, 0x8, 0xB9, 0x4, 0x62, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x4A, 0xFF, 0xEC, 0x4, 0x8A, 0x8, 0x20, 0x0, 0x26, 0x0, 0x38, 0x0, 0x0, 0x0, 0x7, 0x7, 0xBE, 0x4, 0xC2, 0x1, 0x5F, 0xFF, 0xFF, 0x0, 0x4C, 0xFF, 0xEC, 0x3, 0xCA, 0x7, 0x3B, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x7, 0x8, 0xBC, 0x4, 0x6D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x4A, 0xFE, 0x93, 0x4, 0x8A, 0x7, 0x13, 0x0, 0x26, 0x0, 0x38, 0x0, 0x0, 0x0, 0x27, 0x1, 0xD4, 0x4, 0xD7, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x75, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x4C, 0xFE, 0x89, 0x3, 0xCA, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x58, 0x0, 0x0, 0x0, 0x27, 0x1, 0xD4, 0x4, 0x7D, 0xFF, 0xF6, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x20, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x2D, 0x0, 0x0, 0x4, 0xB0, 0x7, 0x13, 0x0, 0x26, 0x0, 0x39, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x67, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x8, 0xFF, 0xEC, 0x2, 0x73, 0x6, 0x97, 0x0, 0x26, 0x0, 0x59, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x0, 0x41, 0x0, 0xC2, 0xFF, 0xFF, 0x0, 0x2D, 0xFE, 0x97, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x39, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xC5, 0x0, 0x4, 0xFF, 0xFF, 0x0, 0x8, 0xFE, 0x93, 0x2, 0x73, 0x5, 0x41, 0x0, 0x26, 0x0, 0x59, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x16, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x2D, 0xFE, 0xC5, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x39, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0xB5, 0x0, 0x4, 0xFF, 0xFF, 0x0, 0x8, 0xFE, 0xC1, 0x3, 0x16, 0x5, 0x41, 0x0, 0x26, 0x0, 0x59, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0x6, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x2D, 0xFE, 0x7A, 0x4, 0xB0, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x39, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x4, 0xB5, 0x0, 0x4, 0xFF, 0xFF, 0x0, 0x8, 0xFE, 0x76, 0x3, 0x16, 0x5, 0x41, 0x0, 0x26, 0x0, 0x59, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x4, 0x6, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFE, 0x98, 0x4, 0xBE, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD5, 0x5, 0x33, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x77, 0xFE, 0x98, 0x3, 0xF7, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD5, 0x4, 0xCF, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFE, 0x79, 0x4, 0xBE, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE1, 0x4, 0xE3, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x77, 0xFE, 0x79, 0x3, 0xF7, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE1, 0x4, 0x7F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFE, 0x76, 0x4, 0xBE, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x4, 0xE3, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x77, 0xFE, 0x76, 0x3, 0xF7, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x1, 0xDE, 0x4, 0x33, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x7, 0xDF, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xB9, 0x4, 0xDD, 0x1, 0x53, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x7, 0x55, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x8, 0xC4, 0x4, 0x7B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x7E, 0xFF, 0xEC, 0x4, 0xBE, 0x8, 0xE, 0x0, 0x26, 0x0, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x7, 0xBC, 0x4, 0xE3, 0x1, 0x6E, 0xFF, 0xFF, 0x0, 0x77, 0xFF, 0xEC, 0x3, 0xF7, 0x6, 0xFD, 0x0, 0x26, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x7, 0x8, 0xC3, 0x4, 0x81, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x1D, 0x7, 0x37, 0x0, 0x26, 0x0, 0x3B, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0xB0, 0x1, 0x42, 0xFF, 0xFF, 0x0, 0x17, 0x0, 0x0, 0x3, 0xDB, 0x5, 0xEB, 0x0, 0x26, 0x0, 0x5B, 0x0, 0x0, 0x0, 0x6, 0x1, 0x8D, 0x18, 0xF6, 0xFF, 0xFF, 0x0, 0x12, 0xFE, 0x9D, 0x5, 0x1D, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3B, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xF1, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x17, 0xFE, 0x9D, 0x3, 0xDB, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5B, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x59, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x31, 0x0, 0x0, 0x6, 0xE5, 0x7, 0x13, 0x0, 0x26, 0x0, 0x3C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x2, 0x8D, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x5, 0xCD, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x5C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0xF0, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x31, 0xFE, 0x9D, 0x6, 0xE5, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3C, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0xE7, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x22, 0xFE, 0x9D, 0x5, 0xCD, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5C, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x5, 0x50, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x29, 0x0, 0x0, 0x4, 0xEA, 0x7, 0x1F, 0x0, 0x26, 0x0, 0x3D, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x82, 0x1, 0x4A, 0xFF, 0xFF, 0x0, 0x1F, 0x0, 0x0, 0x3, 0xE9, 0x5, 0xD3, 0x0, 0x26, 0x0, 0x5D, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x0, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0x0, 0x29, 0x0, 0x0, 0x4, 0xEA, 0x7, 0xF, 0x0, 0x26, 0x0, 0x3D, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x0, 0xC8, 0x1, 0x42, 0xFF, 0xFF, 0x0, 0x1F, 0x0, 0x0, 0x3, 0xE9, 0x5, 0xC3, 0x0, 0x26, 0x0, 0x5D, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x45, 0xF6, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x7, 0x13, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0x6E, 0x1, 0x3E, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x5, 0xDD, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x0, 0xFD, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x50, 0x0, 0x0, 0x4, 0x8C, 0x7, 0x37, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0x84, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x52, 0x0, 0x0, 0x3, 0xC0, 0x6, 0x1, 0x0, 0x26, 0x0, 0x5F, 0x0, 0x0, 0x0, 0x6, 0x1, 0x77, 0x1C, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x9D, 0x4, 0x8C, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0xC2, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0x9D, 0x3, 0xC0, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x4, 0x65, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0xCB, 0x4, 0x8C, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0xB2, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x52, 0xFE, 0xCB, 0x3, 0xC0, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0x55, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x7A, 0xFE, 0xCB, 0x3, 0xF9, 0x6, 0x0, 0x0, 0x26, 0x0, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE2, 0x4, 0x93, 0x0, 0xA, 0xFF, 0xFF, 0xFF, 0xE5, 0xFF, 0xEC, 0x2, 0xAB, 0x6, 0x87, 0x0, 0x26, 0x0, 0x59, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0xFF, 0x87, 0x0, 0xBA, 0xFF, 0xFF, 0x0, 0x22, 0x0, 0x0, 0x5, 0xCD, 0x6, 0x5E, 0x0, 0x26, 0x0, 0x5C, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8B, 0x1, 0x9F, 0x0, 0x34, 0xFF, 0xFF, 0x0, 0xC, 0xFE, 0x4B, 0x3, 0xD7, 0x6, 0x5E, 0x0, 0x26, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8B, 0x0, 0xAC, 0x0, 0x34, 0xFF, 0xFF, 0x0, 0x5B, 0xFF, 0xEC, 0x4, 0x11, 0x6, 0x6B, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x1, 0x6F, 0x3, 0xB, 0x0, 0x80, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3A, 0x1, 0xB4, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0x1, 0x7A, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3F, 0x0, 0xDB, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x42, 0x0, 0xC2, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x40, 0x1, 0x2F, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0x0, 0xF9, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x7, 0xB, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x41, 0x0, 0xFF, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x7, 0xB, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x44, 0x0, 0xD8, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x6, 0x4, 0x3A, 0xD9, 0xFF, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x6, 0x4, 0x49, 0xD2, 0xFF, 0xFF, 0xFF, 0xFE, 0xAF, 0x0, 0x0, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3F, 0xFE, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE5, 0x0, 0x0, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x4, 0x42, 0xFE, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA, 0x0, 0x0, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x4, 0x40, 0xFE, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF9, 0x0, 0x0, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0xFE, 0x91, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x67, 0x0, 0x0, 0x5, 0x43, 0x6, 0x9E, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x4, 0x41, 0xFE, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0x0, 0x0, 0x5, 0x43, 0x6, 0x9E, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x4, 0x44, 0xFE, 0xE5, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x6, 0x43, 0x0, 0x26, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3A, 0x1, 0x7C, 0x0, 0x6B, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x6, 0x43, 0x0, 0x26, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0x1, 0x42, 0x0, 0x6B, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x6, 0x43, 0x0, 0x26, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3F, 0x0, 0xA3, 0x0, 0x6B, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x6, 0x43, 0x0, 0x26, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x42, 0x0, 0x8A, 0x0, 0x6B, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x6, 0x43, 0x0, 0x26, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x40, 0x0, 0xF7, 0x0, 0x6B, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x6, 0x43, 0x0, 0x26, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0x0, 0xC1, 0x0, 0x6B, 0xFF, 0xFF, 0xFE, 0x96, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xD9, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3A, 0xFE, 0x3B, 0x0, 0x1, 0xFF, 0xFF, 0xFE, 0x9D, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xD9, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0xFE, 0x34, 0x0, 0x1, 0xFF, 0xFF, 0xFD, 0x11, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xD9, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3F, 0xFC, 0xB6, 0x0, 0x1, 0xFF, 0xFF, 0xFD, 0x47, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xD9, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x42, 0xFC, 0xDF, 0x0, 0x1, 0xFF, 0xFF, 0xFD, 0x6C, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xD9, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x40, 0xFD, 0x11, 0x0, 0x1, 0xFF, 0xFF, 0xFD, 0x5B, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xD9, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0xFC, 0xF3, 0x0, 0x1, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3A, 0x1, 0x87, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0x1, 0x4D, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3F, 0x0, 0xAE, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x42, 0x0, 0x95, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x40, 0x1, 0x2, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0x0, 0xCC, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x7, 0xB, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x41, 0x0, 0xD2, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x7, 0xB, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x44, 0x0, 0xAB, 0x0, 0x6C, 0xFF, 0xFF, 0xFE, 0x9F, 0x0, 0x0, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3A, 0xFE, 0x44, 0x0, 0x0, 0xFF, 0xFF, 0xFE, 0xA6, 0x0, 0x0, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0xFE, 0x3D, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0x1A, 0x0, 0x0, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3F, 0xFC, 0xBF, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0x50, 0x0, 0x0, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x42, 0xFC, 0xE8, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0x75, 0x0, 0x0, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x40, 0xFD, 0x1A, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0x64, 0x0, 0x0, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0xFC, 0xFC, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0xD2, 0x0, 0x0, 0x5, 0x19, 0x6, 0x9F, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x41, 0xFD, 0x63, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0xBF, 0x0, 0x0, 0x5, 0x19, 0x6, 0x9F, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x44, 0xFD, 0x50, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xAA, 0xFF, 0xF4, 0x2, 0x62, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x4, 0x3A, 0x73, 0x57, 0xFF, 0xFF, 0x0, 0xA2, 0xFF, 0xF4, 0x2, 0x62, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x4, 0x49, 0x39, 0x57, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xF4, 0x2, 0x63, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x4, 0x3F, 0x9A, 0x57, 0xFF, 0xFF, 0xFF, 0xE9, 0xFF, 0xF4, 0x2, 0x62, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x4, 0x42, 0x81, 0x57, 0xFF, 0xFF, 0x0, 0x49, 0xFF, 0xF4, 0x2, 0xA3, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x4, 0x40, 0xEE, 0x57, 0xFF, 0xFF, 0x0, 0x20, 0xFF, 0xF4, 0x2, 0x8E, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x4, 0x43, 0xB8, 0x57, 0xFF, 0xFF, 0x0, 0x2D, 0xFF, 0xF4, 0x2, 0x66, 0x6, 0xF6, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x4, 0x41, 0xBE, 0x57, 0xFF, 0xFF, 0x0, 0x6, 0xFF, 0xF4, 0x2, 0x62, 0x6, 0xF6, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x4, 0x44, 0x97, 0x57, 0xFF, 0xFF, 0xFE, 0xA1, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xDA, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3A, 0xFE, 0x46, 0x0, 0x2, 0xFF, 0xFF, 0xFE, 0xA8, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xDA, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0xFE, 0x3F, 0x0, 0x2, 0xFF, 0xFF, 0xFD, 0x1C, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xDA, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3F, 0xFC, 0xC1, 0x0, 0x2, 0xFF, 0xFF, 0xFD, 0x52, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xDA, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x42, 0xFC, 0xEA, 0x0, 0x2, 0xFF, 0xFF, 0xFD, 0x77, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xDA, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x40, 0xFD, 0x1C, 0x0, 0x2, 0xFF, 0xFF, 0xFD, 0x66, 0x0, 0x0, 0x1, 0xA0, 0x5, 0xDA, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0xFC, 0xFE, 0x0, 0x2, 0xFF, 0xFF, 0xFD, 0xD4, 0x0, 0x0, 0x1, 0xA0, 0x6, 0xA1, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x41, 0xFD, 0x65, 0x0, 0x2, 0xFF, 0xFF, 0xFD, 0xC1, 0x0, 0x0, 0x1, 0xA0, 0x6, 0xA1, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x44, 0xFD, 0x52, 0x0, 0x2, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x44, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3A, 0x1, 0x85, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x44, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0x1, 0x4B, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x44, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3F, 0x0, 0xAC, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x44, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x4, 0x42, 0x0, 0x93, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x44, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x4, 0x40, 0x1, 0x0, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x44, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0x0, 0xCA, 0x0, 0x6C, 0xFF, 0xFF, 0xFF, 0x6B, 0xFF, 0xEC, 0x5, 0x33, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x34, 0x14, 0x0, 0x0, 0x7, 0x4, 0x3A, 0xFF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xFF, 0xEC, 0x5, 0x33, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x34, 0x14, 0x0, 0x0, 0x7, 0x4, 0x49, 0xFF, 0x9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x18, 0xFF, 0xEC, 0x5, 0x65, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x34, 0x46, 0x0, 0x0, 0x7, 0x4, 0x3F, 0xFD, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x4E, 0xFF, 0xEC, 0x5, 0x65, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x34, 0x46, 0x0, 0x0, 0x7, 0x4, 0x42, 0xFD, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0xFF, 0xEC, 0x5, 0x65, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x34, 0x46, 0x0, 0x0, 0x7, 0x4, 0x40, 0xFE, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x62, 0xFF, 0xEC, 0x5, 0x65, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x34, 0x46, 0x0, 0x0, 0x7, 0x4, 0x43, 0xFD, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0x36, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3A, 0x1, 0x70, 0x0, 0x5E, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0x36, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0x1, 0x36, 0x0, 0x5E, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0x36, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3F, 0x0, 0x97, 0x0, 0x5E, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0x36, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x4, 0x42, 0x7E, 0x5E, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0x36, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x40, 0x0, 0xEB, 0x0, 0x5E, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0x36, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0x0, 0xB5, 0x0, 0x5E, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0xFD, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x41, 0x0, 0xBB, 0x0, 0x5E, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0xFD, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x44, 0x0, 0x94, 0x0, 0x5E, 0xFF, 0xFF, 0xFE, 0x97, 0x0, 0x0, 0x4, 0xD6, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0xFE, 0x2E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x41, 0x0, 0x0, 0x4, 0xD6, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x42, 0xFC, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x55, 0x0, 0x0, 0x4, 0xD6, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0xFC, 0xED, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xB0, 0x0, 0x0, 0x4, 0xD6, 0x6, 0x9E, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x44, 0xFD, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3A, 0x2, 0x8F, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0x2, 0x55, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3F, 0x1, 0xB6, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x42, 0x1, 0x9D, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x40, 0x2, 0xA, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x43, 0x1, 0xD4, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0xFB, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x41, 0x1, 0xDA, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0xFB, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x44, 0x1, 0xB3, 0x0, 0x5C, 0xFF, 0xFF, 0xFF, 0x75, 0x0, 0x0, 0x4, 0xF1, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x14, 0x0, 0x0, 0x7, 0x4, 0x3A, 0xFF, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x0, 0x0, 0x4, 0xF1, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x14, 0x0, 0x0, 0x7, 0x4, 0x49, 0xFF, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x22, 0x0, 0x0, 0x5, 0x23, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x7, 0x4, 0x3F, 0xFD, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x58, 0x0, 0x0, 0x5, 0x23, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x7, 0x4, 0x42, 0xFD, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7D, 0x0, 0x0, 0x5, 0x23, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x7, 0x4, 0x40, 0xFE, 0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x6C, 0x0, 0x0, 0x5, 0x23, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x7, 0x4, 0x43, 0xFE, 0x4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDA, 0x0, 0x0, 0x5, 0x23, 0x6, 0x9E, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x7, 0x4, 0x41, 0xFE, 0x6B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xC7, 0x0, 0x0, 0x5, 0x23, 0x6, 0x9E, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x7, 0x4, 0x44, 0xFE, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0x1, 0x15, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0x1, 0xD7, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x6, 0x2E, 0x0, 0x26, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0x0, 0xDD, 0x0, 0x6B, 0xFF, 0xFF, 0x0, 0x61, 0xFF, 0xEC, 0x4, 0xD, 0x6, 0x2E, 0x0, 0x26, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0x1, 0x9F, 0x0, 0x6B, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0x0, 0xE8, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0x1, 0xAA, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x3A, 0xFF, 0xF4, 0x2, 0x62, 0x6, 0x1A, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x4, 0x47, 0xD4, 0x57, 0xFF, 0xFF, 0x0, 0xAA, 0xFF, 0xF4, 0x2, 0x62, 0x6, 0x1A, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0x0, 0x96, 0x0, 0x57, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x2F, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0x0, 0xE6, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xEC, 0x4, 0x3E, 0x6, 0x2F, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0x1, 0xA8, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0x21, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0x0, 0xD1, 0x0, 0x5E, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0x21, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0x1, 0x93, 0x0, 0x5E, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0x1F, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0x1, 0xF0, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0x1F, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0x2, 0xB2, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x3A, 0x1, 0xB4, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x49, 0x1, 0x7A, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x3F, 0x0, 0xDB, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x42, 0x0, 0xC2, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x40, 0x1, 0x2F, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x6, 0x44, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x43, 0x0, 0xF9, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x7, 0xB, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x41, 0x0, 0xFF, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x7, 0xB, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x44, 0x0, 0xD8, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x12, 0xFD, 0xF5, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0xF3, 0x0, 0x3, 0x0, 0x6, 0x4, 0x3A, 0xD9, 0xFF, 0xFF, 0xFF, 0x0, 0x12, 0xFD, 0xF5, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0xF3, 0x0, 0x3, 0x0, 0x6, 0x4, 0x49, 0xD2, 0xFF, 0xFF, 0xFF, 0xFE, 0xAF, 0xFD, 0xF5, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0xF3, 0x0, 0x3, 0x0, 0x7, 0x4, 0x3F, 0xFE, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE5, 0xFD, 0xF5, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0xF3, 0x0, 0x3, 0x0, 0x7, 0x4, 0x42, 0xFE, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA, 0xFD, 0xF5, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0xF3, 0x0, 0x3, 0x0, 0x7, 0x4, 0x40, 0xFE, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF9, 0xFD, 0xF5, 0x5, 0x43, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0xF3, 0x0, 0x3, 0x0, 0x7, 0x4, 0x43, 0xFE, 0x91, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x67, 0xFD, 0xF5, 0x5, 0x43, 0x6, 0x9E, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0xF3, 0x0, 0x3, 0x0, 0x7, 0x4, 0x41, 0xFE, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x54, 0xFD, 0xF5, 0x5, 0x43, 0x6, 0x9E, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0xF3, 0x0, 0x3, 0x0, 0x7, 0x4, 0x44, 0xFE, 0xE5, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x3A, 0x1, 0x87, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x49, 0x1, 0x4D, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x3F, 0x0, 0xAE, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x42, 0x0, 0x95, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x40, 0x1, 0x2, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x6, 0x44, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x43, 0x0, 0xCC, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x7, 0xB, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x41, 0x0, 0xD2, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x7, 0xB, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x44, 0x0, 0xAB, 0x0, 0x6C, 0xFF, 0xFF, 0xFE, 0x9F, 0xFD, 0xFC, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0xB, 0x0, 0xA, 0x0, 0x7, 0x4, 0x3A, 0xFE, 0x44, 0x0, 0x0, 0xFF, 0xFF, 0xFE, 0xA6, 0xFD, 0xFC, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0xB, 0x0, 0xA, 0x0, 0x7, 0x4, 0x49, 0xFE, 0x3D, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0x1A, 0xFD, 0xFC, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0xB, 0x0, 0xA, 0x0, 0x7, 0x4, 0x3F, 0xFC, 0xBF, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0x50, 0xFD, 0xFC, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0xB, 0x0, 0xA, 0x0, 0x7, 0x4, 0x42, 0xFC, 0xE8, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0x75, 0xFD, 0xFC, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0xB, 0x0, 0xA, 0x0, 0x7, 0x4, 0x40, 0xFD, 0x1A, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0x64, 0xFD, 0xFC, 0x5, 0x19, 0x5, 0xD8, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0xB, 0x0, 0xA, 0x0, 0x7, 0x4, 0x43, 0xFC, 0xFC, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0xD2, 0xFD, 0xFC, 0x5, 0x19, 0x6, 0x9F, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0xB, 0x0, 0xA, 0x0, 0x7, 0x4, 0x41, 0xFD, 0x63, 0x0, 0x0, 0xFF, 0xFF, 0xFD, 0xBF, 0xFD, 0xFC, 0x5, 0x19, 0x6, 0x9F, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0xB, 0x0, 0xA, 0x0, 0x7, 0x4, 0x44, 0xFD, 0x50, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x3A, 0x2, 0x8F, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x49, 0x2, 0x55, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x3F, 0x1, 0xB6, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x42, 0x1, 0x9D, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x40, 0x2, 0xA, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0x34, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x43, 0x1, 0xD4, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0xFB, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x41, 0x1, 0xDA, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0xFB, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x44, 0x1, 0xB3, 0x0, 0x5C, 0xFF, 0xFF, 0xFF, 0x75, 0xFD, 0xFC, 0x4, 0xF1, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x14, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0xF9, 0x0, 0xA, 0x0, 0x7, 0x4, 0x3A, 0xFF, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0xFD, 0xFC, 0x4, 0xF1, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x14, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0xF9, 0x0, 0xA, 0x0, 0x7, 0x4, 0x49, 0xFF, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x22, 0xFD, 0xFC, 0x5, 0x23, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x2B, 0x0, 0xA, 0x0, 0x7, 0x4, 0x3F, 0xFD, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x58, 0xFD, 0xFC, 0x5, 0x23, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x2B, 0x0, 0xA, 0x0, 0x7, 0x4, 0x42, 0xFD, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7D, 0xFD, 0xFC, 0x5, 0x23, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x2B, 0x0, 0xA, 0x0, 0x7, 0x4, 0x40, 0xFE, 0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x6C, 0xFD, 0xFC, 0x5, 0x23, 0x5, 0xD7, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x2B, 0x0, 0xA, 0x0, 0x7, 0x4, 0x43, 0xFE, 0x4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDA, 0xFD, 0xFC, 0x5, 0x23, 0x6, 0x9E, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x2B, 0x0, 0xA, 0x0, 0x7, 0x4, 0x41, 0xFE, 0x6B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xC7, 0xFD, 0xFC, 0x5, 0x23, 0x6, 0x9E, 0x0, 0x26, 0x2, 0x39, 0x46, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x2B, 0x0, 0xA, 0x0, 0x7, 0x4, 0x44, 0xFE, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x5, 0xE7, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xB7, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x5, 0xAD, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0x80, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x47, 0x1, 0x15, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x4, 0x4E, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x48, 0x1, 0xD7, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFF, 0xEB, 0x4, 0x7A, 0x6, 0x61, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3D, 0x0, 0xE3, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x56, 0xFD, 0xE8, 0x4, 0x7A, 0x6, 0x61, 0x0, 0x26, 0x2, 0x3A, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x1, 0x4E, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x3D, 0x0, 0xE3, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x7, 0x1D, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xF5, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x6, 0xE3, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xBE, 0x1, 0x39, 0xFF, 0xFF, 0xFF, 0xD7, 0x0, 0x0, 0x5, 0x43, 0x5, 0xC2, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0xFF, 0x71, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x12, 0x0, 0x0, 0x5, 0x43, 0x5, 0xC2, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x6, 0x4, 0x48, 0xBC, 0xFF, 0xFF, 0xFF, 0x0, 0x12, 0xFD, 0xF5, 0x5, 0x43, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3B, 0x1, 0xF3, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x47, 0x0, 0xE8, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x4, 0x4E, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x6, 0x4, 0x3B, 0x34, 0xA, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x6, 0x2F, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x48, 0x1, 0xAA, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFE, 0x61, 0x4, 0x6, 0x6, 0x61, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3D, 0x0, 0xB6, 0x0, 0x6C, 0xFF, 0xFF, 0x0, 0x7F, 0xFD, 0xFC, 0x4, 0x6, 0x6, 0x61, 0x0, 0x26, 0x2, 0x40, 0x0, 0x0, 0x0, 0x26, 0x4, 0x3B, 0x34, 0xA, 0x0, 0x7, 0x4, 0x3D, 0x0, 0xB6, 0x0, 0x6C, 0xFF, 0xFF, 0xFE, 0x39, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0xFD, 0xD3, 0x0, 0x1, 0xFF, 0xFF, 0xFE, 0x82, 0x0, 0x0, 0x4, 0x4D, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0xFE, 0x1E, 0x0, 0x1, 0xFF, 0xFF, 0xFE, 0x42, 0x0, 0x0, 0x5, 0x19, 0x5, 0xC3, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0xFD, 0xDC, 0x0, 0x0, 0xFF, 0xFF, 0xFE, 0x8B, 0x0, 0x0, 0x5, 0x19, 0x5, 0xC3, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0xFE, 0x27, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x95, 0xFD, 0xFC, 0x5, 0x19, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3B, 0x2, 0xB, 0x0, 0xA, 0xFF, 0xFF, 0xFF, 0xEC, 0xFF, 0xF4, 0x2, 0x71, 0x5, 0xD2, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0xFF, 0x76, 0xFF, 0xEB, 0xFF, 0xFF, 0xFF, 0xDB, 0xFF, 0xF4, 0x2, 0x89, 0x5, 0x98, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0xFF, 0x3F, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF, 0xC2, 0xFF, 0xF4, 0x2, 0x9B, 0x6, 0xBC, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x7, 0x4, 0x45, 0xFF, 0x53, 0x0, 0x57, 0xFF, 0xFF, 0xFF, 0xD0, 0xFF, 0xF4, 0x2, 0xA9, 0x6, 0xBC, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x7, 0x4, 0x46, 0xFF, 0x61, 0x0, 0x57, 0xFF, 0xFF, 0xFF, 0xED, 0xFF, 0xF4, 0x2, 0xCB, 0x6, 0x4C, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x6, 0x4, 0x3D, 0xA2, 0x57, 0xFF, 0xFF, 0xFF, 0xC6, 0xFF, 0xF4, 0x2, 0x9F, 0x7, 0x1E, 0x0, 0x26, 0x2, 0x42, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3E, 0xFF, 0x57, 0x0, 0x57, 0xFF, 0xFF, 0xFF, 0xDF, 0x0, 0x0, 0x2, 0x64, 0x7, 0x25, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0xFF, 0x69, 0x1, 0x3E, 0xFF, 0xFF, 0xFF, 0xCE, 0x0, 0x0, 0x2, 0x7C, 0x6, 0xEB, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0xFF, 0x32, 0x1, 0x41, 0xFF, 0xFF, 0x0, 0x2D, 0x0, 0x0, 0x1, 0xA0, 0x7, 0x6D, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0xFF, 0xC7, 0x1, 0xAA, 0xFF, 0xFF, 0x0, 0xA4, 0x0, 0x0, 0x2, 0x30, 0x7, 0x6D, 0x0, 0x26, 0x0, 0x2E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0x0, 0x89, 0x1, 0xAA, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x5, 0xD9, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x1, 0x89, 0x73, 0xF2, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x5, 0x9F, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x3C, 0xF5, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0xC3, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x4, 0x45, 0x50, 0x5E, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0xC3, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x4, 0x46, 0x5E, 0x5E, 0xFF, 0xFF, 0x0, 0x81, 0xFE, 0x60, 0x4, 0x32, 0x6, 0x3A, 0x0, 0x26, 0x2, 0x46, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3A, 0x1, 0x9C, 0x0, 0x62, 0xFF, 0xFF, 0x0, 0x81, 0xFE, 0x60, 0x4, 0x32, 0x6, 0x3A, 0x0, 0x26, 0x2, 0x46, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0x1, 0x62, 0x0, 0x62, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x6, 0x53, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3D, 0x0, 0x9F, 0x0, 0x5E, 0xFF, 0xFF, 0x0, 0x80, 0xFF, 0xEB, 0x4, 0x8, 0x7, 0x25, 0x0, 0x26, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x6, 0x4, 0x3E, 0x54, 0x5E, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x7, 0x1D, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xBB, 0x1, 0x36, 0xFF, 0xFF, 0x0, 0x8, 0x0, 0x0, 0x4, 0xD6, 0x6, 0xE3, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0x84, 0x1, 0x39, 0xFF, 0xFF, 0xFE, 0x33, 0x0, 0x0, 0x4, 0xD6, 0x5, 0xC2, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x47, 0xFD, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7C, 0x0, 0x0, 0x4, 0xD6, 0x5, 0xC2, 0x0, 0x26, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x7, 0x4, 0x48, 0xFE, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xD8, 0x0, 0x0, 0x4, 0xD4, 0x5, 0xD7, 0x0, 0x26, 0x0, 0x35, 0x0, 0x0, 0x0, 0x7, 0x4, 0x49, 0xFE, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0x1F, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x47, 0x1, 0xF0, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x4, 0x3A, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0x1F, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x48, 0x2, 0xB2, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEB, 0x6, 0x2E, 0x6, 0x51, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3D, 0x1, 0xBE, 0x0, 0x5C, 0xFF, 0xFF, 0x0, 0x66, 0xFD, 0xE8, 0x6, 0x2E, 0x6, 0x51, 0x0, 0x26, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x27, 0x4, 0x3B, 0x2, 0x86, 0xFF, 0xF6, 0x0, 0x7, 0x4, 0x3D, 0x1, 0xBE, 0x0, 0x5C, 0xFF, 0xFF, 0xFF, 0xE, 0xFF, 0xEC, 0x5, 0x33, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x34, 0x14, 0x0, 0x0, 0x7, 0x4, 0x47, 0xFE, 0xA8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x57, 0xFF, 0xEC, 0x5, 0x33, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x34, 0x14, 0x0, 0x0, 0x7, 0x4, 0x48, 0xFE, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, 0x0, 0x0, 0x4, 0xF1, 0x5, 0xC4, 0x0, 0x26, 0x2, 0x39, 0x14, 0x0, 0x0, 0x7, 0x4, 0x47, 0xFE, 0xB2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x0, 0x0, 0x4, 0xF1, 0x5, 0xC4, 0x0, 0x26, 0x2, 0x39, 0x14, 0x0, 0x0, 0x7, 0x4, 0x48, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x6B, 0xFD, 0xFC, 0x4, 0xDD, 0x5, 0xC4, 0x0, 0x26, 0x2, 0x39, 0x0, 0x0, 0x0, 0x7, 0x4, 0x3B, 0x1, 0xE5, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x3C, 0xFF, 0xF4, 0x7, 0x7D, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x24, 0x0, 0x0, 0x0, 0x7, 0x0, 0x24, 0x3, 0xE5, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x3C, 0xFF, 0xF2, 0x5, 0x88, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x24, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6, 0x3, 0xE5, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x90, 0xFF, 0xF2, 0x5, 0xBD, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x6, 0x0, 0x0, 0x0, 0x7, 0x0, 0x24, 0x2, 0x25, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x88, 0x2, 0x7, 0x2, 0x45, 0x3, 0xDB, 0x0, 0x6, 0x4, 0x6C, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x5, 0x1D, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFF, 0x75, 0xFE, 0xDC, 0xFF, 0xFF, 0xFF, 0x66, 0x0, 0x0, 0x3, 0xF2, 0x5, 0x20, 0x0, 0x26, 0x7, 0xA6, 0x3C, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0x9F, 0xFE, 0xDF, 0xFF, 0xFF, 0xFF, 0x73, 0x0, 0x0, 0x4, 0xA4, 0x5, 0x1B, 0x0, 0x26, 0x7, 0x60, 0x3C, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0xAC, 0xFE, 0xDA, 0xFF, 0xFF, 0xFF, 0x75, 0x0, 0x0, 0x1, 0xB4, 0x5, 0x20, 0x0, 0x26, 0x7, 0x5F, 0x3C, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0xAE, 0xFE, 0xDF, 0xFF, 0xFF, 0xFF, 0x9E, 0xFF, 0xF0, 0x4, 0x79, 0x5, 0x1D, 0x0, 0x26, 0x7, 0x59, 0xA, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0xD7, 0xFE, 0xDC, 0xFF, 0xFF, 0xFF, 0x24, 0x0, 0x0, 0x4, 0x73, 0x5, 0x1D, 0x0, 0x26, 0x7, 0x4F, 0x3C, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0x5D, 0xFE, 0xDC, 0xFF, 0xFF, 0xFF, 0xAE, 0x0, 0x0, 0x4, 0x8E, 0x5, 0x1D, 0x0, 0x26, 0x7, 0x6F, 0xA, 0x0, 0x0, 0x7, 0x2, 0x2D, 0xFE, 0xE7, 0xFE, 0xDC, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x4, 0x8D, 0x0, 0x6, 0x7, 0xB1, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0xA, 0x4, 0x8D, 0x0, 0x6, 0x7, 0xB0, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x4, 0x8D, 0x0, 0x6, 0x7, 0xA6, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x41, 0x0, 0x0, 0x3, 0xF3, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x4E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x68, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x60, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x85, 0x0, 0x0, 0x1, 0x78, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x5F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x69, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x5D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x5, 0x90, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x5B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x67, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x5A, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x4, 0x9D, 0x0, 0x6, 0x7, 0x59, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x2C, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x58, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x25, 0x0, 0x0, 0x4, 0x16, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x54, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x5, 0x0, 0x0, 0x4, 0x37, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x4F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x16, 0x0, 0x0, 0x4, 0x4A, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x50, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x9E, 0x0, 0x0, 0x2, 0x64, 0x5, 0xEB, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0xFF, 0x40, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x5, 0x0, 0x0, 0x4, 0x37, 0x5, 0xEB, 0x0, 0x26, 0x7, 0x4F, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x5A, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x5, 0xEB, 0x0, 0x26, 0x7, 0xA6, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6B, 0x62, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0x97, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x66, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x23, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x3F, 0xFF, 0xF0, 0x3, 0xEF, 0x4, 0x9D, 0x0, 0x6, 0x7, 0x55, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x85, 0x0, 0x0, 0x1, 0x78, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x5F, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x9E, 0x0, 0x0, 0x2, 0x64, 0x5, 0xEB, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0xFF, 0x40, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x25, 0xFF, 0xF0, 0x3, 0x65, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x5E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x69, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x5D, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x16, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x20, 0xFF, 0xEC, 0x4, 0x3A, 0x6, 0x5, 0x0, 0x26, 0x7, 0x7D, 0x0, 0x0, 0x0, 0x6, 0x1, 0x89, 0x79, 0x1E, 0xFF, 0xFF, 0x0, 0x9, 0x0, 0x0, 0x4, 0x94, 0x4, 0x8D, 0x0, 0x6, 0x7, 0xB1, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0xA, 0x4, 0x8D, 0x0, 0x6, 0x7, 0xB0, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0x97, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x66, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x3, 0xB6, 0x4, 0x8D, 0x0, 0x6, 0x7, 0xA6, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x6E, 0x6, 0x5, 0x0, 0x26, 0x7, 0x7A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x0, 0xB9, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x5, 0x90, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x5B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x68, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x60, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x6F, 0x4, 0x9D, 0x0, 0x6, 0x7, 0x59, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x62, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x6B, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x2C, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x58, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xF0, 0x4, 0x44, 0x4, 0x9D, 0x0, 0x6, 0x7, 0xAF, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x25, 0x0, 0x0, 0x4, 0x16, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x54, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x16, 0x0, 0x0, 0x4, 0x4A, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x50, 0x0, 0x0, 0x0, 0x1, 0x0, 0x43, 0xFE, 0x37, 0x3, 0xE8, 0x4, 0x9D, 0x0, 0x29, 0x0, 0x0, 0x1, 0x23, 0x11, 0x26, 0x26, 0x35, 0x33, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x6, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x6, 0x7, 0x16, 0x16, 0x15, 0x14, 0x6, 0x7, 0x2, 0x81, 0xF3, 0x81, 0xCA, 0xF3, 0x5, 0x7A, 0x56, 0x77, 0x73, 0xE0, 0x94, 0x9D, 0xC5, 0x65, 0x76, 0x4F, 0x72, 0xF3, 0xFB, 0xBA, 0xCD, 0xFF, 0x6E, 0x5C, 0x6F, 0x6E, 0xC9, 0x9E, 0xFE, 0x37, 0x1, 0xC3, 0x16, 0x9B, 0x9C, 0x50, 0x43, 0x57, 0x47, 0xA7, 0x3, 0xB0, 0x5, 0x93, 0x3E, 0x56, 0x3E, 0x43, 0x9B, 0xAB, 0x9F, 0x9E, 0x59, 0x8C, 0x26, 0x25, 0x90, 0x5C, 0x90, 0xA6, 0x16, 0x0, 0x1, 0x0, 0x76, 0xFE, 0x99, 0x5, 0x2D, 0x4, 0x8D, 0x0, 0xF, 0x0, 0x0, 0x1, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x5, 0x2D, 0xF3, 0xC4, 0xFD, 0xF3, 0xF3, 0xF3, 0x2, 0xD, 0xF2, 0xC5, 0xFE, 0x99, 0x1, 0x67, 0x1, 0xDB, 0xFE, 0x25, 0x4, 0x8D, 0xFE, 0x12, 0x1, 0xEE, 0xFC, 0x28, 0x0, 0x1, 0x0, 0x50, 0xFE, 0x40, 0x4, 0x44, 0x4, 0x9D, 0x0, 0x1D, 0x0, 0x0, 0x1, 0x6, 0x6, 0x7, 0x11, 0x23, 0x11, 0x26, 0x2, 0x35, 0x35, 0x10, 0x0, 0x33, 0x32, 0x16, 0x17, 0x23, 0x26, 0x26, 0x23, 0x20, 0x3, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x4, 0x43, 0xD, 0xC0, 0xAF, 0xF3, 0xB6, 0xCE, 0x1, 0x19, 0xEC, 0xE8, 0xF4, 0x13, 0xF3, 0xA, 0x6F, 0x83, 0xFE, 0xF4, 0x7, 0x7F, 0x8F, 0x80, 0x75, 0xB, 0x1, 0x85, 0x99, 0xD6, 0x1D, 0xFE, 0x47, 0x1, 0xBC, 0x25, 0x1, 0x20, 0xDF, 0x4C, 0x1, 0x3, 0x1, 0x2E, 0xE9, 0xB3, 0x61, 0x78, 0xFE, 0xA5, 0x5F, 0xAE, 0xBF, 0x6A, 0x68, 0xFF, 0xFF, 0x0, 0x5, 0x0, 0x0, 0x4, 0x37, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x4F, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0xB, 0xFE, 0x37, 0x5, 0xA8, 0x4, 0xA4, 0x0, 0x26, 0x7, 0x93, 0x0, 0x0, 0x0, 0x7, 0x7, 0xDB, 0x2, 0xE5, 0xFF, 0x9E, 0xFF, 0xFF, 0x0, 0x76, 0x0, 0x0, 0x4, 0x6E, 0x5, 0xCB, 0x0, 0x26, 0x7, 0x7A, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0x82, 0x0, 0x21, 0xFF, 0xFF, 0x0, 0x20, 0xFF, 0xEC, 0x4, 0x3A, 0x5, 0xCB, 0x0, 0x26, 0x7, 0x7D, 0x0, 0x0, 0x0, 0x6, 0x0, 0x71, 0x42, 0x21, 0xFF, 0xFF, 0x0, 0x51, 0x0, 0x0, 0x5, 0x4D, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x6D, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x25, 0xFF, 0xF0, 0x3, 0x65, 0x4, 0x8D, 0x0, 0x6, 0x7, 0x5E, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x85, 0xFF, 0xF0, 0x5, 0x62, 0x4, 0x8D, 0x0, 0x26, 0x7, 0x5F, 0x0, 0x0, 0x0, 0x7, 0x7, 0x5E, 0x1, 0xFD, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0xF0, 0x0, 0x0, 0x6, 0x4, 0x6, 0x0, 0x0, 0x26, 0x8, 0xB4, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x2, 0x82, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFF, 0xC8, 0x4, 0x6F, 0x6, 0x1E, 0x0, 0x26, 0x8, 0xB6, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0x73, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x3F, 0xFD, 0xF7, 0x3, 0xEF, 0x4, 0x9D, 0x0, 0x26, 0x7, 0x55, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0x3C, 0xFE, 0x91, 0xFF, 0xFF, 0x0, 0x29, 0x0, 0x0, 0x5, 0xE6, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x51, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x78, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x29, 0x0, 0x0, 0x5, 0xE6, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x51, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x2, 0x17, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x29, 0x0, 0x0, 0x5, 0xE6, 0x5, 0xEB, 0x0, 0x26, 0x7, 0x51, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x44, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x5, 0x0, 0x0, 0x4, 0x37, 0x6, 0x1E, 0x0, 0x26, 0x7, 0x4F, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x0, 0x8E, 0x0, 0x1E, 0xFF, 0xFF, 0x0, 0x12, 0xFE, 0x55, 0x5, 0x43, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x26, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x1, 0x82, 0x0, 0x3, 0xFF, 0xFF, 0x0, 0x5B, 0xFE, 0x5A, 0x3, 0xFC, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x46, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x0, 0xB4, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x5C, 0x4, 0x4D, 0x5, 0xB0, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x1, 0x3F, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x54, 0xFE, 0x52, 0x4, 0xC, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x4A, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x1, 0x4, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFE, 0x52, 0x5, 0x1F, 0x5, 0xC4, 0x0, 0x26, 0x0, 0x34, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x1, 0x92, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x4E, 0x4, 0x3E, 0x4, 0x4E, 0x0, 0x26, 0x0, 0x54, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x1, 0x12, 0xFF, 0xFC, 0xFF, 0xFF, 0x0, 0x9, 0xFE, 0x52, 0x4, 0x94, 0x4, 0x8D, 0x0, 0x26, 0x7, 0xB1, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x1, 0x23, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x76, 0xFE, 0x5A, 0x3, 0xB6, 0x4, 0x8D, 0x0, 0x26, 0x7, 0xA6, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x0, 0xED, 0x0, 0x8, 0xFF, 0xFF, 0x0, 0x50, 0xFE, 0x52, 0x4, 0x6F, 0x4, 0x9D, 0x0, 0x26, 0x7, 0x59, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x1, 0x39, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xD, 0x7, 0x54, 0x0, 0x26, 0x7, 0xE0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x35, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xD, 0x7, 0x54, 0x0, 0x26, 0x7, 0xE0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xD4, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xD, 0x7, 0x55, 0x0, 0x26, 0x7, 0xE0, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0xD5, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xD, 0x7, 0x49, 0x0, 0x26, 0x7, 0xE0, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0xD7, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xD, 0x7, 0x21, 0x0, 0x26, 0x7, 0xE0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x1, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xD, 0x7, 0xB2, 0x0, 0x26, 0x7, 0xE0, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8B, 0x1, 0x6A, 0x1, 0x88, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xD, 0x7, 0x1, 0x0, 0x26, 0x7, 0xE0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xD1, 0x1, 0x57, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xD, 0x7, 0x3B, 0x0, 0x26, 0x7, 0xE0, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x1, 0x8, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x66, 0xFE, 0x52, 0x5, 0xD, 0x5, 0xC4, 0x0, 0x26, 0x7, 0xE0, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x3, 0x17, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x66, 0xFF, 0xEC, 0x5, 0xD, 0x7, 0xCF, 0x0, 0x26, 0x7, 0xE0, 0x0, 0x0, 0x0, 0x7, 0x7, 0xA5, 0x1, 0x70, 0x1, 0x39, 0xFF, 0xFF, 0x0, 0x65, 0xFF, 0xEA, 0x5, 0x30, 0x7, 0x5C, 0x0, 0x26, 0x7, 0xE1, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x4E, 0x1, 0x5C, 0xFF, 0xFF, 0x0, 0x65, 0xFF, 0xEA, 0x5, 0x30, 0x7, 0x5C, 0x0, 0x26, 0x7, 0xE1, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xED, 0x1, 0x5C, 0xFF, 0xFF, 0x0, 0x65, 0xFF, 0xEA, 0x5, 0x30, 0x7, 0x5D, 0x0, 0x26, 0x7, 0xE1, 0x0, 0x0, 0x0, 0x7, 0x1, 0x77, 0x0, 0xEE, 0x1, 0x5C, 0xFF, 0xFF, 0x0, 0x65, 0xFF, 0xEA, 0x5, 0x30, 0x7, 0x29, 0x0, 0x26, 0x7, 0xE1, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x1A, 0x1, 0x5C, 0xFF, 0xFF, 0x0, 0x65, 0xFF, 0xEA, 0x5, 0x30, 0x7, 0x9, 0x0, 0x26, 0x7, 0xE1, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xEA, 0x1, 0x5F, 0xFF, 0xFF, 0x0, 0x65, 0xFF, 0xEA, 0x5, 0x30, 0x7, 0x43, 0x0, 0x26, 0x7, 0xE1, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x1, 0x21, 0x1, 0x5C, 0xFF, 0xFF, 0x0, 0x65, 0xFF, 0xEA, 0x5, 0x30, 0x7, 0x39, 0x0, 0x26, 0x7, 0xE1, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8A, 0x1, 0xD4, 0x1, 0x64, 0xFF, 0xFF, 0x0, 0x65, 0xFE, 0x52, 0x5, 0x30, 0x5, 0xC4, 0x0, 0x26, 0x7, 0xE1, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x2, 0x6, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x65, 0xFF, 0xEA, 0x5, 0x30, 0x7, 0x5E, 0x0, 0x26, 0x7, 0xE1, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x1, 0x6, 0x1, 0x5C, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x7, 0x49, 0x0, 0x26, 0x7, 0xDE, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0xF5, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x7, 0x54, 0x0, 0x26, 0x7, 0xDE, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xF2, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x95, 0xFD, 0xFE, 0x5, 0x19, 0x5, 0xC4, 0x0, 0x26, 0x7, 0xDE, 0x0, 0x0, 0x0, 0x7, 0x7, 0x25, 0x1, 0xE5, 0xFE, 0x98, 0xFF, 0xFF, 0x0, 0x95, 0x0, 0x0, 0x5, 0x19, 0x7, 0x56, 0x0, 0x26, 0x7, 0xDE, 0x0, 0x0, 0x0, 0x7, 0x1, 0x78, 0x1, 0xB, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x5, 0x19, 0x7, 0x54, 0x0, 0x26, 0x7, 0xDF, 0x0, 0x0, 0x0, 0x7, 0x0, 0x45, 0x1, 0x4A, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x5, 0x19, 0x7, 0x54, 0x0, 0x26, 0x7, 0xDF, 0x0, 0x0, 0x0, 0x7, 0x0, 0x76, 0x1, 0xE9, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x5, 0x19, 0x7, 0x21, 0x0, 0x26, 0x7, 0xDF, 0x0, 0x0, 0x0, 0x7, 0x0, 0x6B, 0x1, 0x16, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x5, 0x19, 0x7, 0x49, 0x0, 0x26, 0x7, 0xDF, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8D, 0x0, 0xEC, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x5, 0x19, 0x7, 0x1, 0x0, 0x26, 0x7, 0xDF, 0x0, 0x0, 0x0, 0x7, 0x0, 0x71, 0x0, 0xE6, 0x1, 0x57, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x5, 0x19, 0x7, 0x3B, 0x0, 0x26, 0x7, 0xDF, 0x0, 0x0, 0x0, 0x7, 0x1, 0x89, 0x1, 0x1D, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x5, 0x19, 0x7, 0xB2, 0x0, 0x26, 0x7, 0xDF, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8B, 0x1, 0x7F, 0x1, 0x88, 0xFF, 0xFF, 0x0, 0x95, 0xFF, 0xEC, 0x5, 0x19, 0x7, 0x53, 0x0, 0x26, 0x7, 0xDF, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8E, 0x1, 0x74, 0x1, 0x54, 0xFF, 0xFF, 0x0, 0x95, 0xFE, 0x52, 0x5, 0x19, 0x5, 0xB0, 0x0, 0x26, 0x7, 0xDF, 0x0, 0x0, 0x0, 0x7, 0x1, 0x8C, 0x3, 0x35, 0x0, 0x0, 0xFF, 0xFF, 0xFF, 0x91, 0xFE, 0x83, 0x2, 0x6F, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xE1, 0x3, 0x4E, 0x0, 0xA, 0xFF, 0xFF, 0x0, 0x79, 0xFE, 0x9D, 0x1, 0x8D, 0x4, 0x3A, 0x0, 0x26, 0x0, 0x8E, 0x0, 0x0, 0x0, 0x7, 0x1, 0xD4, 0x3, 0x5E, 0x0, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0xC6, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x0, 0x0, 0x5E, 0x0, 0x0, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x1, 0x0, 0x1A, 0x0, 0x5E, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x2, 0x0, 0xE, 0x0, 0x78, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x3, 0x0, 0x32, 0x0, 0x86, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x4, 0x0, 0x1A, 0x0, 0x5E, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x5, 0x0, 0x26, 0x0, 0xB8, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x6, 0x0, 0x1A, 0x0, 0xDE, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x7, 0x0, 0x40, 0x0, 0xF8, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x8, 0x0, 0xC, 0x1, 0x38, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x9, 0x0, 0x26, 0x1, 0x44, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0xB, 0x0, 0x14, 0x1, 0x6A, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0xC, 0x0, 0x14, 0x1, 0x6A, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0xD, 0x0, 0x5C, 0x1, 0x7E, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0xE, 0x0, 0x54, 0x1, 0xDA, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x10, 0x0, 0xC, 0x2, 0x2E, 0x0, 0x3, 0x0, 0x1, 0x4, 0x9, 0x0, 0x11, 0x0, 0xC, 0x2, 0x3A, 0x0, 0x43, 0x0, 0x6F, 0x0, 0x70, 0x0, 0x79, 0x0, 0x72, 0x0, 0x69, 0x0, 0x67, 0x0, 0x68, 0x0, 0x74, 0x0, 0x20, 0x0, 0x32, 0x0, 0x30, 0x0, 0x31, 0x0, 0x31, 0x0, 0x20, 0x0, 0x47, 0x0, 0x6F, 0x0, 0x6F, 0x0, 0x67, 0x0, 0x6C, 0x0, 0x65, 0x0, 0x20, 0x0, 0x49, 0x0, 0x6E, 0x0, 0x63, 0x0, 0x2E, 0x0, 0x20, 0x0, 0x41, 0x0, 0x6C, 0x0, 0x6C, 0x0, 0x20, 0x0, 0x52, 0x0, 0x69, 0x0, 0x67, 0x0, 0x68, 0x0, 0x74, 0x0, 0x73, 0x0, 0x20, 0x0, 0x52, 0x0, 0x65, 0x0, 0x73, 0x0, 0x65, 0x0, 0x72, 0x0, 0x76, 0x0, 0x65, 0x0, 0x64, 0x0, 0x2E, 0x0, 0x52, 0x0, 0x6F, 0x0, 0x62, 0x0, 0x6F, 0x0, 0x74, 0x0, 0x6F, 0x0, 0x20, 0x0, 0x4D, 0x0, 0x65, 0x0, 0x64, 0x0, 0x69, 0x0, 0x75, 0x0, 0x6D, 0x0, 0x52, 0x0, 0x65, 0x0, 0x67, 0x0, 0x75, 0x0, 0x6C, 0x0, 0x61, 0x0, 0x72, 0x0, 0x47, 0x0, 0x6F, 0x0, 0x6F, 0x0, 0x67, 0x0, 0x6C, 0x0, 0x65, 0x0, 0x3A, 0x0, 0x52, 0x0, 0x6F, 0x0, 0x62, 0x0, 0x6F, 0x0, 0x74, 0x0, 0x6F, 0x0, 0x20, 0x0, 0x4D, 0x0, 0x65, 0x0, 0x64, 0x0, 0x69, 0x0, 0x75, 0x0, 0x6D, 0x0, 0x3A, 0x0, 0x32, 0x0, 0x30, 0x0, 0x31, 0x0, 0x36, 0x0, 0x56, 0x0, 0x65, 0x0, 0x72, 0x0, 0x73, 0x0, 0x69, 0x0, 0x6F, 0x0, 0x6E, 0x0, 0x20, 0x0, 0x32, 0x0, 0x2E, 0x0, 0x31, 0x0, 0x33, 0x0, 0x34, 0x0, 0x3B, 0x0, 0x20, 0x0, 0x32, 0x0, 0x30, 0x0, 0x31, 0x0, 0x36, 0x0, 0x52, 0x0, 0x6F, 0x0, 0x62, 0x0, 0x6F, 0x0, 0x74, 0x0, 0x6F, 0x0, 0x2D, 0x0, 0x4D, 0x0, 0x65, 0x0, 0x64, 0x0, 0x69, 0x0, 0x75, 0x0, 0x6D, 0x0, 0x52, 0x0, 0x6F, 0x0, 0x62, 0x0, 0x6F, 0x0, 0x74, 0x0, 0x6F, 0x0, 0x20, 0x0, 0x69, 0x0, 0x73, 0x0, 0x20, 0x0, 0x61, 0x0, 0x20, 0x0, 0x74, 0x0, 0x72, 0x0, 0x61, 0x0, 0x64, 0x0, 0x65, 0x0, 0x6D, 0x0, 0x61, 0x0, 0x72, 0x0, 0x6B, 0x0, 0x20, 0x0, 0x6F, 0x0, 0x66, 0x0, 0x20, 0x0, 0x47, 0x0, 0x6F, 0x0, 0x6F, 0x0, 0x67, 0x0, 0x6C, 0x0, 0x65, 0x0, 0x2E, 0x0, 0x47, 0x0, 0x6F, 0x0, 0x6F, 0x0, 0x67, 0x0, 0x6C, 0x0, 0x65, 0x0, 0x43, 0x0, 0x68, 0x0, 0x72, 0x0, 0x69, 0x0, 0x73, 0x0, 0x74, 0x0, 0x69, 0x0, 0x61, 0x0, 0x6E, 0x0, 0x20, 0x0, 0x52, 0x0, 0x6F, 0x0, 0x62, 0x0, 0x65, 0x0, 0x72, 0x0, 0x74, 0x0, 0x73, 0x0, 0x6F, 0x0, 0x6E, 0x0, 0x47, 0x0, 0x6F, 0x0, 0x6F, 0x0, 0x67, 0x0, 0x6C, 0x0, 0x65, 0x0, 0x2E, 0x0, 0x63, 0x0, 0x6F, 0x0, 0x6D, 0x0, 0x4C, 0x0, 0x69, 0x0, 0x63, 0x0, 0x65, 0x0, 0x6E, 0x0, 0x73, 0x0, 0x65, 0x0, 0x64, 0x0, 0x20, 0x0, 0x75, 0x0, 0x6E, 0x0, 0x64, 0x0, 0x65, 0x0, 0x72, 0x0, 0x20, 0x0, 0x74, 0x0, 0x68, 0x0, 0x65, 0x0, 0x20, 0x0, 0x41, 0x0, 0x70, 0x0, 0x61, 0x0, 0x63, 0x0, 0x68, 0x0, 0x65, 0x0, 0x20, 0x0, 0x4C, 0x0, 0x69, 0x0, 0x63, 0x0, 0x65, 0x0, 0x6E, 0x0, 0x73, 0x0, 0x65, 0x0, 0x2C, 0x0, 0x20, 0x0, 0x56, 0x0, 0x65, 0x0, 0x72, 0x0, 0x73, 0x0, 0x69, 0x0, 0x6F, 0x0, 0x6E, 0x0, 0x20, 0x0, 0x32, 0x0, 0x2E, 0x0, 0x30, 0x0, 0x68, 0x0, 0x74, 0x0, 0x74, 0x0, 0x70, 0x0, 0x3A, 0x0, 0x2F, 0x0, 0x2F, 0x0, 0x77, 0x0, 0x77, 0x0, 0x77, 0x0, 0x2E, 0x0, 0x61, 0x0, 0x70, 0x0, 0x61, 0x0, 0x63, 0x0, 0x68, 0x0, 0x65, 0x0, 0x2E, 0x0, 0x6F, 0x0, 0x72, 0x0, 0x67, 0x0, 0x2F, 0x0, 0x6C, 0x0, 0x69, 0x0, 0x63, 0x0, 0x65, 0x0, 0x6E, 0x0, 0x73, 0x0, 0x65, 0x0, 0x73, 0x0, 0x2F, 0x0, 0x4C, 0x0, 0x49, 0x0, 0x43, 0x0, 0x45, 0x0, 0x4E, 0x0, 0x53, 0x0, 0x45, 0x0, 0x2D, 0x0, 0x32, 0x0, 0x2E, 0x0, 0x30, 0x0, 0x52, 0x0, 0x6F, 0x0, 0x62, 0x0, 0x6F, 0x0, 0x74, 0x0, 0x6F, 0x0, 0x4D, 0x0, 0x65, 0x0, 0x64, 0x0, 0x69, 0x0, 0x75, 0x0, 0x6D, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x6A, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x91, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x1, 0x0, 0x46, 0x0, 0x5F, 0x0, 0x1, 0x0, 0x7A, 0x0, 0x7A, 0x0, 0x1, 0x0, 0x82, 0x0, 0x82, 0x0, 0x1, 0x0, 0x84, 0x0, 0x84, 0x0, 0x1, 0x0, 0x87, 0x0, 0x87, 0x0, 0x1, 0x0, 0x8A, 0x0, 0x8A, 0x0, 0x1, 0x0, 0x8C, 0x0, 0x97, 0x0, 0x1, 0x0, 0xA6, 0x0, 0xA7, 0x0, 0x1, 0x0, 0xAD, 0x0, 0xAD, 0x0, 0x1, 0x0, 0xB0, 0x0, 0xB0, 0x0, 0x1, 0x0, 0xB4, 0x0, 0xB5, 0x0, 0x1, 0x0, 0xBD, 0x0, 0xBD, 0x0, 0x1, 0x0, 0xC3, 0x0, 0xC4, 0x0, 0x1, 0x0, 0xC9, 0x0, 0xCA, 0x0, 0x1, 0x0, 0xDB, 0x0, 0xDC, 0x0, 0x1, 0x0, 0xEC, 0x0, 0xEC, 0x0, 0x1, 0x0, 0xF2, 0x0, 0xF2, 0x0, 0x1, 0x0, 0xF8, 0x0, 0xF9, 0x0, 0x1, 0x0, 0xFD, 0x0, 0xFE, 0x0, 0x1, 0x1, 0x1, 0x1, 0x61, 0x0, 0x1, 0x1, 0x8C, 0x1, 0x8C, 0x0, 0x1, 0x1, 0x8F, 0x1, 0x8F, 0x0, 0x1, 0x1, 0x96, 0x1, 0x9A, 0x0, 0x4, 0x1, 0xB1, 0x1, 0xCB, 0x0, 0x3, 0x1, 0xCD, 0x1, 0xD1, 0x0, 0x3, 0x1, 0xD4, 0x1, 0xE4, 0x0, 0x3, 0x1, 0xEA, 0x1, 0xFF, 0x0, 0x3, 0x2, 0x1, 0x2, 0x8, 0x0, 0x3, 0x2, 0xA, 0x2, 0x20, 0x0, 0x3, 0x2, 0x30, 0x2, 0x30, 0x0, 0x1, 0x2, 0x39, 0x2, 0x3A, 0x0, 0x1, 0x2, 0x3E, 0x2, 0x3E, 0x0, 0x1, 0x2, 0x40, 0x2, 0x40, 0x0, 0x1, 0x2, 0x42, 0x2, 0x42, 0x0, 0x1, 0x2, 0x46, 0x2, 0x46, 0x0, 0x1, 0x2, 0x4A, 0x2, 0x4A, 0x0, 0x1, 0x2, 0x4C, 0x2, 0x4D, 0x0, 0x1, 0x2, 0x51, 0x2, 0x51, 0x0, 0x1, 0x2, 0x53, 0x2, 0x53, 0x0, 0x1, 0x2, 0x69, 0x2, 0x69, 0x0, 0x1, 0x2, 0x70, 0x2, 0x74, 0x0, 0x1, 0x2, 0x77, 0x2, 0x77, 0x0, 0x1, 0x2, 0x7B, 0x2, 0x7B, 0x0, 0x1, 0x2, 0x7D, 0x2, 0x7F, 0x0, 0x1, 0x2, 0x81, 0x2, 0x91, 0x0, 0x1, 0x2, 0x93, 0x2, 0x93, 0x0, 0x1, 0x2, 0x95, 0x2, 0x97, 0x0, 0x1, 0x2, 0x99, 0x2, 0x99, 0x0, 0x1, 0x2, 0x9E, 0x2, 0x9F, 0x0, 0x1, 0x2, 0xAC, 0x2, 0xB0, 0x0, 0x1, 0x2, 0xB2, 0x2, 0xB2, 0x0, 0x1, 0x2, 0xB6, 0x2, 0xB8, 0x0, 0x1, 0x2, 0xBA, 0x2, 0xBB, 0x0, 0x3, 0x2, 0xC1, 0x2, 0xC2, 0x0, 0x1, 0x2, 0xCA, 0x2, 0xCB, 0x0, 0x1, 0x2, 0xCD, 0x2, 0xCD, 0x0, 0x1, 0x2, 0xD2, 0x2, 0xD3, 0x0, 0x1, 0x2, 0xD8, 0x2, 0xDB, 0x0, 0x1, 0x2, 0xDE, 0x2, 0xDF, 0x0, 0x1, 0x2, 0xE2, 0x2, 0xE4, 0x0, 0x1, 0x2, 0xE8, 0x2, 0xE8, 0x0, 0x1, 0x2, 0xEB, 0x2, 0xEF, 0x0, 0x1, 0x2, 0xF4, 0x2, 0xF5, 0x0, 0x1, 0x2, 0xF9, 0x2, 0xF9, 0x0, 0x1, 0x2, 0xFB, 0x2, 0xFB, 0x0, 0x1, 0x2, 0xFF, 0x2, 0xFF, 0x0, 0x1, 0x3, 0x1, 0x3, 0x3, 0x0, 0x1, 0x3, 0x5, 0x3, 0x5, 0x0, 0x1, 0x3, 0x7, 0x3, 0x7, 0x0, 0x1, 0x3, 0x15, 0x3, 0x17, 0x0, 0x1, 0x3, 0x1F, 0x3, 0x1F, 0x0, 0x1, 0x3, 0x20, 0x3, 0x28, 0x0, 0x3, 0x3, 0x29, 0x3, 0x2A, 0x0, 0x4, 0x3, 0x2B, 0x3, 0x2C, 0x0, 0x3, 0x3, 0x2D, 0x3, 0x2D, 0x0, 0x4, 0x3, 0x2F, 0x3, 0x3F, 0x0, 0x1, 0x3, 0x43, 0x3, 0x44, 0x0, 0x1, 0x3, 0x47, 0x3, 0x4B, 0x0, 0x1, 0x3, 0x4F, 0x3, 0x5A, 0x0, 0x1, 0x3, 0x9A, 0x3, 0xA6, 0x0, 0x1, 0x3, 0xA8, 0x3, 0xC9, 0x0, 0x1, 0x3, 0xEF, 0x4, 0x24, 0x0, 0x3, 0x4, 0x26, 0x4, 0x28, 0x0, 0x3, 0x4, 0x2B, 0x4, 0x2E, 0x0, 0x1, 0x4, 0x2F, 0x4, 0x2F, 0x0, 0x2, 0x5, 0x5D, 0x5, 0x5E, 0x0, 0x1, 0x6, 0xC7, 0x6, 0xC8, 0x0, 0x1, 0x7, 0x25, 0x7, 0x25, 0x0, 0x3, 0x7, 0x26, 0x7, 0x2C, 0x0, 0x2, 0x7, 0x40, 0x7, 0x40, 0x0, 0x2, 0x7, 0x4E, 0x7, 0x62, 0x0, 0x1, 0x7, 0x66, 0x7, 0x66, 0x0, 0x1, 0x7, 0x6F, 0x7, 0x6F, 0x0, 0x1, 0x7, 0x71, 0x7, 0x71, 0x0, 0x1, 0x7, 0x78, 0x7, 0x7A, 0x0, 0x1, 0x7, 0x7C, 0x7, 0x7D, 0x0, 0x1, 0x7, 0x7F, 0x7, 0x7F, 0x0, 0x1, 0x7, 0x83, 0x7, 0x83, 0x0, 0x1, 0x7, 0x85, 0x7, 0x87, 0x0, 0x1, 0x7, 0x8D, 0x7, 0x8D, 0x0, 0x1, 0x7, 0x92, 0x7, 0x94, 0x0, 0x1, 0x7, 0x96, 0x7, 0x96, 0x0, 0x1, 0x7, 0xA6, 0x7, 0xA6, 0x0, 0x1, 0x7, 0xA9, 0x7, 0xA9, 0x0, 0x1, 0x7, 0xAB, 0x7, 0xAB, 0x0, 0x1, 0x7, 0xAE, 0x7, 0xB1, 0x0, 0x1, 0x7, 0xDE, 0x7, 0xE2, 0x0, 0x1, 0x7, 0xEE, 0x7, 0xF3, 0x0, 0x1, 0x7, 0xF5, 0x7, 0xF5, 0x0, 0x1, 0x7, 0xF7, 0x7, 0xF8, 0x0, 0x1, 0x7, 0xFA, 0x7, 0xFA, 0x0, 0x1, 0x7, 0xFF, 0x8, 0x89, 0x0, 0x2, 0x8, 0x8A, 0x8, 0x95, 0x0, 0x3, 0x8, 0x96, 0x8, 0x97, 0x0, 0x2, 0x8, 0x98, 0x8, 0x98, 0x0, 0x3, 0x8, 0x9A, 0x8, 0x9F, 0x0, 0x3, 0x8, 0xC8, 0x9, 0x30, 0x0, 0x1, 0x9, 0x33, 0x9, 0xBD, 0x0, 0x1, 0x9, 0xBF, 0x9, 0xDA, 0x0, 0x1, 0x9, 0xDC, 0x9, 0xF3, 0x0, 0x1, 0x9, 0xF5, 0xA, 0x1, 0x0, 0x1, 0xA, 0x3, 0xA, 0xC, 0x0, 0x1, 0xA, 0xE, 0xA, 0x29, 0x0, 0x1, 0xA, 0x2D, 0xA, 0x2D, 0x0, 0x1, 0xA, 0x2F, 0xA, 0x36, 0x0, 0x1, 0xA, 0x38, 0xA, 0x3A, 0x0, 0x1, 0xA, 0x3D, 0xA, 0x41, 0x0, 0x1, 0xA, 0x43, 0xA, 0xCC, 0x0, 0x1, 0xA, 0xCF, 0xA, 0xCF, 0x0, 0x1, 0xA, 0xD2, 0xA, 0xD3, 0x0, 0x1, 0xA, 0xD5, 0xA, 0xD6, 0x0, 0x1, 0xA, 0xD8, 0xA, 0xDB, 0x0, 0x1, 0xA, 0xE6, 0xA, 0xE7, 0x0, 0x1, 0xA, 0xEE, 0xB, 0xC, 0x0, 0x1, 0xB, 0x10, 0xB, 0x44, 0x0, 0x1, 0xB, 0x47, 0xC, 0x33, 0x0, 0x1, 0xC, 0x3C, 0xC, 0x71, 0x0, 0x1, 0xC, 0x7A, 0xC, 0xAD, 0x0, 0x1, 0xC, 0xB7, 0xC, 0xBC, 0x0, 0x1, 0xC, 0xBE, 0xC, 0xDD, 0x0, 0x1, 0xC, 0xDF, 0xC, 0xE6, 0x0, 0x1, 0xC, 0xE8, 0xC, 0xE9, 0x0, 0x1, 0xC, 0xEB, 0xC, 0xEB, 0x0, 0x1, 0xC, 0xF4, 0xD, 0x1E, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xA, 0x0, 0x36, 0x0, 0x7C, 0x0, 0x4, 0x44, 0x46, 0x4C, 0x54, 0x0, 0x1A, 0x63, 0x79, 0x72, 0x6C, 0x0, 0x1A, 0x67, 0x72, 0x65, 0x6B, 0x0, 0x1A, 0x6C, 0x61, 0x74, 0x6E, 0x0, 0x1A, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x63, 0x70, 0x73, 0x70, 0x0, 0x1A, 0x6B, 0x65, 0x72, 0x6E, 0x0, 0x20, 0x6D, 0x61, 0x72, 0x6B, 0x0, 0x26, 0x6D, 0x6B, 0x6D, 0x6B, 0x0, 0x3E, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xA, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xA, 0x0, 0xB, 0x0, 0x0, 0x0, 0x2, 0x0, 0xC, 0x0, 0xD, 0x0, 0xE, 0x0, 0x1E, 0x2, 0x34, 0x96, 0x86, 0xB9, 0x78, 0xCC, 0xB6, 0xD8, 0x44, 0xE4, 0x20, 0xE4, 0xFA, 0xFB, 0xA6, 0xFB, 0xB6, 0xFC, 0x2, 0xFC, 0x12, 0xFC, 0x22, 0xFC, 0x32, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0xA, 0x0, 0x5, 0x0, 0x24, 0x0, 0x48, 0x0, 0x1, 0x1, 0x0, 0x0, 0x9, 0x0, 0xB, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1A, 0x0, 0x1B, 0x0, 0x1C, 0x0, 0x1D, 0x0, 0x1E, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2A, 0x0, 0x2B, 0x0, 0x2C, 0x0, 0x2D, 0x0, 0x2E, 0x0, 0x2F, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3A, 0x0, 0x3B, 0x0, 0x3C, 0x0, 0x3D, 0x0, 0x3E, 0x0, 0x3F, 0x0, 0x66, 0x0, 0x68, 0x0, 0x82, 0x0, 0x84, 0x0, 0x85, 0x0, 0x8D, 0x0, 0x90, 0x0, 0x92, 0x0, 0x94, 0x2, 0x30, 0x2, 0x31, 0x2, 0x32, 0x2, 0x33, 0x2, 0x34, 0x2, 0x35, 0x2, 0x36, 0x2, 0x37, 0x2, 0x38, 0x2, 0x39, 0x2, 0x68, 0x2, 0x69, 0x2, 0x6A, 0x2, 0x6B, 0x2, 0x6C, 0x2, 0x6D, 0x2, 0x6E, 0x2, 0x6F, 0x2, 0x70, 0x2, 0x71, 0x2, 0x72, 0x2, 0x73, 0x2, 0x74, 0x2, 0x75, 0x2, 0x76, 0x2, 0x77, 0x2, 0x78, 0x2, 0x79, 0x2, 0x7A, 0x2, 0x7B, 0x2, 0x7C, 0x2, 0x7D, 0x2, 0x7E, 0x2, 0x7F, 0x2, 0xC6, 0x2, 0xCA, 0x2, 0xCC, 0x2, 0xCE, 0x2, 0xD0, 0x2, 0xD2, 0x2, 0xD8, 0x2, 0xDA, 0x2, 0xDC, 0x2, 0xE0, 0x2, 0xE2, 0x2, 0xE3, 0x2, 0xEF, 0x2, 0xF0, 0x4, 0x32, 0x4, 0xC8, 0x4, 0xCF, 0x4, 0xD7, 0x4, 0xDB, 0x4, 0xE0, 0x4, 0xED, 0x8, 0xC8, 0x8, 0xC9, 0x8, 0xCB, 0x8, 0xCD, 0x8, 0xCE, 0x8, 0xCF, 0x8, 0xD0, 0x8, 0xD1, 0x8, 0xD2, 0x8, 0xD3, 0x8, 0xD4, 0x8, 0xD5, 0x8, 0xD6, 0x8, 0xD7, 0x8, 0xD8, 0x8, 0xD9, 0x8, 0xDA, 0x8, 0xDB, 0x8, 0xDC, 0x8, 0xDD, 0x8, 0xDE, 0x8, 0xDF, 0x8, 0xE0, 0x8, 0xE1, 0x8, 0xE2, 0x8, 0xE3, 0x8, 0xE4, 0x8, 0xE5, 0x8, 0xE6, 0x8, 0xE7, 0x9, 0x4, 0x9, 0x6, 0x9, 0x8, 0x9, 0xA, 0x9, 0xC, 0x9, 0xE, 0x9, 0x10, 0x9, 0x12, 0x9, 0x14, 0x9, 0x16, 0x9, 0x18, 0x9, 0x1A, 0x9, 0x1C, 0x9, 0x1E, 0x9, 0x20, 0x9, 0x22, 0x9, 0x24, 0x9, 0x26, 0x9, 0x28, 0x9, 0x2A, 0x9, 0x2C, 0x9, 0x2E, 0x9, 0x30, 0x9, 0x31, 0x9, 0x33, 0x9, 0x35, 0x9, 0x37, 0x9, 0x39, 0x9, 0x3B, 0x9, 0x3D, 0x9, 0x3F, 0x9, 0x41, 0x9, 0x43, 0x9, 0x46, 0x9, 0x48, 0x9, 0x4A, 0x9, 0x4C, 0x9, 0x4E, 0x9, 0x50, 0x9, 0x52, 0x9, 0x54, 0x9, 0x56, 0x9, 0x58, 0x9, 0x5A, 0x9, 0x5C, 0x9, 0x5E, 0x9, 0x60, 0x9, 0x62, 0x9, 0x64, 0x9, 0x66, 0x9, 0x68, 0x9, 0x6A, 0x9, 0x6C, 0x9, 0x6E, 0x9, 0x70, 0x9, 0x72, 0x9, 0x73, 0x9, 0x75, 0x9, 0x77, 0x9, 0x79, 0x9, 0x7B, 0x9, 0xD5, 0x9, 0xD6, 0x9, 0xD7, 0x9, 0xD8, 0x9, 0xD9, 0x9, 0xDA, 0x9, 0xDB, 0x9, 0xDD, 0x9, 0xDE, 0x9, 0xDF, 0x9, 0xE0, 0x9, 0xE1, 0x9, 0xE2, 0x9, 0xE3, 0x9, 0xE4, 0x9, 0xE5, 0x9, 0xE6, 0x9, 0xE7, 0x9, 0xE8, 0x9, 0xE9, 0x9, 0xEA, 0x9, 0xEB, 0x9, 0xEC, 0x9, 0xFC, 0x9, 0xFD, 0x9, 0xFE, 0x9, 0xFF, 0xA, 0x0, 0xA, 0x1, 0xA, 0x2, 0xA, 0x3, 0xA, 0x4, 0xA, 0x5, 0xA, 0x6, 0xA, 0x7, 0xA, 0x8, 0xA, 0x9, 0xA, 0xA, 0xA, 0xB, 0xA, 0xC, 0xA, 0xD, 0xA, 0xE, 0xA, 0xF, 0xA, 0x10, 0xA, 0x11, 0xA, 0x22, 0xA, 0x24, 0xA, 0x26, 0xA, 0x28, 0xA, 0x3D, 0xA, 0x3F, 0xA, 0x41, 0xA, 0x56, 0xA, 0x5C, 0xA, 0x63, 0xA, 0xCD, 0xA, 0xD2, 0xA, 0xD6, 0xB, 0x9, 0xB, 0x3F, 0xC, 0xF4, 0xC, 0xF6, 0xC, 0xF8, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x0, 0xA, 0x65, 0x34, 0x0, 0x1, 0x6, 0x54, 0x0, 0x4, 0x0, 0x0, 0x3, 0x25, 0xC, 0xA2, 0x5F, 0xAE, 0x5F, 0xAE, 0xC, 0xEC, 0xD, 0x6E, 0x63, 0x96, 0x61, 0x1E, 0x61, 0x28, 0x64, 0xE8, 0x64, 0x2, 0xD, 0x74, 0x64, 0x10, 0x64, 0x10, 0x61, 0x44, 0x61, 0x92, 0x64, 0x10, 0x64, 0x10, 0x64, 0xE8, 0x64, 0xC6, 0x13, 0x7E, 0x14, 0x88, 0x61, 0xBE, 0x62, 0x94, 0x62, 0xB2, 0x62, 0xD0, 0x64, 0x4C, 0x63, 0x34, 0x15, 0xEE, 0x60, 0xFC, 0x64, 0x32, 0x61, 0x3A, 0x16, 0x5C, 0x18, 0x66, 0x18, 0x70, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0x6C, 0x64, 0x32, 0x61, 0xAC, 0x1B, 0x1E, 0x63, 0x4E, 0x1C, 0x0, 0x63, 0x2E, 0x63, 0x4E, 0x1C, 0x1A, 0x64, 0x32, 0x64, 0x32, 0x64, 0x32, 0x64, 0x32, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0x10, 0x64, 0x10, 0x64, 0xE8, 0x61, 0x44, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0xC6, 0x61, 0xBE, 0x63, 0x34, 0x64, 0x32, 0x64, 0x32, 0x61, 0x92, 0x61, 0x1E, 0x63, 0x96, 0x61, 0xAC, 0x64, 0x4C, 0x1C, 0x88, 0x64, 0x10, 0x64, 0x32, 0x64, 0x32, 0x60, 0x36, 0x63, 0x96, 0x64, 0xE8, 0x63, 0x96, 0x1D, 0x1A, 0x1E, 0xA4, 0x20, 0x32, 0x21, 0x68, 0x22, 0x46, 0x63, 0x4E, 0x22, 0x4C, 0x22, 0x56, 0x63, 0xF8, 0x27, 0x50, 0x2A, 0x8A, 0x2B, 0xF0, 0x2D, 0xE2, 0x2D, 0xFC, 0x2E, 0x2, 0x2E, 0x8, 0x32, 0x66, 0x32, 0x6C, 0x32, 0xCA, 0x33, 0x24, 0x61, 0x44, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0x32, 0x64, 0x32, 0x64, 0x32, 0x64, 0xE8, 0x61, 0x28, 0x64, 0xE8, 0x33, 0xE2, 0x35, 0xC0, 0x38, 0x1E, 0x3A, 0x88, 0x64, 0x10, 0x3C, 0x52, 0x3E, 0x90, 0x62, 0xD0, 0x42, 0x2, 0x64, 0x10, 0x64, 0x10, 0x5F, 0xB8, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x43, 0x18, 0x46, 0x4A, 0x64, 0x10, 0x60, 0xC, 0x47, 0x68, 0x48, 0x72, 0x49, 0x38, 0x49, 0xC6, 0x4B, 0x4, 0x60, 0x2, 0x4C, 0x9E, 0x63, 0x2E, 0x4D, 0xC8, 0x4D, 0xF2, 0x51, 0x1C, 0x64, 0x32, 0x56, 0x4A, 0x56, 0x94, 0x58, 0xB2, 0x5E, 0xD4, 0x64, 0x32, 0x59, 0x50, 0x5A, 0xF6, 0x5B, 0x20, 0x5B, 0x82, 0x5E, 0xD4, 0x63, 0x96, 0x63, 0x6C, 0x62, 0x94, 0x63, 0x4E, 0x5B, 0xBC, 0x64, 0x32, 0x60, 0x36, 0x60, 0x2, 0x62, 0xD0, 0x63, 0x2E, 0x61, 0x44, 0x61, 0x44, 0x61, 0x44, 0x64, 0x10, 0x62, 0xD0, 0x63, 0x2E, 0x64, 0x10, 0x64, 0x10, 0x64, 0xE8, 0x60, 0x2, 0x62, 0xD0, 0x63, 0x2E, 0x62, 0xD0, 0x63, 0x2E, 0x62, 0xD0, 0x63, 0x2E, 0x64, 0x2, 0x61, 0x3A, 0x61, 0x44, 0x64, 0x10, 0x64, 0x10, 0x61, 0x44, 0x64, 0x10, 0x64, 0x10, 0x61, 0x92, 0x5F, 0xAE, 0x5B, 0xE6, 0x5F, 0xAE, 0x5F, 0xAE, 0x5F, 0xAE, 0x64, 0xC6, 0x60, 0xFC, 0x64, 0x10, 0x63, 0xF8, 0x61, 0x44, 0x63, 0x34, 0x64, 0x10, 0x64, 0xE8, 0x63, 0x4E, 0x63, 0x6C, 0x63, 0x34, 0x63, 0x34, 0x64, 0xE8, 0x60, 0xC, 0x5E, 0xD4, 0x60, 0xC, 0x5E, 0xD4, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x64, 0x10, 0x61, 0xBE, 0x60, 0x2, 0x61, 0xBE, 0x60, 0x2, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x61, 0xBE, 0x60, 0x2, 0x61, 0xBE, 0x60, 0x2, 0x63, 0xF8, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0xF8, 0x63, 0x96, 0x64, 0xE8, 0x62, 0x94, 0x63, 0x4E, 0x62, 0x94, 0x63, 0x4E, 0x63, 0x4E, 0x64, 0xE8, 0x61, 0x44, 0x61, 0x44, 0x61, 0x44, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xC6, 0x64, 0x32, 0x64, 0xC6, 0x64, 0x32, 0x64, 0xC6, 0x64, 0x32, 0x62, 0x94, 0x63, 0x4E, 0x64, 0x32, 0x64, 0x32, 0x63, 0xF8, 0x64, 0x10, 0x61, 0x28, 0x61, 0x1E, 0x64, 0x32, 0x64, 0x10, 0x65, 0x24, 0x5E, 0xFA, 0x5F, 0x48, 0x65, 0x1E, 0x5F, 0xA4, 0x65, 0x6, 0x65, 0xC, 0x65, 0x1E, 0x65, 0xC, 0x65, 0x6, 0x65, 0x6, 0x65, 0x6, 0x65, 0x6, 0x5F, 0x96, 0x65, 0xC, 0x61, 0x28, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x61, 0xBE, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x61, 0x28, 0x64, 0x2, 0x64, 0x2, 0x64, 0x2, 0x64, 0x2, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0x4C, 0x60, 0xFC, 0x60, 0xFC, 0x60, 0xFC, 0x60, 0xFC, 0x60, 0xFC, 0x60, 0xFC, 0x60, 0xFC, 0x61, 0x3A, 0x61, 0x3A, 0x61, 0x3A, 0x61, 0x3A, 0x63, 0xF8, 0x63, 0x6C, 0x63, 0x6C, 0x63, 0x6C, 0x63, 0x6C, 0x63, 0x6C, 0x63, 0x4E, 0x63, 0x4E, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x61, 0x28, 0x61, 0x28, 0x61, 0x28, 0x61, 0x28, 0x64, 0xE8, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x61, 0x44, 0x61, 0x92, 0x61, 0x92, 0x61, 0x92, 0x61, 0x92, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x63, 0xF8, 0x63, 0xF8, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x61, 0xAC, 0x61, 0xAC, 0x61, 0xAC, 0x61, 0xBE, 0x61, 0xBE, 0x61, 0xBE, 0x62, 0xB2, 0x64, 0x4C, 0x63, 0x4E, 0x64, 0x4C, 0x63, 0x34, 0x63, 0x34, 0x63, 0x34, 0x65, 0x1E, 0x65, 0x1E, 0x65, 0x24, 0x65, 0xC, 0x65, 0xC, 0x65, 0xC, 0x65, 0xC, 0x65, 0xC, 0x65, 0xC, 0x65, 0xC, 0x65, 0x1E, 0x65, 0x1E, 0x65, 0x1E, 0x65, 0x1E, 0x65, 0x1E, 0x65, 0xC, 0x65, 0xC, 0x65, 0xC, 0x65, 0x1E, 0x65, 0x6, 0x5F, 0xA4, 0x5F, 0xA4, 0x5F, 0xA4, 0x5F, 0xA4, 0x65, 0x1E, 0x65, 0x1E, 0x65, 0x1E, 0x65, 0x1E, 0x65, 0x24, 0x63, 0x96, 0x64, 0x2, 0x64, 0x10, 0x64, 0x10, 0x64, 0xE8, 0x64, 0x4C, 0x63, 0x96, 0x61, 0x1E, 0x64, 0x2, 0x63, 0x34, 0x64, 0x10, 0x64, 0x10, 0x61, 0x44, 0x64, 0x10, 0x64, 0x10, 0x64, 0xE8, 0x64, 0xC6, 0x61, 0xBE, 0x64, 0x4C, 0x62, 0xD0, 0x64, 0x10, 0x64, 0x4C, 0x63, 0xF8, 0x63, 0x6C, 0x63, 0x4E, 0x63, 0x6C, 0x64, 0x2, 0x60, 0x36, 0x64, 0x10, 0x64, 0x10, 0x61, 0x44, 0x61, 0x44, 0x5F, 0xB8, 0x63, 0x96, 0x61, 0x1E, 0x60, 0x36, 0x64, 0x2, 0x64, 0x10, 0x64, 0x10, 0x64, 0xE8, 0x64, 0xC6, 0x61, 0x28, 0x61, 0xBE, 0x62, 0xD0, 0x60, 0xFC, 0x61, 0x3A, 0x63, 0x6C, 0x64, 0x32, 0x63, 0x4E, 0x63, 0x2E, 0x61, 0x3A, 0x60, 0x2, 0x63, 0x4E, 0x62, 0xB2, 0x62, 0xB2, 0x62, 0xB2, 0x64, 0x4C, 0x63, 0x4E, 0x5F, 0xAE, 0x5F, 0xAE, 0x5F, 0xAE, 0x64, 0x10, 0x63, 0xF8, 0x63, 0x96, 0x60, 0xFC, 0x64, 0x2, 0x61, 0x3A, 0x62, 0x94, 0x63, 0x4E, 0x61, 0x28, 0x64, 0x4C, 0x63, 0x4E, 0x64, 0x10, 0x62, 0xD0, 0x63, 0x2E, 0x64, 0x10, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x64, 0x2, 0x61, 0x3A, 0x61, 0x3A, 0x61, 0x3A, 0x62, 0xD0, 0x63, 0x2E, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0x32, 0x5F, 0xB8, 0x63, 0x4E, 0x5F, 0xB8, 0x63, 0x4E, 0x5F, 0xB8, 0x63, 0x4E, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x10, 0x64, 0x10, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x63, 0x6C, 0x64, 0x4C, 0x63, 0x4E, 0x64, 0x4C, 0x63, 0x4E, 0x64, 0x4C, 0x63, 0x4E, 0x61, 0xBE, 0x60, 0x36, 0x60, 0x2, 0x63, 0xF8, 0x60, 0xC, 0x60, 0x36, 0x61, 0x44, 0x64, 0x4C, 0x64, 0x10, 0x63, 0x96, 0x60, 0xFC, 0x64, 0x10, 0x64, 0xE8, 0x63, 0x6C, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x61, 0x3A, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x63, 0x34, 0x64, 0x10, 0x63, 0xF8, 0x63, 0x96, 0x60, 0xFC, 0x63, 0x96, 0x60, 0xFC, 0x64, 0x2, 0x64, 0x2, 0x64, 0x10, 0x64, 0x10, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x61, 0xAC, 0x61, 0xAC, 0x64, 0x10, 0x63, 0x96, 0x60, 0xFC, 0x64, 0x2, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x63, 0x4E, 0x63, 0x6C, 0x64, 0x32, 0x61, 0x28, 0x64, 0x10, 0x62, 0xB2, 0x61, 0x1E, 0x64, 0x32, 0x61, 0x1E, 0x64, 0x32, 0x61, 0x1E, 0x64, 0x32, 0x61, 0x28, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x2, 0x61, 0x3A, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x63, 0xF8, 0x61, 0x44, 0x61, 0x44, 0x61, 0x44, 0x61, 0x92, 0x61, 0x92, 0x61, 0x92, 0x61, 0x92, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x63, 0xF8, 0x64, 0x10, 0x63, 0xF8, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xE8, 0x63, 0x6C, 0x64, 0xC6, 0x64, 0x32, 0x64, 0xC6, 0x64, 0x32, 0x61, 0xAC, 0x61, 0xAC, 0x61, 0xAC, 0x61, 0xAC, 0x61, 0xBE, 0x61, 0xBE, 0x61, 0xBE, 0x61, 0xBE, 0x62, 0x94, 0x63, 0x4E, 0x62, 0x94, 0x63, 0x4E, 0x62, 0xB2, 0x62, 0xB2, 0x62, 0xD0, 0x63, 0x2E, 0x62, 0xD0, 0x63, 0x2E, 0x64, 0x4C, 0x63, 0x4E, 0x63, 0x34, 0x63, 0x34, 0x63, 0x34, 0x63, 0x4E, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x64, 0x2, 0x64, 0x2, 0x64, 0x2, 0x64, 0x2, 0x64, 0x2, 0x64, 0x2, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0xF8, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x63, 0x6C, 0x63, 0x6C, 0x63, 0x6C, 0x63, 0x6C, 0x63, 0x6C, 0x63, 0x6C, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x64, 0xE8, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0x6C, 0x63, 0x6C, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0x96, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0xF8, 0x63, 0xF8, 0x64, 0x2, 0x64, 0x2, 0x64, 0x10, 0x64, 0x10, 0x64, 0x10, 0x64, 0x32, 0x64, 0x32, 0x64, 0x4C, 0x64, 0x4C, 0x64, 0x4C, 0x64, 0x4C, 0x64, 0xC6, 0x64, 0xE8, 0x64, 0xE8, 0x65, 0xC, 0x65, 0x1E, 0x65, 0xC, 0x65, 0x6, 0x65, 0x24, 0x65, 0x6, 0x65, 0xC, 0x65, 0x1E, 0x65, 0x24, 0x0, 0x1, 0x3, 0x25, 0x0, 0x5, 0x0, 0x7, 0x0, 0xC, 0x0, 0xD, 0x0, 0x14, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2A, 0x0, 0x2B, 0x0, 0x2D, 0x0, 0x2E, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x39, 0x0, 0x3B, 0x0, 0x3C, 0x0, 0x3D, 0x0, 0x3E, 0x0, 0x3F, 0x0, 0x40, 0x0, 0x46, 0x0, 0x47, 0x0, 0x4A, 0x0, 0x4B, 0x0, 0x4D, 0x0, 0x50, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x57, 0x0, 0x59, 0x0, 0x5B, 0x0, 0x5C, 0x0, 0x5D, 0x0, 0x5E, 0x0, 0x60, 0x0, 0x8B, 0x0, 0x97, 0x0, 0x9A, 0x0, 0x9C, 0x0, 0x9D, 0x0, 0xA0, 0x0, 0xA1, 0x0, 0xA2, 0x0, 0xA5, 0x0, 0xA6, 0x0, 0xAE, 0x0, 0xB2, 0x0, 0xB3, 0x0, 0xB6, 0x0, 0xB8, 0x0, 0xC2, 0x0, 0xD8, 0x0, 0xED, 0x0, 0xEE, 0x0, 0xF2, 0x0, 0xF8, 0x0, 0xFA, 0x1, 0x2, 0x1, 0x3, 0x1, 0xE, 0x2, 0x27, 0x2, 0x29, 0x2, 0x2B, 0x2, 0x30, 0x2, 0x31, 0x2, 0x32, 0x2, 0x33, 0x2, 0x34, 0x2, 0x36, 0x2, 0x37, 0x2, 0x38, 0x2, 0x3A, 0x2, 0x3C, 0x2, 0x3D, 0x2, 0x3F, 0x2, 0x40, 0x2, 0x42, 0x2, 0x43, 0x2, 0x44, 0x2, 0x46, 0x2, 0x47, 0x2, 0x48, 0x2, 0x49, 0x2, 0x4A, 0x2, 0x4B, 0x2, 0x4C, 0x2, 0x4D, 0x2, 0x4E, 0x2, 0x55, 0x2, 0x56, 0x2, 0x60, 0x2, 0x62, 0x2, 0x64, 0x2, 0x65, 0x2, 0x66, 0x2, 0x67, 0x2, 0x68, 0x2, 0x6A, 0x2, 0x6B, 0x2, 0x6C, 0x2, 0x6D, 0x2, 0x6E, 0x2, 0x6F, 0x2, 0x70, 0x2, 0x71, 0x2, 0x72, 0x2, 0x73, 0x2, 0x74, 0x2, 0x76, 0x2, 0x77, 0x2, 0x78, 0x2, 0x79, 0x2, 0x7A, 0x2, 0x7B, 0x2, 0x7C, 0x2, 0x7D, 0x2, 0x7E, 0x2, 0x7F, 0x2, 0x80, 0x2, 0x81, 0x2, 0x82, 0x2, 0x83, 0x2, 0x84, 0x2, 0x85, 0x2, 0x87, 0x2, 0x8C, 0x2, 0x8D, 0x2, 0x8E, 0x2, 0x91, 0x2, 0x92, 0x2, 0x94, 0x2, 0x95, 0x2, 0x96, 0x2, 0x99, 0x2, 0x9A, 0x2, 0x9B, 0x2, 0xA0, 0x2, 0xA3, 0x2, 0xAE, 0x2, 0xAF, 0x2, 0xB0, 0x2, 0xB8, 0x2, 0xC5, 0x2, 0xC6, 0x2, 0xC7, 0x2, 0xCA, 0x2, 0xCB, 0x2, 0xCC, 0x2, 0xCE, 0x2, 0xD0, 0x2, 0xD2, 0x2, 0xDA, 0x2, 0xDB, 0x2, 0xEB, 0x2, 0xED, 0x2, 0xEF, 0x2, 0xF3, 0x2, 0xF4, 0x2, 0xF5, 0x3, 0x8, 0x3, 0x9, 0x3, 0xA, 0x3, 0xB, 0x3, 0xC, 0x3, 0xD, 0x3, 0xE, 0x3, 0x14, 0x3, 0x18, 0x3, 0x1A, 0x4, 0x2B, 0x4, 0x2D, 0x4, 0x34, 0x4, 0x62, 0x4, 0x63, 0x4, 0x65, 0x4, 0x66, 0x4, 0x67, 0x5, 0x59, 0x5, 0x5B, 0x5, 0x5D, 0x5, 0x5E, 0x5, 0x5F, 0x5, 0x61, 0x5, 0x64, 0x5, 0x66, 0x5, 0x6A, 0x5, 0x70, 0x5, 0xD9, 0x5, 0xDB, 0x5, 0xE5, 0x5, 0xE7, 0x5, 0xE8, 0x5, 0xEB, 0x5, 0xEC, 0x5, 0xEF, 0x5, 0xF0, 0x5, 0xF1, 0x5, 0xF9, 0x5, 0xFD, 0x5, 0xFE, 0x5, 0xFF, 0x6, 0x0, 0x6, 0x1, 0x6, 0x2, 0x6, 0x3, 0x6, 0x4, 0x6, 0x5, 0x6, 0x6, 0x6, 0x25, 0x6, 0x26, 0x6, 0x29, 0x6, 0x2A, 0x6, 0x2E, 0x6, 0x31, 0x6, 0x32, 0x6, 0x33, 0x6, 0x5F, 0x6, 0x6A, 0x6, 0x6C, 0x6, 0x70, 0x6, 0x71, 0x6, 0x72, 0x6, 0x73, 0x6, 0x75, 0x6, 0x76, 0x6, 0x78, 0x6, 0x7A, 0x6, 0x7C, 0x6, 0x86, 0x6, 0x87, 0x6, 0x88, 0x6, 0x89, 0x6, 0x8A, 0x6, 0x8B, 0x6, 0x8C, 0x6, 0x8D, 0x6, 0x96, 0x6, 0x97, 0x6, 0x9D, 0x6, 0x9F, 0x6, 0xBB, 0x6, 0xC7, 0x6, 0xC9, 0x6, 0xCD, 0x6, 0xCE, 0x6, 0xE1, 0x7, 0x54, 0x7, 0x56, 0x7, 0x57, 0x7, 0x59, 0x7, 0x5C, 0x7, 0x5D, 0x7, 0x67, 0x7, 0x68, 0x7, 0x69, 0x7, 0x7B, 0x7, 0x8A, 0x7, 0x8B, 0x7, 0x8C, 0x7, 0xAE, 0x7, 0xB1, 0x7, 0xCF, 0x7, 0xD1, 0x7, 0xD2, 0x8, 0xC8, 0x8, 0xC9, 0x8, 0xCB, 0x8, 0xCD, 0x8, 0xCE, 0x8, 0xCF, 0x8, 0xD0, 0x8, 0xD1, 0x8, 0xD2, 0x8, 0xD3, 0x8, 0xD4, 0x8, 0xD5, 0x8, 0xD6, 0x8, 0xD7, 0x8, 0xD8, 0x8, 0xD9, 0x8, 0xDA, 0x8, 0xDB, 0x8, 0xDC, 0x8, 0xDD, 0x8, 0xDE, 0x8, 0xDF, 0x8, 0xE0, 0x8, 0xE1, 0x8, 0xE2, 0x8, 0xE7, 0x8, 0xE8, 0x8, 0xE9, 0x8, 0xEA, 0x8, 0xEB, 0x8, 0xEC, 0x8, 0xED, 0x8, 0xEE, 0x8, 0xF0, 0x8, 0xF1, 0x8, 0xF2, 0x8, 0xF3, 0x8, 0xF8, 0x8, 0xF9, 0x8, 0xFA, 0x8, 0xFB, 0x8, 0xFC, 0x8, 0xFD, 0x9, 0x2, 0x9, 0x3, 0x9, 0x4, 0x9, 0x5, 0x9, 0x6, 0x9, 0x7, 0x9, 0x8, 0x9, 0x9, 0x9, 0xA, 0x9, 0xC, 0x9, 0xE, 0x9, 0x10, 0x9, 0x12, 0x9, 0x14, 0x9, 0x15, 0x9, 0x16, 0x9, 0x17, 0x9, 0x18, 0x9, 0x19, 0x9, 0x1A, 0x9, 0x1B, 0x9, 0x1C, 0x9, 0x1D, 0x9, 0x26, 0x9, 0x27, 0x9, 0x28, 0x9, 0x2A, 0x9, 0x2C, 0x9, 0x2E, 0x9, 0x30, 0x9, 0x35, 0x9, 0x37, 0x9, 0x39, 0x9, 0x3B, 0x9, 0x3D, 0x9, 0x3F, 0x9, 0x40, 0x9, 0x41, 0x9, 0x42, 0x9, 0x43, 0x9, 0x44, 0x9, 0x45, 0x9, 0x46, 0x9, 0x47, 0x9, 0x48, 0x9, 0x49, 0x9, 0x4A, 0x9, 0x4B, 0x9, 0x4D, 0x9, 0x4F, 0x9, 0x51, 0x9, 0x5C, 0x9, 0x5E, 0x9, 0x60, 0x9, 0x6E, 0x9, 0x70, 0x9, 0x71, 0x9, 0x72, 0x9, 0x73, 0x9, 0x75, 0x9, 0x77, 0x9, 0x7D, 0x9, 0x7E, 0x9, 0x7F, 0x9, 0x80, 0x9, 0x81, 0x9, 0x82, 0x9, 0x83, 0x9, 0x84, 0x9, 0x85, 0x9, 0x86, 0x9, 0x91, 0x9, 0x92, 0x9, 0x93, 0x9, 0x94, 0x9, 0x95, 0x9, 0x9B, 0x9, 0x9C, 0x9, 0x9D, 0x9, 0xA2, 0x9, 0xB3, 0x9, 0xB4, 0x9, 0xB5, 0x9, 0xB6, 0x9, 0xB7, 0x9, 0xBB, 0x9, 0xBC, 0x9, 0xBD, 0x9, 0xBE, 0x9, 0xC7, 0x9, 0xD5, 0x9, 0xD6, 0x9, 0xD7, 0x9, 0xD8, 0x9, 0xD9, 0x9, 0xDA, 0x9, 0xDD, 0x9, 0xDE, 0x9, 0xDF, 0x9, 0xE0, 0x9, 0xE1, 0x9, 0xE2, 0x9, 0xE3, 0x9, 0xE4, 0x9, 0xE5, 0x9, 0xE6, 0x9, 0xE7, 0x9, 0xE8, 0x9, 0xE9, 0x9, 0xEA, 0x9, 0xEB, 0x9, 0xEC, 0x9, 0xEF, 0x9, 0xF3, 0x9, 0xF5, 0x9, 0xF9, 0x9, 0xFC, 0x9, 0xFD, 0x9, 0xFF, 0xA, 0x0, 0xA, 0x2, 0xA, 0x3, 0xA, 0x4, 0xA, 0x5, 0xA, 0x6, 0xA, 0x7, 0xA, 0x8, 0xA, 0xA, 0xA, 0xB, 0xA, 0xC, 0xA, 0xE, 0xA, 0xF, 0xA, 0x10, 0xA, 0x11, 0xA, 0x12, 0xA, 0x13, 0xA, 0x15, 0xA, 0x16, 0xA, 0x18, 0xA, 0x19, 0xA, 0x1A, 0xA, 0x1B, 0xA, 0x21, 0xA, 0x22, 0xA, 0x24, 0xA, 0x26, 0xA, 0x28, 0xA, 0x29, 0xA, 0x2A, 0xA, 0x2B, 0xA, 0x2E, 0xA, 0x2F, 0xA, 0x30, 0xA, 0x31, 0xA, 0x32, 0xA, 0x33, 0xA, 0x35, 0xA, 0x39, 0xA, 0x3A, 0xA, 0x3F, 0xA, 0x41, 0xA, 0x42, 0xA, 0x43, 0xA, 0x44, 0xA, 0x45, 0xA, 0x46, 0xA, 0x47, 0xA, 0x48, 0xA, 0x49, 0xA, 0x4A, 0xA, 0x4D, 0xA, 0x4E, 0xA, 0x50, 0xA, 0x51, 0xA, 0x52, 0xA, 0x53, 0xA, 0x5A, 0xA, 0x5B, 0xA, 0x5E, 0xA, 0x60, 0xA, 0x62, 0xA, 0x63, 0xA, 0x64, 0xA, 0x65, 0xA, 0x66, 0xA, 0x67, 0xA, 0x68, 0xA, 0x6E, 0xA, 0x6F, 0xA, 0x70, 0xA, 0x71, 0xA, 0x72, 0xA, 0x73, 0xA, 0x74, 0xA, 0x75, 0xA, 0x76, 0xA, 0x77, 0xA, 0x78, 0xA, 0x79, 0xA, 0x7A, 0xA, 0x7B, 0xA, 0x7C, 0xA, 0x7D, 0xA, 0x7E, 0xA, 0x7F, 0xA, 0x80, 0xA, 0x81, 0xA, 0x82, 0xA, 0x83, 0xA, 0x84, 0xA, 0x85, 0xA, 0x86, 0xA, 0x87, 0xA, 0x88, 0xA, 0x89, 0xA, 0x8A, 0xA, 0x8B, 0xA, 0x8C, 0xA, 0x8D, 0xA, 0x8E, 0xA, 0x8F, 0xA, 0x90, 0xA, 0x91, 0xA, 0x92, 0xA, 0x93, 0xA, 0x94, 0xA, 0x95, 0xA, 0x96, 0xA, 0x98, 0xA, 0x9A, 0xA, 0x9B, 0xA, 0x9C, 0xA, 0x9D, 0xA, 0x9E, 0xA, 0x9F, 0xA, 0xA0, 0xA, 0xA1, 0xA, 0xA2, 0xA, 0xA3, 0xA, 0xA4, 0xA, 0xA5, 0xA, 0xA6, 0xA, 0xA7, 0xA, 0xAF, 0xA, 0xC0, 0xA, 0xC1, 0xA, 0xC2, 0xA, 0xC3, 0xA, 0xC4, 0xA, 0xC5, 0xA, 0xC7, 0xA, 0xCB, 0xA, 0xCC, 0xA, 0xCF, 0xA, 0xD1, 0xA, 0xD2, 0xA, 0xD4, 0xA, 0xD6, 0xA, 0xE6, 0xA, 0xEE, 0xA, 0xEF, 0xA, 0xF0, 0xA, 0xF2, 0xA, 0xF3, 0xA, 0xFF, 0xB, 0x0, 0xB, 0x1, 0xB, 0x2, 0xB, 0x4, 0xB, 0x9, 0xB, 0xA, 0xB, 0xB, 0xB, 0xC, 0xB, 0xD, 0xB, 0x12, 0xB, 0x13, 0xB, 0x14, 0xB, 0x15, 0xB, 0x16, 0xB, 0x17, 0xB, 0x18, 0xB, 0x1A, 0xB, 0x1C, 0xB, 0x1E, 0xB, 0x20, 0xB, 0x21, 0xB, 0x22, 0xB, 0x23, 0xB, 0x25, 0xB, 0x27, 0xB, 0x2C, 0xB, 0x2E, 0xB, 0x2F, 0xB, 0x30, 0xB, 0x32, 0xB, 0x33, 0xB, 0x34, 0xB, 0x35, 0xB, 0x36, 0xB, 0x37, 0xB, 0x38, 0xB, 0x39, 0xB, 0x3B, 0xB, 0x3C, 0xB, 0x46, 0xB, 0x47, 0xB, 0x48, 0xB, 0x4B, 0xB, 0x4D, 0xB, 0x4E, 0xB, 0x4F, 0xB, 0x50, 0xB, 0x51, 0xB, 0x52, 0xB, 0x53, 0xB, 0x55, 0xB, 0x57, 0xB, 0x59, 0xB, 0x5B, 0xB, 0x5D, 0xB, 0x5F, 0xB, 0x60, 0xB, 0x61, 0xB, 0x62, 0xB, 0x63, 0xB, 0x64, 0xB, 0x65, 0xB, 0x66, 0xB, 0x67, 0xB, 0x68, 0xB, 0x6D, 0xB, 0x6E, 0xB, 0x6F, 0xB, 0x70, 0xB, 0x71, 0xB, 0x72, 0xB, 0x73, 0xB, 0x74, 0xB, 0x75, 0xB, 0x77, 0xB, 0x79, 0xB, 0x7B, 0xB, 0x7D, 0xB, 0x7F, 0xB, 0x81, 0xB, 0x83, 0xB, 0x84, 0xB, 0x85, 0xB, 0x86, 0xB, 0x87, 0xB, 0x88, 0xB, 0x89, 0xB, 0x8A, 0xB, 0x8B, 0xB, 0x8C, 0xB, 0x8D, 0xB, 0x8E, 0xB, 0x8F, 0xB, 0x90, 0xB, 0x91, 0xB, 0x92, 0xB, 0x93, 0xB, 0x94, 0xB, 0x95, 0xB, 0x96, 0xB, 0x97, 0xB, 0x98, 0xB, 0x99, 0xB, 0x9A, 0xB, 0x9C, 0xB, 0x9E, 0xB, 0xA0, 0xB, 0xA2, 0xB, 0xAD, 0xB, 0xAF, 0xB, 0xB1, 0xB, 0xB3, 0xB, 0xBF, 0xB, 0xC0, 0xB, 0xC1, 0xB, 0xC2, 0xB, 0xC3, 0xB, 0xC5, 0xB, 0xC7, 0xB, 0xC8, 0xB, 0xC9, 0xB, 0xCA, 0xB, 0xCB, 0xB, 0xCC, 0xB, 0xCD, 0xB, 0xCF, 0xB, 0xD1, 0xB, 0xD6, 0xB, 0xE0, 0xB, 0xE1, 0xB, 0xE2, 0xB, 0xE3, 0xB, 0xE4, 0xB, 0xE5, 0xB, 0xE6, 0xB, 0xE7, 0xB, 0xEE, 0xB, 0xEF, 0xB, 0xF0, 0xB, 0xF1, 0xB, 0xF2, 0xB, 0xF3, 0xB, 0xF4, 0xB, 0xF5, 0xB, 0xF6, 0xB, 0xF7, 0xB, 0xF8, 0xB, 0xF9, 0xB, 0xFA, 0xB, 0xFB, 0xB, 0xFC, 0xB, 0xFD, 0xB, 0xFE, 0xB, 0xFF, 0xC, 0x0, 0xC, 0x1, 0xC, 0x2, 0xC, 0x3, 0xC, 0x14, 0xC, 0x15, 0xC, 0x16, 0xC, 0x17, 0xC, 0x18, 0xC, 0x19, 0xC, 0x1A, 0xC, 0x1B, 0xC, 0x1C, 0xC, 0x1D, 0xC, 0x1E, 0xC, 0x1F, 0xC, 0x40, 0xC, 0x41, 0xC, 0x44, 0xC, 0x45, 0xC, 0x52, 0xC, 0x53, 0xC, 0x54, 0xC, 0x55, 0xC, 0x56, 0xC, 0x57, 0xC, 0x58, 0xC, 0x59, 0xC, 0x62, 0xC, 0x63, 0xC, 0x64, 0xC, 0x65, 0xC, 0x66, 0xC, 0x67, 0xC, 0x68, 0xC, 0x69, 0xC, 0x81, 0xC, 0x82, 0xC, 0x83, 0xC, 0x84, 0xC, 0x85, 0xC, 0x86, 0xC, 0x87, 0xC, 0x88, 0xC, 0x89, 0xC, 0x8A, 0xC, 0x8B, 0xC, 0x8C, 0xC, 0x8D, 0xC, 0x8E, 0xC, 0x8F, 0xC, 0x9E, 0xC, 0x9F, 0xC, 0xA2, 0xC, 0xA3, 0xC, 0xA4, 0xC, 0xA5, 0xC, 0xA6, 0xC, 0xAC, 0xC, 0xAD, 0xC, 0xB7, 0xC, 0xBB, 0xC, 0xBE, 0xC, 0xC4, 0xC, 0xC9, 0xC, 0xD4, 0xC, 0xD6, 0xC, 0xDD, 0xC, 0xE1, 0x0, 0x12, 0x0, 0x39, 0xFF, 0xCE, 0x0, 0xC2, 0xFF, 0xCE, 0x2, 0x68, 0xFF, 0xCE, 0x2, 0x6C, 0xFF, 0xCE, 0x2, 0xD0, 0xFF, 0xCE, 0x2, 0xDC, 0xFF, 0xCE, 0x6, 0x23, 0xFF, 0xCE, 0x6, 0x25, 0xFF, 0xCE, 0x6, 0x29, 0xFF, 0xCE, 0x9, 0x5C, 0xFF, 0xCE, 0x9, 0x5E, 0xFF, 0xCE, 0x9, 0x60, 0xFF, 0xCE, 0xA, 0x10, 0xFF, 0xCE, 0xA, 0xC7, 0xFF, 0xCE, 0xB, 0xAD, 0xFF, 0xCE, 0xB, 0xAF, 0xFF, 0xCE, 0xB, 0xB1, 0xFF, 0xCE, 0xB, 0xB3, 0xFF, 0xCE, 0x0, 0x20, 0x0, 0x3B, 0x0, 0x16, 0x0, 0x3C, 0x0, 0x20, 0x0, 0x3E, 0x0, 0x18, 0x1, 0x3, 0x0, 0x18, 0x2, 0xAF, 0x0, 0x16, 0x5, 0x68, 0x0, 0x20, 0x6, 0x96, 0x0, 0x16, 0x8, 0xE7, 0x0, 0x18, 0x9, 0x6E, 0x0, 0x20, 0x9, 0x70, 0x0, 0x18, 0x9, 0x72, 0x0, 0x18, 0x9, 0xDA, 0x0, 0x18, 0x9, 0xE9, 0x0, 0x18, 0x9, 0xEC, 0x0, 0x18, 0xA, 0x22, 0x0, 0x20, 0xA, 0x24, 0x0, 0x20, 0xA, 0x26, 0x0, 0x20, 0xA, 0x28, 0x0, 0x18, 0xA, 0x39, 0x0, 0x16, 0xA, 0x41, 0x0, 0x18, 0xA, 0xC0, 0x0, 0x18, 0xA, 0xC2, 0x0, 0x18, 0xA, 0xC4, 0x0, 0x18, 0xA, 0xD6, 0x0, 0x18, 0xB, 0x4B, 0x0, 0x20, 0xB, 0xBF, 0x0, 0x16, 0xB, 0xC1, 0x0, 0x16, 0xB, 0xC3, 0x0, 0x20, 0xB, 0xC5, 0x0, 0x20, 0xB, 0xCB, 0x0, 0x18, 0xC, 0xA2, 0x0, 0x18, 0xC, 0xA3, 0x0, 0x18, 0x0, 0x1, 0x0, 0x14, 0xFF, 0x10, 0x1, 0x82, 0x0, 0x11, 0xFE, 0xD6, 0x0, 0x13, 0xFE, 0xD6, 0x0, 0x26, 0xFF, 0x3E, 0x0, 0x2F, 0xFF, 0x17, 0x0, 0x39, 0x0, 0x14, 0x0, 0x3B, 0x0, 0x4, 0x0, 0x46, 0xFF, 0xCE, 0x0, 0x48, 0xFF, 0xDC, 0x0, 0x49, 0xFF, 0xDC, 0x0, 0x4A, 0xFF, 0xDC, 0x0, 0x4C, 0xFF, 0xDC, 0x0, 0x54, 0xFF, 0xDB, 0x0, 0x56, 0xFF, 0xDC, 0x0, 0x57, 0xFF, 0xE4, 0x0, 0x5A, 0xFF, 0xE8, 0x0, 0x5B, 0xFF, 0xE6, 0x0, 0x5E, 0xFF, 0xE6, 0x0, 0x95, 0xFF, 0xDC, 0x0, 0x9F, 0xFF, 0xDC, 0x0, 0xB5, 0xFF, 0xDC, 0x0, 0xC2, 0x0, 0x14, 0x0, 0xC4, 0xFF, 0xE8, 0x0, 0xDA, 0xFF, 0xDC, 0x0, 0xDC, 0xFF, 0xDC, 0x0, 0xE4, 0xFF, 0xDC, 0x0, 0xFA, 0xFF, 0x3E, 0x1, 0x0, 0xFF, 0xDC, 0x2, 0x2A, 0xFF, 0xDC, 0x2, 0x31, 0xFF, 0x3E, 0x2, 0x33, 0xFF, 0x3E, 0x2, 0x3A, 0xFF, 0xDC, 0x2, 0x3C, 0xFF, 0xE6, 0x2, 0x47, 0xFF, 0xDC, 0x2, 0x48, 0xFF, 0xDC, 0x2, 0x4A, 0xFF, 0xE8, 0x2, 0x56, 0xFF, 0xDB, 0x2, 0x58, 0xFF, 0xDC, 0x2, 0x61, 0xFF, 0xDC, 0x2, 0x68, 0x0, 0x14, 0x2, 0x6C, 0x0, 0x14, 0x2, 0x8D, 0xFF, 0xDC, 0x2, 0x99, 0xFF, 0xDC, 0x2, 0xA3, 0xFF, 0x3E, 0x2, 0xAE, 0xFF, 0xDB, 0x2, 0xAF, 0x0, 0x4, 0x2, 0xB0, 0xFF, 0xE6, 0x2, 0xB4, 0xFF, 0xDC, 0x2, 0xB8, 0xFF, 0xDC, 0x2, 0xD0, 0x0, 0x14, 0x2, 0xD9, 0xFF, 0xDC, 0x2, 0xDC, 0x0, 0x14, 0x2, 0xF7, 0xFF, 0xDC, 0x2, 0xF8, 0xFF, 0xDC, 0x3, 0x2, 0xFF, 0xDC, 0x4, 0x64, 0xFE, 0xD6, 0x4, 0x68, 0xFE, 0xD6, 0x4, 0x6F, 0xFE, 0xD6, 0x4, 0x70, 0xFE, 0xD6, 0x5, 0x5B, 0xFF, 0xCE, 0x5, 0x67, 0xFF, 0xE6, 0x5, 0x6E, 0xFF, 0xDC, 0x5, 0x70, 0xFF, 0xDB, 0x5, 0xEE, 0xFF, 0xDB, 0x5, 0xF1, 0xFF, 0x3E, 0x6, 0x2, 0xFF, 0xDB, 0x6, 0x4, 0xFF, 0xDB, 0x6, 0x6, 0xFF, 0xDB, 0x6, 0x23, 0x0, 0x14, 0x6, 0x25, 0x0, 0x14, 0x6, 0x29, 0x0, 0x14, 0x6, 0x32, 0xFF, 0xDB, 0x6, 0x6A, 0xFF, 0x3E, 0x6, 0x6B, 0xFF, 0xCE, 0x6, 0x6C, 0xFF, 0x3E, 0x6, 0x6D, 0xFF, 0xCE, 0x6, 0x6F, 0xFF, 0xCE, 0x6, 0x70, 0xFF, 0x3E, 0x6, 0x71, 0xFF, 0xCE, 0x6, 0x72, 0xFF, 0x3E, 0x6, 0x73, 0xFF, 0xCE, 0x6, 0x74, 0xFF, 0x3E, 0x6, 0x75, 0xFF, 0xCE, 0x6, 0x85, 0xFF, 0xDB, 0x6, 0x87, 0xFF, 0xDB, 0x6, 0x8F, 0xFF, 0xDC, 0x6, 0x91, 0xFF, 0xDC, 0x6, 0x96, 0x0, 0x4, 0x6, 0xA9, 0xFF, 0xDC, 0x6, 0xCB, 0xFF, 0xDC, 0x6, 0xF7, 0xFF, 0xDC, 0x7, 0x67, 0xFF, 0xA5, 0x7, 0x69, 0xFF, 0xA5, 0x7, 0xB1, 0xFF, 0xA5, 0x8, 0xCD, 0xFF, 0x3E, 0x8, 0xCE, 0xFF, 0x3E, 0x8, 0xCF, 0xFF, 0x3E, 0x8, 0xD0, 0xFF, 0x3E, 0x8, 0xD1, 0xFF, 0x3E, 0x8, 0xD2, 0xFF, 0x3E, 0x8, 0xD3, 0xFF, 0x3E, 0x8, 0xE8, 0xFF, 0xCE, 0x8, 0xE9, 0xFF, 0xCE, 0x8, 0xEA, 0xFF, 0xCE, 0x8, 0xEB, 0xFF, 0xCE, 0x8, 0xEC, 0xFF, 0xCE, 0x8, 0xED, 0xFF, 0xCE, 0x8, 0xEE, 0xFF, 0xCE, 0x8, 0xEF, 0xFF, 0xDC, 0x8, 0xF0, 0xFF, 0xDC, 0x8, 0xF1, 0xFF, 0xDC, 0x8, 0xF2, 0xFF, 0xDC, 0x8, 0xF3, 0xFF, 0xDC, 0x8, 0xF9, 0xFF, 0xDB, 0x8, 0xFA, 0xFF, 0xDB, 0x8, 0xFB, 0xFF, 0xDB, 0x8, 0xFC, 0xFF, 0xDB, 0x8, 0xFD, 0xFF, 0xDB, 0x8, 0xFE, 0xFF, 0xE8, 0x8, 0xFF, 0xFF, 0xE8, 0x9, 0x0, 0xFF, 0xE8, 0x9, 0x1, 0xFF, 0xE8, 0x9, 0x2, 0xFF, 0xE6, 0x9, 0x3, 0xFF, 0xE6, 0x9, 0x4, 0xFF, 0x3E, 0x9, 0x5, 0xFF, 0xCE, 0x9, 0x6, 0xFF, 0x3E, 0x9, 0x7, 0xFF, 0xCE, 0x9, 0x8, 0xFF, 0x3E, 0x9, 0x9, 0xFF, 0xCE, 0x9, 0xB, 0xFF, 0xDC, 0x9, 0xD, 0xFF, 0xDC, 0x9, 0xF, 0xFF, 0xDC, 0x9, 0x11, 0xFF, 0xDC, 0x9, 0x13, 0xFF, 0xDC, 0x9, 0x15, 0xFF, 0xDC, 0x9, 0x17, 0xFF, 0xDC, 0x9, 0x19, 0xFF, 0xDC, 0x9, 0x1B, 0xFF, 0xDC, 0x9, 0x1D, 0xFF, 0xDC, 0x9, 0x1F, 0xFF, 0xDC, 0x9, 0x21, 0xFF, 0xDC, 0x9, 0x23, 0xFF, 0xDC, 0x9, 0x25, 0xFF, 0xDC, 0x9, 0x33, 0xFF, 0x17, 0x9, 0x47, 0xFF, 0xDB, 0x9, 0x49, 0xFF, 0xDB, 0x9, 0x4B, 0xFF, 0xDB, 0x9, 0x5C, 0x0, 0x14, 0x9, 0x5E, 0x0, 0x14, 0x9, 0x60, 0x0, 0x14, 0x9, 0x63, 0xFF, 0xE8, 0x9, 0x65, 0xFF, 0xE8, 0x9, 0x67, 0xFF, 0xE8, 0x9, 0x69, 0xFF, 0xE8, 0x9, 0x6B, 0xFF, 0xE8, 0x9, 0x6D, 0xFF, 0xE8, 0x9, 0x71, 0xFF, 0xE6, 0x9, 0x80, 0xFF, 0xA5, 0x9, 0x81, 0xFF, 0xA5, 0x9, 0x82, 0xFF, 0xA5, 0x9, 0x83, 0xFF, 0xA5, 0x9, 0x84, 0xFF, 0xA5, 0x9, 0x85, 0xFF, 0xA5, 0x9, 0x86, 0xFF, 0xA5, 0x9, 0x9B, 0xFF, 0xA5, 0x9, 0x9C, 0xFF, 0xA5, 0x9, 0x9D, 0xFF, 0xA5, 0x9, 0xD5, 0xFF, 0x3E, 0x9, 0xDD, 0xFF, 0x3E, 0x9, 0xED, 0xFF, 0xDC, 0x9, 0xF1, 0xFF, 0xE8, 0x9, 0xF3, 0xFF, 0xDB, 0x9, 0xF5, 0xFF, 0xE6, 0x9, 0xF8, 0xFF, 0xE8, 0x9, 0xF9, 0xFF, 0xDB, 0x9, 0xFA, 0xFF, 0xE8, 0xA, 0x1, 0xFF, 0x17, 0xA, 0x5, 0xFF, 0x3E, 0xA, 0x10, 0x0, 0x14, 0xA, 0x12, 0xFF, 0xCE, 0xA, 0x13, 0xFF, 0xDC, 0xA, 0x15, 0xFF, 0xDB, 0xA, 0x17, 0xFF, 0xDC, 0xA, 0x18, 0xFF, 0xE6, 0xA, 0x1A, 0xFF, 0xDC, 0xA, 0x21, 0xFF, 0xE6, 0xA, 0x29, 0xFF, 0xE6, 0xA, 0x31, 0xFF, 0x3E, 0xA, 0x32, 0xFF, 0xCE, 0xA, 0x35, 0xFF, 0xDC, 0xA, 0x39, 0x0, 0x4, 0xA, 0x3A, 0xFF, 0xE6, 0xA, 0x3B, 0xFF, 0xDC, 0xA, 0x40, 0xFF, 0xDC, 0xA, 0x42, 0xFF, 0xE6, 0xA, 0x47, 0xFF, 0x3E, 0xA, 0x48, 0xFF, 0xCE, 0xA, 0x49, 0xFF, 0x3E, 0xA, 0x4A, 0xFF, 0xCE, 0xA, 0x4E, 0xFF, 0xDC, 0xA, 0x50, 0xFF, 0xDC, 0xA, 0x51, 0xFF, 0xDC, 0xA, 0x5B, 0xFF, 0xDB, 0xA, 0x5D, 0xFF, 0xDC, 0xA, 0x60, 0xFF, 0xDB, 0xA, 0x64, 0xFF, 0xE6, 0xA, 0x66, 0xFF, 0xE6, 0xA, 0x68, 0xFF, 0xE6, 0xA, 0x6D, 0xFF, 0xDC, 0xA, 0x6E, 0xFF, 0x3E, 0xA, 0x6F, 0xFF, 0xCE, 0xA, 0x70, 0xFF, 0x3E, 0xA, 0x71, 0xFF, 0xCE, 0xA, 0x72, 0xFF, 0x3E, 0xA, 0x73, 0xFF, 0xCE, 0xA, 0x74, 0xFF, 0x3E, 0xA, 0x75, 0xFF, 0xCE, 0xA, 0x76, 0xFF, 0x3E, 0xA, 0x77, 0xFF, 0xCE, 0xA, 0x78, 0xFF, 0x3E, 0xA, 0x79, 0xFF, 0xCE, 0xA, 0x7A, 0xFF, 0x3E, 0xA, 0x7B, 0xFF, 0xCE, 0xA, 0x7C, 0xFF, 0x3E, 0xA, 0x7D, 0xFF, 0xCE, 0xA, 0x7E, 0xFF, 0x3E, 0xA, 0x7F, 0xFF, 0xCE, 0xA, 0x80, 0xFF, 0x3E, 0xA, 0x81, 0xFF, 0xCE, 0xA, 0x82, 0xFF, 0x3E, 0xA, 0x83, 0xFF, 0xCE, 0xA, 0x84, 0xFF, 0x3E, 0xA, 0x85, 0xFF, 0xCE, 0xA, 0x87, 0xFF, 0xDC, 0xA, 0x89, 0xFF, 0xDC, 0xA, 0x8B, 0xFF, 0xDC, 0xA, 0x8D, 0xFF, 0xDC, 0xA, 0x8F, 0xFF, 0xDC, 0xA, 0x91, 0xFF, 0xDC, 0xA, 0x93, 0xFF, 0xDC, 0xA, 0x95, 0xFF, 0xDC, 0xA, 0x9B, 0xFF, 0xDB, 0xA, 0x9D, 0xFF, 0xDB, 0xA, 0x9F, 0xFF, 0xDB, 0xA, 0xA1, 0xFF, 0xDB, 0xA, 0xA3, 0xFF, 0xDB, 0xA, 0xA5, 0xFF, 0xDB, 0xA, 0xA7, 0xFF, 0xDB, 0xA, 0xA9, 0xFF, 0xDC, 0xA, 0xAB, 0xFF, 0xDC, 0xA, 0xAD, 0xFF, 0xDC, 0xA, 0xAF, 0xFF, 0xDB, 0xA, 0xB1, 0xFF, 0xDC, 0xA, 0xB3, 0xFF, 0xE8, 0xA, 0xB5, 0xFF, 0xE8, 0xA, 0xB7, 0xFF, 0xE8, 0xA, 0xB9, 0xFF, 0xE8, 0xA, 0xBB, 0xFF, 0xE8, 0xA, 0xBD, 0xFF, 0xE8, 0xA, 0xBF, 0xFF, 0xE8, 0xA, 0xC1, 0xFF, 0xE6, 0xA, 0xC3, 0xFF, 0xE6, 0xA, 0xC5, 0xFF, 0xE6, 0xA, 0xC7, 0x0, 0x14, 0xA, 0xEE, 0xFF, 0x3E, 0xA, 0xEF, 0xFF, 0xCE, 0xA, 0xF3, 0xFF, 0xDB, 0xA, 0xF5, 0xFF, 0xE8, 0xA, 0xF7, 0xFF, 0xE8, 0xA, 0xF9, 0xFF, 0xE8, 0xA, 0xFB, 0xFF, 0xE8, 0xA, 0xFD, 0xFF, 0xE8, 0xA, 0xFE, 0xFF, 0xDC, 0xA, 0xFF, 0xFF, 0x3E, 0xB, 0x0, 0xFF, 0xCE, 0xB, 0x1, 0xFF, 0x3E, 0xB, 0x2, 0xFF, 0xCE, 0xB, 0x4, 0xFF, 0xCE, 0xB, 0x6, 0xFF, 0xDC, 0xB, 0xA, 0xFF, 0xDB, 0xB, 0xC, 0xFF, 0xDB, 0xB, 0xF, 0xFF, 0xDC, 0xB, 0x14, 0xFF, 0x3E, 0xB, 0x15, 0xFF, 0xCE, 0xB, 0x16, 0xFF, 0x3E, 0xB, 0x17, 0xFF, 0xCE, 0xB, 0x19, 0xFF, 0xDC, 0xB, 0x1B, 0xFF, 0xDC, 0xB, 0x21, 0xFF, 0xDB, 0xB, 0x23, 0xFF, 0xDB, 0xB, 0x29, 0xFF, 0xE8, 0xB, 0x2B, 0xFF, 0xE8, 0xB, 0x2E, 0xFF, 0x3E, 0xB, 0x2F, 0xFF, 0xCE, 0xB, 0x33, 0xFF, 0xDB, 0xB, 0x35, 0xFF, 0xDB, 0xB, 0x37, 0xFF, 0xDB, 0xB, 0x39, 0xFF, 0xDB, 0xB, 0x3B, 0xFF, 0xE6, 0xB, 0x3C, 0xFF, 0xDB, 0xB, 0x3F, 0xFF, 0x17, 0xB, 0x42, 0xFF, 0xDC, 0xB, 0x4A, 0xFF, 0xDC, 0xB, 0x54, 0xFF, 0xDC, 0xB, 0x56, 0xFF, 0xDC, 0xB, 0x58, 0xFF, 0xDC, 0xB, 0x5A, 0xFF, 0xDC, 0xB, 0x5C, 0xFF, 0xDC, 0xB, 0x5E, 0xFF, 0xDC, 0xB, 0x60, 0xFF, 0xDC, 0xB, 0x62, 0xFF, 0xDC, 0xB, 0x64, 0xFF, 0xDC, 0xB, 0x66, 0xFF, 0xDC, 0xB, 0x68, 0xFF, 0xDC, 0xB, 0x6C, 0xFF, 0xDC, 0xB, 0x90, 0xFF, 0xDB, 0xB, 0x92, 0xFF, 0xDB, 0xB, 0x94, 0xFF, 0xDB, 0xB, 0x96, 0xFF, 0xDB, 0xB, 0xAD, 0x0, 0x14, 0xB, 0xAF, 0x0, 0x14, 0xB, 0xB1, 0x0, 0x14, 0xB, 0xB3, 0x0, 0x14, 0xB, 0xB6, 0xFF, 0xE8, 0xB, 0xB8, 0xFF, 0xE8, 0xB, 0xBA, 0xFF, 0xE8, 0xB, 0xBC, 0xFF, 0xE8, 0xB, 0xBE, 0xFF, 0xE8, 0xB, 0xBF, 0x0, 0x4, 0xB, 0xC0, 0xFF, 0xE6, 0xB, 0xC1, 0x0, 0x4, 0xB, 0xC2, 0xFF, 0xE6, 0xB, 0xCC, 0xFF, 0xE6, 0xB, 0xD6, 0xFF, 0xE6, 0xB, 0xD7, 0xFF, 0xCE, 0xB, 0xD8, 0xFF, 0xDC, 0xB, 0xD9, 0xFF, 0xDC, 0xB, 0xDA, 0xFF, 0xDC, 0xB, 0xDB, 0xFF, 0xDC, 0xB, 0xDC, 0xFF, 0xDC, 0xB, 0xDD, 0xFF, 0xDC, 0xB, 0xDE, 0xFF, 0xDC, 0xB, 0xDF, 0xFF, 0xDC, 0xC, 0x14, 0xFF, 0xDB, 0xC, 0x15, 0xFF, 0xDB, 0xC, 0x16, 0xFF, 0xDB, 0xC, 0x17, 0xFF, 0xDB, 0xC, 0x18, 0xFF, 0xDB, 0xC, 0x19, 0xFF, 0xDB, 0xC, 0x20, 0xFF, 0xE8, 0xC, 0x21, 0xFF, 0xE8, 0xC, 0x22, 0xFF, 0xE8, 0xC, 0x23, 0xFF, 0xE8, 0xC, 0x24, 0xFF, 0xE8, 0xC, 0x25, 0xFF, 0xE8, 0xC, 0x26, 0xFF, 0xE8, 0xC, 0x27, 0xFF, 0xE8, 0xC, 0x44, 0xFF, 0xDB, 0xC, 0x45, 0xFF, 0xDB, 0xC, 0x46, 0xFF, 0xE8, 0xC, 0x47, 0xFF, 0xE8, 0xC, 0x4A, 0xFF, 0xDC, 0xC, 0x4B, 0xFF, 0xDC, 0xC, 0x4C, 0xFF, 0xDC, 0xC, 0x4D, 0xFF, 0xDC, 0xC, 0x4E, 0xFF, 0xDC, 0xC, 0x4F, 0xFF, 0xDC, 0xC, 0x50, 0xFF, 0xDC, 0xC, 0x51, 0xFF, 0xDC, 0xC, 0x7A, 0xFF, 0xDC, 0xC, 0x7B, 0xFF, 0xDC, 0xC, 0x7C, 0xFF, 0xDC, 0xC, 0x7D, 0xFF, 0xDC, 0xC, 0x7E, 0xFF, 0xDC, 0xC, 0x7F, 0xFF, 0xDC, 0xC, 0x80, 0xFF, 0xDC, 0xC, 0x81, 0xFF, 0x3E, 0xC, 0x82, 0xFF, 0x3E, 0xC, 0x85, 0xFF, 0x3E, 0xC, 0x9A, 0xFF, 0xE8, 0xC, 0x9B, 0xFF, 0xE8, 0xC, 0x9C, 0xFF, 0xE8, 0xC, 0x9D, 0xFF, 0xE8, 0xC, 0xB7, 0xFF, 0xA5, 0xC, 0xBE, 0xFF, 0xA5, 0xC, 0xD6, 0xFF, 0xA5, 0x0, 0x42, 0x0, 0x39, 0xFF, 0xDC, 0x0, 0x3B, 0xFF, 0xE2, 0x0, 0x3C, 0xFF, 0xEA, 0x0, 0x3E, 0xFF, 0xCC, 0x0, 0xC2, 0xFF, 0xDC, 0x1, 0x3, 0xFF, 0xCC, 0x2, 0x68, 0xFF, 0xDC, 0x2, 0x6C, 0xFF, 0xDC, 0x2, 0xAF, 0xFF, 0xE2, 0x2, 0xD0, 0xFF, 0xDC, 0x2, 0xDC, 0xFF, 0xDC, 0x5, 0x68, 0xFF, 0xEA, 0x6, 0x23, 0xFF, 0xDC, 0x6, 0x25, 0xFF, 0xDC, 0x6, 0x29, 0xFF, 0xDC, 0x6, 0x96, 0xFF, 0xE2, 0x7, 0x67, 0x0, 0xF, 0x7, 0x69, 0x0, 0xF, 0x7, 0xB1, 0x0, 0xF, 0x8, 0xE7, 0xFF, 0xCC, 0x9, 0x5C, 0xFF, 0xDC, 0x9, 0x5E, 0xFF, 0xDC, 0x9, 0x60, 0xFF, 0xDC, 0x9, 0x6E, 0xFF, 0xEA, 0x9, 0x70, 0xFF, 0xCC, 0x9, 0x72, 0xFF, 0xCC, 0x9, 0x80, 0x0, 0xF, 0x9, 0x81, 0x0, 0xF, 0x9, 0x82, 0x0, 0xF, 0x9, 0x83, 0x0, 0xF, 0x9, 0x84, 0x0, 0xF, 0x9, 0x85, 0x0, 0xF, 0x9, 0x86, 0x0, 0xF, 0x9, 0x9B, 0x0, 0xF, 0x9, 0x9C, 0x0, 0xF, 0x9, 0x9D, 0x0, 0xF, 0x9, 0xDA, 0xFF, 0xCC, 0x9, 0xE9, 0xFF, 0xCC, 0x9, 0xEC, 0xFF, 0xCC, 0xA, 0x10, 0xFF, 0xDC, 0xA, 0x22, 0xFF, 0xEA, 0xA, 0x24, 0xFF, 0xEA, 0xA, 0x26, 0xFF, 0xEA, 0xA, 0x28, 0xFF, 0xCC, 0xA, 0x39, 0xFF, 0xE2, 0xA, 0x41, 0xFF, 0xCC, 0xA, 0xC0, 0xFF, 0xCC, 0xA, 0xC2, 0xFF, 0xCC, 0xA, 0xC4, 0xFF, 0xCC, 0xA, 0xC7, 0xFF, 0xDC, 0xA, 0xD6, 0xFF, 0xCC, 0xB, 0x4B, 0xFF, 0xEA, 0xB, 0xAD, 0xFF, 0xDC, 0xB, 0xAF, 0xFF, 0xDC, 0xB, 0xB1, 0xFF, 0xDC, 0xB, 0xB3, 0xFF, 0xDC, 0xB, 0xBF, 0xFF, 0xE2, 0xB, 0xC1, 0xFF, 0xE2, 0xB, 0xC3, 0xFF, 0xEA, 0xB, 0xC5, 0xFF, 0xEA, 0xB, 0xCB, 0xFF, 0xCC, 0xC, 0xA2, 0xFF, 0xCC, 0xC, 0xA3, 0xFF, 0xCC, 0xC, 0xB7, 0x0, 0xF, 0xC, 0xBE, 0x0, 0xF, 0xC, 0xD6, 0x0, 0xF, 0x0, 0x59, 0x0, 0x26, 0x0, 0x4, 0x0, 0x39, 0xFF, 0xD7, 0x0, 0x3B, 0xFF, 0xEC, 0x0, 0x3E, 0xFF, 0xC2, 0x0, 0xC2, 0xFF, 0xD7, 0x0, 0xFA, 0x0, 0x4, 0x1, 0x3, 0xFF, 0xC2, 0x2, 0x31, 0x0, 0x4, 0x2, 0x33, 0x0, 0x4, 0x2, 0x68, 0xFF, 0xD7, 0x2, 0x6C, 0xFF, 0xD7, 0x2, 0xA3, 0x0, 0x4, 0x2, 0xAF, 0xFF, 0xEC, 0x2, 0xD0, 0xFF, 0xD7, 0x2, 0xDC, 0xFF, 0xD7, 0x5, 0xF1, 0x0, 0x4, 0x6, 0x23, 0xFF, 0xD7, 0x6, 0x25, 0xFF, 0xD7, 0x6, 0x29, 0xFF, 0xD7, 0x6, 0x6A, 0x0, 0x4, 0x6, 0x6C, 0x0, 0x4, 0x6, 0x70, 0x0, 0x4, 0x6, 0x72, 0x0, 0x4, 0x6, 0x74, 0x0, 0x4, 0x6, 0x96, 0xFF, 0xEC, 0x8, 0xCD, 0x0, 0x4, 0x8, 0xCE, 0x0, 0x4, 0x8, 0xCF, 0x0, 0x4, 0x8, 0xD0, 0x0, 0x4, 0x8, 0xD1, 0x0, 0x4, 0x8, 0xD2, 0x0, 0x4, 0x8, 0xD3, 0x0, 0x4, 0x8, 0xE7, 0xFF, 0xC2, 0x9, 0x4, 0x0, 0x4, 0x9, 0x6, 0x0, 0x4, 0x9, 0x8, 0x0, 0x4, 0x9, 0x5C, 0xFF, 0xD7, 0x9, 0x5E, 0xFF, 0xD7, 0x9, 0x60, 0xFF, 0xD7, 0x9, 0x70, 0xFF, 0xC2, 0x9, 0x72, 0xFF, 0xC2, 0x9, 0xD5, 0x0, 0x4, 0x9, 0xDA, 0xFF, 0xC2, 0x9, 0xDD, 0x0, 0x4, 0x9, 0xE9, 0xFF, 0xC2, 0x9, 0xEC, 0xFF, 0xC2, 0xA, 0x5, 0x0, 0x4, 0xA, 0x10, 0xFF, 0xD7, 0xA, 0x28, 0xFF, 0xC2, 0xA, 0x31, 0x0, 0x4, 0xA, 0x39, 0xFF, 0xEC, 0xA, 0x41, 0xFF, 0xC2, 0xA, 0x47, 0x0, 0x4, 0xA, 0x49, 0x0, 0x4, 0xA, 0x6E, 0x0, 0x4, 0xA, 0x70, 0x0, 0x4, 0xA, 0x72, 0x0, 0x4, 0xA, 0x74, 0x0, 0x4, 0xA, 0x76, 0x0, 0x4, 0xA, 0x78, 0x0, 0x4, 0xA, 0x7A, 0x0, 0x4, 0xA, 0x7C, 0x0, 0x4, 0xA, 0x7E, 0x0, 0x4, 0xA, 0x80, 0x0, 0x4, 0xA, 0x82, 0x0, 0x4, 0xA, 0x84, 0x0, 0x4, 0xA, 0xC0, 0xFF, 0xC2, 0xA, 0xC2, 0xFF, 0xC2, 0xA, 0xC4, 0xFF, 0xC2, 0xA, 0xC7, 0xFF, 0xD7, 0xA, 0xD6, 0xFF, 0xC2, 0xA, 0xEE, 0x0, 0x4, 0xA, 0xFF, 0x0, 0x4, 0xB, 0x1, 0x0, 0x4, 0xB, 0x14, 0x0, 0x4, 0xB, 0x16, 0x0, 0x4, 0xB, 0x2E, 0x0, 0x4, 0xB, 0xAD, 0xFF, 0xD7, 0xB, 0xAF, 0xFF, 0xD7, 0xB, 0xB1, 0xFF, 0xD7, 0xB, 0xB3, 0xFF, 0xD7, 0xB, 0xBF, 0xFF, 0xEC, 0xB, 0xC1, 0xFF, 0xEC, 0xB, 0xCB, 0xFF, 0xC2, 0xC, 0x81, 0x0, 0x4, 0xC, 0x82, 0x0, 0x4, 0xC, 0x85, 0x0, 0x4, 0xC, 0xA2, 0xFF, 0xC2, 0xC, 0xA3, 0xFF, 0xC2, 0x0, 0x1B, 0x0, 0x2F, 0xFF, 0xED, 0x0, 0x3A, 0xFF, 0xED, 0x8, 0xE3, 0xFF, 0xED, 0x8, 0xE4, 0xFF, 0xED, 0x8, 0xE5, 0xFF, 0xED, 0x8, 0xE6, 0xFF, 0xED, 0x9, 0x33, 0xFF, 0xED, 0x9, 0x62, 0xFF, 0xED, 0x9, 0x64, 0xFF, 0xED, 0x9, 0x66, 0xFF, 0xED, 0x9, 0x68, 0xFF, 0xED, 0x9, 0x6A, 0xFF, 0xED, 0x9, 0x6C, 0xFF, 0xED, 0xA, 0x1, 0xFF, 0xED, 0xA, 0xB2, 0xFF, 0xED, 0xA, 0xB4, 0xFF, 0xED, 0xA, 0xF4, 0xFF, 0xED, 0xA, 0xF6, 0xFF, 0xED, 0xA, 0xF8, 0xFF, 0xED, 0xA, 0xFA, 0xFF, 0xED, 0xA, 0xFC, 0xFF, 0xED, 0xB, 0x3F, 0xFF, 0xED, 0xB, 0xB5, 0xFF, 0xED, 0xB, 0xB7, 0xFF, 0xED, 0xB, 0xB9, 0xFF, 0xED, 0xB, 0xBB, 0xFF, 0xED, 0xB, 0xBD, 0xFF, 0xED, 0x0, 0x82, 0x0, 0x7, 0x0, 0x18, 0x0, 0xC, 0x0, 0x18, 0x0, 0xE, 0x0, 0x24, 0x0, 0x42, 0x0, 0x28, 0x0, 0x48, 0xFF, 0xF0, 0x0, 0x49, 0xFF, 0xF0, 0x0, 0x4A, 0xFF, 0xF0, 0x0, 0x4C, 0xFF, 0xF0, 0x0, 0x56, 0xFF, 0xF0, 0x0, 0x62, 0x0, 0x1B, 0x0, 0x95, 0xFF, 0xF0, 0x0, 0x9F, 0xFF, 0xF0, 0x0, 0xB5, 0xFF, 0xF0, 0x0, 0xDA, 0xFF, 0xF0, 0x0, 0xDC, 0xFF, 0xF0, 0x0, 0xE4, 0xFF, 0xF0, 0x1, 0x0, 0xFF, 0xF0, 0x2, 0x2A, 0xFF, 0xF0, 0x2, 0x3A, 0xFF, 0xF0, 0x2, 0x47, 0xFF, 0xF0, 0x2, 0x48, 0xFF, 0xF0, 0x2, 0x58, 0xFF, 0xF0, 0x2, 0x61, 0xFF, 0xF0, 0x2, 0x8D, 0xFF, 0xF0, 0x2, 0x99, 0xFF, 0xF0, 0x2, 0xB4, 0xFF, 0xF0, 0x2, 0xB8, 0xFF, 0xF0, 0x2, 0xD9, 0xFF, 0xF0, 0x2, 0xF7, 0xFF, 0xF0, 0x2, 0xF8, 0xFF, 0xF0, 0x3, 0x2, 0xFF, 0xF0, 0x4, 0x62, 0x0, 0x18, 0x4, 0x63, 0x0, 0x18, 0x4, 0x65, 0x0, 0x18, 0x4, 0x66, 0x0, 0x18, 0x4, 0x67, 0x0, 0x18, 0x5, 0x6E, 0xFF, 0xF0, 0x6, 0x8F, 0xFF, 0xF0, 0x6, 0x91, 0xFF, 0xF0, 0x6, 0xA9, 0xFF, 0xF0, 0x6, 0xCB, 0xFF, 0xF0, 0x6, 0xF7, 0xFF, 0xF0, 0x8, 0xEF, 0xFF, 0xF0, 0x8, 0xF0, 0xFF, 0xF0, 0x8, 0xF1, 0xFF, 0xF0, 0x8, 0xF2, 0xFF, 0xF0, 0x8, 0xF3, 0xFF, 0xF0, 0x9, 0xB, 0xFF, 0xF0, 0x9, 0xD, 0xFF, 0xF0, 0x9, 0xF, 0xFF, 0xF0, 0x9, 0x11, 0xFF, 0xF0, 0x9, 0x13, 0xFF, 0xF0, 0x9, 0x15, 0xFF, 0xF0, 0x9, 0x17, 0xFF, 0xF0, 0x9, 0x19, 0xFF, 0xF0, 0x9, 0x1B, 0xFF, 0xF0, 0x9, 0x1D, 0xFF, 0xF0, 0x9, 0x1F, 0xFF, 0xF0, 0x9, 0x21, 0xFF, 0xF0, 0x9, 0x23, 0xFF, 0xF0, 0x9, 0x25, 0xFF, 0xF0, 0x9, 0xED, 0xFF, 0xF0, 0xA, 0x13, 0xFF, 0xF0, 0xA, 0x17, 0xFF, 0xF0, 0xA, 0x1A, 0xFF, 0xF0, 0xA, 0x2A, 0x0, 0x18, 0xA, 0x2B, 0x0, 0x18, 0xA, 0x2E, 0x0, 0x18, 0xA, 0x35, 0xFF, 0xF0, 0xA, 0x3B, 0xFF, 0xF0, 0xA, 0x40, 0xFF, 0xF0, 0xA, 0x4E, 0xFF, 0xF0, 0xA, 0x50, 0xFF, 0xF0, 0xA, 0x51, 0xFF, 0xF0, 0xA, 0x5D, 0xFF, 0xF0, 0xA, 0x6D, 0xFF, 0xF0, 0xA, 0x87, 0xFF, 0xF0, 0xA, 0x89, 0xFF, 0xF0, 0xA, 0x8B, 0xFF, 0xF0, 0xA, 0x8D, 0xFF, 0xF0, 0xA, 0x8F, 0xFF, 0xF0, 0xA, 0x91, 0xFF, 0xF0, 0xA, 0x93, 0xFF, 0xF0, 0xA, 0x95, 0xFF, 0xF0, 0xA, 0xA9, 0xFF, 0xF0, 0xA, 0xAB, 0xFF, 0xF0, 0xA, 0xAD, 0xFF, 0xF0, 0xA, 0xB1, 0xFF, 0xF0, 0xA, 0xFE, 0xFF, 0xF0, 0xB, 0x6, 0xFF, 0xF0, 0xB, 0xF, 0xFF, 0xF0, 0xB, 0x19, 0xFF, 0xF0, 0xB, 0x1B, 0xFF, 0xF0, 0xB, 0x42, 0xFF, 0xF0, 0xB, 0x4A, 0xFF, 0xF0, 0xB, 0x54, 0xFF, 0xF0, 0xB, 0x56, 0xFF, 0xF0, 0xB, 0x58, 0xFF, 0xF0, 0xB, 0x5A, 0xFF, 0xF0, 0xB, 0x5C, 0xFF, 0xF0, 0xB, 0x5E, 0xFF, 0xF0, 0xB, 0x60, 0xFF, 0xF0, 0xB, 0x62, 0xFF, 0xF0, 0xB, 0x64, 0xFF, 0xF0, 0xB, 0x66, 0xFF, 0xF0, 0xB, 0x68, 0xFF, 0xF0, 0xB, 0x6C, 0xFF, 0xF0, 0xB, 0xD8, 0xFF, 0xF0, 0xB, 0xD9, 0xFF, 0xF0, 0xB, 0xDA, 0xFF, 0xF0, 0xB, 0xDB, 0xFF, 0xF0, 0xB, 0xDC, 0xFF, 0xF0, 0xB, 0xDD, 0xFF, 0xF0, 0xB, 0xDE, 0xFF, 0xF0, 0xB, 0xDF, 0xFF, 0xF0, 0xC, 0x4A, 0xFF, 0xF0, 0xC, 0x4B, 0xFF, 0xF0, 0xC, 0x4C, 0xFF, 0xF0, 0xC, 0x4D, 0xFF, 0xF0, 0xC, 0x4E, 0xFF, 0xF0, 0xC, 0x4F, 0xFF, 0xF0, 0xC, 0x50, 0xFF, 0xF0, 0xC, 0x51, 0xFF, 0xF0, 0xC, 0x7A, 0xFF, 0xF0, 0xC, 0x7B, 0xFF, 0xF0, 0xC, 0x7C, 0xFF, 0xF0, 0xC, 0x7D, 0xFF, 0xF0, 0xC, 0x7E, 0xFF, 0xF0, 0xC, 0x7F, 0xFF, 0xF0, 0xC, 0x80, 0xFF, 0xF0, 0x0, 0x2, 0x2, 0x8C, 0xFF, 0xDF, 0x4, 0x63, 0xFF, 0xBC, 0x0, 0xAB, 0x0, 0x48, 0xFF, 0xEA, 0x0, 0x49, 0xFF, 0xEA, 0x0, 0x4A, 0xFF, 0xEA, 0x0, 0x4C, 0xFF, 0xEA, 0x0, 0x54, 0xFF, 0xF5, 0x0, 0x56, 0xFF, 0xEA, 0x0, 0x95, 0xFF, 0xEA, 0x0, 0x9F, 0xFF, 0xEA, 0x0, 0xB5, 0xFF, 0xEA, 0x0, 0xDA, 0xFF, 0xEA, 0x0, 0xDC, 0xFF, 0xEA, 0x0, 0xE4, 0xFF, 0xEA, 0x1, 0x0, 0xFF, 0xEA, 0x2, 0x2A, 0xFF, 0xEA, 0x2, 0x3A, 0xFF, 0xEA, 0x2, 0x47, 0xFF, 0xEA, 0x2, 0x48, 0xFF, 0xEA, 0x2, 0x56, 0xFF, 0xF5, 0x2, 0x58, 0xFF, 0xEA, 0x2, 0x61, 0xFF, 0xEA, 0x2, 0x8D, 0xFF, 0xEA, 0x2, 0x99, 0xFF, 0xEA, 0x2, 0xAE, 0xFF, 0xF5, 0x2, 0xB4, 0xFF, 0xEA, 0x2, 0xB8, 0xFF, 0xEA, 0x2, 0xD9, 0xFF, 0xEA, 0x2, 0xF7, 0xFF, 0xEA, 0x2, 0xF8, 0xFF, 0xEA, 0x3, 0x2, 0xFF, 0xEA, 0x5, 0x6E, 0xFF, 0xEA, 0x5, 0x70, 0xFF, 0xF5, 0x5, 0xEE, 0xFF, 0xF5, 0x6, 0x2, 0xFF, 0xF5, 0x6, 0x4, 0xFF, 0xF5, 0x6, 0x6, 0xFF, 0xF5, 0x6, 0x32, 0xFF, 0xF5, 0x6, 0x85, 0xFF, 0xF5, 0x6, 0x87, 0xFF, 0xF5, 0x6, 0x8F, 0xFF, 0xEA, 0x6, 0x91, 0xFF, 0xEA, 0x6, 0xA9, 0xFF, 0xEA, 0x6, 0xCB, 0xFF, 0xEA, 0x6, 0xF7, 0xFF, 0xEA, 0x8, 0xEF, 0xFF, 0xEA, 0x8, 0xF0, 0xFF, 0xEA, 0x8, 0xF1, 0xFF, 0xEA, 0x8, 0xF2, 0xFF, 0xEA, 0x8, 0xF3, 0xFF, 0xEA, 0x8, 0xF9, 0xFF, 0xF5, 0x8, 0xFA, 0xFF, 0xF5, 0x8, 0xFB, 0xFF, 0xF5, 0x8, 0xFC, 0xFF, 0xF5, 0x8, 0xFD, 0xFF, 0xF5, 0x9, 0xB, 0xFF, 0xEA, 0x9, 0xD, 0xFF, 0xEA, 0x9, 0xF, 0xFF, 0xEA, 0x9, 0x11, 0xFF, 0xEA, 0x9, 0x13, 0xFF, 0xEA, 0x9, 0x15, 0xFF, 0xEA, 0x9, 0x17, 0xFF, 0xEA, 0x9, 0x19, 0xFF, 0xEA, 0x9, 0x1B, 0xFF, 0xEA, 0x9, 0x1D, 0xFF, 0xEA, 0x9, 0x1F, 0xFF, 0xEA, 0x9, 0x21, 0xFF, 0xEA, 0x9, 0x23, 0xFF, 0xEA, 0x9, 0x25, 0xFF, 0xEA, 0x9, 0x47, 0xFF, 0xF5, 0x9, 0x49, 0xFF, 0xF5, 0x9, 0x4B, 0xFF, 0xF5, 0x9, 0xED, 0xFF, 0xEA, 0x9, 0xF3, 0xFF, 0xF5, 0x9, 0xF9, 0xFF, 0xF5, 0xA, 0x13, 0xFF, 0xEA, 0xA, 0x15, 0xFF, 0xF5, 0xA, 0x17, 0xFF, 0xEA, 0xA, 0x1A, 0xFF, 0xEA, 0xA, 0x35, 0xFF, 0xEA, 0xA, 0x3B, 0xFF, 0xEA, 0xA, 0x40, 0xFF, 0xEA, 0xA, 0x4E, 0xFF, 0xEA, 0xA, 0x50, 0xFF, 0xEA, 0xA, 0x51, 0xFF, 0xEA, 0xA, 0x5B, 0xFF, 0xF5, 0xA, 0x5D, 0xFF, 0xEA, 0xA, 0x60, 0xFF, 0xF5, 0xA, 0x6D, 0xFF, 0xEA, 0xA, 0x87, 0xFF, 0xEA, 0xA, 0x89, 0xFF, 0xEA, 0xA, 0x8B, 0xFF, 0xEA, 0xA, 0x8D, 0xFF, 0xEA, 0xA, 0x8F, 0xFF, 0xEA, 0xA, 0x91, 0xFF, 0xEA, 0xA, 0x93, 0xFF, 0xEA, 0xA, 0x95, 0xFF, 0xEA, 0xA, 0x9B, 0xFF, 0xF5, 0xA, 0x9D, 0xFF, 0xF5, 0xA, 0x9F, 0xFF, 0xF5, 0xA, 0xA1, 0xFF, 0xF5, 0xA, 0xA3, 0xFF, 0xF5, 0xA, 0xA5, 0xFF, 0xF5, 0xA, 0xA7, 0xFF, 0xF5, 0xA, 0xA9, 0xFF, 0xEA, 0xA, 0xAB, 0xFF, 0xEA, 0xA, 0xAD, 0xFF, 0xEA, 0xA, 0xAF, 0xFF, 0xF5, 0xA, 0xB1, 0xFF, 0xEA, 0xA, 0xF3, 0xFF, 0xF5, 0xA, 0xFE, 0xFF, 0xEA, 0xB, 0x6, 0xFF, 0xEA, 0xB, 0xA, 0xFF, 0xF5, 0xB, 0xC, 0xFF, 0xF5, 0xB, 0xF, 0xFF, 0xEA, 0xB, 0x19, 0xFF, 0xEA, 0xB, 0x1B, 0xFF, 0xEA, 0xB, 0x21, 0xFF, 0xF5, 0xB, 0x23, 0xFF, 0xF5, 0xB, 0x33, 0xFF, 0xF5, 0xB, 0x35, 0xFF, 0xF5, 0xB, 0x37, 0xFF, 0xF5, 0xB, 0x39, 0xFF, 0xF5, 0xB, 0x3C, 0xFF, 0xF5, 0xB, 0x42, 0xFF, 0xEA, 0xB, 0x4A, 0xFF, 0xEA, 0xB, 0x54, 0xFF, 0xEA, 0xB, 0x56, 0xFF, 0xEA, 0xB, 0x58, 0xFF, 0xEA, 0xB, 0x5A, 0xFF, 0xEA, 0xB, 0x5C, 0xFF, 0xEA, 0xB, 0x5E, 0xFF, 0xEA, 0xB, 0x60, 0xFF, 0xEA, 0xB, 0x62, 0xFF, 0xEA, 0xB, 0x64, 0xFF, 0xEA, 0xB, 0x66, 0xFF, 0xEA, 0xB, 0x68, 0xFF, 0xEA, 0xB, 0x6C, 0xFF, 0xEA, 0xB, 0x90, 0xFF, 0xF5, 0xB, 0x92, 0xFF, 0xF5, 0xB, 0x94, 0xFF, 0xF5, 0xB, 0x96, 0xFF, 0xF5, 0xB, 0xD8, 0xFF, 0xEA, 0xB, 0xD9, 0xFF, 0xEA, 0xB, 0xDA, 0xFF, 0xEA, 0xB, 0xDB, 0xFF, 0xEA, 0xB, 0xDC, 0xFF, 0xEA, 0xB, 0xDD, 0xFF, 0xEA, 0xB, 0xDE, 0xFF, 0xEA, 0xB, 0xDF, 0xFF, 0xEA, 0xC, 0x14, 0xFF, 0xF5, 0xC, 0x15, 0xFF, 0xF5, 0xC, 0x16, 0xFF, 0xF5, 0xC, 0x17, 0xFF, 0xF5, 0xC, 0x18, 0xFF, 0xF5, 0xC, 0x19, 0xFF, 0xF5, 0xC, 0x44, 0xFF, 0xF5, 0xC, 0x45, 0xFF, 0xF5, 0xC, 0x4A, 0xFF, 0xEA, 0xC, 0x4B, 0xFF, 0xEA, 0xC, 0x4C, 0xFF, 0xEA, 0xC, 0x4D, 0xFF, 0xEA, 0xC, 0x4E, 0xFF, 0xEA, 0xC, 0x4F, 0xFF, 0xEA, 0xC, 0x50, 0xFF, 0xEA, 0xC, 0x51, 0xFF, 0xEA, 0xC, 0x7A, 0xFF, 0xEA, 0xC, 0x7B, 0xFF, 0xEA, 0xC, 0x7C, 0xFF, 0xEA, 0xC, 0x7D, 0xFF, 0xEA, 0xC, 0x7E, 0xFF, 0xEA, 0xC, 0x7F, 0xFF, 0xEA, 0xC, 0x80, 0xFF, 0xEA, 0x0, 0x38, 0x0, 0x54, 0xFF, 0xE5, 0x0, 0x59, 0x0, 0xF, 0x2, 0x56, 0xFF, 0xE5, 0x2, 0xAE, 0xFF, 0xE5, 0x4, 0x63, 0x0, 0x1E, 0x5, 0x70, 0xFF, 0xE5, 0x5, 0xEE, 0xFF, 0xE5, 0x6, 0x2, 0xFF, 0xE5, 0x6, 0x4, 0xFF, 0xE5, 0x6, 0x6, 0xFF, 0xE5, 0x6, 0x32, 0xFF, 0xE5, 0x6, 0x85, 0xFF, 0xE5, 0x6, 0x87, 0xFF, 0xE5, 0x8, 0xF9, 0xFF, 0xE5, 0x8, 0xFA, 0xFF, 0xE5, 0x8, 0xFB, 0xFF, 0xE5, 0x8, 0xFC, 0xFF, 0xE5, 0x8, 0xFD, 0xFF, 0xE5, 0x9, 0x47, 0xFF, 0xE5, 0x9, 0x49, 0xFF, 0xE5, 0x9, 0x4B, 0xFF, 0xE5, 0x9, 0xF3, 0xFF, 0xE5, 0x9, 0xF9, 0xFF, 0xE5, 0xA, 0x15, 0xFF, 0xE5, 0xA, 0x5B, 0xFF, 0xE5, 0xA, 0x60, 0xFF, 0xE5, 0xA, 0x9B, 0xFF, 0xE5, 0xA, 0x9D, 0xFF, 0xE5, 0xA, 0x9F, 0xFF, 0xE5, 0xA, 0xA1, 0xFF, 0xE5, 0xA, 0xA3, 0xFF, 0xE5, 0xA, 0xA5, 0xFF, 0xE5, 0xA, 0xA7, 0xFF, 0xE5, 0xA, 0xAF, 0xFF, 0xE5, 0xA, 0xF3, 0xFF, 0xE5, 0xB, 0xA, 0xFF, 0xE5, 0xB, 0xC, 0xFF, 0xE5, 0xB, 0x21, 0xFF, 0xE5, 0xB, 0x23, 0xFF, 0xE5, 0xB, 0x33, 0xFF, 0xE5, 0xB, 0x35, 0xFF, 0xE5, 0xB, 0x37, 0xFF, 0xE5, 0xB, 0x39, 0xFF, 0xE5, 0xB, 0x3C, 0xFF, 0xE5, 0xB, 0x90, 0xFF, 0xE5, 0xB, 0x92, 0xFF, 0xE5, 0xB, 0x94, 0xFF, 0xE5, 0xB, 0x96, 0xFF, 0xE5, 0xC, 0x14, 0xFF, 0xE5, 0xC, 0x15, 0xFF, 0xE5, 0xC, 0x16, 0xFF, 0xE5, 0xC, 0x17, 0xFF, 0xE5, 0xC, 0x18, 0xFF, 0xE5, 0xC, 0x19, 0xFF, 0xE5, 0xC, 0x44, 0xFF, 0xE5, 0xC, 0x45, 0xFF, 0xE5, 0x0, 0x6, 0x0, 0x11, 0xFF, 0x9C, 0x0, 0x13, 0xFF, 0x9C, 0x4, 0x64, 0xFF, 0x9C, 0x4, 0x68, 0xFF, 0x9C, 0x4, 0x6F, 0xFF, 0x9C, 0x4, 0x70, 0xFF, 0x9C, 0x0, 0x1B, 0x0, 0x2F, 0xFF, 0xEA, 0x0, 0x3A, 0xFF, 0xEA, 0x8, 0xE3, 0xFF, 0xEA, 0x8, 0xE4, 0xFF, 0xEA, 0x8, 0xE5, 0xFF, 0xEA, 0x8, 0xE6, 0xFF, 0xEA, 0x9, 0x33, 0xFF, 0xEA, 0x9, 0x62, 0xFF, 0xEA, 0x9, 0x64, 0xFF, 0xEA, 0x9, 0x66, 0xFF, 0xEA, 0x9, 0x68, 0xFF, 0xEA, 0x9, 0x6A, 0xFF, 0xEA, 0x9, 0x6C, 0xFF, 0xEA, 0xA, 0x1, 0xFF, 0xEA, 0xA, 0xB2, 0xFF, 0xEA, 0xA, 0xB4, 0xFF, 0xEA, 0xA, 0xF4, 0xFF, 0xEA, 0xA, 0xF6, 0xFF, 0xEA, 0xA, 0xF8, 0xFF, 0xEA, 0xA, 0xFA, 0xFF, 0xEA, 0xA, 0xFC, 0xFF, 0xEA, 0xB, 0x3F, 0xFF, 0xEA, 0xB, 0xB5, 0xFF, 0xEA, 0xB, 0xB7, 0xFF, 0xEA, 0xB, 0xB9, 0xFF, 0xEA, 0xB, 0xBB, 0xFF, 0xEA, 0xB, 0xBD, 0xFF, 0xEA, 0x0, 0x24, 0x0, 0x7, 0xFF, 0xE6, 0x0, 0xC, 0xFF, 0xE6, 0x0, 0x5B, 0xFF, 0xF2, 0x0, 0x5E, 0xFF, 0xF2, 0x2, 0x3C, 0xFF, 0xF2, 0x2, 0x8C, 0xFF, 0xF4, 0x2, 0xB0, 0xFF, 0xF2, 0x4, 0x62, 0xFF, 0xE6, 0x4, 0x63, 0xFF, 0xE6, 0x4, 0x65, 0xFF, 0xE6, 0x4, 0x66, 0xFF, 0xE6, 0x4, 0x67, 0xFF, 0xE6, 0x5, 0x67, 0xFF, 0xF2, 0x9, 0x2, 0xFF, 0xF2, 0x9, 0x3, 0xFF, 0xF2, 0x9, 0x71, 0xFF, 0xF2, 0x9, 0xF5, 0xFF, 0xF2, 0xA, 0x18, 0xFF, 0xF2, 0xA, 0x21, 0xFF, 0xF2, 0xA, 0x29, 0xFF, 0xF2, 0xA, 0x2A, 0xFF, 0xE6, 0xA, 0x2B, 0xFF, 0xE6, 0xA, 0x2E, 0xFF, 0xE6, 0xA, 0x3A, 0xFF, 0xF2, 0xA, 0x42, 0xFF, 0xF2, 0xA, 0x64, 0xFF, 0xF2, 0xA, 0x66, 0xFF, 0xF2, 0xA, 0x68, 0xFF, 0xF2, 0xA, 0xC1, 0xFF, 0xF2, 0xA, 0xC3, 0xFF, 0xF2, 0xA, 0xC5, 0xFF, 0xF2, 0xB, 0x3B, 0xFF, 0xF2, 0xB, 0xC0, 0xFF, 0xF2, 0xB, 0xC2, 0xFF, 0xF2, 0xB, 0xCC, 0xFF, 0xF2, 0xB, 0xD6, 0xFF, 0xF2, 0x0, 0x62, 0x0, 0x28, 0xFF, 0xF2, 0x0, 0x2C, 0xFF, 0xF2, 0x0, 0x34, 0xFF, 0xF2, 0x0, 0x36, 0xFF, 0xF2, 0x0, 0x84, 0xFF, 0xF2, 0x0, 0x94, 0xFF, 0xF2, 0x0, 0x9E, 0xFF, 0xF2, 0x0, 0xAA, 0xFF, 0xF2, 0x0, 0xB4, 0xFF, 0xF2, 0x0, 0xB6, 0xFF, 0xF2, 0x0, 0xFF, 0xFF, 0xF2, 0x2, 0x32, 0xFF, 0xF2, 0x2, 0x43, 0x0, 0xE, 0x2, 0x55, 0xFF, 0xF2, 0x2, 0x57, 0xFF, 0xF2, 0x2, 0x66, 0xFF, 0xF2, 0x2, 0x69, 0xFF, 0xF2, 0x2, 0x9E, 0xFF, 0xF2, 0x2, 0xAD, 0xFF, 0xF2, 0x2, 0xB1, 0xFF, 0xF2, 0x2, 0xB3, 0xFF, 0xF2, 0x2, 0xB5, 0xFF, 0xF2, 0x2, 0xB7, 0xFF, 0xF2, 0x2, 0xD8, 0xFF, 0xF2, 0x3, 0x1, 0xFF, 0xF2, 0x5, 0x63, 0xFF, 0xF2, 0x5, 0xE5, 0xFF, 0xF2, 0x5, 0xED, 0xFF, 0xF2, 0x6, 0x1, 0xFF, 0xF2, 0x6, 0x3, 0xFF, 0xF2, 0x6, 0x5, 0xFF, 0xF2, 0x6, 0x31, 0xFF, 0xF2, 0x6, 0x33, 0xFF, 0xF2, 0x6, 0x84, 0xFF, 0xF2, 0x6, 0x86, 0xFF, 0xF2, 0x6, 0x8E, 0xFF, 0xF2, 0x6, 0x90, 0xFF, 0xF2, 0x6, 0xE3, 0xFF, 0xF2, 0x7, 0xCF, 0xFF, 0xF2, 0x7, 0xD0, 0xFF, 0xF2, 0x7, 0xD2, 0xFF, 0xF2, 0x7, 0xD3, 0xFF, 0xF2, 0x8, 0xD4, 0xFF, 0xF2, 0x8, 0xDE, 0xFF, 0xF2, 0x8, 0xDF, 0xFF, 0xF2, 0x8, 0xE0, 0xFF, 0xF2, 0x8, 0xE1, 0xFF, 0xF2, 0x8, 0xE2, 0xFF, 0xF2, 0x9, 0xA, 0xFF, 0xF2, 0x9, 0xC, 0xFF, 0xF2, 0x9, 0xE, 0xFF, 0xF2, 0x9, 0x10, 0xFF, 0xF2, 0x9, 0x1E, 0xFF, 0xF2, 0x9, 0x20, 0xFF, 0xF2, 0x9, 0x22, 0xFF, 0xF2, 0x9, 0x24, 0xFF, 0xF2, 0x9, 0x46, 0xFF, 0xF2, 0x9, 0x48, 0xFF, 0xF2, 0x9, 0x4A, 0xFF, 0xF2, 0x9, 0x7B, 0xFF, 0xF2, 0x9, 0xD9, 0xFF, 0xF2, 0x9, 0xE6, 0xFF, 0xF2, 0xA, 0xC, 0xFF, 0xF2, 0xA, 0xF, 0xFF, 0xF2, 0xA, 0x3C, 0xFF, 0xF2, 0xA, 0x3F, 0xFF, 0xF2, 0xA, 0x5A, 0xFF, 0xF2, 0xA, 0x5C, 0xFF, 0xF2, 0xA, 0x5E, 0xFF, 0xF2, 0xA, 0x5F, 0xFF, 0xF2, 0xA, 0x9A, 0xFF, 0xF2, 0xA, 0x9C, 0xFF, 0xF2, 0xA, 0x9E, 0xFF, 0xF2, 0xA, 0xA0, 0xFF, 0xF2, 0xA, 0xA2, 0xFF, 0xF2, 0xA, 0xA4, 0xFF, 0xF2, 0xA, 0xA6, 0xFF, 0xF2, 0xA, 0xA8, 0xFF, 0xF2, 0xA, 0xAA, 0xFF, 0xF2, 0xA, 0xAC, 0xFF, 0xF2, 0xA, 0xAE, 0xFF, 0xF2, 0xA, 0xB0, 0xFF, 0xF2, 0xA, 0xF2, 0xFF, 0xF2, 0xB, 0x9, 0xFF, 0xF2, 0xB, 0xB, 0xFF, 0xF2, 0xB, 0x20, 0xFF, 0xF2, 0xB, 0x22, 0xFF, 0xF2, 0xB, 0x32, 0xFF, 0xF2, 0xB, 0x34, 0xFF, 0xF2, 0xB, 0x36, 0xFF, 0xF2, 0xB, 0x38, 0xFF, 0xF2, 0xB, 0x49, 0xFF, 0xF2, 0xB, 0x53, 0xFF, 0xF2, 0xB, 0x6B, 0xFF, 0xF2, 0xB, 0x8F, 0xFF, 0xF2, 0xB, 0x91, 0xFF, 0xF2, 0xB, 0x93, 0xFF, 0xF2, 0xB, 0x95, 0xFF, 0xF2, 0x0, 0x63, 0x0, 0x28, 0xFF, 0xE4, 0x0, 0x2C, 0xFF, 0xE4, 0x0, 0x34, 0xFF, 0xE4, 0x0, 0x36, 0xFF, 0xE4, 0x0, 0x84, 0xFF, 0xE4, 0x0, 0x94, 0xFF, 0xE4, 0x0, 0x9E, 0xFF, 0xE4, 0x0, 0xAA, 0xFF, 0xE4, 0x0, 0xB4, 0xFF, 0xE4, 0x0, 0xB6, 0xFF, 0xE4, 0x0, 0xFF, 0xFF, 0xE4, 0x2, 0x32, 0xFF, 0xE4, 0x2, 0x37, 0xFF, 0xBD, 0x2, 0x43, 0x0, 0x11, 0x2, 0x55, 0xFF, 0xE4, 0x2, 0x57, 0xFF, 0xE4, 0x2, 0x66, 0xFF, 0xE4, 0x2, 0x69, 0xFF, 0xE4, 0x2, 0x9E, 0xFF, 0xE4, 0x2, 0xAD, 0xFF, 0xE4, 0x2, 0xB1, 0xFF, 0xE4, 0x2, 0xB3, 0xFF, 0xE4, 0x2, 0xB5, 0xFF, 0xE4, 0x2, 0xB7, 0xFF, 0xE4, 0x2, 0xD8, 0xFF, 0xE4, 0x3, 0x1, 0xFF, 0xE4, 0x5, 0x63, 0xFF, 0xE4, 0x5, 0xE5, 0xFF, 0xE4, 0x5, 0xED, 0xFF, 0xE4, 0x6, 0x1, 0xFF, 0xE4, 0x6, 0x3, 0xFF, 0xE4, 0x6, 0x5, 0xFF, 0xE4, 0x6, 0x31, 0xFF, 0xE4, 0x6, 0x33, 0xFF, 0xE4, 0x6, 0x84, 0xFF, 0xE4, 0x6, 0x86, 0xFF, 0xE4, 0x6, 0x8E, 0xFF, 0xE4, 0x6, 0x90, 0xFF, 0xE4, 0x6, 0xE3, 0xFF, 0xE4, 0x7, 0xCF, 0xFF, 0xE4, 0x7, 0xD0, 0xFF, 0xE4, 0x7, 0xD2, 0xFF, 0xE4, 0x7, 0xD3, 0xFF, 0xE4, 0x8, 0xD4, 0xFF, 0xE4, 0x8, 0xDE, 0xFF, 0xE4, 0x8, 0xDF, 0xFF, 0xE4, 0x8, 0xE0, 0xFF, 0xE4, 0x8, 0xE1, 0xFF, 0xE4, 0x8, 0xE2, 0xFF, 0xE4, 0x9, 0xA, 0xFF, 0xE4, 0x9, 0xC, 0xFF, 0xE4, 0x9, 0xE, 0xFF, 0xE4, 0x9, 0x10, 0xFF, 0xE4, 0x9, 0x1E, 0xFF, 0xE4, 0x9, 0x20, 0xFF, 0xE4, 0x9, 0x22, 0xFF, 0xE4, 0x9, 0x24, 0xFF, 0xE4, 0x9, 0x46, 0xFF, 0xE4, 0x9, 0x48, 0xFF, 0xE4, 0x9, 0x4A, 0xFF, 0xE4, 0x9, 0x7B, 0xFF, 0xE4, 0x9, 0xD9, 0xFF, 0xE4, 0x9, 0xE6, 0xFF, 0xE4, 0xA, 0xC, 0xFF, 0xE4, 0xA, 0xF, 0xFF, 0xE4, 0xA, 0x3C, 0xFF, 0xE4, 0xA, 0x3F, 0xFF, 0xE4, 0xA, 0x5A, 0xFF, 0xE4, 0xA, 0x5C, 0xFF, 0xE4, 0xA, 0x5E, 0xFF, 0xE4, 0xA, 0x5F, 0xFF, 0xE4, 0xA, 0x9A, 0xFF, 0xE4, 0xA, 0x9C, 0xFF, 0xE4, 0xA, 0x9E, 0xFF, 0xE4, 0xA, 0xA0, 0xFF, 0xE4, 0xA, 0xA2, 0xFF, 0xE4, 0xA, 0xA4, 0xFF, 0xE4, 0xA, 0xA6, 0xFF, 0xE4, 0xA, 0xA8, 0xFF, 0xE4, 0xA, 0xAA, 0xFF, 0xE4, 0xA, 0xAC, 0xFF, 0xE4, 0xA, 0xAE, 0xFF, 0xE4, 0xA, 0xB0, 0xFF, 0xE4, 0xA, 0xF2, 0xFF, 0xE4, 0xB, 0x9, 0xFF, 0xE4, 0xB, 0xB, 0xFF, 0xE4, 0xB, 0x20, 0xFF, 0xE4, 0xB, 0x22, 0xFF, 0xE4, 0xB, 0x32, 0xFF, 0xE4, 0xB, 0x34, 0xFF, 0xE4, 0xB, 0x36, 0xFF, 0xE4, 0xB, 0x38, 0xFF, 0xE4, 0xB, 0x49, 0xFF, 0xE4, 0xB, 0x53, 0xFF, 0xE4, 0xB, 0x6B, 0xFF, 0xE4, 0xB, 0x8F, 0xFF, 0xE4, 0xB, 0x91, 0xFF, 0xE4, 0xB, 0x93, 0xFF, 0xE4, 0xB, 0x95, 0xFF, 0xE4, 0x0, 0x4D, 0x0, 0x26, 0xFF, 0xE2, 0x0, 0x3D, 0xFF, 0xCE, 0x0, 0x3E, 0xFF, 0xCF, 0x0, 0xFA, 0xFF, 0xE2, 0x1, 0x3, 0xFF, 0xCF, 0x2, 0x31, 0xFF, 0xE2, 0x2, 0x33, 0xFF, 0xE2, 0x2, 0x43, 0xFF, 0xE0, 0x2, 0x70, 0xFF, 0xCE, 0x2, 0xA3, 0xFF, 0xE2, 0x2, 0xCA, 0xFF, 0xCE, 0x2, 0xDA, 0xFF, 0xCE, 0x2, 0xF4, 0xFF, 0xCE, 0x5, 0xF1, 0xFF, 0xE2, 0x6, 0x6A, 0xFF, 0xE2, 0x6, 0x6C, 0xFF, 0xE2, 0x6, 0x70, 0xFF, 0xE2, 0x6, 0x72, 0xFF, 0xE2, 0x6, 0x74, 0xFF, 0xE2, 0x8, 0xCD, 0xFF, 0xE2, 0x8, 0xCE, 0xFF, 0xE2, 0x8, 0xCF, 0xFF, 0xE2, 0x8, 0xD0, 0xFF, 0xE2, 0x8, 0xD1, 0xFF, 0xE2, 0x8, 0xD2, 0xFF, 0xE2, 0x8, 0xD3, 0xFF, 0xE2, 0x8, 0xE7, 0xFF, 0xCF, 0x9, 0x4, 0xFF, 0xE2, 0x9, 0x6, 0xFF, 0xE2, 0x9, 0x8, 0xFF, 0xE2, 0x9, 0x70, 0xFF, 0xCF, 0x9, 0x72, 0xFF, 0xCF, 0x9, 0xD5, 0xFF, 0xE2, 0x9, 0xDA, 0xFF, 0xCF, 0x9, 0xDD, 0xFF, 0xE2, 0x9, 0xE9, 0xFF, 0xCF, 0x9, 0xEA, 0xFF, 0xCE, 0x9, 0xEC, 0xFF, 0xCF, 0xA, 0x5, 0xFF, 0xE2, 0xA, 0x11, 0xFF, 0xCE, 0xA, 0x28, 0xFF, 0xCF, 0xA, 0x31, 0xFF, 0xE2, 0xA, 0x41, 0xFF, 0xCF, 0xA, 0x44, 0xFF, 0xCE, 0xA, 0x47, 0xFF, 0xE2, 0xA, 0x49, 0xFF, 0xE2, 0xA, 0x52, 0xFF, 0xCE, 0xA, 0x6E, 0xFF, 0xE2, 0xA, 0x70, 0xFF, 0xE2, 0xA, 0x72, 0xFF, 0xE2, 0xA, 0x74, 0xFF, 0xE2, 0xA, 0x76, 0xFF, 0xE2, 0xA, 0x78, 0xFF, 0xE2, 0xA, 0x7A, 0xFF, 0xE2, 0xA, 0x7C, 0xFF, 0xE2, 0xA, 0x7E, 0xFF, 0xE2, 0xA, 0x80, 0xFF, 0xE2, 0xA, 0x82, 0xFF, 0xE2, 0xA, 0x84, 0xFF, 0xE2, 0xA, 0xC0, 0xFF, 0xCF, 0xA, 0xC2, 0xFF, 0xCF, 0xA, 0xC4, 0xFF, 0xCF, 0xA, 0xD6, 0xFF, 0xCF, 0xA, 0xEE, 0xFF, 0xE2, 0xA, 0xFF, 0xFF, 0xE2, 0xB, 0x1, 0xFF, 0xE2, 0xB, 0x14, 0xFF, 0xE2, 0xB, 0x16, 0xFF, 0xE2, 0xB, 0x2E, 0xFF, 0xE2, 0xB, 0xC7, 0xFF, 0xCE, 0xB, 0xC9, 0xFF, 0xCE, 0xB, 0xCB, 0xFF, 0xCF, 0xC, 0x81, 0xFF, 0xE2, 0xC, 0x82, 0xFF, 0xE2, 0xC, 0x85, 0xFF, 0xE2, 0xC, 0xA2, 0xFF, 0xCF, 0xC, 0xA3, 0xFF, 0xCF, 0x0, 0x37, 0x0, 0x11, 0xFF, 0x62, 0x0, 0x13, 0xFF, 0x62, 0x0, 0x26, 0xFF, 0xC9, 0x0, 0xFA, 0xFF, 0xC9, 0x2, 0x31, 0xFF, 0xC9, 0x2, 0x33, 0xFF, 0xC9, 0x2, 0x46, 0xFF, 0xF1, 0x2, 0xA3, 0xFF, 0xC9, 0x4, 0x64, 0xFF, 0x62, 0x4, 0x68, 0xFF, 0x62, 0x4, 0x6F, 0xFF, 0x62, 0x4, 0x70, 0xFF, 0x62, 0x5, 0xF1, 0xFF, 0xC9, 0x6, 0x6A, 0xFF, 0xC9, 0x6, 0x6C, 0xFF, 0xC9, 0x6, 0x70, 0xFF, 0xC9, 0x6, 0x72, 0xFF, 0xC9, 0x6, 0x74, 0xFF, 0xC9, 0x8, 0xCD, 0xFF, 0xC9, 0x8, 0xCE, 0xFF, 0xC9, 0x8, 0xCF, 0xFF, 0xC9, 0x8, 0xD0, 0xFF, 0xC9, 0x8, 0xD1, 0xFF, 0xC9, 0x8, 0xD2, 0xFF, 0xC9, 0x8, 0xD3, 0xFF, 0xC9, 0x9, 0x4, 0xFF, 0xC9, 0x9, 0x6, 0xFF, 0xC9, 0x9, 0x8, 0xFF, 0xC9, 0x9, 0xD5, 0xFF, 0xC9, 0x9, 0xDD, 0xFF, 0xC9, 0xA, 0x5, 0xFF, 0xC9, 0xA, 0x31, 0xFF, 0xC9, 0xA, 0x47, 0xFF, 0xC9, 0xA, 0x49, 0xFF, 0xC9, 0xA, 0x6E, 0xFF, 0xC9, 0xA, 0x70, 0xFF, 0xC9, 0xA, 0x72, 0xFF, 0xC9, 0xA, 0x74, 0xFF, 0xC9, 0xA, 0x76, 0xFF, 0xC9, 0xA, 0x78, 0xFF, 0xC9, 0xA, 0x7A, 0xFF, 0xC9, 0xA, 0x7C, 0xFF, 0xC9, 0xA, 0x7E, 0xFF, 0xC9, 0xA, 0x80, 0xFF, 0xC9, 0xA, 0x82, 0xFF, 0xC9, 0xA, 0x84, 0xFF, 0xC9, 0xA, 0xEE, 0xFF, 0xC9, 0xA, 0xFF, 0xFF, 0xC9, 0xB, 0x1, 0xFF, 0xC9, 0xB, 0x14, 0xFF, 0xC9, 0xB, 0x16, 0xFF, 0xC9, 0xB, 0x2E, 0xFF, 0xC9, 0xC, 0x81, 0xFF, 0xC9, 0xC, 0x82, 0xFF, 0xC9, 0xC, 0x85, 0xFF, 0xC9, 0x0, 0x1, 0x2, 0x43, 0x0, 0x1A, 0x0, 0x2, 0x2, 0x49, 0xFF, 0xF8, 0x2, 0x8C, 0xFF, 0xF5, 0x1, 0x3E, 0x0, 0x48, 0xFF, 0xD9, 0x0, 0x49, 0xFF, 0xD9, 0x0, 0x4A, 0xFF, 0xD9, 0x0, 0x4C, 0xFF, 0xD9, 0x0, 0x52, 0xFF, 0xD1, 0x0, 0x53, 0xFF, 0xD1, 0x0, 0x54, 0xFF, 0xD2, 0x0, 0x55, 0xFF, 0xD1, 0x0, 0x56, 0xFF, 0xD9, 0x0, 0x5A, 0xFF, 0xDA, 0x0, 0x5B, 0xFF, 0xDF, 0x0, 0x5E, 0xFF, 0xDF, 0x0, 0x95, 0xFF, 0xD9, 0x0, 0x9F, 0xFF, 0xD9, 0x0, 0xB5, 0xFF, 0xD9, 0x0, 0xC4, 0xFF, 0xDA, 0x0, 0xDA, 0xFF, 0xD9, 0x0, 0xDC, 0xFF, 0xD9, 0x0, 0xE4, 0xFF, 0xD9, 0x0, 0xEA, 0xFF, 0xD1, 0x1, 0x0, 0xFF, 0xD9, 0x2, 0x28, 0xFF, 0xD1, 0x2, 0x2A, 0xFF, 0xD9, 0x2, 0x3A, 0xFF, 0xD9, 0x2, 0x3C, 0xFF, 0xDF, 0x2, 0x3D, 0xFF, 0xF8, 0x2, 0x3E, 0xFF, 0xE4, 0x2, 0x40, 0xFF, 0xD1, 0x2, 0x41, 0xFF, 0xE9, 0x2, 0x42, 0xFF, 0xE7, 0x2, 0x44, 0xFF, 0xEF, 0x2, 0x45, 0xFF, 0xE5, 0x2, 0x47, 0xFF, 0xD9, 0x2, 0x48, 0xFF, 0xD9, 0x2, 0x49, 0xFF, 0xE1, 0x2, 0x4A, 0xFF, 0xDA, 0x2, 0x4B, 0xFF, 0xCA, 0x2, 0x4C, 0xFF, 0xD0, 0x2, 0x4D, 0xFF, 0xD8, 0x2, 0x56, 0xFF, 0xD2, 0x2, 0x58, 0xFF, 0xD9, 0x2, 0x61, 0xFF, 0xD9, 0x2, 0x82, 0xFF, 0xD1, 0x2, 0x86, 0xFF, 0xD1, 0x2, 0x87, 0xFF, 0xD1, 0x2, 0x89, 0xFF, 0xD1, 0x2, 0x8A, 0xFF, 0xD1, 0x2, 0x8B, 0xFF, 0xD1, 0x2, 0x8D, 0xFF, 0xD9, 0x2, 0x8E, 0xFF, 0xD1, 0x2, 0x90, 0xFF, 0xD1, 0x2, 0x91, 0xFF, 0xD1, 0x2, 0x94, 0xFF, 0xD1, 0x2, 0x96, 0xFF, 0xD1, 0x2, 0x99, 0xFF, 0xD9, 0x2, 0x9B, 0xFF, 0xD1, 0x2, 0xAE, 0xFF, 0xD2, 0x2, 0xB0, 0xFF, 0xDF, 0x2, 0xB4, 0xFF, 0xD9, 0x2, 0xB8, 0xFF, 0xD9, 0x2, 0xC2, 0xFF, 0xD1, 0x2, 0xCD, 0xFF, 0xD1, 0x2, 0xD3, 0xFF, 0xD1, 0x2, 0xD5, 0xFF, 0xD1, 0x2, 0xD9, 0xFF, 0xD9, 0x2, 0xEA, 0xFF, 0xD1, 0x2, 0xEC, 0xFF, 0xD1, 0x2, 0xEE, 0xFF, 0xD1, 0x2, 0xF3, 0xFF, 0xD1, 0x2, 0xF7, 0xFF, 0xD9, 0x2, 0xF8, 0xFF, 0xD9, 0x3, 0x2, 0xFF, 0xD9, 0x3, 0xF, 0xFF, 0xD1, 0x3, 0x13, 0xFF, 0xD1, 0x5, 0x67, 0xFF, 0xDF, 0x5, 0x6E, 0xFF, 0xD9, 0x5, 0x70, 0xFF, 0xD2, 0x5, 0xEE, 0xFF, 0xD2, 0x5, 0xF0, 0xFF, 0xD1, 0x6, 0x0, 0xFF, 0xD1, 0x6, 0x2, 0xFF, 0xD2, 0x6, 0x4, 0xFF, 0xD2, 0x6, 0x6, 0xFF, 0xD2, 0x6, 0x28, 0xFF, 0xD1, 0x6, 0x30, 0xFF, 0xD1, 0x6, 0x32, 0xFF, 0xD2, 0x6, 0x85, 0xFF, 0xD2, 0x6, 0x87, 0xFF, 0xD2, 0x6, 0x8F, 0xFF, 0xD9, 0x6, 0x91, 0xFF, 0xD9, 0x6, 0xA9, 0xFF, 0xD9, 0x6, 0xAB, 0xFF, 0xD1, 0x6, 0xAC, 0xFF, 0xD1, 0x6, 0xCB, 0xFF, 0xD9, 0x6, 0xF7, 0xFF, 0xD9, 0x6, 0xFB, 0xFF, 0xD1, 0x6, 0xFC, 0xFF, 0xD1, 0x6, 0xFD, 0xFF, 0xD1, 0x7, 0x12, 0xFF, 0xD1, 0x8, 0xEF, 0xFF, 0xD9, 0x8, 0xF0, 0xFF, 0xD9, 0x8, 0xF1, 0xFF, 0xD9, 0x8, 0xF2, 0xFF, 0xD9, 0x8, 0xF3, 0xFF, 0xD9, 0x8, 0xF8, 0xFF, 0xD1, 0x8, 0xF9, 0xFF, 0xD2, 0x8, 0xFA, 0xFF, 0xD2, 0x8, 0xFB, 0xFF, 0xD2, 0x8, 0xFC, 0xFF, 0xD2, 0x8, 0xFD, 0xFF, 0xD2, 0x8, 0xFE, 0xFF, 0xDA, 0x8, 0xFF, 0xFF, 0xDA, 0x9, 0x0, 0xFF, 0xDA, 0x9, 0x1, 0xFF, 0xDA, 0x9, 0x2, 0xFF, 0xDF, 0x9, 0x3, 0xFF, 0xDF, 0x9, 0xB, 0xFF, 0xD9, 0x9, 0xD, 0xFF, 0xD9, 0x9, 0xF, 0xFF, 0xD9, 0x9, 0x11, 0xFF, 0xD9, 0x9, 0x13, 0xFF, 0xD9, 0x9, 0x15, 0xFF, 0xD9, 0x9, 0x17, 0xFF, 0xD9, 0x9, 0x19, 0xFF, 0xD9, 0x9, 0x1B, 0xFF, 0xD9, 0x9, 0x1D, 0xFF, 0xD9, 0x9, 0x1F, 0xFF, 0xD9, 0x9, 0x21, 0xFF, 0xD9, 0x9, 0x23, 0xFF, 0xD9, 0x9, 0x25, 0xFF, 0xD9, 0x9, 0x40, 0xFF, 0xD1, 0x9, 0x42, 0xFF, 0xD1, 0x9, 0x44, 0xFF, 0xD1, 0x9, 0x45, 0xFF, 0xD1, 0x9, 0x47, 0xFF, 0xD2, 0x9, 0x49, 0xFF, 0xD2, 0x9, 0x4B, 0xFF, 0xD2, 0x9, 0x63, 0xFF, 0xDA, 0x9, 0x65, 0xFF, 0xDA, 0x9, 0x67, 0xFF, 0xDA, 0x9, 0x69, 0xFF, 0xDA, 0x9, 0x6B, 0xFF, 0xDA, 0x9, 0x6D, 0xFF, 0xDA, 0x9, 0x71, 0xFF, 0xDF, 0x9, 0xED, 0xFF, 0xD9, 0x9, 0xEF, 0xFF, 0xD1, 0x9, 0xF1, 0xFF, 0xDA, 0x9, 0xF3, 0xFF, 0xD2, 0x9, 0xF5, 0xFF, 0xDF, 0x9, 0xF8, 0xFF, 0xDA, 0x9, 0xF9, 0xFF, 0xD2, 0x9, 0xFA, 0xFF, 0xDA, 0xA, 0x13, 0xFF, 0xD9, 0xA, 0x14, 0xFF, 0xD1, 0xA, 0x15, 0xFF, 0xD2, 0xA, 0x16, 0xFF, 0xD1, 0xA, 0x17, 0xFF, 0xD9, 0xA, 0x18, 0xFF, 0xDF, 0xA, 0x1A, 0xFF, 0xD9, 0xA, 0x1B, 0xFF, 0xD1, 0xA, 0x20, 0xFF, 0xD1, 0xA, 0x21, 0xFF, 0xDF, 0xA, 0x29, 0xFF, 0xDF, 0xA, 0x30, 0xFF, 0xD1, 0xA, 0x35, 0xFF, 0xD9, 0xA, 0x36, 0xFF, 0xD1, 0xA, 0x3A, 0xFF, 0xDF, 0xA, 0x3B, 0xFF, 0xD9, 0xA, 0x40, 0xFF, 0xD9, 0xA, 0x42, 0xFF, 0xDF, 0xA, 0x4E, 0xFF, 0xD9, 0xA, 0x50, 0xFF, 0xD9, 0xA, 0x51, 0xFF, 0xD9, 0xA, 0x57, 0xFF, 0xD1, 0xA, 0x59, 0xFF, 0xD1, 0xA, 0x5B, 0xFF, 0xD2, 0xA, 0x5D, 0xFF, 0xD9, 0xA, 0x60, 0xFF, 0xD2, 0xA, 0x64, 0xFF, 0xDF, 0xA, 0x66, 0xFF, 0xDF, 0xA, 0x68, 0xFF, 0xDF, 0xA, 0x6C, 0xFF, 0xD1, 0xA, 0x6D, 0xFF, 0xD9, 0xA, 0x87, 0xFF, 0xD9, 0xA, 0x89, 0xFF, 0xD9, 0xA, 0x8B, 0xFF, 0xD9, 0xA, 0x8D, 0xFF, 0xD9, 0xA, 0x8F, 0xFF, 0xD9, 0xA, 0x91, 0xFF, 0xD9, 0xA, 0x93, 0xFF, 0xD9, 0xA, 0x95, 0xFF, 0xD9, 0xA, 0x9B, 0xFF, 0xD2, 0xA, 0x9D, 0xFF, 0xD2, 0xA, 0x9F, 0xFF, 0xD2, 0xA, 0xA1, 0xFF, 0xD2, 0xA, 0xA3, 0xFF, 0xD2, 0xA, 0xA5, 0xFF, 0xD2, 0xA, 0xA7, 0xFF, 0xD2, 0xA, 0xA9, 0xFF, 0xD9, 0xA, 0xAB, 0xFF, 0xD9, 0xA, 0xAD, 0xFF, 0xD9, 0xA, 0xAF, 0xFF, 0xD2, 0xA, 0xB1, 0xFF, 0xD9, 0xA, 0xB3, 0xFF, 0xDA, 0xA, 0xB5, 0xFF, 0xDA, 0xA, 0xB7, 0xFF, 0xDA, 0xA, 0xB9, 0xFF, 0xDA, 0xA, 0xBB, 0xFF, 0xDA, 0xA, 0xBD, 0xFF, 0xDA, 0xA, 0xBF, 0xFF, 0xDA, 0xA, 0xC1, 0xFF, 0xDF, 0xA, 0xC3, 0xFF, 0xDF, 0xA, 0xC5, 0xFF, 0xDF, 0xA, 0xCC, 0xFF, 0xD1, 0xA, 0xE7, 0xFF, 0xD1, 0xA, 0xED, 0xFF, 0xD1, 0xA, 0xF3, 0xFF, 0xD2, 0xA, 0xF5, 0xFF, 0xDA, 0xA, 0xF7, 0xFF, 0xDA, 0xA, 0xF9, 0xFF, 0xDA, 0xA, 0xFB, 0xFF, 0xDA, 0xA, 0xFD, 0xFF, 0xDA, 0xA, 0xFE, 0xFF, 0xD9, 0xB, 0x6, 0xFF, 0xD9, 0xB, 0xA, 0xFF, 0xD2, 0xB, 0xC, 0xFF, 0xD2, 0xB, 0xF, 0xFF, 0xD9, 0xB, 0x13, 0xFF, 0xD1, 0xB, 0x19, 0xFF, 0xD9, 0xB, 0x1B, 0xFF, 0xD9, 0xB, 0x21, 0xFF, 0xD2, 0xB, 0x23, 0xFF, 0xD2, 0xB, 0x29, 0xFF, 0xDA, 0xB, 0x2B, 0xFF, 0xDA, 0xB, 0x33, 0xFF, 0xD2, 0xB, 0x35, 0xFF, 0xD2, 0xB, 0x37, 0xFF, 0xD2, 0xB, 0x39, 0xFF, 0xD2, 0xB, 0x3B, 0xFF, 0xDF, 0xB, 0x3C, 0xFF, 0xD2, 0xB, 0x42, 0xFF, 0xD9, 0xB, 0x4A, 0xFF, 0xD9, 0xB, 0x54, 0xFF, 0xD9, 0xB, 0x56, 0xFF, 0xD9, 0xB, 0x58, 0xFF, 0xD9, 0xB, 0x5A, 0xFF, 0xD9, 0xB, 0x5C, 0xFF, 0xD9, 0xB, 0x5E, 0xFF, 0xD9, 0xB, 0x60, 0xFF, 0xD9, 0xB, 0x62, 0xFF, 0xD9, 0xB, 0x64, 0xFF, 0xD9, 0xB, 0x66, 0xFF, 0xD9, 0xB, 0x68, 0xFF, 0xD9, 0xB, 0x6C, 0xFF, 0xD9, 0xB, 0x84, 0xFF, 0xD1, 0xB, 0x86, 0xFF, 0xD1, 0xB, 0x88, 0xFF, 0xD1, 0xB, 0x8A, 0xFF, 0xD1, 0xB, 0x8C, 0xFF, 0xD1, 0xB, 0x8E, 0xFF, 0xD1, 0xB, 0x90, 0xFF, 0xD2, 0xB, 0x92, 0xFF, 0xD2, 0xB, 0x94, 0xFF, 0xD2, 0xB, 0x96, 0xFF, 0xD2, 0xB, 0xB6, 0xFF, 0xDA, 0xB, 0xB8, 0xFF, 0xDA, 0xB, 0xBA, 0xFF, 0xDA, 0xB, 0xBC, 0xFF, 0xDA, 0xB, 0xBE, 0xFF, 0xDA, 0xB, 0xC0, 0xFF, 0xDF, 0xB, 0xC2, 0xFF, 0xDF, 0xB, 0xCC, 0xFF, 0xDF, 0xB, 0xD6, 0xFF, 0xDF, 0xB, 0xD8, 0xFF, 0xD9, 0xB, 0xD9, 0xFF, 0xD9, 0xB, 0xDA, 0xFF, 0xD9, 0xB, 0xDB, 0xFF, 0xD9, 0xB, 0xDC, 0xFF, 0xD9, 0xB, 0xDD, 0xFF, 0xD9, 0xB, 0xDE, 0xFF, 0xD9, 0xB, 0xDF, 0xFF, 0xD9, 0xC, 0x14, 0xFF, 0xD2, 0xC, 0x15, 0xFF, 0xD2, 0xC, 0x16, 0xFF, 0xD2, 0xC, 0x17, 0xFF, 0xD2, 0xC, 0x18, 0xFF, 0xD2, 0xC, 0x19, 0xFF, 0xD2, 0xC, 0x20, 0xFF, 0xDA, 0xC, 0x21, 0xFF, 0xDA, 0xC, 0x22, 0xFF, 0xDA, 0xC, 0x23, 0xFF, 0xDA, 0xC, 0x24, 0xFF, 0xDA, 0xC, 0x25, 0xFF, 0xDA, 0xC, 0x26, 0xFF, 0xDA, 0xC, 0x27, 0xFF, 0xDA, 0xC, 0x44, 0xFF, 0xD2, 0xC, 0x45, 0xFF, 0xD2, 0xC, 0x46, 0xFF, 0xDA, 0xC, 0x47, 0xFF, 0xDA, 0xC, 0x4A, 0xFF, 0xD9, 0xC, 0x4B, 0xFF, 0xD9, 0xC, 0x4C, 0xFF, 0xD9, 0xC, 0x4D, 0xFF, 0xD9, 0xC, 0x4E, 0xFF, 0xD9, 0xC, 0x4F, 0xFF, 0xD9, 0xC, 0x50, 0xFF, 0xD9, 0xC, 0x51, 0xFF, 0xD9, 0xC, 0x7A, 0xFF, 0xD9, 0xC, 0x7B, 0xFF, 0xD9, 0xC, 0x7C, 0xFF, 0xD9, 0xC, 0x7D, 0xFF, 0xD9, 0xC, 0x7E, 0xFF, 0xD9, 0xC, 0x7F, 0xFF, 0xD9, 0xC, 0x80, 0xFF, 0xD9, 0xC, 0x9A, 0xFF, 0xDA, 0xC, 0x9B, 0xFF, 0xDA, 0xC, 0x9C, 0xFF, 0xDA, 0xC, 0x9D, 0xFF, 0xDA, 0x0, 0xCE, 0x0, 0x7, 0xFF, 0xD7, 0x0, 0xC, 0xFF, 0xD7, 0x0, 0x48, 0xFF, 0xEF, 0x0, 0x49, 0xFF, 0xEF, 0x0, 0x4A, 0xFF, 0xEF, 0x0, 0x4C, 0xFF, 0xEF, 0x0, 0x56, 0xFF, 0xEF, 0x0, 0x5A, 0xFF, 0xEE, 0x0, 0x5B, 0xFF, 0xD9, 0x0, 0x5E, 0xFF, 0xD9, 0x0, 0x95, 0xFF, 0xEF, 0x0, 0x9F, 0xFF, 0xEF, 0x0, 0xB5, 0xFF, 0xEF, 0x0, 0xC4, 0xFF, 0xEE, 0x0, 0xDA, 0xFF, 0xEF, 0x0, 0xDC, 0xFF, 0xEF, 0x0, 0xE4, 0xFF, 0xEF, 0x1, 0x0, 0xFF, 0xEF, 0x2, 0x2A, 0xFF, 0xEF, 0x2, 0x3A, 0xFF, 0xEF, 0x2, 0x3C, 0xFF, 0xD9, 0x2, 0x41, 0xFF, 0xEA, 0x2, 0x43, 0x0, 0x10, 0x2, 0x45, 0xFF, 0xE8, 0x2, 0x47, 0xFF, 0xEF, 0x2, 0x48, 0xFF, 0xEF, 0x2, 0x49, 0xFF, 0xD0, 0x2, 0x4A, 0xFF, 0xEE, 0x2, 0x4B, 0xFF, 0xE5, 0x2, 0x58, 0xFF, 0xEF, 0x2, 0x61, 0xFF, 0xEF, 0x2, 0x8D, 0xFF, 0xEF, 0x2, 0x99, 0xFF, 0xEF, 0x2, 0xB0, 0xFF, 0xD9, 0x2, 0xB4, 0xFF, 0xEF, 0x2, 0xB8, 0xFF, 0xEF, 0x2, 0xD9, 0xFF, 0xEF, 0x2, 0xF7, 0xFF, 0xEF, 0x2, 0xF8, 0xFF, 0xEF, 0x3, 0x2, 0xFF, 0xEF, 0x4, 0x62, 0xFF, 0xD7, 0x4, 0x63, 0xFF, 0xD7, 0x4, 0x65, 0xFF, 0xD7, 0x4, 0x66, 0xFF, 0xD7, 0x4, 0x67, 0xFF, 0xD7, 0x5, 0x67, 0xFF, 0xD9, 0x5, 0x6E, 0xFF, 0xEF, 0x6, 0x8F, 0xFF, 0xEF, 0x6, 0x91, 0xFF, 0xEF, 0x6, 0xA9, 0xFF, 0xEF, 0x6, 0xCB, 0xFF, 0xEF, 0x6, 0xF7, 0xFF, 0xEF, 0x8, 0xEF, 0xFF, 0xEF, 0x8, 0xF0, 0xFF, 0xEF, 0x8, 0xF1, 0xFF, 0xEF, 0x8, 0xF2, 0xFF, 0xEF, 0x8, 0xF3, 0xFF, 0xEF, 0x8, 0xFE, 0xFF, 0xEE, 0x8, 0xFF, 0xFF, 0xEE, 0x9, 0x0, 0xFF, 0xEE, 0x9, 0x1, 0xFF, 0xEE, 0x9, 0x2, 0xFF, 0xD9, 0x9, 0x3, 0xFF, 0xD9, 0x9, 0xB, 0xFF, 0xEF, 0x9, 0xD, 0xFF, 0xEF, 0x9, 0xF, 0xFF, 0xEF, 0x9, 0x11, 0xFF, 0xEF, 0x9, 0x13, 0xFF, 0xEF, 0x9, 0x15, 0xFF, 0xEF, 0x9, 0x17, 0xFF, 0xEF, 0x9, 0x19, 0xFF, 0xEF, 0x9, 0x1B, 0xFF, 0xEF, 0x9, 0x1D, 0xFF, 0xEF, 0x9, 0x1F, 0xFF, 0xEF, 0x9, 0x21, 0xFF, 0xEF, 0x9, 0x23, 0xFF, 0xEF, 0x9, 0x25, 0xFF, 0xEF, 0x9, 0x63, 0xFF, 0xEE, 0x9, 0x65, 0xFF, 0xEE, 0x9, 0x67, 0xFF, 0xEE, 0x9, 0x69, 0xFF, 0xEE, 0x9, 0x6B, 0xFF, 0xEE, 0x9, 0x6D, 0xFF, 0xEE, 0x9, 0x71, 0xFF, 0xD9, 0x9, 0xED, 0xFF, 0xEF, 0x9, 0xF1, 0xFF, 0xEE, 0x9, 0xF5, 0xFF, 0xD9, 0x9, 0xF8, 0xFF, 0xEE, 0x9, 0xFA, 0xFF, 0xEE, 0xA, 0x13, 0xFF, 0xEF, 0xA, 0x17, 0xFF, 0xEF, 0xA, 0x18, 0xFF, 0xD9, 0xA, 0x1A, 0xFF, 0xEF, 0xA, 0x21, 0xFF, 0xD9, 0xA, 0x29, 0xFF, 0xD9, 0xA, 0x2A, 0xFF, 0xD7, 0xA, 0x2B, 0xFF, 0xD7, 0xA, 0x2E, 0xFF, 0xD7, 0xA, 0x35, 0xFF, 0xEF, 0xA, 0x3A, 0xFF, 0xD9, 0xA, 0x3B, 0xFF, 0xEF, 0xA, 0x40, 0xFF, 0xEF, 0xA, 0x42, 0xFF, 0xD9, 0xA, 0x4E, 0xFF, 0xEF, 0xA, 0x50, 0xFF, 0xEF, 0xA, 0x51, 0xFF, 0xEF, 0xA, 0x5D, 0xFF, 0xEF, 0xA, 0x64, 0xFF, 0xD9, 0xA, 0x66, 0xFF, 0xD9, 0xA, 0x68, 0xFF, 0xD9, 0xA, 0x6D, 0xFF, 0xEF, 0xA, 0x87, 0xFF, 0xEF, 0xA, 0x89, 0xFF, 0xEF, 0xA, 0x8B, 0xFF, 0xEF, 0xA, 0x8D, 0xFF, 0xEF, 0xA, 0x8F, 0xFF, 0xEF, 0xA, 0x91, 0xFF, 0xEF, 0xA, 0x93, 0xFF, 0xEF, 0xA, 0x95, 0xFF, 0xEF, 0xA, 0xA9, 0xFF, 0xEF, 0xA, 0xAB, 0xFF, 0xEF, 0xA, 0xAD, 0xFF, 0xEF, 0xA, 0xB1, 0xFF, 0xEF, 0xA, 0xB3, 0xFF, 0xEE, 0xA, 0xB5, 0xFF, 0xEE, 0xA, 0xB7, 0xFF, 0xEE, 0xA, 0xB9, 0xFF, 0xEE, 0xA, 0xBB, 0xFF, 0xEE, 0xA, 0xBD, 0xFF, 0xEE, 0xA, 0xBF, 0xFF, 0xEE, 0xA, 0xC1, 0xFF, 0xD9, 0xA, 0xC3, 0xFF, 0xD9, 0xA, 0xC5, 0xFF, 0xD9, 0xA, 0xF5, 0xFF, 0xEE, 0xA, 0xF7, 0xFF, 0xEE, 0xA, 0xF9, 0xFF, 0xEE, 0xA, 0xFB, 0xFF, 0xEE, 0xA, 0xFD, 0xFF, 0xEE, 0xA, 0xFE, 0xFF, 0xEF, 0xB, 0x6, 0xFF, 0xEF, 0xB, 0xF, 0xFF, 0xEF, 0xB, 0x19, 0xFF, 0xEF, 0xB, 0x1B, 0xFF, 0xEF, 0xB, 0x29, 0xFF, 0xEE, 0xB, 0x2B, 0xFF, 0xEE, 0xB, 0x3B, 0xFF, 0xD9, 0xB, 0x42, 0xFF, 0xEF, 0xB, 0x4A, 0xFF, 0xEF, 0xB, 0x54, 0xFF, 0xEF, 0xB, 0x56, 0xFF, 0xEF, 0xB, 0x58, 0xFF, 0xEF, 0xB, 0x5A, 0xFF, 0xEF, 0xB, 0x5C, 0xFF, 0xEF, 0xB, 0x5E, 0xFF, 0xEF, 0xB, 0x60, 0xFF, 0xEF, 0xB, 0x62, 0xFF, 0xEF, 0xB, 0x64, 0xFF, 0xEF, 0xB, 0x66, 0xFF, 0xEF, 0xB, 0x68, 0xFF, 0xEF, 0xB, 0x6C, 0xFF, 0xEF, 0xB, 0xB6, 0xFF, 0xEE, 0xB, 0xB8, 0xFF, 0xEE, 0xB, 0xBA, 0xFF, 0xEE, 0xB, 0xBC, 0xFF, 0xEE, 0xB, 0xBE, 0xFF, 0xEE, 0xB, 0xC0, 0xFF, 0xD9, 0xB, 0xC2, 0xFF, 0xD9, 0xB, 0xCC, 0xFF, 0xD9, 0xB, 0xD6, 0xFF, 0xD9, 0xB, 0xD8, 0xFF, 0xEF, 0xB, 0xD9, 0xFF, 0xEF, 0xB, 0xDA, 0xFF, 0xEF, 0xB, 0xDB, 0xFF, 0xEF, 0xB, 0xDC, 0xFF, 0xEF, 0xB, 0xDD, 0xFF, 0xEF, 0xB, 0xDE, 0xFF, 0xEF, 0xB, 0xDF, 0xFF, 0xEF, 0xC, 0x20, 0xFF, 0xEE, 0xC, 0x21, 0xFF, 0xEE, 0xC, 0x22, 0xFF, 0xEE, 0xC, 0x23, 0xFF, 0xEE, 0xC, 0x24, 0xFF, 0xEE, 0xC, 0x25, 0xFF, 0xEE, 0xC, 0x26, 0xFF, 0xEE, 0xC, 0x27, 0xFF, 0xEE, 0xC, 0x46, 0xFF, 0xEE, 0xC, 0x47, 0xFF, 0xEE, 0xC, 0x4A, 0xFF, 0xEF, 0xC, 0x4B, 0xFF, 0xEF, 0xC, 0x4C, 0xFF, 0xEF, 0xC, 0x4D, 0xFF, 0xEF, 0xC, 0x4E, 0xFF, 0xEF, 0xC, 0x4F, 0xFF, 0xEF, 0xC, 0x50, 0xFF, 0xEF, 0xC, 0x51, 0xFF, 0xEF, 0xC, 0x7A, 0xFF, 0xEF, 0xC, 0x7B, 0xFF, 0xEF, 0xC, 0x7C, 0xFF, 0xEF, 0xC, 0x7D, 0xFF, 0xEF, 0xC, 0x7E, 0xFF, 0xEF, 0xC, 0x7F, 0xFF, 0xEF, 0xC, 0x80, 0xFF, 0xEF, 0xC, 0x9A, 0xFF, 0xEE, 0xC, 0x9B, 0xFF, 0xEE, 0xC, 0x9C, 0xFF, 0xEE, 0xC, 0x9D, 0xFF, 0xEE, 0x0, 0x59, 0x0, 0x7, 0xFF, 0xD6, 0x0, 0xC, 0xFF, 0xD6, 0x0, 0x4B, 0xFF, 0xF6, 0x0, 0x5A, 0xFF, 0xFA, 0x0, 0x5B, 0xFF, 0xE6, 0x0, 0x5E, 0xFF, 0xE6, 0x0, 0xC4, 0xFF, 0xFA, 0x2, 0x3C, 0xFF, 0xE6, 0x2, 0x41, 0xFF, 0xF8, 0x2, 0x43, 0x0, 0x7, 0x2, 0x45, 0xFF, 0xF7, 0x2, 0x49, 0xFF, 0xCE, 0x2, 0x4A, 0xFF, 0xFA, 0x2, 0xB0, 0xFF, 0xE6, 0x4, 0x62, 0xFF, 0xD6, 0x4, 0x63, 0xFF, 0xD6, 0x4, 0x65, 0xFF, 0xD6, 0x4, 0x66, 0xFF, 0xD6, 0x4, 0x67, 0xFF, 0xD6, 0x5, 0x67, 0xFF, 0xE6, 0x8, 0xFE, 0xFF, 0xFA, 0x8, 0xFF, 0xFF, 0xFA, 0x9, 0x0, 0xFF, 0xFA, 0x9, 0x1, 0xFF, 0xFA, 0x9, 0x2, 0xFF, 0xE6, 0x9, 0x3, 0xFF, 0xE6, 0x9, 0x63, 0xFF, 0xFA, 0x9, 0x65, 0xFF, 0xFA, 0x9, 0x67, 0xFF, 0xFA, 0x9, 0x69, 0xFF, 0xFA, 0x9, 0x6B, 0xFF, 0xFA, 0x9, 0x6D, 0xFF, 0xFA, 0x9, 0x71, 0xFF, 0xE6, 0x9, 0xF1, 0xFF, 0xFA, 0x9, 0xF5, 0xFF, 0xE6, 0x9, 0xF8, 0xFF, 0xFA, 0x9, 0xFA, 0xFF, 0xFA, 0xA, 0x18, 0xFF, 0xE6, 0xA, 0x21, 0xFF, 0xE6, 0xA, 0x29, 0xFF, 0xE6, 0xA, 0x2A, 0xFF, 0xD6, 0xA, 0x2B, 0xFF, 0xD6, 0xA, 0x2E, 0xFF, 0xD6, 0xA, 0x3A, 0xFF, 0xE6, 0xA, 0x42, 0xFF, 0xE6, 0xA, 0x64, 0xFF, 0xE6, 0xA, 0x66, 0xFF, 0xE6, 0xA, 0x68, 0xFF, 0xE6, 0xA, 0xB3, 0xFF, 0xFA, 0xA, 0xB5, 0xFF, 0xFA, 0xA, 0xB7, 0xFF, 0xFA, 0xA, 0xB9, 0xFF, 0xFA, 0xA, 0xBB, 0xFF, 0xFA, 0xA, 0xBD, 0xFF, 0xFA, 0xA, 0xBF, 0xFF, 0xFA, 0xA, 0xC1, 0xFF, 0xE6, 0xA, 0xC3, 0xFF, 0xE6, 0xA, 0xC5, 0xFF, 0xE6, 0xA, 0xF5, 0xFF, 0xFA, 0xA, 0xF7, 0xFF, 0xFA, 0xA, 0xF9, 0xFF, 0xFA, 0xA, 0xFB, 0xFF, 0xFA, 0xA, 0xFD, 0xFF, 0xFA, 0xB, 0x29, 0xFF, 0xFA, 0xB, 0x2B, 0xFF, 0xFA, 0xB, 0x3B, 0xFF, 0xE6, 0xB, 0xB6, 0xFF, 0xFA, 0xB, 0xB8, 0xFF, 0xFA, 0xB, 0xBA, 0xFF, 0xFA, 0xB, 0xBC, 0xFF, 0xFA, 0xB, 0xBE, 0xFF, 0xFA, 0xB, 0xC0, 0xFF, 0xE6, 0xB, 0xC2, 0xFF, 0xE6, 0xB, 0xCC, 0xFF, 0xE6, 0xB, 0xD6, 0xFF, 0xE6, 0xC, 0x20, 0xFF, 0xFA, 0xC, 0x21, 0xFF, 0xFA, 0xC, 0x22, 0xFF, 0xFA, 0xC, 0x23, 0xFF, 0xFA, 0xC, 0x24, 0xFF, 0xFA, 0xC, 0x25, 0xFF, 0xFA, 0xC, 0x26, 0xFF, 0xFA, 0xC, 0x27, 0xFF, 0xFA, 0xC, 0x46, 0xFF, 0xFA, 0xC, 0x47, 0xFF, 0xFA, 0xC, 0x9A, 0xFF, 0xFA, 0xC, 0x9B, 0xFF, 0xFA, 0xC, 0x9C, 0xFF, 0xFA, 0xC, 0x9D, 0xFF, 0xFA, 0x0, 0x7C, 0x0, 0x11, 0x0, 0x11, 0x0, 0x13, 0x0, 0x11, 0x0, 0x48, 0xFF, 0xE5, 0x0, 0x49, 0xFF, 0xE5, 0x0, 0x4A, 0xFF, 0xE5, 0x0, 0x4C, 0xFF, 0xE5, 0x0, 0x56, 0xFF, 0xE5, 0x0, 0x95, 0xFF, 0xE5, 0x0, 0x9F, 0xFF, 0xE5, 0x0, 0xB5, 0xFF, 0xE5, 0x0, 0xDA, 0xFF, 0xE5, 0x0, 0xDC, 0xFF, 0xE5, 0x0, 0xE4, 0xFF, 0xE5, 0x1, 0x0, 0xFF, 0xE5, 0x2, 0x2A, 0xFF, 0xE5, 0x2, 0x3A, 0xFF, 0xE5, 0x2, 0x43, 0x0, 0x10, 0x2, 0x47, 0xFF, 0xE5, 0x2, 0x48, 0xFF, 0xE5, 0x2, 0x58, 0xFF, 0xE5, 0x2, 0x61, 0xFF, 0xE5, 0x2, 0x8D, 0xFF, 0xE5, 0x2, 0x99, 0xFF, 0xE5, 0x2, 0xB4, 0xFF, 0xE5, 0x2, 0xB8, 0xFF, 0xE5, 0x2, 0xD9, 0xFF, 0xE5, 0x2, 0xF7, 0xFF, 0xE5, 0x2, 0xF8, 0xFF, 0xE5, 0x3, 0x2, 0xFF, 0xE5, 0x4, 0x64, 0x0, 0x11, 0x4, 0x68, 0x0, 0x11, 0x4, 0x6F, 0x0, 0x11, 0x4, 0x70, 0x0, 0x11, 0x5, 0x6E, 0xFF, 0xE5, 0x6, 0x8F, 0xFF, 0xE5, 0x6, 0x91, 0xFF, 0xE5, 0x6, 0xA9, 0xFF, 0xE5, 0x6, 0xCB, 0xFF, 0xE5, 0x6, 0xF7, 0xFF, 0xE5, 0x8, 0xEF, 0xFF, 0xE5, 0x8, 0xF0, 0xFF, 0xE5, 0x8, 0xF1, 0xFF, 0xE5, 0x8, 0xF2, 0xFF, 0xE5, 0x8, 0xF3, 0xFF, 0xE5, 0x9, 0xB, 0xFF, 0xE5, 0x9, 0xD, 0xFF, 0xE5, 0x9, 0xF, 0xFF, 0xE5, 0x9, 0x11, 0xFF, 0xE5, 0x9, 0x13, 0xFF, 0xE5, 0x9, 0x15, 0xFF, 0xE5, 0x9, 0x17, 0xFF, 0xE5, 0x9, 0x19, 0xFF, 0xE5, 0x9, 0x1B, 0xFF, 0xE5, 0x9, 0x1D, 0xFF, 0xE5, 0x9, 0x1F, 0xFF, 0xE5, 0x9, 0x21, 0xFF, 0xE5, 0x9, 0x23, 0xFF, 0xE5, 0x9, 0x25, 0xFF, 0xE5, 0x9, 0xED, 0xFF, 0xE5, 0xA, 0x13, 0xFF, 0xE5, 0xA, 0x17, 0xFF, 0xE5, 0xA, 0x1A, 0xFF, 0xE5, 0xA, 0x35, 0xFF, 0xE5, 0xA, 0x3B, 0xFF, 0xE5, 0xA, 0x40, 0xFF, 0xE5, 0xA, 0x4E, 0xFF, 0xE5, 0xA, 0x50, 0xFF, 0xE5, 0xA, 0x51, 0xFF, 0xE5, 0xA, 0x5D, 0xFF, 0xE5, 0xA, 0x6D, 0xFF, 0xE5, 0xA, 0x87, 0xFF, 0xE5, 0xA, 0x89, 0xFF, 0xE5, 0xA, 0x8B, 0xFF, 0xE5, 0xA, 0x8D, 0xFF, 0xE5, 0xA, 0x8F, 0xFF, 0xE5, 0xA, 0x91, 0xFF, 0xE5, 0xA, 0x93, 0xFF, 0xE5, 0xA, 0x95, 0xFF, 0xE5, 0xA, 0xA9, 0xFF, 0xE5, 0xA, 0xAB, 0xFF, 0xE5, 0xA, 0xAD, 0xFF, 0xE5, 0xA, 0xB1, 0xFF, 0xE5, 0xA, 0xFE, 0xFF, 0xE5, 0xB, 0x6, 0xFF, 0xE5, 0xB, 0xF, 0xFF, 0xE5, 0xB, 0x19, 0xFF, 0xE5, 0xB, 0x1B, 0xFF, 0xE5, 0xB, 0x42, 0xFF, 0xE5, 0xB, 0x4A, 0xFF, 0xE5, 0xB, 0x54, 0xFF, 0xE5, 0xB, 0x56, 0xFF, 0xE5, 0xB, 0x58, 0xFF, 0xE5, 0xB, 0x5A, 0xFF, 0xE5, 0xB, 0x5C, 0xFF, 0xE5, 0xB, 0x5E, 0xFF, 0xE5, 0xB, 0x60, 0xFF, 0xE5, 0xB, 0x62, 0xFF, 0xE5, 0xB, 0x64, 0xFF, 0xE5, 0xB, 0x66, 0xFF, 0xE5, 0xB, 0x68, 0xFF, 0xE5, 0xB, 0x6C, 0xFF, 0xE5, 0xB, 0xD8, 0xFF, 0xE5, 0xB, 0xD9, 0xFF, 0xE5, 0xB, 0xDA, 0xFF, 0xE5, 0xB, 0xDB, 0xFF, 0xE5, 0xB, 0xDC, 0xFF, 0xE5, 0xB, 0xDD, 0xFF, 0xE5, 0xB, 0xDE, 0xFF, 0xE5, 0xB, 0xDF, 0xFF, 0xE5, 0xC, 0x4A, 0xFF, 0xE5, 0xC, 0x4B, 0xFF, 0xE5, 0xC, 0x4C, 0xFF, 0xE5, 0xC, 0x4D, 0xFF, 0xE5, 0xC, 0x4E, 0xFF, 0xE5, 0xC, 0x4F, 0xFF, 0xE5, 0xC, 0x50, 0xFF, 0xE5, 0xC, 0x51, 0xFF, 0xE5, 0xC, 0x7A, 0xFF, 0xE5, 0xC, 0x7B, 0xFF, 0xE5, 0xC, 0x7C, 0xFF, 0xE5, 0xC, 0x7D, 0xFF, 0xE5, 0xC, 0x7E, 0xFF, 0xE5, 0xC, 0x7F, 0xFF, 0xE5, 0xC, 0x80, 0xFF, 0xE5, 0x0, 0x6, 0x2, 0x49, 0xFF, 0xE8, 0x2, 0x83, 0xFF, 0xDB, 0x2, 0x8C, 0xFF, 0xDD, 0x2, 0x94, 0xFF, 0xF4, 0x2, 0xD1, 0xFF, 0xEA, 0x3, 0x4, 0xFF, 0xEA, 0x0, 0x1, 0x2, 0x8C, 0xFF, 0xD6, 0x0, 0x1, 0x2, 0x49, 0x0, 0x19, 0x1, 0x17, 0x0, 0x7, 0x0, 0xD, 0x0, 0xC, 0x0, 0xD, 0x0, 0x48, 0xFF, 0xE6, 0x0, 0x49, 0xFF, 0xE6, 0x0, 0x4A, 0xFF, 0xE6, 0x0, 0x4B, 0x0, 0xD, 0x0, 0x4C, 0xFF, 0xE6, 0x0, 0x54, 0xFF, 0xE8, 0x0, 0x56, 0xFF, 0xE6, 0x0, 0x5B, 0x0, 0xC, 0x0, 0x5E, 0x0, 0xC, 0x0, 0x95, 0xFF, 0xE6, 0x0, 0x9F, 0xFF, 0xE6, 0x0, 0xB5, 0xFF, 0xE6, 0x0, 0xDA, 0xFF, 0xE6, 0x0, 0xDC, 0xFF, 0xE6, 0x0, 0xE4, 0xFF, 0xE6, 0x1, 0x0, 0xFF, 0xE6, 0x2, 0x2A, 0xFF, 0xE6, 0x2, 0x3A, 0xFF, 0xE6, 0x2, 0x3C, 0x0, 0xC, 0x2, 0x3D, 0xFF, 0xF8, 0x2, 0x43, 0xFF, 0xB7, 0x2, 0x45, 0x0, 0xC, 0x2, 0x47, 0xFF, 0xE6, 0x2, 0x48, 0xFF, 0xE6, 0x2, 0x49, 0x0, 0xD, 0x2, 0x56, 0xFF, 0xE8, 0x2, 0x58, 0xFF, 0xE6, 0x2, 0x61, 0xFF, 0xE6, 0x2, 0x8D, 0xFF, 0xE6, 0x2, 0x99, 0xFF, 0xE6, 0x2, 0xAE, 0xFF, 0xE8, 0x2, 0xB0, 0x0, 0xC, 0x2, 0xB4, 0xFF, 0xE6, 0x2, 0xB8, 0xFF, 0xE6, 0x2, 0xD9, 0xFF, 0xE6, 0x2, 0xF7, 0xFF, 0xE6, 0x2, 0xF8, 0xFF, 0xE6, 0x3, 0x2, 0xFF, 0xE6, 0x4, 0x62, 0x0, 0xD, 0x4, 0x63, 0x0, 0xD, 0x4, 0x65, 0x0, 0xD, 0x4, 0x66, 0x0, 0xD, 0x4, 0x67, 0x0, 0xD, 0x5, 0x67, 0x0, 0xC, 0x5, 0x6E, 0xFF, 0xE6, 0x5, 0x70, 0xFF, 0xE8, 0x5, 0xEE, 0xFF, 0xE8, 0x6, 0x2, 0xFF, 0xE8, 0x6, 0x4, 0xFF, 0xE8, 0x6, 0x6, 0xFF, 0xE8, 0x6, 0x32, 0xFF, 0xE8, 0x6, 0x85, 0xFF, 0xE8, 0x6, 0x87, 0xFF, 0xE8, 0x6, 0x8F, 0xFF, 0xE6, 0x6, 0x91, 0xFF, 0xE6, 0x6, 0xA9, 0xFF, 0xE6, 0x6, 0xCB, 0xFF, 0xE6, 0x6, 0xF7, 0xFF, 0xE6, 0x7, 0x4F, 0x0, 0xE, 0x7, 0x52, 0x0, 0xE, 0x7, 0x54, 0x0, 0xF, 0x7, 0x55, 0xFF, 0xF4, 0x7, 0x57, 0xFF, 0xEA, 0x7, 0x59, 0xFF, 0xEC, 0x7, 0x61, 0xFF, 0xEA, 0x7, 0x67, 0xFF, 0xB9, 0x7, 0x68, 0xFF, 0xEC, 0x7, 0x69, 0xFF, 0xB9, 0x7, 0x70, 0x0, 0xF, 0x7, 0x71, 0xFF, 0xEC, 0x7, 0x74, 0x0, 0xF, 0x7, 0x8C, 0x0, 0xF, 0x7, 0x8D, 0xFF, 0xEC, 0x7, 0x8E, 0x0, 0xE, 0x7, 0x90, 0x0, 0xF, 0x7, 0x96, 0xFF, 0xEC, 0x7, 0xAF, 0xFF, 0xED, 0x7, 0xB1, 0xFF, 0xB9, 0x8, 0xEF, 0xFF, 0xE6, 0x8, 0xF0, 0xFF, 0xE6, 0x8, 0xF1, 0xFF, 0xE6, 0x8, 0xF2, 0xFF, 0xE6, 0x8, 0xF3, 0xFF, 0xE6, 0x8, 0xF9, 0xFF, 0xE8, 0x8, 0xFA, 0xFF, 0xE8, 0x8, 0xFB, 0xFF, 0xE8, 0x8, 0xFC, 0xFF, 0xE8, 0x8, 0xFD, 0xFF, 0xE8, 0x9, 0x2, 0x0, 0xC, 0x9, 0x3, 0x0, 0xC, 0x9, 0xB, 0xFF, 0xE6, 0x9, 0xD, 0xFF, 0xE6, 0x9, 0xF, 0xFF, 0xE6, 0x9, 0x11, 0xFF, 0xE6, 0x9, 0x13, 0xFF, 0xE6, 0x9, 0x15, 0xFF, 0xE6, 0x9, 0x17, 0xFF, 0xE6, 0x9, 0x19, 0xFF, 0xE6, 0x9, 0x1B, 0xFF, 0xE6, 0x9, 0x1D, 0xFF, 0xE6, 0x9, 0x1F, 0xFF, 0xE6, 0x9, 0x21, 0xFF, 0xE6, 0x9, 0x23, 0xFF, 0xE6, 0x9, 0x25, 0xFF, 0xE6, 0x9, 0x47, 0xFF, 0xE8, 0x9, 0x49, 0xFF, 0xE8, 0x9, 0x4B, 0xFF, 0xE8, 0x9, 0x71, 0x0, 0xC, 0x9, 0x80, 0xFF, 0xB9, 0x9, 0x81, 0xFF, 0xB9, 0x9, 0x82, 0xFF, 0xB9, 0x9, 0x83, 0xFF, 0xB9, 0x9, 0x84, 0xFF, 0xB9, 0x9, 0x85, 0xFF, 0xB9, 0x9, 0x86, 0xFF, 0xB9, 0x9, 0x87, 0xFF, 0xEC, 0x9, 0x91, 0xFF, 0xEC, 0x9, 0x92, 0xFF, 0xEC, 0x9, 0x93, 0xFF, 0xEC, 0x9, 0x94, 0xFF, 0xEC, 0x9, 0x95, 0xFF, 0xEC, 0x9, 0x9A, 0x0, 0xE, 0x9, 0x9B, 0xFF, 0xB9, 0x9, 0x9C, 0xFF, 0xB9, 0x9, 0x9D, 0xFF, 0xB9, 0x9, 0x9E, 0xFF, 0xEC, 0x9, 0x9F, 0xFF, 0xEC, 0x9, 0xA0, 0xFF, 0xEC, 0x9, 0xA1, 0xFF, 0xEC, 0x9, 0xA8, 0xFF, 0xEC, 0x9, 0xA9, 0xFF, 0xEC, 0x9, 0xAA, 0xFF, 0xEC, 0x9, 0xAB, 0xFF, 0xEC, 0x9, 0xBB, 0xFF, 0xEC, 0x9, 0xBC, 0xFF, 0xEC, 0x9, 0xBD, 0xFF, 0xEC, 0x9, 0xBE, 0xFF, 0xEC, 0x9, 0xC2, 0xFF, 0xF4, 0x9, 0xC3, 0xFF, 0xF4, 0x9, 0xC4, 0xFF, 0xF4, 0x9, 0xC5, 0xFF, 0xF4, 0x9, 0xC7, 0x0, 0xF, 0x9, 0xD0, 0x0, 0xE, 0x9, 0xD1, 0x0, 0xE, 0x9, 0xED, 0xFF, 0xE6, 0x9, 0xF3, 0xFF, 0xE8, 0x9, 0xF5, 0x0, 0xC, 0x9, 0xF9, 0xFF, 0xE8, 0xA, 0x13, 0xFF, 0xE6, 0xA, 0x15, 0xFF, 0xE8, 0xA, 0x17, 0xFF, 0xE6, 0xA, 0x18, 0x0, 0xC, 0xA, 0x1A, 0xFF, 0xE6, 0xA, 0x21, 0x0, 0xC, 0xA, 0x29, 0x0, 0xC, 0xA, 0x2A, 0x0, 0xD, 0xA, 0x2B, 0x0, 0xD, 0xA, 0x2E, 0x0, 0xD, 0xA, 0x35, 0xFF, 0xE6, 0xA, 0x3A, 0x0, 0xC, 0xA, 0x3B, 0xFF, 0xE6, 0xA, 0x40, 0xFF, 0xE6, 0xA, 0x42, 0x0, 0xC, 0xA, 0x4E, 0xFF, 0xE6, 0xA, 0x50, 0xFF, 0xE6, 0xA, 0x51, 0xFF, 0xE6, 0xA, 0x5B, 0xFF, 0xE8, 0xA, 0x5D, 0xFF, 0xE6, 0xA, 0x60, 0xFF, 0xE8, 0xA, 0x64, 0x0, 0xC, 0xA, 0x66, 0x0, 0xC, 0xA, 0x68, 0x0, 0xC, 0xA, 0x6D, 0xFF, 0xE6, 0xA, 0x87, 0xFF, 0xE6, 0xA, 0x89, 0xFF, 0xE6, 0xA, 0x8B, 0xFF, 0xE6, 0xA, 0x8D, 0xFF, 0xE6, 0xA, 0x8F, 0xFF, 0xE6, 0xA, 0x91, 0xFF, 0xE6, 0xA, 0x93, 0xFF, 0xE6, 0xA, 0x95, 0xFF, 0xE6, 0xA, 0x9B, 0xFF, 0xE8, 0xA, 0x9D, 0xFF, 0xE8, 0xA, 0x9F, 0xFF, 0xE8, 0xA, 0xA1, 0xFF, 0xE8, 0xA, 0xA3, 0xFF, 0xE8, 0xA, 0xA5, 0xFF, 0xE8, 0xA, 0xA7, 0xFF, 0xE8, 0xA, 0xA9, 0xFF, 0xE6, 0xA, 0xAB, 0xFF, 0xE6, 0xA, 0xAD, 0xFF, 0xE6, 0xA, 0xAF, 0xFF, 0xE8, 0xA, 0xB1, 0xFF, 0xE6, 0xA, 0xC1, 0x0, 0xC, 0xA, 0xC3, 0x0, 0xC, 0xA, 0xC5, 0x0, 0xC, 0xA, 0xF3, 0xFF, 0xE8, 0xA, 0xFE, 0xFF, 0xE6, 0xB, 0x6, 0xFF, 0xE6, 0xB, 0xA, 0xFF, 0xE8, 0xB, 0xC, 0xFF, 0xE8, 0xB, 0xF, 0xFF, 0xE6, 0xB, 0x19, 0xFF, 0xE6, 0xB, 0x1B, 0xFF, 0xE6, 0xB, 0x21, 0xFF, 0xE8, 0xB, 0x23, 0xFF, 0xE8, 0xB, 0x33, 0xFF, 0xE8, 0xB, 0x35, 0xFF, 0xE8, 0xB, 0x37, 0xFF, 0xE8, 0xB, 0x39, 0xFF, 0xE8, 0xB, 0x3B, 0x0, 0xC, 0xB, 0x3C, 0xFF, 0xE8, 0xB, 0x42, 0xFF, 0xE6, 0xB, 0x4A, 0xFF, 0xE6, 0xB, 0x54, 0xFF, 0xE6, 0xB, 0x56, 0xFF, 0xE6, 0xB, 0x58, 0xFF, 0xE6, 0xB, 0x5A, 0xFF, 0xE6, 0xB, 0x5C, 0xFF, 0xE6, 0xB, 0x5E, 0xFF, 0xE6, 0xB, 0x60, 0xFF, 0xE6, 0xB, 0x62, 0xFF, 0xE6, 0xB, 0x64, 0xFF, 0xE6, 0xB, 0x66, 0xFF, 0xE6, 0xB, 0x68, 0xFF, 0xE6, 0xB, 0x6C, 0xFF, 0xE6, 0xB, 0x90, 0xFF, 0xE8, 0xB, 0x92, 0xFF, 0xE8, 0xB, 0x94, 0xFF, 0xE8, 0xB, 0x96, 0xFF, 0xE8, 0xB, 0xC0, 0x0, 0xC, 0xB, 0xC2, 0x0, 0xC, 0xB, 0xCC, 0x0, 0xC, 0xB, 0xD6, 0x0, 0xC, 0xB, 0xD8, 0xFF, 0xE6, 0xB, 0xD9, 0xFF, 0xE6, 0xB, 0xDA, 0xFF, 0xE6, 0xB, 0xDB, 0xFF, 0xE6, 0xB, 0xDC, 0xFF, 0xE6, 0xB, 0xDD, 0xFF, 0xE6, 0xB, 0xDE, 0xFF, 0xE6, 0xB, 0xDF, 0xFF, 0xE6, 0xC, 0x14, 0xFF, 0xE8, 0xC, 0x15, 0xFF, 0xE8, 0xC, 0x16, 0xFF, 0xE8, 0xC, 0x17, 0xFF, 0xE8, 0xC, 0x18, 0xFF, 0xE8, 0xC, 0x19, 0xFF, 0xE8, 0xC, 0x44, 0xFF, 0xE8, 0xC, 0x45, 0xFF, 0xE8, 0xC, 0x4A, 0xFF, 0xE6, 0xC, 0x4B, 0xFF, 0xE6, 0xC, 0x4C, 0xFF, 0xE6, 0xC, 0x4D, 0xFF, 0xE6, 0xC, 0x4E, 0xFF, 0xE6, 0xC, 0x4F, 0xFF, 0xE6, 0xC, 0x50, 0xFF, 0xE6, 0xC, 0x51, 0xFF, 0xE6, 0xC, 0x7A, 0xFF, 0xE6, 0xC, 0x7B, 0xFF, 0xE6, 0xC, 0x7C, 0xFF, 0xE6, 0xC, 0x7D, 0xFF, 0xE6, 0xC, 0x7E, 0xFF, 0xE6, 0xC, 0x7F, 0xFF, 0xE6, 0xC, 0x80, 0xFF, 0xE6, 0xC, 0xB7, 0xFF, 0xB9, 0xC, 0xBB, 0xFF, 0xEC, 0xC, 0xBC, 0x0, 0xE, 0xC, 0xBE, 0xFF, 0xB9, 0xC, 0xCA, 0x0, 0xE, 0xC, 0xCD, 0x0, 0xE, 0xC, 0xD6, 0xFF, 0xB9, 0xC, 0xDD, 0xFF, 0xEC, 0xC, 0xE0, 0xFF, 0xEC, 0xC, 0xE1, 0x0, 0xF, 0xC, 0xE5, 0xFF, 0xEC, 0xC, 0xE6, 0x0, 0xE, 0x0, 0x1, 0x2, 0x8C, 0xFF, 0xE5, 0x0, 0x17, 0x0, 0x5D, 0xFF, 0xEC, 0x0, 0x5F, 0xFF, 0xEC, 0x0, 0xCA, 0xFF, 0xEC, 0x0, 0xF5, 0xFF, 0xEC, 0x2, 0x84, 0xFF, 0xEC, 0x2, 0x8C, 0xFF, 0xC1, 0x2, 0xCB, 0xFF, 0xEC, 0x2, 0xDB, 0xFF, 0xEC, 0x2, 0xF5, 0xFF, 0xEC, 0x5, 0x62, 0xFF, 0xEC, 0x5, 0xDA, 0xFF, 0xEC, 0x5, 0xDC, 0xFF, 0xEC, 0x9, 0x74, 0xFF, 0xEC, 0x9, 0x76, 0xFF, 0xEC, 0x9, 0x78, 0xFF, 0xEC, 0xA, 0x19, 0xFF, 0xEC, 0xA, 0x45, 0xFF, 0xEC, 0xA, 0x53, 0xFF, 0xEC, 0xB, 0xC8, 0xFF, 0xEC, 0xB, 0xCA, 0xFF, 0xEC, 0xB, 0xCE, 0xFF, 0xEC, 0xB, 0xD0, 0xFF, 0xEC, 0xB, 0xD2, 0xFF, 0xEC, 0x0, 0x16, 0x0, 0x5D, 0xFF, 0xF1, 0x0, 0x5F, 0xFF, 0xF1, 0x0, 0xCA, 0xFF, 0xF1, 0x0, 0xF5, 0xFF, 0xF1, 0x2, 0x84, 0xFF, 0xF1, 0x2, 0xCB, 0xFF, 0xF1, 0x2, 0xDB, 0xFF, 0xF1, 0x2, 0xF5, 0xFF, 0xF1, 0x5, 0x62, 0xFF, 0xF1, 0x5, 0xDA, 0xFF, 0xF1, 0x5, 0xDC, 0xFF, 0xF1, 0x9, 0x74, 0xFF, 0xF1, 0x9, 0x76, 0xFF, 0xF1, 0x9, 0x78, 0xFF, 0xF1, 0xA, 0x19, 0xFF, 0xF1, 0xA, 0x45, 0xFF, 0xF1, 0xA, 0x53, 0xFF, 0xF1, 0xB, 0xC8, 0xFF, 0xF1, 0xB, 0xCA, 0xFF, 0xF1, 0xB, 0xCE, 0xFF, 0xF1, 0xB, 0xD0, 0xFF, 0xF1, 0xB, 0xD2, 0xFF, 0xF1, 0x0, 0x2F, 0x0, 0x5B, 0xFF, 0xF3, 0x0, 0x5D, 0xFF, 0xF1, 0x0, 0x5E, 0xFF, 0xF3, 0x0, 0x5F, 0xFF, 0xF2, 0x0, 0xCA, 0xFF, 0xF2, 0x0, 0xF5, 0xFF, 0xF2, 0x2, 0x3C, 0xFF, 0xF3, 0x2, 0x84, 0xFF, 0xF1, 0x2, 0xB0, 0xFF, 0xF3, 0x2, 0xCB, 0xFF, 0xF1, 0x2, 0xDB, 0xFF, 0xF1, 0x2, 0xF5, 0xFF, 0xF1, 0x5, 0x62, 0xFF, 0xF2, 0x5, 0x67, 0xFF, 0xF3, 0x5, 0xDA, 0xFF, 0xF2, 0x5, 0xDC, 0xFF, 0xF2, 0x9, 0x2, 0xFF, 0xF3, 0x9, 0x3, 0xFF, 0xF3, 0x9, 0x71, 0xFF, 0xF3, 0x9, 0x74, 0xFF, 0xF2, 0x9, 0x76, 0xFF, 0xF2, 0x9, 0x78, 0xFF, 0xF2, 0x9, 0xF5, 0xFF, 0xF3, 0xA, 0x18, 0xFF, 0xF3, 0xA, 0x19, 0xFF, 0xF1, 0xA, 0x21, 0xFF, 0xF3, 0xA, 0x29, 0xFF, 0xF3, 0xA, 0x3A, 0xFF, 0xF3, 0xA, 0x42, 0xFF, 0xF3, 0xA, 0x45, 0xFF, 0xF1, 0xA, 0x53, 0xFF, 0xF1, 0xA, 0x64, 0xFF, 0xF3, 0xA, 0x66, 0xFF, 0xF3, 0xA, 0x68, 0xFF, 0xF3, 0xA, 0xC1, 0xFF, 0xF3, 0xA, 0xC3, 0xFF, 0xF3, 0xA, 0xC5, 0xFF, 0xF3, 0xB, 0x3B, 0xFF, 0xF3, 0xB, 0xC0, 0xFF, 0xF3, 0xB, 0xC2, 0xFF, 0xF3, 0xB, 0xC8, 0xFF, 0xF1, 0xB, 0xCA, 0xFF, 0xF1, 0xB, 0xCC, 0xFF, 0xF3, 0xB, 0xCE, 0xFF, 0xF2, 0xB, 0xD0, 0xFF, 0xF2, 0xB, 0xD2, 0xFF, 0xF2, 0xB, 0xD6, 0xFF, 0xF3, 0x0, 0x77, 0x0, 0x7, 0xFF, 0xBE, 0x0, 0xC, 0xFF, 0xBE, 0x0, 0x39, 0xFF, 0xAF, 0x0, 0x3B, 0xFF, 0xBB, 0x0, 0x3D, 0xFF, 0xEF, 0x0, 0x3E, 0xFF, 0xB3, 0x0, 0x5B, 0xFF, 0xE4, 0x0, 0x5D, 0xFF, 0xEE, 0x0, 0x5E, 0xFF, 0xE4, 0x0, 0xC2, 0xFF, 0xAF, 0x1, 0x3, 0xFF, 0xB3, 0x2, 0x3C, 0xFF, 0xE4, 0x2, 0x68, 0xFF, 0xAF, 0x2, 0x6C, 0xFF, 0xAF, 0x2, 0x70, 0xFF, 0xEF, 0x2, 0x74, 0xFF, 0xD3, 0x2, 0x77, 0xFF, 0xCD, 0x2, 0x7C, 0xFF, 0xE5, 0x2, 0x84, 0xFF, 0xEE, 0x2, 0x8C, 0xFF, 0xC4, 0x2, 0x94, 0xFF, 0xE1, 0x2, 0x9F, 0xFF, 0xE3, 0x2, 0xAF, 0xFF, 0xBB, 0x2, 0xB0, 0xFF, 0xE4, 0x2, 0xB6, 0xFF, 0xE1, 0x2, 0xCA, 0xFF, 0xEF, 0x2, 0xCB, 0xFF, 0xEE, 0x2, 0xD0, 0xFF, 0xAF, 0x2, 0xD1, 0xFF, 0xBF, 0x2, 0xDA, 0xFF, 0xEF, 0x2, 0xDB, 0xFF, 0xEE, 0x2, 0xDC, 0xFF, 0xAF, 0x2, 0xDE, 0xFF, 0xCD, 0x2, 0xE0, 0xFF, 0xD8, 0x2, 0xF4, 0xFF, 0xEF, 0x2, 0xF5, 0xFF, 0xEE, 0x2, 0xF9, 0xFF, 0xD0, 0x2, 0xFA, 0xFF, 0xF4, 0x2, 0xFB, 0xFF, 0xE1, 0x3, 0x3, 0xFF, 0x60, 0x3, 0x4, 0xFF, 0xBD, 0x4, 0x62, 0xFF, 0xBE, 0x4, 0x63, 0xFF, 0xBE, 0x4, 0x65, 0xFF, 0xBE, 0x4, 0x66, 0xFF, 0xBE, 0x4, 0x67, 0xFF, 0xBE, 0x5, 0x67, 0xFF, 0xE4, 0x6, 0x1F, 0xFF, 0xCD, 0x6, 0x23, 0xFF, 0xAF, 0x6, 0x25, 0xFF, 0xAF, 0x6, 0x29, 0xFF, 0xAF, 0x6, 0x96, 0xFF, 0xBB, 0x8, 0xE7, 0xFF, 0xB3, 0x9, 0x2, 0xFF, 0xE4, 0x9, 0x3, 0xFF, 0xE4, 0x9, 0x5C, 0xFF, 0xAF, 0x9, 0x5E, 0xFF, 0xAF, 0x9, 0x60, 0xFF, 0xAF, 0x9, 0x70, 0xFF, 0xB3, 0x9, 0x71, 0xFF, 0xE4, 0x9, 0x72, 0xFF, 0xB3, 0x9, 0xDA, 0xFF, 0xB3, 0x9, 0xE9, 0xFF, 0xB3, 0x9, 0xEA, 0xFF, 0xEF, 0x9, 0xEC, 0xFF, 0xB3, 0x9, 0xF5, 0xFF, 0xE4, 0xA, 0x4, 0xFF, 0xD3, 0xA, 0x10, 0xFF, 0xAF, 0xA, 0x11, 0xFF, 0xEF, 0xA, 0x18, 0xFF, 0xE4, 0xA, 0x19, 0xFF, 0xEE, 0xA, 0x21, 0xFF, 0xE4, 0xA, 0x28, 0xFF, 0xB3, 0xA, 0x29, 0xFF, 0xE4, 0xA, 0x2A, 0xFF, 0xBE, 0xA, 0x2B, 0xFF, 0xBE, 0xA, 0x2E, 0xFF, 0xBE, 0xA, 0x39, 0xFF, 0xBB, 0xA, 0x3A, 0xFF, 0xE4, 0xA, 0x41, 0xFF, 0xB3, 0xA, 0x42, 0xFF, 0xE4, 0xA, 0x44, 0xFF, 0xEF, 0xA, 0x45, 0xFF, 0xEE, 0xA, 0x52, 0xFF, 0xEF, 0xA, 0x53, 0xFF, 0xEE, 0xA, 0x63, 0xFF, 0xD3, 0xA, 0x64, 0xFF, 0xE4, 0xA, 0x65, 0xFF, 0xD3, 0xA, 0x66, 0xFF, 0xE4, 0xA, 0x67, 0xFF, 0xD3, 0xA, 0x68, 0xFF, 0xE4, 0xA, 0x69, 0xFF, 0xCD, 0xA, 0xC0, 0xFF, 0xB3, 0xA, 0xC1, 0xFF, 0xE4, 0xA, 0xC2, 0xFF, 0xB3, 0xA, 0xC3, 0xFF, 0xE4, 0xA, 0xC4, 0xFF, 0xB3, 0xA, 0xC5, 0xFF, 0xE4, 0xA, 0xC7, 0xFF, 0xAF, 0xA, 0xC9, 0xFF, 0xCD, 0xA, 0xD6, 0xFF, 0xB3, 0xB, 0x3B, 0xFF, 0xE4, 0xB, 0xAD, 0xFF, 0xAF, 0xB, 0xAF, 0xFF, 0xAF, 0xB, 0xB1, 0xFF, 0xAF, 0xB, 0xB3, 0xFF, 0xAF, 0xB, 0xBF, 0xFF, 0xBB, 0xB, 0xC0, 0xFF, 0xE4, 0xB, 0xC1, 0xFF, 0xBB, 0xB, 0xC2, 0xFF, 0xE4, 0xB, 0xC7, 0xFF, 0xEF, 0xB, 0xC8, 0xFF, 0xEE, 0xB, 0xC9, 0xFF, 0xEF, 0xB, 0xCA, 0xFF, 0xEE, 0xB, 0xCB, 0xFF, 0xB3, 0xB, 0xCC, 0xFF, 0xE4, 0xB, 0xD6, 0xFF, 0xE4, 0xC, 0xA2, 0xFF, 0xB3, 0xC, 0xA3, 0xFF, 0xB3, 0x0, 0x97, 0x0, 0x7, 0xFF, 0xD6, 0x0, 0xC, 0xFF, 0xD6, 0x0, 0x39, 0xFF, 0xC0, 0x0, 0x3B, 0xFF, 0xDB, 0x0, 0x3D, 0xFF, 0xF6, 0x0, 0x3E, 0xFF, 0xC9, 0x0, 0x52, 0xFF, 0xE2, 0x0, 0x53, 0xFF, 0xE2, 0x0, 0x55, 0xFF, 0xE2, 0x0, 0xC2, 0xFF, 0xC0, 0x0, 0xEA, 0xFF, 0xE2, 0x1, 0x3, 0xFF, 0xC9, 0x2, 0x28, 0xFF, 0xE2, 0x2, 0x40, 0xFF, 0xE2, 0x2, 0x68, 0xFF, 0xC0, 0x2, 0x6A, 0xFF, 0xF9, 0x2, 0x6C, 0xFF, 0xC0, 0x2, 0x70, 0xFF, 0xF6, 0x2, 0x73, 0xFF, 0xF9, 0x2, 0x74, 0xFF, 0xF2, 0x2, 0x77, 0xFF, 0xEE, 0x2, 0x7C, 0xFF, 0xD7, 0x2, 0x82, 0xFF, 0xE2, 0x2, 0x86, 0xFF, 0xE2, 0x2, 0x87, 0xFF, 0xE2, 0x2, 0x89, 0xFF, 0xE2, 0x2, 0x8A, 0xFF, 0xE2, 0x2, 0x8B, 0xFF, 0xE2, 0x2, 0x8C, 0xFF, 0xDF, 0x2, 0x8E, 0xFF, 0xE2, 0x2, 0x90, 0xFF, 0xE2, 0x2, 0x91, 0xFF, 0xE2, 0x2, 0x94, 0xFF, 0xE2, 0x2, 0x96, 0xFF, 0xE2, 0x2, 0x9B, 0xFF, 0xE2, 0x2, 0xAF, 0xFF, 0xDB, 0x2, 0xC2, 0xFF, 0xE2, 0x2, 0xCA, 0xFF, 0xF6, 0x2, 0xCD, 0xFF, 0xE2, 0x2, 0xD0, 0xFF, 0xC0, 0x2, 0xD1, 0xFF, 0xDE, 0x2, 0xD3, 0xFF, 0xE2, 0x2, 0xD5, 0xFF, 0xE2, 0x2, 0xDA, 0xFF, 0xF6, 0x2, 0xDC, 0xFF, 0xC0, 0x2, 0xDE, 0xFF, 0xEE, 0x2, 0xE0, 0xFF, 0xEE, 0x2, 0xE3, 0xFF, 0xDC, 0x2, 0xE7, 0xFF, 0xF9, 0x2, 0xEA, 0xFF, 0xE2, 0x2, 0xEC, 0xFF, 0xE2, 0x2, 0xEE, 0xFF, 0xE2, 0x2, 0xF3, 0xFF, 0xE2, 0x2, 0xF4, 0xFF, 0xF6, 0x2, 0xF9, 0xFF, 0xDF, 0x2, 0xFB, 0xFF, 0xF2, 0x2, 0xFD, 0xFF, 0xF9, 0x3, 0x3, 0xFF, 0xC0, 0x3, 0x4, 0xFF, 0xDF, 0x3, 0x6, 0xFF, 0xF9, 0x3, 0x8, 0xFF, 0xF9, 0x3, 0xF, 0xFF, 0xE2, 0x3, 0x10, 0xFF, 0xF9, 0x3, 0x13, 0xFF, 0xE2, 0x4, 0x62, 0xFF, 0xD6, 0x4, 0x63, 0xFF, 0xD6, 0x4, 0x65, 0xFF, 0xD6, 0x4, 0x66, 0xFF, 0xD6, 0x4, 0x67, 0xFF, 0xD6, 0x5, 0xF0, 0xFF, 0xE2, 0x6, 0x0, 0xFF, 0xE2, 0x6, 0x1F, 0xFF, 0xEE, 0x6, 0x23, 0xFF, 0xC0, 0x6, 0x25, 0xFF, 0xC0, 0x6, 0x28, 0xFF, 0xE2, 0x6, 0x29, 0xFF, 0xC0, 0x6, 0x30, 0xFF, 0xE2, 0x6, 0x96, 0xFF, 0xDB, 0x6, 0xAB, 0xFF, 0xE2, 0x6, 0xAC, 0xFF, 0xE2, 0x6, 0xFB, 0xFF, 0xE2, 0x6, 0xFC, 0xFF, 0xE2, 0x6, 0xFD, 0xFF, 0xE2, 0x7, 0x12, 0xFF, 0xE2, 0x8, 0xE7, 0xFF, 0xC9, 0x8, 0xF8, 0xFF, 0xE2, 0x9, 0x40, 0xFF, 0xE2, 0x9, 0x42, 0xFF, 0xE2, 0x9, 0x44, 0xFF, 0xE2, 0x9, 0x45, 0xFF, 0xE2, 0x9, 0x5C, 0xFF, 0xC0, 0x9, 0x5E, 0xFF, 0xC0, 0x9, 0x60, 0xFF, 0xC0, 0x9, 0x70, 0xFF, 0xC9, 0x9, 0x72, 0xFF, 0xC9, 0x9, 0xDA, 0xFF, 0xC9, 0x9, 0xE9, 0xFF, 0xC9, 0x9, 0xEA, 0xFF, 0xF6, 0x9, 0xEC, 0xFF, 0xC9, 0x9, 0xEF, 0xFF, 0xE2, 0xA, 0x4, 0xFF, 0xF2, 0xA, 0x10, 0xFF, 0xC0, 0xA, 0x11, 0xFF, 0xF6, 0xA, 0x14, 0xFF, 0xE2, 0xA, 0x16, 0xFF, 0xE2, 0xA, 0x1B, 0xFF, 0xE2, 0xA, 0x20, 0xFF, 0xE2, 0xA, 0x28, 0xFF, 0xC9, 0xA, 0x2A, 0xFF, 0xD6, 0xA, 0x2B, 0xFF, 0xD6, 0xA, 0x2E, 0xFF, 0xD6, 0xA, 0x30, 0xFF, 0xE2, 0xA, 0x36, 0xFF, 0xE2, 0xA, 0x39, 0xFF, 0xDB, 0xA, 0x41, 0xFF, 0xC9, 0xA, 0x44, 0xFF, 0xF6, 0xA, 0x52, 0xFF, 0xF6, 0xA, 0x57, 0xFF, 0xE2, 0xA, 0x59, 0xFF, 0xE2, 0xA, 0x63, 0xFF, 0xF2, 0xA, 0x65, 0xFF, 0xF2, 0xA, 0x67, 0xFF, 0xF2, 0xA, 0x69, 0xFF, 0xEE, 0xA, 0x6C, 0xFF, 0xE2, 0xA, 0xC0, 0xFF, 0xC9, 0xA, 0xC2, 0xFF, 0xC9, 0xA, 0xC4, 0xFF, 0xC9, 0xA, 0xC7, 0xFF, 0xC0, 0xA, 0xC9, 0xFF, 0xEE, 0xA, 0xCC, 0xFF, 0xE2, 0xA, 0xD6, 0xFF, 0xC9, 0xA, 0xE7, 0xFF, 0xE2, 0xA, 0xED, 0xFF, 0xE2, 0xB, 0x13, 0xFF, 0xE2, 0xB, 0x84, 0xFF, 0xE2, 0xB, 0x86, 0xFF, 0xE2, 0xB, 0x88, 0xFF, 0xE2, 0xB, 0x8A, 0xFF, 0xE2, 0xB, 0x8C, 0xFF, 0xE2, 0xB, 0x8E, 0xFF, 0xE2, 0xB, 0xAD, 0xFF, 0xC0, 0xB, 0xAF, 0xFF, 0xC0, 0xB, 0xB1, 0xFF, 0xC0, 0xB, 0xB3, 0xFF, 0xC0, 0xB, 0xBF, 0xFF, 0xDB, 0xB, 0xC1, 0xFF, 0xDB, 0xB, 0xC7, 0xFF, 0xF6, 0xB, 0xC9, 0xFF, 0xF6, 0xB, 0xCB, 0xFF, 0xC9, 0xC, 0xA2, 0xFF, 0xC9, 0xC, 0xA3, 0xFF, 0xC9, 0x0, 0x9A, 0x0, 0x7, 0xFF, 0xCD, 0x0, 0xC, 0xFF, 0xCD, 0x0, 0x39, 0xFF, 0xC0, 0x0, 0x3B, 0xFF, 0xDA, 0x0, 0x3D, 0xFF, 0xF7, 0x0, 0x3E, 0xFF, 0xC7, 0x0, 0x52, 0xFF, 0xE0, 0x0, 0x53, 0xFF, 0xE0, 0x0, 0x55, 0xFF, 0xE0, 0x0, 0x5D, 0xFF, 0xF5, 0x0, 0xC2, 0xFF, 0xC0, 0x0, 0xEA, 0xFF, 0xE0, 0x1, 0x3, 0xFF, 0xC7, 0x2, 0x28, 0xFF, 0xE0, 0x2, 0x40, 0xFF, 0xE0, 0x2, 0x68, 0xFF, 0xC0, 0x2, 0x6C, 0xFF, 0xC0, 0x2, 0x70, 0xFF, 0xF7, 0x2, 0x74, 0xFF, 0xF3, 0x2, 0x77, 0xFF, 0xEC, 0x2, 0x7C, 0xFF, 0xD8, 0x2, 0x82, 0xFF, 0xE0, 0x2, 0x84, 0xFF, 0xF5, 0x2, 0x86, 0xFF, 0xE0, 0x2, 0x87, 0xFF, 0xE0, 0x2, 0x89, 0xFF, 0xE0, 0x2, 0x8A, 0xFF, 0xE0, 0x2, 0x8B, 0xFF, 0xE0, 0x2, 0x8C, 0xFF, 0xDA, 0x2, 0x8E, 0xFF, 0xE0, 0x2, 0x90, 0xFF, 0xE0, 0x2, 0x91, 0xFF, 0xE0, 0x2, 0x94, 0xFF, 0xE0, 0x2, 0x96, 0xFF, 0xE0, 0x2, 0x9B, 0xFF, 0xE0, 0x2, 0xAF, 0xFF, 0xDA, 0x2, 0xC2, 0xFF, 0xE0, 0x2, 0xCA, 0xFF, 0xF7, 0x2, 0xCB, 0xFF, 0xF5, 0x2, 0xCD, 0xFF, 0xE0, 0x2, 0xD0, 0xFF, 0xC0, 0x2, 0xD1, 0xFF, 0xD6, 0x2, 0xD3, 0xFF, 0xE0, 0x2, 0xD5, 0xFF, 0xE0, 0x2, 0xDA, 0xFF, 0xF7, 0x2, 0xDB, 0xFF, 0xF5, 0x2, 0xDC, 0xFF, 0xC0, 0x2, 0xDE, 0xFF, 0xEC, 0x2, 0xE0, 0xFF, 0xEC, 0x2, 0xE3, 0xFF, 0xDC, 0x2, 0xEA, 0xFF, 0xE0, 0x2, 0xEC, 0xFF, 0xE0, 0x2, 0xEE, 0xFF, 0xE0, 0x2, 0xF3, 0xFF, 0xE0, 0x2, 0xF4, 0xFF, 0xF7, 0x2, 0xF5, 0xFF, 0xF5, 0x2, 0xF9, 0xFF, 0xDF, 0x2, 0xFB, 0xFF, 0xF0, 0x3, 0x3, 0xFF, 0xC1, 0x3, 0x4, 0xFF, 0xDA, 0x3, 0xF, 0xFF, 0xE0, 0x3, 0x13, 0xFF, 0xE0, 0x4, 0x62, 0xFF, 0xCD, 0x4, 0x63, 0xFF, 0xCD, 0x4, 0x65, 0xFF, 0xCD, 0x4, 0x66, 0xFF, 0xCD, 0x4, 0x67, 0xFF, 0xCD, 0x5, 0xF0, 0xFF, 0xE0, 0x6, 0x0, 0xFF, 0xE0, 0x6, 0x1F, 0xFF, 0xEC, 0x6, 0x23, 0xFF, 0xC0, 0x6, 0x25, 0xFF, 0xC0, 0x6, 0x28, 0xFF, 0xE0, 0x6, 0x29, 0xFF, 0xC0, 0x6, 0x30, 0xFF, 0xE0, 0x6, 0x96, 0xFF, 0xDA, 0x6, 0xAB, 0xFF, 0xE0, 0x6, 0xAC, 0xFF, 0xE0, 0x6, 0xFB, 0xFF, 0xE0, 0x6, 0xFC, 0xFF, 0xE0, 0x6, 0xFD, 0xFF, 0xE0, 0x7, 0x12, 0xFF, 0xE0, 0x8, 0xE7, 0xFF, 0xC7, 0x8, 0xF8, 0xFF, 0xE0, 0x9, 0x40, 0xFF, 0xE0, 0x9, 0x42, 0xFF, 0xE0, 0x9, 0x44, 0xFF, 0xE0, 0x9, 0x45, 0xFF, 0xE0, 0x9, 0x5C, 0xFF, 0xC0, 0x9, 0x5E, 0xFF, 0xC0, 0x9, 0x60, 0xFF, 0xC0, 0x9, 0x70, 0xFF, 0xC7, 0x9, 0x72, 0xFF, 0xC7, 0x9, 0xDA, 0xFF, 0xC7, 0x9, 0xE9, 0xFF, 0xC7, 0x9, 0xEA, 0xFF, 0xF7, 0x9, 0xEC, 0xFF, 0xC7, 0x9, 0xEF, 0xFF, 0xE0, 0xA, 0x4, 0xFF, 0xF3, 0xA, 0x10, 0xFF, 0xC0, 0xA, 0x11, 0xFF, 0xF7, 0xA, 0x14, 0xFF, 0xE0, 0xA, 0x16, 0xFF, 0xE0, 0xA, 0x19, 0xFF, 0xF5, 0xA, 0x1B, 0xFF, 0xE0, 0xA, 0x20, 0xFF, 0xE0, 0xA, 0x28, 0xFF, 0xC7, 0xA, 0x2A, 0xFF, 0xCD, 0xA, 0x2B, 0xFF, 0xCD, 0xA, 0x2E, 0xFF, 0xCD, 0xA, 0x30, 0xFF, 0xE0, 0xA, 0x36, 0xFF, 0xE0, 0xA, 0x39, 0xFF, 0xDA, 0xA, 0x41, 0xFF, 0xC7, 0xA, 0x44, 0xFF, 0xF7, 0xA, 0x45, 0xFF, 0xF5, 0xA, 0x52, 0xFF, 0xF7, 0xA, 0x53, 0xFF, 0xF5, 0xA, 0x57, 0xFF, 0xE0, 0xA, 0x59, 0xFF, 0xE0, 0xA, 0x63, 0xFF, 0xF3, 0xA, 0x65, 0xFF, 0xF3, 0xA, 0x67, 0xFF, 0xF3, 0xA, 0x69, 0xFF, 0xEC, 0xA, 0x6C, 0xFF, 0xE0, 0xA, 0xC0, 0xFF, 0xC7, 0xA, 0xC2, 0xFF, 0xC7, 0xA, 0xC4, 0xFF, 0xC7, 0xA, 0xC7, 0xFF, 0xC0, 0xA, 0xC9, 0xFF, 0xEC, 0xA, 0xCC, 0xFF, 0xE0, 0xA, 0xD6, 0xFF, 0xC7, 0xA, 0xE7, 0xFF, 0xE0, 0xA, 0xED, 0xFF, 0xE0, 0xB, 0x13, 0xFF, 0xE0, 0xB, 0x84, 0xFF, 0xE0, 0xB, 0x86, 0xFF, 0xE0, 0xB, 0x88, 0xFF, 0xE0, 0xB, 0x8A, 0xFF, 0xE0, 0xB, 0x8C, 0xFF, 0xE0, 0xB, 0x8E, 0xFF, 0xE0, 0xB, 0xAD, 0xFF, 0xC0, 0xB, 0xAF, 0xFF, 0xC0, 0xB, 0xB1, 0xFF, 0xC0, 0xB, 0xB3, 0xFF, 0xC0, 0xB, 0xBF, 0xFF, 0xDA, 0xB, 0xC1, 0xFF, 0xDA, 0xB, 0xC7, 0xFF, 0xF7, 0xB, 0xC8, 0xFF, 0xF5, 0xB, 0xC9, 0xFF, 0xF7, 0xB, 0xCA, 0xFF, 0xF5, 0xB, 0xCB, 0xFF, 0xC7, 0xC, 0xA2, 0xFF, 0xC7, 0xC, 0xA3, 0xFF, 0xC7, 0x0, 0x72, 0x0, 0x39, 0xFF, 0x95, 0x0, 0x52, 0xFF, 0xDF, 0x0, 0x53, 0xFF, 0xDF, 0x0, 0x55, 0xFF, 0xDF, 0x0, 0x5B, 0xFF, 0xEA, 0x0, 0x5E, 0xFF, 0xEA, 0x0, 0xC2, 0xFF, 0x95, 0x0, 0xEA, 0xFF, 0xDF, 0x2, 0x28, 0xFF, 0xDF, 0x2, 0x3C, 0xFF, 0xEA, 0x2, 0x40, 0xFF, 0xDF, 0x2, 0x68, 0xFF, 0x95, 0x2, 0x6C, 0xFF, 0x95, 0x2, 0x7C, 0xFF, 0xD6, 0x2, 0x82, 0xFF, 0xDF, 0x2, 0x86, 0xFF, 0xDF, 0x2, 0x87, 0xFF, 0xDF, 0x2, 0x89, 0xFF, 0xDF, 0x2, 0x8A, 0xFF, 0xDF, 0x2, 0x8B, 0xFF, 0xDF, 0x2, 0x8C, 0xFF, 0xD5, 0x2, 0x8E, 0xFF, 0xDF, 0x2, 0x90, 0xFF, 0xDF, 0x2, 0x91, 0xFF, 0xDF, 0x2, 0x94, 0xFF, 0xEC, 0x2, 0x96, 0xFF, 0xDF, 0x2, 0x9B, 0xFF, 0xDF, 0x2, 0x9F, 0xFF, 0xEC, 0x2, 0xB0, 0xFF, 0xEA, 0x2, 0xB6, 0xFF, 0xE9, 0x2, 0xC2, 0xFF, 0xDF, 0x2, 0xCD, 0xFF, 0xDF, 0x2, 0xD0, 0xFF, 0x95, 0x2, 0xD1, 0xFF, 0xCB, 0x2, 0xD3, 0xFF, 0xDF, 0x2, 0xD5, 0xFF, 0xDF, 0x2, 0xDC, 0xFF, 0x95, 0x2, 0xE3, 0xFF, 0xE4, 0x2, 0xEA, 0xFF, 0xDF, 0x2, 0xEC, 0xFF, 0xDF, 0x2, 0xEE, 0xFF, 0xDF, 0x2, 0xF3, 0xFF, 0xDF, 0x2, 0xFA, 0xFF, 0xF1, 0x3, 0x4, 0xFF, 0xCF, 0x3, 0xF, 0xFF, 0xDF, 0x3, 0x13, 0xFF, 0xDF, 0x5, 0x67, 0xFF, 0xEA, 0x5, 0xF0, 0xFF, 0xDF, 0x6, 0x0, 0xFF, 0xDF, 0x6, 0x23, 0xFF, 0x95, 0x6, 0x25, 0xFF, 0x95, 0x6, 0x28, 0xFF, 0xDF, 0x6, 0x29, 0xFF, 0x95, 0x6, 0x30, 0xFF, 0xDF, 0x6, 0xAB, 0xFF, 0xDF, 0x6, 0xAC, 0xFF, 0xDF, 0x6, 0xFB, 0xFF, 0xDF, 0x6, 0xFC, 0xFF, 0xDF, 0x6, 0xFD, 0xFF, 0xDF, 0x7, 0x12, 0xFF, 0xDF, 0x8, 0xF8, 0xFF, 0xDF, 0x9, 0x2, 0xFF, 0xEA, 0x9, 0x3, 0xFF, 0xEA, 0x9, 0x40, 0xFF, 0xDF, 0x9, 0x42, 0xFF, 0xDF, 0x9, 0x44, 0xFF, 0xDF, 0x9, 0x45, 0xFF, 0xDF, 0x9, 0x5C, 0xFF, 0x95, 0x9, 0x5E, 0xFF, 0x95, 0x9, 0x60, 0xFF, 0x95, 0x9, 0x71, 0xFF, 0xEA, 0x9, 0xEF, 0xFF, 0xDF, 0x9, 0xF5, 0xFF, 0xEA, 0xA, 0x10, 0xFF, 0x95, 0xA, 0x14, 0xFF, 0xDF, 0xA, 0x16, 0xFF, 0xDF, 0xA, 0x18, 0xFF, 0xEA, 0xA, 0x1B, 0xFF, 0xDF, 0xA, 0x20, 0xFF, 0xDF, 0xA, 0x21, 0xFF, 0xEA, 0xA, 0x29, 0xFF, 0xEA, 0xA, 0x30, 0xFF, 0xDF, 0xA, 0x36, 0xFF, 0xDF, 0xA, 0x3A, 0xFF, 0xEA, 0xA, 0x42, 0xFF, 0xEA, 0xA, 0x57, 0xFF, 0xDF, 0xA, 0x59, 0xFF, 0xDF, 0xA, 0x64, 0xFF, 0xEA, 0xA, 0x66, 0xFF, 0xEA, 0xA, 0x68, 0xFF, 0xEA, 0xA, 0x6C, 0xFF, 0xDF, 0xA, 0xC1, 0xFF, 0xEA, 0xA, 0xC3, 0xFF, 0xEA, 0xA, 0xC5, 0xFF, 0xEA, 0xA, 0xC7, 0xFF, 0x95, 0xA, 0xCC, 0xFF, 0xDF, 0xA, 0xE7, 0xFF, 0xDF, 0xA, 0xED, 0xFF, 0xDF, 0xB, 0x13, 0xFF, 0xDF, 0xB, 0x3B, 0xFF, 0xEA, 0xB, 0x84, 0xFF, 0xDF, 0xB, 0x86, 0xFF, 0xDF, 0xB, 0x88, 0xFF, 0xDF, 0xB, 0x8A, 0xFF, 0xDF, 0xB, 0x8C, 0xFF, 0xDF, 0xB, 0x8E, 0xFF, 0xDF, 0xB, 0xAD, 0xFF, 0x95, 0xB, 0xAF, 0xFF, 0x95, 0xB, 0xB1, 0xFF, 0x95, 0xB, 0xB3, 0xFF, 0x95, 0xB, 0xC0, 0xFF, 0xEA, 0xB, 0xC2, 0xFF, 0xEA, 0xB, 0xCC, 0xFF, 0xEA, 0xB, 0xD6, 0xFF, 0xEA, 0x0, 0x8F, 0x0, 0x39, 0xFF, 0xE4, 0x0, 0x3B, 0xFF, 0xE1, 0x0, 0x3D, 0xFF, 0xEA, 0x0, 0x3E, 0xFF, 0xE1, 0x0, 0x52, 0xFF, 0xE5, 0x0, 0x53, 0xFF, 0xE5, 0x0, 0x55, 0xFF, 0xE5, 0x0, 0x5D, 0xFF, 0xF0, 0x0, 0xC2, 0xFF, 0xE4, 0x0, 0xEA, 0xFF, 0xE5, 0x1, 0x3, 0xFF, 0xE1, 0x2, 0x28, 0xFF, 0xE5, 0x2, 0x40, 0xFF, 0xE5, 0x2, 0x68, 0xFF, 0xE4, 0x2, 0x6C, 0xFF, 0xE4, 0x2, 0x70, 0xFF, 0xEA, 0x2, 0x74, 0xFF, 0xE6, 0x2, 0x77, 0xFF, 0xE6, 0x2, 0x7C, 0xFF, 0xE4, 0x2, 0x82, 0xFF, 0xE5, 0x2, 0x84, 0xFF, 0xF0, 0x2, 0x86, 0xFF, 0xE5, 0x2, 0x87, 0xFF, 0xE5, 0x2, 0x89, 0xFF, 0xE5, 0x2, 0x8A, 0xFF, 0xE5, 0x2, 0x8B, 0xFF, 0xE5, 0x2, 0x8C, 0xFF, 0xC8, 0x2, 0x8E, 0xFF, 0xE5, 0x2, 0x90, 0xFF, 0xE5, 0x2, 0x91, 0xFF, 0xE5, 0x2, 0x94, 0xFF, 0xE5, 0x2, 0x96, 0xFF, 0xE5, 0x2, 0x9B, 0xFF, 0xE5, 0x2, 0xAF, 0xFF, 0xE1, 0x2, 0xC2, 0xFF, 0xE5, 0x2, 0xCA, 0xFF, 0xEA, 0x2, 0xCB, 0xFF, 0xF0, 0x2, 0xCD, 0xFF, 0xE5, 0x2, 0xD0, 0xFF, 0xE4, 0x2, 0xD1, 0xFF, 0xB8, 0x2, 0xD3, 0xFF, 0xE5, 0x2, 0xD5, 0xFF, 0xE5, 0x2, 0xDA, 0xFF, 0xEA, 0x2, 0xDB, 0xFF, 0xF0, 0x2, 0xDC, 0xFF, 0xE4, 0x2, 0xDE, 0xFF, 0xE6, 0x2, 0xE0, 0xFF, 0xE6, 0x2, 0xEA, 0xFF, 0xE5, 0x2, 0xEC, 0xFF, 0xE5, 0x2, 0xEE, 0xFF, 0xE5, 0x2, 0xF3, 0xFF, 0xE5, 0x2, 0xF4, 0xFF, 0xEA, 0x2, 0xF5, 0xFF, 0xF0, 0x2, 0xF9, 0xFF, 0xE5, 0x2, 0xFB, 0xFF, 0xEC, 0x3, 0x3, 0xFF, 0xE0, 0x3, 0x4, 0xFF, 0xCC, 0x3, 0xF, 0xFF, 0xE5, 0x3, 0x13, 0xFF, 0xE5, 0x5, 0xF0, 0xFF, 0xE5, 0x6, 0x0, 0xFF, 0xE5, 0x6, 0x1F, 0xFF, 0xE6, 0x6, 0x23, 0xFF, 0xE4, 0x6, 0x25, 0xFF, 0xE4, 0x6, 0x28, 0xFF, 0xE5, 0x6, 0x29, 0xFF, 0xE4, 0x6, 0x30, 0xFF, 0xE5, 0x6, 0x96, 0xFF, 0xE1, 0x6, 0xAB, 0xFF, 0xE5, 0x6, 0xAC, 0xFF, 0xE5, 0x6, 0xFB, 0xFF, 0xE5, 0x6, 0xFC, 0xFF, 0xE5, 0x6, 0xFD, 0xFF, 0xE5, 0x7, 0x12, 0xFF, 0xE5, 0x8, 0xE7, 0xFF, 0xE1, 0x8, 0xF8, 0xFF, 0xE5, 0x9, 0x40, 0xFF, 0xE5, 0x9, 0x42, 0xFF, 0xE5, 0x9, 0x44, 0xFF, 0xE5, 0x9, 0x45, 0xFF, 0xE5, 0x9, 0x5C, 0xFF, 0xE4, 0x9, 0x5E, 0xFF, 0xE4, 0x9, 0x60, 0xFF, 0xE4, 0x9, 0x70, 0xFF, 0xE1, 0x9, 0x72, 0xFF, 0xE1, 0x9, 0xDA, 0xFF, 0xE1, 0x9, 0xE9, 0xFF, 0xE1, 0x9, 0xEA, 0xFF, 0xEA, 0x9, 0xEC, 0xFF, 0xE1, 0x9, 0xEF, 0xFF, 0xE5, 0xA, 0x4, 0xFF, 0xE6, 0xA, 0x10, 0xFF, 0xE4, 0xA, 0x11, 0xFF, 0xEA, 0xA, 0x14, 0xFF, 0xE5, 0xA, 0x16, 0xFF, 0xE5, 0xA, 0x19, 0xFF, 0xF0, 0xA, 0x1B, 0xFF, 0xE5, 0xA, 0x20, 0xFF, 0xE5, 0xA, 0x28, 0xFF, 0xE1, 0xA, 0x30, 0xFF, 0xE5, 0xA, 0x36, 0xFF, 0xE5, 0xA, 0x39, 0xFF, 0xE1, 0xA, 0x41, 0xFF, 0xE1, 0xA, 0x44, 0xFF, 0xEA, 0xA, 0x45, 0xFF, 0xF0, 0xA, 0x52, 0xFF, 0xEA, 0xA, 0x53, 0xFF, 0xF0, 0xA, 0x57, 0xFF, 0xE5, 0xA, 0x59, 0xFF, 0xE5, 0xA, 0x63, 0xFF, 0xE6, 0xA, 0x65, 0xFF, 0xE6, 0xA, 0x67, 0xFF, 0xE6, 0xA, 0x69, 0xFF, 0xE6, 0xA, 0x6C, 0xFF, 0xE5, 0xA, 0xC0, 0xFF, 0xE1, 0xA, 0xC2, 0xFF, 0xE1, 0xA, 0xC4, 0xFF, 0xE1, 0xA, 0xC7, 0xFF, 0xE4, 0xA, 0xC9, 0xFF, 0xE6, 0xA, 0xCC, 0xFF, 0xE5, 0xA, 0xD6, 0xFF, 0xE1, 0xA, 0xE7, 0xFF, 0xE5, 0xA, 0xED, 0xFF, 0xE5, 0xB, 0x13, 0xFF, 0xE5, 0xB, 0x84, 0xFF, 0xE5, 0xB, 0x86, 0xFF, 0xE5, 0xB, 0x88, 0xFF, 0xE5, 0xB, 0x8A, 0xFF, 0xE5, 0xB, 0x8C, 0xFF, 0xE5, 0xB, 0x8E, 0xFF, 0xE5, 0xB, 0xAD, 0xFF, 0xE4, 0xB, 0xAF, 0xFF, 0xE4, 0xB, 0xB1, 0xFF, 0xE4, 0xB, 0xB3, 0xFF, 0xE4, 0xB, 0xBF, 0xFF, 0xE1, 0xB, 0xC1, 0xFF, 0xE1, 0xB, 0xC7, 0xFF, 0xEA, 0xB, 0xC8, 0xFF, 0xF0, 0xB, 0xC9, 0xFF, 0xEA, 0xB, 0xCA, 0xFF, 0xF0, 0xB, 0xCB, 0xFF, 0xE1, 0xC, 0xA2, 0xFF, 0xE1, 0xC, 0xA3, 0xFF, 0xE1, 0x0, 0xDC, 0x0, 0x26, 0x0, 0x18, 0x0, 0x28, 0xFF, 0xE6, 0x0, 0x2C, 0xFF, 0xE6, 0x0, 0x34, 0xFF, 0xE6, 0x0, 0x36, 0xFF, 0xE6, 0x0, 0x39, 0xFF, 0xDD, 0x0, 0x3B, 0xFF, 0xDD, 0x0, 0x3E, 0xFF, 0xDC, 0x0, 0x84, 0xFF, 0xE6, 0x0, 0x94, 0xFF, 0xE6, 0x0, 0x9E, 0xFF, 0xE6, 0x0, 0xAA, 0xFF, 0xE6, 0x0, 0xB4, 0xFF, 0xE6, 0x0, 0xB6, 0xFF, 0xE6, 0x0, 0xC2, 0xFF, 0xDD, 0x0, 0xFA, 0x0, 0x18, 0x0, 0xFF, 0xFF, 0xE6, 0x1, 0x3, 0xFF, 0xDC, 0x2, 0x31, 0x0, 0x18, 0x2, 0x32, 0xFF, 0xE6, 0x2, 0x33, 0x0, 0x18, 0x2, 0x55, 0xFF, 0xE6, 0x2, 0x57, 0xFF, 0xE6, 0x2, 0x66, 0xFF, 0xE6, 0x2, 0x68, 0xFF, 0xDD, 0x2, 0x69, 0xFF, 0xE6, 0x2, 0x6A, 0x0, 0x11, 0x2, 0x6C, 0xFF, 0xDD, 0x2, 0x6F, 0x0, 0x20, 0x2, 0x73, 0x0, 0x11, 0x2, 0x77, 0xFF, 0xD8, 0x2, 0x7C, 0xFF, 0xE8, 0x2, 0x83, 0x0, 0x1F, 0x2, 0x88, 0x0, 0x23, 0x2, 0x8F, 0xFF, 0xDD, 0x2, 0x9A, 0x0, 0x23, 0x2, 0x9E, 0xFF, 0xE6, 0x2, 0xA3, 0x0, 0x18, 0x2, 0xAD, 0xFF, 0xE6, 0x2, 0xAF, 0xFF, 0xDD, 0x2, 0xB1, 0xFF, 0xE6, 0x2, 0xB3, 0xFF, 0xE6, 0x2, 0xB5, 0xFF, 0xE6, 0x2, 0xB7, 0xFF, 0xE6, 0x2, 0xD0, 0xFF, 0xDD, 0x2, 0xD8, 0xFF, 0xE6, 0x2, 0xDC, 0xFF, 0xDD, 0x2, 0xDE, 0xFF, 0xD8, 0x2, 0xDF, 0xFF, 0xDD, 0x2, 0xE0, 0xFF, 0xDB, 0x2, 0xE1, 0xFF, 0xD6, 0x2, 0xE4, 0xFF, 0xED, 0x2, 0xE7, 0x0, 0x11, 0x2, 0xE8, 0x0, 0x23, 0x2, 0xEF, 0xFF, 0xEE, 0x2, 0xF9, 0xFF, 0xDC, 0x2, 0xFB, 0xFF, 0xDB, 0x2, 0xFD, 0x0, 0x11, 0x3, 0x1, 0xFF, 0xE6, 0x3, 0x3, 0xFF, 0xDC, 0x3, 0x5, 0xFF, 0xFB, 0x3, 0x6, 0x0, 0x11, 0x3, 0x7, 0x0, 0x23, 0x3, 0x8, 0x0, 0x11, 0x3, 0x9, 0x0, 0x23, 0x3, 0x10, 0x0, 0x11, 0x3, 0x11, 0x0, 0x23, 0x5, 0x63, 0xFF, 0xE6, 0x5, 0xE5, 0xFF, 0xE6, 0x5, 0xED, 0xFF, 0xE6, 0x5, 0xF1, 0x0, 0x18, 0x6, 0x1, 0xFF, 0xE6, 0x6, 0x3, 0xFF, 0xE6, 0x6, 0x5, 0xFF, 0xE6, 0x6, 0x1F, 0xFF, 0xD8, 0x6, 0x20, 0xFF, 0xDD, 0x6, 0x23, 0xFF, 0xDD, 0x6, 0x25, 0xFF, 0xDD, 0x6, 0x29, 0xFF, 0xDD, 0x6, 0x31, 0xFF, 0xE6, 0x6, 0x33, 0xFF, 0xE6, 0x6, 0x6A, 0x0, 0x18, 0x6, 0x6C, 0x0, 0x18, 0x6, 0x70, 0x0, 0x18, 0x6, 0x72, 0x0, 0x18, 0x6, 0x74, 0x0, 0x18, 0x6, 0x84, 0xFF, 0xE6, 0x6, 0x86, 0xFF, 0xE6, 0x6, 0x8E, 0xFF, 0xE6, 0x6, 0x90, 0xFF, 0xE6, 0x6, 0x96, 0xFF, 0xDD, 0x6, 0xE3, 0xFF, 0xE6, 0x7, 0xCF, 0xFF, 0xE6, 0x7, 0xD0, 0xFF, 0xE6, 0x7, 0xD2, 0xFF, 0xE6, 0x7, 0xD3, 0xFF, 0xE6, 0x8, 0xCD, 0x0, 0x18, 0x8, 0xCE, 0x0, 0x18, 0x8, 0xCF, 0x0, 0x18, 0x8, 0xD0, 0x0, 0x18, 0x8, 0xD1, 0x0, 0x18, 0x8, 0xD2, 0x0, 0x18, 0x8, 0xD3, 0x0, 0x18, 0x8, 0xD4, 0xFF, 0xE6, 0x8, 0xDE, 0xFF, 0xE6, 0x8, 0xDF, 0xFF, 0xE6, 0x8, 0xE0, 0xFF, 0xE6, 0x8, 0xE1, 0xFF, 0xE6, 0x8, 0xE2, 0xFF, 0xE6, 0x8, 0xE7, 0xFF, 0xDC, 0x9, 0x4, 0x0, 0x18, 0x9, 0x6, 0x0, 0x18, 0x9, 0x8, 0x0, 0x18, 0x9, 0xA, 0xFF, 0xE6, 0x9, 0xC, 0xFF, 0xE6, 0x9, 0xE, 0xFF, 0xE6, 0x9, 0x10, 0xFF, 0xE6, 0x9, 0x1E, 0xFF, 0xE6, 0x9, 0x20, 0xFF, 0xE6, 0x9, 0x22, 0xFF, 0xE6, 0x9, 0x24, 0xFF, 0xE6, 0x9, 0x46, 0xFF, 0xE6, 0x9, 0x48, 0xFF, 0xE6, 0x9, 0x4A, 0xFF, 0xE6, 0x9, 0x5C, 0xFF, 0xDD, 0x9, 0x5E, 0xFF, 0xDD, 0x9, 0x60, 0xFF, 0xDD, 0x9, 0x70, 0xFF, 0xDC, 0x9, 0x72, 0xFF, 0xDC, 0x9, 0x7B, 0xFF, 0xE6, 0x9, 0xD5, 0x0, 0x18, 0x9, 0xD9, 0xFF, 0xE6, 0x9, 0xDA, 0xFF, 0xDC, 0x9, 0xDD, 0x0, 0x18, 0x9, 0xE6, 0xFF, 0xE6, 0x9, 0xE9, 0xFF, 0xDC, 0x9, 0xEC, 0xFF, 0xDC, 0xA, 0x5, 0x0, 0x18, 0xA, 0xC, 0xFF, 0xE6, 0xA, 0xF, 0xFF, 0xE6, 0xA, 0x10, 0xFF, 0xDD, 0xA, 0x28, 0xFF, 0xDC, 0xA, 0x31, 0x0, 0x18, 0xA, 0x39, 0xFF, 0xDD, 0xA, 0x3C, 0xFF, 0xE6, 0xA, 0x3F, 0xFF, 0xE6, 0xA, 0x41, 0xFF, 0xDC, 0xA, 0x47, 0x0, 0x18, 0xA, 0x49, 0x0, 0x18, 0xA, 0x5A, 0xFF, 0xE6, 0xA, 0x5C, 0xFF, 0xE6, 0xA, 0x5E, 0xFF, 0xE6, 0xA, 0x5F, 0xFF, 0xE6, 0xA, 0x69, 0xFF, 0xD8, 0xA, 0x6A, 0xFF, 0xDD, 0xA, 0x6E, 0x0, 0x18, 0xA, 0x70, 0x0, 0x18, 0xA, 0x72, 0x0, 0x18, 0xA, 0x74, 0x0, 0x18, 0xA, 0x76, 0x0, 0x18, 0xA, 0x78, 0x0, 0x18, 0xA, 0x7A, 0x0, 0x18, 0xA, 0x7C, 0x0, 0x18, 0xA, 0x7E, 0x0, 0x18, 0xA, 0x80, 0x0, 0x18, 0xA, 0x82, 0x0, 0x18, 0xA, 0x84, 0x0, 0x18, 0xA, 0x9A, 0xFF, 0xE6, 0xA, 0x9C, 0xFF, 0xE6, 0xA, 0x9E, 0xFF, 0xE6, 0xA, 0xA0, 0xFF, 0xE6, 0xA, 0xA2, 0xFF, 0xE6, 0xA, 0xA4, 0xFF, 0xE6, 0xA, 0xA6, 0xFF, 0xE6, 0xA, 0xA8, 0xFF, 0xE6, 0xA, 0xAA, 0xFF, 0xE6, 0xA, 0xAC, 0xFF, 0xE6, 0xA, 0xAE, 0xFF, 0xE6, 0xA, 0xB0, 0xFF, 0xE6, 0xA, 0xC0, 0xFF, 0xDC, 0xA, 0xC2, 0xFF, 0xDC, 0xA, 0xC4, 0xFF, 0xDC, 0xA, 0xC7, 0xFF, 0xDD, 0xA, 0xC9, 0xFF, 0xD8, 0xA, 0xCA, 0xFF, 0xDD, 0xA, 0xD6, 0xFF, 0xDC, 0xA, 0xEE, 0x0, 0x18, 0xA, 0xF2, 0xFF, 0xE6, 0xA, 0xFF, 0x0, 0x18, 0xB, 0x1, 0x0, 0x18, 0xB, 0x9, 0xFF, 0xE6, 0xB, 0xB, 0xFF, 0xE6, 0xB, 0x14, 0x0, 0x18, 0xB, 0x16, 0x0, 0x18, 0xB, 0x20, 0xFF, 0xE6, 0xB, 0x22, 0xFF, 0xE6, 0xB, 0x2E, 0x0, 0x18, 0xB, 0x32, 0xFF, 0xE6, 0xB, 0x34, 0xFF, 0xE6, 0xB, 0x36, 0xFF, 0xE6, 0xB, 0x38, 0xFF, 0xE6, 0xB, 0x49, 0xFF, 0xE6, 0xB, 0x53, 0xFF, 0xE6, 0xB, 0x6B, 0xFF, 0xE6, 0xB, 0x8F, 0xFF, 0xE6, 0xB, 0x91, 0xFF, 0xE6, 0xB, 0x93, 0xFF, 0xE6, 0xB, 0x95, 0xFF, 0xE6, 0xB, 0xAD, 0xFF, 0xDD, 0xB, 0xAF, 0xFF, 0xDD, 0xB, 0xB1, 0xFF, 0xDD, 0xB, 0xB3, 0xFF, 0xDD, 0xB, 0xBF, 0xFF, 0xDD, 0xB, 0xC1, 0xFF, 0xDD, 0xB, 0xCB, 0xFF, 0xDC, 0xC, 0x81, 0x0, 0x18, 0xC, 0x82, 0x0, 0x18, 0xC, 0x85, 0x0, 0x18, 0xC, 0xA2, 0xFF, 0xDC, 0xC, 0xA3, 0xFF, 0xDC, 0x0, 0x45, 0x0, 0x1C, 0xFF, 0xF1, 0x0, 0x39, 0xFF, 0xF0, 0x0, 0x3B, 0xFF, 0xF3, 0x0, 0x3D, 0xFF, 0xF3, 0x0, 0x3E, 0xFF, 0xE8, 0x0, 0xC2, 0xFF, 0xF0, 0x1, 0x3, 0xFF, 0xE8, 0x2, 0x68, 0xFF, 0xF0, 0x2, 0x6A, 0xFF, 0xF4, 0x2, 0x6C, 0xFF, 0xF0, 0x2, 0x70, 0xFF, 0xF3, 0x2, 0x73, 0xFF, 0xF4, 0x2, 0x74, 0xFF, 0xF2, 0x2, 0x7C, 0xFF, 0xF0, 0x2, 0xAF, 0xFF, 0xF3, 0x2, 0xCA, 0xFF, 0xF3, 0x2, 0xD0, 0xFF, 0xF0, 0x2, 0xDA, 0xFF, 0xF3, 0x2, 0xDC, 0xFF, 0xF0, 0x2, 0xE7, 0xFF, 0xF4, 0x2, 0xF4, 0xFF, 0xF3, 0x2, 0xF9, 0xFF, 0xF1, 0x2, 0xFB, 0xFF, 0xF1, 0x2, 0xFD, 0xFF, 0xF4, 0x3, 0x3, 0xFF, 0xF4, 0x3, 0x6, 0xFF, 0xF4, 0x3, 0x8, 0xFF, 0xF4, 0x3, 0x10, 0xFF, 0xF4, 0x6, 0x23, 0xFF, 0xF0, 0x6, 0x25, 0xFF, 0xF0, 0x6, 0x29, 0xFF, 0xF0, 0x6, 0x96, 0xFF, 0xF3, 0x8, 0xE7, 0xFF, 0xE8, 0x9, 0x5C, 0xFF, 0xF0, 0x9, 0x5E, 0xFF, 0xF0, 0x9, 0x60, 0xFF, 0xF0, 0x9, 0x70, 0xFF, 0xE8, 0x9, 0x72, 0xFF, 0xE8, 0x9, 0xDA, 0xFF, 0xE8, 0x9, 0xE9, 0xFF, 0xE8, 0x9, 0xEA, 0xFF, 0xF3, 0x9, 0xEC, 0xFF, 0xE8, 0xA, 0x4, 0xFF, 0xF2, 0xA, 0x10, 0xFF, 0xF0, 0xA, 0x11, 0xFF, 0xF3, 0xA, 0x28, 0xFF, 0xE8, 0xA, 0x39, 0xFF, 0xF3, 0xA, 0x41, 0xFF, 0xE8, 0xA, 0x44, 0xFF, 0xF3, 0xA, 0x52, 0xFF, 0xF3, 0xA, 0x63, 0xFF, 0xF2, 0xA, 0x65, 0xFF, 0xF2, 0xA, 0x67, 0xFF, 0xF2, 0xA, 0xC0, 0xFF, 0xE8, 0xA, 0xC2, 0xFF, 0xE8, 0xA, 0xC4, 0xFF, 0xE8, 0xA, 0xC7, 0xFF, 0xF0, 0xA, 0xD6, 0xFF, 0xE8, 0xB, 0xAD, 0xFF, 0xF0, 0xB, 0xAF, 0xFF, 0xF0, 0xB, 0xB1, 0xFF, 0xF0, 0xB, 0xB3, 0xFF, 0xF0, 0xB, 0xBF, 0xFF, 0xF3, 0xB, 0xC1, 0xFF, 0xF3, 0xB, 0xC7, 0xFF, 0xF3, 0xB, 0xC9, 0xFF, 0xF3, 0xB, 0xCB, 0xFF, 0xE8, 0xC, 0xA2, 0xFF, 0xE8, 0xC, 0xA3, 0xFF, 0xE8, 0x0, 0xCC, 0x0, 0x26, 0x0, 0xD, 0x0, 0x39, 0xFF, 0xBD, 0x0, 0x3B, 0xFF, 0xD2, 0x0, 0x3D, 0x0, 0xF, 0x0, 0x3E, 0xFF, 0xDD, 0x0, 0x52, 0xFF, 0xF5, 0x0, 0x53, 0xFF, 0xF5, 0x0, 0x55, 0xFF, 0xF5, 0x0, 0xC2, 0xFF, 0xBD, 0x0, 0xEA, 0xFF, 0xF5, 0x0, 0xFA, 0x0, 0xD, 0x1, 0x3, 0xFF, 0xDD, 0x2, 0x28, 0xFF, 0xF5, 0x2, 0x31, 0x0, 0xD, 0x2, 0x33, 0x0, 0xD, 0x2, 0x40, 0xFF, 0xF5, 0x2, 0x68, 0xFF, 0xBD, 0x2, 0x6A, 0x0, 0xF, 0x2, 0x6C, 0xFF, 0xBD, 0x2, 0x6F, 0x0, 0x14, 0x2, 0x70, 0x0, 0xF, 0x2, 0x73, 0x0, 0xF, 0x2, 0x74, 0xFF, 0xF0, 0x2, 0x77, 0xFF, 0xC7, 0x2, 0x7C, 0xFF, 0xE4, 0x2, 0x7D, 0xFF, 0xF3, 0x2, 0x82, 0xFF, 0xF5, 0x2, 0x83, 0x0, 0x13, 0x2, 0x86, 0xFF, 0xF5, 0x2, 0x87, 0xFF, 0xF5, 0x2, 0x88, 0x0, 0x14, 0x2, 0x89, 0xFF, 0xF5, 0x2, 0x8A, 0xFF, 0xF5, 0x2, 0x8B, 0xFF, 0xF5, 0x2, 0x8C, 0xFF, 0xDE, 0x2, 0x8E, 0xFF, 0xF5, 0x2, 0x8F, 0xFF, 0xDB, 0x2, 0x90, 0xFF, 0xF5, 0x2, 0x91, 0xFF, 0xF5, 0x2, 0x94, 0xFF, 0xF0, 0x2, 0x96, 0xFF, 0xF5, 0x2, 0x9A, 0x0, 0x14, 0x2, 0x9B, 0xFF, 0xF5, 0x2, 0xA3, 0x0, 0xD, 0x2, 0xAF, 0xFF, 0xD2, 0x2, 0xC2, 0xFF, 0xF5, 0x2, 0xCA, 0x0, 0xF, 0x2, 0xCD, 0xFF, 0xF5, 0x2, 0xD0, 0xFF, 0xBD, 0x2, 0xD1, 0xFF, 0xD0, 0x2, 0xD3, 0xFF, 0xF5, 0x2, 0xD5, 0xFF, 0xF5, 0x2, 0xDA, 0x0, 0xF, 0x2, 0xDC, 0xFF, 0xBD, 0x2, 0xDE, 0xFF, 0xC7, 0x2, 0xDF, 0xFF, 0xDB, 0x2, 0xE0, 0xFF, 0xCE, 0x2, 0xE1, 0xFF, 0xDF, 0x2, 0xE3, 0xFF, 0xEE, 0x2, 0xE7, 0x0, 0xF, 0x2, 0xE8, 0x0, 0x14, 0x2, 0xEA, 0xFF, 0xF5, 0x2, 0xEC, 0xFF, 0xF5, 0x2, 0xEE, 0xFF, 0xF5, 0x2, 0xF3, 0xFF, 0xF5, 0x2, 0xF4, 0x0, 0xF, 0x2, 0xF9, 0xFF, 0xCB, 0x2, 0xFB, 0xFF, 0xCB, 0x2, 0xFD, 0x0, 0xF, 0x3, 0x3, 0xFF, 0xD6, 0x3, 0x4, 0xFF, 0xD7, 0x3, 0x6, 0x0, 0xF, 0x3, 0x7, 0x0, 0x14, 0x3, 0x8, 0x0, 0xF, 0x3, 0x9, 0x0, 0x14, 0x3, 0xF, 0xFF, 0xF5, 0x3, 0x10, 0x0, 0xF, 0x3, 0x11, 0x0, 0x14, 0x3, 0x13, 0xFF, 0xF5, 0x5, 0xF0, 0xFF, 0xF5, 0x5, 0xF1, 0x0, 0xD, 0x6, 0x0, 0xFF, 0xF5, 0x6, 0x1F, 0xFF, 0xC7, 0x6, 0x20, 0xFF, 0xDB, 0x6, 0x23, 0xFF, 0xBD, 0x6, 0x25, 0xFF, 0xBD, 0x6, 0x28, 0xFF, 0xF5, 0x6, 0x29, 0xFF, 0xBD, 0x6, 0x30, 0xFF, 0xF5, 0x6, 0x6A, 0x0, 0xD, 0x6, 0x6C, 0x0, 0xD, 0x6, 0x70, 0x0, 0xD, 0x6, 0x72, 0x0, 0xD, 0x6, 0x74, 0x0, 0xD, 0x6, 0x96, 0xFF, 0xD2, 0x6, 0xAB, 0xFF, 0xF5, 0x6, 0xAC, 0xFF, 0xF5, 0x6, 0xFB, 0xFF, 0xF5, 0x6, 0xFC, 0xFF, 0xF5, 0x6, 0xFD, 0xFF, 0xF5, 0x7, 0x12, 0xFF, 0xF5, 0x8, 0xCD, 0x0, 0xD, 0x8, 0xCE, 0x0, 0xD, 0x8, 0xCF, 0x0, 0xD, 0x8, 0xD0, 0x0, 0xD, 0x8, 0xD1, 0x0, 0xD, 0x8, 0xD2, 0x0, 0xD, 0x8, 0xD3, 0x0, 0xD, 0x8, 0xE7, 0xFF, 0xDD, 0x8, 0xF8, 0xFF, 0xF5, 0x9, 0x4, 0x0, 0xD, 0x9, 0x6, 0x0, 0xD, 0x9, 0x8, 0x0, 0xD, 0x9, 0x40, 0xFF, 0xF5, 0x9, 0x42, 0xFF, 0xF5, 0x9, 0x44, 0xFF, 0xF5, 0x9, 0x45, 0xFF, 0xF5, 0x9, 0x5C, 0xFF, 0xBD, 0x9, 0x5E, 0xFF, 0xBD, 0x9, 0x60, 0xFF, 0xBD, 0x9, 0x70, 0xFF, 0xDD, 0x9, 0x72, 0xFF, 0xDD, 0x9, 0xD5, 0x0, 0xD, 0x9, 0xDA, 0xFF, 0xDD, 0x9, 0xDD, 0x0, 0xD, 0x9, 0xE9, 0xFF, 0xDD, 0x9, 0xEA, 0x0, 0xF, 0x9, 0xEC, 0xFF, 0xDD, 0x9, 0xEF, 0xFF, 0xF5, 0xA, 0x4, 0xFF, 0xF0, 0xA, 0x5, 0x0, 0xD, 0xA, 0x10, 0xFF, 0xBD, 0xA, 0x11, 0x0, 0xF, 0xA, 0x14, 0xFF, 0xF5, 0xA, 0x16, 0xFF, 0xF5, 0xA, 0x1B, 0xFF, 0xF5, 0xA, 0x20, 0xFF, 0xF5, 0xA, 0x28, 0xFF, 0xDD, 0xA, 0x30, 0xFF, 0xF5, 0xA, 0x31, 0x0, 0xD, 0xA, 0x36, 0xFF, 0xF5, 0xA, 0x39, 0xFF, 0xD2, 0xA, 0x41, 0xFF, 0xDD, 0xA, 0x44, 0x0, 0xF, 0xA, 0x47, 0x0, 0xD, 0xA, 0x49, 0x0, 0xD, 0xA, 0x52, 0x0, 0xF, 0xA, 0x57, 0xFF, 0xF5, 0xA, 0x59, 0xFF, 0xF5, 0xA, 0x63, 0xFF, 0xF0, 0xA, 0x65, 0xFF, 0xF0, 0xA, 0x67, 0xFF, 0xF0, 0xA, 0x69, 0xFF, 0xC7, 0xA, 0x6A, 0xFF, 0xDB, 0xA, 0x6C, 0xFF, 0xF5, 0xA, 0x6E, 0x0, 0xD, 0xA, 0x70, 0x0, 0xD, 0xA, 0x72, 0x0, 0xD, 0xA, 0x74, 0x0, 0xD, 0xA, 0x76, 0x0, 0xD, 0xA, 0x78, 0x0, 0xD, 0xA, 0x7A, 0x0, 0xD, 0xA, 0x7C, 0x0, 0xD, 0xA, 0x7E, 0x0, 0xD, 0xA, 0x80, 0x0, 0xD, 0xA, 0x82, 0x0, 0xD, 0xA, 0x84, 0x0, 0xD, 0xA, 0xC0, 0xFF, 0xDD, 0xA, 0xC2, 0xFF, 0xDD, 0xA, 0xC4, 0xFF, 0xDD, 0xA, 0xC7, 0xFF, 0xBD, 0xA, 0xC9, 0xFF, 0xC7, 0xA, 0xCA, 0xFF, 0xDB, 0xA, 0xCC, 0xFF, 0xF5, 0xA, 0xD6, 0xFF, 0xDD, 0xA, 0xE7, 0xFF, 0xF5, 0xA, 0xED, 0xFF, 0xF5, 0xA, 0xEE, 0x0, 0xD, 0xA, 0xFF, 0x0, 0xD, 0xB, 0x1, 0x0, 0xD, 0xB, 0x13, 0xFF, 0xF5, 0xB, 0x14, 0x0, 0xD, 0xB, 0x16, 0x0, 0xD, 0xB, 0x2E, 0x0, 0xD, 0xB, 0x84, 0xFF, 0xF5, 0xB, 0x86, 0xFF, 0xF5, 0xB, 0x88, 0xFF, 0xF5, 0xB, 0x8A, 0xFF, 0xF5, 0xB, 0x8C, 0xFF, 0xF5, 0xB, 0x8E, 0xFF, 0xF5, 0xB, 0xAD, 0xFF, 0xBD, 0xB, 0xAF, 0xFF, 0xBD, 0xB, 0xB1, 0xFF, 0xBD, 0xB, 0xB3, 0xFF, 0xBD, 0xB, 0xBF, 0xFF, 0xD2, 0xB, 0xC1, 0xFF, 0xD2, 0xB, 0xC7, 0x0, 0xF, 0xB, 0xC9, 0x0, 0xF, 0xB, 0xCB, 0xFF, 0xDD, 0xC, 0x81, 0x0, 0xD, 0xC, 0x82, 0x0, 0xD, 0xC, 0x85, 0x0, 0xD, 0xC, 0xA2, 0xFF, 0xDD, 0xC, 0xA3, 0xFF, 0xDD, 0x0, 0x47, 0x0, 0x7, 0xFF, 0xD6, 0x0, 0xC, 0xFF, 0xD6, 0x0, 0x39, 0xFF, 0xC1, 0x0, 0x3B, 0xFF, 0xDC, 0x0, 0x3E, 0xFF, 0xCA, 0x0, 0xC2, 0xFF, 0xC1, 0x1, 0x3, 0xFF, 0xCA, 0x2, 0x68, 0xFF, 0xC1, 0x2, 0x6C, 0xFF, 0xC1, 0x2, 0x74, 0xFF, 0xF3, 0x2, 0x77, 0xFF, 0xEF, 0x2, 0x7C, 0xFF, 0xD9, 0x2, 0x8C, 0xFF, 0xDF, 0x2, 0x94, 0xFF, 0xE4, 0x2, 0xAF, 0xFF, 0xDC, 0x2, 0xD0, 0xFF, 0xC1, 0x2, 0xD1, 0xFF, 0xDE, 0x2, 0xDC, 0xFF, 0xC1, 0x2, 0xDE, 0xFF, 0xEF, 0x2, 0xE0, 0xFF, 0xEF, 0x2, 0xE3, 0xFF, 0xDC, 0x2, 0xF9, 0xFF, 0xE1, 0x2, 0xFB, 0xFF, 0xF3, 0x3, 0x3, 0xFF, 0xC2, 0x3, 0x4, 0xFF, 0xE0, 0x4, 0x62, 0xFF, 0xD6, 0x4, 0x63, 0xFF, 0xD6, 0x4, 0x65, 0xFF, 0xD6, 0x4, 0x66, 0xFF, 0xD6, 0x4, 0x67, 0xFF, 0xD6, 0x6, 0x1F, 0xFF, 0xEF, 0x6, 0x23, 0xFF, 0xC1, 0x6, 0x25, 0xFF, 0xC1, 0x6, 0x29, 0xFF, 0xC1, 0x6, 0x96, 0xFF, 0xDC, 0x8, 0xE7, 0xFF, 0xCA, 0x9, 0x5C, 0xFF, 0xC1, 0x9, 0x5E, 0xFF, 0xC1, 0x9, 0x60, 0xFF, 0xC1, 0x9, 0x70, 0xFF, 0xCA, 0x9, 0x72, 0xFF, 0xCA, 0x9, 0xDA, 0xFF, 0xCA, 0x9, 0xE9, 0xFF, 0xCA, 0x9, 0xEC, 0xFF, 0xCA, 0xA, 0x4, 0xFF, 0xF3, 0xA, 0x10, 0xFF, 0xC1, 0xA, 0x28, 0xFF, 0xCA, 0xA, 0x2A, 0xFF, 0xD6, 0xA, 0x2B, 0xFF, 0xD6, 0xA, 0x2E, 0xFF, 0xD6, 0xA, 0x39, 0xFF, 0xDC, 0xA, 0x41, 0xFF, 0xCA, 0xA, 0x63, 0xFF, 0xF3, 0xA, 0x65, 0xFF, 0xF3, 0xA, 0x67, 0xFF, 0xF3, 0xA, 0x69, 0xFF, 0xEF, 0xA, 0xC0, 0xFF, 0xCA, 0xA, 0xC2, 0xFF, 0xCA, 0xA, 0xC4, 0xFF, 0xCA, 0xA, 0xC7, 0xFF, 0xC1, 0xA, 0xC9, 0xFF, 0xEF, 0xA, 0xD6, 0xFF, 0xCA, 0xB, 0xAD, 0xFF, 0xC1, 0xB, 0xAF, 0xFF, 0xC1, 0xB, 0xB1, 0xFF, 0xC1, 0xB, 0xB3, 0xFF, 0xC1, 0xB, 0xBF, 0xFF, 0xDC, 0xB, 0xC1, 0xFF, 0xDC, 0xB, 0xCB, 0xFF, 0xCA, 0xC, 0xA2, 0xFF, 0xCA, 0xC, 0xA3, 0xFF, 0xCA, 0x0, 0x42, 0x0, 0x39, 0xFF, 0xE1, 0x0, 0x3D, 0xFF, 0xD8, 0x0, 0x3E, 0xFF, 0xD7, 0x0, 0xC2, 0xFF, 0xE1, 0x1, 0x3, 0xFF, 0xD7, 0x2, 0x68, 0xFF, 0xE1, 0x2, 0x6A, 0xFF, 0xE3, 0x2, 0x6C, 0xFF, 0xE1, 0x2, 0x6F, 0xFF, 0xE0, 0x2, 0x70, 0xFF, 0xD8, 0x2, 0x73, 0xFF, 0xE3, 0x2, 0x74, 0xFF, 0xDD, 0x2, 0x88, 0xFF, 0xEC, 0x2, 0x9A, 0xFF, 0xEC, 0x2, 0xCA, 0xFF, 0xD8, 0x2, 0xD0, 0xFF, 0xE1, 0x2, 0xDA, 0xFF, 0xD8, 0x2, 0xDC, 0xFF, 0xE1, 0x2, 0xE7, 0xFF, 0xE3, 0x2, 0xE8, 0xFF, 0xEC, 0x2, 0xF4, 0xFF, 0xD8, 0x2, 0xFD, 0xFF, 0xE3, 0x3, 0x3, 0xFF, 0xDE, 0x3, 0x6, 0xFF, 0xE3, 0x3, 0x7, 0xFF, 0xEC, 0x3, 0x8, 0xFF, 0xE3, 0x3, 0x9, 0xFF, 0xEC, 0x3, 0x10, 0xFF, 0xE3, 0x3, 0x11, 0xFF, 0xEC, 0x6, 0x23, 0xFF, 0xE1, 0x6, 0x25, 0xFF, 0xE1, 0x6, 0x29, 0xFF, 0xE1, 0x8, 0xE7, 0xFF, 0xD7, 0x9, 0x5C, 0xFF, 0xE1, 0x9, 0x5E, 0xFF, 0xE1, 0x9, 0x60, 0xFF, 0xE1, 0x9, 0x70, 0xFF, 0xD7, 0x9, 0x72, 0xFF, 0xD7, 0x9, 0xDA, 0xFF, 0xD7, 0x9, 0xE9, 0xFF, 0xD7, 0x9, 0xEA, 0xFF, 0xD8, 0x9, 0xEC, 0xFF, 0xD7, 0xA, 0x4, 0xFF, 0xDD, 0xA, 0x10, 0xFF, 0xE1, 0xA, 0x11, 0xFF, 0xD8, 0xA, 0x28, 0xFF, 0xD7, 0xA, 0x41, 0xFF, 0xD7, 0xA, 0x44, 0xFF, 0xD8, 0xA, 0x52, 0xFF, 0xD8, 0xA, 0x63, 0xFF, 0xDD, 0xA, 0x65, 0xFF, 0xDD, 0xA, 0x67, 0xFF, 0xDD, 0xA, 0xC0, 0xFF, 0xD7, 0xA, 0xC2, 0xFF, 0xD7, 0xA, 0xC4, 0xFF, 0xD7, 0xA, 0xC7, 0xFF, 0xE1, 0xA, 0xD6, 0xFF, 0xD7, 0xB, 0xAD, 0xFF, 0xE1, 0xB, 0xAF, 0xFF, 0xE1, 0xB, 0xB1, 0xFF, 0xE1, 0xB, 0xB3, 0xFF, 0xE1, 0xB, 0xC7, 0xFF, 0xD8, 0xB, 0xC9, 0xFF, 0xD8, 0xB, 0xCB, 0xFF, 0xD7, 0xC, 0xA2, 0xFF, 0xD7, 0xC, 0xA3, 0xFF, 0xD7, 0x0, 0x31, 0x0, 0x39, 0xFF, 0xE0, 0x0, 0x3D, 0xFF, 0xE2, 0x0, 0xC2, 0xFF, 0xE0, 0x2, 0x68, 0xFF, 0xE0, 0x2, 0x6A, 0xFF, 0xD7, 0x2, 0x6C, 0xFF, 0xE0, 0x2, 0x6F, 0xFF, 0xD8, 0x2, 0x70, 0xFF, 0xE2, 0x2, 0x73, 0xFF, 0xD7, 0x2, 0x74, 0xFF, 0xD2, 0x2, 0x83, 0xFF, 0xDB, 0x2, 0x88, 0xFF, 0xE9, 0x2, 0x9A, 0xFF, 0xE9, 0x2, 0xCA, 0xFF, 0xE2, 0x2, 0xD0, 0xFF, 0xE0, 0x2, 0xDA, 0xFF, 0xE2, 0x2, 0xDC, 0xFF, 0xE0, 0x2, 0xE7, 0xFF, 0xD7, 0x2, 0xE8, 0xFF, 0xE9, 0x2, 0xF4, 0xFF, 0xE2, 0x2, 0xFD, 0xFF, 0xD7, 0x3, 0x6, 0xFF, 0xD7, 0x3, 0x7, 0xFF, 0xE9, 0x3, 0x8, 0xFF, 0xD7, 0x3, 0x9, 0xFF, 0xE9, 0x3, 0x10, 0xFF, 0xD7, 0x3, 0x11, 0xFF, 0xE9, 0x6, 0x23, 0xFF, 0xE0, 0x6, 0x25, 0xFF, 0xE0, 0x6, 0x29, 0xFF, 0xE0, 0x9, 0x5C, 0xFF, 0xE0, 0x9, 0x5E, 0xFF, 0xE0, 0x9, 0x60, 0xFF, 0xE0, 0x9, 0xEA, 0xFF, 0xE2, 0xA, 0x4, 0xFF, 0xD2, 0xA, 0x10, 0xFF, 0xE0, 0xA, 0x11, 0xFF, 0xE2, 0xA, 0x44, 0xFF, 0xE2, 0xA, 0x52, 0xFF, 0xE2, 0xA, 0x63, 0xFF, 0xD2, 0xA, 0x65, 0xFF, 0xD2, 0xA, 0x67, 0xFF, 0xD2, 0xA, 0xC7, 0xFF, 0xE0, 0xB, 0xAD, 0xFF, 0xE0, 0xB, 0xAF, 0xFF, 0xE0, 0xB, 0xB1, 0xFF, 0xE0, 0xB, 0xB3, 0xFF, 0xE0, 0xB, 0xC7, 0xFF, 0xE2, 0xB, 0xC9, 0xFF, 0xE2, 0x0, 0x23, 0x0, 0x39, 0xFF, 0xE9, 0x0, 0x3E, 0xFF, 0xF2, 0x0, 0xC2, 0xFF, 0xE9, 0x1, 0x3, 0xFF, 0xF2, 0x2, 0x68, 0xFF, 0xE9, 0x2, 0x6C, 0xFF, 0xE9, 0x2, 0xD0, 0xFF, 0xE9, 0x2, 0xDC, 0xFF, 0xE9, 0x6, 0x23, 0xFF, 0xE9, 0x6, 0x25, 0xFF, 0xE9, 0x6, 0x29, 0xFF, 0xE9, 0x8, 0xE7, 0xFF, 0xF2, 0x9, 0x5C, 0xFF, 0xE9, 0x9, 0x5E, 0xFF, 0xE9, 0x9, 0x60, 0xFF, 0xE9, 0x9, 0x70, 0xFF, 0xF2, 0x9, 0x72, 0xFF, 0xF2, 0x9, 0xDA, 0xFF, 0xF2, 0x9, 0xE9, 0xFF, 0xF2, 0x9, 0xEC, 0xFF, 0xF2, 0xA, 0x10, 0xFF, 0xE9, 0xA, 0x28, 0xFF, 0xF2, 0xA, 0x41, 0xFF, 0xF2, 0xA, 0xC0, 0xFF, 0xF2, 0xA, 0xC2, 0xFF, 0xF2, 0xA, 0xC4, 0xFF, 0xF2, 0xA, 0xC7, 0xFF, 0xE9, 0xA, 0xD6, 0xFF, 0xF2, 0xB, 0xAD, 0xFF, 0xE9, 0xB, 0xAF, 0xFF, 0xE9, 0xB, 0xB1, 0xFF, 0xE9, 0xB, 0xB3, 0xFF, 0xE9, 0xB, 0xCB, 0xFF, 0xF2, 0xC, 0xA2, 0xFF, 0xF2, 0xC, 0xA3, 0xFF, 0xF2, 0x0, 0x4F, 0x0, 0x52, 0xFF, 0xEE, 0x0, 0x53, 0xFF, 0xEE, 0x0, 0x55, 0xFF, 0xEE, 0x0, 0x5D, 0xFF, 0xE4, 0x0, 0xEA, 0xFF, 0xEE, 0x2, 0x28, 0xFF, 0xEE, 0x2, 0x40, 0xFF, 0xEE, 0x2, 0x82, 0xFF, 0xEE, 0x2, 0x83, 0xFF, 0xED, 0x2, 0x84, 0xFF, 0xE4, 0x2, 0x86, 0xFF, 0xEE, 0x2, 0x87, 0xFF, 0xEE, 0x2, 0x89, 0xFF, 0xEE, 0x2, 0x8A, 0xFF, 0xEE, 0x2, 0x8B, 0xFF, 0xEE, 0x2, 0x8C, 0xFF, 0xE9, 0x2, 0x8E, 0xFF, 0xEE, 0x2, 0x90, 0xFF, 0xEE, 0x2, 0x91, 0xFF, 0xEE, 0x2, 0x94, 0xFF, 0xF5, 0x2, 0x96, 0xFF, 0xEE, 0x2, 0x9B, 0xFF, 0xEE, 0x2, 0x9F, 0xFF, 0xF3, 0x2, 0xB6, 0xFF, 0xF0, 0x2, 0xC2, 0xFF, 0xEE, 0x2, 0xCB, 0xFF, 0xE4, 0x2, 0xCD, 0xFF, 0xEE, 0x2, 0xD1, 0xFF, 0xDC, 0x2, 0xD3, 0xFF, 0xEE, 0x2, 0xD5, 0xFF, 0xEE, 0x2, 0xDB, 0xFF, 0xE4, 0x2, 0xEA, 0xFF, 0xEE, 0x2, 0xEC, 0xFF, 0xEE, 0x2, 0xEE, 0xFF, 0xEE, 0x2, 0xF3, 0xFF, 0xEE, 0x2, 0xF5, 0xFF, 0xE4, 0x3, 0x4, 0xFF, 0xE7, 0x3, 0xF, 0xFF, 0xEE, 0x3, 0x13, 0xFF, 0xEE, 0x5, 0xF0, 0xFF, 0xEE, 0x6, 0x0, 0xFF, 0xEE, 0x6, 0x28, 0xFF, 0xEE, 0x6, 0x30, 0xFF, 0xEE, 0x6, 0xAB, 0xFF, 0xEE, 0x6, 0xAC, 0xFF, 0xEE, 0x6, 0xFB, 0xFF, 0xEE, 0x6, 0xFC, 0xFF, 0xEE, 0x6, 0xFD, 0xFF, 0xEE, 0x7, 0x12, 0xFF, 0xEE, 0x8, 0xF8, 0xFF, 0xEE, 0x9, 0x40, 0xFF, 0xEE, 0x9, 0x42, 0xFF, 0xEE, 0x9, 0x44, 0xFF, 0xEE, 0x9, 0x45, 0xFF, 0xEE, 0x9, 0xEF, 0xFF, 0xEE, 0xA, 0x14, 0xFF, 0xEE, 0xA, 0x16, 0xFF, 0xEE, 0xA, 0x19, 0xFF, 0xE4, 0xA, 0x1B, 0xFF, 0xEE, 0xA, 0x20, 0xFF, 0xEE, 0xA, 0x30, 0xFF, 0xEE, 0xA, 0x36, 0xFF, 0xEE, 0xA, 0x45, 0xFF, 0xE4, 0xA, 0x53, 0xFF, 0xE4, 0xA, 0x57, 0xFF, 0xEE, 0xA, 0x59, 0xFF, 0xEE, 0xA, 0x6C, 0xFF, 0xEE, 0xA, 0xCC, 0xFF, 0xEE, 0xA, 0xE7, 0xFF, 0xEE, 0xA, 0xED, 0xFF, 0xEE, 0xB, 0x13, 0xFF, 0xEE, 0xB, 0x84, 0xFF, 0xEE, 0xB, 0x86, 0xFF, 0xEE, 0xB, 0x88, 0xFF, 0xEE, 0xB, 0x8A, 0xFF, 0xEE, 0xB, 0x8C, 0xFF, 0xEE, 0xB, 0x8E, 0xFF, 0xEE, 0xB, 0xC8, 0xFF, 0xE4, 0xB, 0xCA, 0xFF, 0xE4, 0x0, 0x66, 0x0, 0x7, 0xFF, 0xF1, 0x0, 0xC, 0xFF, 0xF1, 0x0, 0x52, 0xFF, 0xFB, 0x0, 0x53, 0xFF, 0xFB, 0x0, 0x55, 0xFF, 0xFB, 0x0, 0x5B, 0xFF, 0xED, 0x0, 0x5E, 0xFF, 0xED, 0x0, 0xEA, 0xFF, 0xFB, 0x2, 0x28, 0xFF, 0xFB, 0x2, 0x3C, 0xFF, 0xED, 0x2, 0x40, 0xFF, 0xFB, 0x2, 0x82, 0xFF, 0xFB, 0x2, 0x86, 0xFF, 0xFB, 0x2, 0x87, 0xFF, 0xFB, 0x2, 0x89, 0xFF, 0xFB, 0x2, 0x8A, 0xFF, 0xFB, 0x2, 0x8B, 0xFF, 0xFB, 0x2, 0x8C, 0xFF, 0xEC, 0x2, 0x8E, 0xFF, 0xFB, 0x2, 0x90, 0xFF, 0xFB, 0x2, 0x91, 0xFF, 0xFB, 0x2, 0x94, 0xFF, 0xF8, 0x2, 0x96, 0xFF, 0xFB, 0x2, 0x9B, 0xFF, 0xFB, 0x2, 0x9F, 0xFF, 0xF4, 0x2, 0xB0, 0xFF, 0xED, 0x2, 0xC2, 0xFF, 0xFB, 0x2, 0xCD, 0xFF, 0xFB, 0x2, 0xD1, 0xFF, 0xE3, 0x2, 0xD3, 0xFF, 0xFB, 0x2, 0xD5, 0xFF, 0xFB, 0x2, 0xEA, 0xFF, 0xFB, 0x2, 0xEC, 0xFF, 0xFB, 0x2, 0xEE, 0xFF, 0xFB, 0x2, 0xF3, 0xFF, 0xFB, 0x3, 0x4, 0xFF, 0xEA, 0x3, 0xF, 0xFF, 0xFB, 0x3, 0x13, 0xFF, 0xFB, 0x4, 0x62, 0xFF, 0xF1, 0x4, 0x63, 0xFF, 0xF1, 0x4, 0x65, 0xFF, 0xF1, 0x4, 0x66, 0xFF, 0xF1, 0x4, 0x67, 0xFF, 0xF1, 0x5, 0x67, 0xFF, 0xED, 0x5, 0xF0, 0xFF, 0xFB, 0x6, 0x0, 0xFF, 0xFB, 0x6, 0x28, 0xFF, 0xFB, 0x6, 0x30, 0xFF, 0xFB, 0x6, 0xAB, 0xFF, 0xFB, 0x6, 0xAC, 0xFF, 0xFB, 0x6, 0xFB, 0xFF, 0xFB, 0x6, 0xFC, 0xFF, 0xFB, 0x6, 0xFD, 0xFF, 0xFB, 0x7, 0x12, 0xFF, 0xFB, 0x8, 0xF8, 0xFF, 0xFB, 0x9, 0x2, 0xFF, 0xED, 0x9, 0x3, 0xFF, 0xED, 0x9, 0x40, 0xFF, 0xFB, 0x9, 0x42, 0xFF, 0xFB, 0x9, 0x44, 0xFF, 0xFB, 0x9, 0x45, 0xFF, 0xFB, 0x9, 0x71, 0xFF, 0xED, 0x9, 0xEF, 0xFF, 0xFB, 0x9, 0xF5, 0xFF, 0xED, 0xA, 0x14, 0xFF, 0xFB, 0xA, 0x16, 0xFF, 0xFB, 0xA, 0x18, 0xFF, 0xED, 0xA, 0x1B, 0xFF, 0xFB, 0xA, 0x20, 0xFF, 0xFB, 0xA, 0x21, 0xFF, 0xED, 0xA, 0x29, 0xFF, 0xED, 0xA, 0x2A, 0xFF, 0xF1, 0xA, 0x2B, 0xFF, 0xF1, 0xA, 0x2E, 0xFF, 0xF1, 0xA, 0x30, 0xFF, 0xFB, 0xA, 0x36, 0xFF, 0xFB, 0xA, 0x3A, 0xFF, 0xED, 0xA, 0x42, 0xFF, 0xED, 0xA, 0x57, 0xFF, 0xFB, 0xA, 0x59, 0xFF, 0xFB, 0xA, 0x64, 0xFF, 0xED, 0xA, 0x66, 0xFF, 0xED, 0xA, 0x68, 0xFF, 0xED, 0xA, 0x6C, 0xFF, 0xFB, 0xA, 0xC1, 0xFF, 0xED, 0xA, 0xC3, 0xFF, 0xED, 0xA, 0xC5, 0xFF, 0xED, 0xA, 0xCC, 0xFF, 0xFB, 0xA, 0xE7, 0xFF, 0xFB, 0xA, 0xED, 0xFF, 0xFB, 0xB, 0x13, 0xFF, 0xFB, 0xB, 0x3B, 0xFF, 0xED, 0xB, 0x84, 0xFF, 0xFB, 0xB, 0x86, 0xFF, 0xFB, 0xB, 0x88, 0xFF, 0xFB, 0xB, 0x8A, 0xFF, 0xFB, 0xB, 0x8C, 0xFF, 0xFB, 0xB, 0x8E, 0xFF, 0xFB, 0xB, 0xC0, 0xFF, 0xED, 0xB, 0xC2, 0xFF, 0xED, 0xB, 0xCC, 0xFF, 0xED, 0xB, 0xD6, 0xFF, 0xED, 0x0, 0x4A, 0x0, 0x52, 0xFF, 0xF4, 0x0, 0x53, 0xFF, 0xF4, 0x0, 0x55, 0xFF, 0xF4, 0x0, 0xEA, 0xFF, 0xF4, 0x2, 0x28, 0xFF, 0xF4, 0x2, 0x40, 0xFF, 0xF4, 0x2, 0x82, 0xFF, 0xF4, 0x2, 0x83, 0x0, 0x1D, 0x2, 0x86, 0xFF, 0xF4, 0x2, 0x87, 0xFF, 0xF4, 0x2, 0x89, 0xFF, 0xF4, 0x2, 0x8A, 0xFF, 0xF4, 0x2, 0x8B, 0xFF, 0xF4, 0x2, 0x8C, 0xFF, 0xE8, 0x2, 0x8E, 0xFF, 0xF4, 0x2, 0x8F, 0xFF, 0xE8, 0x2, 0x90, 0xFF, 0xF4, 0x2, 0x91, 0xFF, 0xF4, 0x2, 0x92, 0xFF, 0xD0, 0x2, 0x94, 0xFF, 0xF4, 0x2, 0x96, 0xFF, 0xF4, 0x2, 0x9B, 0xFF, 0xF4, 0x2, 0xC2, 0xFF, 0xF4, 0x2, 0xCD, 0xFF, 0xF4, 0x2, 0xD1, 0xFF, 0xEC, 0x2, 0xD3, 0xFF, 0xF4, 0x2, 0xD5, 0xFF, 0xF4, 0x2, 0xDF, 0xFF, 0xE8, 0x2, 0xE1, 0xFF, 0xEC, 0x2, 0xEA, 0xFF, 0xF4, 0x2, 0xEC, 0xFF, 0xF4, 0x2, 0xEE, 0xFF, 0xF4, 0x2, 0xF3, 0xFF, 0xF4, 0x3, 0x4, 0xFF, 0xEC, 0x3, 0xF, 0xFF, 0xF4, 0x3, 0x13, 0xFF, 0xF4, 0x5, 0xF0, 0xFF, 0xF4, 0x6, 0x0, 0xFF, 0xF4, 0x6, 0x20, 0xFF, 0xE8, 0x6, 0x28, 0xFF, 0xF4, 0x6, 0x30, 0xFF, 0xF4, 0x6, 0xAB, 0xFF, 0xF4, 0x6, 0xAC, 0xFF, 0xF4, 0x6, 0xFB, 0xFF, 0xF4, 0x6, 0xFC, 0xFF, 0xF4, 0x6, 0xFD, 0xFF, 0xF4, 0x7, 0x12, 0xFF, 0xF4, 0x8, 0xF8, 0xFF, 0xF4, 0x9, 0x40, 0xFF, 0xF4, 0x9, 0x42, 0xFF, 0xF4, 0x9, 0x44, 0xFF, 0xF4, 0x9, 0x45, 0xFF, 0xF4, 0x9, 0xEF, 0xFF, 0xF4, 0xA, 0x14, 0xFF, 0xF4, 0xA, 0x16, 0xFF, 0xF4, 0xA, 0x1B, 0xFF, 0xF4, 0xA, 0x20, 0xFF, 0xF4, 0xA, 0x30, 0xFF, 0xF4, 0xA, 0x36, 0xFF, 0xF4, 0xA, 0x57, 0xFF, 0xF4, 0xA, 0x59, 0xFF, 0xF4, 0xA, 0x6A, 0xFF, 0xE8, 0xA, 0x6C, 0xFF, 0xF4, 0xA, 0xCA, 0xFF, 0xE8, 0xA, 0xCC, 0xFF, 0xF4, 0xA, 0xE7, 0xFF, 0xF4, 0xA, 0xED, 0xFF, 0xF4, 0xB, 0x13, 0xFF, 0xF4, 0xB, 0x84, 0xFF, 0xF4, 0xB, 0x86, 0xFF, 0xF4, 0xB, 0x88, 0xFF, 0xF4, 0xB, 0x8A, 0xFF, 0xF4, 0xB, 0x8C, 0xFF, 0xF4, 0xB, 0x8E, 0xFF, 0xF4, 0x0, 0xA, 0x0, 0x7, 0xFF, 0xF1, 0x0, 0xC, 0xFF, 0xF1, 0x4, 0x62, 0xFF, 0xF1, 0x4, 0x63, 0xFF, 0xF1, 0x4, 0x65, 0xFF, 0xF1, 0x4, 0x66, 0xFF, 0xF1, 0x4, 0x67, 0xFF, 0xF1, 0xA, 0x2A, 0xFF, 0xF1, 0xA, 0x2B, 0xFF, 0xF1, 0xA, 0x2E, 0xFF, 0xF1, 0x0, 0xCA, 0x0, 0x48, 0xFF, 0xEF, 0x0, 0x49, 0xFF, 0xEF, 0x0, 0x4A, 0xFF, 0xEF, 0x0, 0x4C, 0xFF, 0xEF, 0x0, 0x54, 0xFF, 0xD2, 0x0, 0x56, 0xFF, 0xEF, 0x0, 0x95, 0xFF, 0xEF, 0x0, 0x9F, 0xFF, 0xEF, 0x0, 0xB5, 0xFF, 0xEF, 0x0, 0xDA, 0xFF, 0xEF, 0x0, 0xDC, 0xFF, 0xEF, 0x0, 0xE4, 0xFF, 0xEF, 0x1, 0x0, 0xFF, 0xEF, 0x2, 0x2A, 0xFF, 0xEF, 0x2, 0x3A, 0xFF, 0xEF, 0x2, 0x47, 0xFF, 0xEF, 0x2, 0x48, 0xFF, 0xEF, 0x2, 0x56, 0xFF, 0xD2, 0x2, 0x58, 0xFF, 0xEF, 0x2, 0x61, 0xFF, 0xEF, 0x2, 0x8D, 0xFF, 0xEF, 0x2, 0x99, 0xFF, 0xEF, 0x2, 0xAE, 0xFF, 0xD2, 0x2, 0xB2, 0xFF, 0xE9, 0x2, 0xB4, 0xFF, 0xEF, 0x2, 0xB8, 0xFF, 0xEF, 0x2, 0xD9, 0xFF, 0xEF, 0x2, 0xF7, 0xFF, 0xEF, 0x2, 0xF8, 0xFF, 0xEF, 0x3, 0x2, 0xFF, 0xEF, 0x5, 0x6E, 0xFF, 0xEF, 0x5, 0x70, 0xFF, 0xD2, 0x5, 0xEE, 0xFF, 0xD2, 0x6, 0x2, 0xFF, 0xD2, 0x6, 0x4, 0xFF, 0xD2, 0x6, 0x6, 0xFF, 0xD2, 0x6, 0x32, 0xFF, 0xD2, 0x6, 0x85, 0xFF, 0xD2, 0x6, 0x87, 0xFF, 0xD2, 0x6, 0x8F, 0xFF, 0xEF, 0x6, 0x91, 0xFF, 0xEF, 0x6, 0xA9, 0xFF, 0xEF, 0x6, 0xCB, 0xFF, 0xEF, 0x6, 0xF7, 0xFF, 0xEF, 0x7, 0x57, 0xFF, 0xE9, 0x7, 0x59, 0xFF, 0xE9, 0x7, 0x61, 0xFF, 0xE7, 0x7, 0x68, 0xFF, 0xE9, 0x7, 0x71, 0xFF, 0xE9, 0x7, 0x8D, 0xFF, 0xE9, 0x7, 0x96, 0xFF, 0xE9, 0x7, 0xAF, 0xFF, 0xE9, 0x8, 0xEF, 0xFF, 0xEF, 0x8, 0xF0, 0xFF, 0xEF, 0x8, 0xF1, 0xFF, 0xEF, 0x8, 0xF2, 0xFF, 0xEF, 0x8, 0xF3, 0xFF, 0xEF, 0x8, 0xF9, 0xFF, 0xD2, 0x8, 0xFA, 0xFF, 0xD2, 0x8, 0xFB, 0xFF, 0xD2, 0x8, 0xFC, 0xFF, 0xD2, 0x8, 0xFD, 0xFF, 0xD2, 0x9, 0xB, 0xFF, 0xEF, 0x9, 0xD, 0xFF, 0xEF, 0x9, 0xF, 0xFF, 0xEF, 0x9, 0x11, 0xFF, 0xEF, 0x9, 0x13, 0xFF, 0xEF, 0x9, 0x15, 0xFF, 0xEF, 0x9, 0x17, 0xFF, 0xEF, 0x9, 0x19, 0xFF, 0xEF, 0x9, 0x1B, 0xFF, 0xEF, 0x9, 0x1D, 0xFF, 0xEF, 0x9, 0x1F, 0xFF, 0xEF, 0x9, 0x21, 0xFF, 0xEF, 0x9, 0x23, 0xFF, 0xEF, 0x9, 0x25, 0xFF, 0xEF, 0x9, 0x47, 0xFF, 0xD2, 0x9, 0x49, 0xFF, 0xD2, 0x9, 0x4B, 0xFF, 0xD2, 0x9, 0x87, 0xFF, 0xE9, 0x9, 0x91, 0xFF, 0xE9, 0x9, 0x92, 0xFF, 0xE9, 0x9, 0x93, 0xFF, 0xE9, 0x9, 0x94, 0xFF, 0xE9, 0x9, 0x95, 0xFF, 0xE9, 0x9, 0x9E, 0xFF, 0xE9, 0x9, 0x9F, 0xFF, 0xE9, 0x9, 0xA0, 0xFF, 0xE9, 0x9, 0xA1, 0xFF, 0xE9, 0x9, 0xA8, 0xFF, 0xE9, 0x9, 0xA9, 0xFF, 0xE9, 0x9, 0xAA, 0xFF, 0xE9, 0x9, 0xAB, 0xFF, 0xE9, 0x9, 0xBB, 0xFF, 0xE9, 0x9, 0xBC, 0xFF, 0xE9, 0x9, 0xBD, 0xFF, 0xE9, 0x9, 0xBE, 0xFF, 0xE9, 0x9, 0xED, 0xFF, 0xEF, 0x9, 0xF3, 0xFF, 0xD2, 0x9, 0xF9, 0xFF, 0xD2, 0xA, 0x13, 0xFF, 0xEF, 0xA, 0x15, 0xFF, 0xD2, 0xA, 0x17, 0xFF, 0xEF, 0xA, 0x1A, 0xFF, 0xEF, 0xA, 0x35, 0xFF, 0xEF, 0xA, 0x3B, 0xFF, 0xEF, 0xA, 0x40, 0xFF, 0xEF, 0xA, 0x4E, 0xFF, 0xEF, 0xA, 0x50, 0xFF, 0xEF, 0xA, 0x51, 0xFF, 0xEF, 0xA, 0x5B, 0xFF, 0xD2, 0xA, 0x5D, 0xFF, 0xEF, 0xA, 0x60, 0xFF, 0xD2, 0xA, 0x6D, 0xFF, 0xEF, 0xA, 0x87, 0xFF, 0xEF, 0xA, 0x89, 0xFF, 0xEF, 0xA, 0x8B, 0xFF, 0xEF, 0xA, 0x8D, 0xFF, 0xEF, 0xA, 0x8F, 0xFF, 0xEF, 0xA, 0x91, 0xFF, 0xEF, 0xA, 0x93, 0xFF, 0xEF, 0xA, 0x95, 0xFF, 0xEF, 0xA, 0x9B, 0xFF, 0xD2, 0xA, 0x9D, 0xFF, 0xD2, 0xA, 0x9F, 0xFF, 0xD2, 0xA, 0xA1, 0xFF, 0xD2, 0xA, 0xA3, 0xFF, 0xD2, 0xA, 0xA5, 0xFF, 0xD2, 0xA, 0xA7, 0xFF, 0xD2, 0xA, 0xA9, 0xFF, 0xEF, 0xA, 0xAB, 0xFF, 0xEF, 0xA, 0xAD, 0xFF, 0xEF, 0xA, 0xAF, 0xFF, 0xD2, 0xA, 0xB1, 0xFF, 0xEF, 0xA, 0xF3, 0xFF, 0xD2, 0xA, 0xFE, 0xFF, 0xEF, 0xB, 0x6, 0xFF, 0xEF, 0xB, 0xA, 0xFF, 0xD2, 0xB, 0xC, 0xFF, 0xD2, 0xB, 0xF, 0xFF, 0xEF, 0xB, 0x19, 0xFF, 0xEF, 0xB, 0x1B, 0xFF, 0xEF, 0xB, 0x21, 0xFF, 0xD2, 0xB, 0x23, 0xFF, 0xD2, 0xB, 0x33, 0xFF, 0xD2, 0xB, 0x35, 0xFF, 0xD2, 0xB, 0x37, 0xFF, 0xD2, 0xB, 0x39, 0xFF, 0xD2, 0xB, 0x3C, 0xFF, 0xD2, 0xB, 0x42, 0xFF, 0xEF, 0xB, 0x4A, 0xFF, 0xEF, 0xB, 0x54, 0xFF, 0xEF, 0xB, 0x56, 0xFF, 0xEF, 0xB, 0x58, 0xFF, 0xEF, 0xB, 0x5A, 0xFF, 0xEF, 0xB, 0x5C, 0xFF, 0xEF, 0xB, 0x5E, 0xFF, 0xEF, 0xB, 0x60, 0xFF, 0xEF, 0xB, 0x62, 0xFF, 0xEF, 0xB, 0x64, 0xFF, 0xEF, 0xB, 0x66, 0xFF, 0xEF, 0xB, 0x68, 0xFF, 0xEF, 0xB, 0x6C, 0xFF, 0xEF, 0xB, 0x90, 0xFF, 0xD2, 0xB, 0x92, 0xFF, 0xD2, 0xB, 0x94, 0xFF, 0xD2, 0xB, 0x96, 0xFF, 0xD2, 0xB, 0xD8, 0xFF, 0xEF, 0xB, 0xD9, 0xFF, 0xEF, 0xB, 0xDA, 0xFF, 0xEF, 0xB, 0xDB, 0xFF, 0xEF, 0xB, 0xDC, 0xFF, 0xEF, 0xB, 0xDD, 0xFF, 0xEF, 0xB, 0xDE, 0xFF, 0xEF, 0xB, 0xDF, 0xFF, 0xEF, 0xC, 0x14, 0xFF, 0xD2, 0xC, 0x15, 0xFF, 0xD2, 0xC, 0x16, 0xFF, 0xD2, 0xC, 0x17, 0xFF, 0xD2, 0xC, 0x18, 0xFF, 0xD2, 0xC, 0x19, 0xFF, 0xD2, 0xC, 0x44, 0xFF, 0xD2, 0xC, 0x45, 0xFF, 0xD2, 0xC, 0x4A, 0xFF, 0xEF, 0xC, 0x4B, 0xFF, 0xEF, 0xC, 0x4C, 0xFF, 0xEF, 0xC, 0x4D, 0xFF, 0xEF, 0xC, 0x4E, 0xFF, 0xEF, 0xC, 0x4F, 0xFF, 0xEF, 0xC, 0x50, 0xFF, 0xEF, 0xC, 0x51, 0xFF, 0xEF, 0xC, 0x7A, 0xFF, 0xEF, 0xC, 0x7B, 0xFF, 0xEF, 0xC, 0x7C, 0xFF, 0xEF, 0xC, 0x7D, 0xFF, 0xEF, 0xC, 0x7E, 0xFF, 0xEF, 0xC, 0x7F, 0xFF, 0xEF, 0xC, 0x80, 0xFF, 0xEF, 0xC, 0xBB, 0xFF, 0xE9, 0xC, 0xDD, 0xFF, 0xE9, 0xC, 0xE0, 0xFF, 0xE9, 0xC, 0xE5, 0xFF, 0xE9, 0x1, 0x4B, 0x0, 0x7, 0x0, 0xE, 0x0, 0xC, 0x0, 0xE, 0x0, 0x46, 0xFF, 0xEF, 0x0, 0x48, 0xFF, 0xC8, 0x0, 0x49, 0xFF, 0xC8, 0x0, 0x4A, 0xFF, 0xC8, 0x0, 0x4B, 0x0, 0xE, 0x0, 0x4C, 0xFF, 0xC8, 0x0, 0x54, 0xFF, 0xE3, 0x0, 0x56, 0xFF, 0xC8, 0x0, 0x5B, 0x0, 0xC, 0x0, 0x5E, 0x0, 0xC, 0x0, 0x95, 0xFF, 0xC8, 0x0, 0x9F, 0xFF, 0xC8, 0x0, 0xB5, 0xFF, 0xC8, 0x0, 0xDA, 0xFF, 0xC8, 0x0, 0xDC, 0xFF, 0xC8, 0x0, 0xE4, 0xFF, 0xC8, 0x1, 0x0, 0xFF, 0xC8, 0x2, 0x2A, 0xFF, 0xC8, 0x2, 0x3A, 0xFF, 0xC8, 0x2, 0x3C, 0x0, 0xC, 0x2, 0x3D, 0xFF, 0xEA, 0x2, 0x46, 0xFF, 0xDA, 0x2, 0x47, 0xFF, 0xCB, 0x2, 0x48, 0xFF, 0xC8, 0x2, 0x4B, 0xFF, 0xE1, 0x2, 0x56, 0xFF, 0xE3, 0x2, 0x58, 0xFF, 0xC8, 0x2, 0x61, 0xFF, 0xC8, 0x2, 0x83, 0xFF, 0xC3, 0x2, 0x88, 0xFF, 0xD3, 0x2, 0x8D, 0xFF, 0xC8, 0x2, 0x99, 0xFF, 0xC8, 0x2, 0x9A, 0xFF, 0xD3, 0x2, 0xAE, 0xFF, 0xE3, 0x2, 0xB0, 0x0, 0xC, 0x2, 0xB2, 0xFF, 0xEA, 0x2, 0xB4, 0xFF, 0xC8, 0x2, 0xB6, 0x0, 0xD, 0x2, 0xB8, 0xFF, 0xC8, 0x2, 0xD9, 0xFF, 0xC8, 0x2, 0xE8, 0xFF, 0xD3, 0x2, 0xF7, 0xFF, 0xC8, 0x2, 0xF8, 0xFF, 0xC8, 0x2, 0xFA, 0x0, 0xC, 0x2, 0xFC, 0x0, 0xC, 0x3, 0x2, 0xFF, 0xC8, 0x3, 0x7, 0xFF, 0xD3, 0x3, 0x9, 0xFF, 0xD3, 0x3, 0x11, 0xFF, 0xD3, 0x4, 0x62, 0x0, 0xE, 0x4, 0x63, 0x0, 0xE, 0x4, 0x65, 0x0, 0xE, 0x4, 0x66, 0x0, 0xE, 0x4, 0x67, 0x0, 0xE, 0x5, 0x5B, 0xFF, 0xEF, 0x5, 0x67, 0x0, 0xC, 0x5, 0x6E, 0xFF, 0xC8, 0x5, 0x70, 0xFF, 0xE3, 0x5, 0xEE, 0xFF, 0xE3, 0x6, 0x2, 0xFF, 0xE3, 0x6, 0x4, 0xFF, 0xE3, 0x6, 0x6, 0xFF, 0xE3, 0x6, 0x32, 0xFF, 0xE3, 0x6, 0x6B, 0xFF, 0xEF, 0x6, 0x6D, 0xFF, 0xEF, 0x6, 0x6F, 0xFF, 0xEF, 0x6, 0x71, 0xFF, 0xEF, 0x6, 0x73, 0xFF, 0xEF, 0x6, 0x75, 0xFF, 0xEF, 0x6, 0x85, 0xFF, 0xE3, 0x6, 0x87, 0xFF, 0xE3, 0x6, 0x8F, 0xFF, 0xC8, 0x6, 0x91, 0xFF, 0xC8, 0x6, 0xA9, 0xFF, 0xC8, 0x6, 0xCB, 0xFF, 0xC8, 0x6, 0xF7, 0xFF, 0xC8, 0x7, 0x4F, 0x0, 0x8, 0x7, 0x52, 0x0, 0x8, 0x7, 0x54, 0x0, 0x9, 0x7, 0x55, 0xFF, 0xF9, 0x7, 0x57, 0xFF, 0xF3, 0x7, 0x59, 0xFF, 0xF4, 0x7, 0x61, 0xFF, 0xF3, 0x7, 0x67, 0xFF, 0xD6, 0x7, 0x68, 0xFF, 0xF4, 0x7, 0x69, 0xFF, 0xD6, 0x7, 0x70, 0x0, 0x9, 0x7, 0x71, 0xFF, 0xF4, 0x7, 0x74, 0x0, 0x9, 0x7, 0x8C, 0x0, 0x9, 0x7, 0x8D, 0xFF, 0xF4, 0x7, 0x8E, 0x0, 0x8, 0x7, 0x90, 0x0, 0x9, 0x7, 0x96, 0xFF, 0xF4, 0x7, 0xAF, 0xFF, 0xF4, 0x7, 0xB1, 0xFF, 0xD6, 0x8, 0xE8, 0xFF, 0xEF, 0x8, 0xE9, 0xFF, 0xEF, 0x8, 0xEA, 0xFF, 0xEF, 0x8, 0xEB, 0xFF, 0xEF, 0x8, 0xEC, 0xFF, 0xEF, 0x8, 0xED, 0xFF, 0xEF, 0x8, 0xEE, 0xFF, 0xEF, 0x8, 0xEF, 0xFF, 0xC8, 0x8, 0xF0, 0xFF, 0xC8, 0x8, 0xF1, 0xFF, 0xC8, 0x8, 0xF2, 0xFF, 0xC8, 0x8, 0xF3, 0xFF, 0xC8, 0x8, 0xF9, 0xFF, 0xE3, 0x8, 0xFA, 0xFF, 0xE3, 0x8, 0xFB, 0xFF, 0xE3, 0x8, 0xFC, 0xFF, 0xE3, 0x8, 0xFD, 0xFF, 0xE3, 0x9, 0x2, 0x0, 0xC, 0x9, 0x3, 0x0, 0xC, 0x9, 0x5, 0xFF, 0xEF, 0x9, 0x7, 0xFF, 0xEF, 0x9, 0x9, 0xFF, 0xEF, 0x9, 0xB, 0xFF, 0xC8, 0x9, 0xD, 0xFF, 0xC8, 0x9, 0xF, 0xFF, 0xC8, 0x9, 0x11, 0xFF, 0xC8, 0x9, 0x13, 0xFF, 0xC8, 0x9, 0x15, 0xFF, 0xC8, 0x9, 0x17, 0xFF, 0xC8, 0x9, 0x19, 0xFF, 0xC8, 0x9, 0x1B, 0xFF, 0xC8, 0x9, 0x1D, 0xFF, 0xC8, 0x9, 0x1F, 0xFF, 0xC8, 0x9, 0x21, 0xFF, 0xC8, 0x9, 0x23, 0xFF, 0xC8, 0x9, 0x25, 0xFF, 0xC8, 0x9, 0x47, 0xFF, 0xE3, 0x9, 0x49, 0xFF, 0xE3, 0x9, 0x4B, 0xFF, 0xE3, 0x9, 0x71, 0x0, 0xC, 0x9, 0x80, 0xFF, 0xD6, 0x9, 0x81, 0xFF, 0xD6, 0x9, 0x82, 0xFF, 0xD6, 0x9, 0x83, 0xFF, 0xD6, 0x9, 0x84, 0xFF, 0xD6, 0x9, 0x85, 0xFF, 0xD6, 0x9, 0x86, 0xFF, 0xD6, 0x9, 0x87, 0xFF, 0xF4, 0x9, 0x91, 0xFF, 0xF4, 0x9, 0x92, 0xFF, 0xF4, 0x9, 0x93, 0xFF, 0xF4, 0x9, 0x94, 0xFF, 0xF4, 0x9, 0x95, 0xFF, 0xF4, 0x9, 0x9A, 0x0, 0x8, 0x9, 0x9B, 0xFF, 0xD6, 0x9, 0x9C, 0xFF, 0xD6, 0x9, 0x9D, 0xFF, 0xD6, 0x9, 0x9E, 0xFF, 0xF4, 0x9, 0x9F, 0xFF, 0xF4, 0x9, 0xA0, 0xFF, 0xF4, 0x9, 0xA1, 0xFF, 0xF4, 0x9, 0xA8, 0xFF, 0xF4, 0x9, 0xA9, 0xFF, 0xF4, 0x9, 0xAA, 0xFF, 0xF4, 0x9, 0xAB, 0xFF, 0xF4, 0x9, 0xBB, 0xFF, 0xF4, 0x9, 0xBC, 0xFF, 0xF4, 0x9, 0xBD, 0xFF, 0xF4, 0x9, 0xBE, 0xFF, 0xF4, 0x9, 0xC2, 0xFF, 0xF9, 0x9, 0xC3, 0xFF, 0xF9, 0x9, 0xC4, 0xFF, 0xF9, 0x9, 0xC5, 0xFF, 0xF9, 0x9, 0xC7, 0x0, 0x9, 0x9, 0xD0, 0x0, 0x8, 0x9, 0xD1, 0x0, 0x8, 0x9, 0xED, 0xFF, 0xC8, 0x9, 0xF3, 0xFF, 0xE3, 0x9, 0xF5, 0x0, 0xC, 0x9, 0xF9, 0xFF, 0xE3, 0xA, 0x12, 0xFF, 0xEF, 0xA, 0x13, 0xFF, 0xC8, 0xA, 0x15, 0xFF, 0xE3, 0xA, 0x17, 0xFF, 0xC8, 0xA, 0x18, 0x0, 0xC, 0xA, 0x1A, 0xFF, 0xC8, 0xA, 0x21, 0x0, 0xC, 0xA, 0x29, 0x0, 0xC, 0xA, 0x2A, 0x0, 0xE, 0xA, 0x2B, 0x0, 0xE, 0xA, 0x2E, 0x0, 0xE, 0xA, 0x32, 0xFF, 0xEF, 0xA, 0x35, 0xFF, 0xC8, 0xA, 0x3A, 0x0, 0xC, 0xA, 0x3B, 0xFF, 0xC8, 0xA, 0x40, 0xFF, 0xC8, 0xA, 0x42, 0x0, 0xC, 0xA, 0x48, 0xFF, 0xEF, 0xA, 0x4A, 0xFF, 0xEF, 0xA, 0x4E, 0xFF, 0xC8, 0xA, 0x50, 0xFF, 0xC8, 0xA, 0x51, 0xFF, 0xC8, 0xA, 0x5B, 0xFF, 0xE3, 0xA, 0x5D, 0xFF, 0xC8, 0xA, 0x60, 0xFF, 0xE3, 0xA, 0x64, 0x0, 0xC, 0xA, 0x66, 0x0, 0xC, 0xA, 0x68, 0x0, 0xC, 0xA, 0x6D, 0xFF, 0xC8, 0xA, 0x6F, 0xFF, 0xEF, 0xA, 0x71, 0xFF, 0xEF, 0xA, 0x73, 0xFF, 0xEF, 0xA, 0x75, 0xFF, 0xEF, 0xA, 0x77, 0xFF, 0xEF, 0xA, 0x79, 0xFF, 0xEF, 0xA, 0x7B, 0xFF, 0xEF, 0xA, 0x7D, 0xFF, 0xEF, 0xA, 0x7F, 0xFF, 0xEF, 0xA, 0x81, 0xFF, 0xEF, 0xA, 0x83, 0xFF, 0xEF, 0xA, 0x85, 0xFF, 0xEF, 0xA, 0x87, 0xFF, 0xC8, 0xA, 0x89, 0xFF, 0xC8, 0xA, 0x8B, 0xFF, 0xC8, 0xA, 0x8D, 0xFF, 0xC8, 0xA, 0x8F, 0xFF, 0xC8, 0xA, 0x91, 0xFF, 0xC8, 0xA, 0x93, 0xFF, 0xC8, 0xA, 0x95, 0xFF, 0xC8, 0xA, 0x9B, 0xFF, 0xE3, 0xA, 0x9D, 0xFF, 0xE3, 0xA, 0x9F, 0xFF, 0xE3, 0xA, 0xA1, 0xFF, 0xE3, 0xA, 0xA3, 0xFF, 0xE3, 0xA, 0xA5, 0xFF, 0xE3, 0xA, 0xA7, 0xFF, 0xE3, 0xA, 0xA9, 0xFF, 0xC8, 0xA, 0xAB, 0xFF, 0xC8, 0xA, 0xAD, 0xFF, 0xC8, 0xA, 0xAF, 0xFF, 0xE3, 0xA, 0xB1, 0xFF, 0xC8, 0xA, 0xC1, 0x0, 0xC, 0xA, 0xC3, 0x0, 0xC, 0xA, 0xC5, 0x0, 0xC, 0xA, 0xEF, 0xFF, 0xEF, 0xA, 0xF3, 0xFF, 0xE3, 0xA, 0xFE, 0xFF, 0xC8, 0xB, 0x0, 0xFF, 0xEF, 0xB, 0x2, 0xFF, 0xEF, 0xB, 0x4, 0xFF, 0xEF, 0xB, 0x6, 0xFF, 0xC8, 0xB, 0xA, 0xFF, 0xE3, 0xB, 0xC, 0xFF, 0xE3, 0xB, 0xF, 0xFF, 0xC8, 0xB, 0x15, 0xFF, 0xEF, 0xB, 0x17, 0xFF, 0xEF, 0xB, 0x19, 0xFF, 0xC8, 0xB, 0x1B, 0xFF, 0xC8, 0xB, 0x21, 0xFF, 0xE3, 0xB, 0x23, 0xFF, 0xE3, 0xB, 0x2F, 0xFF, 0xEF, 0xB, 0x33, 0xFF, 0xE3, 0xB, 0x35, 0xFF, 0xE3, 0xB, 0x37, 0xFF, 0xE3, 0xB, 0x39, 0xFF, 0xE3, 0xB, 0x3B, 0x0, 0xC, 0xB, 0x3C, 0xFF, 0xE3, 0xB, 0x42, 0xFF, 0xC8, 0xB, 0x4A, 0xFF, 0xC8, 0xB, 0x54, 0xFF, 0xC8, 0xB, 0x56, 0xFF, 0xC8, 0xB, 0x58, 0xFF, 0xC8, 0xB, 0x5A, 0xFF, 0xC8, 0xB, 0x5C, 0xFF, 0xC8, 0xB, 0x5E, 0xFF, 0xC8, 0xB, 0x60, 0xFF, 0xC8, 0xB, 0x62, 0xFF, 0xC8, 0xB, 0x64, 0xFF, 0xC8, 0xB, 0x66, 0xFF, 0xC8, 0xB, 0x68, 0xFF, 0xC8, 0xB, 0x6C, 0xFF, 0xC8, 0xB, 0x90, 0xFF, 0xE3, 0xB, 0x92, 0xFF, 0xE3, 0xB, 0x94, 0xFF, 0xE3, 0xB, 0x96, 0xFF, 0xE3, 0xB, 0xC0, 0x0, 0xC, 0xB, 0xC2, 0x0, 0xC, 0xB, 0xCC, 0x0, 0xC, 0xB, 0xD6, 0x0, 0xC, 0xB, 0xD7, 0xFF, 0xEF, 0xB, 0xD8, 0xFF, 0xC8, 0xB, 0xD9, 0xFF, 0xC8, 0xB, 0xDA, 0xFF, 0xC8, 0xB, 0xDB, 0xFF, 0xC8, 0xB, 0xDC, 0xFF, 0xC8, 0xB, 0xDD, 0xFF, 0xC8, 0xB, 0xDE, 0xFF, 0xC8, 0xB, 0xDF, 0xFF, 0xC8, 0xC, 0x14, 0xFF, 0xE3, 0xC, 0x15, 0xFF, 0xE3, 0xC, 0x16, 0xFF, 0xE3, 0xC, 0x17, 0xFF, 0xE3, 0xC, 0x18, 0xFF, 0xE3, 0xC, 0x19, 0xFF, 0xE3, 0xC, 0x44, 0xFF, 0xE3, 0xC, 0x45, 0xFF, 0xE3, 0xC, 0x4A, 0xFF, 0xC8, 0xC, 0x4B, 0xFF, 0xC8, 0xC, 0x4C, 0xFF, 0xC8, 0xC, 0x4D, 0xFF, 0xC8, 0xC, 0x4E, 0xFF, 0xC8, 0xC, 0x4F, 0xFF, 0xC8, 0xC, 0x50, 0xFF, 0xC8, 0xC, 0x51, 0xFF, 0xC8, 0xC, 0x7A, 0xFF, 0xC8, 0xC, 0x7B, 0xFF, 0xC8, 0xC, 0x7C, 0xFF, 0xC8, 0xC, 0x7D, 0xFF, 0xC8, 0xC, 0x7E, 0xFF, 0xC8, 0xC, 0x7F, 0xFF, 0xC8, 0xC, 0x80, 0xFF, 0xC8, 0xC, 0xB7, 0xFF, 0xD6, 0xC, 0xBB, 0xFF, 0xF4, 0xC, 0xBC, 0x0, 0x8, 0xC, 0xBE, 0xFF, 0xD6, 0xC, 0xCA, 0x0, 0x8, 0xC, 0xCD, 0x0, 0x8, 0xC, 0xD6, 0xFF, 0xD6, 0xC, 0xDD, 0xFF, 0xF4, 0xC, 0xE0, 0xFF, 0xF4, 0xC, 0xE1, 0x0, 0x9, 0xC, 0xE5, 0xFF, 0xF4, 0xC, 0xE6, 0x0, 0x8, 0x0, 0x12, 0x2, 0x83, 0x0, 0x16, 0x2, 0x88, 0x0, 0x11, 0x2, 0x8C, 0xFF, 0xEF, 0x2, 0x8F, 0xFF, 0xEF, 0x2, 0x94, 0xFF, 0xF6, 0x2, 0x97, 0x0, 0x14, 0x2, 0x9A, 0x0, 0x11, 0x2, 0xD1, 0xFF, 0xE8, 0x2, 0xDF, 0xFF, 0xEF, 0x2, 0xE1, 0xFF, 0xE2, 0x2, 0xE8, 0x0, 0x11, 0x3, 0x4, 0xFF, 0xEF, 0x3, 0x7, 0x0, 0x11, 0x3, 0x9, 0x0, 0x11, 0x3, 0x11, 0x0, 0x11, 0x6, 0x20, 0xFF, 0xEF, 0xA, 0x6A, 0xFF, 0xEF, 0xA, 0xCA, 0xFF, 0xEF, 0x0, 0x87, 0x0, 0x48, 0xFF, 0xED, 0x0, 0x49, 0xFF, 0xED, 0x0, 0x4A, 0xFF, 0xED, 0x0, 0x4C, 0xFF, 0xED, 0x0, 0x56, 0xFF, 0xED, 0x0, 0x95, 0xFF, 0xED, 0x0, 0x9F, 0xFF, 0xED, 0x0, 0xB5, 0xFF, 0xED, 0x0, 0xDA, 0xFF, 0xED, 0x0, 0xDC, 0xFF, 0xED, 0x0, 0xE4, 0xFF, 0xED, 0x1, 0x0, 0xFF, 0xED, 0x2, 0x2A, 0xFF, 0xED, 0x2, 0x3A, 0xFF, 0xED, 0x2, 0x47, 0xFF, 0xED, 0x2, 0x48, 0xFF, 0xED, 0x2, 0x58, 0xFF, 0xED, 0x2, 0x61, 0xFF, 0xED, 0x2, 0x83, 0x0, 0x13, 0x2, 0x88, 0x0, 0xF, 0x2, 0x8C, 0xFF, 0xE1, 0x2, 0x8D, 0xFF, 0xED, 0x2, 0x8F, 0xFF, 0xE1, 0x2, 0x92, 0xFF, 0xD1, 0x2, 0x94, 0xFF, 0xED, 0x2, 0x99, 0xFF, 0xED, 0x2, 0x9A, 0x0, 0xF, 0x2, 0xB4, 0xFF, 0xED, 0x2, 0xB8, 0xFF, 0xED, 0x2, 0xD1, 0xFF, 0x9F, 0x2, 0xD9, 0xFF, 0xED, 0x2, 0xDF, 0xFF, 0xE1, 0x2, 0xE1, 0xFF, 0xDA, 0x2, 0xE8, 0x0, 0xF, 0x2, 0xF7, 0xFF, 0xED, 0x2, 0xF8, 0xFF, 0xED, 0x3, 0x2, 0xFF, 0xED, 0x3, 0x4, 0xFF, 0xE1, 0x3, 0x7, 0x0, 0xF, 0x3, 0x9, 0x0, 0xF, 0x3, 0x11, 0x0, 0xF, 0x5, 0x6E, 0xFF, 0xED, 0x6, 0x20, 0xFF, 0xE1, 0x6, 0x8F, 0xFF, 0xED, 0x6, 0x91, 0xFF, 0xED, 0x6, 0xA9, 0xFF, 0xED, 0x6, 0xCB, 0xFF, 0xED, 0x6, 0xF7, 0xFF, 0xED, 0x8, 0xEF, 0xFF, 0xED, 0x8, 0xF0, 0xFF, 0xED, 0x8, 0xF1, 0xFF, 0xED, 0x8, 0xF2, 0xFF, 0xED, 0x8, 0xF3, 0xFF, 0xED, 0x9, 0xB, 0xFF, 0xED, 0x9, 0xD, 0xFF, 0xED, 0x9, 0xF, 0xFF, 0xED, 0x9, 0x11, 0xFF, 0xED, 0x9, 0x13, 0xFF, 0xED, 0x9, 0x15, 0xFF, 0xED, 0x9, 0x17, 0xFF, 0xED, 0x9, 0x19, 0xFF, 0xED, 0x9, 0x1B, 0xFF, 0xED, 0x9, 0x1D, 0xFF, 0xED, 0x9, 0x1F, 0xFF, 0xED, 0x9, 0x21, 0xFF, 0xED, 0x9, 0x23, 0xFF, 0xED, 0x9, 0x25, 0xFF, 0xED, 0x9, 0xED, 0xFF, 0xED, 0xA, 0x13, 0xFF, 0xED, 0xA, 0x17, 0xFF, 0xED, 0xA, 0x1A, 0xFF, 0xED, 0xA, 0x35, 0xFF, 0xED, 0xA, 0x3B, 0xFF, 0xED, 0xA, 0x40, 0xFF, 0xED, 0xA, 0x4E, 0xFF, 0xED, 0xA, 0x50, 0xFF, 0xED, 0xA, 0x51, 0xFF, 0xED, 0xA, 0x5D, 0xFF, 0xED, 0xA, 0x6A, 0xFF, 0xE1, 0xA, 0x6D, 0xFF, 0xED, 0xA, 0x87, 0xFF, 0xED, 0xA, 0x89, 0xFF, 0xED, 0xA, 0x8B, 0xFF, 0xED, 0xA, 0x8D, 0xFF, 0xED, 0xA, 0x8F, 0xFF, 0xED, 0xA, 0x91, 0xFF, 0xED, 0xA, 0x93, 0xFF, 0xED, 0xA, 0x95, 0xFF, 0xED, 0xA, 0xA9, 0xFF, 0xED, 0xA, 0xAB, 0xFF, 0xED, 0xA, 0xAD, 0xFF, 0xED, 0xA, 0xB1, 0xFF, 0xED, 0xA, 0xCA, 0xFF, 0xE1, 0xA, 0xFE, 0xFF, 0xED, 0xB, 0x6, 0xFF, 0xED, 0xB, 0xF, 0xFF, 0xED, 0xB, 0x19, 0xFF, 0xED, 0xB, 0x1B, 0xFF, 0xED, 0xB, 0x42, 0xFF, 0xED, 0xB, 0x4A, 0xFF, 0xED, 0xB, 0x54, 0xFF, 0xED, 0xB, 0x56, 0xFF, 0xED, 0xB, 0x58, 0xFF, 0xED, 0xB, 0x5A, 0xFF, 0xED, 0xB, 0x5C, 0xFF, 0xED, 0xB, 0x5E, 0xFF, 0xED, 0xB, 0x60, 0xFF, 0xED, 0xB, 0x62, 0xFF, 0xED, 0xB, 0x64, 0xFF, 0xED, 0xB, 0x66, 0xFF, 0xED, 0xB, 0x68, 0xFF, 0xED, 0xB, 0x6C, 0xFF, 0xED, 0xB, 0xD8, 0xFF, 0xED, 0xB, 0xD9, 0xFF, 0xED, 0xB, 0xDA, 0xFF, 0xED, 0xB, 0xDB, 0xFF, 0xED, 0xB, 0xDC, 0xFF, 0xED, 0xB, 0xDD, 0xFF, 0xED, 0xB, 0xDE, 0xFF, 0xED, 0xB, 0xDF, 0xFF, 0xED, 0xC, 0x4A, 0xFF, 0xED, 0xC, 0x4B, 0xFF, 0xED, 0xC, 0x4C, 0xFF, 0xED, 0xC, 0x4D, 0xFF, 0xED, 0xC, 0x4E, 0xFF, 0xED, 0xC, 0x4F, 0xFF, 0xED, 0xC, 0x50, 0xFF, 0xED, 0xC, 0x51, 0xFF, 0xED, 0xC, 0x7A, 0xFF, 0xED, 0xC, 0x7B, 0xFF, 0xED, 0xC, 0x7C, 0xFF, 0xED, 0xC, 0x7D, 0xFF, 0xED, 0xC, 0x7E, 0xFF, 0xED, 0xC, 0x7F, 0xFF, 0xED, 0xC, 0x80, 0xFF, 0xED, 0x0, 0x27, 0x0, 0x5B, 0xFF, 0xD6, 0x0, 0x5E, 0xFF, 0xD6, 0x2, 0x3C, 0xFF, 0xD6, 0x2, 0x8C, 0xFF, 0xAD, 0x2, 0x8F, 0xFF, 0xF4, 0x2, 0x94, 0xFF, 0xF6, 0x2, 0x9F, 0xFF, 0xE8, 0x2, 0xB0, 0xFF, 0xD6, 0x2, 0xB6, 0xFF, 0xE9, 0x2, 0xD1, 0xFF, 0x88, 0x2, 0xDF, 0xFF, 0xF4, 0x2, 0xE1, 0xFF, 0xF4, 0x2, 0xFA, 0x0, 0x5, 0x2, 0xFC, 0xFF, 0xF8, 0x3, 0x4, 0xFF, 0xAC, 0x5, 0x67, 0xFF, 0xD6, 0x6, 0x20, 0xFF, 0xF4, 0x9, 0x2, 0xFF, 0xD6, 0x9, 0x3, 0xFF, 0xD6, 0x9, 0x71, 0xFF, 0xD6, 0x9, 0xF5, 0xFF, 0xD6, 0xA, 0x18, 0xFF, 0xD6, 0xA, 0x21, 0xFF, 0xD6, 0xA, 0x29, 0xFF, 0xD6, 0xA, 0x3A, 0xFF, 0xD6, 0xA, 0x42, 0xFF, 0xD6, 0xA, 0x64, 0xFF, 0xD6, 0xA, 0x66, 0xFF, 0xD6, 0xA, 0x68, 0xFF, 0xD6, 0xA, 0x6A, 0xFF, 0xF4, 0xA, 0xC1, 0xFF, 0xD6, 0xA, 0xC3, 0xFF, 0xD6, 0xA, 0xC5, 0xFF, 0xD6, 0xA, 0xCA, 0xFF, 0xF4, 0xB, 0x3B, 0xFF, 0xD6, 0xB, 0xC0, 0xFF, 0xD6, 0xB, 0xC2, 0xFF, 0xD6, 0xB, 0xCC, 0xFF, 0xD6, 0xB, 0xD6, 0xFF, 0xD6, 0x0, 0x69, 0x0, 0x52, 0xFF, 0xF8, 0x0, 0x53, 0xFF, 0xF8, 0x0, 0x55, 0xFF, 0xF8, 0x0, 0x5B, 0xFF, 0xF3, 0x0, 0x5D, 0xFF, 0xEF, 0x0, 0x5E, 0xFF, 0xF3, 0x0, 0xEA, 0xFF, 0xF8, 0x2, 0x28, 0xFF, 0xF8, 0x2, 0x3C, 0xFF, 0xF3, 0x2, 0x40, 0xFF, 0xF8, 0x2, 0x82, 0xFF, 0xF8, 0x2, 0x83, 0xFF, 0xEE, 0x2, 0x84, 0xFF, 0xEF, 0x2, 0x86, 0xFF, 0xF8, 0x2, 0x87, 0xFF, 0xF8, 0x2, 0x88, 0xFF, 0xF2, 0x2, 0x89, 0xFF, 0xF8, 0x2, 0x8A, 0xFF, 0xF8, 0x2, 0x8B, 0xFF, 0xF8, 0x2, 0x8E, 0xFF, 0xF8, 0x2, 0x90, 0xFF, 0xF8, 0x2, 0x91, 0xFF, 0xF8, 0x2, 0x94, 0xFF, 0xF4, 0x2, 0x96, 0xFF, 0xF8, 0x2, 0x9A, 0xFF, 0xF2, 0x2, 0x9B, 0xFF, 0xF8, 0x2, 0xB0, 0xFF, 0xF3, 0x2, 0xC2, 0xFF, 0xF8, 0x2, 0xCB, 0xFF, 0xEF, 0x2, 0xCD, 0xFF, 0xF8, 0x2, 0xD3, 0xFF, 0xF8, 0x2, 0xD5, 0xFF, 0xF8, 0x2, 0xDB, 0xFF, 0xEF, 0x2, 0xE8, 0xFF, 0xF2, 0x2, 0xEA, 0xFF, 0xF8, 0x2, 0xEC, 0xFF, 0xF8, 0x2, 0xEE, 0xFF, 0xF8, 0x2, 0xF3, 0xFF, 0xF8, 0x2, 0xF5, 0xFF, 0xEF, 0x3, 0x7, 0xFF, 0xF2, 0x3, 0x9, 0xFF, 0xF2, 0x3, 0xF, 0xFF, 0xF8, 0x3, 0x11, 0xFF, 0xF2, 0x3, 0x13, 0xFF, 0xF8, 0x5, 0x67, 0xFF, 0xF3, 0x5, 0xF0, 0xFF, 0xF8, 0x6, 0x0, 0xFF, 0xF8, 0x6, 0x28, 0xFF, 0xF8, 0x6, 0x30, 0xFF, 0xF8, 0x6, 0xAB, 0xFF, 0xF8, 0x6, 0xAC, 0xFF, 0xF8, 0x6, 0xFB, 0xFF, 0xF8, 0x6, 0xFC, 0xFF, 0xF8, 0x6, 0xFD, 0xFF, 0xF8, 0x7, 0x12, 0xFF, 0xF8, 0x8, 0xF8, 0xFF, 0xF8, 0x9, 0x2, 0xFF, 0xF3, 0x9, 0x3, 0xFF, 0xF3, 0x9, 0x40, 0xFF, 0xF8, 0x9, 0x42, 0xFF, 0xF8, 0x9, 0x44, 0xFF, 0xF8, 0x9, 0x45, 0xFF, 0xF8, 0x9, 0x71, 0xFF, 0xF3, 0x9, 0xEF, 0xFF, 0xF8, 0x9, 0xF5, 0xFF, 0xF3, 0xA, 0x14, 0xFF, 0xF8, 0xA, 0x16, 0xFF, 0xF8, 0xA, 0x18, 0xFF, 0xF3, 0xA, 0x19, 0xFF, 0xEF, 0xA, 0x1B, 0xFF, 0xF8, 0xA, 0x20, 0xFF, 0xF8, 0xA, 0x21, 0xFF, 0xF3, 0xA, 0x29, 0xFF, 0xF3, 0xA, 0x30, 0xFF, 0xF8, 0xA, 0x36, 0xFF, 0xF8, 0xA, 0x3A, 0xFF, 0xF3, 0xA, 0x42, 0xFF, 0xF3, 0xA, 0x45, 0xFF, 0xEF, 0xA, 0x53, 0xFF, 0xEF, 0xA, 0x57, 0xFF, 0xF8, 0xA, 0x59, 0xFF, 0xF8, 0xA, 0x64, 0xFF, 0xF3, 0xA, 0x66, 0xFF, 0xF3, 0xA, 0x68, 0xFF, 0xF3, 0xA, 0x6C, 0xFF, 0xF8, 0xA, 0xC1, 0xFF, 0xF3, 0xA, 0xC3, 0xFF, 0xF3, 0xA, 0xC5, 0xFF, 0xF3, 0xA, 0xCC, 0xFF, 0xF8, 0xA, 0xE7, 0xFF, 0xF8, 0xA, 0xED, 0xFF, 0xF8, 0xB, 0x13, 0xFF, 0xF8, 0xB, 0x3B, 0xFF, 0xF3, 0xB, 0x84, 0xFF, 0xF8, 0xB, 0x86, 0xFF, 0xF8, 0xB, 0x88, 0xFF, 0xF8, 0xB, 0x8A, 0xFF, 0xF8, 0xB, 0x8C, 0xFF, 0xF8, 0xB, 0x8E, 0xFF, 0xF8, 0xB, 0xC0, 0xFF, 0xF3, 0xB, 0xC2, 0xFF, 0xF3, 0xB, 0xC8, 0xFF, 0xEF, 0xB, 0xCA, 0xFF, 0xEF, 0xB, 0xCC, 0xFF, 0xF3, 0xB, 0xD6, 0xFF, 0xF3, 0x0, 0xA, 0x0, 0x7, 0xFF, 0xD6, 0x0, 0xC, 0xFF, 0xD6, 0x4, 0x62, 0xFF, 0xD6, 0x4, 0x63, 0xFF, 0xD6, 0x4, 0x65, 0xFF, 0xD6, 0x4, 0x66, 0xFF, 0xD6, 0x4, 0x67, 0xFF, 0xD6, 0xA, 0x2A, 0xFF, 0xD6, 0xA, 0x2B, 0xFF, 0xD6, 0xA, 0x2E, 0xFF, 0xD6, 0x0, 0x18, 0x0, 0x5D, 0xFF, 0xEB, 0x2, 0x84, 0xFF, 0xEB, 0x2, 0x8C, 0xFF, 0xA6, 0x2, 0x8F, 0xFF, 0xD8, 0x2, 0x94, 0xFF, 0xE3, 0x2, 0x9F, 0xFF, 0xD9, 0x2, 0xB6, 0xFF, 0xDB, 0x2, 0xCB, 0xFF, 0xEB, 0x2, 0xD1, 0xFF, 0x1D, 0x2, 0xDB, 0xFF, 0xEB, 0x2, 0xDF, 0xFF, 0xD8, 0x2, 0xE1, 0xFF, 0xDE, 0x2, 0xF5, 0xFF, 0xEB, 0x2, 0xFA, 0xFF, 0xEF, 0x2, 0xFC, 0xFF, 0xF1, 0x3, 0x4, 0xFF, 0x5E, 0x6, 0x20, 0xFF, 0xD8, 0xA, 0x19, 0xFF, 0xEB, 0xA, 0x45, 0xFF, 0xEB, 0xA, 0x53, 0xFF, 0xEB, 0xA, 0x6A, 0xFF, 0xD8, 0xA, 0xCA, 0xFF, 0xD8, 0xB, 0xC8, 0xFF, 0xEB, 0xB, 0xCA, 0xFF, 0xEB, 0x0, 0xE, 0x2, 0x8C, 0xFF, 0x9B, 0x2, 0x8F, 0xFF, 0xE2, 0x2, 0x94, 0xFF, 0xE7, 0x2, 0x9F, 0xFF, 0xD9, 0x2, 0xB6, 0xFF, 0xDB, 0x2, 0xD1, 0xFF, 0x1D, 0x2, 0xDF, 0xFF, 0xE2, 0x2, 0xE1, 0xFF, 0xDE, 0x2, 0xFA, 0xFF, 0xEF, 0x2, 0xFC, 0xFF, 0xF1, 0x3, 0x4, 0xFF, 0x5E, 0x6, 0x20, 0xFF, 0xE2, 0xA, 0x6A, 0xFF, 0xE2, 0xA, 0xCA, 0xFF, 0xE2, 0x0, 0xA, 0x0, 0x7, 0xFF, 0xDD, 0x0, 0xC, 0xFF, 0xDD, 0x4, 0x62, 0xFF, 0xDD, 0x4, 0x63, 0xFF, 0xDD, 0x4, 0x65, 0xFF, 0xDD, 0x4, 0x66, 0xFF, 0xDD, 0x4, 0x67, 0xFF, 0xDD, 0xA, 0x2A, 0xFF, 0xDD, 0xA, 0x2B, 0xFF, 0xDD, 0xA, 0x2E, 0xFF, 0xDD, 0x0, 0xBB, 0x0, 0x48, 0xFF, 0x79, 0x0, 0x49, 0xFF, 0x79, 0x0, 0x4A, 0xFF, 0x79, 0x0, 0x4C, 0xFF, 0x79, 0x0, 0x54, 0xFF, 0x6D, 0x0, 0x56, 0xFF, 0x79, 0x0, 0x58, 0xFF, 0x26, 0x0, 0x59, 0x0, 0x14, 0x0, 0x5C, 0x0, 0xC, 0x0, 0x95, 0xFF, 0x79, 0x0, 0x9F, 0xFF, 0x79, 0x0, 0xB5, 0xFF, 0x79, 0x0, 0xDA, 0xFF, 0x79, 0x0, 0xDC, 0xFF, 0x79, 0x0, 0xE4, 0xFF, 0x79, 0x0, 0xF4, 0xFF, 0x26, 0x1, 0x0, 0xFF, 0x79, 0x2, 0x2A, 0xFF, 0x79, 0x2, 0x3A, 0xFF, 0x79, 0x2, 0x47, 0xFF, 0x79, 0x2, 0x48, 0xFF, 0x79, 0x2, 0x56, 0xFF, 0x6D, 0x2, 0x58, 0xFF, 0x79, 0x2, 0x61, 0xFF, 0x79, 0x2, 0x8D, 0xFF, 0x79, 0x2, 0x99, 0xFF, 0x79, 0x2, 0xAE, 0xFF, 0x6D, 0x2, 0xB4, 0xFF, 0x79, 0x2, 0xB8, 0xFF, 0x79, 0x2, 0xD9, 0xFF, 0x79, 0x2, 0xF7, 0xFF, 0x79, 0x2, 0xF8, 0xFF, 0x79, 0x3, 0x2, 0xFF, 0x79, 0x5, 0x6E, 0xFF, 0x79, 0x5, 0x70, 0xFF, 0x6D, 0x5, 0xEE, 0xFF, 0x6D, 0x6, 0x2, 0xFF, 0x6D, 0x6, 0x4, 0xFF, 0x6D, 0x6, 0x6, 0xFF, 0x6D, 0x6, 0x32, 0xFF, 0x6D, 0x6, 0x85, 0xFF, 0x6D, 0x6, 0x87, 0xFF, 0x6D, 0x6, 0x8F, 0xFF, 0x79, 0x6, 0x91, 0xFF, 0x79, 0x6, 0xA9, 0xFF, 0x79, 0x6, 0xCB, 0xFF, 0x79, 0x6, 0xF7, 0xFF, 0x79, 0x7, 0x2C, 0xFF, 0x26, 0x8, 0xEF, 0xFF, 0x79, 0x8, 0xF0, 0xFF, 0x79, 0x8, 0xF1, 0xFF, 0x79, 0x8, 0xF2, 0xFF, 0x79, 0x8, 0xF3, 0xFF, 0x79, 0x8, 0xF9, 0xFF, 0x6D, 0x8, 0xFA, 0xFF, 0x6D, 0x8, 0xFB, 0xFF, 0x6D, 0x8, 0xFC, 0xFF, 0x6D, 0x8, 0xFD, 0xFF, 0x6D, 0x9, 0xB, 0xFF, 0x79, 0x9, 0xD, 0xFF, 0x79, 0x9, 0xF, 0xFF, 0x79, 0x9, 0x11, 0xFF, 0x79, 0x9, 0x13, 0xFF, 0x79, 0x9, 0x15, 0xFF, 0x79, 0x9, 0x17, 0xFF, 0x79, 0x9, 0x19, 0xFF, 0x79, 0x9, 0x1B, 0xFF, 0x79, 0x9, 0x1D, 0xFF, 0x79, 0x9, 0x1F, 0xFF, 0x79, 0x9, 0x21, 0xFF, 0x79, 0x9, 0x23, 0xFF, 0x79, 0x9, 0x25, 0xFF, 0x79, 0x9, 0x47, 0xFF, 0x6D, 0x9, 0x49, 0xFF, 0x6D, 0x9, 0x4B, 0xFF, 0x6D, 0x9, 0x53, 0xFF, 0x26, 0x9, 0x55, 0xFF, 0x26, 0x9, 0x57, 0xFF, 0x26, 0x9, 0x59, 0xFF, 0x26, 0x9, 0x5B, 0xFF, 0x26, 0x9, 0xED, 0xFF, 0x79, 0x9, 0xF3, 0xFF, 0x6D, 0x9, 0xF9, 0xFF, 0x6D, 0xA, 0x13, 0xFF, 0x79, 0xA, 0x15, 0xFF, 0x6D, 0xA, 0x17, 0xFF, 0x79, 0xA, 0x1A, 0xFF, 0x79, 0xA, 0x1C, 0xFF, 0x26, 0xA, 0x35, 0xFF, 0x79, 0xA, 0x3B, 0xFF, 0x79, 0xA, 0x40, 0xFF, 0x79, 0xA, 0x4E, 0xFF, 0x79, 0xA, 0x50, 0xFF, 0x79, 0xA, 0x51, 0xFF, 0x79, 0xA, 0x5B, 0xFF, 0x6D, 0xA, 0x5D, 0xFF, 0x79, 0xA, 0x60, 0xFF, 0x6D, 0xA, 0x6D, 0xFF, 0x79, 0xA, 0x87, 0xFF, 0x79, 0xA, 0x89, 0xFF, 0x79, 0xA, 0x8B, 0xFF, 0x79, 0xA, 0x8D, 0xFF, 0x79, 0xA, 0x8F, 0xFF, 0x79, 0xA, 0x91, 0xFF, 0x79, 0xA, 0x93, 0xFF, 0x79, 0xA, 0x95, 0xFF, 0x79, 0xA, 0x9B, 0xFF, 0x6D, 0xA, 0x9D, 0xFF, 0x6D, 0xA, 0x9F, 0xFF, 0x6D, 0xA, 0xA1, 0xFF, 0x6D, 0xA, 0xA3, 0xFF, 0x6D, 0xA, 0xA5, 0xFF, 0x6D, 0xA, 0xA7, 0xFF, 0x6D, 0xA, 0xA9, 0xFF, 0x79, 0xA, 0xAB, 0xFF, 0x79, 0xA, 0xAD, 0xFF, 0x79, 0xA, 0xAF, 0xFF, 0x6D, 0xA, 0xB1, 0xFF, 0x79, 0xA, 0xF3, 0xFF, 0x6D, 0xA, 0xFE, 0xFF, 0x79, 0xB, 0x6, 0xFF, 0x79, 0xB, 0xA, 0xFF, 0x6D, 0xB, 0xC, 0xFF, 0x6D, 0xB, 0xF, 0xFF, 0x79, 0xB, 0x19, 0xFF, 0x79, 0xB, 0x1B, 0xFF, 0x79, 0xB, 0x21, 0xFF, 0x6D, 0xB, 0x23, 0xFF, 0x6D, 0xB, 0x33, 0xFF, 0x6D, 0xB, 0x35, 0xFF, 0x6D, 0xB, 0x37, 0xFF, 0x6D, 0xB, 0x39, 0xFF, 0x6D, 0xB, 0x3C, 0xFF, 0x6D, 0xB, 0x42, 0xFF, 0x79, 0xB, 0x4A, 0xFF, 0x79, 0xB, 0x54, 0xFF, 0x79, 0xB, 0x56, 0xFF, 0x79, 0xB, 0x58, 0xFF, 0x79, 0xB, 0x5A, 0xFF, 0x79, 0xB, 0x5C, 0xFF, 0x79, 0xB, 0x5E, 0xFF, 0x79, 0xB, 0x60, 0xFF, 0x79, 0xB, 0x62, 0xFF, 0x79, 0xB, 0x64, 0xFF, 0x79, 0xB, 0x66, 0xFF, 0x79, 0xB, 0x68, 0xFF, 0x79, 0xB, 0x6C, 0xFF, 0x79, 0xB, 0x90, 0xFF, 0x6D, 0xB, 0x92, 0xFF, 0x6D, 0xB, 0x94, 0xFF, 0x6D, 0xB, 0x96, 0xFF, 0x6D, 0xB, 0xA4, 0xFF, 0x26, 0xB, 0xA6, 0xFF, 0x26, 0xB, 0xA8, 0xFF, 0x26, 0xB, 0xAA, 0xFF, 0x26, 0xB, 0xAC, 0xFF, 0x26, 0xB, 0xD8, 0xFF, 0x79, 0xB, 0xD9, 0xFF, 0x79, 0xB, 0xDA, 0xFF, 0x79, 0xB, 0xDB, 0xFF, 0x79, 0xB, 0xDC, 0xFF, 0x79, 0xB, 0xDD, 0xFF, 0x79, 0xB, 0xDE, 0xFF, 0x79, 0xB, 0xDF, 0xFF, 0x79, 0xC, 0x14, 0xFF, 0x6D, 0xC, 0x15, 0xFF, 0x6D, 0xC, 0x16, 0xFF, 0x6D, 0xC, 0x17, 0xFF, 0x6D, 0xC, 0x18, 0xFF, 0x6D, 0xC, 0x19, 0xFF, 0x6D, 0xC, 0x44, 0xFF, 0x6D, 0xC, 0x45, 0xFF, 0x6D, 0xC, 0x4A, 0xFF, 0x79, 0xC, 0x4B, 0xFF, 0x79, 0xC, 0x4C, 0xFF, 0x79, 0xC, 0x4D, 0xFF, 0x79, 0xC, 0x4E, 0xFF, 0x79, 0xC, 0x4F, 0xFF, 0x79, 0xC, 0x50, 0xFF, 0x79, 0xC, 0x51, 0xFF, 0x79, 0xC, 0x7A, 0xFF, 0x79, 0xC, 0x7B, 0xFF, 0x79, 0xC, 0x7C, 0xFF, 0x79, 0xC, 0x7D, 0xFF, 0x79, 0xC, 0x7E, 0xFF, 0x79, 0xC, 0x7F, 0xFF, 0x79, 0xC, 0x80, 0xFF, 0x79, 0x0, 0x9, 0x2, 0x8C, 0xFF, 0x6F, 0x2, 0x94, 0xFF, 0xDA, 0x2, 0x9F, 0xFF, 0xD9, 0x2, 0xB6, 0xFF, 0xDB, 0x2, 0xD1, 0xFF, 0x1D, 0x2, 0xE1, 0xFF, 0xDE, 0x2, 0xFA, 0xFF, 0xEF, 0x2, 0xFC, 0xFF, 0xF1, 0x3, 0x4, 0xFF, 0x5E, 0x0, 0x13, 0x7, 0x4F, 0xFF, 0xED, 0x7, 0x51, 0xFF, 0xF4, 0x7, 0x52, 0xFF, 0xF0, 0x7, 0x54, 0xFF, 0xF1, 0x7, 0x70, 0xFF, 0xF1, 0x7, 0x74, 0xFF, 0xF1, 0x7, 0x8C, 0xFF, 0xF1, 0x7, 0x8E, 0xFF, 0xED, 0x7, 0x90, 0xFF, 0xF1, 0x9, 0x9A, 0xFF, 0xED, 0x9, 0xC7, 0xFF, 0xF1, 0x9, 0xCF, 0xFF, 0xF4, 0x9, 0xD0, 0xFF, 0xED, 0x9, 0xD1, 0xFF, 0xED, 0xC, 0xBC, 0xFF, 0xED, 0xC, 0xCA, 0xFF, 0xED, 0xC, 0xCD, 0xFF, 0xED, 0xC, 0xE1, 0xFF, 0xF1, 0xC, 0xE6, 0xFF, 0xED, 0x0, 0x13, 0x7, 0x4F, 0xFF, 0xE3, 0x7, 0x51, 0xFF, 0xF0, 0x7, 0x52, 0xFF, 0xE9, 0x7, 0x54, 0xFF, 0xE7, 0x7, 0x70, 0xFF, 0xE7, 0x7, 0x74, 0xFF, 0xE7, 0x7, 0x8C, 0xFF, 0xE7, 0x7, 0x8E, 0xFF, 0xE3, 0x7, 0x90, 0xFF, 0xE7, 0x9, 0x9A, 0xFF, 0xE3, 0x9, 0xC7, 0xFF, 0xE7, 0x9, 0xCF, 0xFF, 0xF0, 0x9, 0xD0, 0xFF, 0xE3, 0x9, 0xD1, 0xFF, 0xE3, 0xC, 0xBC, 0xFF, 0xE3, 0xC, 0xCA, 0xFF, 0xE3, 0xC, 0xCD, 0xFF, 0xE3, 0xC, 0xE1, 0xFF, 0xE7, 0xC, 0xE6, 0xFF, 0xE3, 0x0, 0x3, 0x7, 0x51, 0xFF, 0xF4, 0x7, 0x52, 0xFF, 0xED, 0x9, 0xCF, 0xFF, 0xF4, 0x0, 0x2, 0x7, 0x52, 0xFF, 0xB1, 0x7, 0x57, 0xFF, 0xEF, 0x0, 0x2, 0x0, 0x59, 0x0, 0x14, 0x0, 0x5C, 0x0, 0xC, 0x0, 0x12, 0x2, 0x6F, 0xFF, 0xA7, 0x2, 0x7C, 0x0, 0x10, 0x2, 0x81, 0xFF, 0xD6, 0x2, 0x83, 0xFF, 0x83, 0x2, 0x85, 0xFF, 0xB6, 0x2, 0x93, 0xFF, 0xD9, 0x2, 0x97, 0xFF, 0xBD, 0x2, 0x9D, 0xFF, 0xCC, 0x2, 0xB2, 0xFF, 0xBC, 0x2, 0xC5, 0xFF, 0xCC, 0x2, 0xC7, 0xFF, 0xD5, 0x2, 0xCF, 0xFF, 0xD6, 0x2, 0xD7, 0xFF, 0xD6, 0x2, 0xE1, 0xFF, 0xDD, 0x2, 0xE4, 0xFF, 0xD7, 0x2, 0xF6, 0xFF, 0x91, 0x3, 0x0, 0xFF, 0xDC, 0x3, 0x3, 0x0, 0x16, 0x0, 0x2, 0x2, 0x83, 0xFF, 0x77, 0x2, 0xB2, 0xFF, 0xFB, 0x0, 0xA, 0x2, 0x7C, 0xFF, 0xCC, 0x2, 0x8C, 0xFF, 0xC7, 0x2, 0x94, 0xFF, 0xE3, 0x2, 0xD1, 0xFF, 0xBF, 0x2, 0xE0, 0xFF, 0xD7, 0x2, 0xE3, 0xFF, 0xDC, 0x2, 0xF9, 0xFF, 0xCA, 0x2, 0xFB, 0xFF, 0xEA, 0x3, 0x3, 0xFF, 0x75, 0x3, 0x4, 0xFF, 0xCA, 0x0, 0x31, 0x0, 0x57, 0xFF, 0x75, 0x0, 0x5C, 0xFF, 0x96, 0x0, 0x6E, 0xFE, 0xDB, 0x0, 0x7D, 0xFE, 0xDF, 0x0, 0x82, 0xFE, 0xA6, 0x0, 0x87, 0xFF, 0x51, 0x0, 0x8A, 0xFF, 0x3D, 0x2, 0x37, 0xFF, 0x67, 0x2, 0x3D, 0xFF, 0xEE, 0x2, 0x3E, 0xFE, 0xFC, 0x2, 0x42, 0xFF, 0x2E, 0x2, 0x45, 0xFF, 0x3C, 0x2, 0x46, 0xFE, 0xF3, 0x2, 0x49, 0xFF, 0x6B, 0x2, 0x4B, 0xFE, 0xFC, 0x2, 0x4C, 0xFE, 0xFB, 0x2, 0x4D, 0xFE, 0xF8, 0x2, 0x6F, 0xFF, 0x57, 0x2, 0x7C, 0x0, 0x7, 0x2, 0x80, 0xFF, 0xB9, 0x2, 0x81, 0xFF, 0x3B, 0x2, 0x83, 0xFE, 0xE9, 0x2, 0x85, 0xFF, 0x0, 0x2, 0x8C, 0xFF, 0x5D, 0x2, 0x93, 0xFE, 0xFB, 0x2, 0x94, 0xFF, 0x9D, 0x2, 0x95, 0xFF, 0x0, 0x2, 0x97, 0xFE, 0xF3, 0x2, 0x98, 0x0, 0x1F, 0x2, 0x9D, 0xFE, 0xFB, 0x2, 0x9F, 0xFE, 0xFE, 0x2, 0xB2, 0xFE, 0xF1, 0x2, 0xB6, 0xFF, 0xA7, 0x2, 0xC5, 0xFF, 0x2, 0x2, 0xC7, 0xFF, 0x2C, 0x2, 0xCF, 0xFE, 0xFB, 0x2, 0xD1, 0xFF, 0x5E, 0x2, 0xD7, 0xFF, 0x3B, 0x2, 0xE1, 0xFE, 0xF8, 0x2, 0xE3, 0xFF, 0x30, 0x2, 0xE4, 0xFE, 0xDB, 0x2, 0xEF, 0xFF, 0xBC, 0x2, 0xF6, 0xFE, 0xD9, 0x2, 0xFA, 0xFF, 0x21, 0x2, 0xFC, 0xFF, 0x53, 0x3, 0x0, 0xFE, 0xF6, 0x3, 0x3, 0x0, 0x7, 0x3, 0x4, 0xFF, 0x20, 0x3, 0x5, 0xFF, 0xD3, 0x0, 0x8, 0x2, 0x8C, 0xFF, 0xEF, 0x2, 0x94, 0xFF, 0xF6, 0x2, 0x9F, 0xFF, 0xF0, 0x2, 0xB6, 0xFF, 0xF2, 0x2, 0xD1, 0xFF, 0xE2, 0x2, 0xFA, 0xFF, 0xF2, 0x2, 0xFC, 0xFF, 0xF2, 0x3, 0x4, 0xFF, 0xF0, 0x0, 0x2, 0x2, 0xA7, 0x0, 0x7, 0x3, 0x3, 0xFF, 0xE4, 0x0, 0x4, 0x0, 0xE, 0xFF, 0xE4, 0x0, 0x42, 0xFF, 0xF8, 0x0, 0x62, 0xFF, 0xF5, 0x2, 0xE4, 0xFF, 0xEC, 0x0, 0x2, 0x2, 0x8C, 0xFF, 0xF4, 0x4, 0x63, 0xFF, 0xB5, 0x0, 0x13, 0x0, 0x5C, 0xFF, 0xBC, 0x2, 0x37, 0xFF, 0xC0, 0x2, 0x49, 0xFF, 0xAD, 0x2, 0x80, 0xFF, 0xD3, 0x2, 0x8C, 0xFF, 0xB3, 0x2, 0x94, 0xFF, 0xF1, 0x2, 0x9F, 0xFF, 0xAB, 0x2, 0xB2, 0xFF, 0xCE, 0x2, 0xB6, 0xFF, 0xC3, 0x2, 0xD1, 0xFF, 0x83, 0x2, 0xE1, 0xFF, 0xA8, 0x2, 0xEF, 0xFF, 0xDB, 0x2, 0xFA, 0xFF, 0xAB, 0x2, 0xFC, 0xFF, 0xA8, 0x3, 0x4, 0xFF, 0xAE, 0x3, 0x5, 0xFF, 0xEE, 0x7, 0x57, 0xFF, 0xE5, 0x7, 0x61, 0xFF, 0xE4, 0x7, 0xAF, 0xFF, 0xE6, 0x0, 0x6, 0x0, 0x5, 0xFF, 0xF5, 0x0, 0x5C, 0xFF, 0xB3, 0x7, 0x52, 0xFF, 0xB2, 0x7, 0x57, 0xFF, 0xF1, 0x7, 0x61, 0xFF, 0xF0, 0x7, 0xAF, 0xFF, 0xF2, 0x0, 0x4, 0x0, 0x4B, 0x0, 0x17, 0x0, 0x59, 0x0, 0x32, 0x0, 0x5C, 0x0, 0x16, 0x4, 0x63, 0x0, 0xA, 0x0, 0x35, 0x0, 0x5, 0xFF, 0xCE, 0x0, 0x57, 0xFF, 0xB9, 0x0, 0x5C, 0xFF, 0xCD, 0x0, 0x6E, 0xFF, 0x5F, 0x0, 0x7D, 0xFF, 0x61, 0x0, 0x82, 0xFF, 0x40, 0x0, 0x87, 0xFF, 0xA5, 0x0, 0x8A, 0xFF, 0x99, 0x2, 0x37, 0xFF, 0xB2, 0x2, 0x3D, 0xFF, 0xFA, 0x2, 0x3E, 0xFF, 0x73, 0x2, 0x42, 0xFF, 0x6F, 0x2, 0x45, 0xFF, 0x92, 0x2, 0x46, 0xFF, 0x6D, 0x2, 0x49, 0xFF, 0xAB, 0x2, 0x4B, 0xFF, 0x73, 0x2, 0x4C, 0xFF, 0x72, 0x2, 0x4D, 0xFF, 0x70, 0x2, 0x6F, 0xFF, 0xA8, 0x2, 0x7C, 0x0, 0x10, 0x2, 0x80, 0xFF, 0xE2, 0x2, 0x81, 0xFF, 0x98, 0x2, 0x83, 0xFF, 0x68, 0x2, 0x85, 0xFF, 0x75, 0x2, 0x8C, 0xFF, 0xAB, 0x2, 0x93, 0xFF, 0x72, 0x2, 0x94, 0xFF, 0xCD, 0x2, 0x95, 0xFF, 0x75, 0x2, 0x97, 0xFF, 0x6D, 0x2, 0x98, 0x0, 0x1A, 0x2, 0x9D, 0xFF, 0x72, 0x2, 0x9F, 0xFF, 0x74, 0x2, 0xB2, 0xFF, 0x6E, 0x2, 0xB6, 0xFF, 0xD7, 0x2, 0xC5, 0xFF, 0x76, 0x2, 0xC7, 0xFF, 0x8F, 0x2, 0xCF, 0xFF, 0x72, 0x2, 0xD1, 0xFF, 0xAC, 0x2, 0xD7, 0xFF, 0x98, 0x2, 0xE1, 0xFF, 0x70, 0x2, 0xE3, 0xFF, 0x91, 0x2, 0xE4, 0xFF, 0x5F, 0x2, 0xEF, 0xFF, 0xE4, 0x2, 0xF6, 0xFF, 0x5E, 0x2, 0xFA, 0xFF, 0x89, 0x2, 0xFC, 0xFF, 0xA6, 0x3, 0x0, 0xFF, 0x6F, 0x3, 0x3, 0x0, 0x10, 0x3, 0x4, 0xFF, 0x88, 0x3, 0x5, 0xFF, 0xF1, 0x7, 0x57, 0xFF, 0xB3, 0x7, 0x61, 0xFF, 0xB3, 0x7, 0xAF, 0xFF, 0xB3, 0x0, 0x7, 0x0, 0xE, 0x0, 0x16, 0x0, 0x42, 0x0, 0x12, 0x0, 0x57, 0xFF, 0xE0, 0x0, 0x62, 0x0, 0x14, 0x7, 0x57, 0xFF, 0xD6, 0x7, 0x61, 0xFF, 0xD6, 0x7, 0xAF, 0xFF, 0xD6, 0x0, 0x7, 0x0, 0xE, 0x0, 0x10, 0x0, 0x42, 0x0, 0xD, 0x0, 0x57, 0xFF, 0xE9, 0x0, 0x62, 0x0, 0xF, 0x7, 0x57, 0xFF, 0xE5, 0x7, 0x61, 0xFF, 0xE5, 0x7, 0xAF, 0xFF, 0xE7, 0x0, 0x17, 0x2, 0x37, 0xFF, 0xD0, 0x2, 0x3D, 0xFF, 0xF9, 0x2, 0x41, 0xFF, 0xEC, 0x2, 0x43, 0x0, 0x12, 0x2, 0x49, 0xFF, 0xBE, 0x2, 0x4B, 0xFF, 0xDA, 0x2, 0x4C, 0xFF, 0xDC, 0x2, 0x4D, 0xFF, 0xE2, 0x2, 0x6F, 0x0, 0x17, 0x2, 0x80, 0xFF, 0xE7, 0x2, 0x8C, 0xFF, 0xCC, 0x2, 0xD1, 0xFF, 0xB7, 0x2, 0xE1, 0xFF, 0xC1, 0x2, 0xE3, 0xFF, 0xD2, 0x2, 0xE4, 0xFF, 0xC0, 0x2, 0xEF, 0xFF, 0xE5, 0x2, 0xF9, 0x0, 0xE, 0x2, 0xFB, 0x0, 0xD, 0x3, 0x4, 0xFF, 0xBD, 0x3, 0x5, 0xFF, 0xF1, 0x7, 0x57, 0xFF, 0xE7, 0x7, 0x61, 0xFF, 0xE5, 0x7, 0xAF, 0xFF, 0xE7, 0x0, 0x1, 0x2, 0xB2, 0xFF, 0xF0, 0x0, 0x6, 0x0, 0x5C, 0xFF, 0xE3, 0x2, 0x37, 0xFF, 0xC6, 0x2, 0x4C, 0xFF, 0xE2, 0x7, 0x57, 0xFF, 0xEA, 0x7, 0x61, 0xFF, 0xE9, 0x7, 0xAF, 0xFF, 0xEC, 0x0, 0x7, 0x0, 0x4B, 0x0, 0xE, 0x2, 0x3D, 0xFF, 0xF8, 0x2, 0x45, 0x0, 0xC, 0x2, 0x46, 0xFF, 0xE8, 0x2, 0x49, 0x0, 0xD, 0x2, 0x83, 0xFF, 0xBC, 0x2, 0xB2, 0xFF, 0xF0, 0x0, 0xA, 0x0, 0x59, 0xFF, 0xFC, 0x2, 0x49, 0xFF, 0xE8, 0x2, 0x83, 0xFF, 0xC0, 0x2, 0x8C, 0xFF, 0xE3, 0x2, 0x9F, 0xFF, 0xEF, 0x2, 0xB6, 0xFF, 0xF0, 0x2, 0xD1, 0xFF, 0xE2, 0x2, 0xFA, 0xFF, 0xF4, 0x3, 0x4, 0xFF, 0xEA, 0x4, 0x63, 0xFF, 0x98, 0x0, 0x18, 0x0, 0x24, 0xFF, 0xB1, 0x0, 0x59, 0xFF, 0xEE, 0x0, 0x5C, 0xFF, 0xDC, 0x0, 0xC3, 0xFF, 0xED, 0x2, 0x37, 0xFF, 0xE3, 0x2, 0x38, 0xFF, 0xCD, 0x2, 0x43, 0x0, 0x1F, 0x2, 0x49, 0xFF, 0xC3, 0x2, 0x6F, 0x0, 0x14, 0x2, 0x7C, 0xFF, 0xDA, 0x2, 0x8C, 0xFF, 0xB8, 0x2, 0x94, 0xFF, 0xE1, 0x2, 0xD1, 0xFF, 0x87, 0x2, 0xE0, 0xFF, 0x5D, 0x2, 0xE1, 0xFF, 0x83, 0x2, 0xE3, 0xFF, 0x84, 0x2, 0xE4, 0xFF, 0xDA, 0x2, 0xEF, 0xFF, 0xF1, 0x2, 0xF9, 0xFF, 0xAA, 0x2, 0xFB, 0xFF, 0xC5, 0x3, 0x3, 0xFF, 0x81, 0x3, 0x4, 0xFF, 0xA6, 0x7, 0x52, 0xFF, 0xC9, 0x7, 0x61, 0xFF, 0xF4, 0x0, 0x2, 0x2, 0x8C, 0xFF, 0xDF, 0x4, 0x63, 0xFF, 0x90, 0x0, 0x3, 0x0, 0x4B, 0xFF, 0xF4, 0x0, 0x5C, 0xFF, 0xE8, 0x7, 0x52, 0xFF, 0xEF, 0x0, 0x8, 0x2, 0x6F, 0x0, 0xE, 0x2, 0x83, 0x0, 0xE, 0x2, 0xE0, 0xFF, 0xEE, 0x2, 0xE1, 0xFF, 0xEE, 0x2, 0xE3, 0xFF, 0xEE, 0x2, 0xF9, 0xFF, 0xED, 0x2, 0xFB, 0xFF, 0xEC, 0x3, 0x3, 0xFF, 0xEE, 0x0, 0x6, 0x2, 0x49, 0xFF, 0xE8, 0x2, 0x83, 0xFF, 0xDB, 0x2, 0x8C, 0xFF, 0xD7, 0x2, 0x94, 0xFF, 0xF4, 0x2, 0xD1, 0xFF, 0xEA, 0x3, 0x4, 0xFF, 0xEA, 0x0, 0x1E, 0x0, 0xB, 0xFF, 0xD5, 0x0, 0xE, 0x0, 0x16, 0x0, 0xF, 0xFF, 0xBD, 0x0, 0x42, 0x0, 0x13, 0x0, 0x4B, 0xFF, 0xE1, 0x0, 0x57, 0xFF, 0xCD, 0x0, 0x59, 0xFF, 0xE5, 0x0, 0x62, 0x0, 0x14, 0x0, 0x6E, 0xFF, 0x9C, 0x0, 0x7D, 0xFF, 0xC9, 0x0, 0x82, 0xFF, 0x8D, 0x0, 0x87, 0xFF, 0xB5, 0x0, 0x8A, 0xFF, 0xB3, 0x2, 0x37, 0xFF, 0xC8, 0x2, 0x3B, 0xFF, 0xE5, 0x2, 0x3D, 0xFF, 0xF8, 0x2, 0x3E, 0xFF, 0xB0, 0x2, 0x3F, 0x0, 0xE, 0x2, 0x41, 0xFF, 0xE7, 0x2, 0x42, 0xFF, 0xC8, 0x2, 0x45, 0xFF, 0xD4, 0x2, 0x46, 0xFF, 0x9F, 0x2, 0x49, 0xFF, 0xE0, 0x2, 0x4B, 0xFF, 0xC3, 0x2, 0x4C, 0xFF, 0xD3, 0x2, 0x4D, 0xFF, 0xB8, 0x4, 0x6C, 0xFF, 0xB7, 0x7, 0x57, 0xFF, 0xBC, 0x7, 0x61, 0xFF, 0xBC, 0x7, 0xAF, 0xFF, 0xBE, 0x0, 0x8, 0x0, 0x59, 0x0, 0xF, 0x0, 0x82, 0xFF, 0x15, 0x2, 0x3D, 0xFF, 0xFB, 0x2, 0x43, 0xFF, 0xAE, 0x2, 0x46, 0xFF, 0xBA, 0x2, 0x6F, 0xFF, 0x2A, 0x2, 0x83, 0xFF, 0x4D, 0x2, 0xF6, 0xFF, 0xD4, 0x0, 0x7, 0x0, 0x82, 0xFF, 0xD2, 0x2, 0x34, 0xFF, 0xF2, 0x2, 0x36, 0xFF, 0xEF, 0x2, 0x43, 0xFF, 0xE8, 0x2, 0x6F, 0xFF, 0xD2, 0x2, 0x7C, 0xFF, 0xEB, 0x3, 0x3, 0xFF, 0xDD, 0x0, 0x1, 0x7, 0x57, 0xFF, 0xE9, 0x0, 0x4, 0x7, 0x52, 0xFF, 0xBB, 0x7, 0x57, 0xFF, 0xF1, 0x7, 0x61, 0xFF, 0xF1, 0x7, 0xAF, 0xFF, 0xF1, 0x0, 0x1, 0x7, 0x52, 0xFF, 0xF0, 0x0, 0x1, 0x7, 0x52, 0x0, 0xE, 0x0, 0x2, 0xB, 0x56, 0x0, 0x4, 0x0, 0x0, 0x11, 0xBE, 0x1F, 0xD8, 0x0, 0x27, 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xED, 0xFF, 0xEE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xB, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xB, 0x0, 0x0, 0x0, 0xB, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEE, 0xFF, 0xEE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xB7, 0xFF, 0xD6, 0xFF, 0xEC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE0, 0x0, 0x0, 0xFF, 0xE7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xD8, 0xFF, 0x96, 0x0, 0x0, 0xFF, 0xF4, 0xFF, 0xE7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE8, 0xFF, 0xE1, 0xFF, 0xF8, 0xFF, 0xF4, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF4, 0xFF, 0xCA, 0xFF, 0xEE, 0xFF, 0x84, 0xFF, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0xD, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF0, 0x0, 0x0, 0xFF, 0x6F, 0x0, 0x0, 0xFF, 0xD6, 0xFF, 0xA0, 0xFF, 0xC2, 0x0, 0x12, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0xFF, 0x9C, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x7A, 0xFF, 0xC6, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xDA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xA8, 0xFF, 0xE6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xB3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEC, 0xFF, 0xEE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE4, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xDA, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF2, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x66, 0xFF, 0xD0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE4, 0xFF, 0xD4, 0xFF, 0xF6, 0xFF, 0xE3, 0xFF, 0xE7, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE5, 0xFF, 0xD4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x5A, 0x0, 0x0, 0xFF, 0x9B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xA1, 0xFF, 0xDF, 0xFF, 0xC6, 0xFF, 0x9A, 0xFF, 0xC8, 0xFF, 0x66, 0xFF, 0xB1, 0xFF, 0xBC, 0xFF, 0xEA, 0xFF, 0xB0, 0x0, 0x12, 0x0, 0x13, 0xFF, 0x8F, 0xFF, 0xA9, 0xFF, 0xDC, 0xFF, 0xEF, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE4, 0x0, 0x12, 0x0, 0x0, 0xFF, 0xF2, 0x0, 0x0, 0xFF, 0x11, 0x0, 0x0, 0xFF, 0xEE, 0x0, 0x13, 0x0, 0x0, 0xFF, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x83, 0xFF, 0xF2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE8, 0xFF, 0xED, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x9F, 0xFF, 0xDC, 0xFF, 0xAA, 0xFF, 0x56, 0xFF, 0xB9, 0xFF, 0x84, 0xFF, 0x6F, 0xFF, 0xB3, 0xFF, 0xA7, 0x0, 0x0, 0x0, 0x11, 0x0, 0x11, 0xFF, 0x8C, 0xFF, 0xAD, 0xFF, 0xBF, 0xFF, 0xEF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xAC, 0x0, 0x10, 0x0, 0x0, 0xFF, 0xF0, 0xFF, 0xC6, 0xFE, 0xFC, 0xFF, 0x73, 0xFF, 0xEC, 0x0, 0x11, 0xFF, 0xB6, 0xFF, 0x11, 0x0, 0x0, 0xFF, 0x70, 0x0, 0x0, 0xFF, 0x28, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xB2, 0xFF, 0xB3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xD4, 0x0, 0x0, 0xFF, 0xEF, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE9, 0xFF, 0xE4, 0x0, 0x0, 0xFF, 0xE9, 0xFF, 0xEC, 0x0, 0xE, 0x0, 0x0, 0xFF, 0xEA, 0xFF, 0xE3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE4, 0xFF, 0xDE, 0x0, 0x0, 0xFF, 0xE6, 0xFF, 0xE9, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE5, 0xFF, 0xD8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0xF, 0x0, 0x0, 0xFF, 0x56, 0x0, 0x0, 0xFF, 0xC3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEA, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xD9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF4, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE9, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEC, 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x5F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF2, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF2, 0x0, 0x0, 0xFF, 0x53, 0xFF, 0xF4, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xC1, 0x0, 0x0, 0xFF, 0xDB, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x6A, 0xFE, 0x76, 0xFF, 0xA4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x2F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xBE, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF1, 0x0, 0x14, 0x0, 0x0, 0xFF, 0xF1, 0xFF, 0x7D, 0xFF, 0xE6, 0xFF, 0x2F, 0xFE, 0xEF, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xED, 0x0, 0x0, 0xFE, 0xE8, 0x0, 0x0, 0xFF, 0x97, 0xFF, 0xB1, 0xFF, 0xB7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x2E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xD3, 0x0, 0x0, 0xFF, 0xB6, 0x0, 0x0, 0xFF, 0xEA, 0xFF, 0xA7, 0x0, 0x0, 0xFF, 0x6F, 0xFF, 0xBF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xA6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xD8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF1, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xD4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xDF, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xDF, 0xFF, 0xEC, 0xFF, 0xC7, 0xFF, 0xDC, 0xFF, 0xE5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xF, 0x0, 0x0, 0xFF, 0xB5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xB1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xF2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE3, 0xFF, 0xA6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xDC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xD0, 0xFF, 0xED, 0x0, 0x0, 0xFF, 0xCE, 0xFF, 0xE2, 0xFF, 0x9D, 0xFF, 0xCE, 0xFF, 0xD6, 0xFF, 0xF4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x7E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xB2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x66, 0xFF, 0xEE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x70, 0xFF, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE4, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xB3, 0xFF, 0xC4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFB, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xA7, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xC9, 0x0, 0x0, 0xFF, 0xBC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFE, 0xE3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x48, 0xFF, 0xB9, 0xFF, 0x5A, 0xFF, 0x5B, 0xFF, 0x75, 0xFF, 0x3A, 0xFF, 0x53, 0x0, 0x0, 0xFF, 0x55, 0x0, 0x0, 0x0, 0x9, 0x0, 0x9, 0x0, 0x0, 0xFF, 0x60, 0xFF, 0x7D, 0xFF, 0xCF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x5E, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x8A, 0xFE, 0x61, 0xFE, 0xFC, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0xFE, 0x57, 0x0, 0x0, 0xFE, 0xF8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xEA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xAD, 0xFF, 0xB5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xD1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xC2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xE4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xB4, 0xFF, 0xE0, 0xFF, 0xB8, 0xFF, 0xAD, 0x0, 0x0, 0xFF, 0x85, 0xFF, 0xA4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x1E, 0x0, 0x0, 0xFF, 0xC4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xBB, 0xFE, 0xAB, 0xFF, 0xAE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x44, 0x0, 0x0, 0xFF, 0xE0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0x32, 0x0, 0x7, 0x0, 0xC, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2A, 0x0, 0x2D, 0x0, 0x2E, 0x0, 0x2F, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x39, 0x0, 0x3A, 0x0, 0x3B, 0x0, 0x3C, 0x0, 0x3D, 0x0, 0x3E, 0x0, 0x3F, 0x0, 0x46, 0x0, 0x47, 0x0, 0x48, 0x0, 0x4A, 0x0, 0x4D, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x57, 0x0, 0x5B, 0x0, 0x5D, 0x0, 0x5E, 0x0, 0x5F, 0x0, 0x8B, 0x0, 0x97, 0x0, 0x9A, 0x0, 0x9C, 0x0, 0x9D, 0x0, 0xA0, 0x0, 0xA1, 0x0, 0xA2, 0x0, 0xA5, 0x0, 0xA6, 0x0, 0xAE, 0x0, 0xB2, 0x0, 0xB3, 0x0, 0xB6, 0x0, 0xB8, 0x0, 0xC2, 0x0, 0xCA, 0x0, 0xD8, 0x0, 0xD9, 0x0, 0xDA, 0x0, 0xED, 0x0, 0xEE, 0x0, 0xF2, 0x0, 0xF8, 0x0, 0xFA, 0x1, 0x2, 0x1, 0x3, 0x2, 0x27, 0x2, 0x29, 0x2, 0x2A, 0x2, 0x2B, 0x2, 0x30, 0x2, 0x31, 0x2, 0x32, 0x2, 0x33, 0x2, 0x3C, 0x2, 0x40, 0x2, 0x46, 0x2, 0x4E, 0x2, 0x55, 0x2, 0x56, 0x2, 0x60, 0x2, 0x62, 0x2, 0x64, 0x2, 0x65, 0x2, 0x66, 0x2, 0x67, 0x2, 0x6A, 0x2, 0x6B, 0x2, 0x6D, 0x2, 0x70, 0x2, 0x72, 0x2, 0x73, 0x2, 0x74, 0x2, 0x76, 0x2, 0x77, 0x2, 0x78, 0x2, 0x79, 0x2, 0x7A, 0x2, 0x7B, 0x2, 0x7C, 0x2, 0x82, 0x2, 0x84, 0x2, 0x8D, 0x2, 0x92, 0x2, 0x94, 0x2, 0x95, 0x2, 0x9A, 0x2, 0x9B, 0x2, 0xA0, 0x2, 0xA3, 0x2, 0xAE, 0x2, 0xAF, 0x2, 0xB0, 0x2, 0xC5, 0x2, 0xC6, 0x2, 0xC7, 0x2, 0xCA, 0x2, 0xCB, 0x2, 0xCC, 0x2, 0xCE, 0x2, 0xD0, 0x2, 0xD2, 0x2, 0xDA, 0x2, 0xDB, 0x2, 0xEB, 0x2, 0xED, 0x2, 0xEF, 0x2, 0xF3, 0x2, 0xF4, 0x2, 0xF5, 0x3, 0x8, 0x3, 0x9, 0x3, 0xA, 0x3, 0xB, 0x3, 0xC, 0x3, 0xD, 0x3, 0xE, 0x3, 0x14, 0x3, 0x18, 0x3, 0x1A, 0x4, 0x2B, 0x4, 0x2D, 0x4, 0x34, 0x4, 0x5E, 0x4, 0x5F, 0x4, 0x62, 0x4, 0x63, 0x4, 0x64, 0x4, 0x65, 0x4, 0x66, 0x4, 0x67, 0x4, 0x68, 0x4, 0x6F, 0x4, 0x70, 0x5, 0x59, 0x5, 0x5B, 0x5, 0x5D, 0x5, 0x5E, 0x5, 0x5F, 0x5, 0x61, 0x5, 0x62, 0x5, 0x64, 0x5, 0x66, 0x5, 0x6A, 0x5, 0x70, 0x5, 0xD9, 0x5, 0xDA, 0x5, 0xDB, 0x5, 0xDC, 0x5, 0xE5, 0x5, 0xE7, 0x5, 0xE8, 0x5, 0xEB, 0x5, 0xEC, 0x5, 0xEF, 0x5, 0xF0, 0x5, 0xF1, 0x5, 0xF9, 0x5, 0xFD, 0x5, 0xFE, 0x5, 0xFF, 0x6, 0x0, 0x6, 0x1, 0x6, 0x2, 0x6, 0x3, 0x6, 0x4, 0x6, 0x5, 0x6, 0x6, 0x6, 0x25, 0x6, 0x26, 0x6, 0x29, 0x6, 0x2A, 0x6, 0x2E, 0x6, 0x31, 0x6, 0x32, 0x6, 0x33, 0x6, 0x5F, 0x6, 0x6A, 0x6, 0x6C, 0x6, 0x6E, 0x6, 0x70, 0x6, 0x71, 0x6, 0x72, 0x6, 0x73, 0x6, 0x75, 0x6, 0x76, 0x6, 0x78, 0x6, 0x7A, 0x6, 0x7C, 0x6, 0x86, 0x6, 0x87, 0x6, 0x88, 0x6, 0x89, 0x6, 0x8A, 0x6, 0x8B, 0x6, 0x8C, 0x6, 0x8D, 0x6, 0x96, 0x6, 0x97, 0x6, 0x9D, 0x6, 0x9F, 0x6, 0xBB, 0x6, 0xC7, 0x6, 0xC9, 0x6, 0xCD, 0x6, 0xCE, 0x6, 0xE1, 0x7, 0x54, 0x7, 0x59, 0x7, 0x5C, 0x7, 0x5D, 0x7, 0x67, 0x7, 0x68, 0x7, 0x69, 0x7, 0x7B, 0x7, 0x8A, 0x7, 0x8B, 0x7, 0x8C, 0x7, 0xAE, 0x7, 0xB1, 0x7, 0xCF, 0x7, 0xD1, 0x7, 0xD2, 0x8, 0xC7, 0x8, 0xC8, 0x8, 0xC9, 0x8, 0xCB, 0x8, 0xCD, 0x8, 0xCE, 0x8, 0xCF, 0x8, 0xD0, 0x8, 0xD1, 0x8, 0xD2, 0x8, 0xD3, 0x8, 0xD4, 0x8, 0xD5, 0x8, 0xD6, 0x8, 0xD7, 0x8, 0xD8, 0x8, 0xD9, 0x8, 0xDA, 0x8, 0xDB, 0x8, 0xDC, 0x8, 0xDD, 0x8, 0xDE, 0x8, 0xDF, 0x8, 0xE0, 0x8, 0xE1, 0x8, 0xE2, 0x8, 0xE3, 0x8, 0xE4, 0x8, 0xE5, 0x8, 0xE6, 0x8, 0xE7, 0x8, 0xE8, 0x8, 0xE9, 0x8, 0xEA, 0x8, 0xEB, 0x8, 0xEC, 0x8, 0xED, 0x8, 0xEE, 0x8, 0xEF, 0x8, 0xF0, 0x8, 0xF1, 0x8, 0xF2, 0x8, 0xF3, 0x8, 0xF8, 0x8, 0xF9, 0x8, 0xFA, 0x8, 0xFB, 0x8, 0xFC, 0x8, 0xFD, 0x9, 0x2, 0x9, 0x3, 0x9, 0x4, 0x9, 0x5, 0x9, 0x6, 0x9, 0x7, 0x9, 0x8, 0x9, 0x9, 0x9, 0xA, 0x9, 0xB, 0x9, 0xC, 0x9, 0xD, 0x9, 0xE, 0x9, 0xF, 0x9, 0x10, 0x9, 0x11, 0x9, 0x12, 0x9, 0x14, 0x9, 0x15, 0x9, 0x16, 0x9, 0x17, 0x9, 0x18, 0x9, 0x19, 0x9, 0x1A, 0x9, 0x1B, 0x9, 0x1C, 0x9, 0x1D, 0x9, 0x26, 0x9, 0x27, 0x9, 0x28, 0x9, 0x2A, 0x9, 0x2C, 0x9, 0x2E, 0x9, 0x30, 0x9, 0x33, 0x9, 0x35, 0x9, 0x37, 0x9, 0x39, 0x9, 0x3B, 0x9, 0x3D, 0x9, 0x3F, 0x9, 0x40, 0x9, 0x41, 0x9, 0x42, 0x9, 0x43, 0x9, 0x44, 0x9, 0x45, 0x9, 0x46, 0x9, 0x47, 0x9, 0x48, 0x9, 0x49, 0x9, 0x4A, 0x9, 0x4B, 0x9, 0x4D, 0x9, 0x4F, 0x9, 0x51, 0x9, 0x5C, 0x9, 0x5E, 0x9, 0x60, 0x9, 0x62, 0x9, 0x64, 0x9, 0x66, 0x9, 0x68, 0x9, 0x6A, 0x9, 0x6C, 0x9, 0x6E, 0x9, 0x70, 0x9, 0x71, 0x9, 0x72, 0x9, 0x73, 0x9, 0x74, 0x9, 0x75, 0x9, 0x76, 0x9, 0x77, 0x9, 0x78, 0x9, 0x7D, 0x9, 0x7E, 0x9, 0x7F, 0x9, 0x80, 0x9, 0x81, 0x9, 0x82, 0x9, 0x83, 0x9, 0x84, 0x9, 0x85, 0x9, 0x86, 0x9, 0x91, 0x9, 0x92, 0x9, 0x93, 0x9, 0x94, 0x9, 0x95, 0x9, 0x9B, 0x9, 0x9C, 0x9, 0x9D, 0x9, 0xA2, 0x9, 0xB3, 0x9, 0xB4, 0x9, 0xB5, 0x9, 0xB6, 0x9, 0xB7, 0x9, 0xBB, 0x9, 0xBC, 0x9, 0xBD, 0x9, 0xBE, 0x9, 0xC7, 0x9, 0xD5, 0x9, 0xD6, 0x9, 0xD7, 0x9, 0xD8, 0x9, 0xD9, 0x9, 0xDA, 0x9, 0xDD, 0x9, 0xDE, 0x9, 0xDF, 0x9, 0xE0, 0x9, 0xE1, 0x9, 0xE2, 0x9, 0xE3, 0x9, 0xE4, 0x9, 0xE5, 0x9, 0xE6, 0x9, 0xE7, 0x9, 0xE8, 0x9, 0xE9, 0x9, 0xEA, 0x9, 0xEB, 0x9, 0xEC, 0x9, 0xEF, 0x9, 0xF3, 0x9, 0xF5, 0x9, 0xF9, 0x9, 0xFC, 0x9, 0xFD, 0x9, 0xFF, 0xA, 0x0, 0xA, 0x1, 0xA, 0x2, 0xA, 0x3, 0xA, 0x4, 0xA, 0x5, 0xA, 0x6, 0xA, 0x7, 0xA, 0x8, 0xA, 0xA, 0xA, 0xB, 0xA, 0xC, 0xA, 0xE, 0xA, 0xF, 0xA, 0x10, 0xA, 0x11, 0xA, 0x12, 0xA, 0x13, 0xA, 0x15, 0xA, 0x16, 0xA, 0x17, 0xA, 0x18, 0xA, 0x19, 0xA, 0x1A, 0xA, 0x1B, 0xA, 0x21, 0xA, 0x22, 0xA, 0x24, 0xA, 0x26, 0xA, 0x28, 0xA, 0x29, 0xA, 0x2A, 0xA, 0x2B, 0xA, 0x2E, 0xA, 0x2F, 0xA, 0x30, 0xA, 0x31, 0xA, 0x32, 0xA, 0x33, 0xA, 0x35, 0xA, 0x39, 0xA, 0x3A, 0xA, 0x3F, 0xA, 0x40, 0xA, 0x41, 0xA, 0x42, 0xA, 0x43, 0xA, 0x44, 0xA, 0x45, 0xA, 0x46, 0xA, 0x47, 0xA, 0x48, 0xA, 0x49, 0xA, 0x4A, 0xA, 0x4D, 0xA, 0x4E, 0xA, 0x50, 0xA, 0x51, 0xA, 0x52, 0xA, 0x53, 0xA, 0x5A, 0xA, 0x5B, 0xA, 0x5E, 0xA, 0x60, 0xA, 0x62, 0xA, 0x63, 0xA, 0x64, 0xA, 0x65, 0xA, 0x66, 0xA, 0x67, 0xA, 0x68, 0xA, 0x6E, 0xA, 0x6F, 0xA, 0x70, 0xA, 0x71, 0xA, 0x72, 0xA, 0x73, 0xA, 0x74, 0xA, 0x75, 0xA, 0x76, 0xA, 0x77, 0xA, 0x78, 0xA, 0x79, 0xA, 0x7A, 0xA, 0x7B, 0xA, 0x7C, 0xA, 0x7D, 0xA, 0x7E, 0xA, 0x7F, 0xA, 0x80, 0xA, 0x81, 0xA, 0x82, 0xA, 0x83, 0xA, 0x84, 0xA, 0x85, 0xA, 0x86, 0xA, 0x87, 0xA, 0x88, 0xA, 0x89, 0xA, 0x8A, 0xA, 0x8B, 0xA, 0x8C, 0xA, 0x8D, 0xA, 0x8E, 0xA, 0x8F, 0xA, 0x90, 0xA, 0x91, 0xA, 0x92, 0xA, 0x93, 0xA, 0x94, 0xA, 0x95, 0xA, 0x96, 0xA, 0x98, 0xA, 0x9A, 0xA, 0x9B, 0xA, 0x9C, 0xA, 0x9D, 0xA, 0x9E, 0xA, 0x9F, 0xA, 0xA0, 0xA, 0xA1, 0xA, 0xA2, 0xA, 0xA3, 0xA, 0xA4, 0xA, 0xA5, 0xA, 0xA6, 0xA, 0xA7, 0xA, 0xAF, 0xA, 0xB2, 0xA, 0xB4, 0xA, 0xC0, 0xA, 0xC1, 0xA, 0xC2, 0xA, 0xC3, 0xA, 0xC4, 0xA, 0xC5, 0xA, 0xC7, 0xA, 0xCB, 0xA, 0xCC, 0xA, 0xCF, 0xA, 0xD1, 0xA, 0xD2, 0xA, 0xD4, 0xA, 0xD6, 0xA, 0xDC, 0xA, 0xE6, 0xA, 0xEE, 0xA, 0xEF, 0xA, 0xF0, 0xA, 0xF2, 0xA, 0xF3, 0xA, 0xF4, 0xA, 0xF6, 0xA, 0xF8, 0xA, 0xFA, 0xA, 0xFC, 0xA, 0xFF, 0xB, 0x0, 0xB, 0x1, 0xB, 0x2, 0xB, 0x4, 0xB, 0x9, 0xB, 0xA, 0xB, 0xB, 0xB, 0xC, 0xB, 0xD, 0xB, 0xE, 0xB, 0xF, 0xB, 0x12, 0xB, 0x13, 0xB, 0x14, 0xB, 0x15, 0xB, 0x16, 0xB, 0x17, 0xB, 0x18, 0xB, 0x1A, 0xB, 0x1C, 0xB, 0x1E, 0xB, 0x20, 0xB, 0x21, 0xB, 0x22, 0xB, 0x23, 0xB, 0x25, 0xB, 0x27, 0xB, 0x2C, 0xB, 0x2E, 0xB, 0x2F, 0xB, 0x30, 0xB, 0x32, 0xB, 0x33, 0xB, 0x34, 0xB, 0x35, 0xB, 0x36, 0xB, 0x37, 0xB, 0x38, 0xB, 0x39, 0xB, 0x3B, 0xB, 0x3C, 0xB, 0x42, 0xB, 0x46, 0xB, 0x47, 0xB, 0x48, 0xB, 0x4B, 0xB, 0x4D, 0xB, 0x4E, 0xB, 0x4F, 0xB, 0x50, 0xB, 0x51, 0xB, 0x52, 0xB, 0x53, 0xB, 0x54, 0xB, 0x55, 0xB, 0x57, 0xB, 0x59, 0xB, 0x5B, 0xB, 0x5D, 0xB, 0x5F, 0xB, 0x60, 0xB, 0x61, 0xB, 0x62, 0xB, 0x63, 0xB, 0x64, 0xB, 0x65, 0xB, 0x66, 0xB, 0x67, 0xB, 0x68, 0xB, 0x6D, 0xB, 0x6E, 0xB, 0x6F, 0xB, 0x70, 0xB, 0x71, 0xB, 0x72, 0xB, 0x73, 0xB, 0x74, 0xB, 0x75, 0xB, 0x77, 0xB, 0x79, 0xB, 0x7B, 0xB, 0x7D, 0xB, 0x7F, 0xB, 0x81, 0xB, 0x83, 0xB, 0x84, 0xB, 0x85, 0xB, 0x86, 0xB, 0x87, 0xB, 0x88, 0xB, 0x89, 0xB, 0x8A, 0xB, 0x8B, 0xB, 0x8C, 0xB, 0x8D, 0xB, 0x8E, 0xB, 0x8F, 0xB, 0x90, 0xB, 0x91, 0xB, 0x92, 0xB, 0x93, 0xB, 0x94, 0xB, 0x95, 0xB, 0x96, 0xB, 0x97, 0xB, 0x98, 0xB, 0x99, 0xB, 0x9A, 0xB, 0x9C, 0xB, 0x9E, 0xB, 0xA0, 0xB, 0xA2, 0xB, 0xAD, 0xB, 0xAF, 0xB, 0xB1, 0xB, 0xB3, 0xB, 0xB5, 0xB, 0xB7, 0xB, 0xB9, 0xB, 0xBB, 0xB, 0xBD, 0xB, 0xBF, 0xB, 0xC0, 0xB, 0xC1, 0xB, 0xC2, 0xB, 0xC3, 0xB, 0xC5, 0xB, 0xC7, 0xB, 0xC8, 0xB, 0xC9, 0xB, 0xCA, 0xB, 0xCB, 0xB, 0xCC, 0xB, 0xCD, 0xB, 0xCE, 0xB, 0xCF, 0xB, 0xD0, 0xB, 0xD1, 0xB, 0xD2, 0xB, 0xD6, 0xB, 0xE0, 0xB, 0xE1, 0xB, 0xE2, 0xB, 0xE3, 0xB, 0xE4, 0xB, 0xE5, 0xB, 0xE6, 0xB, 0xE7, 0xB, 0xEE, 0xB, 0xEF, 0xB, 0xF0, 0xB, 0xF1, 0xB, 0xF2, 0xB, 0xF3, 0xB, 0xF4, 0xB, 0xF5, 0xB, 0xF6, 0xB, 0xF7, 0xB, 0xF8, 0xB, 0xF9, 0xB, 0xFA, 0xB, 0xFB, 0xB, 0xFC, 0xB, 0xFD, 0xB, 0xFE, 0xB, 0xFF, 0xC, 0x0, 0xC, 0x1, 0xC, 0x2, 0xC, 0x3, 0xC, 0x14, 0xC, 0x15, 0xC, 0x16, 0xC, 0x17, 0xC, 0x18, 0xC, 0x19, 0xC, 0x1A, 0xC, 0x1B, 0xC, 0x1C, 0xC, 0x1D, 0xC, 0x1E, 0xC, 0x1F, 0xC, 0x40, 0xC, 0x41, 0xC, 0x44, 0xC, 0x45, 0xC, 0x52, 0xC, 0x53, 0xC, 0x54, 0xC, 0x55, 0xC, 0x56, 0xC, 0x57, 0xC, 0x58, 0xC, 0x59, 0xC, 0x62, 0xC, 0x63, 0xC, 0x64, 0xC, 0x65, 0xC, 0x66, 0xC, 0x67, 0xC, 0x68, 0xC, 0x69, 0xC, 0x81, 0xC, 0x82, 0xC, 0x83, 0xC, 0x84, 0xC, 0x85, 0xC, 0x86, 0xC, 0x87, 0xC, 0x88, 0xC, 0x89, 0xC, 0x8A, 0xC, 0x8B, 0xC, 0x8C, 0xC, 0x8D, 0xC, 0x8E, 0xC, 0x8F, 0xC, 0x9E, 0xC, 0x9F, 0xC, 0xA2, 0xC, 0xA3, 0xC, 0xA4, 0xC, 0xA5, 0xC, 0xA6, 0xC, 0xAC, 0xC, 0xAD, 0xC, 0xB7, 0xC, 0xBB, 0xC, 0xBE, 0xC, 0xC4, 0xC, 0xC9, 0xC, 0xD4, 0xC, 0xD6, 0xC, 0xDD, 0xC, 0xE1, 0x0, 0x2, 0x2, 0x59, 0x0, 0x7, 0x0, 0x7, 0x0, 0x19, 0x0, 0xC, 0x0, 0xC, 0x0, 0x19, 0x0, 0x11, 0x0, 0x11, 0x0, 0x21, 0x0, 0x12, 0x0, 0x12, 0x0, 0x25, 0x0, 0x13, 0x0, 0x13, 0x0, 0x21, 0x0, 0x26, 0x0, 0x26, 0x0, 0x2, 0x0, 0x27, 0x0, 0x27, 0x0, 0x1C, 0x0, 0x28, 0x0, 0x28, 0x0, 0x13, 0x0, 0x29, 0x0, 0x29, 0x0, 0x1, 0x0, 0x2A, 0x0, 0x2A, 0x0, 0x5, 0x0, 0x2F, 0x0, 0x2F, 0x0, 0xA, 0x0, 0x30, 0x0, 0x30, 0x0, 0xB, 0x0, 0x31, 0x0, 0x31, 0x0, 0x18, 0x0, 0x34, 0x0, 0x34, 0x0, 0x1, 0x0, 0x35, 0x0, 0x35, 0x0, 0x16, 0x0, 0x39, 0x0, 0x39, 0x0, 0xE, 0x0, 0x3A, 0x0, 0x3A, 0x0, 0xA, 0x0, 0x3B, 0x0, 0x3B, 0x0, 0x1D, 0x0, 0x3C, 0x0, 0x3C, 0x0, 0x1B, 0x0, 0x3D, 0x0, 0x3D, 0x0, 0x12, 0x0, 0x3E, 0x0, 0x3E, 0x0, 0xC, 0x0, 0x3F, 0x0, 0x3F, 0x0, 0x11, 0x0, 0x46, 0x0, 0x46, 0x0, 0x6, 0x0, 0x47, 0x0, 0x47, 0x0, 0x7, 0x0, 0x48, 0x0, 0x48, 0x0, 0x17, 0x0, 0x4A, 0x0, 0x4A, 0x0, 0x8, 0x0, 0x4D, 0x0, 0x4D, 0x0, 0x4, 0x0, 0x52, 0x0, 0x53, 0x0, 0x4, 0x0, 0x54, 0x0, 0x54, 0x0, 0x3, 0x0, 0x55, 0x0, 0x55, 0x0, 0x7, 0x0, 0x57, 0x0, 0x57, 0x0, 0x15, 0x0, 0x5B, 0x0, 0x5B, 0x0, 0x9, 0x0, 0x5D, 0x0, 0x5D, 0x0, 0x14, 0x0, 0x5E, 0x0, 0x5E, 0x0, 0x9, 0x0, 0x5F, 0x0, 0x5F, 0x0, 0x10, 0x0, 0x8B, 0x0, 0x8B, 0x0, 0x7, 0x0, 0x97, 0x0, 0x97, 0x0, 0x7, 0x0, 0x9A, 0x0, 0x9A, 0x0, 0x7, 0x0, 0x9C, 0x0, 0x9C, 0x0, 0x7, 0x0, 0x9D, 0x0, 0x9D, 0x0, 0x1, 0x0, 0xA0, 0x0, 0xA1, 0x0, 0x1, 0x0, 0xA6, 0x0, 0xA6, 0x0, 0x1, 0x0, 0xAE, 0x0, 0xAE, 0x0, 0xB, 0x0, 0xB8, 0x0, 0xB8, 0x0, 0x16, 0x0, 0xC2, 0x0, 0xC2, 0x0, 0xE, 0x0, 0xCA, 0x0, 0xCA, 0x0, 0x10, 0x0, 0xD8, 0x0, 0xD8, 0x0, 0x11, 0x0, 0xD9, 0x0, 0xDA, 0x0, 0x10, 0x0, 0xED, 0x0, 0xEE, 0x0, 0x7, 0x0, 0xF2, 0x0, 0xF2, 0x0, 0x18, 0x0, 0xF8, 0x0, 0xF8, 0x0, 0x1C, 0x0, 0xFA, 0x0, 0xFA, 0x0, 0x2, 0x1, 0x2, 0x1, 0x2, 0x0, 0x15, 0x1, 0x3, 0x1, 0x3, 0x0, 0xC, 0x2, 0x29, 0x2, 0x29, 0x0, 0x7, 0x2, 0x2A, 0x2, 0x2A, 0x0, 0x17, 0x2, 0x2B, 0x2, 0x2B, 0x0, 0x7, 0x2, 0x30, 0x2, 0x30, 0x0, 0x22, 0x2, 0x31, 0x2, 0x31, 0x0, 0x2, 0x2, 0x32, 0x2, 0x32, 0x0, 0x1, 0x2, 0x33, 0x2, 0x33, 0x0, 0x2, 0x2, 0x3C, 0x2, 0x3C, 0x0, 0x9, 0x2, 0x40, 0x2, 0x40, 0x0, 0x4, 0x2, 0x46, 0x2, 0x46, 0x0, 0x7, 0x2, 0x4E, 0x2, 0x4E, 0x0, 0xB, 0x2, 0x55, 0x2, 0x55, 0x0, 0x1, 0x2, 0x56, 0x2, 0x56, 0x0, 0x3, 0x2, 0x60, 0x2, 0x60, 0x0, 0x7, 0x2, 0x62, 0x2, 0x62, 0x0, 0x7, 0x2, 0x64, 0x2, 0x64, 0x0, 0x7, 0x2, 0x65, 0x2, 0x65, 0x0, 0x1, 0x2, 0x66, 0x2, 0x66, 0x0, 0x13, 0x2, 0x67, 0x2, 0x67, 0x0, 0x1, 0x2, 0x6A, 0x2, 0x6B, 0x0, 0x20, 0x2, 0x70, 0x2, 0x70, 0x0, 0x12, 0x2, 0x74, 0x2, 0x74, 0x0, 0x26, 0x2, 0x7A, 0x2, 0x7A, 0x0, 0x20, 0x2, 0x7C, 0x2, 0x7C, 0x0, 0x20, 0x2, 0x82, 0x2, 0x82, 0x0, 0x1A, 0x2, 0x84, 0x2, 0x84, 0x0, 0x14, 0x2, 0x8D, 0x2, 0x8D, 0x0, 0x7, 0x2, 0x92, 0x2, 0x92, 0x0, 0x1F, 0x2, 0x94, 0x2, 0x94, 0x0, 0x1F, 0x2, 0x95, 0x2, 0x95, 0x0, 0x7, 0x2, 0x9A, 0x2, 0x9B, 0x0, 0x1F, 0x2, 0xA0, 0x2, 0xA0, 0x0, 0x1F, 0x2, 0xA3, 0x2, 0xA3, 0x0, 0x2, 0x2, 0xAE, 0x2, 0xAE, 0x0, 0x3, 0x2, 0xAF, 0x2, 0xAF, 0x0, 0x1D, 0x2, 0xB0, 0x2, 0xB0, 0x0, 0x9, 0x2, 0xC5, 0x2, 0xC5, 0x0, 0x7, 0x2, 0xC6, 0x2, 0xC6, 0x0, 0x22, 0x2, 0xC7, 0x2, 0xC7, 0x0, 0x1A, 0x2, 0xCA, 0x2, 0xCA, 0x0, 0x12, 0x2, 0xCB, 0x2, 0xCB, 0x0, 0x14, 0x2, 0xCC, 0x2, 0xCC, 0x0, 0xB, 0x2, 0xCE, 0x2, 0xCE, 0x0, 0xB, 0x2, 0xD0, 0x2, 0xD0, 0x0, 0xB, 0x2, 0xDA, 0x2, 0xDA, 0x0, 0x12, 0x2, 0xDB, 0x2, 0xDB, 0x0, 0x14, 0x2, 0xEF, 0x2, 0xEF, 0x0, 0x1, 0x2, 0xF3, 0x2, 0xF3, 0x0, 0x1A, 0x2, 0xF4, 0x2, 0xF4, 0x0, 0x12, 0x2, 0xF5, 0x2, 0xF5, 0x0, 0x14, 0x3, 0x8, 0x3, 0x8, 0x0, 0x12, 0x3, 0x9, 0x3, 0x9, 0x0, 0x14, 0x3, 0xA, 0x3, 0xA, 0x0, 0x12, 0x3, 0xB, 0x3, 0xB, 0x0, 0x14, 0x3, 0xC, 0x3, 0xC, 0x0, 0x5, 0x3, 0xD, 0x3, 0xD, 0x0, 0x8, 0x3, 0xE, 0x3, 0xE, 0x0, 0xB, 0x3, 0x1A, 0x3, 0x1A, 0x0, 0xB, 0x4, 0x34, 0x4, 0x34, 0x0, 0x18, 0x4, 0x5E, 0x4, 0x5F, 0x0, 0x25, 0x4, 0x62, 0x4, 0x63, 0x0, 0x19, 0x4, 0x64, 0x4, 0x64, 0x0, 0x21, 0x4, 0x65, 0x4, 0x67, 0x0, 0x19, 0x4, 0x68, 0x4, 0x68, 0x0, 0x21, 0x4, 0x6F, 0x4, 0x70, 0x0, 0x21, 0x5, 0x59, 0x5, 0x59, 0x0, 0x16, 0x5, 0x5B, 0x5, 0x5B, 0x0, 0x6, 0x5, 0x5E, 0x5, 0x5E, 0x0, 0x4, 0x5, 0x5F, 0x5, 0x5F, 0x0, 0xB, 0x5, 0x61, 0x5, 0x61, 0x0, 0x11, 0x5, 0x62, 0x5, 0x62, 0x0, 0x10, 0x5, 0x66, 0x5, 0x66, 0x0, 0x1, 0x5, 0x6A, 0x5, 0x6A, 0x0, 0x9, 0x5, 0x70, 0x5, 0x70, 0x0, 0x3, 0x5, 0xD9, 0x5, 0xD9, 0x0, 0x11, 0x5, 0xDA, 0x5, 0xDA, 0x0, 0x10, 0x5, 0xDB, 0x5, 0xDB, 0x0, 0x11, 0x5, 0xDC, 0x5, 0xDC, 0x0, 0x10, 0x5, 0xE5, 0x5, 0xE5, 0x0, 0x1, 0x5, 0xE7, 0x5, 0xE7, 0x0, 0x20, 0x5, 0xE8, 0x5, 0xE8, 0x0, 0x1F, 0x5, 0xEB, 0x5, 0xEB, 0x0, 0x20, 0x5, 0xEC, 0x5, 0xEC, 0x0, 0x1F, 0x5, 0xEF, 0x5, 0xEF, 0x0, 0x2, 0x5, 0xF0, 0x5, 0xF0, 0x0, 0x6, 0x5, 0xF1, 0x5, 0xF1, 0x0, 0x2, 0x5, 0xFD, 0x5, 0xFD, 0x0, 0xE, 0x5, 0xFE, 0x5, 0xFE, 0x0, 0x1A, 0x5, 0xFF, 0x5, 0xFF, 0x0, 0xE, 0x6, 0x0, 0x6, 0x0, 0x0, 0x1A, 0x6, 0x1, 0x6, 0x1, 0x0, 0x1, 0x6, 0x2, 0x6, 0x2, 0x0, 0x3, 0x6, 0x3, 0x6, 0x3, 0x0, 0x1, 0x6, 0x4, 0x6, 0x4, 0x0, 0x3, 0x6, 0x5, 0x6, 0x5, 0x0, 0x1, 0x6, 0x6, 0x6, 0x6, 0x0, 0x3, 0x6, 0x25, 0x6, 0x25, 0x0, 0xE, 0x6, 0x26, 0x6, 0x26, 0x0, 0x1A, 0x6, 0x29, 0x6, 0x29, 0x0, 0xE, 0x6, 0x2A, 0x6, 0x2A, 0x0, 0x1A, 0x6, 0x2E, 0x6, 0x2E, 0x0, 0x4, 0x6, 0x31, 0x6, 0x31, 0x0, 0x1, 0x6, 0x32, 0x6, 0x32, 0x0, 0x3, 0x6, 0x33, 0x6, 0x33, 0x0, 0x1, 0x6, 0x5F, 0x6, 0x5F, 0x0, 0x4, 0x6, 0x6A, 0x6, 0x6A, 0x0, 0x2, 0x6, 0x6C, 0x6, 0x6C, 0x0, 0x1, 0x6, 0x6E, 0x6, 0x6E, 0x0, 0xA, 0x6, 0x70, 0x6, 0x70, 0x0, 0x1D, 0x6, 0x71, 0x6, 0x71, 0x0, 0x9, 0x6, 0x72, 0x6, 0x72, 0x0, 0x1D, 0x6, 0x73, 0x6, 0x73, 0x0, 0x9, 0x6, 0x75, 0x6, 0x75, 0x0, 0x9, 0x6, 0x76, 0x6, 0x76, 0x0, 0x1, 0x6, 0x78, 0x6, 0x78, 0x0, 0xB, 0x6, 0x7A, 0x6, 0x7A, 0x0, 0xB, 0x6, 0x7C, 0x6, 0x7C, 0x0, 0xB, 0x6, 0x86, 0x6, 0x86, 0x0, 0x1, 0x6, 0x87, 0x6, 0x87, 0x0, 0x3, 0x6, 0x88, 0x6, 0x88, 0x0, 0x16, 0x6, 0x89, 0x6, 0x89, 0x0, 0x7, 0x6, 0x8A, 0x6, 0x8A, 0x0, 0x16, 0x6, 0x8B, 0x6, 0x8B, 0x0, 0x7, 0x6, 0x8C, 0x6, 0x8C, 0x0, 0x16, 0x6, 0x8D, 0x6, 0x8D, 0x0, 0x7, 0x6, 0x96, 0x6, 0x96, 0x0, 0x1D, 0x6, 0x97, 0x6, 0x97, 0x0, 0x9, 0x6, 0x9D, 0x6, 0x9D, 0x0, 0x7, 0x6, 0x9F, 0x6, 0x9F, 0x0, 0x7, 0x6, 0xBB, 0x6, 0xBB, 0x0, 0x4, 0x6, 0xC9, 0x6, 0xC9, 0x0, 0x13, 0x6, 0xCD, 0x6, 0xCD, 0x0, 0x1C, 0x6, 0xCE, 0x6, 0xCE, 0x0, 0x7, 0x7, 0x54, 0x7, 0x54, 0x0, 0x23, 0x7, 0x59, 0x7, 0x59, 0x0, 0xD, 0x7, 0x5C, 0x7, 0x5C, 0x0, 0x24, 0x7, 0x5D, 0x7, 0x5D, 0x0, 0x1E, 0x7, 0x67, 0x7, 0x67, 0x0, 0xF, 0x7, 0x68, 0x7, 0x68, 0x0, 0xD, 0x7, 0x69, 0x7, 0x69, 0x0, 0xF, 0x7, 0x7B, 0x7, 0x7B, 0x0, 0x1E, 0x7, 0x8A, 0x7, 0x8C, 0x0, 0x1E, 0x7, 0xAE, 0x7, 0xAE, 0x0, 0xD, 0x7, 0xB1, 0x7, 0xB1, 0x0, 0xF, 0x7, 0xCF, 0x7, 0xCF, 0x0, 0x13, 0x7, 0xD1, 0x7, 0xD2, 0x0, 0x1, 0x8, 0xC7, 0x8, 0xC7, 0x0, 0x25, 0x8, 0xC8, 0x8, 0xC9, 0x0, 0x1, 0x8, 0xCB, 0x8, 0xCB, 0x0, 0xE, 0x8, 0xCD, 0x8, 0xD3, 0x0, 0x2, 0x8, 0xD4, 0x8, 0xD4, 0x0, 0x13, 0x8, 0xD5, 0x8, 0xD8, 0x0, 0x5, 0x8, 0xDE, 0x8, 0xE2, 0x0, 0x1, 0x8, 0xE3, 0x8, 0xE6, 0x0, 0xA, 0x8, 0xE7, 0x8, 0xE7, 0x0, 0xC, 0x8, 0xE8, 0x8, 0xEE, 0x0, 0x6, 0x8, 0xEF, 0x8, 0xEF, 0x0, 0x17, 0x8, 0xF0, 0x8, 0xF3, 0x0, 0x8, 0x8, 0xF8, 0x8, 0xF8, 0x0, 0x4, 0x8, 0xF9, 0x8, 0xFD, 0x0, 0x3, 0x9, 0x2, 0x9, 0x3, 0x0, 0x9, 0x9, 0x4, 0x9, 0x4, 0x0, 0x2, 0x9, 0x5, 0x9, 0x5, 0x0, 0x6, 0x9, 0x6, 0x9, 0x6, 0x0, 0x2, 0x9, 0x7, 0x9, 0x7, 0x0, 0x6, 0x9, 0x8, 0x9, 0x8, 0x0, 0x2, 0x9, 0x9, 0x9, 0x9, 0x0, 0x6, 0x9, 0xA, 0x9, 0xA, 0x0, 0x13, 0x9, 0xB, 0x9, 0xB, 0x0, 0x17, 0x9, 0xC, 0x9, 0xC, 0x0, 0x13, 0x9, 0xD, 0x9, 0xD, 0x0, 0x17, 0x9, 0xE, 0x9, 0xE, 0x0, 0x13, 0x9, 0xF, 0x9, 0xF, 0x0, 0x17, 0x9, 0x10, 0x9, 0x10, 0x0, 0x13, 0x9, 0x11, 0x9, 0x11, 0x0, 0x17, 0x9, 0x12, 0x9, 0x12, 0x0, 0x1, 0x9, 0x14, 0x9, 0x14, 0x0, 0x5, 0x9, 0x15, 0x9, 0x15, 0x0, 0x8, 0x9, 0x16, 0x9, 0x16, 0x0, 0x5, 0x9, 0x17, 0x9, 0x17, 0x0, 0x8, 0x9, 0x18, 0x9, 0x18, 0x0, 0x5, 0x9, 0x19, 0x9, 0x19, 0x0, 0x8, 0x9, 0x1A, 0x9, 0x1A, 0x0, 0x5, 0x9, 0x1B, 0x9, 0x1B, 0x0, 0x8, 0x9, 0x1C, 0x9, 0x1C, 0x0, 0x5, 0x9, 0x1D, 0x9, 0x1D, 0x0, 0x8, 0x9, 0x27, 0x9, 0x27, 0x0, 0x4, 0x9, 0x33, 0x9, 0x33, 0x0, 0xA, 0x9, 0x35, 0x9, 0x35, 0x0, 0xB, 0x9, 0x37, 0x9, 0x37, 0x0, 0x18, 0x9, 0x39, 0x9, 0x39, 0x0, 0x18, 0x9, 0x3B, 0x9, 0x3B, 0x0, 0x18, 0x9, 0x3D, 0x9, 0x3D, 0x0, 0x18, 0x9, 0x40, 0x9, 0x40, 0x0, 0x4, 0x9, 0x42, 0x9, 0x42, 0x0, 0x4, 0x9, 0x44, 0x9, 0x45, 0x0, 0x4, 0x9, 0x46, 0x9, 0x46, 0x0, 0x1, 0x9, 0x47, 0x9, 0x47, 0x0, 0x3, 0x9, 0x48, 0x9, 0x48, 0x0, 0x1, 0x9, 0x49, 0x9, 0x49, 0x0, 0x3, 0x9, 0x4A, 0x9, 0x4A, 0x0, 0x1, 0x9, 0x4B, 0x9, 0x4B, 0x0, 0x3, 0x9, 0x4D, 0x9, 0x4D, 0x0, 0x15, 0x9, 0x4F, 0x9, 0x4F, 0x0, 0x15, 0x9, 0x51, 0x9, 0x51, 0x0, 0x15, 0x9, 0x5C, 0x9, 0x5C, 0x0, 0xE, 0x9, 0x5E, 0x9, 0x5E, 0x0, 0xE, 0x9, 0x60, 0x9, 0x60, 0x0, 0xE, 0x9, 0x62, 0x9, 0x62, 0x0, 0xA, 0x9, 0x64, 0x9, 0x64, 0x0, 0xA, 0x9, 0x66, 0x9, 0x66, 0x0, 0xA, 0x9, 0x68, 0x9, 0x68, 0x0, 0xA, 0x9, 0x6A, 0x9, 0x6A, 0x0, 0xA, 0x9, 0x6C, 0x9, 0x6C, 0x0, 0xA, 0x9, 0x6E, 0x9, 0x6E, 0x0, 0x1B, 0x9, 0x70, 0x9, 0x70, 0x0, 0xC, 0x9, 0x71, 0x9, 0x71, 0x0, 0x9, 0x9, 0x72, 0x9, 0x72, 0x0, 0xC, 0x9, 0x73, 0x9, 0x73, 0x0, 0x11, 0x9, 0x74, 0x9, 0x74, 0x0, 0x10, 0x9, 0x75, 0x9, 0x75, 0x0, 0x11, 0x9, 0x76, 0x9, 0x76, 0x0, 0x10, 0x9, 0x77, 0x9, 0x77, 0x0, 0x11, 0x9, 0x78, 0x9, 0x78, 0x0, 0x10, 0x9, 0x7D, 0x9, 0x7E, 0x0, 0xD, 0x9, 0x7F, 0x9, 0x7F, 0x0, 0x23, 0x9, 0x80, 0x9, 0x86, 0x0, 0xF, 0x9, 0x91, 0x9, 0x95, 0x0, 0xD, 0x9, 0x9B, 0x9, 0x9D, 0x0, 0xF, 0x9, 0xA2, 0x9, 0xA2, 0x0, 0xD, 0x9, 0xB3, 0x9, 0xB3, 0x0, 0x1E, 0x9, 0xB4, 0x9, 0xB7, 0x0, 0x24, 0x9, 0xBB, 0x9, 0xBE, 0x0, 0xD, 0x9, 0xC7, 0x9, 0xC7, 0x0, 0x23, 0x9, 0xD5, 0x9, 0xD5, 0x0, 0x2, 0x9, 0xD6, 0x9, 0xD6, 0x0, 0x5, 0x9, 0xD9, 0x9, 0xD9, 0x0, 0x1, 0x9, 0xDA, 0x9, 0xDA, 0x0, 0xC, 0x9, 0xDD, 0x9, 0xDD, 0x0, 0x2, 0x9, 0xDE, 0x9, 0xDE, 0x0, 0x1C, 0x9, 0xDF, 0x9, 0xDF, 0x0, 0x5, 0x9, 0xE0, 0x9, 0xE0, 0x0, 0x11, 0x9, 0xE3, 0x9, 0xE3, 0x0, 0xB, 0x9, 0xE6, 0x9, 0xE6, 0x0, 0x1, 0x9, 0xE7, 0x9, 0xE7, 0x0, 0x16, 0x9, 0xE8, 0x9, 0xE8, 0x0, 0xE, 0x9, 0xE9, 0x9, 0xE9, 0x0, 0xC, 0x9, 0xEA, 0x9, 0xEA, 0x0, 0x12, 0x9, 0xEC, 0x9, 0xEC, 0x0, 0xC, 0x9, 0xEF, 0x9, 0xEF, 0x0, 0x4, 0x9, 0xF3, 0x9, 0xF3, 0x0, 0x3, 0x9, 0xF5, 0x9, 0xF5, 0x0, 0x9, 0x9, 0xF9, 0x9, 0xF9, 0x0, 0x3, 0x9, 0xFC, 0x9, 0xFC, 0x0, 0x5, 0x9, 0xFD, 0x9, 0xFD, 0x0, 0x22, 0xA, 0x1, 0xA, 0x1, 0x0, 0xA, 0xA, 0x2, 0xA, 0x3, 0x0, 0xB, 0xA, 0x4, 0xA, 0x4, 0x0, 0x26, 0xA, 0x5, 0xA, 0x5, 0x0, 0x2, 0xA, 0x6, 0xA, 0x6, 0x0, 0x1C, 0xA, 0x7, 0xA, 0x7, 0x0, 0x22, 0xA, 0x8, 0xA, 0x8, 0x0, 0x5, 0xA, 0xC, 0xA, 0xC, 0x0, 0x1, 0xA, 0xE, 0xA, 0xE, 0x0, 0x16, 0xA, 0xF, 0xA, 0xF, 0x0, 0x13, 0xA, 0x10, 0xA, 0x10, 0x0, 0xE, 0xA, 0x11, 0xA, 0x11, 0x0, 0x12, 0xA, 0x12, 0xA, 0x12, 0x0, 0x6, 0xA, 0x13, 0xA, 0x13, 0x0, 0x8, 0xA, 0x15, 0xA, 0x15, 0x0, 0x3, 0xA, 0x16, 0xA, 0x16, 0x0, 0x7, 0xA, 0x17, 0xA, 0x17, 0x0, 0x17, 0xA, 0x18, 0xA, 0x18, 0x0, 0x9, 0xA, 0x19, 0xA, 0x19, 0x0, 0x14, 0xA, 0x1A, 0xA, 0x1A, 0x0, 0x8, 0xA, 0x1B, 0xA, 0x1B, 0x0, 0x1A, 0xA, 0x21, 0xA, 0x21, 0x0, 0x9, 0xA, 0x22, 0xA, 0x22, 0x0, 0x1B, 0xA, 0x24, 0xA, 0x24, 0x0, 0x1B, 0xA, 0x26, 0xA, 0x26, 0x0, 0x1B, 0xA, 0x28, 0xA, 0x28, 0x0, 0xC, 0xA, 0x29, 0xA, 0x29, 0x0, 0x9, 0xA, 0x2A, 0xA, 0x2B, 0x0, 0x19, 0xA, 0x2E, 0xA, 0x2E, 0x0, 0x19, 0xA, 0x30, 0xA, 0x30, 0x0, 0x4, 0xA, 0x31, 0xA, 0x31, 0x0, 0x2, 0xA, 0x32, 0xA, 0x32, 0x0, 0x6, 0xA, 0x33, 0xA, 0x33, 0x0, 0x5, 0xA, 0x35, 0xA, 0x35, 0x0, 0x8, 0xA, 0x39, 0xA, 0x39, 0x0, 0x1D, 0xA, 0x3A, 0xA, 0x3A, 0x0, 0x9, 0xA, 0x3F, 0xA, 0x3F, 0x0, 0x13, 0xA, 0x40, 0xA, 0x40, 0x0, 0x17, 0xA, 0x41, 0xA, 0x41, 0x0, 0xC, 0xA, 0x42, 0xA, 0x42, 0x0, 0x9, 0xA, 0x44, 0xA, 0x44, 0x0, 0x12, 0xA, 0x45, 0xA, 0x45, 0x0, 0x14, 0xA, 0x47, 0xA, 0x47, 0x0, 0x2, 0xA, 0x48, 0xA, 0x48, 0x0, 0x6, 0xA, 0x49, 0xA, 0x49, 0x0, 0x2, 0xA, 0x4A, 0xA, 0x4A, 0x0, 0x6, 0xA, 0x4D, 0xA, 0x4D, 0x0, 0x5, 0xA, 0x4E, 0xA, 0x4E, 0x0, 0x8, 0xA, 0x50, 0xA, 0x51, 0x0, 0x8, 0xA, 0x52, 0xA, 0x52, 0x0, 0x12, 0xA, 0x53, 0xA, 0x53, 0x0, 0x14, 0xA, 0x5A, 0xA, 0x5A, 0x0, 0x1, 0xA, 0x5B, 0xA, 0x5B, 0x0, 0x3, 0xA, 0x5E, 0xA, 0x5E, 0x0, 0x1, 0xA, 0x60, 0xA, 0x60, 0x0, 0x3, 0xA, 0x62, 0xA, 0x62, 0x0, 0x7, 0xA, 0x63, 0xA, 0x63, 0x0, 0x26, 0xA, 0x64, 0xA, 0x64, 0x0, 0x9, 0xA, 0x65, 0xA, 0x65, 0x0, 0x26, 0xA, 0x66, 0xA, 0x66, 0x0, 0x9, 0xA, 0x67, 0xA, 0x67, 0x0, 0x26, 0xA, 0x68, 0xA, 0x68, 0x0, 0x9, 0xA, 0x6E, 0xA, 0x6E, 0x0, 0x2, 0xA, 0x6F, 0xA, 0x6F, 0x0, 0x6, 0xA, 0x70, 0xA, 0x70, 0x0, 0x2, 0xA, 0x71, 0xA, 0x71, 0x0, 0x6, 0xA, 0x72, 0xA, 0x72, 0x0, 0x2, 0xA, 0x73, 0xA, 0x73, 0x0, 0x6, 0xA, 0x74, 0xA, 0x74, 0x0, 0x2, 0xA, 0x75, 0xA, 0x75, 0x0, 0x6, 0xA, 0x76, 0xA, 0x76, 0x0, 0x2, 0xA, 0x77, 0xA, 0x77, 0x0, 0x6, 0xA, 0x78, 0xA, 0x78, 0x0, 0x2, 0xA, 0x79, 0xA, 0x79, 0x0, 0x6, 0xA, 0x7A, 0xA, 0x7A, 0x0, 0x2, 0xA, 0x7B, 0xA, 0x7B, 0x0, 0x6, 0xA, 0x7C, 0xA, 0x7C, 0x0, 0x2, 0xA, 0x7D, 0xA, 0x7D, 0x0, 0x6, 0xA, 0x7E, 0xA, 0x7E, 0x0, 0x2, 0xA, 0x7F, 0xA, 0x7F, 0x0, 0x6, 0xA, 0x80, 0xA, 0x80, 0x0, 0x2, 0xA, 0x81, 0xA, 0x81, 0x0, 0x6, 0xA, 0x82, 0xA, 0x82, 0x0, 0x2, 0xA, 0x83, 0xA, 0x83, 0x0, 0x6, 0xA, 0x84, 0xA, 0x84, 0x0, 0x2, 0xA, 0x85, 0xA, 0x85, 0x0, 0x6, 0xA, 0x86, 0xA, 0x86, 0x0, 0x5, 0xA, 0x87, 0xA, 0x87, 0x0, 0x8, 0xA, 0x88, 0xA, 0x88, 0x0, 0x5, 0xA, 0x89, 0xA, 0x89, 0x0, 0x8, 0xA, 0x8A, 0xA, 0x8A, 0x0, 0x5, 0xA, 0x8B, 0xA, 0x8B, 0x0, 0x8, 0xA, 0x8C, 0xA, 0x8C, 0x0, 0x5, 0xA, 0x8D, 0xA, 0x8D, 0x0, 0x8, 0xA, 0x8E, 0xA, 0x8E, 0x0, 0x5, 0xA, 0x8F, 0xA, 0x8F, 0x0, 0x8, 0xA, 0x90, 0xA, 0x90, 0x0, 0x5, 0xA, 0x91, 0xA, 0x91, 0x0, 0x8, 0xA, 0x92, 0xA, 0x92, 0x0, 0x5, 0xA, 0x93, 0xA, 0x93, 0x0, 0x8, 0xA, 0x94, 0xA, 0x94, 0x0, 0x5, 0xA, 0x95, 0xA, 0x95, 0x0, 0x8, 0xA, 0x9A, 0xA, 0x9A, 0x0, 0x1, 0xA, 0x9B, 0xA, 0x9B, 0x0, 0x3, 0xA, 0x9C, 0xA, 0x9C, 0x0, 0x1, 0xA, 0x9D, 0xA, 0x9D, 0x0, 0x3, 0xA, 0x9E, 0xA, 0x9E, 0x0, 0x1, 0xA, 0x9F, 0xA, 0x9F, 0x0, 0x3, 0xA, 0xA0, 0xA, 0xA0, 0x0, 0x1, 0xA, 0xA1, 0xA, 0xA1, 0x0, 0x3, 0xA, 0xA2, 0xA, 0xA2, 0x0, 0x1, 0xA, 0xA3, 0xA, 0xA3, 0x0, 0x3, 0xA, 0xA4, 0xA, 0xA4, 0x0, 0x1, 0xA, 0xA5, 0xA, 0xA5, 0x0, 0x3, 0xA, 0xA6, 0xA, 0xA6, 0x0, 0x1, 0xA, 0xA7, 0xA, 0xA7, 0x0, 0x3, 0xA, 0xAF, 0xA, 0xAF, 0x0, 0x3, 0xA, 0xB2, 0xA, 0xB2, 0x0, 0xA, 0xA, 0xB4, 0xA, 0xB4, 0x0, 0xA, 0xA, 0xC0, 0xA, 0xC0, 0x0, 0xC, 0xA, 0xC1, 0xA, 0xC1, 0x0, 0x9, 0xA, 0xC2, 0xA, 0xC2, 0x0, 0xC, 0xA, 0xC3, 0xA, 0xC3, 0x0, 0x9, 0xA, 0xC4, 0xA, 0xC4, 0x0, 0xC, 0xA, 0xC5, 0xA, 0xC5, 0x0, 0x9, 0xA, 0xC7, 0xA, 0xC7, 0x0, 0xE, 0xA, 0xCB, 0xA, 0xCB, 0x0, 0x22, 0xA, 0xCC, 0xA, 0xCC, 0x0, 0x1A, 0xA, 0xCF, 0xA, 0xCF, 0x0, 0x4, 0xA, 0xD1, 0xA, 0xD1, 0x0, 0x20, 0xA, 0xD2, 0xA, 0xD2, 0x0, 0x22, 0xA, 0xD4, 0xA, 0xD4, 0x0, 0xB, 0xA, 0xD6, 0xA, 0xD6, 0x0, 0xC, 0xA, 0xDC, 0xA, 0xDC, 0x0, 0x25, 0xA, 0xEE, 0xA, 0xEE, 0x0, 0x2, 0xA, 0xEF, 0xA, 0xEF, 0x0, 0x6, 0xA, 0xF2, 0xA, 0xF2, 0x0, 0x1, 0xA, 0xF3, 0xA, 0xF3, 0x0, 0x3, 0xA, 0xF4, 0xA, 0xF4, 0x0, 0xA, 0xA, 0xF6, 0xA, 0xF6, 0x0, 0xA, 0xA, 0xF8, 0xA, 0xF8, 0x0, 0xA, 0xA, 0xFA, 0xA, 0xFA, 0x0, 0xA, 0xA, 0xFC, 0xA, 0xFC, 0x0, 0xA, 0xA, 0xFF, 0xA, 0xFF, 0x0, 0x2, 0xB, 0x0, 0xB, 0x0, 0x0, 0x6, 0xB, 0x1, 0xB, 0x1, 0x0, 0x2, 0xB, 0x2, 0xB, 0x2, 0x0, 0x6, 0xB, 0x4, 0xB, 0x4, 0x0, 0x8, 0xB, 0x9, 0xB, 0x9, 0x0, 0x1, 0xB, 0xA, 0xB, 0xA, 0x0, 0x3, 0xB, 0xB, 0xB, 0xB, 0x0, 0x1, 0xB, 0xC, 0xB, 0xC, 0x0, 0x3, 0xB, 0xD, 0xB, 0xD, 0x0, 0x11, 0xB, 0xE, 0xB, 0xF, 0x0, 0x10, 0xB, 0x13, 0xB, 0x13, 0x0, 0x4, 0xB, 0x14, 0xB, 0x14, 0x0, 0x2, 0xB, 0x15, 0xB, 0x15, 0x0, 0x6, 0xB, 0x16, 0xB, 0x16, 0x0, 0x2, 0xB, 0x17, 0xB, 0x17, 0x0, 0x6, 0xB, 0x18, 0xB, 0x18, 0x0, 0x5, 0xB, 0x1A, 0xB, 0x1A, 0x0, 0x5, 0xB, 0x20, 0xB, 0x20, 0x0, 0x1, 0xB, 0x21, 0xB, 0x21, 0x0, 0x3, 0xB, 0x22, 0xB, 0x22, 0x0, 0x1, 0xB, 0x23, 0xB, 0x23, 0x0, 0x3, 0xB, 0x25, 0xB, 0x25, 0x0, 0x15, 0xB, 0x27, 0xB, 0x27, 0x0, 0x15, 0xB, 0x2E, 0xB, 0x2E, 0x0, 0x2, 0xB, 0x2F, 0xB, 0x2F, 0x0, 0x6, 0xB, 0x30, 0xB, 0x30, 0x0, 0x5, 0xB, 0x32, 0xB, 0x32, 0x0, 0x1, 0xB, 0x33, 0xB, 0x33, 0x0, 0x3, 0xB, 0x34, 0xB, 0x34, 0x0, 0x1, 0xB, 0x35, 0xB, 0x35, 0x0, 0x3, 0xB, 0x36, 0xB, 0x36, 0x0, 0x1, 0xB, 0x37, 0xB, 0x37, 0x0, 0x3, 0xB, 0x38, 0xB, 0x38, 0x0, 0x1, 0xB, 0x39, 0xB, 0x39, 0x0, 0x3, 0xB, 0x3B, 0xB, 0x3B, 0x0, 0x9, 0xB, 0x3C, 0xB, 0x3C, 0x0, 0x3, 0xB, 0x42, 0xB, 0x42, 0x0, 0x17, 0xB, 0x46, 0xB, 0x46, 0x0, 0x7, 0xB, 0x47, 0xB, 0x47, 0x0, 0x13, 0xB, 0x4B, 0xB, 0x4B, 0x0, 0x1B, 0xB, 0x4D, 0xB, 0x4D, 0x0, 0x1C, 0xB, 0x4E, 0xB, 0x4E, 0x0, 0x7, 0xB, 0x4F, 0xB, 0x4F, 0x0, 0x1C, 0xB, 0x50, 0xB, 0x50, 0x0, 0x7, 0xB, 0x51, 0xB, 0x51, 0x0, 0x1C, 0xB, 0x52, 0xB, 0x52, 0x0, 0x7, 0xB, 0x53, 0xB, 0x53, 0x0, 0x13, 0xB, 0x54, 0xB, 0x54, 0x0, 0x17, 0xB, 0x55, 0xB, 0x55, 0x0, 0x1, 0xB, 0x57, 0xB, 0x57, 0x0, 0x1, 0xB, 0x59, 0xB, 0x59, 0x0, 0x1, 0xB, 0x5B, 0xB, 0x5B, 0x0, 0x1, 0xB, 0x5D, 0xB, 0x5D, 0x0, 0x1, 0xB, 0x5F, 0xB, 0x5F, 0x0, 0x5, 0xB, 0x60, 0xB, 0x60, 0x0, 0x8, 0xB, 0x61, 0xB, 0x61, 0x0, 0x5, 0xB, 0x62, 0xB, 0x62, 0x0, 0x8, 0xB, 0x63, 0xB, 0x63, 0x0, 0x5, 0xB, 0x64, 0xB, 0x64, 0x0, 0x8, 0xB, 0x65, 0xB, 0x65, 0x0, 0x5, 0xB, 0x66, 0xB, 0x66, 0x0, 0x8, 0xB, 0x67, 0xB, 0x67, 0x0, 0x5, 0xB, 0x68, 0xB, 0x68, 0x0, 0x8, 0xB, 0x6E, 0xB, 0x6E, 0x0, 0x4, 0xB, 0x70, 0xB, 0x70, 0x0, 0x4, 0xB, 0x72, 0xB, 0x72, 0x0, 0x4, 0xB, 0x74, 0xB, 0x74, 0x0, 0x4, 0xB, 0x75, 0xB, 0x75, 0x0, 0xB, 0xB, 0x77, 0xB, 0x77, 0x0, 0xB, 0xB, 0x79, 0xB, 0x79, 0x0, 0xB, 0xB, 0x7B, 0xB, 0x7B, 0x0, 0x18, 0xB, 0x7D, 0xB, 0x7D, 0x0, 0x18, 0xB, 0x7F, 0xB, 0x7F, 0x0, 0x18, 0xB, 0x81, 0xB, 0x81, 0x0, 0x18, 0xB, 0x84, 0xB, 0x84, 0x0, 0x4, 0xB, 0x86, 0xB, 0x86, 0x0, 0x4, 0xB, 0x88, 0xB, 0x88, 0x0, 0x4, 0xB, 0x8A, 0xB, 0x8A, 0x0, 0x4, 0xB, 0x8C, 0xB, 0x8C, 0x0, 0x4, 0xB, 0x8E, 0xB, 0x8E, 0x0, 0x4, 0xB, 0x8F, 0xB, 0x8F, 0x0, 0x1, 0xB, 0x90, 0xB, 0x90, 0x0, 0x3, 0xB, 0x91, 0xB, 0x91, 0x0, 0x1, 0xB, 0x92, 0xB, 0x92, 0x0, 0x3, 0xB, 0x93, 0xB, 0x93, 0x0, 0x1, 0xB, 0x94, 0xB, 0x94, 0x0, 0x3, 0xB, 0x95, 0xB, 0x95, 0x0, 0x1, 0xB, 0x96, 0xB, 0x96, 0x0, 0x3, 0xB, 0x97, 0xB, 0x97, 0x0, 0x16, 0xB, 0x98, 0xB, 0x98, 0x0, 0x7, 0xB, 0x99, 0xB, 0x99, 0x0, 0x16, 0xB, 0x9A, 0xB, 0x9A, 0x0, 0x7, 0xB, 0x9C, 0xB, 0x9C, 0x0, 0x15, 0xB, 0x9E, 0xB, 0x9E, 0x0, 0x15, 0xB, 0xA0, 0xB, 0xA0, 0x0, 0x15, 0xB, 0xA2, 0xB, 0xA2, 0x0, 0x15, 0xB, 0xAD, 0xB, 0xAD, 0x0, 0xE, 0xB, 0xAF, 0xB, 0xAF, 0x0, 0xE, 0xB, 0xB1, 0xB, 0xB1, 0x0, 0xE, 0xB, 0xB3, 0xB, 0xB3, 0x0, 0xE, 0xB, 0xB5, 0xB, 0xB5, 0x0, 0xA, 0xB, 0xB7, 0xB, 0xB7, 0x0, 0xA, 0xB, 0xB9, 0xB, 0xB9, 0x0, 0xA, 0xB, 0xBB, 0xB, 0xBB, 0x0, 0xA, 0xB, 0xBD, 0xB, 0xBD, 0x0, 0xA, 0xB, 0xBF, 0xB, 0xBF, 0x0, 0x1D, 0xB, 0xC0, 0xB, 0xC0, 0x0, 0x9, 0xB, 0xC1, 0xB, 0xC1, 0x0, 0x1D, 0xB, 0xC2, 0xB, 0xC2, 0x0, 0x9, 0xB, 0xC3, 0xB, 0xC3, 0x0, 0x1B, 0xB, 0xC5, 0xB, 0xC5, 0x0, 0x1B, 0xB, 0xC7, 0xB, 0xC7, 0x0, 0x12, 0xB, 0xC8, 0xB, 0xC8, 0x0, 0x14, 0xB, 0xC9, 0xB, 0xC9, 0x0, 0x12, 0xB, 0xCA, 0xB, 0xCA, 0x0, 0x14, 0xB, 0xCB, 0xB, 0xCB, 0x0, 0xC, 0xB, 0xCC, 0xB, 0xCC, 0x0, 0x9, 0xB, 0xCD, 0xB, 0xCD, 0x0, 0x11, 0xB, 0xCE, 0xB, 0xCE, 0x0, 0x10, 0xB, 0xCF, 0xB, 0xCF, 0x0, 0x11, 0xB, 0xD0, 0xB, 0xD0, 0x0, 0x10, 0xB, 0xD1, 0xB, 0xD1, 0x0, 0x11, 0xB, 0xD2, 0xB, 0xD2, 0x0, 0x10, 0xB, 0xD6, 0xB, 0xD6, 0x0, 0x9, 0xB, 0xE0, 0xB, 0xE7, 0x0, 0x2, 0xB, 0xEE, 0xB, 0xF3, 0x0, 0x5, 0xB, 0xF4, 0xB, 0xFB, 0x0, 0x4, 0xC, 0x14, 0xC, 0x19, 0x0, 0x3, 0xC, 0x1A, 0xC, 0x1F, 0x0, 0x1, 0xC, 0x40, 0xC, 0x41, 0x0, 0x4, 0xC, 0x44, 0xC, 0x45, 0x0, 0x3, 0xC, 0x52, 0xC, 0x59, 0x0, 0x2, 0xC, 0x81, 0xC, 0x85, 0x0, 0x2, 0xC, 0x86, 0xC, 0x8A, 0x0, 0x4, 0xC, 0x8B, 0xC, 0x8C, 0x0, 0x5, 0xC, 0x9E, 0xC, 0x9F, 0x0, 0x7, 0xC, 0xA2, 0xC, 0xA5, 0x0, 0xC, 0xC, 0xA6, 0xC, 0xA6, 0x0, 0x16, 0xC, 0xAC, 0xC, 0xAD, 0x0, 0x1, 0xC, 0xB7, 0xC, 0xB7, 0x0, 0xF, 0xC, 0xBB, 0xC, 0xBB, 0x0, 0xD, 0xC, 0xBE, 0xC, 0xBE, 0x0, 0xF, 0xC, 0xC4, 0xC, 0xC4, 0x0, 0x1E, 0xC, 0xC9, 0xC, 0xC9, 0x0, 0x23, 0xC, 0xD4, 0xC, 0xD4, 0x0, 0x1E, 0xC, 0xD6, 0xC, 0xD6, 0x0, 0xF, 0xC, 0xDD, 0xC, 0xDD, 0x0, 0xD, 0xC, 0xE1, 0xC, 0xE1, 0x0, 0x23, 0x0, 0x2, 0x2, 0x8B, 0x0, 0x7, 0x0, 0x7, 0x0, 0x14, 0x0, 0xC, 0x0, 0xC, 0x0, 0x14, 0x0, 0x11, 0x0, 0x11, 0x0, 0x1A, 0x0, 0x12, 0x0, 0x12, 0x0, 0x1F, 0x0, 0x13, 0x0, 0x13, 0x0, 0x1A, 0x0, 0x26, 0x0, 0x26, 0x0, 0x6, 0x0, 0x28, 0x0, 0x28, 0x0, 0x2, 0x0, 0x2C, 0x0, 0x2C, 0x0, 0x2, 0x0, 0x2F, 0x0, 0x2F, 0x0, 0x23, 0x0, 0x34, 0x0, 0x34, 0x0, 0x2, 0x0, 0x36, 0x0, 0x36, 0x0, 0x2, 0x0, 0x38, 0x0, 0x38, 0x0, 0x10, 0x0, 0x39, 0x0, 0x39, 0x0, 0xB, 0x0, 0x3A, 0x0, 0x3A, 0x0, 0xA, 0x0, 0x3B, 0x0, 0x3B, 0x0, 0x1D, 0x0, 0x3C, 0x0, 0x3C, 0x0, 0x16, 0x0, 0x3D, 0x0, 0x3D, 0x0, 0x11, 0x0, 0x3E, 0x0, 0x3E, 0x0, 0xC, 0x0, 0x3F, 0x0, 0x3F, 0x0, 0x13, 0x0, 0x46, 0x0, 0x46, 0x0, 0x7, 0x0, 0x48, 0x0, 0x4A, 0x0, 0x1, 0x0, 0x4C, 0x0, 0x4C, 0x0, 0x1, 0x0, 0x52, 0x0, 0x53, 0x0, 0x3, 0x0, 0x54, 0x0, 0x54, 0x0, 0x4, 0x0, 0x55, 0x0, 0x55, 0x0, 0x3, 0x0, 0x56, 0x0, 0x56, 0x0, 0x1, 0x0, 0x58, 0x0, 0x58, 0x0, 0xE, 0x0, 0x5A, 0x0, 0x5A, 0x0, 0x5, 0x0, 0x5B, 0x0, 0x5B, 0x0, 0x9, 0x0, 0x5D, 0x0, 0x5D, 0x0, 0x15, 0x0, 0x5E, 0x0, 0x5E, 0x0, 0x9, 0x0, 0x5F, 0x0, 0x5F, 0x0, 0xF, 0x0, 0x84, 0x0, 0x84, 0x0, 0x2, 0x0, 0x94, 0x0, 0x94, 0x0, 0x2, 0x0, 0x95, 0x0, 0x95, 0x0, 0x1, 0x0, 0x9E, 0x0, 0x9E, 0x0, 0x2, 0x0, 0x9F, 0x0, 0x9F, 0x0, 0x1, 0x0, 0xAA, 0x0, 0xAA, 0x0, 0x2, 0x0, 0xB4, 0x0, 0xB4, 0x0, 0x2, 0x0, 0xB5, 0x0, 0xB5, 0x0, 0x1, 0x0, 0xB6, 0x0, 0xB6, 0x0, 0x2, 0x0, 0xC2, 0x0, 0xC2, 0x0, 0xB, 0x0, 0xC4, 0x0, 0xC4, 0x0, 0x5, 0x0, 0xCA, 0x0, 0xCA, 0x0, 0xF, 0x0, 0xDA, 0x0, 0xDA, 0x0, 0x1, 0x0, 0xDC, 0x0, 0xDC, 0x0, 0x1, 0x0, 0xE4, 0x0, 0xE4, 0x0, 0x1, 0x0, 0xEA, 0x0, 0xEA, 0x0, 0x3, 0x0, 0xF4, 0x0, 0xF4, 0x0, 0xE, 0x0, 0xF5, 0x0, 0xF5, 0x0, 0xF, 0x0, 0xFA, 0x0, 0xFA, 0x0, 0x6, 0x0, 0xFF, 0x0, 0xFF, 0x0, 0x2, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0x3, 0x1, 0x3, 0x0, 0xC, 0x2, 0x28, 0x2, 0x28, 0x0, 0x3, 0x2, 0x2A, 0x2, 0x2A, 0x0, 0x1, 0x2, 0x31, 0x2, 0x31, 0x0, 0x6, 0x2, 0x32, 0x2, 0x32, 0x0, 0x2, 0x2, 0x33, 0x2, 0x33, 0x0, 0x6, 0x2, 0x3A, 0x2, 0x3A, 0x0, 0x1, 0x2, 0x3C, 0x2, 0x3C, 0x0, 0x9, 0x2, 0x40, 0x2, 0x40, 0x0, 0x3, 0x2, 0x47, 0x2, 0x48, 0x0, 0x1, 0x2, 0x4A, 0x2, 0x4A, 0x0, 0x5, 0x2, 0x55, 0x2, 0x55, 0x0, 0x2, 0x2, 0x56, 0x2, 0x56, 0x0, 0x4, 0x2, 0x57, 0x2, 0x57, 0x0, 0x2, 0x2, 0x58, 0x2, 0x58, 0x0, 0x1, 0x2, 0x61, 0x2, 0x61, 0x0, 0x1, 0x2, 0x66, 0x2, 0x66, 0x0, 0x2, 0x2, 0x68, 0x2, 0x68, 0x0, 0xB, 0x2, 0x69, 0x2, 0x69, 0x0, 0x2, 0x2, 0x6A, 0x2, 0x6A, 0x0, 0x19, 0x2, 0x6C, 0x2, 0x6C, 0x0, 0xB, 0x2, 0x70, 0x2, 0x70, 0x0, 0x11, 0x2, 0x73, 0x2, 0x73, 0x0, 0x19, 0x2, 0x74, 0x2, 0x74, 0x0, 0x22, 0x2, 0x77, 0x2, 0x77, 0x0, 0x20, 0x2, 0x82, 0x2, 0x82, 0x0, 0x3, 0x2, 0x84, 0x2, 0x84, 0x0, 0x15, 0x2, 0x86, 0x2, 0x87, 0x0, 0x3, 0x2, 0x88, 0x2, 0x88, 0x0, 0x1B, 0x2, 0x89, 0x2, 0x8B, 0x0, 0x3, 0x2, 0x8D, 0x2, 0x8D, 0x0, 0x1, 0x2, 0x8E, 0x2, 0x8E, 0x0, 0x3, 0x2, 0x8F, 0x2, 0x8F, 0x0, 0x21, 0x2, 0x90, 0x2, 0x91, 0x0, 0x3, 0x2, 0x94, 0x2, 0x94, 0x0, 0x3, 0x2, 0x96, 0x2, 0x96, 0x0, 0x3, 0x2, 0x99, 0x2, 0x99, 0x0, 0x1, 0x2, 0x9A, 0x2, 0x9A, 0x0, 0x1B, 0x2, 0x9B, 0x2, 0x9B, 0x0, 0x3, 0x2, 0x9E, 0x2, 0x9E, 0x0, 0x2, 0x2, 0xA3, 0x2, 0xA3, 0x0, 0x6, 0x2, 0xAD, 0x2, 0xAD, 0x0, 0x2, 0x2, 0xAE, 0x2, 0xAE, 0x0, 0x4, 0x2, 0xAF, 0x2, 0xAF, 0x0, 0x1D, 0x2, 0xB0, 0x2, 0xB0, 0x0, 0x9, 0x2, 0xB1, 0x2, 0xB1, 0x0, 0x2, 0x2, 0xB3, 0x2, 0xB3, 0x0, 0x2, 0x2, 0xB4, 0x2, 0xB4, 0x0, 0x1, 0x2, 0xB5, 0x2, 0xB5, 0x0, 0x2, 0x2, 0xB7, 0x2, 0xB7, 0x0, 0x2, 0x2, 0xB8, 0x2, 0xB8, 0x0, 0x1, 0x2, 0xC2, 0x2, 0xC2, 0x0, 0x3, 0x2, 0xCA, 0x2, 0xCA, 0x0, 0x11, 0x2, 0xCB, 0x2, 0xCB, 0x0, 0x15, 0x2, 0xCD, 0x2, 0xCD, 0x0, 0x3, 0x2, 0xD0, 0x2, 0xD0, 0x0, 0xB, 0x2, 0xD3, 0x2, 0xD3, 0x0, 0x3, 0x2, 0xD5, 0x2, 0xD5, 0x0, 0x3, 0x2, 0xD8, 0x2, 0xD8, 0x0, 0x2, 0x2, 0xD9, 0x2, 0xD9, 0x0, 0x1, 0x2, 0xDA, 0x2, 0xDA, 0x0, 0x11, 0x2, 0xDB, 0x2, 0xDB, 0x0, 0x15, 0x2, 0xDC, 0x2, 0xDC, 0x0, 0xB, 0x2, 0xDE, 0x2, 0xDE, 0x0, 0x20, 0x2, 0xDF, 0x2, 0xDF, 0x0, 0x21, 0x2, 0xE7, 0x2, 0xE7, 0x0, 0x19, 0x2, 0xE8, 0x2, 0xE8, 0x0, 0x1B, 0x2, 0xEA, 0x2, 0xEA, 0x0, 0x3, 0x2, 0xEC, 0x2, 0xEC, 0x0, 0x3, 0x2, 0xEE, 0x2, 0xEE, 0x0, 0x3, 0x2, 0xF3, 0x2, 0xF3, 0x0, 0x3, 0x2, 0xF4, 0x2, 0xF4, 0x0, 0x11, 0x2, 0xF5, 0x2, 0xF5, 0x0, 0x15, 0x2, 0xF7, 0x2, 0xF8, 0x0, 0x1, 0x2, 0xFD, 0x2, 0xFD, 0x0, 0x19, 0x3, 0x1, 0x3, 0x1, 0x0, 0x2, 0x3, 0x2, 0x3, 0x2, 0x0, 0x1, 0x3, 0x6, 0x3, 0x6, 0x0, 0x19, 0x3, 0x7, 0x3, 0x7, 0x0, 0x1B, 0x3, 0x8, 0x3, 0x8, 0x0, 0x19, 0x3, 0x9, 0x3, 0x9, 0x0, 0x1B, 0x3, 0xF, 0x3, 0xF, 0x0, 0x3, 0x3, 0x10, 0x3, 0x10, 0x0, 0x19, 0x3, 0x11, 0x3, 0x11, 0x0, 0x1B, 0x3, 0x13, 0x3, 0x13, 0x0, 0x3, 0x4, 0x5E, 0x4, 0x5F, 0x0, 0x1F, 0x4, 0x62, 0x4, 0x63, 0x0, 0x14, 0x4, 0x64, 0x4, 0x64, 0x0, 0x1A, 0x4, 0x65, 0x4, 0x67, 0x0, 0x14, 0x4, 0x68, 0x4, 0x68, 0x0, 0x1A, 0x4, 0x6F, 0x4, 0x70, 0x0, 0x1A, 0x5, 0x5B, 0x5, 0x5B, 0x0, 0x7, 0x5, 0x61, 0x5, 0x61, 0x0, 0x13, 0x5, 0x62, 0x5, 0x62, 0x0, 0xF, 0x5, 0x63, 0x5, 0x63, 0x0, 0x2, 0x5, 0x67, 0x5, 0x67, 0x0, 0x9, 0x5, 0x68, 0x5, 0x68, 0x0, 0x16, 0x5, 0x6E, 0x5, 0x6E, 0x0, 0x1, 0x5, 0x70, 0x5, 0x70, 0x0, 0x4, 0x5, 0x74, 0x5, 0x74, 0x0, 0x10, 0x5, 0xD9, 0x5, 0xD9, 0x0, 0x13, 0x5, 0xDA, 0x5, 0xDA, 0x0, 0xF, 0x5, 0xDB, 0x5, 0xDB, 0x0, 0x13, 0x5, 0xDC, 0x5, 0xDC, 0x0, 0xF, 0x5, 0xE5, 0x5, 0xE5, 0x0, 0x2, 0x5, 0xED, 0x5, 0xED, 0x0, 0x2, 0x5, 0xEE, 0x5, 0xEE, 0x0, 0x4, 0x5, 0xF0, 0x5, 0xF0, 0x0, 0x3, 0x5, 0xF1, 0x5, 0xF1, 0x0, 0x6, 0x6, 0x0, 0x6, 0x0, 0x0, 0x3, 0x6, 0x1, 0x6, 0x1, 0x0, 0x2, 0x6, 0x2, 0x6, 0x2, 0x0, 0x4, 0x6, 0x3, 0x6, 0x3, 0x0, 0x2, 0x6, 0x4, 0x6, 0x4, 0x0, 0x4, 0x6, 0x5, 0x6, 0x5, 0x0, 0x2, 0x6, 0x6, 0x6, 0x6, 0x0, 0x4, 0x6, 0x1F, 0x6, 0x1F, 0x0, 0x20, 0x6, 0x20, 0x6, 0x20, 0x0, 0x21, 0x6, 0x23, 0x6, 0x23, 0x0, 0xB, 0x6, 0x25, 0x6, 0x25, 0x0, 0xB, 0x6, 0x28, 0x6, 0x28, 0x0, 0x3, 0x6, 0x29, 0x6, 0x29, 0x0, 0xB, 0x6, 0x30, 0x6, 0x30, 0x0, 0x3, 0x6, 0x31, 0x6, 0x31, 0x0, 0x2, 0x6, 0x32, 0x6, 0x32, 0x0, 0x4, 0x6, 0x33, 0x6, 0x33, 0x0, 0x2, 0x6, 0x6A, 0x6, 0x6A, 0x0, 0x6, 0x6, 0x6B, 0x6, 0x6B, 0x0, 0x7, 0x6, 0x6C, 0x6, 0x6C, 0x0, 0x6, 0x6, 0x6D, 0x6, 0x6D, 0x0, 0x7, 0x6, 0x6F, 0x6, 0x6F, 0x0, 0x7, 0x6, 0x70, 0x6, 0x70, 0x0, 0x6, 0x6, 0x71, 0x6, 0x71, 0x0, 0x7, 0x6, 0x72, 0x6, 0x72, 0x0, 0x6, 0x6, 0x73, 0x6, 0x73, 0x0, 0x7, 0x6, 0x74, 0x6, 0x74, 0x0, 0x6, 0x6, 0x75, 0x6, 0x75, 0x0, 0x7, 0x6, 0x84, 0x6, 0x84, 0x0, 0x2, 0x6, 0x85, 0x6, 0x85, 0x0, 0x4, 0x6, 0x86, 0x6, 0x86, 0x0, 0x2, 0x6, 0x87, 0x6, 0x87, 0x0, 0x4, 0x6, 0x8E, 0x6, 0x8E, 0x0, 0x2, 0x6, 0x8F, 0x6, 0x8F, 0x0, 0x1, 0x6, 0x90, 0x6, 0x90, 0x0, 0x2, 0x6, 0x91, 0x6, 0x91, 0x0, 0x1, 0x6, 0x96, 0x6, 0x96, 0x0, 0x1D, 0x6, 0xA9, 0x6, 0xA9, 0x0, 0x1, 0x6, 0xAB, 0x6, 0xAC, 0x0, 0x3, 0x6, 0xCB, 0x6, 0xCB, 0x0, 0x1, 0x6, 0xE3, 0x6, 0xE3, 0x0, 0x2, 0x6, 0xF7, 0x6, 0xF7, 0x0, 0x1, 0x6, 0xFB, 0x6, 0xFD, 0x0, 0x3, 0x7, 0x12, 0x7, 0x12, 0x0, 0x3, 0x7, 0x2C, 0x7, 0x2C, 0x0, 0xE, 0x7, 0x4F, 0x7, 0x4F, 0x0, 0x17, 0x7, 0x50, 0x7, 0x50, 0x0, 0x1C, 0x7, 0x51, 0x7, 0x51, 0x0, 0x24, 0x7, 0x53, 0x7, 0x53, 0x0, 0x12, 0x7, 0x54, 0x7, 0x54, 0x0, 0x18, 0x7, 0x55, 0x7, 0x55, 0x0, 0x1E, 0x7, 0x57, 0x7, 0x57, 0x0, 0x8, 0x7, 0x59, 0x7, 0x59, 0x0, 0x8, 0x7, 0x61, 0x7, 0x61, 0x0, 0x8, 0x7, 0x67, 0x7, 0x67, 0x0, 0xD, 0x7, 0x68, 0x7, 0x68, 0x0, 0x8, 0x7, 0x69, 0x7, 0x69, 0x0, 0xD, 0x7, 0x70, 0x7, 0x70, 0x0, 0x18, 0x7, 0x71, 0x7, 0x71, 0x0, 0x8, 0x7, 0x74, 0x7, 0x74, 0x0, 0x18, 0x7, 0x78, 0x7, 0x78, 0x0, 0x1C, 0x7, 0x89, 0x7, 0x89, 0x0, 0x1C, 0x7, 0x8C, 0x7, 0x8C, 0x0, 0x18, 0x7, 0x8D, 0x7, 0x8D, 0x0, 0x8, 0x7, 0x8E, 0x7, 0x8E, 0x0, 0x17, 0x7, 0x8F, 0x7, 0x8F, 0x0, 0x1C, 0x7, 0x90, 0x7, 0x90, 0x0, 0x18, 0x7, 0x96, 0x7, 0x96, 0x0, 0x8, 0x7, 0xAF, 0x7, 0xAF, 0x0, 0x8, 0x7, 0xB1, 0x7, 0xB1, 0x0, 0xD, 0x7, 0xCF, 0x7, 0xD0, 0x0, 0x2, 0x7, 0xD2, 0x7, 0xD3, 0x0, 0x2, 0x8, 0xC7, 0x8, 0xC7, 0x0, 0x1F, 0x8, 0xCD, 0x8, 0xD3, 0x0, 0x6, 0x8, 0xD4, 0x8, 0xD4, 0x0, 0x2, 0x8, 0xDE, 0x8, 0xE2, 0x0, 0x2, 0x8, 0xE3, 0x8, 0xE6, 0x0, 0xA, 0x8, 0xE7, 0x8, 0xE7, 0x0, 0xC, 0x8, 0xE8, 0x8, 0xEE, 0x0, 0x7, 0x8, 0xEF, 0x8, 0xF3, 0x0, 0x1, 0x8, 0xF8, 0x8, 0xF8, 0x0, 0x3, 0x8, 0xF9, 0x8, 0xFD, 0x0, 0x4, 0x8, 0xFE, 0x9, 0x1, 0x0, 0x5, 0x9, 0x2, 0x9, 0x3, 0x0, 0x9, 0x9, 0x4, 0x9, 0x4, 0x0, 0x6, 0x9, 0x5, 0x9, 0x5, 0x0, 0x7, 0x9, 0x6, 0x9, 0x6, 0x0, 0x6, 0x9, 0x7, 0x9, 0x7, 0x0, 0x7, 0x9, 0x8, 0x9, 0x8, 0x0, 0x6, 0x9, 0x9, 0x9, 0x9, 0x0, 0x7, 0x9, 0xA, 0x9, 0xA, 0x0, 0x2, 0x9, 0xB, 0x9, 0xB, 0x0, 0x1, 0x9, 0xC, 0x9, 0xC, 0x0, 0x2, 0x9, 0xD, 0x9, 0xD, 0x0, 0x1, 0x9, 0xE, 0x9, 0xE, 0x0, 0x2, 0x9, 0xF, 0x9, 0xF, 0x0, 0x1, 0x9, 0x10, 0x9, 0x10, 0x0, 0x2, 0x9, 0x11, 0x9, 0x11, 0x0, 0x1, 0x9, 0x13, 0x9, 0x13, 0x0, 0x1, 0x9, 0x15, 0x9, 0x15, 0x0, 0x1, 0x9, 0x17, 0x9, 0x17, 0x0, 0x1, 0x9, 0x19, 0x9, 0x19, 0x0, 0x1, 0x9, 0x1B, 0x9, 0x1B, 0x0, 0x1, 0x9, 0x1D, 0x9, 0x1D, 0x0, 0x1, 0x9, 0x1E, 0x9, 0x1E, 0x0, 0x2, 0x9, 0x1F, 0x9, 0x1F, 0x0, 0x1, 0x9, 0x20, 0x9, 0x20, 0x0, 0x2, 0x9, 0x21, 0x9, 0x21, 0x0, 0x1, 0x9, 0x22, 0x9, 0x22, 0x0, 0x2, 0x9, 0x23, 0x9, 0x23, 0x0, 0x1, 0x9, 0x24, 0x9, 0x24, 0x0, 0x2, 0x9, 0x25, 0x9, 0x25, 0x0, 0x1, 0x9, 0x33, 0x9, 0x33, 0x0, 0x23, 0x9, 0x40, 0x9, 0x40, 0x0, 0x3, 0x9, 0x42, 0x9, 0x42, 0x0, 0x3, 0x9, 0x44, 0x9, 0x45, 0x0, 0x3, 0x9, 0x46, 0x9, 0x46, 0x0, 0x2, 0x9, 0x47, 0x9, 0x47, 0x0, 0x4, 0x9, 0x48, 0x9, 0x48, 0x0, 0x2, 0x9, 0x49, 0x9, 0x49, 0x0, 0x4, 0x9, 0x4A, 0x9, 0x4A, 0x0, 0x2, 0x9, 0x4B, 0x9, 0x4B, 0x0, 0x4, 0x9, 0x52, 0x9, 0x52, 0x0, 0x10, 0x9, 0x53, 0x9, 0x53, 0x0, 0xE, 0x9, 0x54, 0x9, 0x54, 0x0, 0x10, 0x9, 0x55, 0x9, 0x55, 0x0, 0xE, 0x9, 0x56, 0x9, 0x56, 0x0, 0x10, 0x9, 0x57, 0x9, 0x57, 0x0, 0xE, 0x9, 0x58, 0x9, 0x58, 0x0, 0x10, 0x9, 0x59, 0x9, 0x59, 0x0, 0xE, 0x9, 0x5A, 0x9, 0x5A, 0x0, 0x10, 0x9, 0x5B, 0x9, 0x5B, 0x0, 0xE, 0x9, 0x5C, 0x9, 0x5C, 0x0, 0xB, 0x9, 0x5E, 0x9, 0x5E, 0x0, 0xB, 0x9, 0x60, 0x9, 0x60, 0x0, 0xB, 0x9, 0x62, 0x9, 0x62, 0x0, 0xA, 0x9, 0x63, 0x9, 0x63, 0x0, 0x5, 0x9, 0x64, 0x9, 0x64, 0x0, 0xA, 0x9, 0x65, 0x9, 0x65, 0x0, 0x5, 0x9, 0x66, 0x9, 0x66, 0x0, 0xA, 0x9, 0x67, 0x9, 0x67, 0x0, 0x5, 0x9, 0x68, 0x9, 0x68, 0x0, 0xA, 0x9, 0x69, 0x9, 0x69, 0x0, 0x5, 0x9, 0x6A, 0x9, 0x6A, 0x0, 0xA, 0x9, 0x6B, 0x9, 0x6B, 0x0, 0x5, 0x9, 0x6C, 0x9, 0x6C, 0x0, 0xA, 0x9, 0x6D, 0x9, 0x6D, 0x0, 0x5, 0x9, 0x6E, 0x9, 0x6E, 0x0, 0x16, 0x9, 0x70, 0x9, 0x70, 0x0, 0xC, 0x9, 0x71, 0x9, 0x71, 0x0, 0x9, 0x9, 0x72, 0x9, 0x72, 0x0, 0xC, 0x9, 0x73, 0x9, 0x73, 0x0, 0x13, 0x9, 0x74, 0x9, 0x74, 0x0, 0xF, 0x9, 0x75, 0x9, 0x75, 0x0, 0x13, 0x9, 0x76, 0x9, 0x76, 0x0, 0xF, 0x9, 0x77, 0x9, 0x77, 0x0, 0x13, 0x9, 0x78, 0x9, 0x78, 0x0, 0xF, 0x9, 0x7B, 0x9, 0x7B, 0x0, 0x2, 0x9, 0x80, 0x9, 0x86, 0x0, 0xD, 0x9, 0x87, 0x9, 0x87, 0x0, 0x8, 0x9, 0x91, 0x9, 0x95, 0x0, 0x8, 0x9, 0x96, 0x9, 0x99, 0x0, 0x12, 0x9, 0x9A, 0x9, 0x9A, 0x0, 0x17, 0x9, 0x9B, 0x9, 0x9D, 0x0, 0xD, 0x9, 0x9E, 0x9, 0xA1, 0x0, 0x8, 0x9, 0xA8, 0x9, 0xAB, 0x0, 0x8, 0x9, 0xBB, 0x9, 0xBE, 0x0, 0x8, 0x9, 0xC2, 0x9, 0xC5, 0x0, 0x1E, 0x9, 0xC7, 0x9, 0xC7, 0x0, 0x18, 0x9, 0xC9, 0x9, 0xCE, 0x0, 0x12, 0x9, 0xCF, 0x9, 0xCF, 0x0, 0x24, 0x9, 0xD0, 0x9, 0xD1, 0x0, 0x17, 0x9, 0xD5, 0x9, 0xD5, 0x0, 0x6, 0x9, 0xD9, 0x9, 0xD9, 0x0, 0x2, 0x9, 0xDA, 0x9, 0xDA, 0x0, 0xC, 0x9, 0xDD, 0x9, 0xDD, 0x0, 0x6, 0x9, 0xE0, 0x9, 0xE0, 0x0, 0x13, 0x9, 0xE6, 0x9, 0xE6, 0x0, 0x2, 0x9, 0xE9, 0x9, 0xE9, 0x0, 0xC, 0x9, 0xEA, 0x9, 0xEA, 0x0, 0x11, 0x9, 0xEC, 0x9, 0xEC, 0x0, 0xC, 0x9, 0xED, 0x9, 0xED, 0x0, 0x1, 0x9, 0xEF, 0x9, 0xEF, 0x0, 0x3, 0x9, 0xF1, 0x9, 0xF1, 0x0, 0x5, 0x9, 0xF3, 0x9, 0xF3, 0x0, 0x4, 0x9, 0xF5, 0x9, 0xF5, 0x0, 0x9, 0x9, 0xF8, 0x9, 0xF8, 0x0, 0x5, 0x9, 0xF9, 0x9, 0xF9, 0x0, 0x4, 0x9, 0xFA, 0x9, 0xFA, 0x0, 0x5, 0xA, 0x1, 0xA, 0x1, 0x0, 0x23, 0xA, 0x4, 0xA, 0x4, 0x0, 0x22, 0xA, 0x5, 0xA, 0x5, 0x0, 0x6, 0xA, 0xC, 0xA, 0xC, 0x0, 0x2, 0xA, 0xF, 0xA, 0xF, 0x0, 0x2, 0xA, 0x10, 0xA, 0x10, 0x0, 0xB, 0xA, 0x11, 0xA, 0x11, 0x0, 0x11, 0xA, 0x12, 0xA, 0x12, 0x0, 0x7, 0xA, 0x13, 0xA, 0x13, 0x0, 0x1, 0xA, 0x14, 0xA, 0x14, 0x0, 0x3, 0xA, 0x15, 0xA, 0x15, 0x0, 0x4, 0xA, 0x16, 0xA, 0x16, 0x0, 0x3, 0xA, 0x17, 0xA, 0x17, 0x0, 0x1, 0xA, 0x18, 0xA, 0x18, 0x0, 0x9, 0xA, 0x19, 0xA, 0x19, 0x0, 0x15, 0xA, 0x1A, 0xA, 0x1A, 0x0, 0x1, 0xA, 0x1B, 0xA, 0x1B, 0x0, 0x3, 0xA, 0x1C, 0xA, 0x1C, 0x0, 0xE, 0xA, 0x20, 0xA, 0x20, 0x0, 0x3, 0xA, 0x21, 0xA, 0x21, 0x0, 0x9, 0xA, 0x22, 0xA, 0x22, 0x0, 0x16, 0xA, 0x24, 0xA, 0x24, 0x0, 0x16, 0xA, 0x26, 0xA, 0x26, 0x0, 0x16, 0xA, 0x28, 0xA, 0x28, 0x0, 0xC, 0xA, 0x29, 0xA, 0x29, 0x0, 0x9, 0xA, 0x2A, 0xA, 0x2B, 0x0, 0x14, 0xA, 0x2E, 0xA, 0x2E, 0x0, 0x14, 0xA, 0x30, 0xA, 0x30, 0x0, 0x3, 0xA, 0x31, 0xA, 0x31, 0x0, 0x6, 0xA, 0x32, 0xA, 0x32, 0x0, 0x7, 0xA, 0x35, 0xA, 0x35, 0x0, 0x1, 0xA, 0x36, 0xA, 0x36, 0x0, 0x3, 0xA, 0x39, 0xA, 0x39, 0x0, 0x1D, 0xA, 0x3A, 0xA, 0x3A, 0x0, 0x9, 0xA, 0x3B, 0xA, 0x3B, 0x0, 0x1, 0xA, 0x3C, 0xA, 0x3C, 0x0, 0x2, 0xA, 0x3F, 0xA, 0x3F, 0x0, 0x2, 0xA, 0x40, 0xA, 0x40, 0x0, 0x1, 0xA, 0x41, 0xA, 0x41, 0x0, 0xC, 0xA, 0x42, 0xA, 0x42, 0x0, 0x9, 0xA, 0x44, 0xA, 0x44, 0x0, 0x11, 0xA, 0x45, 0xA, 0x45, 0x0, 0x15, 0xA, 0x47, 0xA, 0x47, 0x0, 0x6, 0xA, 0x48, 0xA, 0x48, 0x0, 0x7, 0xA, 0x49, 0xA, 0x49, 0x0, 0x6, 0xA, 0x4A, 0xA, 0x4A, 0x0, 0x7, 0xA, 0x4E, 0xA, 0x4E, 0x0, 0x1, 0xA, 0x50, 0xA, 0x51, 0x0, 0x1, 0xA, 0x52, 0xA, 0x52, 0x0, 0x11, 0xA, 0x53, 0xA, 0x53, 0x0, 0x15, 0xA, 0x57, 0xA, 0x57, 0x0, 0x3, 0xA, 0x59, 0xA, 0x59, 0x0, 0x3, 0xA, 0x5A, 0xA, 0x5A, 0x0, 0x2, 0xA, 0x5B, 0xA, 0x5B, 0x0, 0x4, 0xA, 0x5C, 0xA, 0x5C, 0x0, 0x2, 0xA, 0x5D, 0xA, 0x5D, 0x0, 0x1, 0xA, 0x5E, 0xA, 0x5F, 0x0, 0x2, 0xA, 0x60, 0xA, 0x60, 0x0, 0x4, 0xA, 0x63, 0xA, 0x63, 0x0, 0x22, 0xA, 0x64, 0xA, 0x64, 0x0, 0x9, 0xA, 0x65, 0xA, 0x65, 0x0, 0x22, 0xA, 0x66, 0xA, 0x66, 0x0, 0x9, 0xA, 0x67, 0xA, 0x67, 0x0, 0x22, 0xA, 0x68, 0xA, 0x68, 0x0, 0x9, 0xA, 0x69, 0xA, 0x69, 0x0, 0x20, 0xA, 0x6A, 0xA, 0x6A, 0x0, 0x21, 0xA, 0x6C, 0xA, 0x6C, 0x0, 0x3, 0xA, 0x6D, 0xA, 0x6D, 0x0, 0x1, 0xA, 0x6E, 0xA, 0x6E, 0x0, 0x6, 0xA, 0x6F, 0xA, 0x6F, 0x0, 0x7, 0xA, 0x70, 0xA, 0x70, 0x0, 0x6, 0xA, 0x71, 0xA, 0x71, 0x0, 0x7, 0xA, 0x72, 0xA, 0x72, 0x0, 0x6, 0xA, 0x73, 0xA, 0x73, 0x0, 0x7, 0xA, 0x74, 0xA, 0x74, 0x0, 0x6, 0xA, 0x75, 0xA, 0x75, 0x0, 0x7, 0xA, 0x76, 0xA, 0x76, 0x0, 0x6, 0xA, 0x77, 0xA, 0x77, 0x0, 0x7, 0xA, 0x78, 0xA, 0x78, 0x0, 0x6, 0xA, 0x79, 0xA, 0x79, 0x0, 0x7, 0xA, 0x7A, 0xA, 0x7A, 0x0, 0x6, 0xA, 0x7B, 0xA, 0x7B, 0x0, 0x7, 0xA, 0x7C, 0xA, 0x7C, 0x0, 0x6, 0xA, 0x7D, 0xA, 0x7D, 0x0, 0x7, 0xA, 0x7E, 0xA, 0x7E, 0x0, 0x6, 0xA, 0x7F, 0xA, 0x7F, 0x0, 0x7, 0xA, 0x80, 0xA, 0x80, 0x0, 0x6, 0xA, 0x81, 0xA, 0x81, 0x0, 0x7, 0xA, 0x82, 0xA, 0x82, 0x0, 0x6, 0xA, 0x83, 0xA, 0x83, 0x0, 0x7, 0xA, 0x84, 0xA, 0x84, 0x0, 0x6, 0xA, 0x85, 0xA, 0x85, 0x0, 0x7, 0xA, 0x87, 0xA, 0x87, 0x0, 0x1, 0xA, 0x89, 0xA, 0x89, 0x0, 0x1, 0xA, 0x8B, 0xA, 0x8B, 0x0, 0x1, 0xA, 0x8D, 0xA, 0x8D, 0x0, 0x1, 0xA, 0x8F, 0xA, 0x8F, 0x0, 0x1, 0xA, 0x91, 0xA, 0x91, 0x0, 0x1, 0xA, 0x93, 0xA, 0x93, 0x0, 0x1, 0xA, 0x95, 0xA, 0x95, 0x0, 0x1, 0xA, 0x9A, 0xA, 0x9A, 0x0, 0x2, 0xA, 0x9B, 0xA, 0x9B, 0x0, 0x4, 0xA, 0x9C, 0xA, 0x9C, 0x0, 0x2, 0xA, 0x9D, 0xA, 0x9D, 0x0, 0x4, 0xA, 0x9E, 0xA, 0x9E, 0x0, 0x2, 0xA, 0x9F, 0xA, 0x9F, 0x0, 0x4, 0xA, 0xA0, 0xA, 0xA0, 0x0, 0x2, 0xA, 0xA1, 0xA, 0xA1, 0x0, 0x4, 0xA, 0xA2, 0xA, 0xA2, 0x0, 0x2, 0xA, 0xA3, 0xA, 0xA3, 0x0, 0x4, 0xA, 0xA4, 0xA, 0xA4, 0x0, 0x2, 0xA, 0xA5, 0xA, 0xA5, 0x0, 0x4, 0xA, 0xA6, 0xA, 0xA6, 0x0, 0x2, 0xA, 0xA7, 0xA, 0xA7, 0x0, 0x4, 0xA, 0xA8, 0xA, 0xA8, 0x0, 0x2, 0xA, 0xA9, 0xA, 0xA9, 0x0, 0x1, 0xA, 0xAA, 0xA, 0xAA, 0x0, 0x2, 0xA, 0xAB, 0xA, 0xAB, 0x0, 0x1, 0xA, 0xAC, 0xA, 0xAC, 0x0, 0x2, 0xA, 0xAD, 0xA, 0xAD, 0x0, 0x1, 0xA, 0xAE, 0xA, 0xAE, 0x0, 0x2, 0xA, 0xAF, 0xA, 0xAF, 0x0, 0x4, 0xA, 0xB0, 0xA, 0xB0, 0x0, 0x2, 0xA, 0xB1, 0xA, 0xB1, 0x0, 0x1, 0xA, 0xB2, 0xA, 0xB2, 0x0, 0xA, 0xA, 0xB3, 0xA, 0xB3, 0x0, 0x5, 0xA, 0xB4, 0xA, 0xB4, 0x0, 0xA, 0xA, 0xB5, 0xA, 0xB5, 0x0, 0x5, 0xA, 0xB7, 0xA, 0xB7, 0x0, 0x5, 0xA, 0xB9, 0xA, 0xB9, 0x0, 0x5, 0xA, 0xBB, 0xA, 0xBB, 0x0, 0x5, 0xA, 0xBD, 0xA, 0xBD, 0x0, 0x5, 0xA, 0xBF, 0xA, 0xBF, 0x0, 0x5, 0xA, 0xC0, 0xA, 0xC0, 0x0, 0xC, 0xA, 0xC1, 0xA, 0xC1, 0x0, 0x9, 0xA, 0xC2, 0xA, 0xC2, 0x0, 0xC, 0xA, 0xC3, 0xA, 0xC3, 0x0, 0x9, 0xA, 0xC4, 0xA, 0xC4, 0x0, 0xC, 0xA, 0xC5, 0xA, 0xC5, 0x0, 0x9, 0xA, 0xC7, 0xA, 0xC7, 0x0, 0xB, 0xA, 0xC9, 0xA, 0xC9, 0x0, 0x20, 0xA, 0xCA, 0xA, 0xCA, 0x0, 0x21, 0xA, 0xCC, 0xA, 0xCC, 0x0, 0x3, 0xA, 0xD6, 0xA, 0xD6, 0x0, 0xC, 0xA, 0xDC, 0xA, 0xDC, 0x0, 0x1F, 0xA, 0xE7, 0xA, 0xE7, 0x0, 0x3, 0xA, 0xED, 0xA, 0xED, 0x0, 0x3, 0xA, 0xEE, 0xA, 0xEE, 0x0, 0x6, 0xA, 0xEF, 0xA, 0xEF, 0x0, 0x7, 0xA, 0xF2, 0xA, 0xF2, 0x0, 0x2, 0xA, 0xF3, 0xA, 0xF3, 0x0, 0x4, 0xA, 0xF4, 0xA, 0xF4, 0x0, 0xA, 0xA, 0xF5, 0xA, 0xF5, 0x0, 0x5, 0xA, 0xF6, 0xA, 0xF6, 0x0, 0xA, 0xA, 0xF7, 0xA, 0xF7, 0x0, 0x5, 0xA, 0xF8, 0xA, 0xF8, 0x0, 0xA, 0xA, 0xF9, 0xA, 0xF9, 0x0, 0x5, 0xA, 0xFA, 0xA, 0xFA, 0x0, 0xA, 0xA, 0xFB, 0xA, 0xFB, 0x0, 0x5, 0xA, 0xFC, 0xA, 0xFC, 0x0, 0xA, 0xA, 0xFD, 0xA, 0xFD, 0x0, 0x5, 0xA, 0xFE, 0xA, 0xFE, 0x0, 0x1, 0xA, 0xFF, 0xA, 0xFF, 0x0, 0x6, 0xB, 0x0, 0xB, 0x0, 0x0, 0x7, 0xB, 0x1, 0xB, 0x1, 0x0, 0x6, 0xB, 0x2, 0xB, 0x2, 0x0, 0x7, 0xB, 0x4, 0xB, 0x4, 0x0, 0x7, 0xB, 0x6, 0xB, 0x6, 0x0, 0x1, 0xB, 0x9, 0xB, 0x9, 0x0, 0x2, 0xB, 0xA, 0xB, 0xA, 0x0, 0x4, 0xB, 0xB, 0xB, 0xB, 0x0, 0x2, 0xB, 0xC, 0xB, 0xC, 0x0, 0x4, 0xB, 0xF, 0xB, 0xF, 0x0, 0x1, 0xB, 0x13, 0xB, 0x13, 0x0, 0x3, 0xB, 0x14, 0xB, 0x14, 0x0, 0x6, 0xB, 0x15, 0xB, 0x15, 0x0, 0x7, 0xB, 0x16, 0xB, 0x16, 0x0, 0x6, 0xB, 0x17, 0xB, 0x17, 0x0, 0x7, 0xB, 0x19, 0xB, 0x19, 0x0, 0x1, 0xB, 0x1B, 0xB, 0x1B, 0x0, 0x1, 0xB, 0x20, 0xB, 0x20, 0x0, 0x2, 0xB, 0x21, 0xB, 0x21, 0x0, 0x4, 0xB, 0x22, 0xB, 0x22, 0x0, 0x2, 0xB, 0x23, 0xB, 0x23, 0x0, 0x4, 0xB, 0x29, 0xB, 0x29, 0x0, 0x5, 0xB, 0x2B, 0xB, 0x2B, 0x0, 0x5, 0xB, 0x2E, 0xB, 0x2E, 0x0, 0x6, 0xB, 0x2F, 0xB, 0x2F, 0x0, 0x7, 0xB, 0x32, 0xB, 0x32, 0x0, 0x2, 0xB, 0x33, 0xB, 0x33, 0x0, 0x4, 0xB, 0x34, 0xB, 0x34, 0x0, 0x2, 0xB, 0x35, 0xB, 0x35, 0x0, 0x4, 0xB, 0x36, 0xB, 0x36, 0x0, 0x2, 0xB, 0x37, 0xB, 0x37, 0x0, 0x4, 0xB, 0x38, 0xB, 0x38, 0x0, 0x2, 0xB, 0x39, 0xB, 0x39, 0x0, 0x4, 0xB, 0x3B, 0xB, 0x3B, 0x0, 0x9, 0xB, 0x3C, 0xB, 0x3C, 0x0, 0x4, 0xB, 0x3F, 0xB, 0x3F, 0x0, 0x23, 0xB, 0x42, 0xB, 0x42, 0x0, 0x1, 0xB, 0x49, 0xB, 0x49, 0x0, 0x2, 0xB, 0x4A, 0xB, 0x4A, 0x0, 0x1, 0xB, 0x4B, 0xB, 0x4B, 0x0, 0x16, 0xB, 0x53, 0xB, 0x53, 0x0, 0x2, 0xB, 0x54, 0xB, 0x54, 0x0, 0x1, 0xB, 0x56, 0xB, 0x56, 0x0, 0x1, 0xB, 0x58, 0xB, 0x58, 0x0, 0x1, 0xB, 0x5A, 0xB, 0x5A, 0x0, 0x1, 0xB, 0x5C, 0xB, 0x5C, 0x0, 0x1, 0xB, 0x5E, 0xB, 0x5E, 0x0, 0x1, 0xB, 0x60, 0xB, 0x60, 0x0, 0x1, 0xB, 0x62, 0xB, 0x62, 0x0, 0x1, 0xB, 0x64, 0xB, 0x64, 0x0, 0x1, 0xB, 0x66, 0xB, 0x66, 0x0, 0x1, 0xB, 0x68, 0xB, 0x68, 0x0, 0x1, 0xB, 0x6B, 0xB, 0x6B, 0x0, 0x2, 0xB, 0x6C, 0xB, 0x6C, 0x0, 0x1, 0xB, 0x84, 0xB, 0x84, 0x0, 0x3, 0xB, 0x86, 0xB, 0x86, 0x0, 0x3, 0xB, 0x88, 0xB, 0x88, 0x0, 0x3, 0xB, 0x8A, 0xB, 0x8A, 0x0, 0x3, 0xB, 0x8C, 0xB, 0x8C, 0x0, 0x3, 0xB, 0x8E, 0xB, 0x8E, 0x0, 0x3, 0xB, 0x8F, 0xB, 0x8F, 0x0, 0x2, 0xB, 0x90, 0xB, 0x90, 0x0, 0x4, 0xB, 0x91, 0xB, 0x91, 0x0, 0x2, 0xB, 0x92, 0xB, 0x92, 0x0, 0x4, 0xB, 0x93, 0xB, 0x93, 0x0, 0x2, 0xB, 0x94, 0xB, 0x94, 0x0, 0x4, 0xB, 0x95, 0xB, 0x95, 0x0, 0x2, 0xB, 0x96, 0xB, 0x96, 0x0, 0x4, 0xB, 0xA3, 0xB, 0xA3, 0x0, 0x10, 0xB, 0xA4, 0xB, 0xA4, 0x0, 0xE, 0xB, 0xA5, 0xB, 0xA5, 0x0, 0x10, 0xB, 0xA6, 0xB, 0xA6, 0x0, 0xE, 0xB, 0xA7, 0xB, 0xA7, 0x0, 0x10, 0xB, 0xA8, 0xB, 0xA8, 0x0, 0xE, 0xB, 0xA9, 0xB, 0xA9, 0x0, 0x10, 0xB, 0xAA, 0xB, 0xAA, 0x0, 0xE, 0xB, 0xAB, 0xB, 0xAB, 0x0, 0x10, 0xB, 0xAC, 0xB, 0xAC, 0x0, 0xE, 0xB, 0xAD, 0xB, 0xAD, 0x0, 0xB, 0xB, 0xAF, 0xB, 0xAF, 0x0, 0xB, 0xB, 0xB1, 0xB, 0xB1, 0x0, 0xB, 0xB, 0xB3, 0xB, 0xB3, 0x0, 0xB, 0xB, 0xB5, 0xB, 0xB5, 0x0, 0xA, 0xB, 0xB6, 0xB, 0xB6, 0x0, 0x5, 0xB, 0xB7, 0xB, 0xB7, 0x0, 0xA, 0xB, 0xB8, 0xB, 0xB8, 0x0, 0x5, 0xB, 0xB9, 0xB, 0xB9, 0x0, 0xA, 0xB, 0xBA, 0xB, 0xBA, 0x0, 0x5, 0xB, 0xBB, 0xB, 0xBB, 0x0, 0xA, 0xB, 0xBC, 0xB, 0xBC, 0x0, 0x5, 0xB, 0xBD, 0xB, 0xBD, 0x0, 0xA, 0xB, 0xBE, 0xB, 0xBE, 0x0, 0x5, 0xB, 0xBF, 0xB, 0xBF, 0x0, 0x1D, 0xB, 0xC0, 0xB, 0xC0, 0x0, 0x9, 0xB, 0xC1, 0xB, 0xC1, 0x0, 0x1D, 0xB, 0xC2, 0xB, 0xC2, 0x0, 0x9, 0xB, 0xC3, 0xB, 0xC3, 0x0, 0x16, 0xB, 0xC5, 0xB, 0xC5, 0x0, 0x16, 0xB, 0xC7, 0xB, 0xC7, 0x0, 0x11, 0xB, 0xC8, 0xB, 0xC8, 0x0, 0x15, 0xB, 0xC9, 0xB, 0xC9, 0x0, 0x11, 0xB, 0xCA, 0xB, 0xCA, 0x0, 0x15, 0xB, 0xCB, 0xB, 0xCB, 0x0, 0xC, 0xB, 0xCC, 0xB, 0xCC, 0x0, 0x9, 0xB, 0xCD, 0xB, 0xCD, 0x0, 0x13, 0xB, 0xCE, 0xB, 0xCE, 0x0, 0xF, 0xB, 0xCF, 0xB, 0xCF, 0x0, 0x13, 0xB, 0xD0, 0xB, 0xD0, 0x0, 0xF, 0xB, 0xD1, 0xB, 0xD1, 0x0, 0x13, 0xB, 0xD2, 0xB, 0xD2, 0x0, 0xF, 0xB, 0xD6, 0xB, 0xD6, 0x0, 0x9, 0xB, 0xD7, 0xB, 0xD7, 0x0, 0x7, 0xB, 0xD8, 0xB, 0xDF, 0x0, 0x1, 0xC, 0x14, 0xC, 0x19, 0x0, 0x4, 0xC, 0x20, 0xC, 0x27, 0x0, 0x5, 0xC, 0x44, 0xC, 0x45, 0x0, 0x4, 0xC, 0x46, 0xC, 0x47, 0x0, 0x5, 0xC, 0x4A, 0xC, 0x51, 0x0, 0x1, 0xC, 0x7A, 0xC, 0x80, 0x0, 0x1, 0xC, 0x81, 0xC, 0x82, 0x0, 0x6, 0xC, 0x85, 0xC, 0x85, 0x0, 0x6, 0xC, 0x9A, 0xC, 0x9D, 0x0, 0x5, 0xC, 0xA2, 0xC, 0xA3, 0x0, 0xC, 0xC, 0xB7, 0xC, 0xB7, 0x0, 0xD, 0xC, 0xBB, 0xC, 0xBB, 0x0, 0x8, 0xC, 0xBC, 0xC, 0xBC, 0x0, 0x17, 0xC, 0xBE, 0xC, 0xBE, 0x0, 0xD, 0xC, 0xCA, 0xC, 0xCA, 0x0, 0x17, 0xC, 0xCB, 0xC, 0xCB, 0x0, 0x1C, 0xC, 0xCD, 0xC, 0xCD, 0x0, 0x17, 0xC, 0xD6, 0xC, 0xD6, 0x0, 0xD, 0xC, 0xDD, 0xC, 0xDD, 0x0, 0x8, 0xC, 0xE0, 0xC, 0xE0, 0x0, 0x8, 0xC, 0xE1, 0xC, 0xE1, 0x0, 0x18, 0xC, 0xE2, 0xC, 0xE2, 0x0, 0x1C, 0xC, 0xE5, 0xC, 0xE5, 0x0, 0x8, 0xC, 0xE6, 0xC, 0xE6, 0x0, 0x17, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0xC, 0x0, 0xA6, 0x0, 0x1, 0x3, 0x8C, 0x9, 0xA, 0x0, 0x2, 0x0, 0x19, 0x1, 0xB1, 0x1, 0xC5, 0x0, 0x0, 0x1, 0xCB, 0x1, 0xCB, 0x0, 0x15, 0x1, 0xEE, 0x1, 0xF5, 0x0, 0x16, 0x1, 0xF7, 0x1, 0xF7, 0x0, 0x1E, 0x1, 0xFB, 0x1, 0xFD, 0x0, 0x1F, 0x2, 0x1, 0x2, 0x3, 0x0, 0x22, 0x2, 0x8, 0x2, 0x8, 0x0, 0x25, 0x2, 0xC, 0x2, 0xC, 0x0, 0x26, 0x2, 0x14, 0x2, 0x20, 0x0, 0x27, 0x2, 0xBA, 0x2, 0xBE, 0x0, 0x34, 0x3, 0x20, 0x3, 0x24, 0x0, 0x39, 0x3, 0x2B, 0x3, 0x2C, 0x0, 0x3E, 0x3, 0xEF, 0x3, 0xF0, 0x0, 0x40, 0x3, 0xF2, 0x3, 0xF8, 0x0, 0x42, 0x3, 0xFA, 0x3, 0xFD, 0x0, 0x49, 0x4, 0x0, 0x4, 0x24, 0x0, 0x4D, 0x4, 0x27, 0x4, 0x27, 0x0, 0x72, 0x4, 0xE2, 0x4, 0xE3, 0x0, 0x73, 0x4, 0xE5, 0x4, 0xE5, 0x0, 0x75, 0x5, 0x76, 0x5, 0x95, 0x0, 0x76, 0x6, 0x8, 0x6, 0x8, 0x0, 0x96, 0x6, 0xD, 0x6, 0x16, 0x0, 0x97, 0x6, 0x37, 0x6, 0x37, 0x0, 0xA1, 0x7, 0x2D, 0x7, 0x33, 0x0, 0xA2, 0x8, 0x8A, 0x8, 0x8E, 0x0, 0xA9, 0x0, 0x2, 0x0, 0x7B, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x46, 0x0, 0x5F, 0x0, 0x1A, 0x0, 0x82, 0x0, 0x82, 0x0, 0x34, 0x0, 0x84, 0x0, 0x84, 0x0, 0x35, 0x0, 0x87, 0x0, 0x87, 0x0, 0x36, 0x0, 0x8A, 0x0, 0x8A, 0x0, 0x37, 0x0, 0x8C, 0x0, 0x97, 0x0, 0x38, 0x0, 0xA6, 0x0, 0xA7, 0x0, 0x44, 0x0, 0xAD, 0x0, 0xAD, 0x0, 0x46, 0x0, 0xB0, 0x0, 0xB0, 0x0, 0x47, 0x0, 0xB4, 0x0, 0xB5, 0x0, 0x48, 0x0, 0xBD, 0x0, 0xBD, 0x0, 0x4A, 0x0, 0xC3, 0x0, 0xC4, 0x0, 0x4B, 0x0, 0xC9, 0x0, 0xCA, 0x0, 0x4D, 0x0, 0xDB, 0x0, 0xDC, 0x0, 0x4F, 0x0, 0xEC, 0x0, 0xEC, 0x0, 0x51, 0x0, 0xF2, 0x0, 0xF2, 0x0, 0x52, 0x0, 0xF8, 0x0, 0xF9, 0x0, 0x53, 0x0, 0xFD, 0x0, 0xFE, 0x0, 0x55, 0x1, 0x1, 0x1, 0x61, 0x0, 0x57, 0x2, 0x30, 0x2, 0x30, 0x0, 0xB8, 0x2, 0x3A, 0x2, 0x3A, 0x0, 0xB9, 0x2, 0x3E, 0x2, 0x3E, 0x0, 0xBA, 0x2, 0x40, 0x2, 0x40, 0x0, 0xBB, 0x2, 0x42, 0x2, 0x42, 0x0, 0xBC, 0x2, 0x46, 0x2, 0x46, 0x0, 0xBD, 0x2, 0x4A, 0x2, 0x4A, 0x0, 0xBE, 0x2, 0x4C, 0x2, 0x4D, 0x0, 0xBF, 0x2, 0x51, 0x2, 0x51, 0x0, 0xC1, 0x2, 0x53, 0x2, 0x53, 0x0, 0xC2, 0x2, 0x69, 0x2, 0x69, 0x0, 0xC3, 0x2, 0x70, 0x2, 0x72, 0x0, 0xC4, 0x2, 0x74, 0x2, 0x74, 0x0, 0xC7, 0x2, 0x77, 0x2, 0x77, 0x0, 0xC8, 0x2, 0x7B, 0x2, 0x7B, 0x0, 0xC9, 0x2, 0x7D, 0x2, 0x7F, 0x0, 0xCA, 0x2, 0x81, 0x2, 0x91, 0x0, 0xCD, 0x2, 0x93, 0x2, 0x93, 0x0, 0xDE, 0x2, 0x95, 0x2, 0x97, 0x0, 0xDF, 0x2, 0x99, 0x2, 0x99, 0x0, 0xE2, 0x2, 0x9E, 0x2, 0x9F, 0x0, 0xE3, 0x2, 0xAC, 0x2, 0xB0, 0x0, 0xE5, 0x2, 0xB2, 0x2, 0xB2, 0x0, 0xEA, 0x2, 0xB6, 0x2, 0xB8, 0x0, 0xEB, 0x2, 0xC1, 0x2, 0xC2, 0x0, 0xEE, 0x2, 0xD8, 0x2, 0xD9, 0x0, 0xF0, 0x2, 0xE2, 0x2, 0xE2, 0x0, 0xF2, 0x2, 0xEF, 0x2, 0xEF, 0x0, 0xF3, 0x2, 0xF9, 0x2, 0xF9, 0x0, 0xF4, 0x2, 0xFB, 0x2, 0xFB, 0x0, 0xF5, 0x2, 0xFF, 0x2, 0xFF, 0x0, 0xF6, 0x3, 0x1, 0x3, 0x3, 0x0, 0xF7, 0x3, 0x5, 0x3, 0x5, 0x0, 0xFA, 0x3, 0x2F, 0x3, 0x3F, 0x0, 0xFB, 0x3, 0x43, 0x3, 0x44, 0x1, 0xC, 0x3, 0x47, 0x3, 0x4B, 0x1, 0xE, 0x3, 0x4F, 0x3, 0x5A, 0x1, 0x13, 0x3, 0x9A, 0x3, 0xA6, 0x1, 0x1F, 0x3, 0xA8, 0x3, 0xA9, 0x1, 0x2C, 0x3, 0xAB, 0x3, 0xC9, 0x1, 0x2E, 0x4, 0x2B, 0x4, 0x2E, 0x1, 0x4D, 0x7, 0x4E, 0x7, 0x62, 0x1, 0x51, 0x7, 0x66, 0x7, 0x66, 0x1, 0x66, 0x7, 0x71, 0x7, 0x71, 0x1, 0x67, 0x7, 0x78, 0x7, 0x7A, 0x1, 0x68, 0x7, 0x7D, 0x7, 0x7D, 0x1, 0x6B, 0x7, 0x7F, 0x7, 0x7F, 0x1, 0x6C, 0x7, 0x83, 0x7, 0x83, 0x1, 0x6D, 0x7, 0x85, 0x7, 0x87, 0x1, 0x6E, 0x7, 0x8D, 0x7, 0x8D, 0x1, 0x71, 0x7, 0x92, 0x7, 0x92, 0x1, 0x72, 0x7, 0x94, 0x7, 0x94, 0x1, 0x73, 0x7, 0x96, 0x7, 0x96, 0x1, 0x74, 0x7, 0xA6, 0x7, 0xA6, 0x1, 0x75, 0x7, 0xA9, 0x7, 0xA9, 0x1, 0x76, 0x7, 0xAB, 0x7, 0xAB, 0x1, 0x77, 0x7, 0xAE, 0x7, 0xB1, 0x1, 0x78, 0x7, 0xDE, 0x7, 0xE2, 0x1, 0x7C, 0x7, 0xEE, 0x7, 0xFD, 0x1, 0x81, 0x8, 0xAD, 0x8, 0xB0, 0x1, 0x91, 0x8, 0xB3, 0x8, 0xB8, 0x1, 0x95, 0x8, 0xC8, 0x9, 0x30, 0x1, 0x9B, 0x9, 0x33, 0x9, 0xD4, 0x2, 0x4, 0x9, 0xEB, 0x9, 0xEC, 0x2, 0xA6, 0x9, 0xF7, 0x9, 0xF8, 0x2, 0xA8, 0x9, 0xFC, 0x9, 0xFD, 0x2, 0xAA, 0xA, 0x0, 0xA, 0x0, 0x2, 0xAC, 0xA, 0x3, 0xA, 0x4, 0x2, 0xAD, 0xA, 0x9, 0xA, 0x9, 0x2, 0xAF, 0xA, 0x12, 0xA, 0x14, 0x2, 0xB0, 0xA, 0x16, 0xA, 0x17, 0x2, 0xB3, 0xA, 0x19, 0xA, 0x1E, 0x2, 0xB5, 0xA, 0x20, 0xA, 0x29, 0x2, 0xBB, 0xA, 0x2D, 0xA, 0x2D, 0x2, 0xC5, 0xA, 0x2F, 0xA, 0x36, 0x2, 0xC6, 0xA, 0x38, 0xA, 0x3A, 0x2, 0xCE, 0xA, 0x44, 0xA, 0x45, 0x2, 0xD1, 0xA, 0x47, 0xA, 0x4A, 0x2, 0xD3, 0xA, 0x4D, 0xA, 0x4F, 0x2, 0xD7, 0xA, 0x51, 0xA, 0x5B, 0x2, 0xDA, 0xA, 0x5E, 0xA, 0x6C, 0x2, 0xE5, 0xA, 0x6E, 0xA, 0xC5, 0x2, 0xF4, 0xA, 0xE7, 0xA, 0xE7, 0x3, 0x4C, 0xA, 0xEE, 0xB, 0xC, 0x3, 0x4D, 0xB, 0x10, 0xB, 0x3E, 0x3, 0x6C, 0xB, 0x41, 0xB, 0x41, 0x3, 0x9B, 0xB, 0x4D, 0xB, 0xD7, 0x3, 0x9C, 0xC, 0x7A, 0xC, 0x7B, 0x4, 0x27, 0xC, 0x81, 0xC, 0x82, 0x4, 0x29, 0xC, 0x90, 0xC, 0x91, 0x4, 0x2B, 0xC, 0x96, 0xC, 0x97, 0x4, 0x2D, 0xC, 0x9A, 0xC, 0x9B, 0x4, 0x2F, 0xC, 0xA2, 0xC, 0xA3, 0x4, 0x31, 0xC, 0xB7, 0xC, 0xBC, 0x4, 0x33, 0xC, 0xBE, 0xC, 0xDD, 0x4, 0x39, 0xC, 0xDF, 0xC, 0xE6, 0x4, 0x59, 0xC, 0xE8, 0xC, 0xE9, 0x4, 0x61, 0xC, 0xEB, 0xC, 0xEB, 0x4, 0x63, 0xC, 0xED, 0xD, 0x4, 0x4, 0x64, 0xD, 0x7, 0xD, 0xD, 0x4, 0x7C, 0xD, 0xF, 0xD, 0x11, 0x4, 0x83, 0xD, 0x13, 0xD, 0x1B, 0x4, 0x86, 0xD, 0x1D, 0xD, 0x1E, 0x4, 0x8F, 0x0, 0xAE, 0x0, 0x0, 0x2, 0xBA, 0x0, 0x0, 0x2, 0xC0, 0x0, 0x0, 0x2, 0xC6, 0x0, 0x0, 0x5, 0x66, 0x0, 0x0, 0x2, 0xCC, 0x0, 0x0, 0x2, 0xD2, 0x0, 0x0, 0x2, 0xD8, 0x0, 0x0, 0x5, 0x78, 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x2, 0xDE, 0x0, 0x0, 0x2, 0xE4, 0x0, 0x0, 0x2, 0xEA, 0x0, 0x0, 0x5, 0x78, 0x0, 0x0, 0x2, 0xF0, 0x0, 0x0, 0x2, 0xF6, 0x0, 0x0, 0x2, 0xFC, 0x0, 0x0, 0x3, 0x2, 0x0, 0x0, 0x3, 0x2, 0x0, 0x0, 0x3, 0x8, 0x0, 0x0, 0x3, 0xE, 0x0, 0x0, 0x3, 0x14, 0x0, 0x0, 0x3, 0x1A, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x3, 0x26, 0x0, 0x0, 0x3, 0x2C, 0x0, 0x0, 0x3, 0x32, 0x0, 0x0, 0x3, 0x38, 0x0, 0x0, 0x3, 0x3E, 0x0, 0x0, 0x3, 0x44, 0x0, 0x0, 0x3, 0x4A, 0x0, 0x0, 0x3, 0x50, 0x0, 0x0, 0x3, 0x56, 0x0, 0x0, 0x3, 0x5C, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, 0x3, 0x68, 0x0, 0x0, 0x3, 0x6E, 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x3, 0x7A, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x4, 0x7C, 0x0, 0x0, 0x3, 0x86, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x3, 0xC2, 0x0, 0x0, 0x3, 0x8C, 0x0, 0x0, 0x4, 0xA6, 0x0, 0x0, 0x3, 0xC2, 0x0, 0x0, 0x4, 0x3A, 0x0, 0x0, 0x3, 0x92, 0x0, 0x0, 0x3, 0x98, 0x0, 0x0, 0x4, 0x3A, 0x0, 0x0, 0x3, 0x9E, 0x0, 0x0, 0x3, 0xA4, 0x0, 0x0, 0x3, 0xAA, 0x0, 0x0, 0x3, 0xB0, 0x0, 0x0, 0x3, 0xB6, 0x0, 0x0, 0x3, 0xBC, 0x0, 0x0, 0x3, 0xC2, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x3, 0xC8, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x3, 0xCE, 0x0, 0x0, 0x3, 0xD4, 0x0, 0x0, 0x3, 0xDA, 0x0, 0x0, 0x3, 0xE0, 0x0, 0x0, 0x3, 0xE6, 0x0, 0x0, 0x3, 0xEC, 0x0, 0x0, 0x3, 0xF2, 0x0, 0x0, 0x3, 0xF8, 0x0, 0x0, 0x3, 0xFE, 0x0, 0x0, 0x4, 0x4, 0x0, 0x0, 0x4, 0xA, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x5, 0x1E, 0x0, 0x0, 0x4, 0x16, 0x0, 0x0, 0x4, 0x1C, 0x0, 0x0, 0x4, 0x22, 0x0, 0x0, 0x4, 0x28, 0x0, 0x0, 0x4, 0x2E, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x34, 0x0, 0x0, 0x4, 0x3A, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, 0x4, 0x46, 0x0, 0x0, 0x4, 0x4C, 0x0, 0x0, 0x4, 0x4C, 0x0, 0x0, 0x4, 0x52, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x58, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x5E, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x64, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x4, 0x6A, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x4, 0x76, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x4, 0x7C, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x4, 0x82, 0x0, 0x0, 0x4, 0x88, 0x0, 0x0, 0x4, 0x8E, 0x0, 0x0, 0x4, 0x94, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x4, 0x9A, 0x0, 0x0, 0x4, 0xA0, 0x0, 0x0, 0x4, 0xDC, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x4, 0xA6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xAC, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xB2, 0x0, 0x0, 0x4, 0xB8, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xBE, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xC4, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x4, 0xD0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xD6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xDC, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xE2, 0x0, 0x0, 0x4, 0xE8, 0x0, 0x0, 0x4, 0xEE, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xFA, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x6, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x5, 0xC, 0x0, 0x0, 0x5, 0x12, 0x0, 0x0, 0x5, 0x18, 0x0, 0x0, 0x5, 0x1E, 0x0, 0x0, 0x5, 0x24, 0x0, 0x0, 0x5, 0x2A, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x5, 0x30, 0x0, 0x0, 0x5, 0x36, 0x0, 0x0, 0x5, 0x3C, 0x0, 0x0, 0x5, 0x42, 0x0, 0x0, 0x5, 0x48, 0x0, 0x0, 0x5, 0x4E, 0x0, 0x0, 0x5, 0x54, 0x0, 0x0, 0x5, 0x5A, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x5, 0x66, 0x0, 0x0, 0x5, 0x66, 0x0, 0x0, 0x5, 0x6C, 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x5, 0x78, 0x0, 0x1, 0xFD, 0xEA, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xD5, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xB5, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xBB, 0x5, 0x5, 0x0, 0x1, 0xFD, 0xBA, 0x6, 0x28, 0x0, 0x1, 0xFD, 0xB9, 0x4, 0xAA, 0x0, 0x1, 0xFD, 0xA8, 0x5, 0x4, 0x0, 0x1, 0xFD, 0xBA, 0x4, 0xCF, 0x0, 0x1, 0xFD, 0x6B, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xB9, 0x4, 0x9F, 0x0, 0x1, 0xFD, 0xB5, 0x4, 0x9F, 0x0, 0x1, 0xFE, 0x35, 0x5, 0xD, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0xA0, 0x0, 0x1, 0xFD, 0xB7, 0x4, 0x2A, 0x0, 0x1, 0xFD, 0xA1, 0x4, 0x2A, 0x0, 0x1, 0xFD, 0xD0, 0x4, 0x2A, 0x0, 0x1, 0xFE, 0x48, 0x4, 0xEF, 0x0, 0x1, 0xFD, 0xF3, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0x48, 0x0, 0x1, 0xFD, 0xB5, 0x5, 0xBE, 0x0, 0x1, 0x0, 0x20, 0x5, 0xA, 0x0, 0x1, 0xFF, 0x97, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xC3, 0x5, 0xA, 0x0, 0x1, 0xFD, 0x9D, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xB1, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xB9, 0x4, 0xAD, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0xE6, 0x0, 0x1, 0xFD, 0x9B, 0x4, 0x6B, 0x0, 0x1, 0xFD, 0xC4, 0x4, 0xDC, 0x0, 0x1, 0xFD, 0xC2, 0x4, 0xA7, 0x0, 0x1, 0xFE, 0x3, 0x4, 0x58, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0xC3, 0x0, 0x1, 0xFD, 0x85, 0x4, 0x5F, 0x0, 0x1, 0xFD, 0xA3, 0x4, 0xC4, 0x0, 0x1, 0xFD, 0xCA, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC2, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xE0, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xA2, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xEA, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xE0, 0x4, 0xA6, 0x0, 0x1, 0xFE, 0x4D, 0x4, 0xA6, 0x0, 0x1, 0xFD, 0xF5, 0x5, 0x0, 0x0, 0x1, 0xFE, 0x20, 0x5, 0x0, 0x0, 0x1, 0xFD, 0xA7, 0x4, 0xA6, 0x0, 0x1, 0xFD, 0xC5, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBD, 0x4, 0x59, 0x0, 0x1, 0xFD, 0x9D, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC3, 0x5, 0x46, 0x0, 0x1, 0xFD, 0xCF, 0x5, 0x46, 0x0, 0x1, 0xFD, 0xAA, 0x5, 0xA, 0x0, 0x1, 0xFD, 0x87, 0x5, 0xA, 0x0, 0x1, 0xFE, 0x1B, 0x4, 0x92, 0x0, 0x1, 0xFE, 0x4D, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xAB, 0x4, 0x92, 0x0, 0x1, 0xFE, 0xB, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xD2, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xD9, 0x4, 0x92, 0x0, 0x1, 0xFE, 0x17, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xA7, 0x4, 0x92, 0x0, 0x1, 0x0, 0x1, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xEB, 0x3, 0xD8, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0x84, 0x0, 0x1, 0xFD, 0xBD, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC0, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC8, 0x4, 0x92, 0x0, 0x1, 0xFD, 0x99, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC2, 0x3, 0xBF, 0x0, 0x1, 0xFD, 0xBB, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBC, 0x3, 0xCC, 0x0, 0x1, 0xFD, 0xD6, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xD4, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xAE, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB1, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xF6, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB9, 0x3, 0xE1, 0x0, 0x1, 0xFD, 0xC7, 0x4, 0x92, 0x0, 0x1, 0xFD, 0x9B, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB9, 0x3, 0xB3, 0x0, 0x1, 0xFD, 0xB4, 0x3, 0xAE, 0x0, 0x1, 0xFD, 0x8A, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xAA, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xAD, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBF, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBA, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xCE, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB5, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBE, 0x3, 0xB0, 0x0, 0x1, 0xFD, 0xD8, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC9, 0x4, 0x92, 0x0, 0x1, 0xFD, 0x93, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xA5, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC6, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB3, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xF5, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xF4, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB9, 0x4, 0x92, 0x0, 0x1, 0xFD, 0x94, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xAC, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBC, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xA6, 0x3, 0xCE, 0x0, 0x1, 0xFD, 0x84, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xCC, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xDC, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB6, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBE, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xD7, 0x4, 0x92, 0x0, 0x1, 0xFE, 0x7A, 0x4, 0x92, 0x0, 0x1, 0x1, 0x86, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xE1, 0x4, 0x92, 0x0, 0x1, 0x2, 0x1F, 0x4, 0x92, 0x0, 0x1, 0xFE, 0xC5, 0x4, 0x92, 0x0, 0x1, 0xFC, 0xAA, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB7, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xD4, 0x4, 0xE8, 0x0, 0x1, 0xFD, 0xBB, 0x5, 0xA, 0x0, 0x1, 0xFD, 0x67, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xB8, 0x5, 0xA, 0x4, 0x91, 0x19, 0x1A, 0x16, 0x2C, 0xF, 0x48, 0x16, 0x50, 0x19, 0x26, 0x9, 0x24, 0xF, 0xE4, 0x16, 0x9E, 0x13, 0xFE, 0x9, 0x2A, 0x16, 0xB0, 0x16, 0xC8, 0x16, 0xE0, 0x37, 0x92, 0x19, 0x32, 0x16, 0x2C, 0xB, 0x9A, 0x17, 0x40, 0x17, 0x58, 0x17, 0x7C, 0x17, 0x94, 0x17, 0xAC, 0x17, 0xC4, 0x9, 0x30, 0x14, 0x82, 0x18, 0x0, 0x19, 0x20, 0x16, 0x32, 0x12, 0x8A, 0x16, 0x56, 0x19, 0x2C, 0x9, 0x36, 0x19, 0x2C, 0x18, 0x6, 0x14, 0x4, 0x9, 0x3C, 0x16, 0xB6, 0x16, 0xCE, 0x16, 0xE6, 0x16, 0xF8, 0x19, 0x38, 0x12, 0x84, 0x9, 0x42, 0x17, 0x46, 0x17, 0x4C, 0x17, 0x82, 0x17, 0x88, 0x17, 0xB2, 0x17, 0xCA, 0x12, 0x90, 0x14, 0x88, 0x56, 0xB0, 0x9, 0x48, 0x9, 0x4E, 0x9, 0x54, 0x9, 0x5A, 0x16, 0x56, 0x9, 0x60, 0x19, 0xDA, 0xC, 0xFC, 0x9, 0x66, 0x9, 0x6C, 0x37, 0x92, 0x16, 0xF8, 0x9, 0x72, 0x9, 0x78, 0x9, 0x7E, 0x16, 0x32, 0x9, 0x84, 0x9, 0x8A, 0x9, 0x90, 0x9, 0x96, 0x14, 0x3A, 0x14, 0x40, 0x9, 0x9C, 0x14, 0x76, 0x14, 0x7C, 0x18, 0x0, 0x56, 0xB0, 0xF, 0xE4, 0xE, 0xA, 0xE, 0xFA, 0x9, 0xA2, 0x9, 0xA8, 0x9, 0xAE, 0x9, 0xB4, 0x9, 0xBA, 0x17, 0x40, 0x9, 0xC0, 0x9, 0xC6, 0xA, 0xC2, 0xD, 0xC2, 0x9, 0xCC, 0x9, 0xD2, 0x9, 0xD8, 0x9, 0xDE, 0x9, 0xE4, 0x9, 0xEA, 0x9, 0xF0, 0x9, 0xF6, 0x14, 0xE8, 0x9, 0xFC, 0x19, 0x20, 0xD, 0x8C, 0xD, 0x8C, 0x17, 0x4C, 0xA, 0x2, 0x19, 0x2C, 0x19, 0x2C, 0xA, 0x8, 0xC, 0xC6, 0xA, 0xE, 0xA, 0x14, 0xA, 0x1A, 0xA, 0x1A, 0xA, 0x20, 0xA, 0x26, 0xA, 0x2C, 0xA, 0x32, 0xA, 0x38, 0xA, 0x3E, 0xA, 0x44, 0xA, 0x4A, 0xA, 0x4A, 0xA, 0x50, 0xA, 0x56, 0x16, 0xF8, 0x14, 0xA6, 0xA, 0x5C, 0xA, 0x62, 0xA, 0x68, 0xA, 0x74, 0xA, 0x6E, 0xA, 0x74, 0xA, 0x7A, 0xA, 0x7A, 0xA, 0x80, 0xA, 0x86, 0xA, 0x8C, 0xA, 0x92, 0xA, 0xF8, 0xA, 0x98, 0xA, 0x98, 0xA, 0x9E, 0xA, 0xA4, 0xA, 0xAA, 0xA, 0xB0, 0xA, 0xB6, 0xD, 0x26, 0xD, 0xF8, 0xA, 0xBC, 0xC, 0xF6, 0xB, 0x58, 0xA, 0xC2, 0xA, 0xC8, 0xA, 0xCE, 0xA, 0xD4, 0xA, 0xD4, 0xA, 0xDA, 0xA, 0xE0, 0xA, 0xE6, 0xA, 0xEC, 0xA, 0xF2, 0xA, 0xF8, 0xA, 0xFE, 0xB, 0x4, 0xD, 0xEC, 0xB, 0xA, 0xB, 0x10, 0xB, 0x16, 0xB, 0x1C, 0xB, 0x22, 0x37, 0xA4, 0xB, 0x28, 0xB, 0x2E, 0xB, 0x34, 0xB, 0x3A, 0xB, 0x40, 0xB, 0x46, 0xB, 0x4C, 0xB, 0x52, 0xB, 0x58, 0xB, 0x5E, 0xB, 0x5E, 0xB, 0x64, 0xB, 0x6A, 0xB, 0x70, 0x14, 0xA6, 0xB, 0x76, 0xB, 0x7C, 0xB, 0x82, 0x12, 0xFC, 0xB, 0x88, 0xB, 0x8E, 0xB, 0x94, 0xB, 0x9A, 0xB, 0xA0, 0xB, 0xA6, 0xB, 0xAC, 0xB, 0xB2, 0xB, 0xB8, 0xB, 0xBE, 0xB, 0xC4, 0xB, 0xCA, 0xC, 0x8A, 0x16, 0x14, 0xB, 0xD0, 0xB, 0xD6, 0xB, 0xDC, 0xB, 0xE2, 0xB, 0xE8, 0xB, 0xEE, 0xB, 0xF4, 0xB, 0xFA, 0x16, 0x1A, 0xC, 0x0, 0xC, 0x6, 0xC, 0xC, 0xC, 0x12, 0xC, 0x18, 0xC, 0x30, 0xC, 0x1E, 0xC, 0x24, 0xC, 0x2A, 0xC, 0x30, 0xC, 0x36, 0xC, 0x3C, 0xC, 0x42, 0xC, 0x48, 0xC, 0x4E, 0x13, 0x6E, 0x16, 0xE, 0xC, 0x54, 0xC, 0x5A, 0xC, 0x60, 0xC, 0x66, 0xC, 0x6C, 0xC, 0x72, 0xC, 0x78, 0xC, 0x7E, 0xC, 0x84, 0xE, 0x4, 0xC, 0x8A, 0xC, 0x90, 0xC, 0x96, 0xC, 0x9C, 0xC, 0xA2, 0xC, 0xB4, 0xC, 0xA8, 0xC, 0xAE, 0xC, 0xB4, 0xD, 0x44, 0xF, 0x24, 0xC, 0xBA, 0xC, 0xC0, 0xC, 0xC6, 0x14, 0x40, 0xC, 0xCC, 0xC, 0xD2, 0xC, 0xD8, 0xC, 0xDE, 0xC, 0xE4, 0xC, 0xEA, 0xC, 0xF0, 0xC, 0xF6, 0xC, 0xFC, 0xE, 0x4, 0xD, 0x2, 0xD, 0x8, 0xD, 0xE, 0xD, 0x14, 0xE, 0xA, 0xD, 0x1A, 0xD, 0x20, 0xD, 0x26, 0xE, 0x22, 0xD, 0x2C, 0xD, 0x32, 0x56, 0xB0, 0xD, 0x38, 0xD, 0x3E, 0x56, 0xB0, 0xD, 0x44, 0xD, 0x4A, 0xD, 0x6E, 0xD, 0x50, 0x54, 0xCA, 0xD, 0x56, 0xD, 0x5C, 0x38, 0x2E, 0xD, 0x62, 0x56, 0xEC, 0xD, 0xA4, 0xD, 0x68, 0xD, 0x6E, 0xE, 0x34, 0xD, 0x74, 0xD, 0x7A, 0xD, 0x80, 0xD, 0x86, 0xD, 0x8C, 0xD, 0x92, 0xD, 0x98, 0xD, 0x9E, 0xD, 0xA4, 0xD, 0xAA, 0xD, 0xB0, 0xD, 0xB6, 0xD, 0xBC, 0xD, 0xC2, 0xD, 0xC8, 0xD, 0xCE, 0xD, 0xD4, 0x16, 0xF8, 0xD, 0xDA, 0x17, 0x46, 0xD, 0xE0, 0xD, 0xE6, 0xD, 0xEC, 0xD, 0xF2, 0x56, 0xB0, 0xD, 0xF8, 0x16, 0xE, 0xD, 0xFE, 0xE, 0x4, 0xE, 0xA, 0xE, 0x10, 0xE, 0x16, 0xE, 0x1C, 0xE, 0x22, 0xE, 0x28, 0xE, 0x2E, 0xE, 0x34, 0xE, 0x3A, 0xE, 0x40, 0xE, 0x46, 0xE, 0x4C, 0x18, 0x66, 0x18, 0xDE, 0x18, 0xC6, 0xE, 0x8E, 0xE, 0x52, 0x12, 0x2A, 0x18, 0xC0, 0x19, 0x2, 0x11, 0xF4, 0xE, 0x58, 0x18, 0xBA, 0x19, 0x4A, 0x18, 0x72, 0x18, 0xB4, 0x11, 0xCA, 0x18, 0x6C, 0x18, 0xF0, 0x18, 0x8A, 0x18, 0xD2, 0x11, 0x9A, 0xE, 0x5E, 0x18, 0xA8, 0xE, 0x64, 0xE, 0x6A, 0x18, 0xCC, 0xE, 0x70, 0xE, 0x76, 0xE, 0x7C, 0xE, 0x82, 0xE, 0x88, 0xE, 0x8E, 0xE, 0x94, 0xE, 0x9A, 0xE, 0xA0, 0xE, 0xA6, 0xE, 0xAC, 0x19, 0x44, 0xE, 0xB2, 0x16, 0xB6, 0x10, 0xEC, 0x18, 0xD8, 0x18, 0xA2, 0x19, 0x3E, 0xE, 0xB8, 0xE, 0xBE, 0xE, 0xC4, 0xE, 0xCA, 0xE, 0xD0, 0xE, 0xFA, 0x19, 0xDA, 0xE, 0xD6, 0xE, 0xDC, 0xE, 0xFA, 0xE, 0xE2, 0xE, 0xE8, 0x19, 0xDA, 0xE, 0xEE, 0x19, 0xDA, 0x19, 0xDA, 0xE, 0xF4, 0xE, 0xFA, 0xF, 0x0, 0xF, 0x6, 0xF, 0xC, 0x16, 0x56, 0x17, 0x88, 0xF, 0x12, 0xF, 0x18, 0xF, 0x1E, 0xF, 0x24, 0xF, 0x2A, 0x19, 0x4A, 0xF, 0x30, 0x18, 0x72, 0x16, 0x50, 0x16, 0x50, 0x18, 0x6, 0x17, 0x7C, 0x17, 0x82, 0xF, 0x36, 0xF, 0x36, 0x14, 0xAC, 0xF, 0x3C, 0x13, 0x1A, 0xF, 0x42, 0x19, 0x1A, 0xF, 0x48, 0x12, 0xEA, 0x12, 0xEA, 0x13, 0xEC, 0x12, 0x60, 0xF, 0x4E, 0xF, 0x4E, 0x14, 0xB8, 0x12, 0x6C, 0xF, 0x54, 0xF, 0x5A, 0xF, 0x5A, 0x14, 0xC4, 0xF, 0x60, 0x13, 0x62, 0xF, 0x66, 0xF, 0x66, 0x14, 0xD0, 0xF, 0x6C, 0x12, 0xCC, 0xF, 0x72, 0xF, 0x72, 0x14, 0xB2, 0xF, 0x78, 0x13, 0x20, 0xF, 0x7E, 0x19, 0x20, 0x12, 0x8A, 0x15, 0x30, 0x15, 0x30, 0x15, 0xC, 0x12, 0x96, 0xF, 0x84, 0xF, 0x84, 0x14, 0xBE, 0x12, 0xA2, 0xF, 0x8A, 0x12, 0x24, 0x12, 0x24, 0x14, 0xCA, 0xF, 0x90, 0x13, 0x68, 0xF, 0x96, 0xF, 0x96, 0x14, 0xD6, 0xF, 0x9C, 0x12, 0xD2, 0x13, 0x98, 0x18, 0x30, 0xF, 0xA2, 0x18, 0x2A, 0x13, 0xCE, 0x19, 0x1A, 0x19, 0x20, 0x16, 0x38, 0x16, 0x3E, 0xF, 0xB4, 0xF, 0xBA, 0xF, 0xA8, 0xF, 0xAE, 0xF, 0xB4, 0xF, 0xBA, 0xF, 0xC0, 0x16, 0x56, 0xF, 0xC6, 0x16, 0x80, 0x16, 0x62, 0x16, 0x68, 0xF, 0xCC, 0xF, 0xDE, 0x19, 0x26, 0x19, 0x2C, 0x13, 0xEC, 0x15, 0xC, 0x15, 0x6, 0x15, 0xC, 0xF, 0xD2, 0x16, 0x68, 0xF, 0xD8, 0xF, 0xDE, 0xF, 0xE4, 0x19, 0x2C, 0x15, 0xD2, 0x15, 0xD8, 0xF, 0xEA, 0xF, 0xF0, 0x18, 0x48, 0xF, 0xF6, 0x18, 0x42, 0xF, 0xFC, 0x13, 0xFE, 0x14, 0x4, 0x10, 0x2, 0x10, 0x8, 0x12, 0xD8, 0x16, 0xB0, 0x16, 0xB6, 0x10, 0xE, 0x10, 0x14, 0x16, 0xC8, 0x16, 0xCE, 0x16, 0xC8, 0x16, 0xCE, 0x16, 0xC8, 0x16, 0xCE, 0x15, 0x36, 0x15, 0x3C, 0x37, 0x92, 0x16, 0xF8, 0x10, 0x1A, 0x10, 0x20, 0x16, 0xF8, 0x15, 0x1E, 0x15, 0x24, 0x10, 0x26, 0x11, 0x46, 0x10, 0x2C, 0x10, 0x32, 0x10, 0x38, 0x10, 0x3E, 0x17, 0x40, 0x17, 0x46, 0x10, 0x44, 0x10, 0x4A, 0x10, 0x50, 0x10, 0x56, 0x10, 0x5C, 0x10, 0x62, 0x17, 0x58, 0x17, 0x4C, 0x17, 0x58, 0x17, 0x4C, 0x10, 0x5C, 0x10, 0x62, 0x17, 0x7C, 0x17, 0x82, 0x17, 0x7C, 0x17, 0x82, 0x10, 0x68, 0x17, 0x82, 0x10, 0x6E, 0x10, 0x74, 0x10, 0x7A, 0x10, 0x80, 0x10, 0x86, 0x10, 0x8C, 0x10, 0x92, 0x10, 0x98, 0x10, 0x9E, 0x10, 0xA4, 0x17, 0x94, 0x17, 0x88, 0x10, 0xAA, 0x10, 0xB0, 0x10, 0xB6, 0x18, 0x6, 0x12, 0x4E, 0x10, 0xBC, 0x10, 0xC2, 0x10, 0xC8, 0x10, 0xCE, 0x17, 0xF4, 0x17, 0xFA, 0x10, 0xD4, 0x10, 0xDA, 0x10, 0xE0, 0x10, 0xE6, 0x10, 0xEC, 0x10, 0xEC, 0x18, 0xC0, 0x10, 0xF2, 0x10, 0xF2, 0x10, 0xF8, 0x10, 0xFE, 0x11, 0x4, 0x11, 0xA, 0x19, 0x3E, 0x18, 0xD8, 0x11, 0x10, 0x11, 0x10, 0x11, 0x82, 0x18, 0x7E, 0x11, 0x16, 0x11, 0x16, 0x11, 0x1C, 0x18, 0x90, 0x11, 0x22, 0x18, 0xFC, 0x18, 0xFC, 0x11, 0x28, 0x11, 0x2E, 0x11, 0x34, 0x11, 0x3A, 0x11, 0x3A, 0x11, 0x40, 0x11, 0x46, 0x19, 0x14, 0x11, 0x4C, 0x11, 0x52, 0x19, 0x3E, 0x11, 0x58, 0x11, 0x64, 0x11, 0x5E, 0x11, 0x64, 0x11, 0x6A, 0x11, 0x70, 0x11, 0x76, 0x11, 0x7C, 0x19, 0x44, 0x11, 0x82, 0x11, 0x88, 0x11, 0x8E, 0x11, 0x94, 0x11, 0x9A, 0x11, 0xA0, 0x11, 0xA6, 0x11, 0xAC, 0x11, 0xB2, 0x18, 0x8A, 0x11, 0xB8, 0x11, 0xBE, 0x18, 0x6C, 0x11, 0xC4, 0x11, 0xCA, 0x11, 0xCA, 0x11, 0xCA, 0x11, 0xD0, 0x18, 0x72, 0x11, 0xD6, 0x11, 0xDC, 0x11, 0xE2, 0x11, 0xE8, 0x19, 0x4A, 0x11, 0xEE, 0x11, 0xF4, 0x11, 0xFA, 0x12, 0x0, 0x12, 0x6, 0x19, 0x2, 0x12, 0x6, 0x18, 0xC0, 0x12, 0xC, 0x18, 0xC0, 0x12, 0x12, 0x12, 0x18, 0x15, 0x9C, 0x12, 0x1E, 0x12, 0x24, 0x12, 0x2A, 0x12, 0x30, 0x12, 0x36, 0x18, 0x78, 0x12, 0x3C, 0x12, 0x42, 0x12, 0x48, 0x12, 0x6C, 0x12, 0x4E, 0x12, 0x54, 0x12, 0x5A, 0x12, 0x60, 0x12, 0x66, 0x12, 0x6C, 0x16, 0xA4, 0x12, 0x72, 0x12, 0x78, 0x19, 0x20, 0x19, 0x2C, 0x12, 0x7E, 0x12, 0x84, 0x12, 0x8A, 0x12, 0x90, 0x12, 0x96, 0x12, 0x9C, 0x17, 0x4C, 0x14, 0x4, 0x12, 0xA2, 0x12, 0xA8, 0x12, 0xAE, 0x12, 0xB4, 0x12, 0xBA, 0x12, 0xB4, 0x12, 0xBA, 0x12, 0xC0, 0x12, 0xC6, 0x12, 0xCC, 0x12, 0xD2, 0x12, 0xD8, 0x12, 0xDE, 0x12, 0xE4, 0x19, 0x1A, 0x19, 0x20, 0x12, 0xEA, 0x12, 0xF0, 0x15, 0x30, 0x12, 0xF6, 0x12, 0xFC, 0x13, 0x2, 0x13, 0x8, 0x13, 0xE, 0x13, 0x14, 0x18, 0x2A, 0x13, 0xCE, 0x13, 0x1A, 0x13, 0x20, 0x16, 0x62, 0x16, 0x68, 0x13, 0x26, 0x13, 0x2C, 0x13, 0x32, 0x13, 0x38, 0x13, 0x3E, 0x13, 0x44, 0x13, 0x4A, 0x13, 0x50, 0x13, 0x56, 0x13, 0x5C, 0x13, 0x62, 0x13, 0x68, 0x13, 0x6E, 0x13, 0x74, 0x13, 0x7A, 0x13, 0x80, 0x13, 0x86, 0x13, 0x8C, 0x16, 0x8, 0x13, 0x92, 0x13, 0x98, 0x13, 0x9E, 0x13, 0xA4, 0x13, 0xAA, 0x13, 0xB0, 0x13, 0xB6, 0x13, 0xBC, 0x19, 0x1A, 0x19, 0x20, 0x13, 0xC2, 0x13, 0xC8, 0x19, 0x1A, 0x19, 0x20, 0x19, 0x1A, 0x19, 0x20, 0x19, 0x1A, 0x19, 0x20, 0x19, 0x1A, 0x19, 0x20, 0x14, 0xAC, 0x14, 0xB2, 0x19, 0x1A, 0x19, 0x20, 0x19, 0x1A, 0x19, 0x20, 0x19, 0x1A, 0x19, 0x20, 0x19, 0x1A, 0x19, 0x20, 0x18, 0x2A, 0x13, 0xCE, 0x19, 0x26, 0x19, 0x2C, 0x13, 0xD4, 0x13, 0xDA, 0x13, 0xE0, 0x13, 0xE6, 0x19, 0x26, 0x19, 0x2C, 0x19, 0x26, 0x19, 0x2C, 0x19, 0x26, 0x19, 0x2C, 0x19, 0x26, 0x19, 0x2C, 0x13, 0xEC, 0x15, 0xC, 0x13, 0xF2, 0x13, 0xF8, 0x13, 0xFE, 0x14, 0x4, 0x19, 0x32, 0x19, 0x38, 0x14, 0xA, 0x14, 0x10, 0x19, 0x32, 0x19, 0x38, 0x19, 0x32, 0x19, 0x38, 0x19, 0x32, 0x19, 0x38, 0x19, 0x32, 0x19, 0x38, 0x14, 0xC4, 0x14, 0xCA, 0x14, 0x16, 0x14, 0x1C, 0x14, 0x16, 0x14, 0x1C, 0x14, 0x22, 0x14, 0x28, 0x14, 0x2E, 0x14, 0x34, 0x14, 0x3A, 0x14, 0x40, 0x17, 0x94, 0x17, 0x88, 0x14, 0x46, 0x14, 0x4C, 0x14, 0x52, 0x14, 0x58, 0x14, 0x52, 0x14, 0x58, 0x14, 0x5E, 0x14, 0x64, 0x14, 0x6A, 0x14, 0x70, 0x14, 0x76, 0x14, 0x7C, 0x14, 0x82, 0x14, 0x88, 0x14, 0x8E, 0x14, 0x94, 0x14, 0x9A, 0x14, 0xA0, 0x14, 0xA6, 0x14, 0xAC, 0x14, 0xB2, 0x14, 0xB8, 0x14, 0xBE, 0x14, 0xC4, 0x14, 0xCA, 0x14, 0xD0, 0x14, 0xD6, 0x17, 0x94, 0x17, 0x9A, 0x17, 0x94, 0x14, 0xE2, 0x17, 0x94, 0x14, 0xDC, 0x17, 0x94, 0x14, 0xE2, 0x14, 0xE8, 0x19, 0x1A, 0x14, 0xEE, 0x19, 0x1A, 0x14, 0xF4, 0x14, 0xFA, 0x15, 0x0, 0x15, 0x6, 0x15, 0xC, 0x15, 0x12, 0x15, 0x18, 0x19, 0x32, 0x19, 0x38, 0x15, 0x1E, 0x15, 0x24, 0x15, 0x2A, 0x15, 0x30, 0x15, 0x36, 0x15, 0x3C, 0x15, 0x42, 0x15, 0x48, 0x15, 0x4E, 0x15, 0x54, 0x15, 0x5A, 0x15, 0x60, 0x15, 0x66, 0x15, 0x6C, 0x15, 0x72, 0x15, 0x78, 0x15, 0x7E, 0x15, 0x84, 0x15, 0x8A, 0x15, 0x90, 0x15, 0x96, 0x15, 0x9C, 0x15, 0xA2, 0x15, 0xA8, 0x15, 0xAE, 0x15, 0xB4, 0x15, 0xBA, 0x15, 0xC0, 0x15, 0xC6, 0x15, 0xCC, 0x15, 0xD2, 0x15, 0xD8, 0x15, 0xDE, 0x15, 0xE4, 0x19, 0x26, 0x19, 0x2C, 0x19, 0x32, 0x15, 0xEA, 0x19, 0x32, 0x15, 0xF0, 0x15, 0xF6, 0x15, 0xFC, 0x19, 0x32, 0x16, 0x2, 0x18, 0x60, 0x16, 0x8, 0x16, 0xE, 0x16, 0x14, 0x16, 0x1A, 0x16, 0x20, 0x17, 0x1C, 0x16, 0x26, 0x16, 0x2C, 0x16, 0x32, 0x16, 0x2C, 0x16, 0x32, 0x16, 0x38, 0x16, 0x3E, 0x16, 0x44, 0x16, 0x4A, 0x16, 0x50, 0x16, 0x56, 0x16, 0x50, 0x16, 0x56, 0x16, 0x50, 0x16, 0x56, 0x16, 0x50, 0x16, 0x56, 0x19, 0x26, 0x16, 0x5C, 0x19, 0x26, 0x16, 0x5C, 0x19, 0x26, 0x19, 0x2C, 0x19, 0x26, 0x19, 0x2C, 0x16, 0x62, 0x16, 0x68, 0x16, 0x6E, 0x16, 0x74, 0x16, 0x7A, 0x16, 0x80, 0x16, 0x86, 0x16, 0x8C, 0x16, 0x9E, 0x18, 0x6, 0x16, 0x92, 0x16, 0x98, 0x16, 0x9E, 0x18, 0x6, 0x16, 0xA4, 0x16, 0xAA, 0x16, 0xB0, 0x16, 0xB6, 0x16, 0xB0, 0x16, 0xB6, 0x16, 0xC8, 0x16, 0xCE, 0x16, 0xBC, 0x16, 0xC2, 0x16, 0xC8, 0x16, 0xCE, 0x16, 0xC8, 0x16, 0xCE, 0x16, 0xD4, 0x16, 0xDA, 0x16, 0xE0, 0x16, 0xE6, 0x16, 0xEC, 0x16, 0xF2, 0x37, 0x92, 0x16, 0xF8, 0x37, 0x92, 0x16, 0xF8, 0x37, 0x92, 0x16, 0xF8, 0x19, 0x32, 0x16, 0xFE, 0x19, 0x32, 0x17, 0x4, 0x19, 0x32, 0x17, 0xA, 0x19, 0x32, 0x17, 0xA, 0x17, 0x10, 0x17, 0x16, 0x17, 0x1C, 0x17, 0x22, 0x17, 0x28, 0x17, 0x2E, 0x17, 0x40, 0x17, 0x46, 0x17, 0x34, 0x17, 0x3A, 0x17, 0x40, 0x17, 0x46, 0x17, 0x64, 0x17, 0x6A, 0x17, 0x58, 0x17, 0x4C, 0x17, 0x58, 0x17, 0x52, 0x17, 0x58, 0x17, 0x5E, 0x17, 0x64, 0x17, 0x6A, 0x17, 0x70, 0x17, 0x76, 0x17, 0x7C, 0x17, 0x82, 0x17, 0x7C, 0x17, 0x82, 0x17, 0x7C, 0x17, 0x82, 0x17, 0x94, 0x17, 0x88, 0x17, 0x94, 0x17, 0x88, 0x17, 0x94, 0x17, 0x88, 0x17, 0x94, 0x17, 0x8E, 0x17, 0x94, 0x17, 0x9A, 0x17, 0xA0, 0x17, 0xA6, 0x17, 0xAC, 0x17, 0xB2, 0x17, 0xB8, 0x17, 0xBE, 0x17, 0xC4, 0x17, 0xCA, 0x17, 0xD0, 0x17, 0xD6, 0x17, 0xDC, 0x17, 0xE2, 0x17, 0xE8, 0x17, 0xEE, 0x17, 0xF4, 0x17, 0xFA, 0x18, 0x0, 0x56, 0xB0, 0x18, 0x0, 0x56, 0xB0, 0x18, 0x6, 0x18, 0xC, 0x18, 0x12, 0x18, 0x18, 0x19, 0x20, 0x18, 0x1E, 0x18, 0x24, 0x18, 0x2A, 0x18, 0x30, 0x18, 0x36, 0x18, 0x3C, 0x18, 0x42, 0x18, 0x48, 0x18, 0x4E, 0x18, 0x54, 0x18, 0x5A, 0x18, 0x60, 0x19, 0x3E, 0x19, 0x44, 0x18, 0xD2, 0x18, 0x8A, 0x19, 0x4A, 0x18, 0xDE, 0x19, 0x3E, 0x18, 0xA2, 0x19, 0x44, 0x18, 0x66, 0x18, 0xD2, 0x18, 0x8A, 0x18, 0x6C, 0x18, 0xB4, 0x18, 0x72, 0x19, 0x4A, 0x18, 0xBA, 0x18, 0xC0, 0x18, 0xDE, 0x18, 0xC6, 0x18, 0x90, 0x18, 0x78, 0x18, 0x7E, 0x18, 0x84, 0x19, 0x2, 0x18, 0x8A, 0x18, 0x90, 0x18, 0xF0, 0x18, 0x96, 0x18, 0x9C, 0x19, 0x3E, 0x18, 0xA2, 0x18, 0xA8, 0x19, 0x44, 0x18, 0xAE, 0x18, 0xB4, 0x18, 0xD2, 0x19, 0x4A, 0x18, 0xBA, 0x18, 0xD8, 0x18, 0xC0, 0x18, 0xC6, 0x18, 0xCC, 0x18, 0xD2, 0x18, 0xD8, 0x18, 0xDE, 0x18, 0xE4, 0x18, 0xEA, 0x18, 0xF0, 0x18, 0xF6, 0x18, 0xFC, 0x19, 0x2, 0x19, 0x8, 0x19, 0x8, 0x19, 0xE, 0x19, 0x14, 0x19, 0x1A, 0x19, 0x20, 0x19, 0x26, 0x19, 0x2C, 0x19, 0x32, 0x19, 0x38, 0x19, 0x3E, 0x19, 0x44, 0x19, 0x4A, 0x19, 0x50, 0x19, 0x50, 0x19, 0x56, 0x19, 0x5C, 0x19, 0x62, 0x19, 0x68, 0x19, 0x6E, 0x19, 0x74, 0x19, 0x7A, 0x19, 0x7A, 0x19, 0x98, 0x19, 0x80, 0x19, 0x86, 0x19, 0x8C, 0x19, 0x92, 0x19, 0x98, 0x19, 0x9E, 0x19, 0xA4, 0x19, 0xAA, 0x19, 0xB0, 0x19, 0xB0, 0x19, 0xB6, 0x19, 0xBC, 0x19, 0xC2, 0x19, 0xC8, 0x19, 0xCE, 0x19, 0xD4, 0x19, 0xDA, 0x19, 0xDA, 0x0, 0x1, 0x2, 0x73, 0x6, 0x4C, 0x0, 0x1, 0x3, 0x52, 0x6, 0x41, 0x0, 0x1, 0x2, 0x87, 0x6, 0x4C, 0x0, 0x1, 0x1, 0xE0, 0x6, 0xBE, 0x0, 0x1, 0x0, 0xDF, 0x6, 0x40, 0x0, 0x1, 0x2, 0x19, 0x5, 0xA, 0x0, 0x1, 0x3, 0xA7, 0x6, 0x4C, 0x0, 0x1, 0x2, 0xCB, 0x6, 0x8A, 0x0, 0x1, 0x3, 0x5C, 0x5, 0xB, 0x0, 0x1, 0x2, 0x1C, 0x5, 0x7, 0x0, 0x1, 0x2, 0xDF, 0x6, 0x48, 0x0, 0x1, 0x1, 0x1F, 0x6, 0x40, 0x0, 0x1, 0x1, 0x28, 0x6, 0x9B, 0x0, 0x1, 0x3, 0xC9, 0x6, 0x40, 0x0, 0x1, 0x3, 0xA7, 0x5, 0xA, 0x0, 0x1, 0x1, 0x9B, 0x6, 0xBE, 0x0, 0x1, 0x2, 0x9F, 0x6, 0x40, 0x0, 0x1, 0x2, 0x72, 0x6, 0x40, 0x0, 0x1, 0x1, 0x63, 0x6, 0x48, 0x0, 0x1, 0x1, 0x63, 0x6, 0x9B, 0x0, 0x1, 0x2, 0x4A, 0x6, 0x48, 0x0, 0x1, 0x1, 0x55, 0x6, 0x40, 0x0, 0x1, 0x2, 0x86, 0x6, 0x4C, 0x0, 0x1, 0x3, 0x22, 0x6, 0x40, 0x0, 0x1, 0x3, 0x5F, 0x6, 0x41, 0x0, 0x1, 0x1, 0x7B, 0x6, 0x40, 0x0, 0x1, 0x1, 0xAA, 0x5, 0xA, 0x0, 0x1, 0x2, 0xCB, 0x6, 0x40, 0x0, 0x1, 0x2, 0x1, 0x5, 0xA, 0x0, 0x1, 0x2, 0x65, 0x5, 0xA, 0x0, 0x1, 0x2, 0x85, 0x6, 0xA4, 0x0, 0x1, 0x1, 0xF5, 0x5, 0xA, 0x0, 0x1, 0x2, 0x4E, 0x5, 0xA, 0x0, 0x1, 0x2, 0x14, 0x6, 0x63, 0x0, 0x1, 0x2, 0x14, 0x6, 0x40, 0x0, 0x1, 0x2, 0xE, 0x5, 0xA, 0x0, 0x1, 0x2, 0x28, 0x5, 0xA, 0x0, 0x1, 0x1, 0x89, 0x5, 0xA, 0x0, 0x1, 0x2, 0x72, 0x5, 0xA, 0x0, 0x1, 0x2, 0x90, 0x5, 0xA, 0x0, 0x1, 0x2, 0x35, 0x5, 0xA, 0x0, 0x1, 0x2, 0x70, 0x6, 0xA4, 0x0, 0x1, 0x1, 0x63, 0x6, 0x40, 0x0, 0x1, 0x0, 0xF1, 0x5, 0xA, 0x0, 0x1, 0x1, 0x6A, 0x5, 0xA, 0x0, 0x1, 0x1, 0x7E, 0x6, 0x40, 0x0, 0x1, 0x2, 0x4F, 0x6, 0x40, 0x0, 0x1, 0x1, 0x31, 0x6, 0x40, 0x0, 0x1, 0x2, 0x75, 0x5, 0xA, 0x0, 0x1, 0x3, 0x80, 0x5, 0xA, 0x0, 0x1, 0x3, 0x85, 0x5, 0xA, 0x0, 0x1, 0x2, 0xA2, 0x5, 0xA, 0x0, 0x1, 0x3, 0x8E, 0x5, 0xA, 0x0, 0x1, 0x3, 0x48, 0x5, 0xA, 0x0, 0x1, 0x2, 0x6A, 0x6, 0x40, 0x0, 0x1, 0x0, 0xE8, 0x6, 0x40, 0x0, 0x1, 0x0, 0xE8, 0x5, 0xA, 0x0, 0x1, 0x1, 0xED, 0x5, 0xA, 0x0, 0x1, 0x0, 0xFA, 0x5, 0xA, 0x0, 0x1, 0x1, 0x75, 0x5, 0xA, 0x0, 0x1, 0x2, 0x1B, 0x5, 0xA, 0x0, 0x1, 0x2, 0x50, 0x5, 0xA, 0x0, 0x1, 0x2, 0x54, 0x6, 0xA4, 0x0, 0x1, 0x0, 0xD8, 0x5, 0xA, 0x0, 0x1, 0x3, 0x13, 0x6, 0xA4, 0x0, 0x1, 0x0, 0xEE, 0x6, 0x40, 0x0, 0x1, 0x1, 0x38, 0x6, 0x40, 0x0, 0x1, 0x2, 0x9C, 0x5, 0xA, 0x0, 0x1, 0x1, 0xFA, 0x5, 0xA, 0x0, 0x1, 0x2, 0x1E, 0x5, 0xA, 0x0, 0x1, 0x1, 0xF4, 0x5, 0xA, 0x0, 0x1, 0x1, 0xEC, 0x5, 0xA, 0x0, 0x1, 0x2, 0x3A, 0x5, 0xA, 0x0, 0x1, 0x1, 0xF4, 0x6, 0x61, 0x0, 0x1, 0x2, 0x3A, 0x6, 0x61, 0x0, 0x1, 0x2, 0x0, 0x6, 0x61, 0x0, 0x1, 0x2, 0x3B, 0x6, 0x61, 0x0, 0x1, 0x2, 0xC2, 0x6, 0x61, 0x0, 0x1, 0x2, 0x17, 0x5, 0xA, 0x0, 0x1, 0x2, 0x5C, 0x5, 0xA, 0x0, 0x1, 0x2, 0x49, 0x6, 0x40, 0x0, 0x1, 0x0, 0xF6, 0x5, 0xA, 0x0, 0x1, 0x2, 0x31, 0x6, 0x40, 0x0, 0x1, 0x1, 0xF0, 0x6, 0x61, 0x0, 0x1, 0x2, 0x37, 0x6, 0x61, 0x0, 0x1, 0x5, 0xA4, 0x6, 0x40, 0x0, 0x1, 0x5, 0x84, 0x6, 0x40, 0x0, 0x1, 0x3, 0xCD, 0x6, 0x40, 0x0, 0x1, 0x2, 0x7, 0x6, 0xA4, 0x0, 0x1, 0x4, 0x47, 0x6, 0x40, 0x0, 0x1, 0x4, 0xA9, 0x6, 0xA4, 0x0, 0x1, 0x3, 0x66, 0x6, 0x40, 0x0, 0x1, 0x3, 0x19, 0x6, 0x40, 0x0, 0x1, 0x1, 0xE3, 0x6, 0x40, 0x0, 0x1, 0x1, 0xEE, 0x6, 0x40, 0x0, 0x1, 0x2, 0xAC, 0x5, 0xA, 0x0, 0x1, 0x2, 0x6E, 0x6, 0x48, 0x0, 0x1, 0x2, 0x6F, 0x5, 0xA, 0x0, 0x1, 0x2, 0x37, 0x5, 0x9, 0x0, 0x1, 0x1, 0x2E, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x57, 0x5, 0x0, 0x0, 0x1, 0x2, 0x2B, 0x4, 0xFC, 0x0, 0x1, 0x3, 0x4A, 0x4, 0xFA, 0x0, 0x1, 0x2, 0x37, 0x6, 0x4C, 0x0, 0x1, 0x3, 0x3C, 0x4, 0xFC, 0x0, 0x1, 0x2, 0xBC, 0x6, 0x40, 0x0, 0x1, 0x3, 0xD5, 0x6, 0x48, 0x0, 0x1, 0x2, 0x63, 0x6, 0x55, 0x0, 0x1, 0x2, 0xD4, 0x6, 0x48, 0x0, 0x1, 0x2, 0x91, 0x6, 0x48, 0x0, 0x1, 0x2, 0xCF, 0x6, 0x48, 0x0, 0x1, 0x3, 0x81, 0x6, 0x48, 0x0, 0x1, 0x2, 0xA3, 0x6, 0x56, 0x0, 0x1, 0x3, 0x94, 0x6, 0x40, 0x0, 0x1, 0x1, 0xAD, 0x4, 0xFC, 0x0, 0x1, 0x2, 0xBF, 0x4, 0xF5, 0x0, 0x1, 0x3, 0x3E, 0x4, 0xFC, 0x0, 0x1, 0x2, 0xE, 0x5, 0x9, 0x0, 0x1, 0x2, 0x4F, 0x4, 0xFC, 0x0, 0x1, 0x2, 0x30, 0x4, 0xFC, 0x0, 0x1, 0x2, 0x82, 0x4, 0xF5, 0x0, 0x1, 0x2, 0xF6, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x53, 0x4, 0xF5, 0x0, 0x1, 0x1, 0xFB, 0x4, 0xF5, 0x0, 0x1, 0x2, 0xE7, 0x6, 0xCC, 0x0, 0x1, 0x2, 0x67, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x26, 0x4, 0xFC, 0x0, 0x1, 0x3, 0x2C, 0x4, 0xF5, 0x0, 0x1, 0x3, 0x33, 0x4, 0xFC, 0x0, 0x1, 0x2, 0x18, 0x5, 0xA, 0x0, 0x1, 0x3, 0x3B, 0x4, 0xF5, 0x0, 0x1, 0x2, 0xD, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x47, 0x5, 0xA, 0x0, 0x1, 0x3, 0x9F, 0x6, 0x41, 0x0, 0x1, 0x3, 0x22, 0x4, 0xFC, 0x0, 0x1, 0x1, 0xD5, 0x6, 0xCC, 0x0, 0x1, 0x2, 0x80, 0x6, 0x1C, 0x0, 0x1, 0x2, 0x1C, 0x4, 0xEF, 0x0, 0x1, 0x2, 0x48, 0x5, 0x50, 0x0, 0x1, 0x3, 0x29, 0x6, 0x40, 0x0, 0x1, 0x2, 0x9A, 0x6, 0x61, 0x0, 0x1, 0x2, 0x47, 0x5, 0xC, 0x0, 0x1, 0x2, 0xD4, 0x7, 0x6E, 0x0, 0x1, 0x2, 0x4F, 0x6, 0x23, 0x0, 0x1, 0x2, 0xD7, 0x6, 0x56, 0x0, 0x1, 0x2, 0x8A, 0x6, 0x4C, 0x0, 0x1, 0x2, 0x81, 0x6, 0x19, 0x0, 0x1, 0x2, 0x5C, 0x6, 0x4C, 0x0, 0x1, 0x1, 0x11, 0x6, 0x4C, 0x0, 0x1, 0x2, 0xC5, 0x6, 0x4C, 0x0, 0x1, 0x2, 0x21, 0x5, 0xA, 0x0, 0x1, 0x2, 0x63, 0x6, 0x4C, 0x0, 0x1, 0x2, 0xA4, 0x6, 0x61, 0x0, 0x1, 0x3, 0x4D, 0x5, 0xA, 0x0, 0x1, 0x2, 0x71, 0x5, 0xA, 0x0, 0x1, 0x2, 0x3D, 0x5, 0xA, 0x0, 0x1, 0x2, 0xA7, 0x5, 0xA, 0x0, 0x1, 0x2, 0x4B, 0x5, 0xA, 0x0, 0x1, 0x2, 0xF, 0x5, 0xA, 0x0, 0x1, 0x1, 0x5, 0x5, 0xA, 0x0, 0x1, 0x3, 0x1, 0x5, 0xA, 0x0, 0x1, 0x2, 0xB, 0x5, 0xA, 0x0, 0x1, 0x1, 0x23, 0x5, 0xA, 0x0, 0x1, 0x2, 0xF6, 0x5, 0xA, 0x0, 0x1, 0x2, 0x54, 0x5, 0xA, 0x0, 0x1, 0x1, 0xF6, 0x5, 0xA, 0x0, 0x1, 0x3, 0x73, 0x5, 0xA, 0x0, 0x1, 0x1, 0xF3, 0x5, 0xA, 0x0, 0x1, 0x2, 0x4A, 0x5, 0xA, 0x0, 0x1, 0x2, 0x3F, 0x5, 0xA, 0x0, 0x1, 0x1, 0xFB, 0x5, 0xA, 0x0, 0x1, 0x2, 0x79, 0x5, 0xA, 0x0, 0x1, 0x2, 0xF8, 0x5, 0xA, 0x0, 0x1, 0x1, 0xEA, 0x5, 0xA, 0x0, 0x1, 0x2, 0xD, 0x5, 0xA, 0x0, 0x1, 0x2, 0x67, 0x5, 0xA, 0x0, 0x1, 0x2, 0x4F, 0x5, 0xA, 0x0, 0x1, 0x2, 0x56, 0x5, 0xA, 0x0, 0x1, 0x2, 0xB1, 0x5, 0xA, 0x0, 0x1, 0x3, 0x4E, 0x5, 0xA, 0x0, 0x1, 0x2, 0xFB, 0x6, 0x40, 0x0, 0x1, 0x2, 0x67, 0x6, 0xA4, 0x0, 0x1, 0x2, 0xEB, 0x5, 0xA, 0x0, 0x1, 0x2, 0x5B, 0x5, 0xA, 0x0, 0x1, 0x2, 0x36, 0x5, 0xA, 0x0, 0x1, 0x1, 0x67, 0x6, 0x40, 0x0, 0x1, 0x2, 0x10, 0x5, 0xA, 0x0, 0x1, 0x2, 0x69, 0x5, 0xA, 0x0, 0x1, 0x2, 0x23, 0x5, 0xA, 0x0, 0x1, 0x4, 0xAB, 0x6, 0x40, 0x0, 0x1, 0x1, 0x63, 0x5, 0xA, 0x0, 0x1, 0x2, 0x97, 0x5, 0xA, 0x0, 0x1, 0x2, 0xB0, 0x5, 0xA, 0x0, 0x1, 0x2, 0x76, 0x5, 0xA, 0x0, 0x1, 0x2, 0x8D, 0x6, 0x40, 0x0, 0x1, 0x2, 0xD, 0x6, 0x40, 0x0, 0x1, 0x1, 0xF3, 0x6, 0xA1, 0x0, 0x1, 0x2, 0x2A, 0x5, 0xA, 0x0, 0x1, 0x2, 0x57, 0x6, 0x40, 0x0, 0x1, 0x1, 0x17, 0x6, 0xA4, 0x0, 0x1, 0x3, 0xCA, 0x5, 0xA, 0x0, 0x1, 0x2, 0x88, 0x5, 0xA, 0x0, 0x1, 0x2, 0x1C, 0x5, 0xA, 0x0, 0x1, 0x2, 0x45, 0x6, 0xA4, 0x0, 0x1, 0x1, 0xFD, 0x5, 0xA, 0x0, 0x1, 0x2, 0x5, 0x5, 0xA, 0x0, 0x1, 0x2, 0x30, 0x5, 0xA, 0x0, 0x1, 0x2, 0x18, 0x6, 0x40, 0x0, 0x1, 0x2, 0x4D, 0x5, 0xA, 0x0, 0x1, 0x2, 0x34, 0x5, 0xA, 0x0, 0x1, 0x2, 0x24, 0x5, 0xA, 0x0, 0x1, 0x2, 0x11, 0x5, 0xA, 0x0, 0x1, 0x1, 0x9, 0x6, 0x40, 0x0, 0x1, 0x1, 0xFE, 0x5, 0xA, 0x0, 0x1, 0x2, 0x77, 0x6, 0xA4, 0x0, 0x1, 0x2, 0x3B, 0x5, 0xA, 0x0, 0x1, 0x2, 0x46, 0x5, 0xA, 0x0, 0x1, 0x1, 0x7F, 0x6, 0x48, 0x0, 0x1, 0x1, 0x7D, 0x6, 0x40, 0x0, 0x1, 0x1, 0x72, 0x6, 0x48, 0x0, 0x1, 0x1, 0x6F, 0x5, 0x3, 0x0, 0x1, 0x2, 0x3B, 0x5, 0x28, 0x0, 0x1, 0x2, 0x5C, 0x5, 0x28, 0x0, 0x1, 0x2, 0x15, 0x5, 0x28, 0x0, 0x1, 0x2, 0x50, 0x5, 0x28, 0x0, 0x1, 0x3, 0x1E, 0x5, 0x28, 0x0, 0x1, 0x2, 0x71, 0x5, 0x28, 0x0, 0x1, 0x2, 0x31, 0x5, 0x28, 0x0, 0x1, 0x2, 0x33, 0x5, 0x28, 0x0, 0x1, 0x3, 0xC, 0x5, 0x28, 0x0, 0x1, 0x2, 0x2B, 0x5, 0x28, 0x0, 0x1, 0x3, 0x3, 0x5, 0x28, 0x0, 0x1, 0x2, 0x8A, 0x5, 0x28, 0x0, 0x1, 0x2, 0xD7, 0x5, 0x28, 0x0, 0x1, 0x2, 0x6F, 0x5, 0x28, 0x0, 0x1, 0x2, 0x45, 0x5, 0x28, 0x0, 0x1, 0x2, 0x61, 0x5, 0x28, 0x0, 0x1, 0x2, 0x72, 0x6, 0x4C, 0x0, 0x1, 0x2, 0xDE, 0x6, 0x5E, 0x0, 0x1, 0x2, 0xD5, 0x6, 0x5E, 0x0, 0x1, 0x2, 0xC0, 0x6, 0x5E, 0x0, 0x1, 0x2, 0xD9, 0x6, 0x66, 0x0, 0x1, 0x4, 0x5E, 0x6, 0x69, 0x0, 0x1, 0x1, 0x7A, 0x4, 0xE8, 0x0, 0x1, 0x1, 0x70, 0x5, 0x3, 0x0, 0x1, 0x2, 0x4A, 0x5, 0x3, 0x0, 0x1, 0x0, 0xF2, 0x6, 0x55, 0x0, 0x1, 0x1, 0x34, 0x6, 0x72, 0x0, 0x1, 0x0, 0xEC, 0x3, 0x20, 0x0, 0x1, 0x1, 0x11, 0x4, 0xE8, 0x0, 0x1, 0x1, 0x95, 0x6, 0x72, 0x0, 0x1, 0x1, 0x1C, 0x6, 0x72, 0x0, 0x1, 0x1, 0x1F, 0x3, 0x20, 0x0, 0x1, 0x2, 0xC5, 0x5, 0xA, 0x0, 0x1, 0x3, 0x50, 0x6, 0x47, 0x0, 0x1, 0x1, 0x0, 0x5, 0x28, 0x0, 0x1, 0x3, 0x6E, 0x5, 0xA, 0x0, 0x1, 0x2, 0x11, 0x5, 0x28, 0x0, 0x1, 0x2, 0x7B, 0x5, 0x28, 0x0, 0x1, 0x2, 0xAD, 0x7, 0xAF, 0x0, 0x1, 0x2, 0xAD, 0x7, 0x95, 0x0, 0x1, 0x2, 0xAD, 0x7, 0xE1, 0x0, 0x1, 0x2, 0xAC, 0x6, 0x55, 0x0, 0x1, 0x1, 0x21, 0x7, 0xB7, 0x0, 0x1, 0x2, 0xD6, 0x7, 0x95, 0x0, 0x1, 0x2, 0xC4, 0x7, 0xAF, 0x0, 0x1, 0x2, 0xC4, 0x7, 0x95, 0x0, 0x1, 0x2, 0x9B, 0x7, 0xAF, 0x0, 0x1, 0x2, 0x9B, 0x7, 0x6D, 0x0, 0x1, 0x2, 0x37, 0x6, 0x79, 0x0, 0x1, 0x2, 0x37, 0x6, 0x5F, 0x0, 0x1, 0x2, 0x37, 0x6, 0xAB, 0x0, 0x1, 0x1, 0xC, 0x6, 0x72, 0x0, 0x1, 0x2, 0x3E, 0x6, 0x5F, 0x0, 0x1, 0x2, 0x40, 0x6, 0x5F, 0x0, 0x1, 0x2, 0x39, 0x6, 0x79, 0x0, 0x1, 0x2, 0x39, 0x6, 0x37, 0x0, 0x1, 0x2, 0x37, 0x6, 0x3A, 0x0, 0x1, 0x2, 0xAB, 0x7, 0x94, 0x0, 0x1, 0x2, 0x14, 0x6, 0x49, 0x0, 0x1, 0x2, 0xAC, 0x7, 0xB3, 0x0, 0x1, 0x2, 0x15, 0x6, 0x68, 0x0, 0x1, 0x2, 0x3B, 0x7, 0xA6, 0x0, 0x1, 0x2, 0x73, 0x7, 0x78, 0x0, 0x1, 0x2, 0x72, 0x7, 0x87, 0x0, 0x1, 0x2, 0xA9, 0x7, 0xA0, 0x0, 0x1, 0x2, 0xA8, 0x7, 0x94, 0x0, 0x1, 0x2, 0x2A, 0x6, 0x49, 0x0, 0x1, 0x2, 0xA9, 0x6, 0x55, 0x0, 0x1, 0x1, 0x21, 0x7, 0x9D, 0x0, 0x1, 0x1, 0xC, 0x6, 0x58, 0x0, 0x1, 0x1, 0xC, 0x6, 0x33, 0x0, 0x1, 0x1, 0xC, 0x6, 0x4E, 0x0, 0x1, 0x1, 0x20, 0x7, 0x87, 0x0, 0x1, 0x3, 0x52, 0x7, 0x9F, 0x0, 0x1, 0x1, 0x14, 0x7, 0xAF, 0x0, 0x1, 0x1, 0x6, 0x8, 0xA, 0x0, 0x1, 0x2, 0xD6, 0x7, 0x9E, 0x0, 0x1, 0x2, 0x3E, 0x6, 0x68, 0x0, 0x1, 0x2, 0xC4, 0x7, 0x8B, 0x0, 0x1, 0x2, 0xC4, 0x7, 0x91, 0x0, 0x1, 0x2, 0x40, 0x6, 0x5B, 0x0, 0x1, 0x2, 0x5C, 0x7, 0xAF, 0x0, 0x1, 0x1, 0x99, 0x6, 0x79, 0x0, 0x1, 0x2, 0x5C, 0x7, 0x9E, 0x0, 0x1, 0x1, 0x99, 0x6, 0x68, 0x0, 0x1, 0x2, 0x7A, 0x7, 0xAF, 0x0, 0x1, 0x2, 0x25, 0x6, 0x79, 0x0, 0x1, 0x2, 0x7A, 0x7, 0x9E, 0x0, 0x1, 0x2, 0x25, 0x6, 0x68, 0x0, 0x1, 0x2, 0x6C, 0x7, 0x9E, 0x0, 0x1, 0x2, 0x9B, 0x7, 0x95, 0x0, 0x1, 0x2, 0x39, 0x6, 0x5F, 0x0, 0x1, 0x2, 0x9B, 0x7, 0x70, 0x0, 0x1, 0x2, 0x39, 0x6, 0x3A, 0x0, 0x1, 0x2, 0x9B, 0x7, 0x8B, 0x0, 0x1, 0x2, 0x39, 0x6, 0x55, 0x0, 0x1, 0x2, 0x9B, 0x7, 0xE1, 0x0, 0x1, 0x2, 0x39, 0x6, 0xAB, 0x0, 0x1, 0x2, 0x9B, 0x7, 0x91, 0x0, 0x1, 0x2, 0x39, 0x6, 0x5B, 0x0, 0x1, 0x3, 0x92, 0x7, 0x9E, 0x0, 0x1, 0x2, 0xF5, 0x6, 0x68, 0x0, 0x1, 0x2, 0x73, 0x7, 0x9E, 0x0, 0x1, 0x2, 0x6F, 0x7, 0xAF, 0x0, 0x1, 0x2, 0x7, 0x6, 0x79, 0x0, 0x1, 0x2, 0x6E, 0x7, 0x7F, 0x0, 0x1, 0x2, 0x6, 0x6, 0x49, 0x0, 0x1, 0x3, 0xA7, 0x7, 0xBB, 0x0, 0x1, 0x3, 0x5C, 0x6, 0x7A, 0x0, 0x1, 0x2, 0xCB, 0x7, 0xF9, 0x0, 0x1, 0x2, 0x1C, 0x6, 0x76, 0x0, 0x1, 0x1, 0xCB, 0x5, 0x28, 0x0, 0x1, 0x2, 0x51, 0x6, 0x97, 0x0, 0x1, 0x2, 0x51, 0x6, 0x86, 0x0, 0x1, 0x2, 0x51, 0x6, 0x7D, 0x0, 0x1, 0x2, 0x51, 0x6, 0x55, 0x0, 0x1, 0x2, 0x51, 0x6, 0xC9, 0x0, 0x1, 0x2, 0x21, 0x6, 0x97, 0x0, 0x1, 0x0, 0xFF, 0x6, 0x97, 0x0, 0x1, 0x0, 0xFF, 0x6, 0x86, 0x0, 0x1, 0x2, 0x70, 0x6, 0x7D, 0x0, 0x1, 0x2, 0x5F, 0x6, 0x86, 0x0, 0x1, 0x2, 0x5F, 0x6, 0x7D, 0x0, 0x1, 0x2, 0x5F, 0x6, 0x55, 0x0, 0x1, 0x2, 0x40, 0x6, 0x97, 0x0, 0x1, 0x2, 0x40, 0x6, 0x86, 0x0, 0x1, 0x2, 0x40, 0x6, 0x55, 0x0, 0x1, 0x2, 0x51, 0x6, 0x58, 0x0, 0x1, 0x2, 0x51, 0x6, 0x73, 0x0, 0x1, 0x2, 0x4F, 0x6, 0x97, 0x0, 0x1, 0x2, 0x4E, 0x6, 0x67, 0x0, 0x1, 0x2, 0x4F, 0x6, 0x86, 0x0, 0x1, 0x1, 0xCB, 0x6, 0x86, 0x0, 0x1, 0x2, 0x21, 0x6, 0x58, 0x0, 0x1, 0x2, 0x21, 0x6, 0x73, 0x0, 0x1, 0x2, 0x20, 0x6, 0x67, 0x0, 0x1, 0x2, 0x21, 0x6, 0x86, 0x0, 0x1, 0x2, 0x53, 0x6, 0x86, 0x0, 0x1, 0x2, 0x53, 0x6, 0x73, 0x0, 0x1, 0x2, 0x52, 0x6, 0x67, 0x0, 0x1, 0x2, 0x53, 0x5, 0x28, 0x0, 0x1, 0x2, 0x65, 0x6, 0x86, 0x0, 0x1, 0x0, 0xFF, 0x6, 0x7D, 0x0, 0x1, 0x0, 0xFF, 0x6, 0x58, 0x0, 0x1, 0x0, 0xFF, 0x6, 0x73, 0x0, 0x1, 0x0, 0xFE, 0x6, 0x67, 0x0, 0x1, 0x2, 0xDE, 0x6, 0x86, 0x0, 0x1, 0x0, 0xF5, 0x6, 0x97, 0x0, 0x1, 0x0, 0xF5, 0x5, 0x28, 0x0, 0x1, 0x2, 0x70, 0x6, 0x97, 0x0, 0x1, 0x2, 0x70, 0x6, 0x86, 0x0, 0x1, 0x2, 0x5F, 0x6, 0x58, 0x0, 0x1, 0x2, 0x5F, 0x6, 0x73, 0x0, 0x1, 0x2, 0x5F, 0x6, 0x79, 0x0, 0x1, 0x2, 0x3, 0x6, 0x97, 0x0, 0x1, 0x2, 0x3, 0x5, 0x28, 0x0, 0x1, 0x2, 0x3, 0x6, 0x86, 0x0, 0x1, 0x2, 0x2C, 0x6, 0x97, 0x0, 0x1, 0x2, 0x2C, 0x6, 0x86, 0x0, 0x1, 0x2, 0x1B, 0x6, 0x86, 0x0, 0x1, 0x2, 0x40, 0x6, 0x7D, 0x0, 0x1, 0x2, 0x40, 0x6, 0x58, 0x0, 0x1, 0x2, 0x40, 0x6, 0xC9, 0x0, 0x1, 0x2, 0x40, 0x6, 0x79, 0x0, 0x1, 0x2, 0x40, 0x5, 0x28, 0x0, 0x1, 0x3, 0x3, 0x6, 0x86, 0x0, 0x1, 0x2, 0x19, 0x6, 0x86, 0x0, 0x1, 0x2, 0x1C, 0x6, 0x97, 0x0, 0x1, 0x2, 0x1B, 0x6, 0x67, 0x0, 0x1, 0x2, 0x1C, 0x6, 0x86, 0x0, 0x1, 0x2, 0x73, 0x7, 0x6D, 0x0, 0x1, 0x1, 0x2E, 0x6, 0x22, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x29, 0x0, 0x1, 0x2, 0x73, 0x7, 0x75, 0x0, 0x1, 0x2, 0x6E, 0x7, 0xB7, 0x0, 0x1, 0x1, 0x21, 0x7, 0x75, 0x0, 0x1, 0x2, 0x91, 0x7, 0x93, 0x0, 0x1, 0x2, 0xD4, 0x7, 0x93, 0x0, 0x1, 0x2, 0x4F, 0x6, 0x47, 0x0, 0x1, 0x2, 0x88, 0x5, 0x0, 0x0, 0x1, 0x2, 0x15, 0x5, 0xA, 0x0, 0x1, 0x2, 0x4, 0x5, 0x0, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x37, 0x0, 0x1, 0x1, 0xAD, 0x6, 0x6B, 0x0, 0x1, 0x1, 0xC, 0x6, 0x30, 0x0, 0x1, 0x2, 0x30, 0x6, 0x6B, 0x0, 0x1, 0x2, 0x2, 0x6, 0x55, 0x0, 0x1, 0x3, 0x92, 0x7, 0xAF, 0x0, 0x1, 0x2, 0xF5, 0x6, 0x79, 0x0, 0x1, 0x3, 0x92, 0x7, 0x6D, 0x0, 0x1, 0x2, 0xF5, 0x6, 0x37, 0x0, 0x1, 0x2, 0x73, 0x7, 0xAF, 0x0, 0x1, 0x2, 0x2, 0x6, 0x79, 0x0, 0x1, 0x1, 0x11, 0x6, 0x46, 0x0, 0x1, 0x3, 0x7B, 0x7, 0xAF, 0x0, 0x1, 0x3, 0x8C, 0x6, 0x79, 0x0, 0x1, 0x2, 0x73, 0x7, 0xB7, 0x0, 0x1, 0x2, 0xD4, 0x7, 0xB7, 0x0, 0x1, 0x2, 0x4F, 0x6, 0x6B, 0x0, 0x1, 0x2, 0xDD, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x80, 0x7, 0x60, 0x0, 0x1, 0x2, 0x1C, 0x6, 0x33, 0x0, 0x1, 0x3, 0xD5, 0x7, 0x93, 0x0, 0x1, 0x3, 0x3E, 0x6, 0x47, 0x0, 0x1, 0x2, 0xAD, 0x7, 0x6D, 0x0, 0x1, 0x2, 0x37, 0x6, 0x37, 0x0, 0x1, 0x2, 0x81, 0x7, 0x46, 0x0, 0x1, 0x2, 0x28, 0x6, 0x38, 0x0, 0x1, 0x3, 0xD5, 0x7, 0x75, 0x0, 0x1, 0x3, 0x3E, 0x6, 0x29, 0x0, 0x1, 0x2, 0x63, 0x7, 0x82, 0x0, 0x1, 0x2, 0xE, 0x6, 0x36, 0x0, 0x1, 0x2, 0xD4, 0x7, 0x78, 0x0, 0x1, 0x2, 0x4F, 0x6, 0x2C, 0x0, 0x1, 0x2, 0xD4, 0x7, 0x75, 0x0, 0x1, 0x2, 0x4F, 0x6, 0x29, 0x0, 0x1, 0x2, 0xC4, 0x7, 0x6D, 0x0, 0x1, 0x2, 0x40, 0x6, 0x37, 0x0, 0x1, 0x2, 0xD2, 0x6, 0x45, 0x0, 0x1, 0x2, 0xD2, 0x7, 0x72, 0x0, 0x1, 0x2, 0x33, 0x6, 0x37, 0x0, 0x1, 0x2, 0xA3, 0x7, 0x83, 0x0, 0x1, 0x2, 0x18, 0x6, 0x37, 0x0, 0x1, 0x2, 0x91, 0x7, 0x78, 0x0, 0x1, 0x2, 0x91, 0x7, 0x75, 0x0, 0x1, 0x2, 0x2, 0x6, 0x37, 0x0, 0x1, 0x2, 0x91, 0x7, 0x99, 0x0, 0x1, 0x2, 0x2, 0x6, 0x5B, 0x0, 0x1, 0x2, 0xCF, 0x7, 0x75, 0x0, 0x1, 0x2, 0x26, 0x6, 0x29, 0x0, 0x1, 0x3, 0x81, 0x7, 0x75, 0x0, 0x1, 0x3, 0x33, 0x6, 0x29, 0x0, 0x1, 0x2, 0xAD, 0x8, 0x2, 0x0, 0x1, 0x2, 0x37, 0x6, 0xCC, 0x0, 0x1, 0x2, 0x37, 0x6, 0x55, 0x0, 0x1, 0x2, 0x73, 0x8, 0xA, 0x0, 0x1, 0x2, 0x2B, 0x6, 0xCC, 0x0, 0x1, 0x2, 0x73, 0x7, 0x9D, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x5F, 0x0, 0x1, 0x2, 0x73, 0x7, 0xA6, 0x0, 0x1, 0x1, 0x21, 0x8, 0xA, 0x0, 0x1, 0x1, 0xC, 0x6, 0xC5, 0x0, 0x1, 0x1, 0x21, 0x6, 0x48, 0x0, 0x1, 0x1, 0x7, 0x6, 0x40, 0x0, 0x1, 0x2, 0xC4, 0x8, 0x2, 0x0, 0x1, 0x2, 0x40, 0x6, 0xCC, 0x0, 0x1, 0x2, 0xBF, 0x7, 0xAD, 0x0, 0x1, 0x2, 0x44, 0x6, 0x79, 0x0, 0x1, 0x2, 0xBF, 0x8, 0x0, 0x0, 0x1, 0x2, 0x44, 0x6, 0xCC, 0x0, 0x1, 0x2, 0xBF, 0x7, 0x93, 0x0, 0x1, 0x2, 0x44, 0x6, 0x5F, 0x0, 0x1, 0x2, 0xBF, 0x6, 0x3E, 0x0, 0x1, 0x2, 0x44, 0x5, 0xA, 0x0, 0x1, 0x2, 0x9B, 0x8, 0x2, 0x0, 0x1, 0x2, 0x39, 0x6, 0xCC, 0x0, 0x1, 0x2, 0xC2, 0x7, 0xBB, 0x0, 0x1, 0x2, 0x42, 0x6, 0x64, 0x0, 0x1, 0x2, 0xC2, 0x8, 0xE, 0x0, 0x1, 0x2, 0x42, 0x6, 0xB7, 0x0, 0x1, 0x2, 0xC2, 0x7, 0xA1, 0x0, 0x1, 0x2, 0x42, 0x6, 0x4A, 0x0, 0x1, 0x2, 0xC2, 0x6, 0x4C, 0x0, 0x1, 0x2, 0x42, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x73, 0x6, 0x40, 0x0, 0x1, 0x2, 0x2, 0x5, 0xA, 0x0, 0x1, 0x2, 0x73, 0x8, 0x2, 0x0, 0x1, 0x2, 0x2, 0x6, 0xCC, 0x0, 0x1, 0x2, 0x73, 0x7, 0x95, 0x0, 0x1, 0x2, 0x2, 0x6, 0x5F, 0x0, 0x1, 0x2, 0x42, 0x5, 0xA, 0x0, 0x1, 0x2, 0xAD, 0x7, 0x9E, 0x0, 0x1, 0x2, 0x37, 0x6, 0x68, 0x0, 0x1, 0x1, 0x21, 0x7, 0xA6, 0x0, 0x1, 0x1, 0xC, 0x6, 0x61, 0x0, 0x1, 0x2, 0xC4, 0x7, 0x9E, 0x0, 0x1, 0x2, 0x40, 0x6, 0x68, 0x0, 0x1, 0x2, 0x9B, 0x7, 0x9E, 0x0, 0x1, 0x2, 0x39, 0x6, 0x68, 0x0, 0x1, 0x2, 0x38, 0x7, 0x95, 0x0, 0x1, 0x2, 0x39, 0x7, 0xA6, 0x0, 0x1, 0x2, 0x28, 0x5, 0xB, 0x0, 0x1, 0x2, 0x37, 0x7, 0x66, 0x0, 0x1, 0x2, 0x37, 0x7, 0x78, 0x0, 0x1, 0x3, 0xA7, 0x7, 0x7C, 0x0, 0x1, 0x3, 0x5C, 0x6, 0x3B, 0x0, 0x1, 0x2, 0xA9, 0x7, 0xB3, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x68, 0x0, 0x1, 0x2, 0x59, 0x7, 0x9F, 0x0, 0x1, 0x2, 0x57, 0x7, 0xA5, 0x0, 0x1, 0x2, 0xC4, 0x7, 0x70, 0x0, 0x1, 0x2, 0x40, 0x6, 0x3A, 0x0, 0x1, 0x2, 0xA9, 0x7, 0xC4, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x79, 0x0, 0x1, 0x2, 0xD6, 0x7, 0xAF, 0x0, 0x1, 0x2, 0x3E, 0x6, 0x79, 0x0, 0x1, 0x2, 0xAD, 0x7, 0x84, 0x0, 0x1, 0x2, 0x37, 0x6, 0x4E, 0x0, 0x1, 0x2, 0xAD, 0x7, 0xA9, 0x0, 0x1, 0x2, 0x37, 0x6, 0x73, 0x0, 0x1, 0x2, 0x73, 0x7, 0x8C, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x4E, 0x0, 0x1, 0x2, 0x73, 0x7, 0xB1, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x73, 0x0, 0x1, 0x1, 0x21, 0x7, 0x8C, 0x0, 0x1, 0x1, 0xC, 0x6, 0x47, 0x0, 0x1, 0x1, 0x21, 0x7, 0xB1, 0x0, 0x1, 0x1, 0xC, 0x6, 0x6C, 0x0, 0x1, 0x2, 0xC4, 0x7, 0x84, 0x0, 0x1, 0x2, 0x40, 0x6, 0x4E, 0x0, 0x1, 0x2, 0xC4, 0x7, 0xA9, 0x0, 0x1, 0x2, 0x40, 0x6, 0x73, 0x0, 0x1, 0x2, 0x5C, 0x7, 0x84, 0x0, 0x1, 0x1, 0x99, 0x6, 0x4E, 0x0, 0x1, 0x2, 0x5C, 0x7, 0xA9, 0x0, 0x1, 0x1, 0x99, 0x6, 0x73, 0x0, 0x1, 0x2, 0x9B, 0x7, 0x84, 0x0, 0x1, 0x2, 0x39, 0x6, 0x4E, 0x0, 0x1, 0x2, 0x9B, 0x7, 0xA9, 0x0, 0x1, 0x2, 0x39, 0x6, 0x73, 0x0, 0x1, 0x2, 0xCD, 0x7, 0xA6, 0x0, 0x1, 0x2, 0x2, 0x7, 0xC6, 0x0, 0x1, 0x2, 0xAC, 0x7, 0x7F, 0x0, 0x1, 0x2, 0x36, 0x6, 0x49, 0x0, 0x1, 0x2, 0x40, 0x7, 0x66, 0x0, 0x1, 0x2, 0x40, 0x7, 0x8E, 0x0, 0x1, 0x2, 0xC3, 0x7, 0x7F, 0x0, 0x1, 0x2, 0x3F, 0x6, 0x49, 0x0, 0x1, 0x2, 0x40, 0x7, 0x78, 0x0, 0x1, 0x2, 0x2, 0x6, 0x3A, 0x0, 0x1, 0x2, 0x33, 0x5, 0xA, 0x0, 0x1, 0x2, 0x23, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x4E, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x37, 0x7, 0x79, 0x0, 0x1, 0x2, 0x8C, 0x7, 0x86, 0x0, 0x1, 0x2, 0x5E, 0x6, 0x4C, 0x0, 0x1, 0x2, 0x8D, 0x6, 0x47, 0x0, 0x1, 0x2, 0xAC, 0x7, 0xC4, 0x0, 0x1, 0x2, 0x15, 0x6, 0x79, 0x0, 0x1, 0x2, 0x3A, 0x7, 0x87, 0x0, 0x1, 0x2, 0xC, 0x7, 0x86, 0x0, 0x1, 0x2, 0x3B, 0x6, 0x48, 0x0, 0x1, 0x2, 0xD, 0x6, 0x47, 0x0, 0x1, 0x2, 0x2B, 0x7, 0xA9, 0x0, 0x1, 0x2, 0x73, 0x7, 0x93, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x55, 0x0, 0x1, 0x2, 0x72, 0x7, 0x8B, 0x0, 0x1, 0x1, 0xDF, 0x7, 0xFD, 0x0, 0x1, 0x2, 0xA9, 0x7, 0x85, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x3A, 0x0, 0x1, 0x2, 0xCC, 0x7, 0x87, 0x0, 0x1, 0x2, 0x1, 0x7, 0xA7, 0x0, 0x1, 0x2, 0xCD, 0x7, 0x75, 0x0, 0x1, 0x2, 0x2, 0x7, 0x95, 0x0, 0x1, 0x2, 0xCD, 0x6, 0x48, 0x0, 0x1, 0x2, 0x59, 0x7, 0xB0, 0x0, 0x1, 0x2, 0x57, 0x7, 0xB6, 0x0, 0x1, 0x2, 0x59, 0x6, 0x41, 0x0, 0x1, 0x2, 0x57, 0x6, 0x47, 0x0, 0x1, 0x1, 0x14, 0x7, 0x70, 0x0, 0x1, 0x1, 0x6, 0x7, 0xCB, 0x0, 0x1, 0x1, 0x14, 0x6, 0x40, 0x0, 0x1, 0x1, 0x6, 0x6, 0x9B, 0x0, 0x1, 0x3, 0x7A, 0x7, 0x7F, 0x0, 0x1, 0x3, 0x8B, 0x6, 0x49, 0x0, 0x1, 0x3, 0x7B, 0x6, 0x40, 0x0, 0x1, 0x3, 0x8C, 0x5, 0xA, 0x0, 0x1, 0x2, 0xD5, 0x7, 0x7F, 0x0, 0x1, 0x2, 0x3D, 0x6, 0x49, 0x0, 0x1, 0x2, 0x3E, 0x5, 0xA, 0x0, 0x1, 0x2, 0x40, 0x7, 0xCE, 0x0, 0x1, 0x2, 0x40, 0x7, 0x8B, 0x0, 0x1, 0x2, 0x40, 0x7, 0xA9, 0x0, 0x1, 0x2, 0x5E, 0x7, 0xBB, 0x0, 0x1, 0x2, 0x88, 0x6, 0x6F, 0x0, 0x1, 0x2, 0x5D, 0x7, 0x8B, 0x0, 0x1, 0x2, 0x87, 0x6, 0x3F, 0x0, 0x1, 0x2, 0x5B, 0x7, 0x7F, 0x0, 0x1, 0x1, 0x98, 0x6, 0x49, 0x0, 0x1, 0x2, 0x5C, 0x7, 0x70, 0x0, 0x1, 0x1, 0x99, 0x6, 0x3A, 0x0, 0x1, 0x2, 0x5C, 0x6, 0x40, 0x0, 0x1, 0x1, 0x99, 0x5, 0xA, 0x0, 0x1, 0x2, 0x25, 0x5, 0xA, 0x0, 0x1, 0x2, 0x24, 0x7, 0xB8, 0x0, 0x1, 0x2, 0x7A, 0x6, 0x40, 0x0, 0x1, 0x2, 0x25, 0x7, 0xA7, 0x0, 0x1, 0x2, 0x79, 0x7, 0x7F, 0x0, 0x1, 0x2, 0x24, 0x6, 0x49, 0x0, 0x1, 0x2, 0x6B, 0x7, 0x7F, 0x0, 0x1, 0x1, 0x45, 0x7, 0x3, 0x0, 0x1, 0x2, 0x6C, 0x6, 0x40, 0x0, 0x1, 0x1, 0x46, 0x5, 0xC4, 0x0, 0x1, 0x2, 0x39, 0x5, 0xA, 0x0, 0x1, 0x2, 0x39, 0x7, 0xCE, 0x0, 0x1, 0x2, 0x9B, 0x6, 0x40, 0x0, 0x1, 0x2, 0x39, 0x7, 0x66, 0x0, 0x1, 0x2, 0x99, 0x7, 0xA1, 0x0, 0x1, 0x2, 0x1, 0x6, 0x55, 0x0, 0x1, 0x2, 0x99, 0x6, 0x4C, 0x0, 0x1, 0x2, 0x1, 0x5, 0x0, 0x0, 0x1, 0x3, 0x91, 0x7, 0x7F, 0x0, 0x1, 0x2, 0xF4, 0x6, 0x49, 0x0, 0x1, 0x3, 0x92, 0x6, 0x40, 0x0, 0x1, 0x2, 0xF5, 0x5, 0xA, 0x0, 0x1, 0x2, 0x86, 0x7, 0x8B, 0x0, 0x1, 0x2, 0x3, 0x6, 0x3F, 0x0, 0x1, 0x2, 0x87, 0x7, 0x79, 0x0, 0x1, 0x2, 0x4, 0x6, 0x2D, 0x0, 0x1, 0x2, 0x72, 0x7, 0x7F, 0x0, 0x1, 0x2, 0x1, 0x6, 0x49, 0x0, 0x1, 0x2, 0x6F, 0x7, 0x9E, 0x0, 0x1, 0x2, 0x7, 0x6, 0x68, 0x0, 0x1, 0x2, 0x6F, 0x6, 0x40, 0x0, 0x1, 0x2, 0x2, 0x6, 0x68, 0x0, 0x1, 0x1, 0x46, 0x6, 0xF1, 0x0, 0x1, 0x2, 0xF5, 0x6, 0xAB, 0x0, 0x1, 0x2, 0x2, 0x6, 0xAB, 0x0, 0x1, 0x2, 0x6F, 0x6, 0x55, 0x0, 0x1, 0x2, 0x6F, 0x6, 0x3A, 0x0, 0x1, 0x2, 0xAD, 0x7, 0x8B, 0x0, 0x1, 0x2, 0xAD, 0x7, 0x70, 0x0, 0x1, 0x1, 0x2E, 0x6, 0x40, 0x0, 0x1, 0x1, 0x2E, 0x6, 0x25, 0x0, 0x1, 0x1, 0x21, 0x7, 0x93, 0x0, 0x1, 0x1, 0x21, 0x7, 0x78, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x47, 0x0, 0x1, 0x2, 0x2B, 0x6, 0x2C, 0x0, 0x1, 0x2, 0x73, 0x7, 0x8B, 0x0, 0x1, 0x2, 0x73, 0x7, 0x70, 0x0, 0x1, 0x2, 0x1C, 0x5, 0x28, 0x0, 0x1, 0x2, 0x2, 0x5, 0x28, 0x0, 0x1, 0x2, 0x70, 0x5, 0x28, 0x0, 0x1, 0x2, 0x19, 0x6, 0x55, 0x0, 0x1, 0x2, 0x21, 0x6, 0x55, 0x0, 0x1, 0x2, 0xF, 0x6, 0x97, 0x0, 0x1, 0x0, 0xFF, 0x5, 0x28, 0x0, 0x1, 0x0, 0xFF, 0x6, 0x55, 0x0, 0x1, 0x2, 0x2, 0x6, 0x97, 0x0, 0x1, 0x2, 0x31, 0x6, 0x73, 0x0, 0x1, 0x2, 0xE, 0x5, 0x28, 0x0, 0x1, 0x2, 0xF, 0x5, 0x28, 0x0, 0x1, 0x2, 0x71, 0x6, 0x73, 0x0, 0x1, 0x2, 0xFE, 0x5, 0x28, 0x0, 0x1, 0x2, 0x32, 0x5, 0x28, 0x0, 0x1, 0x2, 0x1B, 0x5, 0x28, 0x0, 0x1, 0x2, 0x26, 0x5, 0x28, 0x0, 0x1, 0x2, 0xB, 0x5, 0x28, 0x0, 0x1, 0x2, 0x65, 0x5, 0x28, 0x0, 0x1, 0x2, 0x4F, 0x5, 0x28, 0x0, 0x1, 0x2, 0x19, 0x5, 0x28, 0x0, 0x1, 0x2, 0x71, 0x6, 0x58, 0x0, 0x1, 0x2, 0x31, 0x6, 0x58, 0x0, 0x1, 0x2, 0xDE, 0x5, 0x28, 0x0, 0x1, 0x3, 0x6E, 0x6, 0x79, 0x0, 0x1, 0x2, 0x5F, 0x6, 0x97, 0x0, 0x1, 0x2, 0x2C, 0x5, 0x28, 0x0, 0x1, 0x3, 0x3, 0x6, 0x97, 0x0, 0x1, 0x3, 0x3, 0x6, 0x55, 0x0, 0x1, 0x2, 0x19, 0x6, 0x97, 0x0, 0x1, 0x2, 0xAD, 0x6, 0x40, 0x0, 0x1, 0x2, 0x37, 0x5, 0xA, 0x0, 0x1, 0x2, 0x73, 0x6, 0x48, 0x0, 0x1, 0x2, 0x2B, 0x5, 0xA, 0x0, 0x1, 0x2, 0xC4, 0x6, 0x40, 0x0, 0x1, 0x2, 0x40, 0x5, 0xA, 0x0, 0x1, 0x2, 0x51, 0x5, 0x28, 0x0, 0x1, 0x2, 0x21, 0x5, 0x28, 0x0, 0x1, 0x2, 0x5F, 0x5, 0x28, 0x0, 0x1, 0x2, 0xC0, 0x7, 0xCD, 0x0, 0x1, 0x2, 0xC0, 0x7, 0xBC, 0x0, 0x1, 0x2, 0xC0, 0x7, 0xB3, 0x0, 0x1, 0x2, 0xC0, 0x7, 0x8B, 0x0, 0x1, 0x2, 0xC0, 0x7, 0xFF, 0x0, 0x1, 0x2, 0xC0, 0x7, 0x8E, 0x0, 0x1, 0x2, 0xC0, 0x7, 0xA9, 0x0, 0x1, 0x2, 0xD9, 0x7, 0xD5, 0x0, 0x1, 0x2, 0xD9, 0x7, 0x93, 0x0, 0x1, 0x2, 0xD9, 0x7, 0x96, 0x0, 0x1, 0x2, 0xD9, 0x7, 0xB1, 0x0, 0x1, 0x2, 0xD8, 0x7, 0xA5, 0x0, 0x1, 0x2, 0xD9, 0x7, 0xC4, 0x0, 0x1, 0x2, 0xDE, 0x7, 0xB3, 0x0, 0x1, 0x2, 0xDE, 0x7, 0xCD, 0x0, 0x1, 0x2, 0xDE, 0x7, 0xBC, 0x0, 0x1, 0x2, 0xD5, 0x7, 0xCD, 0x0, 0x1, 0x2, 0xD5, 0x7, 0x8B, 0x0, 0x1, 0x2, 0xD5, 0x7, 0xB3, 0x0, 0x1, 0x2, 0xD5, 0x7, 0x8E, 0x0, 0x1, 0x2, 0xD5, 0x7, 0xA9, 0x0, 0x1, 0x2, 0xD5, 0x7, 0xFF, 0x0, 0x1, 0x2, 0xD5, 0x7, 0xAF, 0x0, 0x1, 0x1, 0xC, 0x5, 0x3, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x42, 0xC6, 0x0, 0xC, 0x0, 0x1, 0x43, 0x88, 0x1, 0xFC, 0x0, 0x2, 0x0, 0x52, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x46, 0x0, 0x5F, 0x0, 0x1A, 0x0, 0x8C, 0x0, 0x97, 0x0, 0x34, 0x0, 0xA6, 0x0, 0xA7, 0x0, 0x40, 0x0, 0xAD, 0x0, 0xAD, 0x0, 0x42, 0x0, 0xB0, 0x0, 0xB0, 0x0, 0x43, 0x0, 0xB4, 0x0, 0xB5, 0x0, 0x44, 0x0, 0xBD, 0x0, 0xBD, 0x0, 0x46, 0x0, 0xC3, 0x0, 0xC4, 0x0, 0x47, 0x0, 0xC9, 0x0, 0xCA, 0x0, 0x49, 0x0, 0xDB, 0x0, 0xDC, 0x0, 0x4B, 0x0, 0xF2, 0x0, 0xF2, 0x0, 0x4D, 0x0, 0xF8, 0x0, 0xF9, 0x0, 0x4E, 0x0, 0xFD, 0x0, 0xFE, 0x0, 0x50, 0x1, 0x1, 0x1, 0x61, 0x0, 0x52, 0x2, 0x39, 0x2, 0x3A, 0x0, 0xB3, 0x2, 0x40, 0x2, 0x40, 0x0, 0xB5, 0x2, 0x4D, 0x2, 0x4D, 0x0, 0xB6, 0x2, 0x71, 0x2, 0x71, 0x0, 0xB7, 0x2, 0x73, 0x2, 0x73, 0x0, 0xB8, 0x2, 0x85, 0x2, 0x85, 0x0, 0xB9, 0x2, 0x88, 0x2, 0x88, 0x0, 0xBA, 0x2, 0xB7, 0x2, 0xB8, 0x0, 0xBB, 0x2, 0xD8, 0x2, 0xD9, 0x0, 0xBD, 0x2, 0xE3, 0x2, 0xE4, 0x0, 0xBF, 0x2, 0xEF, 0x2, 0xEF, 0x0, 0xC1, 0x2, 0xF9, 0x2, 0xF9, 0x0, 0xC2, 0x2, 0xFB, 0x2, 0xFB, 0x0, 0xC3, 0x3, 0x1, 0x3, 0x3, 0x0, 0xC4, 0x3, 0x5, 0x3, 0x5, 0x0, 0xC7, 0x3, 0x2F, 0x3, 0x3F, 0x0, 0xC8, 0x3, 0x43, 0x3, 0x44, 0x0, 0xD9, 0x3, 0x47, 0x3, 0x4B, 0x0, 0xDB, 0x3, 0x4F, 0x3, 0x5A, 0x0, 0xE0, 0x3, 0x9A, 0x3, 0xA6, 0x0, 0xEC, 0x3, 0xA8, 0x3, 0xA9, 0x0, 0xF9, 0x3, 0xAB, 0x3, 0xC9, 0x0, 0xFB, 0x4, 0x2B, 0x4, 0x2E, 0x1, 0x1A, 0x6, 0xEA, 0x6, 0xEA, 0x1, 0x1E, 0x7, 0x4E, 0x7, 0x62, 0x1, 0x1F, 0x7, 0x6F, 0x7, 0x6F, 0x1, 0x34, 0x7, 0x79, 0x7, 0x79, 0x1, 0x35, 0x7, 0x7C, 0x7, 0x7C, 0x1, 0x36, 0x7, 0x8D, 0x7, 0x8D, 0x1, 0x37, 0x7, 0x93, 0x7, 0x94, 0x1, 0x38, 0x7, 0xA6, 0x7, 0xA6, 0x1, 0x3A, 0x7, 0xA9, 0x7, 0xA9, 0x1, 0x3B, 0x7, 0xAB, 0x7, 0xAB, 0x1, 0x3C, 0x7, 0xAE, 0x7, 0xB1, 0x1, 0x3D, 0x7, 0xDE, 0x7, 0xE2, 0x1, 0x41, 0x7, 0xEE, 0x7, 0xF3, 0x1, 0x46, 0x7, 0xF5, 0x7, 0xF5, 0x1, 0x4C, 0x7, 0xF7, 0x7, 0xF8, 0x1, 0x4D, 0x7, 0xFA, 0x7, 0xFA, 0x1, 0x4F, 0x8, 0xAD, 0x8, 0xB0, 0x1, 0x50, 0x8, 0xB3, 0x8, 0xB8, 0x1, 0x54, 0x8, 0xC8, 0x9, 0x30, 0x1, 0x5A, 0x9, 0x33, 0x9, 0x33, 0x1, 0xC3, 0x9, 0x35, 0x9, 0x78, 0x1, 0xC4, 0x9, 0x7D, 0x9, 0xD4, 0x2, 0x8, 0xA, 0x12, 0xA, 0x13, 0x2, 0x60, 0xA, 0x16, 0xA, 0x17, 0x2, 0x62, 0xA, 0x19, 0xA, 0x19, 0x2, 0x64, 0xA, 0x1C, 0xA, 0x1D, 0x2, 0x65, 0xA, 0x22, 0xA, 0x29, 0x2, 0x67, 0xA, 0x2F, 0xA, 0x32, 0x2, 0x6F, 0xA, 0x6E, 0xA, 0xC5, 0x2, 0x73, 0xA, 0xE7, 0xA, 0xE7, 0x2, 0xCB, 0xA, 0xEE, 0xB, 0x2, 0x2, 0xCC, 0xB, 0x5, 0xB, 0xC, 0x2, 0xE1, 0xB, 0x10, 0xB, 0x3B, 0x2, 0xE9, 0xB, 0x4D, 0xB, 0xD7, 0x3, 0x15, 0xC, 0xB7, 0xC, 0xCE, 0x3, 0xA0, 0xC, 0xD0, 0xC, 0xD4, 0x3, 0xB8, 0xC, 0xD6, 0xC, 0xD7, 0x3, 0xBD, 0xC, 0xD9, 0xC, 0xD9, 0x3, 0xBF, 0xC, 0xDB, 0xC, 0xDD, 0x3, 0xC0, 0xC, 0xDF, 0xC, 0xE7, 0x3, 0xC3, 0xC, 0xEB, 0xC, 0xEB, 0x3, 0xCC, 0xC, 0xED, 0xC, 0xFC, 0x3, 0xCD, 0xD, 0x12, 0xD, 0x12, 0x3, 0xDD, 0xD, 0x1D, 0xD, 0x1E, 0x3, 0xDE, 0x3, 0xE0, 0xD, 0xE6, 0xD, 0xEC, 0xC, 0x8A, 0xE, 0x10, 0xE, 0x4C, 0x10, 0x92, 0xE, 0x82, 0xE, 0x9A, 0xD, 0xDA, 0xC, 0x9C, 0xE, 0xB2, 0xD, 0xEC, 0xE, 0xF4, 0xF, 0xC, 0xF, 0x3C, 0xF, 0x48, 0x7, 0xC2, 0xF, 0x54, 0xF, 0x78, 0xF, 0x90, 0xF, 0xDE, 0xF, 0xEA, 0x10, 0x2, 0x10, 0x14, 0x10, 0x20, 0x10, 0x26, 0x10, 0x62, 0xD, 0xF2, 0xD, 0x5C, 0xE, 0x16, 0xE, 0x52, 0xE, 0x7C, 0xE, 0x88, 0xE, 0xA0, 0xD, 0xE0, 0xC, 0x42, 0xE, 0xB8, 0xD, 0xE0, 0xE, 0xFA, 0xF, 0x12, 0xF, 0x42, 0xF, 0x4E, 0x7, 0xC8, 0xF, 0x5A, 0xF, 0x7E, 0x10, 0x50, 0xF, 0xE4, 0xF, 0xF0, 0x10, 0x56, 0x10, 0x1A, 0x10, 0x5C, 0x10, 0x2C, 0xE, 0x16, 0x7, 0xCE, 0xD, 0xE0, 0x7, 0xD4, 0xD, 0xEC, 0x7, 0xDA, 0xF, 0xC, 0xF, 0x12, 0x7, 0xE0, 0x7, 0xE6, 0xD, 0xE0, 0xD, 0xF2, 0x7, 0xEC, 0x8, 0x7C, 0x7, 0xF2, 0x7, 0xF8, 0xD, 0x8C, 0xD, 0x92, 0x7, 0xFE, 0xD, 0xB0, 0xF, 0xE4, 0x10, 0x26, 0x10, 0x2C, 0x8, 0x4, 0x8, 0xA, 0xD, 0xEC, 0x8, 0x10, 0x8, 0x16, 0xC, 0x9C, 0x8, 0x1C, 0xF, 0x54, 0x8, 0x22, 0x8, 0x28, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x3A, 0x8, 0x40, 0x8, 0x46, 0x8, 0x4C, 0x8, 0x52, 0x8, 0x58, 0xE, 0x16, 0x8, 0x5E, 0xD, 0xD4, 0xD, 0xD4, 0xF, 0xE4, 0x8, 0x64, 0x8, 0x64, 0x8, 0x6A, 0x8, 0x70, 0x8, 0x76, 0x8, 0x76, 0x8, 0x7C, 0xB, 0x4C, 0x8, 0x82, 0xB, 0xB2, 0xA, 0x2C, 0xB, 0x4C, 0xB, 0x34, 0x8, 0x88, 0x8, 0x8E, 0x8, 0x94, 0xA, 0xC8, 0x8, 0x9A, 0x8, 0xA0, 0x8, 0xA6, 0x8, 0xAC, 0x8, 0xB2, 0x8, 0xB8, 0x8, 0xBE, 0x8, 0xC4, 0x8, 0xCA, 0x8, 0xD0, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xDC, 0x8, 0xE2, 0x8, 0xE8, 0x8, 0xE8, 0x8, 0xEE, 0x8, 0xF4, 0x8, 0xFA, 0x9, 0x0, 0x9, 0x6, 0x9, 0xC, 0x9, 0xC, 0x9, 0x12, 0x9, 0x18, 0xB, 0xA, 0x9, 0x1E, 0x9, 0x24, 0xA, 0x9E, 0x9, 0x2A, 0x9, 0x72, 0xA, 0x62, 0x9, 0xAE, 0x9, 0x30, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x42, 0x9, 0x42, 0x9, 0x48, 0xA, 0x8C, 0x9, 0x4E, 0xB, 0xD6, 0x9, 0x54, 0x9, 0x5A, 0x9, 0x60, 0x9, 0x66, 0xB, 0x88, 0x9, 0x6C, 0xB, 0x9A, 0x9, 0x72, 0xF, 0xE4, 0x9, 0x78, 0x9, 0x7E, 0x9, 0x84, 0x9, 0x8A, 0xB, 0x94, 0x9, 0x90, 0x9, 0x96, 0x9, 0x9C, 0x9, 0xA2, 0x9, 0xA8, 0x9, 0xAE, 0x9, 0xB4, 0x9, 0xB4, 0x9, 0xBA, 0x9, 0xC0, 0xD, 0xCE, 0x9, 0xC6, 0x9, 0xCC, 0x9, 0xD2, 0x9, 0xD8, 0x9, 0xDE, 0x9, 0xE4, 0x9, 0xEA, 0xC, 0x18, 0x9, 0xF0, 0x9, 0xF6, 0x9, 0xFC, 0xA, 0x2, 0xA, 0x8, 0xA, 0xE, 0xA, 0x1A, 0xA, 0x14, 0xD, 0xEC, 0xA, 0x1A, 0xA, 0xC8, 0x10, 0xD4, 0xA, 0x20, 0xA, 0x26, 0xA, 0x2C, 0xA, 0x32, 0xA, 0x38, 0xA, 0x3E, 0xA, 0x44, 0xA, 0x4A, 0xA, 0x50, 0xA, 0x56, 0xA, 0x5C, 0xA, 0x62, 0xA, 0x68, 0xA, 0x6E, 0xA, 0x74, 0xA, 0x7A, 0xA, 0x80, 0xA, 0x86, 0xA, 0x8C, 0xA, 0x92, 0xA, 0x98, 0xA, 0x9E, 0xA, 0xA4, 0xA, 0xAA, 0xA, 0xB0, 0xA, 0xC2, 0xA, 0xB6, 0xA, 0xBC, 0xA, 0xC2, 0xA, 0xC8, 0xA, 0xCE, 0xA, 0xD4, 0xA, 0xDA, 0xA, 0xE0, 0xA, 0xE6, 0xA, 0xEC, 0xA, 0xF2, 0xA, 0xF8, 0xA, 0xFE, 0xD, 0x8C, 0xB, 0x4, 0xB, 0xA, 0xB, 0xA, 0xB, 0x10, 0xB, 0x16, 0xB, 0x1C, 0xB, 0x22, 0xB, 0x28, 0xB, 0x2E, 0xB, 0x34, 0xB, 0x3A, 0xD, 0x8C, 0xB, 0x40, 0xB, 0x46, 0xB, 0x4C, 0xB, 0x52, 0xE, 0x88, 0xB, 0x58, 0xB, 0x5E, 0xB, 0x64, 0xB, 0x6A, 0xB, 0x70, 0xB, 0x76, 0xB, 0x7C, 0xB, 0x82, 0xB, 0x88, 0xB, 0x8E, 0xB, 0x94, 0xB, 0x9A, 0xB, 0xA0, 0xB, 0xA6, 0xB, 0xAC, 0xB, 0xB2, 0xB, 0xB8, 0xB, 0xBE, 0xB, 0xC4, 0xB, 0xCA, 0xB, 0xD0, 0xB, 0xD6, 0xB, 0xDC, 0xB, 0xE2, 0xB, 0xE8, 0xB, 0xEE, 0xB, 0xF4, 0xB, 0xFA, 0x10, 0x6E, 0x10, 0xEC, 0x10, 0xB0, 0x10, 0xE6, 0xC, 0x0, 0xD, 0x56, 0x10, 0xAA, 0x10, 0x7A, 0xD, 0x3E, 0xC, 0x6, 0x10, 0xA4, 0x10, 0xDA, 0x10, 0x74, 0x10, 0x9E, 0xD, 0x2C, 0x10, 0x86, 0x10, 0xCE, 0x10, 0x80, 0x10, 0xBC, 0xD, 0xE, 0xC, 0xC, 0x10, 0x68, 0x10, 0xB6, 0xC, 0x12, 0xC, 0x18, 0x10, 0xC8, 0xC, 0x1E, 0x10, 0x98, 0xC, 0x24, 0xE, 0xB8, 0xD, 0x8, 0x10, 0xC2, 0x10, 0x92, 0x10, 0x8C, 0xC, 0x2A, 0xC, 0x30, 0xD, 0xE6, 0xC, 0x36, 0xC, 0x3C, 0xC, 0x42, 0xC, 0x5A, 0xC, 0x48, 0xC, 0x4E, 0xC, 0x60, 0xC, 0x54, 0xD, 0xE0, 0xC, 0x5A, 0xD, 0xE0, 0xC, 0x60, 0xE, 0x16, 0xC, 0x66, 0xC, 0x6C, 0xC, 0x72, 0xC, 0x78, 0x10, 0xD4, 0xC, 0x7E, 0x10, 0xDA, 0xC, 0x84, 0x10, 0x74, 0xE, 0x10, 0xE, 0x10, 0xE, 0xA0, 0xF, 0x90, 0x10, 0x50, 0xD, 0xE6, 0xD, 0xE6, 0xD, 0xE6, 0xD, 0xE6, 0xD, 0xE6, 0xD, 0xE6, 0xD, 0xE6, 0xE, 0x4, 0xE, 0x4C, 0xE, 0x4C, 0xE, 0x4C, 0xE, 0x4C, 0xD, 0xDA, 0xD, 0xDA, 0xD, 0xDA, 0xD, 0xDA, 0xF, 0xC, 0xF, 0x3C, 0xF, 0x3C, 0xF, 0x3C, 0xF, 0x3C, 0xF, 0x3C, 0xF, 0xDE, 0xF, 0xDE, 0xF, 0xDE, 0xF, 0xDE, 0x10, 0x20, 0x10, 0x62, 0x10, 0x62, 0x10, 0x62, 0x10, 0x62, 0x10, 0x62, 0x10, 0x62, 0x10, 0x62, 0xE, 0xA, 0xE, 0x52, 0xE, 0x52, 0xE, 0x52, 0xE, 0x52, 0xD, 0xE0, 0xD, 0xE0, 0xD, 0xE0, 0xD, 0xE0, 0xF, 0x12, 0xF, 0x42, 0xF, 0x42, 0xF, 0x42, 0xF, 0x42, 0xF, 0x42, 0xF, 0xE4, 0xF, 0xE4, 0xF, 0xE4, 0xF, 0xE4, 0x10, 0x5C, 0x10, 0x5C, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xC, 0x8A, 0xD, 0x5C, 0xC, 0x8A, 0xD, 0x5C, 0xC, 0x8A, 0xD, 0x5C, 0xC, 0x8A, 0xD, 0x5C, 0xE, 0x10, 0xE, 0x16, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x82, 0xE, 0x88, 0xE, 0x82, 0xE, 0x88, 0xE, 0x82, 0xE, 0x88, 0xC, 0x90, 0xE, 0x88, 0xE, 0x9A, 0xE, 0xA0, 0xD, 0xDA, 0xD, 0xE0, 0xD, 0xDA, 0xD, 0xE0, 0xD, 0xDA, 0xD, 0xE0, 0xC, 0x96, 0xD, 0xE0, 0xD, 0xDA, 0xC, 0x9C, 0xC, 0xA2, 0xC, 0xA8, 0xD, 0xEC, 0xD, 0xE0, 0xC, 0xAE, 0xC, 0xB4, 0xD, 0xEC, 0xD, 0xE0, 0xD, 0xEC, 0xD, 0xE0, 0xF, 0xC, 0xF, 0x12, 0xC, 0xBA, 0xC, 0xC0, 0xF, 0xC, 0xF, 0x12, 0xF, 0x12, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x54, 0xF, 0x5A, 0xC, 0xC6, 0xC, 0xCC, 0xF, 0x54, 0xF, 0x5A, 0xF, 0x78, 0xF, 0x7E, 0xF, 0x78, 0xF, 0x7E, 0xC, 0xD2, 0xC, 0xD8, 0xC, 0xDE, 0xC, 0xE4, 0xF, 0x78, 0xF, 0x7E, 0xC, 0xEA, 0xC, 0xF0, 0xC, 0xF6, 0xC, 0xFC, 0xF, 0x90, 0x10, 0x50, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0x10, 0x2, 0x10, 0x56, 0x10, 0x20, 0x10, 0x5C, 0x10, 0x20, 0x10, 0x26, 0x10, 0x2C, 0x10, 0x26, 0x10, 0x2C, 0x10, 0x26, 0x10, 0x2C, 0xD, 0x8, 0xD, 0x8, 0x10, 0xAA, 0x10, 0x8C, 0x10, 0x8C, 0x10, 0x8C, 0x10, 0x8C, 0x10, 0x8C, 0x10, 0x8C, 0x10, 0x8C, 0xD, 0x2, 0x10, 0x98, 0x10, 0x98, 0x10, 0x98, 0x10, 0x98, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x74, 0x10, 0xDA, 0x10, 0xDA, 0x10, 0xDA, 0x10, 0xDA, 0x10, 0xDA, 0xD, 0x56, 0xD, 0x56, 0xD, 0x56, 0xD, 0x56, 0x10, 0xEC, 0x10, 0x8C, 0x10, 0x8C, 0x10, 0x8C, 0x10, 0xC2, 0x10, 0xC2, 0x10, 0xC2, 0x10, 0xC2, 0xD, 0x8, 0x10, 0x98, 0x10, 0x98, 0x10, 0x98, 0x10, 0x98, 0x10, 0x98, 0xD, 0xE, 0xD, 0xE, 0xD, 0xE, 0xD, 0x14, 0x10, 0xBC, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0xD, 0x1A, 0x10, 0x80, 0x10, 0xCE, 0xD, 0x20, 0xD, 0x2C, 0xD, 0x26, 0xD, 0x2C, 0xD, 0x2C, 0x10, 0x74, 0xD, 0x32, 0x10, 0x74, 0x10, 0xDA, 0x10, 0xDA, 0x10, 0xDA, 0x11, 0x22, 0xD, 0x3E, 0xD, 0x38, 0xD, 0x3E, 0x10, 0x7A, 0x10, 0x7A, 0xD, 0x44, 0x10, 0x7A, 0xD, 0x4A, 0x10, 0xAA, 0xD, 0x50, 0xD, 0x56, 0xD, 0x56, 0xD, 0x56, 0xD, 0x56, 0xD, 0x56, 0xD, 0x56, 0x10, 0xE6, 0x10, 0xEC, 0x10, 0xEC, 0x10, 0x6E, 0x10, 0x6E, 0x10, 0x6E, 0x10, 0x62, 0xE, 0x52, 0xF, 0x4E, 0xD, 0x5C, 0x10, 0x1A, 0xF, 0x7E, 0xD, 0xE0, 0x10, 0x2, 0x10, 0x56, 0x10, 0x2, 0x10, 0x56, 0x10, 0x2, 0x10, 0x56, 0x10, 0x20, 0x10, 0x5C, 0xE, 0xF4, 0xE, 0xFA, 0xD, 0xE6, 0x10, 0x62, 0xD, 0x62, 0xD, 0x68, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xD, 0x62, 0xD, 0x68, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xD, 0x62, 0xD, 0x68, 0xD, 0x6E, 0xD, 0x74, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xD, 0x6E, 0xD, 0x74, 0xD, 0xDA, 0xD, 0xE0, 0xD, 0x7A, 0x11, 0x34, 0xD, 0x80, 0xD, 0x86, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xD, 0x80, 0xD, 0x86, 0xD, 0x8C, 0xD, 0x92, 0xD, 0x8C, 0xD, 0x92, 0xD, 0x8C, 0xD, 0x92, 0xD, 0x8C, 0xD, 0x92, 0xD, 0x98, 0xD, 0x9E, 0xD, 0xA4, 0xD, 0xAA, 0xF, 0xDE, 0xF, 0xE4, 0xD, 0xB0, 0xF, 0xE4, 0xD, 0xB0, 0xF, 0xE4, 0xD, 0xB0, 0xF, 0xE4, 0xD, 0xB0, 0xF, 0xE4, 0xD, 0xB6, 0xD, 0xBC, 0xD, 0xC2, 0xD, 0xC8, 0x10, 0x20, 0x10, 0x5C, 0x10, 0x20, 0x10, 0x5C, 0xD, 0xCE, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xDA, 0xD, 0xE0, 0xF, 0x3C, 0xF, 0x42, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0xD, 0xD4, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xE, 0x82, 0xE, 0x88, 0xE, 0xB2, 0xE, 0xB8, 0x11, 0xA, 0x11, 0x10, 0x11, 0xA, 0x11, 0x10, 0xE, 0x82, 0xE, 0x88, 0xF, 0xC, 0xF, 0x12, 0xD, 0xE6, 0x10, 0x62, 0xD, 0xE6, 0x10, 0x62, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xD, 0xDA, 0xD, 0xE0, 0xD, 0xDA, 0xD, 0xE0, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x54, 0xF, 0x5A, 0xF, 0x54, 0xF, 0x5A, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0xE, 0x9A, 0xE, 0xA0, 0xD, 0xE6, 0x10, 0x62, 0xE, 0x70, 0xE, 0x76, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0x10, 0x20, 0x10, 0x5C, 0xD, 0xEC, 0xD, 0xF2, 0xE, 0xD6, 0xD, 0xF8, 0xE, 0xDC, 0xD, 0xFE, 0xE, 0x4, 0xE, 0xA, 0xE, 0x10, 0xE, 0x16, 0xE, 0x1C, 0xE, 0x22, 0xE, 0x28, 0xE, 0x2E, 0xE, 0x34, 0xE, 0x3A, 0xE, 0x40, 0xE, 0x46, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x4C, 0xE, 0x52, 0xE, 0x58, 0xE, 0x5E, 0xE, 0x64, 0xE, 0x6A, 0xE, 0x70, 0xE, 0x76, 0x10, 0x92, 0xE, 0x7C, 0xE, 0x82, 0xE, 0x88, 0xE, 0x9A, 0xE, 0xA0, 0xE, 0x8E, 0xE, 0x94, 0xE, 0x9A, 0xE, 0xA0, 0xE, 0xA6, 0xE, 0xAC, 0xE, 0xB2, 0xE, 0xB8, 0xE, 0xBE, 0xE, 0xC4, 0xE, 0xCA, 0xE, 0xD0, 0xE, 0xD6, 0x11, 0x34, 0xE, 0xD6, 0x11, 0x34, 0xE, 0xDC, 0xE, 0xE2, 0xE, 0xE8, 0xE, 0xEE, 0xE, 0xF4, 0xE, 0xFA, 0xF, 0x0, 0xF, 0x6, 0xF, 0xC, 0xF, 0x12, 0xF, 0x18, 0xF, 0x1E, 0xF, 0x24, 0xF, 0x2A, 0xF, 0x30, 0xF, 0x36, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x3C, 0xF, 0x42, 0xF, 0x48, 0xF, 0x4E, 0xF, 0x48, 0xF, 0x4E, 0xF, 0x54, 0xF, 0x5A, 0xF, 0x60, 0xF, 0x66, 0xF, 0x60, 0xF, 0x66, 0xF, 0x6C, 0xF, 0x72, 0xF, 0x78, 0xF, 0x7E, 0xF, 0x84, 0xF, 0x8A, 0xF, 0x78, 0xF, 0x7E, 0xF, 0x78, 0xF, 0x7E, 0xF, 0x84, 0xF, 0x8A, 0xF, 0x90, 0x10, 0x50, 0xF, 0x96, 0xF, 0x9C, 0xF, 0xA2, 0xF, 0xA8, 0xF, 0xAE, 0xF, 0xB4, 0xF, 0xBA, 0xF, 0xC0, 0xF, 0xC6, 0xF, 0xCC, 0xF, 0xD2, 0xF, 0xD8, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xDE, 0xF, 0xE4, 0xF, 0xEA, 0xF, 0xF0, 0xF, 0xF6, 0xF, 0xFC, 0x10, 0x2, 0x10, 0x56, 0x10, 0x8, 0x10, 0xE, 0x10, 0x14, 0x10, 0x1A, 0x10, 0x14, 0x10, 0x1A, 0x10, 0x20, 0x10, 0x5C, 0x10, 0x26, 0x10, 0x2C, 0x10, 0x32, 0x10, 0x38, 0x10, 0x3E, 0x10, 0x44, 0x10, 0x4A, 0x10, 0x50, 0x10, 0x56, 0x10, 0x5C, 0x10, 0x62, 0x10, 0x8C, 0x10, 0x98, 0x10, 0xBC, 0x10, 0x80, 0x10, 0xDA, 0x10, 0xEC, 0x10, 0x68, 0x10, 0x8C, 0x10, 0x92, 0x10, 0x98, 0x10, 0x6E, 0x10, 0xBC, 0x10, 0x80, 0x10, 0x86, 0x10, 0x9E, 0x10, 0x74, 0x10, 0xDA, 0x10, 0xA4, 0x10, 0xAA, 0x10, 0xEC, 0x10, 0xB0, 0x10, 0x80, 0x10, 0xEC, 0x10, 0x98, 0x10, 0x7A, 0x10, 0x80, 0x10, 0x80, 0x10, 0xCE, 0x10, 0x86, 0x10, 0x8C, 0x10, 0x92, 0x10, 0x98, 0x10, 0x9E, 0x10, 0xBC, 0x10, 0xDA, 0x10, 0xA4, 0x10, 0xC2, 0x10, 0xAA, 0x10, 0xB0, 0x10, 0xB6, 0x10, 0xBC, 0x10, 0xC2, 0x10, 0xEC, 0x10, 0xC8, 0x10, 0xCE, 0x10, 0xD4, 0x10, 0xDA, 0x10, 0xE0, 0x10, 0xE6, 0x10, 0xE6, 0x10, 0xE6, 0x10, 0xEC, 0x10, 0xF2, 0x10, 0xF8, 0x10, 0xFE, 0x11, 0x4, 0x11, 0xA, 0x11, 0x10, 0x11, 0x16, 0x11, 0x1C, 0x11, 0x22, 0x11, 0x28, 0x11, 0x2E, 0x11, 0x34, 0x0, 0x1, 0x2, 0xBA, 0xFF, 0xF6, 0x0, 0x1, 0x3, 0x8C, 0xFE, 0x69, 0x0, 0x1, 0x2, 0xDF, 0x0, 0xA, 0x0, 0x1, 0x2, 0x54, 0x0, 0xA, 0x0, 0x1, 0x1, 0x28, 0x0, 0xA, 0x0, 0x1, 0x3, 0xC9, 0x0, 0x0, 0x0, 0x1, 0x3, 0xA7, 0xFF, 0xFC, 0x0, 0x1, 0x2, 0xB8, 0x0, 0x0, 0x0, 0x1, 0x1, 0x63, 0x0, 0x7, 0x0, 0x1, 0x1, 0x63, 0x0, 0xA, 0x0, 0x1, 0x2, 0x4A, 0x0, 0xA, 0x0, 0x1, 0x2, 0xB0, 0xFF, 0xF9, 0x0, 0x1, 0x2, 0x33, 0xFE, 0x19, 0x0, 0x1, 0x2, 0x86, 0x0, 0xA, 0x0, 0x1, 0x3, 0x22, 0x0, 0x0, 0x0, 0x1, 0x1, 0x5A, 0xFE, 0x35, 0x0, 0x1, 0x1, 0x50, 0x0, 0xA, 0x0, 0x1, 0x2, 0xCB, 0x0, 0x10, 0x0, 0x1, 0x3, 0xC, 0xFF, 0x79, 0x0, 0x1, 0x2, 0x2A, 0x0, 0x0, 0x0, 0x1, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x65, 0x0, 0x0, 0x0, 0x1, 0x2, 0x74, 0xFF, 0xFC, 0x0, 0x1, 0x1, 0xF5, 0x0, 0x0, 0x0, 0x1, 0x2, 0x4E, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5D, 0xFE, 0x41, 0x0, 0x1, 0x1, 0xF2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x23, 0x0, 0x0, 0x0, 0x1, 0x2, 0x25, 0x0, 0x0, 0x0, 0x1, 0x1, 0x89, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x2B, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x72, 0x0, 0x0, 0x0, 0x1, 0x2, 0x90, 0x0, 0x0, 0x0, 0x1, 0x0, 0xF1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x6A, 0x0, 0x0, 0x0, 0x1, 0x1, 0x7E, 0x0, 0x0, 0x0, 0x1, 0x1, 0x31, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x75, 0xFE, 0x41, 0x0, 0x1, 0x3, 0x80, 0x0, 0x0, 0x0, 0x1, 0x3, 0x80, 0xFE, 0x41, 0x0, 0x1, 0x3, 0x85, 0xFE, 0x41, 0x0, 0x1, 0x2, 0xA2, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x3E, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x42, 0x0, 0x0, 0x0, 0x1, 0x3, 0x8E, 0x0, 0x0, 0x0, 0x1, 0x3, 0x48, 0x0, 0x0, 0x0, 0x1, 0x2, 0x6A, 0xFE, 0x41, 0x0, 0x1, 0x0, 0xE8, 0x0, 0x0, 0x0, 0x1, 0x0, 0xE8, 0xFE, 0x41, 0x0, 0x1, 0x1, 0xED, 0xFE, 0x41, 0x0, 0x1, 0x0, 0xFA, 0x0, 0x0, 0x0, 0x1, 0x1, 0x75, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x1B, 0x0, 0x0, 0x0, 0x1, 0x2, 0x50, 0x0, 0x0, 0x0, 0x1, 0x2, 0x17, 0xFE, 0x41, 0x0, 0x1, 0x0, 0xD4, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x64, 0xFE, 0x41, 0x0, 0x1, 0x1, 0x66, 0xFE, 0x41, 0x0, 0x1, 0x1, 0xB6, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x9C, 0x0, 0x0, 0x0, 0x1, 0x2, 0x30, 0x0, 0x0, 0x0, 0x1, 0x2, 0x1E, 0x0, 0x0, 0x0, 0x1, 0x1, 0xF4, 0xFE, 0x41, 0x0, 0x1, 0x1, 0xEC, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x3A, 0xFE, 0x41, 0x0, 0x1, 0x1, 0xF9, 0x0, 0x0, 0x0, 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x2, 0xC2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x17, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5C, 0x0, 0x0, 0x0, 0x1, 0x2, 0x49, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x1A, 0x0, 0x0, 0x0, 0x1, 0x1, 0xFA, 0x0, 0x0, 0x0, 0x1, 0x5, 0xA4, 0x0, 0x0, 0x0, 0x1, 0x5, 0xB, 0xFE, 0x41, 0x0, 0x1, 0x5, 0x85, 0xFE, 0x41, 0x0, 0x1, 0x3, 0xCD, 0x0, 0x0, 0x0, 0x1, 0x4, 0x47, 0x0, 0x0, 0x0, 0x1, 0x4, 0xA9, 0xFE, 0x41, 0x0, 0x1, 0x3, 0x66, 0x0, 0x0, 0x0, 0x1, 0x3, 0x19, 0x0, 0x0, 0x0, 0x1, 0x1, 0xE3, 0x0, 0x0, 0x0, 0x1, 0x1, 0xEE, 0x0, 0x0, 0x0, 0x1, 0x2, 0xAC, 0xFE, 0x41, 0x0, 0x1, 0x2, 0xA9, 0x0, 0xA, 0x0, 0x1, 0x2, 0x12, 0xFF, 0xF6, 0x0, 0x1, 0x3, 0x4A, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0x67, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0xCB, 0x0, 0xA, 0x0, 0x1, 0x2, 0xE, 0xFF, 0xF7, 0x0, 0x1, 0x2, 0x29, 0x0, 0xA, 0x0, 0x1, 0x2, 0x9A, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0x47, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0x4D, 0xFF, 0xF6, 0x0, 0x1, 0x3, 0xC1, 0xFF, 0xFE, 0x0, 0x1, 0x2, 0xC9, 0x0, 0x3, 0x0, 0x1, 0x2, 0xA2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5C, 0x0, 0xA, 0x0, 0x1, 0x1, 0x11, 0x0, 0xA, 0x0, 0x1, 0x2, 0x21, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0xA4, 0xFF, 0xF6, 0x0, 0x1, 0x3, 0x4D, 0x0, 0x0, 0x0, 0x1, 0x2, 0x71, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3D, 0x0, 0x0, 0x0, 0x1, 0x2, 0x44, 0x0, 0x0, 0x0, 0x1, 0x2, 0xA7, 0x0, 0x0, 0x0, 0x1, 0x2, 0x4B, 0x0, 0x0, 0x0, 0x1, 0x2, 0xF, 0x0, 0x0, 0x0, 0x1, 0x1, 0x5, 0xFE, 0x41, 0x0, 0x1, 0x1, 0xD2, 0x0, 0x0, 0x0, 0x1, 0x2, 0xB, 0x0, 0x0, 0x0, 0x1, 0x2, 0x24, 0x0, 0x0, 0x0, 0x1, 0x2, 0xF6, 0x0, 0x0, 0x0, 0x1, 0x2, 0x54, 0x0, 0x0, 0x0, 0x1, 0x2, 0x4D, 0x0, 0x0, 0x0, 0x1, 0x1, 0xF6, 0x0, 0x0, 0x0, 0x1, 0x3, 0x73, 0x0, 0x0, 0x0, 0x1, 0x1, 0xF3, 0x0, 0x0, 0x0, 0x1, 0x2, 0x4A, 0x0, 0x0, 0x0, 0x1, 0x2, 0x34, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3F, 0x0, 0x0, 0x0, 0x1, 0x1, 0xFB, 0x0, 0x0, 0x0, 0x1, 0x2, 0x79, 0x0, 0x0, 0x0, 0x1, 0x1, 0xFE, 0x0, 0x0, 0x0, 0x1, 0x2, 0xF8, 0x0, 0x0, 0x0, 0x1, 0x1, 0xEA, 0x0, 0x0, 0x0, 0x1, 0x2, 0xD, 0x0, 0x0, 0x0, 0x1, 0x2, 0x67, 0x0, 0x0, 0x0, 0x1, 0x2, 0x7, 0x0, 0x0, 0x0, 0x1, 0x2, 0x4F, 0x0, 0x0, 0x0, 0x1, 0x2, 0x56, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5B, 0x0, 0x0, 0x0, 0x1, 0x2, 0xB1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x78, 0x0, 0x0, 0x0, 0x1, 0x3, 0x4E, 0x0, 0x0, 0x0, 0x1, 0x2, 0xFB, 0x0, 0x0, 0x0, 0x1, 0x2, 0x14, 0x0, 0x0, 0x0, 0x1, 0x1, 0xAA, 0x0, 0x0, 0x0, 0x1, 0x3, 0xF7, 0x0, 0x0, 0x0, 0x1, 0x1, 0x69, 0xFE, 0x41, 0x0, 0x1, 0x1, 0x75, 0x0, 0x0, 0x0, 0x1, 0x2, 0x36, 0x0, 0x0, 0x0, 0x1, 0x1, 0xF7, 0x0, 0x0, 0x0, 0x1, 0x2, 0x10, 0x0, 0x0, 0x0, 0x1, 0x2, 0x69, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x23, 0xFE, 0x41, 0x0, 0x1, 0x4, 0xAB, 0x0, 0x0, 0x0, 0x1, 0x1, 0x63, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3A, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x76, 0x0, 0x0, 0x0, 0x1, 0x2, 0x81, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x3D, 0xFE, 0x41, 0x0, 0x1, 0x1, 0x51, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x22, 0xFE, 0x41, 0x0, 0x1, 0x1, 0x17, 0xFE, 0x41, 0x0, 0x1, 0x3, 0x83, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x37, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x88, 0xFE, 0x41, 0x0, 0x1, 0x0, 0xFD, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x1C, 0xFE, 0x41, 0x0, 0x1, 0x1, 0x38, 0xFE, 0x41, 0x0, 0x1, 0x1, 0xFD, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x5, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x7, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x30, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x33, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x18, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x4D, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x34, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x24, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x11, 0xFE, 0x41, 0x0, 0x1, 0x1, 0x9, 0xFE, 0x41, 0x0, 0x1, 0x1, 0xFE, 0xFE, 0x41, 0x0, 0x1, 0x0, 0xEC, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x3B, 0xFE, 0x41, 0x0, 0x1, 0x2, 0x46, 0xFD, 0xDD, 0x0, 0x1, 0x1, 0x7F, 0x0, 0x7, 0x0, 0x1, 0x1, 0x7C, 0x0, 0xA, 0x0, 0x1, 0x1, 0x73, 0x0, 0x7, 0x0, 0x1, 0x1, 0x69, 0x0, 0xA, 0x0, 0x1, 0x3, 0x49, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3B, 0x0, 0xA, 0x0, 0x1, 0x2, 0x5C, 0xFF, 0xF6, 0x0, 0x1, 0x1, 0xCF, 0x0, 0xA, 0x0, 0x1, 0x2, 0x5B, 0x0, 0xA, 0x0, 0x1, 0x2, 0xD7, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0x52, 0x0, 0x0, 0x0, 0x1, 0x2, 0x72, 0x0, 0xA, 0x0, 0x1, 0x2, 0xDA, 0x0, 0x7, 0x0, 0x1, 0x2, 0xCE, 0x0, 0x0, 0x0, 0x1, 0x2, 0xEF, 0x0, 0xA, 0x0, 0x1, 0x4, 0x58, 0x0, 0xA, 0x0, 0x1, 0x0, 0xBE, 0xFE, 0x35, 0x0, 0x1, 0x1, 0x7A, 0xFE, 0x35, 0x0, 0x1, 0x1, 0x6A, 0x0, 0xA, 0x0, 0x1, 0x2, 0x43, 0xFE, 0x35, 0x0, 0x1, 0x1, 0x6, 0xFE, 0x35, 0x0, 0x1, 0x1, 0x11, 0xFE, 0x35, 0x0, 0x1, 0x2, 0x32, 0x0, 0xA, 0x0, 0x1, 0x2, 0xC4, 0xFE, 0x19, 0x0, 0x1, 0x3, 0x37, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0x10, 0x0, 0x8, 0x0, 0x1, 0x1, 0xC6, 0x0, 0xA, 0x0, 0x1, 0x2, 0x7B, 0x0, 0xA, 0x0, 0x1, 0x2, 0xAA, 0xFF, 0xF9, 0x0, 0x1, 0x2, 0xD9, 0xFD, 0xF0, 0x0, 0x1, 0x1, 0x21, 0xFE, 0x59, 0x0, 0x1, 0x2, 0x0, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0x92, 0xFE, 0x43, 0x0, 0x1, 0x2, 0x22, 0xFE, 0x2D, 0x0, 0x1, 0x2, 0x63, 0xFE, 0x1, 0x0, 0x1, 0x1, 0x6, 0xFE, 0x1, 0x0, 0x1, 0x2, 0xD1, 0xFD, 0xFE, 0x0, 0x1, 0x2, 0x37, 0xFE, 0x1, 0x0, 0x1, 0x2, 0x64, 0xFE, 0x1, 0x0, 0x1, 0x1, 0x0, 0xFE, 0x1, 0x0, 0x1, 0x2, 0x7F, 0xFE, 0x3D, 0x0, 0x1, 0x2, 0x25, 0xFE, 0x33, 0x0, 0x1, 0x2, 0x7F, 0xFD, 0xF7, 0x0, 0x1, 0x2, 0x25, 0xFD, 0xED, 0x0, 0x1, 0x2, 0x6D, 0xFD, 0xFB, 0x0, 0x1, 0x1, 0xBE, 0xFD, 0xF7, 0x0, 0x1, 0x2, 0x6D, 0xFE, 0x41, 0x0, 0x1, 0x1, 0xBE, 0xFE, 0x3D, 0x0, 0x1, 0x2, 0x4C, 0xFE, 0x3C, 0x0, 0x1, 0x1, 0xCB, 0x0, 0xA, 0x0, 0x1, 0x2, 0x5F, 0xFF, 0xFF, 0x0, 0x1, 0x2, 0x5F, 0xFD, 0xF6, 0x0, 0x1, 0x0, 0xFF, 0xFE, 0x52, 0x0, 0x1, 0x2, 0x8, 0xFD, 0xFE, 0x0, 0x1, 0x2, 0x6, 0xFD, 0xFF, 0x0, 0x1, 0x2, 0x6, 0x0, 0x8, 0x0, 0x1, 0x2, 0x6E, 0xFD, 0xF8, 0x0, 0x1, 0x2, 0xE, 0xFD, 0xFF, 0x0, 0x1, 0x2, 0xE, 0x0, 0x8, 0x0, 0x1, 0x2, 0x31, 0xFE, 0x3D, 0x0, 0x1, 0x2, 0x1B, 0xFD, 0xFE, 0x0, 0x1, 0x2, 0x1B, 0xFE, 0x44, 0x0, 0x1, 0x2, 0x40, 0x0, 0x0, 0x0, 0x1, 0x2, 0x1E, 0xFF, 0xF9, 0x0, 0x1, 0x2, 0xB7, 0xFE, 0x94, 0x0, 0x1, 0x1, 0xE9, 0xFE, 0x99, 0x0, 0x1, 0x2, 0x74, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0x39, 0xFE, 0x91, 0x0, 0x1, 0x1, 0x21, 0xFE, 0x98, 0x0, 0x1, 0x2, 0xC7, 0xFE, 0x91, 0x0, 0x1, 0x2, 0x47, 0xFE, 0x8D, 0x0, 0x1, 0x2, 0xB0, 0x0, 0x0, 0x0, 0x1, 0x2, 0x44, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0xB0, 0xFE, 0x91, 0x0, 0x1, 0x2, 0x44, 0xFE, 0x87, 0x0, 0x1, 0x2, 0x9B, 0xFE, 0x91, 0x0, 0x1, 0x1, 0xEB, 0xFE, 0x91, 0x0, 0x1, 0x2, 0xC2, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0xC2, 0xFE, 0x87, 0x0, 0x1, 0x2, 0x37, 0xFE, 0x91, 0x0, 0x1, 0x2, 0x6F, 0xFE, 0xA1, 0x0, 0x1, 0x2, 0xF0, 0xFE, 0xA, 0x0, 0x1, 0x0, 0xF8, 0x0, 0xA, 0x0, 0x1, 0x2, 0x3E, 0x0, 0x0, 0x0, 0x1, 0x1, 0x21, 0x0, 0x7, 0x0, 0x1, 0x1, 0x6, 0x0, 0xA, 0x0, 0x1, 0x2, 0xB7, 0x0, 0x3, 0x0, 0x1, 0x2, 0x63, 0x0, 0xA, 0x0, 0x1, 0x2, 0x74, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0x74, 0xFE, 0x87, 0x0, 0x1, 0x2, 0x75, 0xFE, 0xBE, 0x0, 0x1, 0x2, 0xAA, 0xFE, 0x36, 0x0, 0x1, 0x2, 0x1E, 0xFE, 0x36, 0x0, 0x1, 0x2, 0x3D, 0x0, 0xA, 0x0, 0x1, 0x2, 0x5D, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3D, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0x5D, 0xFE, 0x91, 0x0, 0x1, 0x2, 0x3E, 0xFE, 0xD2, 0x0, 0x1, 0x2, 0x5E, 0xFE, 0xC8, 0x0, 0x1, 0x2, 0x3D, 0xFE, 0x1, 0x0, 0x1, 0x2, 0x5D, 0xFD, 0xF7, 0x0, 0x1, 0x2, 0x3D, 0xFE, 0x7E, 0x0, 0x1, 0x2, 0x5D, 0xFE, 0x74, 0x0, 0x1, 0x2, 0x74, 0x0, 0xA, 0x0, 0x1, 0x2, 0x39, 0x0, 0x0, 0x0, 0x1, 0x2, 0x74, 0xFE, 0x7E, 0x0, 0x1, 0x2, 0x39, 0xFE, 0x74, 0x0, 0x1, 0x2, 0x74, 0xFE, 0x63, 0x0, 0x1, 0x2, 0x39, 0xFE, 0x59, 0x0, 0x1, 0x2, 0x74, 0xFE, 0x47, 0x0, 0x1, 0x2, 0x39, 0xFE, 0x3D, 0x0, 0x1, 0x1, 0x4A, 0x0, 0xA, 0x0, 0x1, 0x2, 0xD9, 0xFF, 0xF9, 0x0, 0x1, 0x2, 0x2A, 0xFE, 0x41, 0x0, 0x1, 0x2, 0xCF, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0x4B, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0xCF, 0x0, 0xA, 0x0, 0x1, 0x2, 0x4B, 0x0, 0xA, 0x0, 0x1, 0x2, 0xCF, 0xFE, 0x94, 0x0, 0x1, 0x2, 0x4B, 0xFE, 0x94, 0x0, 0x1, 0x2, 0x92, 0x0, 0x4C, 0x0, 0x1, 0x2, 0x22, 0x0, 0x36, 0x0, 0x1, 0x2, 0x92, 0xFE, 0xDD, 0x0, 0x1, 0x2, 0x22, 0xFE, 0xC7, 0x0, 0x1, 0x2, 0x93, 0xFF, 0x14, 0x0, 0x1, 0x2, 0x23, 0xFE, 0xFE, 0x0, 0x1, 0x2, 0x63, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0x64, 0xFE, 0xD2, 0x0, 0x1, 0x1, 0x7, 0xFE, 0xD2, 0x0, 0x1, 0x2, 0x63, 0xFE, 0x7E, 0x0, 0x1, 0x1, 0x6, 0xFE, 0x7E, 0x0, 0x1, 0x3, 0x7F, 0x0, 0xA, 0x0, 0x1, 0x3, 0x83, 0x0, 0xA, 0x0, 0x1, 0x3, 0x7F, 0xFE, 0x9B, 0x0, 0x1, 0x3, 0x83, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0xD1, 0x0, 0x7, 0x0, 0x1, 0x2, 0x37, 0x0, 0xA, 0x0, 0x1, 0x2, 0xD1, 0xFE, 0x98, 0x0, 0x1, 0x2, 0x37, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0xD2, 0xFE, 0xCF, 0x0, 0x1, 0x2, 0x38, 0xFE, 0xD2, 0x0, 0x1, 0x2, 0xD1, 0xFE, 0x7B, 0x0, 0x1, 0x2, 0x37, 0xFE, 0x7E, 0x0, 0x1, 0x2, 0xC7, 0x0, 0x0, 0x0, 0x1, 0x2, 0x47, 0xFF, 0xFC, 0x0, 0x1, 0x2, 0x12, 0x0, 0xA, 0x0, 0x1, 0x0, 0xF4, 0xFE, 0x69, 0x0, 0x1, 0x2, 0x64, 0x0, 0xA, 0x0, 0x1, 0x1, 0x0, 0x0, 0xA, 0x0, 0x1, 0x2, 0x64, 0xFE, 0x9B, 0x0, 0x1, 0x1, 0x0, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0x65, 0xFE, 0xD2, 0x0, 0x1, 0x1, 0x1, 0xFE, 0xD2, 0x0, 0x1, 0x2, 0x7F, 0x0, 0x0, 0x0, 0x1, 0x2, 0x25, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0x7F, 0xFE, 0x91, 0x0, 0x1, 0x2, 0x25, 0xFE, 0x87, 0x0, 0x1, 0x2, 0x6D, 0x0, 0x4, 0x0, 0x1, 0x2, 0x6D, 0xFE, 0x95, 0x0, 0x1, 0x1, 0xBE, 0xFE, 0x91, 0x0, 0x1, 0x2, 0x6E, 0xFE, 0xCC, 0x0, 0x1, 0x1, 0xBF, 0xFE, 0xC8, 0x0, 0x1, 0x2, 0x6D, 0xFE, 0x78, 0x0, 0x1, 0x1, 0xBE, 0xFE, 0x74, 0x0, 0x1, 0x2, 0x9B, 0xFE, 0x98, 0x0, 0x1, 0x2, 0x37, 0xFE, 0x98, 0x0, 0x1, 0x2, 0x9B, 0xFE, 0x59, 0x0, 0x1, 0x2, 0x37, 0xFE, 0x59, 0x0, 0x1, 0x2, 0x9B, 0xFE, 0x74, 0x0, 0x1, 0x1, 0xEB, 0xFE, 0x74, 0x0, 0x1, 0x2, 0x9B, 0x0, 0x0, 0x0, 0x1, 0x2, 0x37, 0x0, 0x0, 0x0, 0x1, 0x2, 0x99, 0x0, 0xA, 0x0, 0x1, 0x2, 0x1, 0x0, 0xA, 0x0, 0x1, 0x2, 0x99, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0x1, 0xFE, 0x9B, 0x0, 0x1, 0x3, 0x8F, 0x0, 0xA, 0x0, 0x1, 0x3, 0x8F, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0xF8, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0x88, 0x0, 0xD, 0x0, 0x1, 0x2, 0x5, 0x0, 0xA, 0x0, 0x1, 0x2, 0x6F, 0x0, 0x10, 0x0, 0x1, 0x2, 0x6A, 0x0, 0xA, 0x0, 0x1, 0x2, 0xD, 0x0, 0xA, 0x0, 0x1, 0x2, 0x6A, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0xD, 0xFE, 0x9B, 0x0, 0x1, 0x2, 0x6B, 0xFE, 0xD2, 0x0, 0x1, 0x2, 0xE, 0xFE, 0xD2, 0x0, 0x1, 0x2, 0x4C, 0xFE, 0xD2, 0x0, 0x1, 0x1, 0xBE, 0x0, 0x0, 0x0, 0x1, 0x2, 0xF8, 0x0, 0xA, 0x0, 0x1, 0x2, 0xF0, 0xFF, 0x79, 0x0, 0x1, 0x1, 0xE9, 0x0, 0x8, 0x0, 0x1, 0x2, 0x76, 0x0, 0xA, 0x0, 0x1, 0x2, 0x1C, 0x0, 0xA, 0x0, 0x1, 0x2, 0x6E, 0x0, 0x1, 0x0, 0x1, 0x2, 0x31, 0x0, 0x0, 0x0, 0x1, 0x0, 0xFF, 0x0, 0x1, 0x0, 0x1, 0x2, 0x8, 0x0, 0x7, 0x0, 0x1, 0x2, 0x58, 0x0, 0x0, 0x0, 0x1, 0x2, 0x13, 0x0, 0xA, 0x0, 0x1, 0x2, 0x22, 0x0, 0x8, 0x0, 0x1, 0x2, 0xFE, 0x0, 0xA, 0x0, 0x1, 0x1, 0xE6, 0x0, 0xA, 0x0, 0x1, 0x2, 0x1B, 0x0, 0x7, 0x0, 0x1, 0x2, 0x26, 0x0, 0x8, 0x0, 0x1, 0x2, 0x6, 0xFF, 0xF6, 0x0, 0x1, 0x2, 0x65, 0x0, 0xA, 0x0, 0x1, 0x2, 0x4C, 0xFF, 0xFF, 0x0, 0x1, 0x3, 0xBA, 0xFF, 0xF6, 0x0, 0x1, 0x1, 0xD0, 0xFF, 0xF6, 0x0, 0x1, 0x3, 0x6E, 0x0, 0x0, 0x0, 0x1, 0x2, 0x6E, 0x0, 0x0, 0x0, 0x1, 0x2, 0x31, 0xFD, 0xF7, 0x0, 0x1, 0x3, 0x3, 0x0, 0xA, 0x0, 0x1, 0x2, 0x1E, 0x0, 0x15, 0x0, 0x1, 0x2, 0xB7, 0xFE, 0x55, 0x0, 0x1, 0x1, 0xE9, 0xFE, 0x5A, 0x0, 0x1, 0x2, 0x74, 0xFE, 0x5C, 0x0, 0x1, 0x2, 0x39, 0xFE, 0x52, 0x0, 0x1, 0x2, 0xC7, 0xFE, 0x52, 0x0, 0x1, 0x2, 0x47, 0xFE, 0x4E, 0x0, 0x1, 0x2, 0x58, 0xFE, 0x52, 0x0, 0x1, 0x2, 0x22, 0xFE, 0x5A, 0x0, 0x1, 0x2, 0x6E, 0xFE, 0x52, 0x0, 0x1, 0x2, 0xDA, 0xFD, 0xFE, 0x0, 0x1, 0x1, 0x6, 0xFE, 0x63, 0x0, 0x1, 0x1, 0x6, 0xFE, 0x9B, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0xC, 0x0, 0x18, 0x0, 0x1, 0x2, 0x56, 0x2, 0x80, 0x0, 0x1, 0x0, 0x4, 0x2, 0xE, 0x2, 0xF, 0x2, 0x11, 0x2, 0x12, 0x0, 0x2, 0x0, 0x5F, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x46, 0x0, 0x5F, 0x0, 0x1A, 0x0, 0x82, 0x0, 0x82, 0x0, 0x34, 0x0, 0x84, 0x0, 0x84, 0x0, 0x35, 0x0, 0x87, 0x0, 0x87, 0x0, 0x36, 0x0, 0x8A, 0x0, 0x8A, 0x0, 0x37, 0x0, 0x8C, 0x0, 0x8C, 0x0, 0x38, 0x0, 0x94, 0x0, 0x95, 0x0, 0x39, 0x2, 0xD2, 0x2, 0xD2, 0x0, 0x3B, 0x2, 0xDA, 0x2, 0xDB, 0x0, 0x3C, 0x2, 0xEB, 0x2, 0xEB, 0x0, 0x3E, 0x2, 0xED, 0x2, 0xED, 0x0, 0x3F, 0x2, 0xF4, 0x2, 0xF5, 0x0, 0x40, 0x3, 0x17, 0x3, 0x17, 0x0, 0x42, 0x4, 0x2B, 0x4, 0x2D, 0x0, 0x43, 0x5, 0x5D, 0x5, 0x5E, 0x0, 0x46, 0x6, 0xC7, 0x6, 0xC8, 0x0, 0x48, 0x7, 0x4E, 0x7, 0x62, 0x0, 0x4A, 0x7, 0xA6, 0x7, 0xA6, 0x0, 0x5F, 0x7, 0xAE, 0x7, 0xB1, 0x0, 0x60, 0x7, 0xDE, 0x7, 0xE2, 0x0, 0x64, 0x8, 0xAD, 0x8, 0xAD, 0x0, 0x69, 0x8, 0xB3, 0x8, 0xB3, 0x0, 0x6A, 0x8, 0xB5, 0x8, 0xB8, 0x0, 0x6B, 0x8, 0xC8, 0x8, 0xF3, 0x0, 0x6F, 0x8, 0xF8, 0x9, 0x28, 0x0, 0x9B, 0x9, 0x2A, 0x9, 0x2A, 0x0, 0xCC, 0x9, 0x2C, 0x9, 0x2C, 0x0, 0xCD, 0x9, 0x2E, 0x9, 0x30, 0x0, 0xCE, 0x9, 0x33, 0x9, 0x33, 0x0, 0xD1, 0x9, 0x35, 0x9, 0xDA, 0x0, 0xD2, 0x9, 0xDD, 0x9, 0xEC, 0x1, 0x78, 0x9, 0xF3, 0x9, 0xF3, 0x1, 0x88, 0x9, 0xF5, 0x9, 0xF5, 0x1, 0x89, 0x9, 0xF9, 0x9, 0xF9, 0x1, 0x8A, 0x9, 0xFC, 0x9, 0xFC, 0x1, 0x8B, 0x9, 0xFE, 0xA, 0x1, 0x1, 0x8C, 0xA, 0x3, 0xA, 0x3, 0x1, 0x90, 0xA, 0x5, 0xA, 0x6, 0x1, 0x91, 0xA, 0x8, 0xA, 0x8, 0x1, 0x93, 0xA, 0xA, 0xA, 0xC, 0x1, 0x94, 0xA, 0xE, 0xA, 0x13, 0x1, 0x97, 0xA, 0x15, 0xA, 0x1A, 0x1, 0x9D, 0xA, 0x1C, 0xA, 0x1D, 0x1, 0xA3, 0xA, 0x1F, 0xA, 0x1F, 0x1, 0xA5, 0xA, 0x21, 0xA, 0x29, 0x1, 0xA6, 0xA, 0x2F, 0xA, 0x33, 0x1, 0xAF, 0xA, 0x35, 0xA, 0x35, 0x1, 0xB4, 0xA, 0x3F, 0xA, 0x41, 0x1, 0xB5, 0xA, 0x43, 0xA, 0x43, 0x1, 0xB8, 0xA, 0x46, 0xA, 0x4E, 0x1, 0xB9, 0xA, 0x5A, 0xA, 0x5B, 0x1, 0xC2, 0xA, 0x64, 0xA, 0x64, 0x1, 0xC4, 0xA, 0x66, 0xA, 0x66, 0x1, 0xC5, 0xA, 0x68, 0xA, 0x68, 0x1, 0xC6, 0xA, 0x6D, 0xA, 0x96, 0x1, 0xC7, 0xA, 0x98, 0xA, 0xA7, 0x1, 0xF1, 0xA, 0xB2, 0xA, 0xB5, 0x2, 0x1, 0xA, 0xC0, 0xA, 0xC7, 0x2, 0x5, 0xA, 0xCF, 0xA, 0xCF, 0x2, 0xD, 0xA, 0xD6, 0xA, 0xD6, 0x2, 0xE, 0xA, 0xD8, 0xA, 0xD9, 0x2, 0xF, 0xA, 0xDB, 0xA, 0xDB, 0x2, 0x11, 0xA, 0xEE, 0xA, 0xF0, 0x2, 0x12, 0xA, 0xF2, 0xA, 0xFD, 0x2, 0x15, 0xA, 0xFF, 0xB, 0xC, 0x2, 0x21, 0xB, 0x10, 0xB, 0x1C, 0x2, 0x2F, 0xB, 0x1E, 0xB, 0x1E, 0x2, 0x3C, 0xB, 0x20, 0xB, 0x3B, 0x2, 0x3D, 0xB, 0x3F, 0xB, 0x3F, 0x2, 0x59, 0xB, 0x42, 0xB, 0x43, 0x2, 0x5A, 0xB, 0x47, 0xB, 0xD7, 0x2, 0x5C, 0xB, 0xE0, 0xB, 0xE7, 0x2, 0xED, 0xB, 0xEE, 0xB, 0xF3, 0x2, 0xF5, 0xB, 0xFC, 0xC, 0x3, 0x2, 0xFB, 0xC, 0xC, 0xC, 0x1F, 0x3, 0x3, 0xC, 0x28, 0xC, 0x2B, 0x3, 0x17, 0xC, 0x44, 0xC, 0x45, 0x3, 0x1B, 0xC, 0x52, 0xC, 0x59, 0x3, 0x1D, 0xC, 0x62, 0xC, 0x69, 0x3, 0x25, 0xC, 0x81, 0xC, 0x85, 0x3, 0x2D, 0xC, 0x8B, 0xC, 0x8F, 0x3, 0x32, 0xC, 0x96, 0xC, 0x99, 0x3, 0x37, 0xC, 0xA2, 0xC, 0xA6, 0x3, 0x3B, 0xC, 0xAC, 0xC, 0xAD, 0x3, 0x40, 0xC, 0xB7, 0xC, 0xBC, 0x3, 0x42, 0xC, 0xBE, 0xC, 0xCE, 0x3, 0x48, 0xC, 0xD0, 0xC, 0xD4, 0x3, 0x59, 0xC, 0xD6, 0xC, 0xD7, 0x3, 0x5E, 0xC, 0xD9, 0xC, 0xD9, 0x3, 0x60, 0xC, 0xDB, 0xC, 0xDD, 0x3, 0x61, 0xC, 0xDF, 0xC, 0xE2, 0x3, 0x64, 0xC, 0xE4, 0xC, 0xE6, 0x3, 0x68, 0xC, 0xEB, 0xC, 0xEB, 0x3, 0x6B, 0xC, 0xEE, 0xD, 0x1C, 0x3, 0x6C, 0x0, 0x4, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x1E, 0x0, 0x0, 0x0, 0x24, 0x0, 0x1, 0x0, 0x0, 0x4, 0x7E, 0x0, 0x1, 0x0, 0x0, 0x4, 0xE6, 0x0, 0x1, 0x0, 0x0, 0x4, 0xF6, 0x0, 0x1, 0x0, 0x0, 0x4, 0x9C, 0x3, 0x9B, 0x2C, 0x1A, 0x7, 0xC8, 0x7, 0xCE, 0x7, 0xDA, 0x8, 0xD6, 0x7, 0xE6, 0x7, 0xF2, 0x9, 0x0, 0x8, 0x52, 0x8, 0x40, 0x7, 0xFE, 0x2A, 0xA0, 0x2A, 0xAC, 0x2A, 0xB8, 0x2C, 0x32, 0x8, 0x58, 0x2C, 0x32, 0x2A, 0xCA, 0x2A, 0xD6, 0x2A, 0xE2, 0x2A, 0xE8, 0x8, 0x28, 0x2B, 0x0, 0x8, 0x34, 0x2B, 0x6C, 0x2B, 0x12, 0x2A, 0xA0, 0x8, 0x16, 0x7, 0xD4, 0x7, 0xE0, 0x8, 0xDC, 0x7, 0xEC, 0x7, 0xF8, 0x8, 0x40, 0x29, 0xD4, 0x2A, 0x4C, 0x8, 0x4, 0x29, 0xD4, 0x8, 0xA, 0x8, 0x10, 0x8, 0xE2, 0x8, 0x16, 0x7, 0xC2, 0x25, 0x66, 0x8, 0x1C, 0x25, 0x84, 0x8, 0x22, 0x8, 0x2E, 0x8, 0x46, 0x8, 0x3A, 0x8, 0x4C, 0x8, 0x3A, 0x7, 0xB6, 0x7, 0x8C, 0x7, 0xBC, 0x7, 0xF8, 0x7, 0xE0, 0x24, 0x52, 0x7, 0x38, 0x9, 0x0, 0x8, 0x34, 0x8, 0x3A, 0x9, 0x0, 0x2A, 0xAC, 0x8, 0x34, 0x8, 0x3A, 0x8, 0x40, 0x7, 0x3E, 0x28, 0x7E, 0x7, 0x44, 0x9, 0x0, 0x8, 0x40, 0x2A, 0xB8, 0x8, 0x10, 0x8, 0x7C, 0x8, 0xD0, 0x8, 0xAC, 0x8, 0xCA, 0x7, 0x4A, 0x7, 0xAA, 0x8, 0xA6, 0x8, 0xC4, 0x7, 0xA4, 0x8, 0xF4, 0x8, 0xA0, 0x8, 0xF4, 0x8, 0x82, 0x8, 0x9A, 0x7, 0x9E, 0x8, 0x8E, 0x8, 0xBE, 0x8, 0x88, 0x8, 0xB2, 0x7, 0x98, 0x26, 0x26, 0x8, 0xEE, 0x7, 0x92, 0x8, 0xB8, 0x8, 0x94, 0x8, 0xE8, 0x9, 0x0, 0x9, 0x0, 0x26, 0x1A, 0x8, 0xFA, 0x7, 0x50, 0x7, 0xE0, 0x7, 0x56, 0x7, 0x5C, 0x8, 0xF4, 0x7, 0x62, 0x8, 0x82, 0x7, 0x68, 0x7, 0x68, 0x7, 0x6E, 0x2A, 0xE2, 0x25, 0x84, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x7, 0xCE, 0x8, 0xD6, 0x8, 0xD6, 0x8, 0xD6, 0x8, 0xD6, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x2A, 0xB8, 0x2C, 0x32, 0x2C, 0x32, 0x2C, 0x32, 0x2C, 0x32, 0x2C, 0x32, 0x2A, 0xE8, 0x2A, 0xE8, 0x2A, 0xE8, 0x2A, 0xE8, 0x2B, 0x6C, 0x2A, 0xA0, 0x2A, 0xA0, 0x2A, 0xA0, 0x2A, 0xA0, 0x2A, 0xA0, 0x2A, 0xA0, 0x2A, 0xA0, 0x7, 0xD4, 0x8, 0xDC, 0x8, 0xDC, 0x8, 0xDC, 0x8, 0xDC, 0x8, 0x10, 0x8, 0xE2, 0x8, 0xE2, 0x8, 0xE2, 0x8, 0xE2, 0x8, 0xE2, 0x8, 0x22, 0x8, 0x22, 0x8, 0x22, 0x8, 0x22, 0x8, 0x4C, 0x8, 0x4C, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x7, 0xCE, 0x7, 0xD4, 0x7, 0xCE, 0x7, 0xD4, 0x7, 0xCE, 0x7, 0xD4, 0x7, 0xCE, 0x7, 0xD4, 0x7, 0xDA, 0x7, 0x74, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x7, 0xF2, 0x7, 0xF8, 0x7, 0xF2, 0x7, 0xF8, 0x7, 0xF2, 0x7, 0xF8, 0x7, 0xF2, 0x7, 0xF8, 0x9, 0x0, 0x8, 0x40, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x29, 0xD4, 0x8, 0x52, 0x8, 0x40, 0x7, 0xFE, 0x8, 0x4, 0x2A, 0xA0, 0x29, 0xD4, 0x2A, 0xA0, 0x29, 0xD4, 0x2A, 0xA0, 0x7, 0x7A, 0x2A, 0xA0, 0x7, 0x80, 0x2A, 0xB8, 0x8, 0x10, 0x2A, 0xB8, 0x8, 0x10, 0x2A, 0xB8, 0x8, 0x10, 0x8, 0x10, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2A, 0xCA, 0x25, 0x66, 0x2A, 0xCA, 0x25, 0x66, 0x2A, 0xCA, 0x25, 0x66, 0x2A, 0xD6, 0x8, 0x1C, 0x2A, 0xD6, 0x8, 0x1C, 0x2A, 0xD6, 0x8, 0x1C, 0x2A, 0xD6, 0x8, 0x1C, 0x2A, 0xD6, 0x8, 0x1C, 0x2A, 0xE2, 0x25, 0x84, 0x2A, 0xE2, 0x25, 0x84, 0x2A, 0xE2, 0x7, 0x86, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2B, 0x0, 0x8, 0x46, 0x2B, 0x6C, 0x8, 0x4C, 0x2B, 0x6C, 0x2B, 0x12, 0x8, 0x3A, 0x2B, 0x12, 0x8, 0x3A, 0x2B, 0x12, 0x8, 0x3A, 0x7, 0xB6, 0x7, 0xBC, 0x7, 0x8C, 0x7, 0xF8, 0x7, 0x92, 0x7, 0x92, 0x8, 0xA6, 0x8, 0xE8, 0x8, 0xE8, 0x8, 0xE8, 0x8, 0xE8, 0x8, 0xE8, 0x8, 0xE8, 0x8, 0xE8, 0x8, 0xB8, 0x8, 0xEE, 0x8, 0xEE, 0x8, 0xEE, 0x8, 0xEE, 0x8, 0x88, 0x8, 0x88, 0x8, 0x88, 0x8, 0x88, 0x8, 0x82, 0x8, 0xF4, 0x8, 0xF4, 0x8, 0xF4, 0x8, 0xF4, 0x8, 0xF4, 0x7, 0xAA, 0x7, 0xAA, 0x7, 0xAA, 0x7, 0xAA, 0x8, 0xD0, 0x8, 0xE8, 0x8, 0xE8, 0x8, 0xE8, 0x8, 0xB8, 0x8, 0xB8, 0x8, 0xB8, 0x8, 0xB8, 0x7, 0x92, 0x8, 0xEE, 0x8, 0xEE, 0x8, 0xEE, 0x8, 0xEE, 0x8, 0xEE, 0x7, 0x98, 0x7, 0x98, 0x7, 0x98, 0x7, 0x98, 0x8, 0xB2, 0x8, 0x88, 0x8, 0x88, 0x8, 0x88, 0x8, 0x88, 0x8, 0x88, 0x8, 0xBE, 0x8, 0x8E, 0x7, 0x9E, 0x7, 0x9E, 0x7, 0x9E, 0x7, 0x9E, 0x8, 0x82, 0x8, 0x82, 0x8, 0x82, 0x8, 0xF4, 0x8, 0xF4, 0x8, 0xF4, 0x8, 0xF4, 0x7, 0xA4, 0x7, 0xA4, 0x7, 0xA4, 0x8, 0xC4, 0x8, 0xC4, 0x8, 0xC4, 0x8, 0xC4, 0x8, 0xA6, 0x8, 0xA6, 0x8, 0xA6, 0x7, 0xAA, 0x7, 0xAA, 0x7, 0xAA, 0x7, 0xAA, 0x7, 0xAA, 0x7, 0xAA, 0x8, 0xCA, 0x8, 0xD0, 0x8, 0xD0, 0x8, 0x7C, 0x8, 0x7C, 0x8, 0x7C, 0x2C, 0x1A, 0x8, 0xD6, 0x9, 0x0, 0x8, 0x52, 0x2B, 0x7E, 0x29, 0x62, 0x2C, 0x1A, 0x7, 0xC8, 0x8, 0xD6, 0x2B, 0x12, 0x9, 0x0, 0x8, 0x52, 0x7, 0xFE, 0x2A, 0xAC, 0x2A, 0xB8, 0x2C, 0x32, 0x8, 0x58, 0x2A, 0xE2, 0x2B, 0x6C, 0x8, 0x34, 0x8, 0x52, 0x2B, 0x6C, 0x8, 0xE2, 0x8, 0x2E, 0x8, 0xE2, 0x8, 0xD6, 0x2A, 0xD6, 0x8, 0x52, 0x8, 0x52, 0x8, 0x40, 0x7, 0xFE, 0x2C, 0x1A, 0x7, 0xC8, 0x8, 0xD6, 0x2A, 0xAC, 0x9, 0x0, 0x2C, 0x32, 0x8, 0x58, 0x7, 0xCE, 0x2A, 0xE2, 0x8, 0x34, 0x2A, 0xA0, 0x8, 0xDC, 0x8, 0xE2, 0x8, 0x16, 0x7, 0xD4, 0x8, 0x4C, 0x8, 0x3A, 0x8, 0xDC, 0x8, 0x1C, 0x29, 0xD4, 0x2A, 0x4C, 0x8, 0x4C, 0x2B, 0x0, 0x8, 0x46, 0x2B, 0x0, 0x8, 0x46, 0x2B, 0x0, 0x8, 0x46, 0x2B, 0x6C, 0x8, 0x4C, 0x2A, 0xAC, 0x8, 0xA, 0x2C, 0x1A, 0x2A, 0xA0, 0x8, 0xD6, 0x8, 0xDC, 0x7, 0xCE, 0x7, 0xD4, 0x2B, 0x6C, 0x8, 0x52, 0x8, 0x52, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x7, 0xB6, 0x7, 0xBC, 0x8, 0xD6, 0x8, 0xDC, 0x2C, 0x32, 0x8, 0xE2, 0x8, 0x4C, 0x8, 0x4C, 0x8, 0x4C, 0x7, 0xE0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0x52, 0x8, 0x52, 0x29, 0xD4, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2B, 0x6C, 0x8, 0x4C, 0x2B, 0x6C, 0x8, 0x4C, 0x2B, 0x6C, 0x8, 0x4C, 0x7, 0xB0, 0x2A, 0xE2, 0x8, 0x40, 0x2B, 0x6C, 0x8, 0x34, 0x8, 0x3A, 0x7, 0xE6, 0x2C, 0x1A, 0x2A, 0xA0, 0x8, 0x52, 0x2C, 0x32, 0x8, 0xE2, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x7, 0xB6, 0x7, 0xBC, 0x7, 0xF2, 0x7, 0xF8, 0x7, 0xFE, 0x8, 0x4, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x7, 0xF2, 0x7, 0xF8, 0x2A, 0xB8, 0x8, 0x10, 0x2C, 0x1A, 0x2A, 0xA0, 0x2C, 0x1A, 0x2A, 0xA0, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0x52, 0x8, 0x52, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2A, 0xCA, 0x25, 0x66, 0x2A, 0xCA, 0x25, 0x66, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x9, 0x0, 0x8, 0x40, 0x2C, 0x1A, 0x2A, 0xA0, 0x8, 0xD6, 0x8, 0xDC, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2B, 0x6C, 0x8, 0x4C, 0x8, 0x40, 0x7, 0xD4, 0x2A, 0x4C, 0x7, 0xCE, 0x2A, 0xAC, 0x2C, 0x32, 0x7, 0xC2, 0x2B, 0x0, 0x8, 0x46, 0x7, 0xC8, 0x8, 0x16, 0x7, 0xC8, 0x8, 0x16, 0x7, 0xC8, 0x8, 0x16, 0x7, 0xCE, 0x7, 0xD4, 0x7, 0xDA, 0x7, 0xE0, 0x7, 0xDA, 0x7, 0xE0, 0x7, 0xDA, 0x7, 0xE0, 0x7, 0xDA, 0x7, 0xE0, 0x7, 0xDA, 0x7, 0xE0, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x8, 0xD6, 0x8, 0xDC, 0x7, 0xE6, 0x7, 0xEC, 0x7, 0xF2, 0x7, 0xF8, 0x9, 0x0, 0x8, 0x40, 0x9, 0x0, 0x8, 0x40, 0x9, 0x0, 0x8, 0x40, 0x9, 0x0, 0x8, 0x40, 0x7, 0xFE, 0x8, 0x4, 0x7, 0xFE, 0x8, 0x4, 0x7, 0xFE, 0x8, 0x4, 0x2A, 0xA0, 0x29, 0xD4, 0x2A, 0xA0, 0x29, 0xD4, 0x2A, 0xA0, 0x29, 0xD4, 0x2A, 0xA0, 0x29, 0xD4, 0x2A, 0xAC, 0x8, 0xA, 0x2A, 0xAC, 0x8, 0xA, 0x2A, 0xB8, 0x8, 0x10, 0x2A, 0xB8, 0x8, 0x10, 0x2A, 0xB8, 0x8, 0x10, 0x2A, 0xB8, 0x8, 0x10, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x2C, 0x32, 0x8, 0xE2, 0x8, 0x58, 0x8, 0x16, 0x8, 0x58, 0x8, 0x16, 0x2A, 0xCA, 0x25, 0x66, 0x2A, 0xCA, 0x25, 0x66, 0x2A, 0xCA, 0x25, 0x66, 0x2A, 0xCA, 0x25, 0x66, 0x2A, 0xD6, 0x8, 0x1C, 0x2A, 0xD6, 0x8, 0x1C, 0x2A, 0xD6, 0x8, 0x1C, 0x2A, 0xD6, 0x8, 0x1C, 0x2A, 0xD6, 0x8, 0x1C, 0x2A, 0xE2, 0x25, 0x84, 0x2A, 0xE2, 0x25, 0x84, 0x2A, 0xE2, 0x25, 0x84, 0x2A, 0xE2, 0x25, 0x84, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x2A, 0xE8, 0x8, 0x22, 0x8, 0x28, 0x8, 0x2E, 0x8, 0x28, 0x8, 0x2E, 0x2B, 0x0, 0x8, 0x46, 0x2B, 0x0, 0x8, 0x46, 0x8, 0x34, 0x8, 0x3A, 0x8, 0x34, 0x8, 0x3A, 0x2B, 0x6C, 0x8, 0x4C, 0x2B, 0x12, 0x8, 0x3A, 0x2B, 0x12, 0x8, 0x3A, 0x2B, 0x12, 0x8, 0x3A, 0x8, 0x40, 0x25, 0x84, 0x8, 0x46, 0x8, 0x4C, 0x2A, 0xA0, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x8, 0xD6, 0x8, 0xD6, 0x8, 0xD6, 0x8, 0xD6, 0x8, 0xD6, 0x8, 0xD6, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x8, 0xE2, 0x8, 0xE2, 0x8, 0xE2, 0x8, 0xE2, 0x8, 0xE2, 0x8, 0xE2, 0x2B, 0x7E, 0x2B, 0x7E, 0x2B, 0x36, 0x2B, 0x36, 0x2B, 0x36, 0x2B, 0x36, 0x2B, 0x6C, 0x2B, 0x6C, 0x2B, 0x6C, 0x2B, 0x6C, 0x8, 0xE2, 0x8, 0xE2, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x2C, 0x1A, 0x8, 0xD6, 0x8, 0xD6, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x8, 0x52, 0x2B, 0x6C, 0x2B, 0x6C, 0x2B, 0x6C, 0x2B, 0x6C, 0x8, 0x58, 0x2B, 0x7E, 0x2B, 0x7E, 0x8, 0xE8, 0x8, 0x5E, 0x8, 0x64, 0x8, 0x6A, 0x8, 0x70, 0x8, 0x76, 0x8, 0xE8, 0x8, 0x94, 0x8, 0xEE, 0x8, 0x7C, 0x8, 0xB2, 0x8, 0x88, 0x8, 0x8E, 0x8, 0x9A, 0x8, 0x82, 0x8, 0xF4, 0x8, 0xA0, 0x8, 0xA6, 0x8, 0xD0, 0x8, 0xAC, 0x8, 0x88, 0x8, 0xD0, 0x8, 0xEE, 0x8, 0xC4, 0x8, 0x88, 0x8, 0x88, 0x8, 0xBE, 0x8, 0x8E, 0x8, 0xE8, 0x8, 0x94, 0x8, 0xEE, 0x8, 0x9A, 0x8, 0xB2, 0x8, 0xF4, 0x8, 0xA0, 0x8, 0xB8, 0x8, 0xA6, 0x8, 0xAC, 0x8, 0xB2, 0x8, 0xB8, 0x8, 0xD0, 0x8, 0xBE, 0x8, 0xF4, 0x8, 0xC4, 0x8, 0xCA, 0x8, 0xCA, 0x8, 0xCA, 0x8, 0xD0, 0x2C, 0x1A, 0x2A, 0xA0, 0x8, 0xD6, 0x8, 0xDC, 0x2C, 0x32, 0x8, 0xE2, 0x8, 0xE8, 0x8, 0xEE, 0x8, 0xF4, 0x26, 0x1A, 0x26, 0x1A, 0x26, 0x1A, 0x26, 0x1A, 0x26, 0x1A, 0x26, 0x1A, 0x26, 0x1A, 0x26, 0x1A, 0x26, 0x1A, 0x26, 0x1A, 0x8, 0xFA, 0x8, 0xFA, 0x8, 0xFA, 0x8, 0xFA, 0x8, 0xFA, 0x8, 0xFA, 0x8, 0xFA, 0x8, 0xFA, 0x8, 0xFA, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x0, 0x1, 0x7, 0x3B, 0x6, 0x40, 0x0, 0x1, 0x2, 0xA0, 0x6, 0x40, 0x0, 0x1, 0x2, 0x94, 0x6, 0x40, 0x0, 0x1, 0x4, 0x7C, 0x6, 0x40, 0x0, 0x1, 0x8, 0xAC, 0x6, 0x40, 0x0, 0x1, 0x3, 0xC4, 0x6, 0x40, 0x0, 0x1, 0x4, 0x9, 0x6, 0x40, 0x0, 0x1, 0x4, 0xF4, 0x6, 0x40, 0x0, 0x1, 0x5, 0x58, 0x6, 0x40, 0x0, 0x1, 0x4, 0x8F, 0x6, 0x40, 0x0, 0x1, 0x5, 0x1B, 0x6, 0x40, 0x0, 0x1, 0x2, 0xA2, 0x6, 0x40, 0x0, 0x1, 0x2, 0xE8, 0x6, 0x40, 0x0, 0x1, 0x2, 0xD2, 0x6, 0x40, 0x0, 0x1, 0x5, 0x85, 0x6, 0x40, 0x0, 0x1, 0x4, 0x7B, 0x6, 0x40, 0x0, 0x1, 0x4, 0xA7, 0x6, 0x40, 0x0, 0x1, 0x3, 0xBA, 0x6, 0x40, 0x0, 0x1, 0x4, 0x5D, 0x6, 0x40, 0x0, 0x1, 0x4, 0x84, 0x6, 0x40, 0x0, 0x1, 0x4, 0xA3, 0x6, 0x40, 0x0, 0x1, 0x7, 0x85, 0x6, 0x40, 0x0, 0x1, 0x6, 0xC1, 0x6, 0x40, 0x0, 0x1, 0x4, 0x8B, 0x6, 0x40, 0x0, 0x1, 0x5, 0xD, 0x6, 0x40, 0x0, 0x1, 0x5, 0x39, 0x6, 0x40, 0x0, 0x1, 0x4, 0x31, 0x6, 0x40, 0x0, 0x1, 0x5, 0x3A, 0x6, 0x40, 0x0, 0x1, 0x4, 0x85, 0x6, 0x40, 0x0, 0x1, 0x4, 0x66, 0x6, 0x40, 0x0, 0x1, 0x2, 0xD6, 0x6, 0x40, 0x0, 0x1, 0x5, 0x73, 0x6, 0x40, 0x0, 0x1, 0x4, 0x89, 0x6, 0x40, 0x0, 0x1, 0x5, 0xB, 0x6, 0x40, 0x0, 0x1, 0x4, 0x2D, 0x6, 0x40, 0x0, 0x1, 0x6, 0xF7, 0x6, 0x40, 0x0, 0x1, 0x4, 0x73, 0x6, 0x40, 0x0, 0x1, 0x4, 0x81, 0x6, 0x40, 0x0, 0x1, 0x4, 0x22, 0x6, 0x40, 0x0, 0x1, 0x4, 0x72, 0x6, 0x40, 0x0, 0x1, 0x5, 0x2E, 0x6, 0x40, 0x0, 0x1, 0x3, 0xF6, 0x6, 0x40, 0x0, 0x1, 0x5, 0x10, 0x6, 0x40, 0x0, 0x1, 0x4, 0x7, 0x6, 0x40, 0x0, 0x1, 0x4, 0x71, 0x6, 0x40, 0x0, 0x1, 0x5, 0xF2, 0x6, 0x40, 0x0, 0x1, 0x3, 0xE5, 0x6, 0x40, 0x0, 0x1, 0x2, 0x42, 0x6, 0x40, 0x0, 0x1, 0x5, 0x1E, 0x6, 0x40, 0x0, 0x1, 0x4, 0x1D, 0x6, 0x40, 0x0, 0x1, 0x5, 0x1A, 0x6, 0x40, 0x0, 0x1, 0x2, 0x39, 0x6, 0x40, 0x0, 0x1, 0x4, 0xCA, 0x6, 0x40, 0x0, 0x1, 0x4, 0x79, 0x6, 0x40, 0x0, 0x1, 0x4, 0x2A, 0x6, 0x40, 0x0, 0x1, 0x4, 0xDD, 0x6, 0x40, 0x0, 0x1, 0x1, 0xFD, 0x6, 0x40, 0x0, 0x1, 0x4, 0x5C, 0x6, 0x40, 0x0, 0x1, 0x4, 0x61, 0x6, 0x40, 0x0, 0x1, 0x6, 0x6, 0x6, 0x40, 0x0, 0x1, 0x4, 0x6D, 0x6, 0x40, 0x0, 0x1, 0x4, 0x3C, 0x6, 0x40, 0x0, 0x1, 0x4, 0x5F, 0x6, 0x40, 0x0, 0x1, 0x4, 0xDE, 0x6, 0x40, 0x0, 0x1, 0x4, 0x80, 0x6, 0x40, 0x0, 0x1, 0x3, 0xD6, 0x6, 0x40, 0x0, 0x1, 0x4, 0x35, 0x6, 0x40, 0x0, 0x1, 0x6, 0x8, 0x6, 0x40, 0x0, 0x1, 0x4, 0x3D, 0x6, 0x40, 0x0, 0x1, 0x4, 0x86, 0x6, 0x40, 0x0, 0x1, 0x4, 0x4B, 0x6, 0x40, 0x0, 0x1, 0x4, 0x8E, 0x6, 0x40, 0x0, 0x1, 0x4, 0x9E, 0x6, 0x40, 0x0, 0x1, 0x3, 0xE1, 0x6, 0x40, 0x0, 0x1, 0x4, 0xC0, 0x6, 0x40, 0x0, 0x1, 0x5, 0x98, 0x6, 0x40, 0x0, 0x1, 0x5, 0xB0, 0x6, 0x40, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0xC, 0x0, 0x16, 0x0, 0x1, 0x2, 0x4E, 0x2, 0x6E, 0x0, 0x1, 0x0, 0x3, 0x2, 0xD, 0x2, 0x10, 0x2, 0x13, 0x0, 0x2, 0x0, 0x5E, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x46, 0x0, 0x5F, 0x0, 0x1A, 0x0, 0x8C, 0x0, 0x8C, 0x0, 0x34, 0x0, 0x94, 0x0, 0x95, 0x0, 0x35, 0x2, 0xD2, 0x2, 0xD2, 0x0, 0x37, 0x2, 0xDA, 0x2, 0xDB, 0x0, 0x38, 0x2, 0xEB, 0x2, 0xEB, 0x0, 0x3A, 0x2, 0xED, 0x2, 0xED, 0x0, 0x3B, 0x2, 0xF4, 0x2, 0xF5, 0x0, 0x3C, 0x3, 0x17, 0x3, 0x17, 0x0, 0x3E, 0x4, 0x2B, 0x4, 0x2D, 0x0, 0x3F, 0x5, 0x5D, 0x5, 0x5E, 0x0, 0x42, 0x6, 0xC7, 0x6, 0xC8, 0x0, 0x44, 0x7, 0x4E, 0x7, 0x62, 0x0, 0x46, 0x7, 0xA6, 0x7, 0xA6, 0x0, 0x5B, 0x7, 0xAE, 0x7, 0xB1, 0x0, 0x5C, 0x7, 0xDE, 0x7, 0xE2, 0x0, 0x60, 0x8, 0xAD, 0x8, 0xAD, 0x0, 0x65, 0x8, 0xB3, 0x8, 0xB3, 0x0, 0x66, 0x8, 0xB5, 0x8, 0xB8, 0x0, 0x67, 0x8, 0xC8, 0x8, 0xF3, 0x0, 0x6B, 0x8, 0xF8, 0x9, 0x28, 0x0, 0x97, 0x9, 0x2A, 0x9, 0x2A, 0x0, 0xC8, 0x9, 0x2C, 0x9, 0x2C, 0x0, 0xC9, 0x9, 0x2E, 0x9, 0x30, 0x0, 0xCA, 0x9, 0x33, 0x9, 0x33, 0x0, 0xCD, 0x9, 0x35, 0x9, 0x78, 0x0, 0xCE, 0x9, 0x7D, 0x9, 0xDA, 0x1, 0x12, 0x9, 0xDD, 0x9, 0xEC, 0x1, 0x70, 0x9, 0xF3, 0x9, 0xF3, 0x1, 0x80, 0x9, 0xF5, 0x9, 0xF5, 0x1, 0x81, 0x9, 0xF9, 0x9, 0xF9, 0x1, 0x82, 0x9, 0xFC, 0x9, 0xFC, 0x1, 0x83, 0x9, 0xFE, 0xA, 0x1, 0x1, 0x84, 0xA, 0x3, 0xA, 0x3, 0x1, 0x88, 0xA, 0x5, 0xA, 0x6, 0x1, 0x89, 0xA, 0x8, 0xA, 0x8, 0x1, 0x8B, 0xA, 0xA, 0xA, 0xC, 0x1, 0x8C, 0xA, 0xE, 0xA, 0x13, 0x1, 0x8F, 0xA, 0x15, 0xA, 0x1A, 0x1, 0x95, 0xA, 0x1C, 0xA, 0x1D, 0x1, 0x9B, 0xA, 0x1F, 0xA, 0x1F, 0x1, 0x9D, 0xA, 0x21, 0xA, 0x29, 0x1, 0x9E, 0xA, 0x2F, 0xA, 0x33, 0x1, 0xA7, 0xA, 0x35, 0xA, 0x35, 0x1, 0xAC, 0xA, 0x3F, 0xA, 0x41, 0x1, 0xAD, 0xA, 0x43, 0xA, 0x43, 0x1, 0xB0, 0xA, 0x46, 0xA, 0x4A, 0x1, 0xB1, 0xA, 0x4D, 0xA, 0x4E, 0x1, 0xB6, 0xA, 0x5A, 0xA, 0x5B, 0x1, 0xB8, 0xA, 0x64, 0xA, 0x64, 0x1, 0xBA, 0xA, 0x66, 0xA, 0x66, 0x1, 0xBB, 0xA, 0x68, 0xA, 0x68, 0x1, 0xBC, 0xA, 0x6D, 0xA, 0x96, 0x1, 0xBD, 0xA, 0x98, 0xA, 0xA7, 0x1, 0xE7, 0xA, 0xB2, 0xA, 0xB5, 0x1, 0xF7, 0xA, 0xC0, 0xA, 0xC7, 0x1, 0xFB, 0xA, 0xCF, 0xA, 0xCF, 0x2, 0x3, 0xA, 0xD6, 0xA, 0xD6, 0x2, 0x4, 0xA, 0xD8, 0xA, 0xD9, 0x2, 0x5, 0xA, 0xDB, 0xA, 0xDB, 0x2, 0x7, 0xA, 0xEE, 0xA, 0xF0, 0x2, 0x8, 0xA, 0xF2, 0xA, 0xFD, 0x2, 0xB, 0xA, 0xFF, 0xB, 0x2, 0x2, 0x17, 0xB, 0x5, 0xB, 0xC, 0x2, 0x1B, 0xB, 0x10, 0xB, 0x1C, 0x2, 0x23, 0xB, 0x1E, 0xB, 0x1E, 0x2, 0x30, 0xB, 0x20, 0xB, 0x3B, 0x2, 0x31, 0xB, 0x3F, 0xB, 0x3F, 0x2, 0x4D, 0xB, 0x42, 0xB, 0x43, 0x2, 0x4E, 0xB, 0x47, 0xB, 0xD7, 0x2, 0x50, 0xB, 0xE0, 0xB, 0xE7, 0x2, 0xE1, 0xB, 0xEE, 0xB, 0xF3, 0x2, 0xE9, 0xB, 0xFC, 0xC, 0x3, 0x2, 0xEF, 0xC, 0xC, 0xC, 0x1F, 0x2, 0xF7, 0xC, 0x28, 0xC, 0x2B, 0x3, 0xB, 0xC, 0x44, 0xC, 0x45, 0x3, 0xF, 0xC, 0x52, 0xC, 0x59, 0x3, 0x11, 0xC, 0x62, 0xC, 0x69, 0x3, 0x19, 0xC, 0x81, 0xC, 0x85, 0x3, 0x21, 0xC, 0x8B, 0xC, 0x8F, 0x3, 0x26, 0xC, 0x96, 0xC, 0x99, 0x3, 0x2B, 0xC, 0xA2, 0xC, 0xA6, 0x3, 0x2F, 0xC, 0xAC, 0xC, 0xAD, 0x3, 0x34, 0xC, 0xB7, 0xC, 0xBC, 0x3, 0x36, 0xC, 0xBE, 0xC, 0xCE, 0x3, 0x3C, 0xC, 0xD0, 0xC, 0xD4, 0x3, 0x4D, 0xC, 0xD6, 0xC, 0xD7, 0x3, 0x52, 0xC, 0xD9, 0xC, 0xD9, 0x3, 0x54, 0xC, 0xDB, 0xC, 0xDD, 0x3, 0x55, 0xC, 0xDF, 0xC, 0xE2, 0x3, 0x58, 0xC, 0xE4, 0xC, 0xE6, 0x3, 0x5C, 0xC, 0xEB, 0xC, 0xEB, 0x3, 0x5F, 0xC, 0xEE, 0xD, 0x1C, 0x3, 0x60, 0x0, 0x3, 0x0, 0x0, 0x0, 0xE, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x1A, 0x0, 0x1, 0x0, 0x0, 0xFF, 0xDB, 0x0, 0x1, 0x0, 0x0, 0xFF, 0xDC, 0x0, 0x1, 0x0, 0x0, 0xFF, 0x78, 0x3, 0x8F, 0x9, 0x1E, 0x7, 0xBC, 0x7, 0xC2, 0x7, 0xCE, 0x9, 0x2A, 0x7, 0xDA, 0x7, 0xE6, 0x9, 0x60, 0x8, 0x8E, 0x8, 0x70, 0x7, 0xF2, 0x9, 0x24, 0x8, 0x4, 0x8, 0x10, 0x9, 0x36, 0x8, 0x9A, 0x9, 0x36, 0x8, 0x22, 0x8, 0x2E, 0x8, 0x3A, 0x8, 0x40, 0x8, 0x4C, 0x8, 0x58, 0x8, 0x5E, 0x8, 0x94, 0x8, 0x64, 0x9, 0x24, 0x8, 0x1C, 0x7, 0xC8, 0x7, 0xD4, 0x9, 0x30, 0x7, 0xE0, 0x7, 0xEC, 0x8, 0x70, 0x7, 0xFE, 0x7, 0xB0, 0x7, 0xF8, 0x7, 0xFE, 0x8, 0xA, 0x8, 0x16, 0x9, 0x3C, 0x8, 0x1C, 0x7, 0xB6, 0x8, 0x28, 0x8, 0x34, 0x8, 0x76, 0x8, 0x46, 0x8, 0x52, 0x8, 0x7C, 0x8, 0x6A, 0x8, 0x82, 0x8, 0x6A, 0x7, 0xD4, 0x7, 0x20, 0x7, 0x26, 0x9, 0x60, 0x8, 0x5E, 0x8, 0x6A, 0x9, 0x60, 0x8, 0x4, 0x8, 0x5E, 0x8, 0x6A, 0x8, 0x70, 0x7, 0x2C, 0x7, 0x32, 0x7, 0x38, 0x9, 0x60, 0x8, 0x70, 0x8, 0x10, 0x8, 0x16, 0x8, 0xC4, 0x9, 0x18, 0x8, 0xF4, 0x9, 0x12, 0x7, 0x3E, 0x7, 0x9E, 0x8, 0xEE, 0x9, 0xC, 0x7, 0x98, 0x9, 0x4E, 0x8, 0xE8, 0x9, 0x4E, 0x8, 0xCA, 0x8, 0xE2, 0x7, 0x92, 0x8, 0xD6, 0x9, 0x6, 0x8, 0xD0, 0x8, 0xFA, 0x7, 0x8C, 0x7, 0x44, 0x9, 0x48, 0x7, 0x86, 0x9, 0x0, 0x8, 0xDC, 0x9, 0x42, 0x9, 0x60, 0x9, 0x60, 0x9, 0x54, 0x9, 0x5A, 0x7, 0x4A, 0x7, 0xD4, 0x7, 0x50, 0x7, 0x56, 0x9, 0x4E, 0x7, 0x5C, 0x8, 0xCA, 0x7, 0x62, 0x7, 0x62, 0x7, 0x68, 0x8, 0x3A, 0x8, 0x76, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x7, 0xC2, 0x9, 0x2A, 0x9, 0x2A, 0x9, 0x2A, 0x9, 0x2A, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x10, 0x9, 0x36, 0x9, 0x36, 0x9, 0x36, 0x9, 0x36, 0x9, 0x36, 0x8, 0x40, 0x8, 0x40, 0x8, 0x40, 0x8, 0x40, 0x8, 0x94, 0x9, 0x24, 0x9, 0x24, 0x9, 0x24, 0x9, 0x24, 0x9, 0x24, 0x9, 0x24, 0x9, 0x24, 0x7, 0xC8, 0x9, 0x30, 0x9, 0x30, 0x9, 0x30, 0x9, 0x30, 0x8, 0x16, 0x9, 0x3C, 0x9, 0x3C, 0x9, 0x3C, 0x9, 0x3C, 0x9, 0x3C, 0x8, 0x46, 0x8, 0x46, 0x8, 0x46, 0x8, 0x46, 0x8, 0x82, 0x8, 0x82, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x7, 0xC2, 0x7, 0xC8, 0x7, 0xC2, 0x7, 0xC8, 0x7, 0xC2, 0x7, 0xC8, 0x7, 0xC2, 0x7, 0xC8, 0x7, 0xCE, 0x7, 0x6E, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x7, 0xE6, 0x7, 0xEC, 0x7, 0xE6, 0x7, 0xEC, 0x7, 0xE6, 0x7, 0xEC, 0x7, 0xE6, 0x7, 0xEC, 0x9, 0x60, 0x8, 0x70, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x7, 0xFE, 0x8, 0x8E, 0x8, 0x70, 0x7, 0xF2, 0x7, 0xF8, 0x9, 0x24, 0x7, 0xFE, 0x9, 0x24, 0x7, 0xFE, 0x9, 0x24, 0x7, 0x74, 0x9, 0x24, 0x7, 0x7A, 0x8, 0x10, 0x8, 0x16, 0x8, 0x10, 0x8, 0x16, 0x8, 0x10, 0x8, 0x16, 0x8, 0x16, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x8, 0x22, 0x8, 0x28, 0x8, 0x22, 0x8, 0x28, 0x8, 0x22, 0x8, 0x28, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x3A, 0x8, 0x76, 0x8, 0x3A, 0x8, 0x76, 0x8, 0x3A, 0x7, 0x80, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x58, 0x8, 0x7C, 0x8, 0x94, 0x8, 0x82, 0x8, 0x94, 0x8, 0x64, 0x8, 0x6A, 0x8, 0x64, 0x8, 0x6A, 0x8, 0x64, 0x8, 0x6A, 0x7, 0x86, 0x7, 0x86, 0x8, 0xEE, 0x9, 0x42, 0x9, 0x42, 0x9, 0x42, 0x9, 0x42, 0x9, 0x42, 0x9, 0x42, 0x9, 0x42, 0x9, 0x0, 0x9, 0x48, 0x9, 0x48, 0x9, 0x48, 0x9, 0x48, 0x8, 0xD0, 0x8, 0xD0, 0x8, 0xD0, 0x8, 0xD0, 0x8, 0xCA, 0x9, 0x4E, 0x9, 0x4E, 0x9, 0x4E, 0x9, 0x4E, 0x9, 0x4E, 0x7, 0x9E, 0x7, 0x9E, 0x7, 0x9E, 0x7, 0x9E, 0x9, 0x18, 0x9, 0x42, 0x9, 0x42, 0x9, 0x42, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x9, 0x0, 0x7, 0x86, 0x9, 0x48, 0x9, 0x48, 0x9, 0x48, 0x9, 0x48, 0x9, 0x48, 0x7, 0x8C, 0x7, 0x8C, 0x7, 0x8C, 0x7, 0x8C, 0x8, 0xFA, 0x8, 0xD0, 0x8, 0xD0, 0x8, 0xD0, 0x8, 0xD0, 0x8, 0xD0, 0x9, 0x6, 0x8, 0xD6, 0x7, 0x92, 0x7, 0x92, 0x7, 0x92, 0x7, 0x92, 0x8, 0xCA, 0x8, 0xCA, 0x8, 0xCA, 0x9, 0x4E, 0x9, 0x4E, 0x9, 0x4E, 0x9, 0x4E, 0x7, 0x98, 0x7, 0x98, 0x7, 0x98, 0x9, 0xC, 0x9, 0xC, 0x9, 0xC, 0x9, 0xC, 0x8, 0xEE, 0x8, 0xEE, 0x8, 0xEE, 0x7, 0x9E, 0x7, 0x9E, 0x7, 0x9E, 0x7, 0x9E, 0x7, 0x9E, 0x7, 0x9E, 0x9, 0x12, 0x9, 0x18, 0x9, 0x18, 0x8, 0xC4, 0x8, 0xC4, 0x8, 0xC4, 0x9, 0x1E, 0x9, 0x2A, 0x9, 0x60, 0x8, 0x8E, 0x8, 0xA0, 0x7, 0xA4, 0x9, 0x1E, 0x7, 0xBC, 0x9, 0x2A, 0x8, 0x64, 0x9, 0x60, 0x8, 0x8E, 0x7, 0xF2, 0x8, 0x4, 0x8, 0x10, 0x9, 0x36, 0x8, 0x9A, 0x8, 0x3A, 0x8, 0x94, 0x8, 0x5E, 0x8, 0x8E, 0x8, 0x94, 0x9, 0x3C, 0x8, 0x52, 0x9, 0x3C, 0x9, 0x2A, 0x8, 0x2E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x70, 0x7, 0xF2, 0x9, 0x1E, 0x7, 0xBC, 0x9, 0x2A, 0x8, 0x4, 0x9, 0x60, 0x9, 0x36, 0x8, 0x9A, 0x7, 0xC2, 0x8, 0x3A, 0x8, 0x5E, 0x9, 0x24, 0x9, 0x30, 0x9, 0x3C, 0x8, 0x1C, 0x7, 0xC8, 0x8, 0x82, 0x8, 0x6A, 0x9, 0x30, 0x8, 0x34, 0x7, 0xFE, 0x7, 0xB0, 0x8, 0x82, 0x8, 0x58, 0x8, 0x7C, 0x8, 0x58, 0x8, 0x7C, 0x8, 0x58, 0x8, 0x7C, 0x8, 0x94, 0x8, 0x82, 0x8, 0x4, 0x8, 0xA, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x2A, 0x9, 0x30, 0x7, 0xC2, 0x7, 0xC8, 0x8, 0x94, 0x8, 0x8E, 0x8, 0x8E, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x36, 0x9, 0x3C, 0x8, 0x82, 0x8, 0x82, 0x8, 0x82, 0x7, 0xD4, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x8, 0x8E, 0x8, 0x8E, 0x7, 0xFE, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x94, 0x8, 0x82, 0x8, 0x94, 0x8, 0x82, 0x8, 0x94, 0x8, 0x82, 0x7, 0xAA, 0x8, 0x3A, 0x8, 0x70, 0x8, 0x94, 0x8, 0x5E, 0x8, 0x6A, 0x7, 0xDA, 0x9, 0x1E, 0x9, 0x24, 0x8, 0x8E, 0x9, 0x36, 0x9, 0x3C, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x7, 0xE6, 0x7, 0xEC, 0x7, 0xF2, 0x7, 0xF8, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x7, 0xE6, 0x7, 0xEC, 0x8, 0x10, 0x8, 0x16, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x8, 0x8E, 0x8, 0x8E, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x8, 0x22, 0x8, 0x28, 0x8, 0x22, 0x8, 0x28, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x9, 0x60, 0x8, 0x70, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x8, 0x94, 0x8, 0x82, 0x8, 0x70, 0x7, 0xC8, 0x7, 0xB0, 0x7, 0xC2, 0x8, 0x4, 0x9, 0x36, 0x7, 0xB6, 0x8, 0x58, 0x8, 0x7C, 0x7, 0xBC, 0x8, 0x1C, 0x7, 0xBC, 0x8, 0x1C, 0x7, 0xBC, 0x8, 0x1C, 0x7, 0xC2, 0x7, 0xC8, 0x7, 0xCE, 0x7, 0xD4, 0x7, 0xCE, 0x7, 0xD4, 0x7, 0xCE, 0x7, 0xD4, 0x7, 0xCE, 0x7, 0xD4, 0x7, 0xCE, 0x7, 0xD4, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x2A, 0x9, 0x30, 0x7, 0xDA, 0x7, 0xE0, 0x7, 0xE6, 0x7, 0xEC, 0x9, 0x60, 0x8, 0x70, 0x9, 0x60, 0x8, 0x70, 0x9, 0x60, 0x8, 0x70, 0x9, 0x60, 0x8, 0x70, 0x7, 0xF2, 0x7, 0xF8, 0x7, 0xF2, 0x7, 0xF8, 0x7, 0xF2, 0x7, 0xF8, 0x9, 0x24, 0x7, 0xFE, 0x9, 0x24, 0x7, 0xFE, 0x9, 0x24, 0x7, 0xFE, 0x9, 0x24, 0x7, 0xFE, 0x8, 0x4, 0x8, 0xA, 0x8, 0x4, 0x8, 0xA, 0x8, 0x10, 0x8, 0x16, 0x8, 0x10, 0x8, 0x16, 0x8, 0x10, 0x8, 0x16, 0x8, 0x10, 0x8, 0x16, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x36, 0x9, 0x3C, 0x8, 0x9A, 0x8, 0x1C, 0x8, 0x9A, 0x8, 0x1C, 0x8, 0x22, 0x8, 0x28, 0x8, 0x22, 0x8, 0x28, 0x8, 0x22, 0x8, 0x28, 0x8, 0x22, 0x8, 0x28, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x2E, 0x8, 0x34, 0x8, 0x3A, 0x8, 0x76, 0x8, 0x3A, 0x8, 0x76, 0x8, 0x3A, 0x8, 0x76, 0x8, 0x3A, 0x8, 0x76, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x40, 0x8, 0x46, 0x8, 0x4C, 0x8, 0x52, 0x8, 0x4C, 0x8, 0x52, 0x8, 0x58, 0x8, 0x7C, 0x8, 0x58, 0x8, 0x7C, 0x8, 0x5E, 0x8, 0x6A, 0x8, 0x5E, 0x8, 0x6A, 0x8, 0x94, 0x8, 0x82, 0x8, 0x64, 0x8, 0x6A, 0x8, 0x64, 0x8, 0x6A, 0x8, 0x64, 0x8, 0x6A, 0x8, 0x70, 0x8, 0x76, 0x8, 0x7C, 0x8, 0x82, 0x9, 0x24, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x2A, 0x9, 0x2A, 0x9, 0x2A, 0x9, 0x2A, 0x9, 0x2A, 0x9, 0x2A, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x9, 0x3C, 0x9, 0x3C, 0x9, 0x3C, 0x9, 0x3C, 0x9, 0x3C, 0x9, 0x3C, 0x8, 0xA0, 0x8, 0xA0, 0x8, 0x88, 0x8, 0x88, 0x8, 0x88, 0x8, 0x88, 0x8, 0x94, 0x8, 0x94, 0x8, 0x94, 0x8, 0x94, 0x9, 0x3C, 0x9, 0x3C, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x1E, 0x9, 0x2A, 0x9, 0x2A, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x8E, 0x8, 0x94, 0x8, 0x94, 0x8, 0x94, 0x8, 0x94, 0x8, 0x9A, 0x8, 0xA0, 0x8, 0xA0, 0x9, 0x42, 0x8, 0xA6, 0x8, 0xAC, 0x8, 0xB2, 0x8, 0xB8, 0x8, 0xBE, 0x9, 0x42, 0x8, 0xDC, 0x9, 0x48, 0x8, 0xC4, 0x8, 0xFA, 0x8, 0xD0, 0x8, 0xD6, 0x8, 0xE2, 0x8, 0xCA, 0x9, 0x4E, 0x8, 0xE8, 0x8, 0xEE, 0x9, 0x18, 0x8, 0xF4, 0x8, 0xD0, 0x9, 0x18, 0x9, 0x48, 0x9, 0xC, 0x8, 0xD0, 0x8, 0xD0, 0x9, 0x6, 0x8, 0xD6, 0x9, 0x42, 0x8, 0xDC, 0x9, 0x48, 0x8, 0xE2, 0x8, 0xFA, 0x9, 0x4E, 0x8, 0xE8, 0x9, 0x0, 0x8, 0xEE, 0x8, 0xF4, 0x8, 0xFA, 0x9, 0x0, 0x9, 0x18, 0x9, 0x6, 0x9, 0x4E, 0x9, 0xC, 0x9, 0x12, 0x9, 0x12, 0x9, 0x12, 0x9, 0x18, 0x9, 0x1E, 0x9, 0x24, 0x9, 0x2A, 0x9, 0x30, 0x9, 0x36, 0x9, 0x3C, 0x9, 0x42, 0x9, 0x48, 0x9, 0x4E, 0x9, 0x54, 0x9, 0x54, 0x9, 0x54, 0x9, 0x54, 0x9, 0x54, 0x9, 0x54, 0x9, 0x54, 0x9, 0x54, 0x9, 0x54, 0x9, 0x54, 0x9, 0x5A, 0x9, 0x5A, 0x9, 0x5A, 0x9, 0x5A, 0x9, 0x5A, 0x9, 0x5A, 0x9, 0x5A, 0x9, 0x5A, 0x9, 0x5A, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x9, 0x60, 0x0, 0x1, 0x7, 0xB4, 0xFE, 0x69, 0x0, 0x1, 0x7, 0x3B, 0xFE, 0x69, 0x0, 0x1, 0x2, 0xA0, 0xFE, 0x69, 0x0, 0x1, 0x2, 0x82, 0xFE, 0x69, 0x0, 0x1, 0x2, 0x94, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x7C, 0xFE, 0x69, 0x0, 0x1, 0x3, 0xC6, 0xFE, 0x69, 0x0, 0x1, 0x8, 0xAC, 0xFE, 0x69, 0x0, 0x1, 0x3, 0xC4, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x9, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xF4, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x58, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x8F, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x1B, 0xFE, 0x69, 0x0, 0x1, 0x2, 0xA2, 0xFE, 0x69, 0x0, 0x1, 0x2, 0xE8, 0xFE, 0x69, 0x0, 0x1, 0x2, 0xD2, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x7B, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xA7, 0xFE, 0x69, 0x0, 0x1, 0x3, 0xBA, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x5D, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x84, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x44, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xA3, 0xFE, 0x69, 0x0, 0x1, 0x2, 0x1, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x8B, 0xFE, 0x69, 0x0, 0x1, 0x5, 0xD, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x39, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x31, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x3A, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x85, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x66, 0xFE, 0x69, 0x0, 0x1, 0x2, 0xD6, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x73, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x89, 0xFE, 0x69, 0x0, 0x1, 0x5, 0xB, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x2D, 0xFE, 0x69, 0x0, 0x1, 0x2, 0xC, 0xFE, 0x69, 0x0, 0x1, 0x7, 0x1, 0xFE, 0x69, 0x0, 0x1, 0x6, 0xF7, 0xFE, 0x69, 0x0, 0x1, 0x5, 0xAF, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x73, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x81, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xFF, 0xFE, 0x69, 0x0, 0x1, 0x2, 0xD0, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xD5, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x22, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xDC, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x38, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x72, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x2E, 0xFE, 0x69, 0x0, 0x1, 0x3, 0xF6, 0xFE, 0x69, 0x0, 0x1, 0x7, 0xB, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x10, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xD2, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x7, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x71, 0xFE, 0x69, 0x0, 0x1, 0x2, 0xAA, 0xFE, 0x69, 0x0, 0x1, 0x5, 0xF2, 0xFE, 0x69, 0x0, 0x1, 0x3, 0xE5, 0xFE, 0x69, 0x0, 0x1, 0x5, 0xCC, 0xFE, 0x69, 0x0, 0x1, 0x2, 0x42, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xE0, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x1E, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x9A, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x1D, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x1A, 0xFE, 0x69, 0x0, 0x1, 0x2, 0x39, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xCA, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x79, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x2A, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xDD, 0xFE, 0x69, 0x0, 0x1, 0x1, 0xFD, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x5C, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x61, 0xFE, 0x69, 0x0, 0x1, 0x6, 0x6, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x6D, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x3C, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x5F, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xDE, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x80, 0xFE, 0x69, 0x0, 0x1, 0x3, 0xD6, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x35, 0xFE, 0x69, 0x0, 0x1, 0x6, 0x8, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x3D, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x53, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x55, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x86, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x4B, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x86, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x8E, 0xFE, 0x69, 0x0, 0x1, 0x4, 0x9E, 0xFE, 0x69, 0x0, 0x1, 0x3, 0xE1, 0xFE, 0x69, 0x0, 0x1, 0x4, 0xC0, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x75, 0xFE, 0x69, 0x0, 0x1, 0x5, 0x98, 0xFE, 0x69, 0x0, 0x1, 0x5, 0xB0, 0xFE, 0x69, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0xC, 0x0, 0x12, 0x0, 0x1, 0x0, 0x3A, 0x0, 0x46, 0x0, 0x1, 0x0, 0x1, 0x1, 0x8F, 0x0, 0x1, 0x0, 0x12, 0x0, 0x46, 0x0, 0x4A, 0x0, 0x4E, 0x0, 0x54, 0x0, 0x5A, 0x0, 0x5E, 0x0, 0x8E, 0x1, 0x5, 0x1, 0x6, 0x1, 0x7, 0x1, 0x9, 0x1, 0xD, 0x1, 0xE, 0x1, 0x11, 0x1, 0x13, 0x1, 0x1E, 0x4, 0x2C, 0x4, 0x2E, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6, 0x0, 0x1, 0xFF, 0x3E, 0x2, 0x83, 0x0, 0x12, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x44, 0x0, 0x32, 0x0, 0x38, 0x0, 0x3E, 0x0, 0x44, 0x0, 0x4A, 0x0, 0x50, 0x0, 0x56, 0x0, 0x5C, 0x0, 0x62, 0x0, 0x68, 0x0, 0x6E, 0x0, 0x74, 0x0, 0x7A, 0x0, 0x80, 0x0, 0x86, 0x0, 0x1, 0x3, 0x67, 0x2, 0x8E, 0x0, 0x1, 0x3, 0x92, 0x2, 0x8E, 0x0, 0x1, 0x3, 0xD6, 0x2, 0x8E, 0x0, 0x1, 0x3, 0x9C, 0x2, 0x8E, 0x0, 0x1, 0x2, 0xFD, 0x2, 0x8E, 0x0, 0x1, 0x1, 0x34, 0x2, 0x8E, 0x0, 0x1, 0x3, 0x71, 0x2, 0x71, 0x0, 0x1, 0x3, 0x88, 0x2, 0x9C, 0x0, 0x1, 0x3, 0xD2, 0x2, 0x8E, 0x0, 0x1, 0x3, 0x56, 0x2, 0x8E, 0x0, 0x1, 0x3, 0x6B, 0x2, 0x8E, 0x0, 0x1, 0x3, 0x76, 0x2, 0x8E, 0x0, 0x1, 0x3, 0x9B, 0x3, 0xB, 0x0, 0x1, 0x3, 0x13, 0x2, 0x7F, 0x0, 0x1, 0x1, 0x3, 0x2, 0x84, 0x0, 0x1, 0x1, 0xAA, 0x2, 0x8E, 0x0, 0x1, 0x1, 0x97, 0x2, 0x8E, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0xC, 0x0, 0x12, 0x0, 0x1, 0x2, 0xF8, 0x3, 0x4, 0x0, 0x1, 0x0, 0x1, 0x1, 0xC6, 0x0, 0x2, 0x0, 0x7B, 0x0, 0x26, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x46, 0x0, 0x5F, 0x0, 0x1A, 0x0, 0x82, 0x0, 0x82, 0x0, 0x34, 0x0, 0x84, 0x0, 0x84, 0x0, 0x35, 0x0, 0x87, 0x0, 0x87, 0x0, 0x36, 0x0, 0x8A, 0x0, 0x8A, 0x0, 0x37, 0x0, 0x8C, 0x0, 0x97, 0x0, 0x38, 0x0, 0xA6, 0x0, 0xA7, 0x0, 0x44, 0x0, 0xAD, 0x0, 0xAD, 0x0, 0x46, 0x0, 0xB0, 0x0, 0xB1, 0x0, 0x47, 0x0, 0xB4, 0x0, 0xB5, 0x0, 0x49, 0x0, 0xBD, 0x0, 0xBD, 0x0, 0x4B, 0x0, 0xC3, 0x0, 0xC4, 0x0, 0x4C, 0x0, 0xC9, 0x0, 0xCA, 0x0, 0x4E, 0x0, 0xDB, 0x0, 0xDC, 0x0, 0x50, 0x0, 0xEC, 0x0, 0xEC, 0x0, 0x52, 0x0, 0xF2, 0x0, 0xF2, 0x0, 0x53, 0x0, 0xF8, 0x0, 0xF9, 0x0, 0x54, 0x0, 0xFD, 0x0, 0xFE, 0x0, 0x56, 0x1, 0x1, 0x1, 0x61, 0x0, 0x58, 0x2, 0x30, 0x2, 0x30, 0x0, 0xB9, 0x2, 0x3A, 0x2, 0x3A, 0x0, 0xBA, 0x2, 0x3E, 0x2, 0x3E, 0x0, 0xBB, 0x2, 0x40, 0x2, 0x40, 0x0, 0xBC, 0x2, 0x42, 0x2, 0x43, 0x0, 0xBD, 0x2, 0x46, 0x2, 0x46, 0x0, 0xBF, 0x2, 0x4A, 0x2, 0x4A, 0x0, 0xC0, 0x2, 0x4C, 0x2, 0x4D, 0x0, 0xC1, 0x2, 0x51, 0x2, 0x51, 0x0, 0xC3, 0x2, 0x53, 0x2, 0x53, 0x0, 0xC4, 0x2, 0x69, 0x2, 0x69, 0x0, 0xC5, 0x2, 0x70, 0x2, 0x72, 0x0, 0xC6, 0x2, 0x74, 0x2, 0x74, 0x0, 0xC9, 0x2, 0x77, 0x2, 0x77, 0x0, 0xCA, 0x2, 0x7B, 0x2, 0x7B, 0x0, 0xCB, 0x2, 0x7D, 0x2, 0x7F, 0x0, 0xCC, 0x2, 0x81, 0x2, 0x91, 0x0, 0xCF, 0x2, 0x93, 0x2, 0x93, 0x0, 0xE0, 0x2, 0x95, 0x2, 0x97, 0x0, 0xE1, 0x2, 0x99, 0x2, 0x99, 0x0, 0xE4, 0x2, 0x9E, 0x2, 0x9F, 0x0, 0xE5, 0x2, 0xAC, 0x2, 0xB0, 0x0, 0xE7, 0x2, 0xB2, 0x2, 0xB2, 0x0, 0xEC, 0x2, 0xB6, 0x2, 0xB8, 0x0, 0xED, 0x2, 0xC1, 0x2, 0xC2, 0x0, 0xF0, 0x2, 0xCA, 0x2, 0xCB, 0x0, 0xF2, 0x2, 0xCD, 0x2, 0xCD, 0x0, 0xF4, 0x2, 0xD2, 0x2, 0xD3, 0x0, 0xF5, 0x2, 0xD8, 0x2, 0xDB, 0x0, 0xF7, 0x2, 0xDE, 0x2, 0xDF, 0x0, 0xFB, 0x2, 0xE2, 0x2, 0xE2, 0x0, 0xFD, 0x2, 0xE8, 0x2, 0xE8, 0x0, 0xFE, 0x2, 0xEB, 0x2, 0xEF, 0x0, 0xFF, 0x2, 0xF4, 0x2, 0xF5, 0x1, 0x4, 0x2, 0xF9, 0x2, 0xF9, 0x1, 0x6, 0x2, 0xFB, 0x2, 0xFB, 0x1, 0x7, 0x2, 0xFF, 0x2, 0xFF, 0x1, 0x8, 0x3, 0x1, 0x3, 0x3, 0x1, 0x9, 0x3, 0x5, 0x3, 0x5, 0x1, 0xC, 0x3, 0x7, 0x3, 0x7, 0x1, 0xD, 0x3, 0x15, 0x3, 0x17, 0x1, 0xE, 0x3, 0x1F, 0x3, 0x1F, 0x1, 0x11, 0x3, 0x2F, 0x3, 0x3F, 0x1, 0x12, 0x3, 0x43, 0x3, 0x44, 0x1, 0x23, 0x3, 0x47, 0x3, 0x4B, 0x1, 0x25, 0x3, 0x4F, 0x3, 0x5A, 0x1, 0x2A, 0x3, 0x9A, 0x3, 0xA6, 0x1, 0x36, 0x3, 0xA8, 0x3, 0xA9, 0x1, 0x43, 0x3, 0xAB, 0x3, 0xC9, 0x1, 0x45, 0x4, 0x2B, 0x4, 0x2E, 0x1, 0x64, 0x5, 0x5D, 0x5, 0x5E, 0x1, 0x68, 0x6, 0xC7, 0x6, 0xC8, 0x1, 0x6A, 0x7, 0x4E, 0x7, 0x62, 0x1, 0x6C, 0x7, 0x66, 0x7, 0x66, 0x1, 0x81, 0x7, 0x71, 0x7, 0x71, 0x1, 0x82, 0x7, 0x78, 0x7, 0x7A, 0x1, 0x83, 0x7, 0x7D, 0x7, 0x7D, 0x1, 0x86, 0x7, 0x7F, 0x7, 0x7F, 0x1, 0x87, 0x7, 0x83, 0x7, 0x83, 0x1, 0x88, 0x7, 0x85, 0x7, 0x87, 0x1, 0x89, 0x7, 0x8D, 0x7, 0x8D, 0x1, 0x8C, 0x7, 0x92, 0x7, 0x92, 0x1, 0x8D, 0x7, 0x94, 0x7, 0x94, 0x1, 0x8E, 0x7, 0x96, 0x7, 0x96, 0x1, 0x8F, 0x7, 0xA6, 0x7, 0xA6, 0x1, 0x90, 0x7, 0xA9, 0x7, 0xA9, 0x1, 0x91, 0x7, 0xAB, 0x7, 0xAB, 0x1, 0x92, 0x7, 0xAE, 0x7, 0xB1, 0x1, 0x93, 0x7, 0xDE, 0x7, 0xE2, 0x1, 0x97, 0x7, 0xEE, 0x7, 0xF3, 0x1, 0x9C, 0x7, 0xF5, 0x7, 0xF5, 0x1, 0xA2, 0x7, 0xF7, 0x7, 0xF8, 0x1, 0xA3, 0x7, 0xFA, 0x7, 0xFA, 0x1, 0xA5, 0x8, 0xAD, 0x8, 0xB0, 0x1, 0xA6, 0x8, 0xB3, 0x8, 0xB8, 0x1, 0xAA, 0x8, 0xC8, 0x9, 0x30, 0x1, 0xB0, 0x9, 0x33, 0x9, 0xDA, 0x2, 0x19, 0x9, 0xDC, 0x9, 0xF3, 0x2, 0xC1, 0x9, 0xF5, 0x9, 0xF5, 0x2, 0xD9, 0x9, 0xF7, 0xA, 0x1, 0x2, 0xDA, 0xA, 0x3, 0xA, 0xC, 0x2, 0xE5, 0xA, 0xE, 0xA, 0x29, 0x2, 0xEF, 0xA, 0x2D, 0xA, 0x2D, 0x3, 0xB, 0xA, 0x2F, 0xA, 0x36, 0x3, 0xC, 0xA, 0x38, 0xA, 0x3A, 0x3, 0x14, 0xA, 0x3D, 0xA, 0x41, 0x3, 0x17, 0xA, 0x43, 0xA, 0xCC, 0x3, 0x1C, 0xA, 0xCF, 0xA, 0xCF, 0x3, 0xA6, 0xA, 0xD2, 0xA, 0xD3, 0x3, 0xA7, 0xA, 0xD5, 0xA, 0xD6, 0x3, 0xA9, 0xA, 0xD8, 0xA, 0xDB, 0x3, 0xAB, 0xA, 0xE7, 0xA, 0xE7, 0x3, 0xAF, 0xA, 0xEE, 0xB, 0xC, 0x3, 0xB0, 0xB, 0x10, 0xB, 0x44, 0x3, 0xCF, 0xB, 0x47, 0xC, 0x33, 0x4, 0x4, 0xC, 0x3C, 0xC, 0x71, 0x4, 0xF1, 0xC, 0x7A, 0xC, 0xAD, 0x5, 0x27, 0xC, 0xB7, 0xC, 0xBC, 0x5, 0x5B, 0xC, 0xBE, 0xC, 0xDD, 0x5, 0x61, 0xC, 0xDF, 0xC, 0xE6, 0x5, 0x81, 0xC, 0xE8, 0xC, 0xE9, 0x5, 0x89, 0xC, 0xEB, 0xC, 0xEB, 0x5, 0x8B, 0xC, 0xED, 0xD, 0x1E, 0x5, 0x8C, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6, 0x0, 0x1, 0xFF, 0xB7, 0x4, 0x26, 0x5, 0xBE, 0x13, 0x52, 0x11, 0x96, 0x11, 0xA2, 0x11, 0xAE, 0x13, 0x5E, 0x11, 0xBA, 0x11, 0xC6, 0x12, 0x86, 0x12, 0x92, 0x11, 0x72, 0x11, 0xCC, 0x11, 0xD8, 0x11, 0xE4, 0x11, 0xF0, 0x13, 0x6A, 0x12, 0xAA, 0x13, 0x6A, 0x12, 0x2, 0x12, 0xE, 0x12, 0x1A, 0x12, 0x20, 0x12, 0x2C, 0x12, 0x38, 0x12, 0x3E, 0x12, 0xA4, 0x12, 0x4A, 0x13, 0x58, 0x11, 0x9C, 0x11, 0xA8, 0x11, 0xB4, 0x13, 0x64, 0x11, 0xC0, 0x12, 0x80, 0x12, 0x56, 0x11, 0xC, 0x11, 0x84, 0x11, 0xD2, 0x11, 0xDE, 0x11, 0xEA, 0x11, 0xF6, 0x13, 0x70, 0x11, 0xFC, 0x11, 0x90, 0x12, 0x8, 0x12, 0x14, 0x12, 0x5C, 0x12, 0x26, 0x12, 0x32, 0x12, 0x62, 0x12, 0x44, 0x12, 0x68, 0x12, 0x50, 0x11, 0x5A, 0x10, 0x76, 0x11, 0x60, 0x10, 0x7C, 0x10, 0x28, 0x12, 0x86, 0x13, 0x9A, 0x10, 0xA0, 0xF, 0x38, 0xB, 0x7E, 0xB, 0x84, 0x12, 0x80, 0xB, 0x8A, 0xB, 0x90, 0xB, 0x96, 0xB, 0x9C, 0xB, 0xA2, 0xB, 0xA8, 0xB, 0xAE, 0xB, 0xB4, 0xD, 0x70, 0x11, 0x12, 0x11, 0x18, 0xB, 0xBA, 0x11, 0x1E, 0x11, 0x24, 0x12, 0x4A, 0xB, 0xC0, 0xB, 0xC6, 0x12, 0x80, 0x10, 0xAC, 0xB, 0xCC, 0xB, 0xD2, 0xB, 0xD8, 0xB, 0xDE, 0xB, 0xE4, 0xB, 0xEA, 0xB, 0xF0, 0xB, 0xF6, 0xB, 0xFC, 0x13, 0x58, 0xC, 0x2, 0xC, 0x2, 0xC, 0x8, 0x11, 0xA8, 0xC, 0xE, 0xC, 0x14, 0xD, 0x1C, 0x13, 0x64, 0x11, 0x54, 0xC, 0x1A, 0xC, 0x20, 0xC, 0x20, 0xC, 0x26, 0xD, 0x4, 0xC, 0x2C, 0xC, 0x32, 0x12, 0x80, 0xC, 0x38, 0xC, 0x3E, 0xC, 0x44, 0xC, 0x4A, 0xC, 0x50, 0xC, 0x50, 0xC, 0x56, 0xC, 0x5C, 0xC, 0x62, 0xC, 0x68, 0xC, 0x6E, 0xC, 0x74, 0xF, 0x68, 0x11, 0xEA, 0x11, 0xEA, 0x11, 0xEA, 0xC, 0x7A, 0xC, 0x80, 0xC, 0x86, 0xC, 0x8C, 0xC, 0x92, 0xC, 0x98, 0x12, 0x8, 0xC, 0x9E, 0xC, 0xA4, 0x12, 0x8, 0x12, 0x8, 0xC, 0xAA, 0xC, 0xAA, 0x11, 0xF6, 0x11, 0xF6, 0x12, 0x14, 0xF, 0x9E, 0xF, 0x9E, 0xC, 0xB0, 0xC, 0xB6, 0xC, 0xBC, 0xC, 0xC2, 0xC, 0xC8, 0xF, 0x1A, 0xC, 0xCE, 0xF, 0x5C, 0xC, 0xD4, 0xC, 0xDA, 0xC, 0xE0, 0xC, 0xE6, 0xC, 0xEC, 0xC, 0xF2, 0xC, 0xF8, 0xD, 0x22, 0xD, 0x22, 0xD, 0x22, 0xD, 0x22, 0xC, 0xFE, 0xD, 0x4, 0xD, 0xA, 0xD, 0x10, 0xE, 0x6, 0xD, 0x16, 0xD, 0x1C, 0xD, 0x22, 0xD, 0x22, 0xD, 0x28, 0xD, 0x2E, 0xD, 0x34, 0xD, 0x3A, 0xD, 0x40, 0xD, 0x46, 0xD, 0x4C, 0xD, 0x52, 0xD, 0x58, 0xD, 0x5E, 0xD, 0x64, 0xF, 0xE, 0xD, 0x6A, 0x11, 0x42, 0x12, 0x7A, 0x12, 0x74, 0x12, 0x80, 0x12, 0x8C, 0xD, 0x70, 0x12, 0x98, 0x12, 0x9E, 0x10, 0xB2, 0x12, 0xB0, 0x11, 0x7E, 0xD, 0x76, 0xD, 0x7C, 0x10, 0xCA, 0x10, 0xD6, 0x10, 0xE2, 0x10, 0xFA, 0x11, 0x36, 0x11, 0x0, 0x10, 0xEE, 0xD, 0x82, 0xD, 0x88, 0x11, 0x66, 0x11, 0x48, 0xD, 0x8E, 0x10, 0xD0, 0x10, 0xDC, 0x10, 0xE8, 0x10, 0xA6, 0xE, 0x1E, 0xD, 0xEE, 0x11, 0x6C, 0x11, 0x6C, 0x11, 0x30, 0xD, 0x94, 0xD, 0x9A, 0x11, 0x3C, 0xD, 0xA0, 0xD, 0xA6, 0x11, 0x6, 0x10, 0xF4, 0xD, 0xAC, 0xD, 0xB2, 0x10, 0xF4, 0xD, 0xB8, 0xD, 0xBE, 0xD, 0xC4, 0x11, 0x8A, 0x12, 0x80, 0x10, 0xB8, 0x10, 0xBE, 0xD, 0xCA, 0xD, 0xD0, 0xD, 0xD6, 0xD, 0xDC, 0x10, 0xE2, 0x10, 0xE8, 0x10, 0xCA, 0x10, 0xD0, 0x10, 0xA6, 0x12, 0x86, 0x11, 0x6C, 0xD, 0xE2, 0xD, 0xE8, 0x12, 0x3E, 0x12, 0x44, 0x11, 0x36, 0x11, 0x3C, 0xE, 0x18, 0xE, 0x1E, 0x12, 0x86, 0x11, 0x6C, 0x11, 0xE4, 0xD, 0xEE, 0x10, 0xC4, 0x12, 0x3E, 0x12, 0x44, 0xD, 0xF4, 0x11, 0x7E, 0xD, 0xFA, 0xE, 0x0, 0xE, 0x6, 0xE, 0xC, 0xE, 0x12, 0xE, 0x1E, 0x11, 0x6C, 0xE, 0x18, 0x12, 0x56, 0xE, 0x1E, 0xE, 0x9C, 0x13, 0x3A, 0xE, 0x24, 0xF, 0xE, 0x13, 0x58, 0xE, 0x2A, 0xE, 0x30, 0xE, 0x36, 0xE, 0x3C, 0xE, 0x42, 0xE, 0x48, 0xE, 0x4E, 0xE, 0x54, 0xE, 0x5A, 0x10, 0xA0, 0xE, 0x60, 0x11, 0xA8, 0xE, 0x66, 0xE, 0x6C, 0xE, 0xA8, 0xE, 0x72, 0xE, 0x72, 0xF, 0x5C, 0xE, 0x78, 0xE, 0x7E, 0xE, 0x84, 0x12, 0x50, 0x12, 0x50, 0xE, 0x8A, 0xE, 0x90, 0xE, 0x96, 0xE, 0x9C, 0xE, 0xA2, 0xE, 0xA8, 0xE, 0xAE, 0xE, 0xB4, 0xE, 0xBA, 0xE, 0xC0, 0x12, 0x2, 0xE, 0xC6, 0xE, 0xCC, 0xE, 0xD2, 0xE, 0xD8, 0xE, 0xDE, 0xE, 0xE4, 0xE, 0xEA, 0xE, 0xF0, 0xE, 0xF6, 0x12, 0x80, 0xE, 0xFC, 0xF, 0x2, 0xF, 0x8, 0xF, 0xE, 0xF, 0x14, 0xF, 0x1A, 0xF, 0x20, 0xF, 0x26, 0xF, 0x2C, 0xF, 0x32, 0xF, 0x38, 0xF, 0x3E, 0xF, 0x44, 0xF, 0x4A, 0xF, 0x50, 0x12, 0x8, 0x12, 0x14, 0xF, 0x56, 0xF, 0x5C, 0xF, 0x62, 0x12, 0x50, 0xF, 0x68, 0xF, 0x6E, 0xF, 0x74, 0xF, 0x7A, 0xF, 0x80, 0xF, 0x86, 0xF, 0x8C, 0xF, 0x92, 0xF, 0x98, 0xF, 0x9E, 0xF, 0xA4, 0xF, 0xAA, 0xF, 0xB0, 0xF, 0xB6, 0xF, 0xBC, 0xF, 0xC2, 0x12, 0x86, 0x12, 0x56, 0x11, 0xF0, 0x11, 0xF6, 0x12, 0xDA, 0x13, 0x4C, 0x13, 0x10, 0x13, 0x46, 0xF, 0xC8, 0x10, 0x94, 0x13, 0xA, 0x13, 0x40, 0x10, 0x8E, 0x13, 0x82, 0x13, 0x4, 0x13, 0x82, 0x12, 0xE0, 0x12, 0xFE, 0x12, 0xF8, 0x12, 0xEC, 0x13, 0x34, 0x12, 0xE6, 0x13, 0x1C, 0x10, 0x88, 0xF, 0xCE, 0x12, 0xF8, 0x13, 0x22, 0xF, 0xD4, 0x13, 0x16, 0x13, 0x28, 0x13, 0x2E, 0xF, 0xF2, 0xF, 0xDA, 0x13, 0x22, 0xF, 0xE0, 0xF, 0xE6, 0xF, 0xEC, 0xF, 0xF2, 0xF, 0xF8, 0x13, 0x82, 0x13, 0x7C, 0xF, 0xFE, 0x10, 0x4, 0x10, 0x82, 0x13, 0x22, 0x12, 0xF2, 0x13, 0x76, 0x13, 0x94, 0x13, 0x94, 0x13, 0x88, 0x13, 0x8E, 0x10, 0xA, 0x10, 0xAC, 0x10, 0x10, 0x10, 0x16, 0x10, 0x1C, 0x10, 0xAC, 0x10, 0x22, 0x13, 0x9A, 0x13, 0x9A, 0x13, 0x9A, 0x10, 0xAC, 0x10, 0x28, 0x10, 0x2E, 0x10, 0x34, 0x10, 0x3A, 0x10, 0x40, 0x13, 0x3A, 0x10, 0x46, 0x13, 0x82, 0x10, 0x4C, 0x12, 0xE0, 0x10, 0x52, 0x10, 0x52, 0x10, 0x58, 0x12, 0x1A, 0x12, 0x5C, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x11, 0xA2, 0x13, 0x5E, 0x13, 0x5E, 0x13, 0x5E, 0x13, 0x5E, 0x12, 0x92, 0x12, 0x92, 0x12, 0x92, 0x12, 0x92, 0x11, 0xF0, 0x13, 0x6A, 0x13, 0x6A, 0x13, 0x6A, 0x13, 0x6A, 0x13, 0x6A, 0x12, 0x20, 0x12, 0x20, 0x12, 0x20, 0x12, 0x20, 0x12, 0xA4, 0x13, 0x58, 0x13, 0x58, 0x13, 0x58, 0x13, 0x58, 0x13, 0x58, 0x13, 0x58, 0x13, 0x58, 0x11, 0xA8, 0x13, 0x64, 0x13, 0x64, 0x13, 0x64, 0x13, 0x64, 0x13, 0x9A, 0x13, 0x9A, 0x13, 0x9A, 0x13, 0x9A, 0x11, 0xF6, 0x13, 0x70, 0x13, 0x70, 0x13, 0x70, 0x13, 0x70, 0x13, 0x70, 0x12, 0x26, 0x12, 0x26, 0x12, 0x26, 0x12, 0x26, 0x12, 0x68, 0x12, 0x68, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x11, 0xA2, 0x11, 0xA8, 0x11, 0xA2, 0x11, 0xA8, 0x11, 0xA2, 0x11, 0xA8, 0x11, 0xA2, 0x11, 0xA8, 0x11, 0xAE, 0x10, 0x5E, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x11, 0xC6, 0x12, 0x80, 0x11, 0xC6, 0x12, 0x80, 0x11, 0xC6, 0x12, 0x80, 0x11, 0xC6, 0x12, 0x80, 0x12, 0x86, 0x12, 0x56, 0x12, 0x92, 0x13, 0x9A, 0x12, 0x92, 0x13, 0x9A, 0x12, 0x92, 0x13, 0x9A, 0x12, 0x92, 0x11, 0xC, 0x12, 0x92, 0x11, 0x72, 0x10, 0xAC, 0x11, 0xCC, 0x11, 0xD2, 0x11, 0xD8, 0x11, 0xDE, 0x11, 0xD8, 0x11, 0xDE, 0x11, 0xD8, 0x10, 0x64, 0x11, 0xD8, 0x10, 0x6A, 0x11, 0xF0, 0x11, 0xF6, 0x11, 0xF0, 0x11, 0xF6, 0x11, 0xF0, 0x11, 0xF6, 0x11, 0xF6, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x12, 0x2, 0x12, 0x8, 0x12, 0x2, 0x12, 0x8, 0x12, 0x2, 0x12, 0x8, 0x12, 0xE, 0x12, 0x14, 0x12, 0xE, 0x12, 0x14, 0x12, 0xE, 0x12, 0x14, 0x12, 0xE, 0x12, 0x14, 0x12, 0xE, 0x12, 0x14, 0x12, 0x1A, 0x12, 0x5C, 0x12, 0x1A, 0x12, 0x5C, 0x12, 0x1A, 0x10, 0x70, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x38, 0x12, 0x62, 0x12, 0xA4, 0x12, 0x68, 0x12, 0xA4, 0x12, 0x4A, 0x12, 0x50, 0x12, 0x4A, 0x12, 0x50, 0x12, 0x4A, 0x12, 0x50, 0x11, 0x5A, 0x11, 0x60, 0x10, 0x76, 0x10, 0x7C, 0x10, 0x82, 0x10, 0x82, 0x13, 0xA, 0x13, 0x76, 0x13, 0x76, 0x13, 0x76, 0x13, 0x76, 0x13, 0x76, 0x13, 0x76, 0x13, 0x76, 0x13, 0x22, 0x13, 0x7C, 0x13, 0x7C, 0x13, 0x7C, 0x13, 0x7C, 0x12, 0xE6, 0x12, 0xE6, 0x12, 0xE6, 0x12, 0xE6, 0x12, 0xE0, 0x13, 0x82, 0x13, 0x82, 0x13, 0x82, 0x13, 0x82, 0x13, 0x82, 0x10, 0x94, 0x10, 0x94, 0x10, 0x94, 0x10, 0x94, 0x13, 0x4C, 0x13, 0x76, 0x13, 0x76, 0x13, 0x76, 0x13, 0x22, 0x13, 0x22, 0x13, 0x22, 0x13, 0x22, 0x10, 0x82, 0x13, 0x7C, 0x13, 0x7C, 0x13, 0x7C, 0x13, 0x7C, 0x13, 0x7C, 0x10, 0x88, 0x10, 0x88, 0x10, 0x88, 0x10, 0x88, 0x13, 0x1C, 0x12, 0xE6, 0x12, 0xE6, 0x12, 0xE6, 0x12, 0xE6, 0x12, 0xE6, 0x13, 0x34, 0x12, 0xEC, 0x12, 0xF8, 0x12, 0xF8, 0x12, 0xF8, 0x12, 0xF8, 0x12, 0xE0, 0x12, 0xE0, 0x12, 0xE0, 0x13, 0x82, 0x13, 0x82, 0x13, 0x82, 0x13, 0x82, 0x10, 0x8E, 0x10, 0x8E, 0x10, 0x8E, 0x13, 0x40, 0x13, 0x40, 0x13, 0x40, 0x13, 0x40, 0x13, 0xA, 0x13, 0xA, 0x13, 0xA, 0x10, 0x94, 0x10, 0x94, 0x10, 0x94, 0x10, 0x94, 0x10, 0x94, 0x10, 0x94, 0x13, 0x46, 0x13, 0x4C, 0x13, 0x4C, 0x12, 0xDA, 0x12, 0xDA, 0x12, 0xDA, 0x13, 0x52, 0x13, 0x5E, 0x12, 0x86, 0x12, 0x92, 0x12, 0xB6, 0x10, 0x9A, 0x12, 0x8C, 0x13, 0x52, 0x11, 0x96, 0x13, 0x5E, 0x12, 0x4A, 0x12, 0x86, 0x12, 0x92, 0x11, 0xCC, 0x11, 0xE4, 0x11, 0xF0, 0x13, 0x6A, 0x12, 0xAA, 0x12, 0x1A, 0x12, 0xA4, 0x12, 0x3E, 0x12, 0x92, 0x12, 0xA4, 0x12, 0x7A, 0x12, 0x74, 0x12, 0x80, 0x12, 0x8C, 0x12, 0x9E, 0x10, 0xA0, 0x13, 0x70, 0x12, 0x32, 0x12, 0x8C, 0x12, 0x9E, 0x13, 0x70, 0x12, 0x9E, 0x12, 0xB0, 0x13, 0x5E, 0x11, 0x42, 0x12, 0xE, 0x12, 0x92, 0x12, 0x92, 0x11, 0x72, 0x11, 0xCC, 0x10, 0xFA, 0x13, 0x52, 0x11, 0x96, 0x11, 0x42, 0x13, 0x5E, 0x10, 0xE2, 0x11, 0xE4, 0x12, 0x86, 0x13, 0x6A, 0x12, 0xAA, 0x11, 0xA2, 0x12, 0x1A, 0x12, 0x3E, 0x13, 0x58, 0x13, 0x64, 0x10, 0xE8, 0x13, 0x70, 0x11, 0xFC, 0x11, 0xA8, 0x12, 0x68, 0x12, 0x44, 0x13, 0x64, 0x11, 0x48, 0x12, 0x14, 0x11, 0xC, 0x13, 0x9A, 0x11, 0x84, 0x10, 0xA6, 0x12, 0x68, 0x12, 0x38, 0x12, 0x62, 0x12, 0x38, 0x12, 0x62, 0x12, 0x38, 0x12, 0x62, 0x12, 0xA4, 0x12, 0x68, 0x10, 0xAC, 0x11, 0xE4, 0x11, 0xEA, 0x13, 0x52, 0x13, 0x58, 0x13, 0x5E, 0x10, 0xE2, 0x13, 0x64, 0x10, 0xE8, 0x10, 0xB2, 0x10, 0xB8, 0x10, 0xBE, 0x10, 0xD6, 0x10, 0xDC, 0x11, 0xA2, 0x11, 0xA8, 0x12, 0xA4, 0x12, 0x92, 0x10, 0xCA, 0x10, 0xD0, 0x12, 0x92, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x11, 0x5A, 0x11, 0x60, 0x13, 0x5E, 0x13, 0x64, 0x10, 0xC4, 0x11, 0x54, 0x11, 0x54, 0x10, 0xCA, 0x10, 0xD0, 0x10, 0xD6, 0x10, 0xDC, 0x10, 0xE2, 0x10, 0xE8, 0x10, 0xE2, 0x10, 0xE8, 0x13, 0x6A, 0x13, 0x70, 0x11, 0x8A, 0x12, 0x80, 0x11, 0x8A, 0x11, 0x8A, 0x12, 0x80, 0x10, 0xEE, 0x10, 0xF4, 0x10, 0xFA, 0x12, 0x68, 0x10, 0xFA, 0x12, 0x68, 0x10, 0xFA, 0x12, 0x68, 0x11, 0x36, 0x11, 0x3C, 0x11, 0x0, 0x11, 0x6, 0x11, 0xB4, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x12, 0x92, 0x13, 0x9A, 0x12, 0x92, 0x11, 0xC, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x11, 0x12, 0x11, 0x18, 0x11, 0x12, 0x11, 0x18, 0x11, 0x12, 0x11, 0x18, 0x11, 0x12, 0x11, 0x18, 0x11, 0x12, 0x11, 0x18, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x11, 0x1E, 0x11, 0x24, 0x11, 0x1E, 0x11, 0x24, 0x11, 0x1E, 0x11, 0x24, 0x11, 0x1E, 0x11, 0x24, 0x11, 0x1E, 0x11, 0x24, 0x12, 0xA4, 0x12, 0x68, 0x12, 0xA4, 0x12, 0x68, 0x12, 0xA4, 0x12, 0x68, 0x11, 0x2A, 0x12, 0x1A, 0x11, 0x30, 0x11, 0x36, 0x11, 0x3C, 0x11, 0x42, 0x11, 0x48, 0x12, 0x56, 0x11, 0x42, 0x11, 0x48, 0x11, 0x4E, 0x12, 0xA4, 0x12, 0x3E, 0x12, 0x44, 0x12, 0x74, 0x11, 0xBA, 0x12, 0x80, 0x13, 0x52, 0x13, 0x58, 0x12, 0x92, 0x13, 0x9A, 0x13, 0x6A, 0x13, 0x70, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x11, 0x54, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x11, 0x5A, 0x11, 0x60, 0x11, 0xC6, 0x12, 0x80, 0x11, 0xCC, 0x11, 0xD2, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x11, 0xC6, 0x12, 0x80, 0x11, 0xF0, 0x11, 0xF6, 0x13, 0x52, 0x13, 0x58, 0x13, 0x52, 0x13, 0x58, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x12, 0x92, 0x13, 0x9A, 0x12, 0x92, 0x13, 0x9A, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x12, 0x2, 0x12, 0x8, 0x12, 0x2, 0x12, 0x8, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x86, 0x12, 0x56, 0x13, 0x52, 0x13, 0x58, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x12, 0xA4, 0x12, 0x68, 0x12, 0x80, 0x11, 0x66, 0x11, 0x6C, 0x11, 0x72, 0x11, 0x78, 0x11, 0x7E, 0x11, 0xA8, 0x11, 0x84, 0x11, 0x8A, 0x11, 0xA2, 0x11, 0xE4, 0x13, 0x6A, 0x11, 0x90, 0x12, 0x38, 0x12, 0x62, 0x11, 0x96, 0x11, 0x9C, 0x11, 0x96, 0x11, 0x9C, 0x11, 0x96, 0x11, 0x9C, 0x11, 0xA2, 0x11, 0xA8, 0x11, 0xAE, 0x11, 0xB4, 0x11, 0xAE, 0x11, 0xB4, 0x11, 0xAE, 0x11, 0xB4, 0x11, 0xAE, 0x11, 0xB4, 0x11, 0xAE, 0x11, 0xB4, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x5E, 0x13, 0x64, 0x11, 0xBA, 0x11, 0xC0, 0x11, 0xC6, 0x12, 0x80, 0x12, 0x86, 0x12, 0x56, 0x12, 0x86, 0x12, 0x56, 0x12, 0x86, 0x12, 0x56, 0x12, 0x86, 0x12, 0x56, 0x11, 0xCC, 0x11, 0xD2, 0x11, 0xCC, 0x11, 0xD2, 0x11, 0xCC, 0x11, 0xD2, 0x11, 0xD8, 0x11, 0xDE, 0x11, 0xD8, 0x11, 0xDE, 0x11, 0xD8, 0x11, 0xDE, 0x11, 0xD8, 0x11, 0xDE, 0x11, 0xE4, 0x11, 0xEA, 0x11, 0xE4, 0x11, 0xEA, 0x11, 0xF0, 0x11, 0xF6, 0x11, 0xF0, 0x11, 0xF6, 0x11, 0xF0, 0x11, 0xF6, 0x11, 0xF0, 0x11, 0xF6, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x6A, 0x13, 0x70, 0x12, 0xAA, 0x11, 0xFC, 0x12, 0xAA, 0x11, 0xFC, 0x12, 0x2, 0x12, 0x8, 0x12, 0x2, 0x12, 0x8, 0x12, 0x2, 0x12, 0x8, 0x12, 0x2, 0x12, 0x8, 0x12, 0xE, 0x12, 0x14, 0x12, 0xE, 0x12, 0x14, 0x12, 0xE, 0x12, 0x14, 0x12, 0xE, 0x12, 0x14, 0x12, 0xE, 0x12, 0x14, 0x12, 0x1A, 0x12, 0x5C, 0x12, 0x1A, 0x12, 0x5C, 0x12, 0x1A, 0x12, 0x5C, 0x12, 0x1A, 0x12, 0x5C, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x20, 0x12, 0x26, 0x12, 0x2C, 0x12, 0x32, 0x12, 0x2C, 0x12, 0x32, 0x12, 0x38, 0x12, 0x62, 0x12, 0x38, 0x12, 0x62, 0x12, 0x3E, 0x12, 0x44, 0x12, 0x3E, 0x12, 0x44, 0x12, 0xA4, 0x12, 0x68, 0x12, 0x4A, 0x12, 0x50, 0x12, 0x4A, 0x12, 0x50, 0x12, 0x4A, 0x12, 0x50, 0x12, 0x56, 0x12, 0x5C, 0x12, 0x62, 0x12, 0x68, 0x13, 0x58, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x12, 0x74, 0x12, 0x74, 0x12, 0x74, 0x12, 0x74, 0x12, 0x74, 0x12, 0x74, 0x13, 0x5E, 0x13, 0x5E, 0x13, 0x5E, 0x13, 0x5E, 0x13, 0x5E, 0x13, 0x5E, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x92, 0x12, 0x92, 0x12, 0x92, 0x12, 0x92, 0x12, 0x92, 0x12, 0x92, 0x12, 0x92, 0x12, 0x92, 0x13, 0x70, 0x13, 0x70, 0x13, 0x70, 0x13, 0x70, 0x13, 0x70, 0x13, 0x70, 0x12, 0xB6, 0x12, 0xB6, 0x12, 0x6E, 0x12, 0x6E, 0x12, 0x6E, 0x12, 0x6E, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0xA4, 0x12, 0xA4, 0x12, 0xA4, 0x12, 0xA4, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x74, 0x12, 0x74, 0x12, 0x80, 0x12, 0x80, 0x12, 0x8C, 0x12, 0x8C, 0x13, 0x70, 0x13, 0x70, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x12, 0x7A, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x13, 0x52, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x13, 0x5E, 0x13, 0x5E, 0x12, 0x86, 0x12, 0x86, 0x12, 0x86, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x8C, 0x12, 0x92, 0x12, 0x92, 0x12, 0x92, 0x12, 0x92, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0x98, 0x12, 0x98, 0x12, 0x9E, 0x12, 0x9E, 0x12, 0xA4, 0x12, 0xA4, 0x12, 0xA4, 0x12, 0xA4, 0x12, 0xAA, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB0, 0x12, 0xB6, 0x12, 0xB6, 0x13, 0x76, 0x12, 0xBC, 0x12, 0xC2, 0x12, 0xC8, 0x12, 0xCE, 0x12, 0xD4, 0x13, 0x76, 0x12, 0xF2, 0x13, 0x7C, 0x12, 0xDA, 0x13, 0x1C, 0x12, 0xE6, 0x12, 0xEC, 0x12, 0xFE, 0x12, 0xE0, 0x13, 0x82, 0x13, 0x4, 0x13, 0xA, 0x13, 0x4C, 0x13, 0x10, 0x12, 0xE6, 0x13, 0x4C, 0x13, 0x7C, 0x12, 0xF8, 0x13, 0x40, 0x12, 0xE6, 0x12, 0xE6, 0x13, 0x34, 0x12, 0xEC, 0x13, 0x2E, 0x13, 0x76, 0x12, 0xF2, 0x12, 0xF8, 0x13, 0x7C, 0x13, 0x28, 0x12, 0xFE, 0x13, 0x1C, 0x13, 0x82, 0x13, 0x4, 0x13, 0x22, 0x13, 0xA, 0x13, 0x10, 0x13, 0x16, 0x13, 0x1C, 0x13, 0x22, 0x13, 0x4C, 0x13, 0x28, 0x13, 0x2E, 0x13, 0x34, 0x13, 0x3A, 0x13, 0x82, 0x13, 0x40, 0x13, 0x46, 0x13, 0x46, 0x13, 0x46, 0x13, 0x4C, 0x13, 0x52, 0x13, 0x58, 0x13, 0x5E, 0x13, 0x64, 0x13, 0x6A, 0x13, 0x70, 0x13, 0x76, 0x13, 0x7C, 0x13, 0x82, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x8E, 0x13, 0x8E, 0x13, 0x8E, 0x13, 0x8E, 0x13, 0x8E, 0x13, 0x8E, 0x13, 0x8E, 0x13, 0x8E, 0x13, 0x8E, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x94, 0x13, 0x9A, 0x13, 0x9A, 0x0, 0x1, 0x2, 0x4F, 0x6, 0x9B, 0x0, 0x1, 0x5, 0x94, 0x6, 0x40, 0x0, 0x1, 0x7, 0xB4, 0x6, 0x40, 0x0, 0x1, 0x7, 0x3B, 0x5, 0xA, 0x0, 0x1, 0x2, 0xD, 0x6, 0xBE, 0x0, 0x1, 0x4, 0xDA, 0x6, 0x47, 0x0, 0x1, 0x5, 0x89, 0x6, 0x40, 0x0, 0x1, 0x4, 0xD6, 0x6, 0x40, 0x0, 0x1, 0x2, 0xC6, 0x6, 0x48, 0x0, 0x1, 0x2, 0xC6, 0x6, 0x9B, 0x0, 0x1, 0x4, 0x91, 0x6, 0x48, 0x0, 0x1, 0x4, 0x14, 0x5, 0xA, 0x0, 0x1, 0x5, 0x8B, 0x6, 0x55, 0x0, 0x1, 0x4, 0xA0, 0x6, 0x40, 0x0, 0x1, 0x5, 0x5B, 0x6, 0x4C, 0x0, 0x1, 0x6, 0x43, 0x6, 0x40, 0x0, 0x1, 0x4, 0xCC, 0x6, 0x41, 0x0, 0x1, 0x2, 0xDF, 0x6, 0x40, 0x0, 0x1, 0x5, 0x43, 0x6, 0x40, 0x0, 0x1, 0x3, 0x2D, 0x5, 0xA, 0x0, 0x1, 0x5, 0x95, 0x6, 0x40, 0x0, 0x1, 0x4, 0x52, 0x5, 0xA, 0x0, 0x1, 0x4, 0xB8, 0x5, 0xA, 0x0, 0x1, 0x4, 0x82, 0x6, 0xA4, 0x0, 0x1, 0x4, 0x47, 0x5, 0xA, 0x0, 0x1, 0x4, 0xDA, 0x6, 0x63, 0x0, 0x1, 0x5, 0xC1, 0x5, 0xA, 0x0, 0x1, 0x4, 0x61, 0x5, 0xA, 0x0, 0x1, 0x5, 0xD6, 0x5, 0xA, 0x0, 0x1, 0x2, 0xBA, 0x5, 0xA, 0x0, 0x1, 0x4, 0xE4, 0x5, 0xA, 0x0, 0x1, 0x4, 0xDB, 0x5, 0xA, 0x0, 0x1, 0x4, 0x76, 0x5, 0xA, 0x0, 0x1, 0x5, 0x1B, 0x5, 0xA, 0x0, 0x1, 0x4, 0x71, 0x5, 0xA, 0x0, 0x1, 0x4, 0x71, 0x6, 0xA4, 0x0, 0x1, 0x2, 0xC6, 0x6, 0x40, 0x0, 0x1, 0x2, 0x78, 0x5, 0xA, 0x0, 0x1, 0x2, 0xD7, 0x5, 0xA, 0x0, 0x1, 0x3, 0x6, 0x6, 0x40, 0x0, 0x1, 0x3, 0xD3, 0x6, 0x40, 0x0, 0x1, 0x2, 0xA6, 0x6, 0x40, 0x0, 0x1, 0x4, 0xD0, 0x5, 0xA, 0x0, 0x1, 0x4, 0xCF, 0x5, 0xA, 0x0, 0x1, 0x4, 0x86, 0x5, 0xA, 0x0, 0x1, 0x6, 0xA8, 0x5, 0xA, 0x0, 0x1, 0x6, 0x93, 0x5, 0xA, 0x0, 0x1, 0x4, 0xD4, 0x6, 0x40, 0x0, 0x1, 0x2, 0xD0, 0x6, 0x40, 0x0, 0x1, 0x3, 0x2A, 0x5, 0xA, 0x0, 0x1, 0x2, 0x68, 0x5, 0xA, 0x0, 0x1, 0x3, 0x4C, 0x5, 0xA, 0x0, 0x1, 0x3, 0xF2, 0x6, 0xA4, 0x0, 0x1, 0x2, 0xAA, 0x6, 0x40, 0x0, 0x1, 0x2, 0xC1, 0x6, 0x40, 0x0, 0x1, 0x5, 0x3E, 0x5, 0xA, 0x0, 0x1, 0x4, 0x60, 0x5, 0xA, 0x0, 0x1, 0x5, 0xF0, 0x5, 0xA, 0x0, 0x1, 0x3, 0xE7, 0x6, 0x40, 0x0, 0x1, 0x4, 0x39, 0x5, 0xA, 0x0, 0x1, 0x4, 0x93, 0x5, 0xA, 0x0, 0x1, 0x5, 0x1, 0x5, 0xA, 0x0, 0x1, 0x4, 0x8D, 0x5, 0xA, 0x0, 0x1, 0x4, 0xA3, 0x5, 0xA, 0x0, 0x1, 0x5, 0x86, 0x6, 0x61, 0x0, 0x1, 0x4, 0x43, 0x5, 0xA, 0x0, 0x1, 0x5, 0x11, 0x5, 0xA, 0x0, 0x1, 0x3, 0xAD, 0x6, 0x40, 0x0, 0x1, 0x3, 0x8B, 0x5, 0xA, 0x0, 0x1, 0x4, 0xDA, 0x6, 0x40, 0x0, 0x1, 0x4, 0x31, 0x6, 0x61, 0x0, 0x1, 0x7, 0xB8, 0x6, 0x40, 0x0, 0x1, 0x7, 0x64, 0x6, 0x40, 0x0, 0x1, 0x8, 0xB2, 0x6, 0x40, 0x0, 0x1, 0x5, 0xDD, 0x6, 0x40, 0x0, 0x1, 0x4, 0x95, 0x6, 0xA4, 0x0, 0x1, 0x6, 0x3D, 0x6, 0x40, 0x0, 0x1, 0x6, 0xD3, 0x6, 0xA4, 0x0, 0x1, 0x5, 0x75, 0x6, 0x40, 0x0, 0x1, 0x5, 0x35, 0x6, 0x40, 0x0, 0x1, 0x3, 0xC6, 0x6, 0x40, 0x0, 0x1, 0x3, 0xDD, 0x6, 0x40, 0x0, 0x1, 0x5, 0x57, 0x5, 0xA, 0x0, 0x1, 0x3, 0xEE, 0x6, 0x47, 0x0, 0x1, 0x6, 0x71, 0x4, 0xFC, 0x0, 0x1, 0x5, 0x5A, 0x6, 0x40, 0x0, 0x1, 0x7, 0x54, 0x6, 0x40, 0x0, 0x1, 0x4, 0xF7, 0x6, 0x4C, 0x0, 0x1, 0x4, 0xF7, 0x4, 0xF5, 0x0, 0x1, 0x5, 0xD3, 0x6, 0xCC, 0x0, 0x1, 0x4, 0xD4, 0x4, 0xF5, 0x0, 0x1, 0x6, 0x8F, 0x4, 0xF5, 0x0, 0x1, 0x6, 0xEC, 0x4, 0xF5, 0x0, 0x1, 0x6, 0x84, 0x4, 0xF5, 0x0, 0x1, 0x4, 0x70, 0x4, 0xF5, 0x0, 0x1, 0x7, 0x49, 0x6, 0x41, 0x0, 0x1, 0x6, 0x50, 0x4, 0xFC, 0x0, 0x1, 0x3, 0xF0, 0x6, 0xCC, 0x0, 0x1, 0x4, 0x89, 0x5, 0x50, 0x0, 0x1, 0x6, 0x50, 0x6, 0x40, 0x0, 0x1, 0x5, 0x1B, 0x6, 0x61, 0x0, 0x1, 0x4, 0x4A, 0x5, 0xC, 0x0, 0x1, 0x6, 0x2B, 0x6, 0x56, 0x0, 0x1, 0x5, 0x0, 0x5, 0xA, 0x0, 0x1, 0x6, 0x3, 0x4, 0xF5, 0x0, 0x1, 0x6, 0x53, 0x6, 0x4C, 0x0, 0x1, 0x7, 0xFE, 0x6, 0x4C, 0x0, 0x1, 0x5, 0x4, 0x6, 0x61, 0x0, 0x1, 0x4, 0x2D, 0x5, 0xA, 0x0, 0x1, 0x5, 0xAA, 0x6, 0x4C, 0x0, 0x1, 0x5, 0x56, 0x6, 0x61, 0x0, 0x1, 0x5, 0x87, 0x6, 0x4C, 0x0, 0x1, 0x4, 0x9A, 0x4, 0xF5, 0x0, 0x1, 0x6, 0xC1, 0x5, 0xA, 0x0, 0x1, 0x4, 0x8A, 0x5, 0xA, 0x0, 0x1, 0x4, 0xEE, 0x5, 0xA, 0x0, 0x1, 0x4, 0xA, 0x5, 0xA, 0x0, 0x1, 0x4, 0x17, 0x5, 0xA, 0x0, 0x1, 0x2, 0x7, 0x5, 0xA, 0x0, 0x1, 0x3, 0xF0, 0x5, 0xA, 0x0, 0x1, 0x4, 0x6D, 0x5, 0xA, 0x0, 0x1, 0x3, 0xB4, 0x5, 0xA, 0x0, 0x1, 0x5, 0xEB, 0x5, 0xA, 0x0, 0x1, 0x4, 0x9E, 0x5, 0xA, 0x0, 0x1, 0x7, 0x3E, 0x5, 0xA, 0x0, 0x1, 0x3, 0xE6, 0x5, 0xA, 0x0, 0x1, 0x4, 0x7A, 0x5, 0xA, 0x0, 0x1, 0x4, 0xF2, 0x5, 0xA, 0x0, 0x1, 0x3, 0xF7, 0x5, 0xA, 0x0, 0x1, 0x5, 0xF4, 0x5, 0xA, 0x0, 0x1, 0x4, 0x25, 0x5, 0xA, 0x0, 0x1, 0x4, 0xCA, 0x5, 0xA, 0x0, 0x1, 0x3, 0x65, 0x5, 0xA, 0x0, 0x1, 0x4, 0xA0, 0x5, 0xA, 0x0, 0x1, 0x4, 0xAB, 0x5, 0xA, 0x0, 0x1, 0x4, 0x6C, 0x5, 0xA, 0x0, 0x1, 0x5, 0x52, 0x5, 0xA, 0x0, 0x1, 0x4, 0xA4, 0x5, 0xA, 0x0, 0x1, 0x6, 0xFC, 0x5, 0xA, 0x0, 0x1, 0x5, 0xF, 0x6, 0x40, 0x0, 0x1, 0x3, 0x56, 0x6, 0xA4, 0x0, 0x1, 0x7, 0xD7, 0x5, 0xA, 0x0, 0x1, 0x5, 0x4D, 0x5, 0xA, 0x0, 0x1, 0x4, 0xF1, 0x5, 0xA, 0x0, 0x1, 0x3, 0x57, 0x5, 0xA, 0x0, 0x1, 0x3, 0x1D, 0x5, 0xA, 0x0, 0x1, 0x4, 0x51, 0x5, 0xA, 0x0, 0x1, 0x3, 0x1D, 0x6, 0x40, 0x0, 0x1, 0x4, 0x28, 0x5, 0xA, 0x0, 0x1, 0x4, 0x63, 0x5, 0xA, 0x0, 0x1, 0x6, 0xE1, 0x6, 0x40, 0x0, 0x1, 0x2, 0xE5, 0x5, 0xA, 0x0, 0x1, 0x5, 0x17, 0x5, 0xA, 0x0, 0x1, 0x5, 0x5F, 0x5, 0xA, 0x0, 0x1, 0x4, 0xF0, 0x5, 0xA, 0x0, 0x1, 0x4, 0x82, 0x6, 0x40, 0x0, 0x1, 0x4, 0xCC, 0x6, 0x40, 0x0, 0x1, 0x2, 0xD6, 0x6, 0xA1, 0x0, 0x1, 0x5, 0xBB, 0x5, 0xA, 0x0, 0x1, 0x4, 0x64, 0x6, 0x40, 0x0, 0x1, 0x2, 0x56, 0x6, 0xA4, 0x0, 0x1, 0x7, 0x43, 0x5, 0xA, 0x0, 0x1, 0x4, 0xC6, 0x5, 0xA, 0x0, 0x1, 0x4, 0x81, 0x5, 0xA, 0x0, 0x1, 0x3, 0xA4, 0x6, 0xA4, 0x0, 0x1, 0x3, 0xF6, 0x5, 0xA, 0x0, 0x1, 0x4, 0x1C, 0x5, 0xA, 0x0, 0x1, 0x4, 0xD5, 0x5, 0xA, 0x0, 0x1, 0x5, 0x2A, 0x5, 0xA, 0x0, 0x1, 0x4, 0xAE, 0x6, 0x40, 0x0, 0x1, 0x4, 0x79, 0x5, 0xA, 0x0, 0x1, 0x4, 0x8C, 0x5, 0xA, 0x0, 0x1, 0x4, 0x5A, 0x5, 0xA, 0x0, 0x1, 0x5, 0x77, 0x5, 0xA, 0x0, 0x1, 0x2, 0x8A, 0x6, 0x40, 0x0, 0x1, 0x4, 0x38, 0x5, 0xA, 0x0, 0x1, 0x3, 0x4C, 0x6, 0xA4, 0x0, 0x1, 0x5, 0xF, 0x5, 0xA, 0x0, 0x1, 0x4, 0xA7, 0x5, 0xA, 0x0, 0x1, 0x2, 0xA0, 0x6, 0x48, 0x0, 0x1, 0x2, 0x82, 0x6, 0x40, 0x0, 0x1, 0x2, 0x94, 0x6, 0x48, 0x0, 0x1, 0x2, 0x7E, 0x5, 0x3, 0x0, 0x1, 0x4, 0x7C, 0x5, 0x28, 0x0, 0x1, 0x3, 0xC6, 0x5, 0x28, 0x0, 0x1, 0x6, 0x3A, 0x5, 0x28, 0x0, 0x1, 0x6, 0x20, 0x5, 0x28, 0x0, 0x1, 0x6, 0x92, 0x5, 0x28, 0x0, 0x1, 0x4, 0x88, 0x5, 0x28, 0x0, 0x1, 0x5, 0xF1, 0x5, 0x28, 0x0, 0x1, 0x4, 0x8C, 0x5, 0x28, 0x0, 0x1, 0x4, 0xD2, 0x5, 0x28, 0x0, 0x1, 0x5, 0x44, 0x6, 0x4C, 0x0, 0x1, 0x4, 0x31, 0x6, 0x47, 0x0, 0x1, 0x8, 0xAC, 0x6, 0x69, 0x0, 0x1, 0x2, 0x42, 0x5, 0x3, 0x0, 0x1, 0x2, 0xE6, 0x4, 0xE8, 0x0, 0x1, 0x2, 0xD3, 0x5, 0x3, 0x0, 0x1, 0x3, 0xAD, 0x5, 0x3, 0x0, 0x1, 0x4, 0xEE, 0x6, 0x47, 0x0, 0x1, 0x4, 0x9D, 0x5, 0xA, 0x0, 0x1, 0x5, 0xA9, 0x5, 0xA, 0x0, 0x1, 0x5, 0x9D, 0x6, 0x47, 0x0, 0x1, 0x3, 0xC4, 0x5, 0x28, 0x0, 0x1, 0x4, 0x9, 0x5, 0x28, 0x0, 0x1, 0x4, 0xF4, 0x5, 0x28, 0x0, 0x1, 0x5, 0x58, 0x6, 0x48, 0x0, 0x1, 0x4, 0x8F, 0x6, 0x68, 0x0, 0x1, 0x5, 0x1B, 0x6, 0x47, 0x0, 0x1, 0x2, 0xA2, 0x6, 0x9B, 0x0, 0x1, 0x2, 0xE8, 0x6, 0x9B, 0x0, 0x1, 0x2, 0xD2, 0x5, 0xC4, 0x0, 0x1, 0x5, 0x85, 0x6, 0x8A, 0x0, 0x1, 0x4, 0x89, 0x5, 0x7, 0x0, 0x1, 0x4, 0x7B, 0x5, 0x28, 0x0, 0x1, 0x4, 0xA7, 0x5, 0x28, 0x0, 0x1, 0x4, 0x5D, 0x5, 0x28, 0x0, 0x1, 0x4, 0x84, 0x5, 0x28, 0x0, 0x1, 0x5, 0x44, 0x6, 0x40, 0x0, 0x1, 0x4, 0x98, 0x5, 0xA, 0x0, 0x1, 0x4, 0x6F, 0x4, 0xFC, 0x0, 0x1, 0x2, 0x27, 0x4, 0xE8, 0x0, 0x1, 0x5, 0xCA, 0x4, 0xF5, 0x0, 0x1, 0x5, 0x1A, 0x6, 0x1C, 0x0, 0x1, 0x4, 0xF, 0x4, 0xEF, 0x0, 0x1, 0x5, 0x89, 0x6, 0x19, 0x0, 0x1, 0x7, 0xA2, 0x6, 0x48, 0x0, 0x1, 0x6, 0x77, 0x4, 0xFC, 0x0, 0x1, 0x4, 0xD6, 0x6, 0x55, 0x0, 0x1, 0x4, 0x17, 0x5, 0x9, 0x0, 0x1, 0x5, 0xA9, 0x6, 0x48, 0x0, 0x1, 0x4, 0x98, 0x4, 0xFC, 0x0, 0x1, 0x5, 0x51, 0x6, 0x56, 0x0, 0x1, 0x4, 0x3D, 0x5, 0xA, 0x0, 0x1, 0x5, 0xA, 0x6, 0x48, 0x0, 0x1, 0x6, 0xF9, 0x6, 0x48, 0x0, 0x1, 0x6, 0x6F, 0x4, 0xFC, 0x0, 0x1, 0x2, 0xC, 0x6, 0x40, 0x0, 0x1, 0x5, 0x8A, 0x6, 0x3E, 0x0, 0x1, 0x4, 0x9F, 0x5, 0xA, 0x0, 0x1, 0x5, 0xA5, 0x6, 0x4C, 0x0, 0x1, 0x4, 0xF2, 0x4, 0xF5, 0x0, 0x1, 0x4, 0xA3, 0x6, 0x47, 0x0, 0x1, 0x3, 0xF6, 0x4, 0xF5, 0x0, 0x1, 0x5, 0x89, 0x6, 0x48, 0x0, 0x1, 0x4, 0x66, 0x4, 0xFC, 0x0, 0x1, 0x4, 0x75, 0x6, 0x48, 0x0, 0x1, 0x3, 0x5B, 0x4, 0xFC, 0x0, 0x1, 0x4, 0x45, 0x6, 0x47, 0x0, 0x1, 0x4, 0x3D, 0x5, 0xB, 0x0, 0x1, 0x7, 0x85, 0x6, 0x4C, 0x0, 0x1, 0x6, 0xC1, 0x5, 0xB, 0x0, 0x1, 0x4, 0x90, 0x4, 0xF5, 0x0, 0x1, 0x4, 0x98, 0x4, 0xF5, 0x0, 0x1, 0x4, 0x71, 0x6, 0x41, 0x0, 0x1, 0x4, 0xDF, 0x6, 0x4C, 0x0, 0x1, 0x4, 0x7B, 0x6, 0x4C, 0x0, 0x1, 0x2, 0x1, 0x6, 0x40, 0x0, 0x1, 0x5, 0x7B, 0x6, 0x45, 0x0, 0x1, 0x4, 0x8B, 0x5, 0xA, 0x0, 0x1, 0x5, 0xD, 0x6, 0x4C, 0x0, 0x1, 0x4, 0x81, 0x6, 0x47, 0x0, 0x1, 0x5, 0x39, 0x6, 0x55, 0x0, 0x1, 0x4, 0x31, 0x5, 0xA, 0x0, 0x1, 0x5, 0x3A, 0x6, 0x48, 0x0, 0x1, 0x4, 0x85, 0x6, 0x47, 0x0, 0x1, 0x4, 0x66, 0x6, 0x4C, 0x0, 0x1, 0x2, 0xD6, 0x6, 0xBE, 0x0, 0x1, 0x5, 0x73, 0x6, 0x55, 0x0, 0x1, 0x5, 0xB, 0x6, 0x41, 0x0, 0x1, 0x3, 0xAB, 0x6, 0x47, 0x0, 0x1, 0x4, 0x55, 0x6, 0x40, 0x0, 0x1, 0x2, 0xC, 0x6, 0x9B, 0x0, 0x1, 0x7, 0x1, 0x6, 0x40, 0x0, 0x1, 0x6, 0xF7, 0x5, 0xA, 0x0, 0x1, 0x5, 0xAF, 0x6, 0x40, 0x0, 0x1, 0x4, 0x73, 0x5, 0xA, 0x0, 0x1, 0x4, 0x81, 0x5, 0x0, 0x0, 0x1, 0x4, 0xFF, 0x6, 0x40, 0x0, 0x1, 0x2, 0xD0, 0x5, 0xA, 0x0, 0x1, 0x4, 0xD5, 0x6, 0x40, 0x0, 0x1, 0x4, 0x22, 0x5, 0xA, 0x0, 0x1, 0x4, 0xDC, 0x6, 0x40, 0x0, 0x1, 0x5, 0x38, 0x6, 0x40, 0x0, 0x1, 0x4, 0x72, 0x5, 0xA, 0x0, 0x1, 0x5, 0x2E, 0x6, 0x4C, 0x0, 0x1, 0x3, 0xF6, 0x5, 0x0, 0x0, 0x1, 0x7, 0xB, 0x6, 0x40, 0x0, 0x1, 0x5, 0x10, 0x6, 0x4C, 0x0, 0x1, 0x4, 0x7, 0x5, 0x0, 0x0, 0x1, 0x4, 0xD2, 0x6, 0x40, 0x0, 0x1, 0x4, 0x7, 0x5, 0xA, 0x0, 0x1, 0x4, 0x71, 0x6, 0x68, 0x0, 0x1, 0x2, 0xAA, 0x5, 0xC4, 0x0, 0x1, 0x5, 0xF2, 0x5, 0xA, 0x0, 0x1, 0x3, 0xE5, 0x5, 0xA, 0x0, 0x1, 0x5, 0xCC, 0x6, 0x40, 0x0, 0x1, 0x4, 0x61, 0x5, 0x9, 0x0, 0x1, 0x4, 0x85, 0x5, 0xA, 0x0, 0x1, 0x4, 0x89, 0x5, 0xA, 0x0, 0x1, 0x5, 0xB0, 0x6, 0x48, 0x0, 0x1, 0x2, 0xAA, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x42, 0x6, 0x48, 0x0, 0x1, 0x4, 0x89, 0x5, 0x0, 0x0, 0x1, 0x4, 0x61, 0x4, 0xFC, 0x0, 0x1, 0x4, 0xE0, 0x6, 0x40, 0x0, 0x1, 0x5, 0x1E, 0x6, 0x4C, 0x0, 0x1, 0x6, 0x95, 0x4, 0xFA, 0x0, 0x1, 0x5, 0x9A, 0x6, 0x40, 0x0, 0x1, 0x4, 0x1D, 0x5, 0x28, 0x0, 0x1, 0x5, 0x1A, 0x5, 0x28, 0x0, 0x1, 0x2, 0x39, 0x5, 0x28, 0x0, 0x1, 0x4, 0xCA, 0x5, 0x28, 0x0, 0x1, 0x4, 0x79, 0x5, 0x28, 0x0, 0x1, 0x4, 0x2A, 0x5, 0x28, 0x0, 0x1, 0x4, 0xDD, 0x5, 0x28, 0x0, 0x1, 0x1, 0xFD, 0x5, 0x28, 0x0, 0x1, 0x4, 0x5C, 0x5, 0x28, 0x0, 0x1, 0x4, 0x61, 0x5, 0x28, 0x0, 0x1, 0x3, 0xBA, 0x5, 0x28, 0x0, 0x1, 0x6, 0x6, 0x5, 0x28, 0x0, 0x1, 0x4, 0x6D, 0x5, 0x28, 0x0, 0x1, 0x4, 0x3C, 0x5, 0x28, 0x0, 0x1, 0x4, 0x5F, 0x5, 0x28, 0x0, 0x1, 0x4, 0x46, 0x5, 0x28, 0x0, 0x1, 0x4, 0xDE, 0x5, 0x28, 0x0, 0x1, 0x4, 0x80, 0x5, 0x28, 0x0, 0x1, 0x4, 0xE4, 0x5, 0x28, 0x0, 0x1, 0x4, 0x47, 0x5, 0x28, 0x0, 0x1, 0x3, 0xD6, 0x5, 0x28, 0x0, 0x1, 0x6, 0x47, 0x5, 0xA, 0x0, 0x1, 0x4, 0x35, 0x5, 0x28, 0x0, 0x1, 0x6, 0x8, 0x5, 0x28, 0x0, 0x1, 0x4, 0x3D, 0x5, 0x28, 0x0, 0x1, 0x5, 0x53, 0x6, 0x40, 0x0, 0x1, 0x4, 0x55, 0x5, 0xA, 0x0, 0x1, 0x4, 0x86, 0x6, 0x48, 0x0, 0x1, 0x4, 0x4B, 0x5, 0xA, 0x0, 0x1, 0x5, 0x86, 0x6, 0x40, 0x0, 0x1, 0x4, 0x8E, 0x5, 0xA, 0x0, 0x1, 0x4, 0x9E, 0x5, 0x28, 0x0, 0x1, 0x3, 0xE1, 0x5, 0x28, 0x0, 0x1, 0x4, 0xC0, 0x5, 0x28, 0x0, 0x1, 0x5, 0x75, 0x6, 0x5E, 0x0, 0x1, 0x5, 0x98, 0x6, 0x66, 0x0, 0x1, 0x5, 0xB0, 0x6, 0x5E, 0x0, 0x1, 0x2, 0x1B, 0x5, 0x3, 0x0, 0x9, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x4, 0x4A, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0xC, 0x0, 0x14, 0x0, 0x1, 0x0, 0x1C, 0x0, 0x32, 0x0, 0x1, 0x0, 0x2, 0x8, 0x9A, 0x8, 0x9D, 0x0, 0x1, 0x0, 0x2, 0x0, 0x93, 0x1, 0x31, 0x0, 0x2, 0x0, 0x0, 0x0, 0xA, 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, 0xFE, 0x9, 0x0, 0xD6, 0x0, 0x1, 0xFD, 0x41, 0x0, 0xD6, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0x0, 0x1, 0x3, 0x1B, 0xFE, 0xCE, 0x0, 0x1, 0x1, 0x64, 0xFE, 0xCB, 0x0, 0x9, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0xB, 0xFC, 0x0, 0x9, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0xC, 0x3A, 0x0, 0x9, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x6, 0x0, 0x0, 0xC, 0x64, 0x0, 0x6, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0xC, 0x0, 0x76, 0x0, 0x1, 0x0, 0xCE, 0x2, 0x62, 0x0, 0x2, 0x0, 0x11, 0x1, 0xC7, 0x1, 0xCA, 0x0, 0x0, 0x1, 0xCD, 0x1, 0xD1, 0x0, 0x4, 0x1, 0xD4, 0x1, 0xE4, 0x0, 0x9, 0x1, 0xEA, 0x1, 0xED, 0x0, 0x1A, 0x1, 0xF6, 0x1, 0xF6, 0x0, 0x1E, 0x1, 0xF8, 0x1, 0xFA, 0x0, 0x1F, 0x1, 0xFE, 0x1, 0xFF, 0x0, 0x22, 0x2, 0x4, 0x2, 0x7, 0x0, 0x24, 0x2, 0xA, 0x2, 0xB, 0x0, 0x28, 0x3, 0x25, 0x3, 0x28, 0x0, 0x2A, 0x3, 0xF1, 0x3, 0xF1, 0x0, 0x2E, 0x3, 0xF9, 0x3, 0xF9, 0x0, 0x2F, 0x3, 0xFE, 0x3, 0xFF, 0x0, 0x30, 0x4, 0x26, 0x4, 0x26, 0x0, 0x32, 0x4, 0x28, 0x4, 0x28, 0x0, 0x33, 0x8, 0x8F, 0x8, 0x95, 0x0, 0x34, 0x8, 0x98, 0x8, 0x98, 0x0, 0x3B, 0x0, 0x2, 0x0, 0xE, 0x0, 0x7A, 0x0, 0x7A, 0x0, 0x0, 0x1, 0x8C, 0x1, 0x8C, 0x0, 0x1, 0x1, 0xC7, 0x1, 0xCA, 0x0, 0x2, 0x1, 0xCD, 0x1, 0xD1, 0x0, 0x6, 0x1, 0xD4, 0x1, 0xD7, 0x0, 0xB, 0x1, 0xDA, 0x1, 0xE4, 0x0, 0xF, 0x1, 0xEA, 0x1, 0xED, 0x0, 0x1A, 0x1, 0xF6, 0x1, 0xF6, 0x0, 0x1E, 0x1, 0xF8, 0x1, 0xFA, 0x0, 0x1F, 0x1, 0xFE, 0x1, 0xFF, 0x0, 0x22, 0x2, 0x4, 0x2, 0x7, 0x0, 0x24, 0x2, 0xA, 0x2, 0xB, 0x0, 0x28, 0x7, 0x25, 0x7, 0x25, 0x0, 0x2A, 0x8, 0x8F, 0x8, 0x95, 0x0, 0x2B, 0x0, 0x3C, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, 0x0, 0xF2, 0x0, 0x0, 0x0, 0xF8, 0x0, 0x0, 0x0, 0xFE, 0x0, 0x0, 0x1, 0x4, 0x0, 0x0, 0x1, 0x7C, 0x0, 0x0, 0x1, 0x7C, 0x0, 0x0, 0x1, 0x7C, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, 0x1, 0x76, 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0xA, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, 0x28, 0x0, 0x0, 0x1, 0x7C, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x82, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x16, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, 0x1, 0x6A, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, 0x1, 0x82, 0x0, 0x0, 0x1, 0x1C, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x22, 0x0, 0x0, 0x1, 0x28, 0x0, 0x0, 0x1, 0x2E, 0x0, 0x0, 0x1, 0x34, 0x0, 0x0, 0x1, 0x3A, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x1, 0x46, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x8E, 0x0, 0x0, 0x1, 0x82, 0x0, 0x0, 0x1, 0x4C, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, 0x1, 0x58, 0x0, 0x0, 0x1, 0x5E, 0x0, 0x0, 0x1, 0x64, 0x0, 0x0, 0x1, 0x6A, 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, 0x1, 0x76, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x7C, 0x0, 0x0, 0x1, 0x82, 0x0, 0x0, 0x1, 0x88, 0x0, 0x0, 0x1, 0x8E, 0x0, 0x1, 0xFD, 0x9B, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xCF, 0xFF, 0xFC, 0x0, 0x1, 0xFD, 0xB0, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xED, 0xFF, 0xF9, 0x0, 0x1, 0xFD, 0xD0, 0x0, 0x0, 0x0, 0x1, 0xFD, 0x9C, 0x0, 0x3, 0x0, 0x1, 0xFD, 0x98, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xD4, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xEC, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xC8, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xC2, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xEA, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xB3, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xC9, 0x0, 0x17, 0x0, 0x1, 0xFD, 0xD6, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xDE, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xB9, 0x0, 0x0, 0x0, 0x1, 0xFE, 0x3C, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xC4, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xC9, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xB2, 0x0, 0x0, 0x0, 0x1, 0xFD, 0x68, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xA8, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xB6, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xB7, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xB8, 0x0, 0x0, 0x0, 0x1, 0xFD, 0xD9, 0x0, 0x0, 0x0, 0x32, 0x0, 0x66, 0x0, 0x6C, 0x0, 0x72, 0x0, 0x78, 0x0, 0x7E, 0x0, 0x84, 0x0, 0x8A, 0x0, 0x90, 0x0, 0x90, 0x0, 0x96, 0x0, 0x9C, 0x1, 0x3E, 0x1, 0x38, 0x1, 0x44, 0x0, 0xA2, 0x1, 0x4A, 0x0, 0xA8, 0x0, 0xAE, 0x0, 0xB4, 0x0, 0xBA, 0x0, 0xC0, 0x1, 0x50, 0x1, 0x56, 0x0, 0xC6, 0x0, 0xCC, 0x0, 0xD2, 0x0, 0xD8, 0x0, 0xDE, 0x0, 0xEA, 0x0, 0xE4, 0x1, 0x32, 0x0, 0xEA, 0x0, 0xF0, 0x0, 0xF6, 0x0, 0xFC, 0x1, 0x2, 0x1, 0x8, 0x1, 0xE, 0x1, 0x14, 0x1, 0x1A, 0x1, 0x20, 0x1, 0x26, 0x1, 0x2C, 0x1, 0x32, 0x1, 0x38, 0x1, 0x3E, 0x1, 0x44, 0x1, 0x4A, 0x1, 0x50, 0x1, 0x56, 0x0, 0x1, 0x0, 0xE1, 0xFE, 0x3D, 0x0, 0x1, 0x1, 0x35, 0xFE, 0x52, 0x0, 0x1, 0xFD, 0xB9, 0xFE, 0x7A, 0x0, 0x1, 0xFD, 0x9C, 0xFE, 0x7A, 0x0, 0x1, 0xFD, 0xCF, 0xFE, 0x24, 0x0, 0x1, 0xFD, 0xB1, 0xFE, 0x24, 0x0, 0x1, 0xFD, 0xED, 0xFE, 0x25, 0x0, 0x1, 0xFD, 0xB6, 0xFE, 0x3D, 0x0, 0x1, 0xFD, 0xB7, 0xFE, 0x15, 0x0, 0x1, 0xFD, 0xBB, 0xFE, 0xA5, 0x0, 0x1, 0xFD, 0xD0, 0xFD, 0xD7, 0x0, 0x1, 0xFD, 0xB8, 0xFE, 0x24, 0x0, 0x1, 0xFD, 0xB9, 0xFE, 0xAF, 0x0, 0x1, 0xFD, 0xB8, 0xFE, 0x68, 0x0, 0x1, 0xFD, 0xB8, 0xFE, 0x74, 0x0, 0x1, 0xFD, 0xB8, 0xFE, 0x8A, 0x0, 0x1, 0xFD, 0xB9, 0xFE, 0xC8, 0x0, 0x1, 0xFD, 0xB8, 0xFE, 0xAD, 0x0, 0x1, 0xFD, 0xB8, 0xFD, 0xF9, 0x0, 0x1, 0xFD, 0x98, 0xFE, 0x2B, 0x0, 0x1, 0xFD, 0xB8, 0xFE, 0x13, 0x0, 0x1, 0xFD, 0xB9, 0xFE, 0xB0, 0x0, 0x1, 0xFD, 0xB9, 0xFE, 0xE, 0x0, 0x1, 0xFD, 0xB7, 0xFE, 0xE, 0x0, 0x1, 0xFD, 0xD4, 0xFE, 0x6, 0x0, 0x1, 0xFD, 0xB8, 0xFD, 0xD8, 0x0, 0x1, 0xFD, 0xB8, 0xFD, 0xDA, 0x0, 0x1, 0xFD, 0xEC, 0xFD, 0xD7, 0x0, 0x1, 0xFD, 0xC8, 0xFD, 0xD6, 0x0, 0x1, 0xFD, 0xC2, 0xFD, 0xD7, 0x0, 0x1, 0xFD, 0xEA, 0xFD, 0xD7, 0x0, 0x1, 0xFD, 0xB3, 0xFD, 0xED, 0x0, 0x1, 0xFD, 0xC9, 0xFE, 0x1F, 0x0, 0x1, 0x0, 0xF5, 0xFF, 0x66, 0x0, 0x1, 0xFD, 0xB2, 0xFD, 0xF2, 0x0, 0x1, 0xFD, 0x68, 0xFE, 0x98, 0x0, 0x1, 0xFD, 0xA8, 0xFE, 0x91, 0x0, 0x1, 0xFD, 0xB8, 0xFE, 0x29, 0x0, 0x1, 0xFD, 0xBA, 0xFE, 0xE, 0x0, 0x1, 0xFD, 0xB7, 0xFE, 0x83, 0x0, 0x1, 0xFD, 0xB8, 0xFE, 0x59, 0x0, 0x1, 0x0, 0xC, 0x0, 0x14, 0x0, 0x1, 0x0, 0xA2, 0x0, 0xB8, 0x0, 0x1, 0x0, 0x2, 0x3, 0x2B, 0x3, 0x2C, 0x0, 0x2, 0x0, 0x17, 0x8, 0xC8, 0x9, 0x30, 0x0, 0x0, 0x9, 0x33, 0x9, 0xD4, 0x0, 0x69, 0xA, 0x12, 0xA, 0x13, 0x1, 0xB, 0xA, 0x16, 0xA, 0x17, 0x1, 0xD, 0xA, 0x19, 0xA, 0x19, 0x1, 0xF, 0xA, 0x1C, 0xA, 0x1D, 0x1, 0x10, 0xA, 0x22, 0xA, 0x29, 0x1, 0x12, 0xA, 0x2D, 0xA, 0x2D, 0x1, 0x1A, 0xA, 0x2F, 0xA, 0x32, 0x1, 0x1B, 0xA, 0x38, 0xA, 0x38, 0x1, 0x1F, 0xA, 0x5E, 0xA, 0x5E, 0x1, 0x20, 0xA, 0x6E, 0xA, 0xC5, 0x1, 0x21, 0xA, 0xE7, 0xA, 0xE7, 0x1, 0x79, 0xA, 0xEE, 0xB, 0xC, 0x1, 0x7A, 0xB, 0x10, 0xB, 0x3E, 0x1, 0x99, 0xB, 0x4D, 0xB, 0xD7, 0x1, 0xC8, 0xC, 0xB7, 0xC, 0xBC, 0x2, 0x53, 0xC, 0xBE, 0xC, 0xDD, 0x2, 0x59, 0xC, 0xDF, 0xC, 0xE6, 0x2, 0x79, 0xC, 0xE8, 0xC, 0xE9, 0x2, 0x81, 0xC, 0xEB, 0xC, 0xEB, 0x2, 0x83, 0xC, 0xED, 0xC, 0xFC, 0x2, 0x84, 0xD, 0x1D, 0xD, 0x1E, 0x2, 0x94, 0x0, 0x2, 0x0, 0x0, 0x0, 0xA, 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, 0xFD, 0xC3, 0x5, 0x46, 0x0, 0x1, 0xFD, 0xCF, 0x5, 0x46, 0x2, 0x96, 0x5, 0xD0, 0x5, 0xD0, 0x6, 0x8A, 0x6, 0x48, 0x6, 0x90, 0x7, 0x1A, 0x7, 0x1A, 0x7, 0x1A, 0x7, 0x1A, 0x7, 0x1A, 0x7, 0x1A, 0x7, 0x1A, 0x5, 0xC4, 0x7, 0x26, 0x7, 0x26, 0x7, 0x26, 0x7, 0x26, 0x5, 0xA6, 0x5, 0xA6, 0x5, 0xA6, 0x5, 0xA6, 0x6, 0x18, 0x7, 0x32, 0x7, 0x32, 0x7, 0x32, 0x7, 0x32, 0x7, 0x32, 0x6, 0x4E, 0x6, 0x4E, 0x6, 0x4E, 0x6, 0x4E, 0x6, 0x78, 0x7, 0x20, 0x7, 0x20, 0x7, 0x20, 0x7, 0x20, 0x7, 0x20, 0x7, 0x20, 0x7, 0x20, 0x5, 0xCA, 0x7, 0x2C, 0x7, 0x2C, 0x7, 0x2C, 0x7, 0x2C, 0x7, 0x50, 0x7, 0x50, 0x7, 0x50, 0x7, 0x50, 0x6, 0x1E, 0x7, 0x38, 0x7, 0x38, 0x7, 0x38, 0x7, 0x38, 0x7, 0x38, 0x6, 0x54, 0x6, 0x54, 0x6, 0x54, 0x6, 0x54, 0x6, 0x9C, 0x6, 0x9C, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x5, 0xC4, 0x5, 0xCA, 0x5, 0xC4, 0x5, 0xCA, 0x5, 0xC4, 0x5, 0xCA, 0x5, 0xC4, 0x5, 0xCA, 0x5, 0xD0, 0x5, 0xD6, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x5, 0xE8, 0x7, 0x2C, 0x5, 0xE8, 0x7, 0x2C, 0x5, 0xE8, 0x7, 0x2C, 0x5, 0xE8, 0x7, 0x2C, 0x5, 0xEE, 0x6, 0x8A, 0x5, 0xA6, 0x7, 0x50, 0x5, 0xA6, 0x7, 0x50, 0x5, 0xA6, 0x7, 0x50, 0x5, 0xA6, 0x5, 0x70, 0x5, 0xA6, 0x5, 0x2E, 0x5, 0x5E, 0x5, 0xF4, 0x5, 0xFA, 0x6, 0x0, 0x6, 0x6, 0x6, 0x0, 0x6, 0x6, 0x6, 0x0, 0x6, 0x6, 0x6, 0x0, 0x6, 0x6, 0x6, 0x18, 0x6, 0x1E, 0x6, 0x18, 0x6, 0x1E, 0x6, 0x18, 0x6, 0x1E, 0x6, 0x1E, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x6, 0x30, 0x6, 0x36, 0x6, 0x30, 0x6, 0x36, 0x6, 0x30, 0x6, 0x36, 0x6, 0x3C, 0x6, 0x42, 0x6, 0x3C, 0x6, 0x42, 0x6, 0x3C, 0x6, 0x42, 0x6, 0x3C, 0x6, 0x42, 0x6, 0x3C, 0x6, 0x42, 0x6, 0x48, 0x6, 0x90, 0x6, 0x48, 0x6, 0x90, 0x6, 0x48, 0x6, 0x90, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x66, 0x6, 0x96, 0x6, 0x78, 0x6, 0x9C, 0x6, 0x78, 0x6, 0x7E, 0x6, 0x84, 0x6, 0x7E, 0x6, 0x84, 0x6, 0x7E, 0x6, 0x84, 0x5, 0x9A, 0x5, 0xA0, 0x5, 0x34, 0x5, 0x3A, 0x5, 0x40, 0x5, 0x40, 0x6, 0xD2, 0x7, 0x3E, 0x7, 0x3E, 0x7, 0x3E, 0x7, 0x3E, 0x7, 0x3E, 0x7, 0x3E, 0x7, 0x3E, 0x6, 0xEA, 0x7, 0x44, 0x7, 0x44, 0x7, 0x44, 0x7, 0x44, 0x6, 0xAE, 0x6, 0xAE, 0x6, 0xAE, 0x6, 0xAE, 0x6, 0xA8, 0x7, 0x4A, 0x7, 0x4A, 0x7, 0x4A, 0x7, 0x4A, 0x7, 0x4A, 0x5, 0x58, 0x5, 0x58, 0x5, 0x58, 0x5, 0x58, 0x7, 0x14, 0x7, 0x3E, 0x7, 0x3E, 0x7, 0x3E, 0x6, 0xEA, 0x6, 0xEA, 0x6, 0xEA, 0x6, 0xEA, 0x5, 0x40, 0x7, 0x44, 0x7, 0x44, 0x7, 0x44, 0x7, 0x44, 0x7, 0x44, 0x5, 0x46, 0x5, 0x46, 0x5, 0x46, 0x5, 0x46, 0x6, 0xE4, 0x6, 0xAE, 0x6, 0xAE, 0x6, 0xAE, 0x6, 0xAE, 0x6, 0xAE, 0x6, 0xFC, 0x6, 0xB4, 0x5, 0x4C, 0x5, 0x4C, 0x5, 0x4C, 0x5, 0x4C, 0x6, 0xA8, 0x6, 0xA8, 0x6, 0xA8, 0x7, 0x4A, 0x7, 0x4A, 0x7, 0x4A, 0x7, 0x4A, 0x5, 0x52, 0x5, 0x52, 0x5, 0x52, 0x7, 0x8, 0x7, 0x8, 0x7, 0x8, 0x7, 0x8, 0x6, 0xD2, 0x6, 0xD2, 0x6, 0xD2, 0x5, 0x58, 0x5, 0x58, 0x5, 0x58, 0x5, 0x58, 0x5, 0x58, 0x5, 0x58, 0x7, 0xE, 0x7, 0x14, 0x7, 0x14, 0x6, 0xA2, 0x6, 0xA2, 0x6, 0xA2, 0x7, 0x20, 0x7, 0x2C, 0x6, 0x2A, 0x5, 0xCA, 0x6, 0x72, 0x6, 0x42, 0x5, 0x70, 0x6, 0x66, 0x6, 0x96, 0x6, 0x66, 0x6, 0x96, 0x6, 0x66, 0x6, 0x96, 0x6, 0x78, 0x6, 0x9C, 0x5, 0x5E, 0x6, 0xC, 0x6, 0x12, 0x7, 0x1A, 0x7, 0x20, 0x5, 0x64, 0x5, 0x6A, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x5, 0xA6, 0x7, 0x50, 0x5, 0xA6, 0x5, 0x70, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x5, 0x76, 0x5, 0x7C, 0x5, 0x76, 0x5, 0x7C, 0x5, 0x76, 0x5, 0x7C, 0x5, 0x76, 0x5, 0x7C, 0x5, 0x76, 0x5, 0x7C, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x5, 0x82, 0x5, 0x88, 0x5, 0x82, 0x5, 0x88, 0x5, 0x82, 0x5, 0x88, 0x5, 0x82, 0x5, 0x88, 0x5, 0x82, 0x5, 0x88, 0x6, 0x78, 0x6, 0x9C, 0x6, 0x78, 0x6, 0x9C, 0x6, 0x78, 0x6, 0x9C, 0x5, 0x8E, 0x7, 0x1A, 0x7, 0x20, 0x5, 0xA6, 0x7, 0x50, 0x7, 0x32, 0x7, 0x38, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x5, 0x94, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x5, 0x9A, 0x5, 0xA0, 0x5, 0xE8, 0x7, 0x2C, 0x5, 0xF4, 0x5, 0xFA, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x5, 0xE8, 0x7, 0x2C, 0x6, 0x18, 0x6, 0x1E, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x5, 0xA6, 0x7, 0x50, 0x5, 0xA6, 0x7, 0x50, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x6, 0x30, 0x6, 0x36, 0x6, 0x30, 0x6, 0x36, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x5, 0xEE, 0x6, 0x8A, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x6, 0x78, 0x6, 0x9C, 0x5, 0xAC, 0x5, 0xB2, 0x5, 0xB8, 0x6, 0x24, 0x5, 0xBE, 0x6, 0x24, 0x5, 0xBE, 0x6, 0x24, 0x5, 0xBE, 0x5, 0xC4, 0x5, 0xCA, 0x5, 0xD0, 0x5, 0xD6, 0x5, 0xD0, 0x5, 0xD6, 0x5, 0xD0, 0x5, 0xD6, 0x5, 0xD0, 0x5, 0xD6, 0x5, 0xD0, 0x5, 0xD6, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x26, 0x7, 0x2C, 0x5, 0xDC, 0x5, 0xE2, 0x5, 0xE8, 0x7, 0x2C, 0x5, 0xEE, 0x6, 0x8A, 0x5, 0xEE, 0x6, 0x8A, 0x5, 0xEE, 0x6, 0x8A, 0x5, 0xEE, 0x6, 0x8A, 0x5, 0xF4, 0x5, 0xFA, 0x5, 0xF4, 0x5, 0xFA, 0x5, 0xF4, 0x5, 0xFA, 0x6, 0x0, 0x6, 0x6, 0x6, 0x0, 0x6, 0x6, 0x6, 0x0, 0x6, 0x6, 0x6, 0x0, 0x6, 0x6, 0x6, 0xC, 0x6, 0x12, 0x6, 0xC, 0x6, 0x12, 0x6, 0x18, 0x6, 0x1E, 0x6, 0x18, 0x6, 0x1E, 0x6, 0x18, 0x6, 0x1E, 0x6, 0x18, 0x6, 0x1E, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x7, 0x32, 0x7, 0x38, 0x6, 0x24, 0x6, 0x2A, 0x6, 0x24, 0x6, 0x2A, 0x6, 0x30, 0x6, 0x36, 0x6, 0x30, 0x6, 0x36, 0x6, 0x30, 0x6, 0x36, 0x6, 0x30, 0x6, 0x36, 0x6, 0x3C, 0x6, 0x42, 0x6, 0x3C, 0x6, 0x42, 0x6, 0x3C, 0x6, 0x42, 0x6, 0x3C, 0x6, 0x42, 0x6, 0x3C, 0x6, 0x42, 0x6, 0x48, 0x6, 0x90, 0x6, 0x48, 0x6, 0x90, 0x6, 0x48, 0x6, 0x90, 0x6, 0x48, 0x6, 0x90, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x4E, 0x6, 0x54, 0x6, 0x5A, 0x6, 0x60, 0x6, 0x5A, 0x6, 0x60, 0x6, 0x66, 0x6, 0x96, 0x6, 0x66, 0x6, 0x96, 0x6, 0x6C, 0x6, 0x72, 0x6, 0x6C, 0x6, 0x72, 0x6, 0x78, 0x6, 0x9C, 0x6, 0x7E, 0x6, 0x84, 0x6, 0x7E, 0x6, 0x84, 0x6, 0x7E, 0x6, 0x84, 0x6, 0x8A, 0x6, 0x90, 0x6, 0x96, 0x6, 0x9C, 0x7, 0x20, 0x7, 0x3E, 0x7, 0x44, 0x6, 0xE4, 0x6, 0xAE, 0x7, 0x4A, 0x7, 0x14, 0x7, 0x3E, 0x6, 0xBA, 0x7, 0x44, 0x6, 0xA2, 0x6, 0xE4, 0x6, 0xAE, 0x6, 0xB4, 0x6, 0xC6, 0x6, 0xA8, 0x7, 0x4A, 0x6, 0xCC, 0x6, 0xD2, 0x7, 0x14, 0x6, 0xD8, 0x6, 0xAE, 0x7, 0x14, 0x7, 0x44, 0x6, 0xC0, 0x7, 0x8, 0x6, 0xAE, 0x6, 0xAE, 0x6, 0xFC, 0x6, 0xB4, 0x6, 0xF6, 0x7, 0x3E, 0x6, 0xBA, 0x6, 0xC0, 0x7, 0x44, 0x6, 0xF0, 0x6, 0xC6, 0x6, 0xE4, 0x7, 0x4A, 0x6, 0xCC, 0x6, 0xEA, 0x6, 0xD2, 0x6, 0xD8, 0x6, 0xDE, 0x6, 0xE4, 0x6, 0xEA, 0x7, 0x14, 0x6, 0xF0, 0x6, 0xF6, 0x6, 0xFC, 0x7, 0x2, 0x7, 0x4A, 0x7, 0x8, 0x7, 0xE, 0x7, 0xE, 0x7, 0xE, 0x7, 0x14, 0x7, 0x1A, 0x7, 0x20, 0x7, 0x26, 0x7, 0x2C, 0x7, 0x32, 0x7, 0x38, 0x7, 0x3E, 0x7, 0x44, 0x7, 0x4A, 0x7, 0x50, 0x7, 0x50, 0x0, 0x1, 0x3, 0x52, 0x6, 0x41, 0x0, 0x1, 0x2, 0xCB, 0x6, 0x8A, 0x0, 0x1, 0x2, 0x1C, 0x5, 0x7, 0x0, 0x1, 0x1, 0xCB, 0x5, 0x28, 0x0, 0x1, 0x2, 0x53, 0x5, 0x28, 0x0, 0x1, 0x0, 0xF5, 0x5, 0x28, 0x0, 0x1, 0x2, 0x3, 0x5, 0x28, 0x0, 0x1, 0x2, 0x40, 0x5, 0x28, 0x0, 0x1, 0x1, 0x11, 0x4, 0xE8, 0x0, 0x1, 0x2, 0xDD, 0x4, 0xF5, 0x0, 0x1, 0x2, 0xD2, 0x6, 0x45, 0x0, 0x1, 0x1, 0x7, 0x6, 0x40, 0x0, 0x1, 0x2, 0xBF, 0x6, 0x3E, 0x0, 0x1, 0x2, 0x44, 0x5, 0xA, 0x0, 0x1, 0x2, 0xC2, 0x6, 0x4C, 0x0, 0x1, 0x2, 0x42, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x42, 0x5, 0xA, 0x0, 0x1, 0x2, 0x28, 0x5, 0xB, 0x0, 0x1, 0x3, 0xA7, 0x6, 0x4C, 0x0, 0x1, 0x3, 0x5C, 0x5, 0xB, 0x0, 0x1, 0x1, 0x21, 0x6, 0x48, 0x0, 0x1, 0x2, 0x33, 0x5, 0xA, 0x0, 0x1, 0x2, 0x23, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x4E, 0x4, 0xF5, 0x0, 0x1, 0x2, 0x8D, 0x6, 0x47, 0x0, 0x1, 0x2, 0xAC, 0x6, 0x55, 0x0, 0x1, 0x2, 0x15, 0x5, 0xA, 0x0, 0x1, 0x2, 0x3B, 0x6, 0x48, 0x0, 0x1, 0x2, 0xD, 0x6, 0x47, 0x0, 0x1, 0x2, 0x73, 0x6, 0x4C, 0x0, 0x1, 0x1, 0xE0, 0x6, 0xBE, 0x0, 0x1, 0x2, 0xA9, 0x6, 0x55, 0x0, 0x1, 0x2, 0xCD, 0x6, 0x48, 0x0, 0x1, 0x2, 0x59, 0x6, 0x41, 0x0, 0x1, 0x2, 0x57, 0x6, 0x47, 0x0, 0x1, 0x1, 0x14, 0x6, 0x40, 0x0, 0x1, 0x1, 0x6, 0x6, 0x9B, 0x0, 0x1, 0x3, 0x7B, 0x6, 0x40, 0x0, 0x1, 0x3, 0x8C, 0x5, 0xA, 0x0, 0x1, 0x2, 0xD6, 0x6, 0x40, 0x0, 0x1, 0x2, 0x3E, 0x5, 0xA, 0x0, 0x1, 0x2, 0x5E, 0x6, 0x4C, 0x0, 0x1, 0x2, 0x88, 0x5, 0x0, 0x0, 0x1, 0x2, 0x5C, 0x6, 0x40, 0x0, 0x1, 0x1, 0x99, 0x5, 0xA, 0x0, 0x1, 0x2, 0x7A, 0x6, 0x40, 0x0, 0x1, 0x2, 0x25, 0x5, 0xA, 0x0, 0x1, 0x2, 0x6C, 0x6, 0x40, 0x0, 0x1, 0x2, 0x9B, 0x6, 0x40, 0x0, 0x1, 0x2, 0x39, 0x5, 0xA, 0x0, 0x1, 0x2, 0x99, 0x6, 0x4C, 0x0, 0x1, 0x2, 0x1, 0x5, 0x0, 0x0, 0x1, 0x3, 0x92, 0x6, 0x40, 0x0, 0x1, 0x2, 0x87, 0x6, 0x4C, 0x0, 0x1, 0x2, 0x4, 0x5, 0x0, 0x0, 0x1, 0x2, 0x73, 0x6, 0x40, 0x0, 0x1, 0x2, 0x6F, 0x6, 0x40, 0x0, 0x1, 0x2, 0x7, 0x5, 0xA, 0x0, 0x1, 0x2, 0x2, 0x6, 0x68, 0x0, 0x1, 0x1, 0x46, 0x5, 0xC4, 0x0, 0x1, 0x2, 0xF5, 0x5, 0xA, 0x0, 0x1, 0x2, 0x2, 0x5, 0xA, 0x0, 0x1, 0x2, 0x1C, 0x5, 0x28, 0x0, 0x1, 0x2, 0x70, 0x5, 0x28, 0x0, 0x1, 0x0, 0xFF, 0x5, 0x28, 0x0, 0x1, 0x2, 0x2, 0x5, 0x28, 0x0, 0x1, 0x2, 0xE, 0x5, 0x28, 0x0, 0x1, 0x2, 0xF, 0x5, 0x28, 0x0, 0x1, 0x2, 0xFE, 0x5, 0x28, 0x0, 0x1, 0x2, 0x32, 0x5, 0x28, 0x0, 0x1, 0x2, 0x1B, 0x5, 0x28, 0x0, 0x1, 0x2, 0x26, 0x5, 0x28, 0x0, 0x1, 0x2, 0xB, 0x5, 0x28, 0x0, 0x1, 0x2, 0x65, 0x5, 0x28, 0x0, 0x1, 0x2, 0x4F, 0x5, 0x28, 0x0, 0x1, 0x2, 0x71, 0x5, 0x28, 0x0, 0x1, 0x2, 0x31, 0x5, 0x28, 0x0, 0x1, 0x2, 0xDE, 0x5, 0x28, 0x0, 0x1, 0x3, 0x6E, 0x5, 0xA, 0x0, 0x1, 0x2, 0x2C, 0x5, 0x28, 0x0, 0x1, 0x3, 0x3, 0x5, 0x28, 0x0, 0x1, 0x2, 0x19, 0x5, 0x28, 0x0, 0x1, 0x2, 0xAD, 0x6, 0x40, 0x0, 0x1, 0x2, 0x37, 0x5, 0xA, 0x0, 0x1, 0x2, 0x73, 0x6, 0x48, 0x0, 0x1, 0x2, 0x2B, 0x5, 0xA, 0x0, 0x1, 0x2, 0xC4, 0x6, 0x40, 0x0, 0x1, 0x2, 0x40, 0x5, 0xA, 0x0, 0x1, 0x2, 0x51, 0x5, 0x28, 0x0, 0x1, 0x2, 0x21, 0x5, 0x28, 0x0, 0x1, 0x2, 0x5F, 0x5, 0x28, 0x0, 0x1, 0x1, 0xC, 0x5, 0x3, 0x0, 0x1, 0x0, 0xC, 0x0, 0x14, 0x0, 0x1, 0x0, 0x1E, 0x0, 0x34, 0x0, 0x1, 0x0, 0x2, 0x8, 0x9B, 0x8, 0x9E, 0x0, 0x1, 0x0, 0x3, 0x0, 0x8C, 0x0, 0x97, 0x1, 0x20, 0x0, 0x2, 0x0, 0x0, 0x0, 0xA, 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, 0xFD, 0xAF, 0x0, 0xD6, 0x0, 0x1, 0xFC, 0xE7, 0x0, 0xD6, 0x0, 0x3, 0x0, 0x8, 0x0, 0xE, 0x0, 0x14, 0x0, 0x1, 0x3, 0x65, 0x5, 0x1F, 0x0, 0x1, 0x1, 0x6B, 0x5, 0x17, 0x0, 0x1, 0x1, 0x80, 0x3, 0x1A, 0x0, 0x1, 0x0, 0xC, 0x0, 0x14, 0x0, 0x1, 0x0, 0x1A, 0x0, 0x30, 0x0, 0x1, 0x0, 0x2, 0x8, 0x9C, 0x8, 0x9F, 0x0, 0x1, 0x0, 0x1, 0x0, 0xDC, 0x0, 0x2, 0x0, 0x0, 0x0, 0xA, 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, 0xFD, 0x48, 0x0, 0xD6, 0x0, 0x1, 0xFC, 0x5F, 0x0, 0xD6, 0x0, 0x1, 0x0, 0x4, 0x0, 0x1, 0x2, 0x43, 0xFF, 0x89, 0x0, 0x1, 0x0, 0xC, 0x0, 0xA6, 0x0, 0x1, 0x0, 0xE0, 0x6, 0x5E, 0x0, 0x2, 0x0, 0x19, 0x1, 0xB1, 0x1, 0xC5, 0x0, 0x0, 0x1, 0xCB, 0x1, 0xCB, 0x0, 0x15, 0x1, 0xEE, 0x1, 0xF5, 0x0, 0x16, 0x1, 0xF7, 0x1, 0xF7, 0x0, 0x1E, 0x1, 0xFB, 0x1, 0xFD, 0x0, 0x1F, 0x2, 0x1, 0x2, 0x3, 0x0, 0x22, 0x2, 0x8, 0x2, 0x8, 0x0, 0x25, 0x2, 0xC, 0x2, 0xC, 0x0, 0x26, 0x2, 0x14, 0x2, 0x20, 0x0, 0x27, 0x2, 0xBA, 0x2, 0xBE, 0x0, 0x34, 0x3, 0x20, 0x3, 0x24, 0x0, 0x39, 0x3, 0x2B, 0x3, 0x2C, 0x0, 0x3E, 0x3, 0xEF, 0x3, 0xF0, 0x0, 0x40, 0x3, 0xF2, 0x3, 0xF8, 0x0, 0x42, 0x3, 0xFA, 0x3, 0xFD, 0x0, 0x49, 0x4, 0x0, 0x4, 0x24, 0x0, 0x4D, 0x4, 0x27, 0x4, 0x27, 0x0, 0x72, 0x4, 0xE2, 0x4, 0xE3, 0x0, 0x73, 0x4, 0xE5, 0x4, 0xE5, 0x0, 0x75, 0x5, 0x76, 0x5, 0x95, 0x0, 0x76, 0x6, 0x8, 0x6, 0x8, 0x0, 0x96, 0x6, 0xD, 0x6, 0x16, 0x0, 0x97, 0x6, 0x37, 0x6, 0x37, 0x0, 0xA1, 0x7, 0x2D, 0x7, 0x33, 0x0, 0xA2, 0x8, 0x8A, 0x8, 0x8E, 0x0, 0xA9, 0x0, 0x2, 0x0, 0x9, 0x1, 0xB1, 0x1, 0xC5, 0x0, 0x0, 0x1, 0xCB, 0x1, 0xCB, 0x0, 0x15, 0x1, 0xEE, 0x1, 0xF5, 0x0, 0x16, 0x1, 0xF7, 0x1, 0xF7, 0x0, 0x1E, 0x1, 0xFB, 0x1, 0xFD, 0x0, 0x1F, 0x2, 0x1, 0x2, 0x3, 0x0, 0x22, 0x2, 0x8, 0x2, 0x8, 0x0, 0x25, 0x2, 0xC, 0x2, 0xC, 0x0, 0x26, 0x8, 0x8A, 0x8, 0x8E, 0x0, 0x27, 0x0, 0xAE, 0x0, 0x0, 0x2, 0xBA, 0x0, 0x0, 0x2, 0xC0, 0x0, 0x0, 0x2, 0xC6, 0x0, 0x0, 0x5, 0x66, 0x0, 0x0, 0x2, 0xCC, 0x0, 0x0, 0x2, 0xD2, 0x0, 0x0, 0x2, 0xD8, 0x0, 0x0, 0x5, 0x78, 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x2, 0xDE, 0x0, 0x0, 0x2, 0xE4, 0x0, 0x0, 0x2, 0xEA, 0x0, 0x0, 0x5, 0x78, 0x0, 0x0, 0x2, 0xF0, 0x0, 0x0, 0x2, 0xF6, 0x0, 0x0, 0x2, 0xFC, 0x0, 0x0, 0x3, 0x2, 0x0, 0x0, 0x3, 0x2, 0x0, 0x0, 0x3, 0x8, 0x0, 0x0, 0x3, 0xE, 0x0, 0x0, 0x3, 0x14, 0x0, 0x0, 0x3, 0x1A, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x3, 0x26, 0x0, 0x0, 0x3, 0x2C, 0x0, 0x0, 0x3, 0x32, 0x0, 0x0, 0x3, 0x38, 0x0, 0x0, 0x3, 0x3E, 0x0, 0x0, 0x3, 0x44, 0x0, 0x0, 0x3, 0x4A, 0x0, 0x0, 0x3, 0x50, 0x0, 0x0, 0x3, 0x56, 0x0, 0x0, 0x3, 0x5C, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, 0x3, 0x68, 0x0, 0x0, 0x3, 0x6E, 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x3, 0x7A, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x4, 0x7C, 0x0, 0x0, 0x3, 0x86, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x3, 0xC2, 0x0, 0x0, 0x3, 0x8C, 0x0, 0x0, 0x4, 0xA6, 0x0, 0x0, 0x3, 0xC2, 0x0, 0x0, 0x4, 0x3A, 0x0, 0x0, 0x3, 0x92, 0x0, 0x0, 0x3, 0x98, 0x0, 0x0, 0x4, 0x3A, 0x0, 0x0, 0x3, 0x9E, 0x0, 0x0, 0x3, 0xA4, 0x0, 0x0, 0x3, 0xAA, 0x0, 0x0, 0x3, 0xB0, 0x0, 0x0, 0x3, 0xB6, 0x0, 0x0, 0x3, 0xBC, 0x0, 0x0, 0x3, 0xC2, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x3, 0xC8, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x3, 0xCE, 0x0, 0x0, 0x3, 0xD4, 0x0, 0x0, 0x3, 0xDA, 0x0, 0x0, 0x3, 0xE0, 0x0, 0x0, 0x3, 0xE6, 0x0, 0x0, 0x3, 0xEC, 0x0, 0x0, 0x3, 0xF2, 0x0, 0x0, 0x3, 0xF8, 0x0, 0x0, 0x3, 0xFE, 0x0, 0x0, 0x4, 0x4, 0x0, 0x0, 0x4, 0xA, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x5, 0x1E, 0x0, 0x0, 0x4, 0x16, 0x0, 0x0, 0x4, 0x1C, 0x0, 0x0, 0x4, 0x22, 0x0, 0x0, 0x4, 0x28, 0x0, 0x0, 0x4, 0x2E, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x34, 0x0, 0x0, 0x4, 0x3A, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, 0x4, 0x46, 0x0, 0x0, 0x4, 0x4C, 0x0, 0x0, 0x4, 0x4C, 0x0, 0x0, 0x4, 0x52, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x58, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x5E, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x64, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x4, 0x6A, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x4, 0x76, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x4, 0x7C, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x4, 0x82, 0x0, 0x0, 0x4, 0x88, 0x0, 0x0, 0x4, 0x8E, 0x0, 0x0, 0x4, 0x94, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x4, 0x9A, 0x0, 0x0, 0x4, 0xA0, 0x0, 0x0, 0x4, 0xDC, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x4, 0xA6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xAC, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xB2, 0x0, 0x0, 0x4, 0xB8, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xBE, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xC4, 0x0, 0x0, 0x4, 0xCA, 0x0, 0x0, 0x4, 0xD0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xD6, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xDC, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xE2, 0x0, 0x0, 0x4, 0xE8, 0x0, 0x0, 0x4, 0xEE, 0x0, 0x0, 0x4, 0xF4, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0xFA, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5, 0x6, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x5, 0xC, 0x0, 0x0, 0x5, 0x12, 0x0, 0x0, 0x5, 0x18, 0x0, 0x0, 0x5, 0x1E, 0x0, 0x0, 0x5, 0x24, 0x0, 0x0, 0x5, 0x2A, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x5, 0x30, 0x0, 0x0, 0x5, 0x36, 0x0, 0x0, 0x5, 0x3C, 0x0, 0x0, 0x5, 0x42, 0x0, 0x0, 0x5, 0x48, 0x0, 0x0, 0x5, 0x4E, 0x0, 0x0, 0x5, 0x54, 0x0, 0x0, 0x5, 0x5A, 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x5, 0x66, 0x0, 0x0, 0x5, 0x66, 0x0, 0x0, 0x5, 0x6C, 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x5, 0x78, 0x0, 0x1, 0xFD, 0xEA, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xD5, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xB5, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xBB, 0x5, 0x5, 0x0, 0x1, 0xFD, 0xBA, 0x6, 0x28, 0x0, 0x1, 0xFD, 0xB9, 0x4, 0xAA, 0x0, 0x1, 0xFD, 0xA8, 0x5, 0x4, 0x0, 0x1, 0xFD, 0xBA, 0x4, 0xCF, 0x0, 0x1, 0xFD, 0x6B, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xB9, 0x4, 0x9F, 0x0, 0x1, 0xFD, 0xB5, 0x4, 0x9F, 0x0, 0x1, 0xFE, 0x35, 0x5, 0xD, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0xA0, 0x0, 0x1, 0xFD, 0xB7, 0x4, 0x2A, 0x0, 0x1, 0xFD, 0xA1, 0x4, 0x2A, 0x0, 0x1, 0xFD, 0xD0, 0x4, 0x2A, 0x0, 0x1, 0xFE, 0x48, 0x4, 0xEF, 0x0, 0x1, 0xFD, 0xF3, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0x48, 0x0, 0x1, 0xFD, 0xB5, 0x5, 0xBE, 0x0, 0x1, 0x0, 0x20, 0x5, 0xA, 0x0, 0x1, 0xFF, 0x97, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xC3, 0x5, 0xA, 0x0, 0x1, 0xFD, 0x9D, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xB1, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xB9, 0x4, 0xAD, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0xE6, 0x0, 0x1, 0xFD, 0x9B, 0x4, 0x6B, 0x0, 0x1, 0xFD, 0xC4, 0x4, 0xDC, 0x0, 0x1, 0xFD, 0xC2, 0x4, 0xA7, 0x0, 0x1, 0xFE, 0x3, 0x4, 0x58, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0xC3, 0x0, 0x1, 0xFD, 0x85, 0x4, 0x5F, 0x0, 0x1, 0xFD, 0xA3, 0x4, 0xC4, 0x0, 0x1, 0xFD, 0xCA, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC2, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xE0, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xA2, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xEA, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xE0, 0x4, 0xA6, 0x0, 0x1, 0xFE, 0x4D, 0x4, 0xA6, 0x0, 0x1, 0xFD, 0xF5, 0x5, 0x0, 0x0, 0x1, 0xFE, 0x20, 0x5, 0x0, 0x0, 0x1, 0xFD, 0xA7, 0x4, 0xA6, 0x0, 0x1, 0xFD, 0xC5, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBD, 0x4, 0x59, 0x0, 0x1, 0xFD, 0x9D, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC3, 0x5, 0x46, 0x0, 0x1, 0xFD, 0xCF, 0x5, 0x46, 0x0, 0x1, 0xFD, 0xAA, 0x5, 0xA, 0x0, 0x1, 0xFD, 0x87, 0x5, 0xA, 0x0, 0x1, 0xFE, 0x1B, 0x4, 0x92, 0x0, 0x1, 0xFE, 0x4D, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xAB, 0x4, 0x92, 0x0, 0x1, 0xFE, 0xB, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xD2, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xD9, 0x4, 0x92, 0x0, 0x1, 0xFE, 0x17, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xA7, 0x4, 0x92, 0x0, 0x1, 0x0, 0x1, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xEB, 0x3, 0xD8, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0x84, 0x0, 0x1, 0xFD, 0xBD, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC0, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC8, 0x4, 0x92, 0x0, 0x1, 0xFD, 0x99, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC2, 0x3, 0xBF, 0x0, 0x1, 0xFD, 0xBB, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBC, 0x3, 0xCC, 0x0, 0x1, 0xFD, 0xD6, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xD4, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xAE, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB1, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xF6, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB9, 0x3, 0xE1, 0x0, 0x1, 0xFD, 0xC7, 0x4, 0x92, 0x0, 0x1, 0xFD, 0x9B, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB9, 0x3, 0xB3, 0x0, 0x1, 0xFD, 0xB4, 0x3, 0xAE, 0x0, 0x1, 0xFD, 0x8A, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xAA, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xAD, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBF, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBA, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xCE, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB5, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBE, 0x3, 0xB0, 0x0, 0x1, 0xFD, 0xD8, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC9, 0x4, 0x92, 0x0, 0x1, 0xFD, 0x93, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xA5, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xC6, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB3, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xF5, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xF4, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB9, 0x4, 0x92, 0x0, 0x1, 0xFD, 0x94, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB8, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xAC, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBC, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xA6, 0x3, 0xCE, 0x0, 0x1, 0xFD, 0x84, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xCC, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xDC, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB6, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xBE, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xD7, 0x4, 0x92, 0x0, 0x1, 0xFE, 0x7A, 0x4, 0x92, 0x0, 0x1, 0x1, 0x86, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xE1, 0x4, 0x92, 0x0, 0x1, 0x2, 0x1F, 0x4, 0x92, 0x0, 0x1, 0xFE, 0xC5, 0x4, 0x92, 0x0, 0x1, 0xFC, 0xAA, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xB7, 0x4, 0x92, 0x0, 0x1, 0xFD, 0xD4, 0x4, 0xE8, 0x0, 0x1, 0xFD, 0xBB, 0x5, 0xA, 0x0, 0x1, 0xFD, 0x67, 0x5, 0xA, 0x0, 0x1, 0xFD, 0xB8, 0x5, 0xA, 0x0, 0x2C, 0x0, 0x5A, 0x0, 0x60, 0x0, 0x66, 0x0, 0x6C, 0x0, 0x72, 0x0, 0x78, 0x0, 0x7E, 0x0, 0x84, 0x0, 0x8A, 0x0, 0x90, 0x0, 0x96, 0x0, 0x9C, 0x0, 0xA2, 0x0, 0xA8, 0x0, 0xAE, 0x0, 0xB4, 0x0, 0xBA, 0x0, 0xC0, 0x0, 0xC6, 0x0, 0xCC, 0x0, 0xD2, 0x0, 0xD8, 0x0, 0xDE, 0x0, 0xE4, 0x0, 0xEA, 0x0, 0xF0, 0x0, 0xF6, 0x0, 0xFC, 0x1, 0x2, 0x1, 0x8, 0x1, 0xE, 0x1, 0x14, 0x1, 0x1A, 0x1, 0x20, 0x1, 0x26, 0x1, 0x2C, 0x1, 0x32, 0x1, 0x38, 0x1, 0x3E, 0x1, 0x44, 0x1, 0x44, 0x1, 0x4A, 0x1, 0x50, 0x1, 0x56, 0x0, 0x1, 0xFD, 0xEA, 0x6, 0x79, 0x0, 0x1, 0xFD, 0xD5, 0x6, 0x79, 0x0, 0x1, 0xFD, 0xB5, 0x6, 0x68, 0x0, 0x1, 0xFD, 0xD4, 0x6, 0x5F, 0x0, 0x1, 0xFD, 0xBB, 0x6, 0x37, 0x0, 0x1, 0xFD, 0xBA, 0x7, 0x44, 0x0, 0x1, 0xFD, 0xB9, 0x6, 0x4F, 0x0, 0x1, 0xFD, 0xB8, 0x6, 0x27, 0x0, 0x1, 0xFD, 0x67, 0x6, 0x37, 0x0, 0x1, 0xFD, 0xA8, 0x6, 0xC6, 0x0, 0x1, 0xFD, 0xBA, 0x6, 0x77, 0x0, 0x1, 0xFD, 0x6B, 0x6, 0x5B, 0x0, 0x1, 0xFD, 0xB8, 0x6, 0x68, 0x0, 0x1, 0xFD, 0xB8, 0x6, 0x70, 0x0, 0x1, 0xFD, 0xB5, 0x6, 0x70, 0x0, 0x1, 0xFE, 0x35, 0x6, 0x51, 0x0, 0x1, 0xFD, 0xB8, 0x7, 0xC, 0x0, 0x1, 0xFD, 0xB8, 0x6, 0x9, 0x0, 0x1, 0xFD, 0xB7, 0x6, 0x94, 0x0, 0x1, 0xFD, 0xA1, 0x6, 0x94, 0x0, 0x1, 0xFD, 0xD1, 0x6, 0x94, 0x0, 0x1, 0xFE, 0x48, 0x6, 0xA4, 0x0, 0x1, 0xFD, 0xF3, 0x7, 0x1A, 0x0, 0x1, 0xFD, 0xB8, 0x6, 0xD0, 0x0, 0x1, 0xFD, 0xB5, 0x8, 0x1, 0x0, 0x1, 0x0, 0x20, 0x6, 0x66, 0x0, 0x1, 0xFF, 0x97, 0x6, 0x66, 0x0, 0x1, 0xFD, 0xC3, 0x6, 0x41, 0x0, 0x1, 0xFD, 0x9D, 0x6, 0xBC, 0x0, 0x1, 0xFD, 0xB1, 0x6, 0xFE, 0x0, 0x1, 0xFD, 0xB9, 0x6, 0xA3, 0x0, 0x1, 0xFD, 0xB8, 0x6, 0x7B, 0x0, 0x1, 0xFD, 0x9C, 0x7, 0xBF, 0x0, 0x1, 0xFD, 0xC4, 0x6, 0x9E, 0x0, 0x1, 0xFD, 0xC3, 0x7, 0x5D, 0x0, 0x1, 0xFE, 0x3, 0x6, 0x13, 0x0, 0x1, 0xFD, 0xB8, 0x7, 0x15, 0x0, 0x1, 0xFD, 0x85, 0x6, 0x13, 0x0, 0x1, 0xFD, 0xA3, 0x6, 0xCD, 0x0, 0x1, 0xFD, 0xD4, 0x6, 0x2C, 0x0, 0x1, 0xFD, 0xBB, 0x6, 0x4, 0x0, 0x1, 0xFD, 0x67, 0x6, 0x4, 0x0, 0x1, 0xFD, 0xB8, 0x6, 0x30, 0x0, 0x1, 0x0, 0x0, 0x0, 0xA, 0x1, 0x7A, 0x2, 0xCA, 0x0, 0x4, 0x44, 0x46, 0x4C, 0x54, 0x0, 0x1A, 0x63, 0x79, 0x72, 0x6C, 0x0, 0x1A, 0x67, 0x72, 0x65, 0x6B, 0x0, 0x1A, 0x6C, 0x61, 0x74, 0x6E, 0x0, 0x4C, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x14, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x8, 0x0, 0xC, 0x0, 0xD, 0x0, 0xE, 0x0, 0xF, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x2E, 0x0, 0x7, 0x41, 0x5A, 0x45, 0x20, 0x0, 0xF4, 0x43, 0x52, 0x54, 0x20, 0x0, 0xF4, 0x46, 0x52, 0x41, 0x20, 0x0, 0x5E, 0x4D, 0x4F, 0x4C, 0x20, 0x0, 0xC2, 0x4E, 0x41, 0x56, 0x20, 0x0, 0x90, 0x52, 0x4F, 0x4D, 0x20, 0x0, 0xC2, 0x54, 0x52, 0x4B, 0x20, 0x0, 0xF4, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x15, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x7, 0x0, 0x8, 0x0, 0xC, 0x0, 0xD, 0x0, 0xE, 0x0, 0xF, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x16, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x6, 0x0, 0x8, 0x0, 0x9, 0x0, 0xC, 0x0, 0xD, 0x0, 0xE, 0x0, 0xF, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x16, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x6, 0x0, 0x8, 0x0, 0xB, 0x0, 0xC, 0x0, 0xD, 0x0, 0xE, 0x0, 0xF, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x16, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x6, 0x0, 0x8, 0x0, 0xA, 0x0, 0xC, 0x0, 0xD, 0x0, 0xE, 0x0, 0xF, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x15, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x8, 0x0, 0xC, 0x0, 0xD, 0x0, 0xE, 0x0, 0xF, 0x0, 0x10, 0x0, 0x11, 0x0, 0x12, 0x0, 0x13, 0x0, 0x14, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1A, 0x63, 0x32, 0x73, 0x63, 0x0, 0x9E, 0x63, 0x63, 0x6D, 0x70, 0x0, 0xA4, 0x64, 0x6C, 0x69, 0x67, 0x0, 0xB4, 0x64, 0x6E, 0x6F, 0x6D, 0x0, 0xBA, 0x66, 0x72, 0x61, 0x63, 0x0, 0xC0, 0x6C, 0x69, 0x67, 0x61, 0x0, 0xCA, 0x6C, 0x69, 0x67, 0x61, 0x0, 0xD0, 0x6C, 0x69, 0x67, 0x61, 0x0, 0xDC, 0x6C, 0x6E, 0x75, 0x6D, 0x0, 0xE4, 0x6C, 0x6F, 0x63, 0x6C, 0x0, 0xEA, 0x6C, 0x6F, 0x63, 0x6C, 0x0, 0xF0, 0x6C, 0x6F, 0x63, 0x6C, 0x0, 0xF6, 0x6E, 0x75, 0x6D, 0x72, 0x0, 0xFC, 0x6F, 0x6E, 0x75, 0x6D, 0x1, 0x2, 0x70, 0x6E, 0x75, 0x6D, 0x1, 0x8, 0x73, 0x61, 0x6C, 0x74, 0x1, 0xE, 0x73, 0x6D, 0x63, 0x70, 0x1, 0x14, 0x73, 0x73, 0x30, 0x31, 0x1, 0x1A, 0x73, 0x73, 0x30, 0x32, 0x1, 0x20, 0x73, 0x73, 0x30, 0x33, 0x1, 0x26, 0x73, 0x73, 0x30, 0x34, 0x1, 0x2C, 0x73, 0x73, 0x30, 0x35, 0x1, 0x32, 0x73, 0x73, 0x30, 0x36, 0x1, 0x38, 0x73, 0x73, 0x30, 0x37, 0x1, 0x3E, 0x74, 0x6E, 0x75, 0x6D, 0x1, 0x44, 0x75, 0x6E, 0x69, 0x63, 0x1, 0x4A, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x3, 0x0, 0x4, 0x0, 0x6, 0x0, 0x7, 0x0, 0x8, 0x0, 0xC, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, 0x0, 0x21, 0x0, 0x0, 0x0, 0x3, 0x0, 0x1F, 0x0, 0x20, 0x0, 0x22, 0x0, 0x0, 0x0, 0x1, 0x0, 0x11, 0x0, 0x0, 0x0, 0x4, 0x0, 0x10, 0x0, 0x11, 0x0, 0x10, 0x0, 0x11, 0x0, 0x0, 0x0, 0x2, 0x0, 0x10, 0x0, 0x11, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1E, 0x0, 0x0, 0x0, 0x1, 0x0, 0xF, 0x0, 0x0, 0x0, 0x1, 0x0, 0xD, 0x0, 0x0, 0x0, 0x1, 0x0, 0xE, 0x0, 0x0, 0x0, 0x1, 0x0, 0x22, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1B, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1C, 0x0, 0x0, 0x0, 0x1, 0x0, 0x13, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x14, 0x0, 0x0, 0x0, 0x1, 0x0, 0x15, 0x0, 0x0, 0x0, 0x1, 0x0, 0x16, 0x0, 0x0, 0x0, 0x1, 0x0, 0x17, 0x0, 0x0, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x0, 0x1, 0x0, 0x19, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1A, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1D, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x23, 0x0, 0x48, 0x4, 0x5A, 0x8, 0x24, 0xA, 0xBE, 0xB, 0x9C, 0xE, 0x10, 0xE, 0x6A, 0x1D, 0x90, 0x23, 0xC, 0x24, 0x36, 0x24, 0x4C, 0x24, 0x62, 0x24, 0x82, 0x24, 0xE8, 0x24, 0xFE, 0x25, 0x34, 0x25, 0x48, 0x25, 0x6C, 0x25, 0x96, 0x25, 0xD2, 0x25, 0xEC, 0x26, 0x0, 0x26, 0x14, 0x26, 0x28, 0x26, 0x3A, 0x26, 0x54, 0x26, 0x96, 0x26, 0xB4, 0x27, 0x6, 0x27, 0x4C, 0x27, 0xAE, 0x28, 0xC, 0x28, 0x20, 0x28, 0x50, 0x28, 0x72, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x2, 0x6, 0x1, 0x0, 0x7, 0x63, 0x8, 0xB2, 0x7, 0x4D, 0x7, 0x4C, 0x7, 0x4B, 0x7, 0x4A, 0x7, 0x49, 0x7, 0x48, 0x7, 0x47, 0x7, 0x46, 0x7, 0x45, 0x7, 0x44, 0x7, 0xB1, 0x7, 0xB0, 0x7, 0xAF, 0x7, 0xAE, 0x7, 0xA6, 0x7, 0x62, 0x7, 0x61, 0x7, 0x60, 0x7, 0x5F, 0x7, 0x5E, 0x7, 0x5D, 0x7, 0x5C, 0x7, 0x5B, 0x7, 0x5A, 0x7, 0x59, 0x7, 0x58, 0x7, 0x57, 0x7, 0x56, 0x7, 0x55, 0x7, 0x54, 0x7, 0x53, 0x7, 0x52, 0x7, 0x51, 0x7, 0x50, 0x7, 0x4F, 0x7, 0x4E, 0x7, 0x64, 0x7, 0x65, 0x8, 0xB4, 0x8, 0xB6, 0x8, 0xB5, 0x8, 0xB7, 0x8, 0xB3, 0x8, 0xB8, 0x7, 0xDC, 0x7, 0x66, 0x7, 0x67, 0x7, 0x68, 0x7, 0x69, 0x7, 0x6A, 0x7, 0x6B, 0x7, 0x6C, 0x7, 0x6D, 0x7, 0x6E, 0x7, 0x6F, 0x7, 0x70, 0x7, 0x71, 0x7, 0x72, 0x7, 0x73, 0x7, 0x74, 0x7, 0x75, 0x7, 0x76, 0x7, 0x77, 0x7, 0x78, 0x7, 0x79, 0x7, 0x7A, 0x7, 0x7C, 0x7, 0x7D, 0xC, 0xEA, 0x7, 0x7E, 0x7, 0x7F, 0x7, 0x80, 0x7, 0x81, 0x7, 0x82, 0x7, 0x83, 0x7, 0x84, 0x7, 0x85, 0x7, 0x86, 0x7, 0x87, 0x7, 0xC4, 0x7, 0x89, 0x7, 0x8A, 0x7, 0x8B, 0x7, 0x8C, 0xC, 0xE4, 0x7, 0x8D, 0x7, 0x8F, 0x7, 0x90, 0x7, 0x91, 0x7, 0x92, 0x7, 0x93, 0x7, 0x94, 0x7, 0x95, 0x7, 0xFE, 0x7, 0x97, 0x7, 0x98, 0x7, 0x9A, 0x7, 0x9C, 0x7, 0x9B, 0x7, 0x99, 0x9, 0x7D, 0x9, 0x7E, 0x9, 0x7F, 0x9, 0x80, 0x9, 0x81, 0x9, 0x82, 0x9, 0x83, 0x9, 0x84, 0x9, 0x85, 0x9, 0x86, 0x9, 0x87, 0x9, 0x88, 0x9, 0x89, 0x9, 0x8A, 0x9, 0x8B, 0x9, 0x8C, 0x9, 0x8D, 0x9, 0x8E, 0x9, 0x8F, 0x9, 0x90, 0x9, 0x91, 0x9, 0x92, 0x9, 0x93, 0x9, 0x94, 0x9, 0x95, 0x9, 0x96, 0x9, 0x97, 0x9, 0x98, 0x9, 0x99, 0x9, 0x9A, 0x9, 0x9B, 0x9, 0x9C, 0x9, 0x9D, 0x9, 0x9E, 0x9, 0x9F, 0x9, 0xA0, 0x9, 0xA1, 0x9, 0xA2, 0x9, 0xA3, 0x9, 0xA4, 0x9, 0xA5, 0x9, 0xA6, 0x9, 0xA7, 0x9, 0xA8, 0x9, 0xA9, 0x9, 0xAA, 0x9, 0xAB, 0x9, 0xAC, 0x9, 0xAD, 0x9, 0xAE, 0x9, 0xAF, 0x9, 0xB0, 0x9, 0xB1, 0xC, 0xEC, 0x9, 0xB2, 0x9, 0xB3, 0x9, 0xB4, 0x9, 0xB5, 0x9, 0xB6, 0x9, 0xB7, 0x9, 0xB8, 0x9, 0xB9, 0x9, 0xBA, 0x9, 0xBB, 0x9, 0xBC, 0x9, 0xBD, 0x9, 0xBF, 0x9, 0xC0, 0x9, 0xC1, 0x9, 0xC2, 0x9, 0xC3, 0x9, 0xC4, 0xC, 0xEF, 0x9, 0xC5, 0x9, 0xC6, 0x9, 0xC8, 0x9, 0xC7, 0x9, 0xC9, 0x9, 0xCA, 0x9, 0xCB, 0x9, 0xCC, 0x9, 0xCD, 0x9, 0xCE, 0x9, 0xCF, 0x9, 0xD0, 0x9, 0xD1, 0x9, 0xD2, 0x9, 0xD3, 0x9, 0xD4, 0xC, 0xED, 0xC, 0xEE, 0xC, 0xB7, 0xC, 0xB8, 0xC, 0xB9, 0xC, 0xBA, 0xC, 0xBB, 0xC, 0xBC, 0xC, 0xBD, 0xC, 0xBE, 0xC, 0xBF, 0xC, 0xC0, 0xC, 0xC1, 0xC, 0xC2, 0xC, 0xC3, 0xC, 0xC4, 0xC, 0xC5, 0xC, 0xC6, 0xC, 0xC7, 0xC, 0xC8, 0xC, 0xC9, 0xC, 0xCA, 0xC, 0xCB, 0xC, 0xCC, 0xC, 0xCD, 0xC, 0xCE, 0xC, 0xCF, 0xC, 0xD0, 0xC, 0xD1, 0xC, 0xD2, 0xC, 0xD3, 0x7, 0x7B, 0xC, 0xD4, 0xC, 0xD5, 0xC, 0xD6, 0xC, 0xD7, 0xC, 0xD8, 0xC, 0xD9, 0xC, 0xDA, 0xC, 0xDB, 0xC, 0xDC, 0xC, 0xDD, 0xC, 0xDE, 0xC, 0xDF, 0xC, 0xE0, 0xC, 0xE1, 0xC, 0xE2, 0xC, 0xF0, 0xC, 0xF1, 0xC, 0xF2, 0xC, 0xF3, 0xC, 0xE3, 0xC, 0xE5, 0xC, 0xE6, 0xC, 0xE8, 0x7, 0x96, 0xC, 0xE9, 0xC, 0xE7, 0x7, 0x88, 0x7, 0x8E, 0x9, 0xBE, 0xC, 0xEB, 0xC, 0xFA, 0xC, 0xFB, 0xC, 0xFC, 0x0, 0x1, 0x1, 0x0, 0x0, 0x9, 0x0, 0xB, 0x0, 0x15, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1A, 0x0, 0x1B, 0x0, 0x1C, 0x0, 0x1D, 0x0, 0x1E, 0x0, 0x26, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2A, 0x0, 0x2B, 0x0, 0x2C, 0x0, 0x2D, 0x0, 0x2E, 0x0, 0x2F, 0x0, 0x30, 0x0, 0x31, 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x0, 0x3A, 0x0, 0x3B, 0x0, 0x3C, 0x0, 0x3D, 0x0, 0x3E, 0x0, 0x3F, 0x0, 0x66, 0x0, 0x68, 0x0, 0x82, 0x0, 0x84, 0x0, 0x85, 0x0, 0x8D, 0x0, 0x90, 0x0, 0x92, 0x0, 0x94, 0x2, 0x30, 0x2, 0x31, 0x2, 0x32, 0x2, 0x33, 0x2, 0x34, 0x2, 0x35, 0x2, 0x36, 0x2, 0x37, 0x2, 0x38, 0x2, 0x39, 0x2, 0x68, 0x2, 0x69, 0x2, 0x6A, 0x2, 0x6B, 0x2, 0x6C, 0x2, 0x6D, 0x2, 0x6E, 0x2, 0x6F, 0x2, 0x70, 0x2, 0x71, 0x2, 0x72, 0x2, 0x73, 0x2, 0x74, 0x2, 0x75, 0x2, 0x76, 0x2, 0x77, 0x2, 0x78, 0x2, 0x79, 0x2, 0x7A, 0x2, 0x7B, 0x2, 0x7C, 0x2, 0x7D, 0x2, 0x7E, 0x2, 0x7F, 0x2, 0xC6, 0x2, 0xCA, 0x2, 0xCC, 0x2, 0xCE, 0x2, 0xD0, 0x2, 0xD2, 0x2, 0xD8, 0x2, 0xDA, 0x2, 0xDC, 0x2, 0xE0, 0x2, 0xE2, 0x2, 0xE3, 0x2, 0xEF, 0x2, 0xF0, 0x4, 0x32, 0x4, 0xC8, 0x4, 0xCF, 0x4, 0xD7, 0x4, 0xDB, 0x4, 0xE0, 0x4, 0xED, 0x8, 0xC8, 0x8, 0xC9, 0x8, 0xCB, 0x8, 0xCD, 0x8, 0xCE, 0x8, 0xCF, 0x8, 0xD0, 0x8, 0xD1, 0x8, 0xD2, 0x8, 0xD3, 0x8, 0xD4, 0x8, 0xD5, 0x8, 0xD6, 0x8, 0xD7, 0x8, 0xD8, 0x8, 0xD9, 0x8, 0xDA, 0x8, 0xDB, 0x8, 0xDC, 0x8, 0xDD, 0x8, 0xDE, 0x8, 0xDF, 0x8, 0xE0, 0x8, 0xE1, 0x8, 0xE2, 0x8, 0xE3, 0x8, 0xE4, 0x8, 0xE5, 0x8, 0xE6, 0x8, 0xE7, 0x9, 0x4, 0x9, 0x6, 0x9, 0x8, 0x9, 0xA, 0x9, 0xC, 0x9, 0xE, 0x9, 0x10, 0x9, 0x12, 0x9, 0x14, 0x9, 0x16, 0x9, 0x18, 0x9, 0x1A, 0x9, 0x1C, 0x9, 0x1E, 0x9, 0x20, 0x9, 0x22, 0x9, 0x24, 0x9, 0x26, 0x9, 0x28, 0x9, 0x2A, 0x9, 0x2C, 0x9, 0x2E, 0x9, 0x30, 0x9, 0x31, 0x9, 0x33, 0x9, 0x35, 0x9, 0x37, 0x9, 0x39, 0x9, 0x3B, 0x9, 0x3D, 0x9, 0x3F, 0x9, 0x41, 0x9, 0x43, 0x9, 0x46, 0x9, 0x48, 0x9, 0x4A, 0x9, 0x4C, 0x9, 0x4E, 0x9, 0x50, 0x9, 0x52, 0x9, 0x54, 0x9, 0x56, 0x9, 0x58, 0x9, 0x5A, 0x9, 0x5C, 0x9, 0x5E, 0x9, 0x60, 0x9, 0x62, 0x9, 0x64, 0x9, 0x66, 0x9, 0x68, 0x9, 0x6A, 0x9, 0x6C, 0x9, 0x6E, 0x9, 0x70, 0x9, 0x72, 0x9, 0x73, 0x9, 0x75, 0x9, 0x77, 0x9, 0x79, 0x9, 0x7B, 0x9, 0xD5, 0x9, 0xD6, 0x9, 0xD7, 0x9, 0xD8, 0x9, 0xD9, 0x9, 0xDA, 0x9, 0xDB, 0x9, 0xDD, 0x9, 0xDE, 0x9, 0xDF, 0x9, 0xE0, 0x9, 0xE1, 0x9, 0xE2, 0x9, 0xE3, 0x9, 0xE4, 0x9, 0xE5, 0x9, 0xE6, 0x9, 0xE7, 0x9, 0xE8, 0x9, 0xE9, 0x9, 0xEA, 0x9, 0xEB, 0x9, 0xEC, 0x9, 0xFC, 0x9, 0xFD, 0x9, 0xFE, 0x9, 0xFF, 0xA, 0x0, 0xA, 0x1, 0xA, 0x2, 0xA, 0x3, 0xA, 0x4, 0xA, 0x5, 0xA, 0x6, 0xA, 0x7, 0xA, 0x8, 0xA, 0x9, 0xA, 0xA, 0xA, 0xB, 0xA, 0xC, 0xA, 0xD, 0xA, 0xE, 0xA, 0xF, 0xA, 0x10, 0xA, 0x11, 0xA, 0x22, 0xA, 0x24, 0xA, 0x26, 0xA, 0x28, 0xA, 0x3D, 0xA, 0x3F, 0xA, 0x41, 0xA, 0x56, 0xA, 0x5C, 0xA, 0x63, 0xA, 0xCD, 0xA, 0xD2, 0xA, 0xD6, 0xB, 0x9, 0xB, 0x3F, 0xC, 0xF4, 0xC, 0xF6, 0xC, 0xF8, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x1, 0xE2, 0x0, 0xEE, 0x8, 0xB2, 0x7, 0xB1, 0x7, 0xB0, 0x7, 0xAF, 0x7, 0xAE, 0x7, 0xA6, 0x7, 0x62, 0x7, 0x61, 0x7, 0x60, 0x7, 0x5F, 0x7, 0x5E, 0x7, 0x5D, 0x7, 0x5C, 0x7, 0x5B, 0x7, 0x5A, 0x7, 0x59, 0x7, 0x58, 0x7, 0x57, 0x7, 0x56, 0x7, 0x55, 0x7, 0x54, 0x7, 0x53, 0x7, 0x52, 0x7, 0x51, 0x7, 0x50, 0x7, 0x4F, 0x7, 0x4E, 0x7, 0xFE, 0x8, 0xB4, 0x9, 0x7E, 0x8, 0xB6, 0x8, 0xB5, 0x9, 0x7D, 0x7, 0x5F, 0x8, 0xB3, 0x8, 0xB8, 0x7, 0xDC, 0xC, 0xBE, 0xC, 0xBF, 0x7, 0x66, 0x7, 0x67, 0xC, 0xC0, 0xC, 0xC1, 0xC, 0xC2, 0x7, 0x68, 0xC, 0xC3, 0x7, 0x69, 0x7, 0x6A, 0x7, 0x6B, 0xC, 0xC8, 0x7, 0x6C, 0x7, 0x6C, 0xC, 0xC9, 0xC, 0xCA, 0x7, 0x6D, 0x7, 0x6E, 0x7, 0x6F, 0x7, 0x76, 0xC, 0xD7, 0xC, 0xD8, 0x7, 0x77, 0x7, 0x78, 0x7, 0x79, 0x7, 0x7A, 0x7, 0x7B, 0x7, 0x7C, 0xC, 0xDB, 0xC, 0xDC, 0xC, 0xDE, 0xC, 0xE1, 0xC, 0xEA, 0x7, 0x7E, 0x7, 0x7F, 0x7, 0x80, 0x7, 0x81, 0x7, 0x82, 0x7, 0x83, 0x7, 0x84, 0x7, 0x85, 0x7, 0x86, 0x7, 0x87, 0x7, 0x70, 0x7, 0x71, 0x7, 0x72, 0x7, 0x73, 0x7, 0x74, 0x7, 0x75, 0x7, 0xC4, 0x7, 0x89, 0x7, 0x8A, 0x7, 0x8B, 0x7, 0x8C, 0xC, 0xE4, 0x7, 0x8D, 0x7, 0x8F, 0x7, 0x90, 0x7, 0x91, 0x7, 0x93, 0x7, 0x95, 0x8, 0xB7, 0x9, 0x7F, 0x9, 0x80, 0x9, 0x81, 0x9, 0x82, 0x9, 0x83, 0x9, 0x84, 0x9, 0x85, 0x9, 0x86, 0x9, 0x87, 0x9, 0x88, 0x9, 0x89, 0x9, 0x8A, 0x9, 0x8B, 0x9, 0x8C, 0x9, 0x8D, 0x9, 0x8E, 0x9, 0x8F, 0x9, 0x90, 0x9, 0x91, 0x9, 0x92, 0x9, 0x93, 0x9, 0x94, 0x9, 0x95, 0x9, 0x96, 0x9, 0x97, 0x9, 0x98, 0x9, 0x99, 0x9, 0x9A, 0x9, 0xD1, 0x9, 0x9B, 0x9, 0x9C, 0x9, 0x9D, 0x9, 0x9E, 0x9, 0x9F, 0x9, 0xA0, 0x9, 0xA1, 0x9, 0xA2, 0x9, 0xA3, 0x9, 0xA4, 0x9, 0xA5, 0x9, 0xA6, 0x9, 0xA7, 0x9, 0xA8, 0x9, 0xA9, 0x9, 0xAA, 0x9, 0xAB, 0x9, 0xAC, 0x9, 0xAD, 0x9, 0xAE, 0x9, 0xAF, 0x9, 0xB0, 0xC, 0xEC, 0x9, 0xB2, 0x9, 0xB3, 0x9, 0xB4, 0x9, 0xB5, 0x9, 0xB6, 0x9, 0xB7, 0x9, 0xB8, 0x9, 0xB9, 0x9, 0xBA, 0x9, 0xBB, 0x9, 0xBC, 0x9, 0xBD, 0x9, 0xBF, 0x9, 0xC0, 0x9, 0xC1, 0x9, 0xC2, 0x9, 0xC3, 0x9, 0xC4, 0xC, 0xEF, 0x9, 0xC5, 0x9, 0xC6, 0x9, 0xC8, 0x9, 0xC7, 0x9, 0xC9, 0x9, 0xCA, 0x9, 0xCB, 0x9, 0xCC, 0x9, 0xCD, 0x9, 0xCE, 0x9, 0xCF, 0x9, 0xD0, 0x9, 0xD2, 0x9, 0xD3, 0x9, 0xD4, 0xC, 0xED, 0xC, 0xEE, 0xC, 0xB7, 0xC, 0xB8, 0xC, 0xB9, 0xC, 0xBA, 0xC, 0xC4, 0xC, 0xC7, 0xC, 0xC5, 0xC, 0xC6, 0xC, 0xCB, 0xC, 0xCC, 0xC, 0xCD, 0xC, 0xBB, 0xC, 0xBC, 0xC, 0xBD, 0xC, 0xD6, 0xC, 0xD9, 0xC, 0xDA, 0xC, 0xDD, 0xC, 0xDF, 0xC, 0xE0, 0x7, 0x7D, 0xC, 0xE2, 0xC, 0xCE, 0xC, 0xCF, 0xC, 0xD0, 0xC, 0xD1, 0xC, 0xD2, 0xC, 0xD3, 0xC, 0xD4, 0xC, 0xD5, 0xC, 0xF0, 0xC, 0xF1, 0xC, 0xF2, 0xC, 0xF3, 0xC, 0xE3, 0xC, 0xE5, 0xC, 0xE6, 0x7, 0x94, 0xC, 0xE8, 0x7, 0x96, 0xC, 0xE9, 0xC, 0xE7, 0x7, 0x92, 0x7, 0x88, 0x7, 0x8E, 0x9, 0xBE, 0xC, 0xEB, 0xC, 0xFA, 0xC, 0xFB, 0xC, 0xFC, 0x0, 0x1, 0x0, 0xEE, 0x0, 0xB, 0x0, 0x46, 0x0, 0x47, 0x0, 0x48, 0x0, 0x49, 0x0, 0x4A, 0x0, 0x4B, 0x0, 0x4C, 0x0, 0x4D, 0x0, 0x4E, 0x0, 0x4F, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5A, 0x0, 0x5B, 0x0, 0x5C, 0x0, 0x5D, 0x0, 0x5E, 0x0, 0x5F, 0x0, 0x86, 0x0, 0x87, 0x0, 0x88, 0x0, 0x8A, 0x0, 0x8B, 0x0, 0x8C, 0x0, 0x8E, 0x0, 0x91, 0x0, 0x93, 0x0, 0x95, 0x2, 0x3A, 0x2, 0x3B, 0x2, 0x3C, 0x2, 0x3D, 0x2, 0x3E, 0x2, 0x3F, 0x2, 0x40, 0x2, 0x41, 0x2, 0x42, 0x2, 0x43, 0x2, 0x44, 0x2, 0x45, 0x2, 0x46, 0x2, 0x47, 0x2, 0x48, 0x2, 0x49, 0x2, 0x4A, 0x2, 0x4B, 0x2, 0x4C, 0x2, 0x4D, 0x2, 0x80, 0x2, 0x81, 0x2, 0x82, 0x2, 0x83, 0x2, 0x84, 0x2, 0x85, 0x2, 0x86, 0x2, 0x87, 0x2, 0x88, 0x2, 0x89, 0x2, 0x8A, 0x2, 0x8B, 0x2, 0x8C, 0x2, 0x8D, 0x2, 0x8E, 0x2, 0x8F, 0x2, 0x90, 0x2, 0x91, 0x2, 0x92, 0x2, 0x93, 0x2, 0x94, 0x2, 0x95, 0x2, 0x96, 0x2, 0x97, 0x2, 0x98, 0x2, 0x99, 0x2, 0x9A, 0x2, 0x9B, 0x2, 0x9C, 0x2, 0x9D, 0x2, 0xC7, 0x2, 0xCB, 0x2, 0xCD, 0x2, 0xCF, 0x2, 0xD1, 0x2, 0xD3, 0x2, 0xD9, 0x2, 0xDB, 0x2, 0xDD, 0x2, 0xE1, 0x2, 0xE4, 0x2, 0xF1, 0x8, 0xCA, 0x8, 0xCC, 0x8, 0xE8, 0x8, 0xE9, 0x8, 0xEA, 0x8, 0xEB, 0x8, 0xEC, 0x8, 0xED, 0x8, 0xEE, 0x8, 0xEF, 0x8, 0xF0, 0x8, 0xF1, 0x8, 0xF2, 0x8, 0xF3, 0x8, 0xF4, 0x8, 0xF5, 0x8, 0xF6, 0x8, 0xF7, 0x8, 0xF8, 0x8, 0xF9, 0x8, 0xFA, 0x8, 0xFB, 0x8, 0xFC, 0x8, 0xFD, 0x8, 0xFE, 0x8, 0xFF, 0x9, 0x0, 0x9, 0x1, 0x9, 0x2, 0x9, 0x3, 0x9, 0x5, 0x9, 0x7, 0x9, 0x9, 0x9, 0xB, 0x9, 0xD, 0x9, 0xF, 0x9, 0x11, 0x9, 0x13, 0x9, 0x15, 0x9, 0x17, 0x9, 0x19, 0x9, 0x1B, 0x9, 0x1D, 0x9, 0x1F, 0x9, 0x21, 0x9, 0x23, 0x9, 0x25, 0x9, 0x27, 0x9, 0x29, 0x9, 0x2B, 0x9, 0x2D, 0x9, 0x2F, 0x9, 0x32, 0x9, 0x34, 0x9, 0x36, 0x9, 0x38, 0x9, 0x3A, 0x9, 0x3C, 0x9, 0x3E, 0x9, 0x40, 0x9, 0x42, 0x9, 0x44, 0x9, 0x47, 0x9, 0x49, 0x9, 0x4B, 0x9, 0x4D, 0x9, 0x4F, 0x9, 0x51, 0x9, 0x53, 0x9, 0x55, 0x9, 0x57, 0x9, 0x59, 0x9, 0x5B, 0x9, 0x5D, 0x9, 0x5F, 0x9, 0x61, 0x9, 0x63, 0x9, 0x65, 0x9, 0x67, 0x9, 0x69, 0x9, 0x6B, 0x9, 0x6D, 0x9, 0x6F, 0x9, 0x71, 0x9, 0x74, 0x9, 0x76, 0x9, 0x78, 0x9, 0x7A, 0x9, 0x7C, 0x9, 0xED, 0x9, 0xEE, 0x9, 0xEF, 0x9, 0xF0, 0x9, 0xF2, 0x9, 0xF3, 0x9, 0xF4, 0x9, 0xF5, 0x9, 0xF6, 0x9, 0xF7, 0x9, 0xF8, 0x9, 0xF9, 0x9, 0xFA, 0x9, 0xFB, 0xA, 0x12, 0xA, 0x13, 0xA, 0x14, 0xA, 0x15, 0xA, 0x16, 0xA, 0x17, 0xA, 0x18, 0xA, 0x19, 0xA, 0x1A, 0xA, 0x1B, 0xA, 0x1C, 0xA, 0x1D, 0xA, 0x1E, 0xA, 0x1F, 0xA, 0x20, 0xA, 0x21, 0xA, 0x23, 0xA, 0x25, 0xA, 0x27, 0xA, 0x29, 0xA, 0x3E, 0xA, 0x40, 0xA, 0x42, 0xA, 0x50, 0xA, 0x57, 0xA, 0x5D, 0xA, 0x64, 0xA, 0xCE, 0xA, 0xCF, 0xA, 0xD3, 0xA, 0xD7, 0xB, 0xA, 0xB, 0x43, 0xC, 0xF5, 0xC, 0xF7, 0xC, 0xF9, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x1, 0x4A, 0x0, 0xA2, 0x7, 0xE0, 0x7, 0xE1, 0x7, 0xE2, 0x7, 0xDE, 0x7, 0xDF, 0x7, 0xE0, 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x7, 0xE1, 0x0, 0x2B, 0x0, 0x2C, 0x0, 0x2D, 0x0, 0x2E, 0x0, 0x2F, 0x0, 0x30, 0x0, 0x31, 0x7, 0xE2, 0x7, 0xDE, 0x0, 0x34, 0x0, 0x35, 0x0, 0x36, 0x0, 0x37, 0x0, 0x38, 0x0, 0x39, 0x7, 0xDF, 0x0, 0x3B, 0x0, 0x3C, 0x0, 0x3D, 0x0, 0x3E, 0x0, 0x3F, 0x0, 0x82, 0x8, 0xC9, 0x0, 0x84, 0x0, 0x85, 0x8, 0xC8, 0x0, 0x92, 0x0, 0x94, 0x0, 0x8D, 0x8, 0xCB, 0xC, 0xFD, 0xC, 0xFE, 0xC, 0xFF, 0xD, 0x0, 0xD, 0x1, 0xD, 0x2, 0xD, 0x6, 0xD, 0x7, 0xD, 0x8, 0xD, 0x9, 0xD, 0xA, 0xD, 0x10, 0xD, 0x14, 0xD, 0x15, 0xD, 0x16, 0xC, 0xFD, 0xC, 0xFE, 0xC, 0xFF, 0xD, 0x0, 0xD, 0x1, 0xD, 0x2, 0xD, 0x6, 0x8, 0xD4, 0xD, 0x7, 0xD, 0x8, 0xD, 0x9, 0xD, 0xA, 0x8, 0xD9, 0x8, 0xDA, 0x8, 0xDB, 0x8, 0xDC, 0xD, 0x10, 0x8, 0xDE, 0x8, 0xDF, 0x8, 0xE0, 0x8, 0xE1, 0x8, 0xE2, 0xD, 0x14, 0xD, 0x15, 0x8, 0xE5, 0xD, 0x16, 0x8, 0xE7, 0x9, 0x72, 0xD, 0x3, 0xD, 0x3, 0xD, 0x4, 0xD, 0x4, 0xD, 0x5, 0xD, 0x5, 0x9, 0xA, 0x9, 0xC, 0x9, 0xE, 0x9, 0x10, 0x9, 0x12, 0xD, 0xB, 0xD, 0xB, 0xD, 0xC, 0xD, 0xC, 0xD, 0xD, 0xD, 0xD, 0xD, 0xE, 0xD, 0xE, 0xD, 0xF, 0xD, 0xF, 0x9, 0x1E, 0x9, 0x20, 0x9, 0x22, 0x9, 0x24, 0x9, 0x26, 0x9, 0x28, 0x9, 0x2A, 0x9, 0x2C, 0x9, 0x2E, 0x9, 0x31, 0x9, 0x33, 0x9, 0x35, 0x9, 0x37, 0x9, 0x39, 0x9, 0x3B, 0x9, 0x3D, 0xD, 0x11, 0xD, 0x11, 0xD, 0x12, 0xD, 0x12, 0xD, 0x13, 0xD, 0x13, 0x9, 0x46, 0x9, 0x48, 0x9, 0x4A, 0x9, 0x4C, 0x9, 0x4E, 0x9, 0x50, 0x9, 0x52, 0x9, 0x54, 0x9, 0x56, 0x9, 0x58, 0x9, 0x5A, 0x9, 0x5E, 0x9, 0x60, 0xD, 0x17, 0xD, 0x17, 0xD, 0x18, 0xD, 0x18, 0xD, 0x19, 0xD, 0x19, 0xD, 0x1A, 0xD, 0x1A, 0xD, 0x1B, 0xD, 0x1B, 0xD, 0x1C, 0xD, 0x1C, 0x9, 0x6E, 0x9, 0x70, 0x9, 0x73, 0x9, 0x75, 0x9, 0x77, 0x9, 0x79, 0x9, 0x7B, 0xA, 0x22, 0xA, 0x24, 0xA, 0x26, 0xA, 0x28, 0x0, 0x1, 0x0, 0xA2, 0x0, 0x26, 0x0, 0x2A, 0x0, 0x32, 0x0, 0x33, 0x0, 0x3A, 0x0, 0x46, 0x0, 0x47, 0x0, 0x48, 0x0, 0x49, 0x0, 0x4A, 0x0, 0x4B, 0x0, 0x4C, 0x0, 0x4D, 0x0, 0x4E, 0x0, 0x4F, 0x0, 0x50, 0x0, 0x51, 0x0, 0x52, 0x0, 0x53, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5A, 0x0, 0x5B, 0x0, 0x5C, 0x0, 0x5D, 0x0, 0x5E, 0x0, 0x5F, 0x0, 0x87, 0x0, 0x88, 0x0, 0x8A, 0x0, 0x8B, 0x0, 0x8C, 0x0, 0x93, 0x0, 0x95, 0x8, 0xCA, 0x8, 0xCC, 0x8, 0xCD, 0x8, 0xCE, 0x8, 0xCF, 0x8, 0xD0, 0x8, 0xD1, 0x8, 0xD2, 0x8, 0xD3, 0x8, 0xD5, 0x8, 0xD6, 0x8, 0xD7, 0x8, 0xD8, 0x8, 0xDD, 0x8, 0xE3, 0x8, 0xE4, 0x8, 0xE6, 0x8, 0xE8, 0x8, 0xE9, 0x8, 0xEA, 0x8, 0xEB, 0x8, 0xEC, 0x8, 0xED, 0x8, 0xEE, 0x8, 0xEF, 0x8, 0xF0, 0x8, 0xF1, 0x8, 0xF2, 0x8, 0xF3, 0x8, 0xF4, 0x8, 0xF5, 0x8, 0xF6, 0x8, 0xF7, 0x8, 0xF8, 0x8, 0xF9, 0x8, 0xFA, 0x8, 0xFB, 0x8, 0xFC, 0x8, 0xFD, 0x8, 0xFE, 0x8, 0xFF, 0x9, 0x0, 0x9, 0x1, 0x9, 0x2, 0x9, 0x3, 0x9, 0x4, 0x9, 0x5, 0x9, 0x6, 0x9, 0x7, 0x9, 0x8, 0x9, 0x9, 0x9, 0xB, 0x9, 0xD, 0x9, 0xF, 0x9, 0x11, 0x9, 0x13, 0x9, 0x14, 0x9, 0x15, 0x9, 0x16, 0x9, 0x17, 0x9, 0x18, 0x9, 0x19, 0x9, 0x1A, 0x9, 0x1B, 0x9, 0x1C, 0x9, 0x1D, 0x9, 0x1F, 0x9, 0x21, 0x9, 0x23, 0x9, 0x25, 0x9, 0x27, 0x9, 0x29, 0x9, 0x2B, 0x9, 0x2D, 0x9, 0x2F, 0x9, 0x32, 0x9, 0x34, 0x9, 0x36, 0x9, 0x38, 0x9, 0x3A, 0x9, 0x3C, 0x9, 0x3E, 0x9, 0x3F, 0x9, 0x40, 0x9, 0x41, 0x9, 0x42, 0x9, 0x43, 0x9, 0x44, 0x9, 0x47, 0x9, 0x49, 0x9, 0x4B, 0x9, 0x4D, 0x9, 0x4F, 0x9, 0x51, 0x9, 0x53, 0x9, 0x55, 0x9, 0x57, 0x9, 0x59, 0x9, 0x5B, 0x9, 0x5F, 0x9, 0x61, 0x9, 0x62, 0x9, 0x63, 0x9, 0x64, 0x9, 0x65, 0x9, 0x66, 0x9, 0x67, 0x9, 0x68, 0x9, 0x69, 0x9, 0x6A, 0x9, 0x6B, 0x9, 0x6C, 0x9, 0x6D, 0x9, 0x6F, 0x9, 0x71, 0x9, 0x74, 0x9, 0x76, 0x9, 0x78, 0x9, 0x7A, 0x9, 0x7C, 0xA, 0x23, 0xA, 0x25, 0xA, 0x27, 0xA, 0x29, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0xB6, 0x0, 0xE, 0x0, 0x22, 0x0, 0x34, 0x0, 0x3E, 0x0, 0x48, 0x0, 0x52, 0x0, 0x5C, 0x0, 0x66, 0x0, 0x70, 0x0, 0x7A, 0x0, 0x84, 0x0, 0x8E, 0x0, 0x98, 0x0, 0xA2, 0x0, 0xAC, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0x8, 0x8A, 0x0, 0x2, 0x3, 0x2B, 0x8, 0x8B, 0x0, 0x2, 0x3, 0x2C, 0x0, 0x1, 0x0, 0x4, 0x8, 0x8C, 0x0, 0x2, 0x3, 0x2B, 0x0, 0x1, 0x0, 0x4, 0x8, 0x8D, 0x0, 0x2, 0x3, 0x2B, 0x0, 0x1, 0x0, 0x4, 0x8, 0x8E, 0x0, 0x2, 0x3, 0x2B, 0x0, 0x1, 0x0, 0x4, 0x8, 0x91, 0x0, 0x2, 0x3, 0x2D, 0x0, 0x1, 0x0, 0x4, 0x8, 0x90, 0x0, 0x2, 0x3, 0x2D, 0x0, 0x1, 0x0, 0x4, 0x8, 0x92, 0x0, 0x2, 0x3, 0x2D, 0x0, 0x1, 0x0, 0x4, 0x8, 0x93, 0x0, 0x2, 0x3, 0x2D, 0x0, 0x1, 0x0, 0x4, 0x8, 0x94, 0x0, 0x2, 0x3, 0x2D, 0x0, 0x1, 0x0, 0x4, 0x8, 0x95, 0x0, 0x2, 0x3, 0x2D, 0x0, 0x1, 0x0, 0x4, 0x8, 0x8F, 0x0, 0x2, 0x3, 0x2D, 0x0, 0x1, 0x0, 0x4, 0x8, 0x98, 0x0, 0x2, 0x3, 0x2D, 0x0, 0x1, 0x0, 0x4, 0x8, 0x96, 0x0, 0x2, 0x3, 0x2D, 0x0, 0x1, 0x0, 0x4, 0x8, 0x97, 0x0, 0x2, 0x3, 0x2D, 0x0, 0x1, 0x0, 0xE, 0x1, 0xB4, 0x1, 0xB5, 0x1, 0xB9, 0x1, 0xBD, 0x1, 0xD4, 0x1, 0xD5, 0x1, 0xD6, 0x1, 0xDA, 0x1, 0xE0, 0x1, 0xE1, 0x1, 0xF6, 0x3, 0x28, 0x3, 0x29, 0x3, 0x2A, 0x0, 0x6, 0x0, 0x0, 0x0, 0x12, 0x0, 0x2A, 0x0, 0x42, 0x0, 0x5A, 0x0, 0x72, 0x0, 0x8A, 0x0, 0xA2, 0x0, 0xBA, 0x0, 0xD2, 0x0, 0xEA, 0x1, 0x2, 0x1, 0x1A, 0x1, 0x32, 0x1, 0x4A, 0x1, 0x62, 0x1, 0x7A, 0x1, 0x92, 0x1, 0xAA, 0x1, 0xC2, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x1, 0xB0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x0, 0x4E, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x1, 0x98, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x0, 0x4F, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x1, 0x80, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x9, 0x2F, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x1, 0x68, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x0, 0xFE, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x1, 0x50, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1D, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x1, 0x38, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x1, 0x4F, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x1, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x1, 0x64, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x1, 0x8, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0xB, 0x43, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0xF0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0xA, 0x1D, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0xD8, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0xA, 0x1F, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0xC0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x3, 0x91, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0xA8, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x3, 0xC5, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x90, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x3, 0xD3, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x78, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x3, 0xD7, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x60, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x4, 0x2C, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x48, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0xA, 0x99, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x30, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x4, 0x9C, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x18, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x1, 0x0, 0x1, 0x5, 0x72, 0x0, 0x2, 0x0, 0x19, 0x1, 0xB1, 0x1, 0xC6, 0x0, 0x0, 0x1, 0xCB, 0x1, 0xCC, 0x0, 0x16, 0x1, 0xEE, 0x1, 0xF5, 0x0, 0x18, 0x1, 0xF7, 0x1, 0xF7, 0x0, 0x20, 0x1, 0xFB, 0x1, 0xFD, 0x0, 0x21, 0x2, 0x1, 0x2, 0x3, 0x0, 0x24, 0x2, 0x8, 0x2, 0x9, 0x0, 0x27, 0x2, 0xC, 0x2, 0xC, 0x0, 0x29, 0x2, 0x14, 0x2, 0x20, 0x0, 0x2A, 0x2, 0xBA, 0x2, 0xBE, 0x0, 0x37, 0x3, 0x20, 0x3, 0x24, 0x0, 0x3C, 0x3, 0x2B, 0x3, 0x2C, 0x0, 0x41, 0x3, 0xEF, 0x3, 0xF0, 0x0, 0x43, 0x3, 0xF2, 0x3, 0xF8, 0x0, 0x45, 0x3, 0xFA, 0x3, 0xFD, 0x0, 0x4C, 0x4, 0x0, 0x4, 0x24, 0x0, 0x50, 0x4, 0x27, 0x4, 0x27, 0x0, 0x75, 0x4, 0xE3, 0x4, 0xE3, 0x0, 0x76, 0x4, 0xE5, 0x4, 0xE5, 0x0, 0x77, 0x5, 0x76, 0x5, 0x95, 0x0, 0x78, 0x6, 0x8, 0x6, 0x8, 0x0, 0x98, 0x6, 0xD, 0x6, 0x16, 0x0, 0x99, 0x6, 0x37, 0x6, 0x37, 0x0, 0xA3, 0x7, 0x2D, 0x7, 0x33, 0x0, 0xA4, 0x8, 0x8A, 0x8, 0x8E, 0x0, 0xAB, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x2A, 0x0, 0x12, 0x7, 0xF5, 0x7, 0xEE, 0x7, 0xF0, 0x7, 0xF1, 0x7, 0xF3, 0x7, 0xFC, 0x7, 0xF9, 0x7, 0xEF, 0x7, 0xF6, 0x7, 0xFB, 0xD, 0x1D, 0x7, 0xF4, 0x7, 0xFD, 0x7, 0xF7, 0x7, 0xF8, 0x7, 0xF2, 0xD, 0x1E, 0x7, 0xFA, 0x0, 0x1, 0x0, 0x12, 0x0, 0x4E, 0x0, 0x4F, 0x0, 0xFE, 0x1, 0x1D, 0x1, 0x4F, 0x1, 0x64, 0x3, 0x91, 0x3, 0xC5, 0x3, 0xD3, 0x3, 0xD7, 0x4, 0x2C, 0x4, 0x9C, 0x5, 0x72, 0x9, 0x2F, 0xA, 0x1D, 0xA, 0x1F, 0xA, 0x99, 0xB, 0x43, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0xE, 0xC0, 0x0, 0x3D, 0x0, 0x80, 0x1, 0x5C, 0x1, 0x76, 0x1, 0xA0, 0x1, 0xD2, 0x2, 0x98, 0x2, 0xA2, 0x2, 0xDC, 0x3, 0xE, 0x3, 0x92, 0x3, 0x9C, 0x3, 0xC6, 0x3, 0xF8, 0x4, 0x12, 0x4, 0x5C, 0x5, 0x44, 0x5, 0x56, 0x5, 0x98, 0x5, 0xE6, 0x6, 0x20, 0x6, 0xEE, 0x7, 0x0, 0x7, 0x32, 0x7, 0x44, 0x7, 0x8E, 0x7, 0xC0, 0x8, 0x42, 0x8, 0x5C, 0x8, 0x86, 0x8, 0xB8, 0x9, 0x42, 0x9, 0x4C, 0x9, 0x7E, 0x9, 0xB8, 0x9, 0xD2, 0x9, 0xFC, 0xA, 0x36, 0xA, 0x50, 0xA, 0x9A, 0xB, 0x14, 0xB, 0x26, 0xB, 0x68, 0xB, 0xA2, 0xB, 0xE4, 0xC, 0x76, 0xC, 0x88, 0xC, 0xC2, 0xC, 0xD4, 0xD, 0x26, 0xD, 0x58, 0xD, 0x6A, 0xD, 0x74, 0xD, 0x86, 0xD, 0x90, 0xD, 0xEA, 0xD, 0xF4, 0xE, 0x1E, 0xE, 0x48, 0xE, 0x72, 0xE, 0x9C, 0xE, 0xAE, 0x0, 0x19, 0x0, 0x34, 0x0, 0x3C, 0x0, 0x44, 0x0, 0x4C, 0x0, 0x54, 0x0, 0x5C, 0x0, 0x64, 0x0, 0x6C, 0x0, 0x74, 0x0, 0x7C, 0x0, 0x82, 0x0, 0x88, 0x0, 0x8E, 0x0, 0x94, 0x0, 0x9A, 0x0, 0xA0, 0x0, 0xA6, 0x0, 0xAC, 0x0, 0xB2, 0x0, 0xB8, 0x0, 0xBE, 0x0, 0xC4, 0x0, 0xCA, 0x0, 0xD0, 0x0, 0xD6, 0xA, 0x7C, 0x0, 0x3, 0x1, 0xB7, 0x1, 0xB2, 0xA, 0x7E, 0x0, 0x3, 0x1, 0xB7, 0x1, 0xB1, 0xA, 0x80, 0x0, 0x3, 0x1, 0xB7, 0x1, 0xBA, 0xA, 0x72, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xB2, 0xA, 0x74, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xB1, 0xA, 0x76, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xBA, 0xA, 0x78, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xB4, 0xA, 0xFF, 0x0, 0x3, 0x1, 0xB9, 0x1, 0xB5, 0xB, 0x1, 0x0, 0x3, 0x1, 0xB8, 0x1, 0xB5, 0x8, 0xCE, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x16, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x6, 0x0, 0x2, 0x1, 0xB7, 0x8, 0xCF, 0x0, 0x2, 0x1, 0xB3, 0x8, 0xD1, 0x0, 0x2, 0x1, 0xB9, 0xA, 0x6E, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x2E, 0x0, 0x2, 0x1, 0xB8, 0x8, 0xCD, 0x0, 0x2, 0x1, 0xB1, 0xA, 0x70, 0x0, 0x2, 0x1, 0xBA, 0x9, 0x4, 0x0, 0x2, 0x1, 0xB5, 0x9, 0x8, 0x0, 0x2, 0x1, 0xD9, 0x8, 0xD2, 0x0, 0x2, 0x1, 0xBB, 0xA, 0x31, 0x0, 0x2, 0x1, 0xD6, 0x8, 0xD0, 0x0, 0x2, 0x1, 0xB4, 0xA, 0xEE, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x14, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x3, 0x0, 0x8, 0x0, 0xE, 0x0, 0x14, 0xB, 0x4F, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x4D, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x51, 0x0, 0x2, 0x1, 0xE2, 0x0, 0x5, 0x0, 0xC, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0x9, 0xA, 0x0, 0x2, 0x1, 0xB2, 0x8, 0xD4, 0x0, 0x2, 0x1, 0xD8, 0x9, 0xC, 0x0, 0x2, 0x1, 0xB3, 0x9, 0xE, 0x0, 0x2, 0x1, 0xB8, 0x9, 0x10, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x6, 0x0, 0xE, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0xB, 0x5D, 0x0, 0x2, 0x1, 0xDE, 0xB, 0x5B, 0x0, 0x2, 0x7, 0x25, 0xB, 0x57, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x55, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x59, 0x0, 0x2, 0x1, 0xE2, 0x9, 0x12, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x17, 0x0, 0x30, 0x0, 0x38, 0x0, 0x40, 0x0, 0x48, 0x0, 0x50, 0x0, 0x58, 0x0, 0x60, 0x0, 0x66, 0x0, 0x6C, 0x0, 0x72, 0x0, 0x78, 0x0, 0x7E, 0x0, 0x84, 0x0, 0x8A, 0x0, 0x90, 0x0, 0x96, 0x0, 0x9C, 0x0, 0xA2, 0x0, 0xA8, 0x0, 0xAE, 0x0, 0xB4, 0x0, 0xBA, 0x0, 0xC0, 0xA, 0x8C, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xB2, 0xA, 0x8E, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xB1, 0xA, 0x90, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xBA, 0xA, 0x92, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xB4, 0xB, 0x61, 0x0, 0x3, 0x1, 0xB5, 0x1, 0xB2, 0xB, 0x5F, 0x0, 0x3, 0x1, 0xB5, 0x1, 0xB1, 0x8, 0xD6, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x1A, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x16, 0x0, 0x2, 0x1, 0xB7, 0xB, 0x30, 0x0, 0x2, 0x1, 0xD8, 0x8, 0xD7, 0x0, 0x2, 0x1, 0xB3, 0xB, 0x63, 0x0, 0x2, 0x1, 0xDE, 0x8, 0xD8, 0x0, 0x2, 0x1, 0xB9, 0xA, 0x86, 0x0, 0x2, 0x1, 0xD4, 0x9, 0x18, 0x0, 0x2, 0x1, 0xB8, 0x8, 0xD5, 0x0, 0x2, 0x1, 0xB1, 0xA, 0x88, 0x0, 0x2, 0x1, 0xBA, 0x9, 0x14, 0x0, 0x2, 0x1, 0xB5, 0x9, 0x1A, 0x0, 0x2, 0x1, 0xD9, 0xA, 0x8A, 0x0, 0x2, 0x1, 0xB4, 0xB, 0x65, 0x0, 0x2, 0x1, 0xE1, 0x9, 0x1C, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x18, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x1, 0x0, 0x4, 0xB, 0x69, 0x0, 0x2, 0x1, 0xB8, 0x0, 0x7, 0x0, 0x10, 0x0, 0x16, 0x0, 0x1C, 0x0, 0x22, 0x0, 0x28, 0x0, 0x2E, 0x0, 0x34, 0xB, 0x10, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x20, 0x0, 0x2, 0x1, 0xB7, 0x9, 0x1E, 0x0, 0x2, 0x1, 0xB3, 0x9, 0x24, 0x0, 0x2, 0x7, 0x25, 0x9, 0x22, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x6B, 0x0, 0x2, 0x1, 0xB5, 0xB, 0x5, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x6, 0x0, 0xE, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0xB, 0x73, 0x0, 0x2, 0x1, 0xDF, 0x9, 0x26, 0x0, 0x2, 0x1, 0xB3, 0xB, 0x71, 0x0, 0x2, 0x1, 0xB9, 0xB, 0x6F, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x6D, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x2C, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x10, 0x0, 0x22, 0x0, 0x2A, 0x0, 0x30, 0x0, 0x36, 0x0, 0x3C, 0x0, 0x42, 0x0, 0x48, 0x0, 0x4E, 0x0, 0x54, 0x0, 0x5A, 0x0, 0x60, 0x0, 0x66, 0x0, 0x6C, 0x0, 0x72, 0x0, 0x78, 0x0, 0x7E, 0x4, 0x2D, 0x0, 0x3, 0x1, 0xB9, 0x1, 0xB2, 0x8, 0xDA, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x1E, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x2C, 0x0, 0x2, 0x1, 0xB7, 0x8, 0xDB, 0x0, 0x2, 0x1, 0xB3, 0x8, 0xDC, 0x0, 0x2, 0x1, 0xB9, 0xA, 0x98, 0x0, 0x2, 0x1, 0xD4, 0x9, 0x30, 0x0, 0x2, 0x1, 0xB8, 0x8, 0xD9, 0x0, 0x2, 0x1, 0xB1, 0xA, 0x96, 0x0, 0x2, 0x1, 0xBA, 0x9, 0x2A, 0x0, 0x2, 0x1, 0xB5, 0x9, 0x2E, 0x0, 0x2, 0x1, 0xD9, 0x9, 0x28, 0x0, 0x2, 0x1, 0xB4, 0x4, 0x2B, 0x0, 0x2, 0x1, 0xE1, 0xA, 0xF0, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x1C, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x1, 0x0, 0x4, 0x9, 0x33, 0x0, 0x2, 0x1, 0xB3, 0x0, 0x5, 0x0, 0xC, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0xB, 0x75, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x35, 0x0, 0x2, 0x7, 0x25, 0xB, 0x77, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x79, 0x0, 0x2, 0x1, 0xE2, 0xB, 0x7, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x6, 0x0, 0xE, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0x9, 0x37, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x81, 0x0, 0x2, 0x1, 0xDE, 0x9, 0x39, 0x0, 0x2, 0x7, 0x25, 0xB, 0x7B, 0x0, 0x2, 0x1, 0xD4, 0x9, 0x3D, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x7F, 0x0, 0x2, 0x1, 0xE2, 0x0, 0x3, 0x0, 0x8, 0x0, 0xE, 0x0, 0x14, 0xA, 0x2F, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x85, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x83, 0x0, 0x2, 0x1, 0xB8, 0x0, 0x9, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x32, 0x0, 0x38, 0x0, 0x3E, 0x0, 0x44, 0x9, 0x3F, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x8D, 0x0, 0x2, 0x1, 0xDE, 0x9, 0x41, 0x0, 0x2, 0x7, 0x25, 0xB, 0x89, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x87, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x12, 0x0, 0x2, 0x1, 0xB1, 0xB, 0x8B, 0x0, 0x2, 0x1, 0xE2, 0x8, 0xDD, 0x0, 0x2, 0x1, 0xB4, 0x9, 0x43, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x1A, 0x0, 0x36, 0x0, 0x3E, 0x0, 0x46, 0x0, 0x4E, 0x0, 0x56, 0x0, 0x5E, 0x0, 0x66, 0x0, 0x6E, 0x0, 0x76, 0x0, 0x7E, 0x0, 0x86, 0x0, 0x8E, 0x0, 0x94, 0x0, 0x9A, 0x0, 0xA0, 0x0, 0xA6, 0x0, 0xAC, 0x0, 0xB2, 0x0, 0xB8, 0x0, 0xBE, 0x0, 0xC4, 0x0, 0xCA, 0x0, 0xD0, 0x0, 0xD6, 0x0, 0xDC, 0x0, 0xE2, 0xA, 0x9E, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xB2, 0xA, 0xA0, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xB1, 0xA, 0xA2, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xBA, 0xA, 0xA4, 0x0, 0x3, 0x1, 0xB3, 0x1, 0xB4, 0xB, 0x32, 0x0, 0x3, 0x1, 0xB9, 0x1, 0xB5, 0xB, 0x38, 0x0, 0x3, 0x1, 0xB8, 0x1, 0xB5, 0xB, 0x95, 0x0, 0x3, 0x1, 0xB5, 0x1, 0xB2, 0xB, 0x93, 0x0, 0x3, 0x1, 0xB5, 0x1, 0xB1, 0xB, 0x8F, 0x0, 0x3, 0x1, 0xB4, 0x1, 0xB2, 0xB, 0x91, 0x0, 0x3, 0x1, 0xB4, 0x1, 0xB9, 0xB, 0x34, 0x0, 0x3, 0x1, 0xB4, 0x1, 0xB5, 0x8, 0xDF, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x4A, 0x0, 0x2, 0x1, 0xBC, 0xB, 0x22, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x48, 0x0, 0x2, 0x1, 0xB7, 0x8, 0xE0, 0x0, 0x2, 0x1, 0xB3, 0x8, 0xE2, 0x0, 0x2, 0x1, 0xB9, 0xA, 0x9A, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x36, 0x0, 0x2, 0x1, 0xB8, 0x8, 0xDE, 0x0, 0x2, 0x1, 0xB1, 0xA, 0x9C, 0x0, 0x2, 0x1, 0xBA, 0x9, 0x46, 0x0, 0x2, 0x1, 0xB5, 0xB, 0x9, 0x0, 0x2, 0x1, 0xD9, 0x8, 0xE1, 0x0, 0x2, 0x1, 0xB4, 0xA, 0xF2, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x20, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0xB, 0x97, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x99, 0x0, 0x2, 0x1, 0xB8, 0x0, 0x8, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0x0, 0x2A, 0x0, 0x30, 0x0, 0x36, 0x0, 0x3C, 0x9, 0x4C, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x26, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x4E, 0x0, 0x2, 0x7, 0x25, 0xB, 0x9D, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x9B, 0x0, 0x2, 0x1, 0xB8, 0xB, 0xA1, 0x0, 0x2, 0x1, 0xE2, 0x9, 0x50, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x24, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x9, 0x0, 0x14, 0x0, 0x1C, 0x0, 0x24, 0x0, 0x2A, 0x0, 0x30, 0x0, 0x36, 0x0, 0x3C, 0x0, 0x42, 0x0, 0x48, 0xB, 0xA7, 0x0, 0x3, 0x1, 0xB2, 0x1, 0xB8, 0xB, 0xA9, 0x0, 0x3, 0x1, 0xBD, 0x1, 0xB8, 0x9, 0x52, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x56, 0x0, 0x2, 0x1, 0xD8, 0x9, 0x54, 0x0, 0x2, 0x1, 0xB3, 0x9, 0x58, 0x0, 0x2, 0x7, 0x25, 0xB, 0xA5, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xA3, 0x0, 0x2, 0x1, 0xB8, 0x9, 0x5A, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x7, 0x0, 0x10, 0x0, 0x16, 0x0, 0x1C, 0x0, 0x22, 0x0, 0x28, 0x0, 0x2E, 0x0, 0x34, 0x9, 0x5E, 0x0, 0x2, 0x1, 0xD8, 0xB, 0xB3, 0x0, 0x2, 0x1, 0xDE, 0x9, 0x5C, 0x0, 0x2, 0x7, 0x25, 0xB, 0xAF, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xAD, 0x0, 0x2, 0x1, 0xB8, 0xB, 0xB1, 0x0, 0x2, 0x1, 0xE2, 0x9, 0x60, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x18, 0x0, 0x32, 0x0, 0x3A, 0x0, 0x42, 0x0, 0x4A, 0x0, 0x52, 0x0, 0x5A, 0x0, 0x62, 0x0, 0x68, 0x0, 0x6E, 0x0, 0x74, 0x0, 0x7A, 0x0, 0x80, 0x0, 0x86, 0x0, 0x8C, 0x0, 0x92, 0x0, 0x98, 0x0, 0x9E, 0x0, 0xA4, 0x0, 0xAA, 0x0, 0xB0, 0x0, 0xB6, 0x0, 0xBC, 0x0, 0xC2, 0x0, 0xC8, 0xA, 0xF8, 0x0, 0x3, 0x1, 0xB9, 0x1, 0xB2, 0xA, 0xFC, 0x0, 0x3, 0x1, 0xB9, 0x1, 0xB1, 0xA, 0xF6, 0x0, 0x3, 0x1, 0xB9, 0x1, 0xB5, 0xA, 0xFA, 0x0, 0x3, 0x1, 0xB9, 0x1, 0xBD, 0xB, 0xBD, 0x0, 0x3, 0x1, 0xB5, 0x1, 0xB9, 0xB, 0xBB, 0x0, 0x3, 0x1, 0xB4, 0x1, 0xB2, 0x8, 0xE4, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x6A, 0x0, 0x2, 0x1, 0xBC, 0xB, 0x2A, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x66, 0x0, 0x2, 0x1, 0xB7, 0x8, 0xE5, 0x0, 0x2, 0x1, 0xB3, 0xB, 0xB9, 0x0, 0x2, 0x1, 0xDE, 0x8, 0xE6, 0x0, 0x2, 0x1, 0xB9, 0xA, 0xB2, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xB5, 0x0, 0x2, 0x1, 0xD5, 0x8, 0xE3, 0x0, 0x2, 0x1, 0xB1, 0xA, 0xB4, 0x0, 0x2, 0x1, 0xBA, 0x9, 0x64, 0x0, 0x2, 0x1, 0xB5, 0x9, 0x6C, 0x0, 0x2, 0x1, 0xD9, 0x9, 0x68, 0x0, 0x2, 0x1, 0xBB, 0x9, 0x62, 0x0, 0x2, 0x1, 0xB4, 0xB, 0xB7, 0x0, 0x2, 0x1, 0xE1, 0xA, 0xF4, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x28, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0xB, 0xC1, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xBF, 0x0, 0x2, 0x1, 0xB4, 0x0, 0x6, 0x0, 0xE, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0xA, 0x24, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x6E, 0x0, 0x2, 0x1, 0xB3, 0xA, 0x26, 0x0, 0x2, 0x1, 0xB9, 0xB, 0xC5, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xC3, 0x0, 0x2, 0x1, 0xB8, 0xA, 0x22, 0x0, 0x2, 0x1, 0xB1, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0xB, 0xC9, 0x0, 0x2, 0x1, 0xB9, 0xB, 0xC7, 0x0, 0x2, 0x1, 0xB8, 0x0, 0x9, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x32, 0x0, 0x38, 0x0, 0x3E, 0x0, 0x44, 0x8, 0xE7, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x70, 0x0, 0x2, 0x1, 0xB3, 0x9, 0x72, 0x0, 0x2, 0x1, 0xB9, 0xA, 0xC0, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xCB, 0x0, 0x2, 0x1, 0xB8, 0xA, 0x28, 0x0, 0x2, 0x1, 0xB1, 0xA, 0xC2, 0x0, 0x2, 0x1, 0xBA, 0xB, 0x3A, 0x0, 0x2, 0x1, 0xB5, 0xA, 0xC4, 0x0, 0x2, 0x1, 0xB4, 0x0, 0x6, 0x0, 0xE, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0x9, 0x73, 0x0, 0x2, 0x1, 0xB2, 0xB, 0xCD, 0x0, 0x2, 0x1, 0xB3, 0xB, 0xCF, 0x0, 0x2, 0x1, 0xD4, 0x9, 0x75, 0x0, 0x2, 0x1, 0xB8, 0xB, 0xD1, 0x0, 0x2, 0x1, 0xE2, 0x9, 0x77, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x10, 0x0, 0x22, 0x0, 0x28, 0x0, 0x2E, 0x0, 0x34, 0x0, 0x3A, 0x0, 0x40, 0x0, 0x46, 0x0, 0x4C, 0x0, 0x52, 0x0, 0x58, 0x0, 0x5E, 0x0, 0x64, 0x0, 0x6A, 0x0, 0x70, 0x0, 0x76, 0x0, 0x7C, 0x8, 0xE9, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x17, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x7, 0x0, 0x2, 0x1, 0xB7, 0x8, 0xEA, 0x0, 0x2, 0x1, 0xB3, 0x8, 0xEC, 0x0, 0x2, 0x1, 0xB9, 0xA, 0x6F, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x2F, 0x0, 0x2, 0x1, 0xB8, 0x8, 0xE8, 0x0, 0x2, 0x1, 0xB1, 0xA, 0x71, 0x0, 0x2, 0x1, 0xBA, 0x9, 0x5, 0x0, 0x2, 0x1, 0xB5, 0x9, 0x9, 0x0, 0x2, 0x1, 0xD9, 0x8, 0xED, 0x0, 0x2, 0x1, 0xBB, 0xA, 0x32, 0x0, 0x2, 0x1, 0xD6, 0x8, 0xEB, 0x0, 0x2, 0x1, 0xB4, 0xA, 0xEF, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x15, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x3, 0x0, 0x8, 0x0, 0xE, 0x0, 0x14, 0xB, 0x50, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x4E, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x52, 0x0, 0x2, 0x1, 0xE2, 0x0, 0x5, 0x0, 0xC, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0x9, 0xB, 0x0, 0x2, 0x1, 0xB2, 0x8, 0xEF, 0x0, 0x2, 0x1, 0xD8, 0x9, 0xD, 0x0, 0x2, 0x1, 0xB3, 0x9, 0xF, 0x0, 0x2, 0x1, 0xB8, 0x9, 0x11, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x6, 0x0, 0xE, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0xB, 0x5E, 0x0, 0x2, 0x1, 0xDE, 0xB, 0x5C, 0x0, 0x2, 0x7, 0x25, 0xB, 0x58, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x56, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x5A, 0x0, 0x2, 0x1, 0xE2, 0x9, 0x13, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x11, 0x0, 0x24, 0x0, 0x2A, 0x0, 0x30, 0x0, 0x36, 0x0, 0x3C, 0x0, 0x42, 0x0, 0x48, 0x0, 0x4E, 0x0, 0x54, 0x0, 0x5A, 0x0, 0x60, 0x0, 0x66, 0x0, 0x6C, 0x0, 0x72, 0x0, 0x78, 0x0, 0x7E, 0x0, 0x84, 0x8, 0xF1, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x1B, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x17, 0x0, 0x2, 0x1, 0xB7, 0xB, 0x31, 0x0, 0x2, 0x1, 0xD8, 0x8, 0xF2, 0x0, 0x2, 0x1, 0xB3, 0xB, 0x64, 0x0, 0x2, 0x1, 0xDE, 0x8, 0xF3, 0x0, 0x2, 0x1, 0xB9, 0xA, 0x87, 0x0, 0x2, 0x1, 0xD4, 0x9, 0x19, 0x0, 0x2, 0x1, 0xB8, 0x8, 0xF0, 0x0, 0x2, 0x1, 0xB1, 0xA, 0x89, 0x0, 0x2, 0x1, 0xBA, 0x9, 0x15, 0x0, 0x2, 0x1, 0xB5, 0x9, 0x1B, 0x0, 0x2, 0x1, 0xD9, 0xA, 0x8B, 0x0, 0x2, 0x1, 0xB4, 0xB, 0x66, 0x0, 0x2, 0x1, 0xE1, 0x9, 0x1D, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x19, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x1, 0x0, 0x4, 0xB, 0x6A, 0x0, 0x2, 0x1, 0xB8, 0x0, 0x6, 0x0, 0xE, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0xB, 0x11, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x21, 0x0, 0x2, 0x1, 0xB7, 0x9, 0x1F, 0x0, 0x2, 0x1, 0xB3, 0x9, 0x23, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x6C, 0x0, 0x2, 0x1, 0xB5, 0xB, 0x6, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x7, 0x0, 0x10, 0x0, 0x16, 0x0, 0x1C, 0x0, 0x22, 0x0, 0x28, 0x0, 0x2E, 0x0, 0x34, 0xB, 0x74, 0x0, 0x2, 0x1, 0xDF, 0x9, 0x27, 0x0, 0x2, 0x1, 0xB3, 0xB, 0x72, 0x0, 0x2, 0x1, 0xB9, 0xB, 0x70, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x6E, 0x0, 0x2, 0x1, 0xB8, 0xB, 0xD3, 0x0, 0x2, 0x1, 0xE2, 0xB, 0x2D, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x3, 0x0, 0x8, 0x0, 0xE, 0x0, 0x14, 0xA, 0x99, 0x0, 0x2, 0x1, 0xD4, 0x9, 0x2F, 0x0, 0x2, 0x1, 0xD9, 0x4, 0x2C, 0x0, 0x2, 0x1, 0xE1, 0x0, 0x5, 0x0, 0xC, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0xB, 0x76, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x36, 0x0, 0x2, 0x7, 0x25, 0xB, 0x78, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x7A, 0x0, 0x2, 0x1, 0xE2, 0xB, 0x8, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x7, 0x0, 0x10, 0x0, 0x16, 0x0, 0x1C, 0x0, 0x22, 0x0, 0x28, 0x0, 0x2E, 0x0, 0x34, 0x9, 0x38, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x82, 0x0, 0x2, 0x1, 0xDE, 0x9, 0x3A, 0x0, 0x2, 0x7, 0x25, 0xB, 0x7C, 0x0, 0x2, 0x1, 0xD4, 0x9, 0x3E, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x80, 0x0, 0x2, 0x1, 0xE2, 0x9, 0x3C, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x3, 0x0, 0x8, 0x0, 0xE, 0x0, 0x14, 0xA, 0x30, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x86, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x84, 0x0, 0x2, 0x1, 0xB8, 0x0, 0x9, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x32, 0x0, 0x38, 0x0, 0x3E, 0x0, 0x44, 0x9, 0x40, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x8E, 0x0, 0x2, 0x1, 0xDE, 0x9, 0x42, 0x0, 0x2, 0x7, 0x25, 0xB, 0x8A, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x88, 0x0, 0x2, 0x1, 0xB8, 0xB, 0x13, 0x0, 0x2, 0x1, 0xB1, 0xB, 0x8C, 0x0, 0x2, 0x1, 0xE2, 0x8, 0xF8, 0x0, 0x2, 0x1, 0xB4, 0x9, 0x44, 0x0, 0x2, 0x1, 0xBD, 0x0, 0xF, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x32, 0x0, 0x38, 0x0, 0x3E, 0x0, 0x44, 0x0, 0x4A, 0x0, 0x50, 0x0, 0x56, 0x0, 0x5C, 0x0, 0x62, 0x0, 0x68, 0x0, 0x6E, 0x0, 0x74, 0x8, 0xFA, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x4B, 0x0, 0x2, 0x1, 0xBC, 0xB, 0x23, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x49, 0x0, 0x2, 0x1, 0xB7, 0x8, 0xFB, 0x0, 0x2, 0x1, 0xB3, 0x8, 0xFD, 0x0, 0x2, 0x1, 0xB9, 0xA, 0x9B, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x37, 0x0, 0x2, 0x1, 0xB8, 0x8, 0xF9, 0x0, 0x2, 0x1, 0xB1, 0xA, 0x9D, 0x0, 0x2, 0x1, 0xBA, 0x9, 0x47, 0x0, 0x2, 0x1, 0xB5, 0xB, 0xA, 0x0, 0x2, 0x1, 0xD9, 0x8, 0xFC, 0x0, 0x2, 0x1, 0xB4, 0xA, 0xF3, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x21, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0xB, 0x98, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x9A, 0x0, 0x2, 0x1, 0xB8, 0x0, 0x8, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0x0, 0x2A, 0x0, 0x30, 0x0, 0x36, 0x0, 0x3C, 0x9, 0x4D, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x27, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x4F, 0x0, 0x2, 0x7, 0x25, 0xB, 0x9E, 0x0, 0x2, 0x1, 0xD4, 0xB, 0x9C, 0x0, 0x2, 0x1, 0xB8, 0xB, 0xA2, 0x0, 0x2, 0x1, 0xE2, 0x9, 0x51, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x25, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x7, 0x0, 0x10, 0x0, 0x16, 0x0, 0x1C, 0x0, 0x22, 0x0, 0x28, 0x0, 0x2E, 0x0, 0x34, 0x9, 0x53, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x57, 0x0, 0x2, 0x1, 0xD8, 0x9, 0x55, 0x0, 0x2, 0x1, 0xB3, 0x9, 0x59, 0x0, 0x2, 0x7, 0x25, 0xB, 0xA6, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xA4, 0x0, 0x2, 0x1, 0xB8, 0x9, 0x5B, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x8, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0x0, 0x2A, 0x0, 0x30, 0x0, 0x36, 0x0, 0x3C, 0x9, 0x5F, 0x0, 0x2, 0x1, 0xD8, 0xB, 0xB4, 0x0, 0x2, 0x1, 0xDE, 0x9, 0x5D, 0x0, 0x2, 0x7, 0x25, 0xB, 0xD4, 0x0, 0x2, 0x1, 0xB9, 0xB, 0xB0, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xAE, 0x0, 0x2, 0x1, 0xB8, 0xB, 0xB2, 0x0, 0x2, 0x1, 0xE2, 0x9, 0x61, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x12, 0x0, 0x26, 0x0, 0x2C, 0x0, 0x32, 0x0, 0x38, 0x0, 0x3E, 0x0, 0x44, 0x0, 0x4A, 0x0, 0x50, 0x0, 0x56, 0x0, 0x5C, 0x0, 0x62, 0x0, 0x68, 0x0, 0x6E, 0x0, 0x74, 0x0, 0x7A, 0x0, 0x80, 0x0, 0x86, 0x0, 0x8C, 0x8, 0xFF, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x6B, 0x0, 0x2, 0x1, 0xBC, 0xB, 0x2B, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x67, 0x0, 0x2, 0x1, 0xB7, 0x9, 0x0, 0x0, 0x2, 0x1, 0xB3, 0xB, 0xBA, 0x0, 0x2, 0x1, 0xDE, 0x9, 0x1, 0x0, 0x2, 0x1, 0xB9, 0xA, 0xB3, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xB6, 0x0, 0x2, 0x1, 0xD5, 0x8, 0xFE, 0x0, 0x2, 0x1, 0xB1, 0xA, 0xB5, 0x0, 0x2, 0x1, 0xBA, 0x9, 0x65, 0x0, 0x2, 0x1, 0xB5, 0x9, 0x6D, 0x0, 0x2, 0x1, 0xD9, 0x9, 0x69, 0x0, 0x2, 0x1, 0xBB, 0x9, 0x63, 0x0, 0x2, 0x1, 0xB4, 0xB, 0xB8, 0x0, 0x2, 0x1, 0xE1, 0xA, 0xF5, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x29, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0xB, 0xC2, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xC0, 0x0, 0x2, 0x1, 0xB4, 0x0, 0x7, 0x0, 0x10, 0x0, 0x16, 0x0, 0x1C, 0x0, 0x22, 0x0, 0x28, 0x0, 0x2E, 0x0, 0x34, 0xA, 0x25, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x6F, 0x0, 0x2, 0x1, 0xB3, 0xA, 0x27, 0x0, 0x2, 0x1, 0xB9, 0xB, 0xC6, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xC4, 0x0, 0x2, 0x1, 0xB8, 0xA, 0x23, 0x0, 0x2, 0x1, 0xB1, 0xB, 0xD5, 0x0, 0x2, 0x1, 0xBB, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0xB, 0xCA, 0x0, 0x2, 0x1, 0xB9, 0xB, 0xC8, 0x0, 0x2, 0x1, 0xB8, 0x0, 0xA, 0x0, 0x16, 0x0, 0x1C, 0x0, 0x22, 0x0, 0x28, 0x0, 0x2E, 0x0, 0x34, 0x0, 0x3A, 0x0, 0x40, 0x0, 0x46, 0x0, 0x4C, 0x9, 0x2, 0x0, 0x2, 0x1, 0xB2, 0x9, 0x71, 0x0, 0x2, 0x1, 0xB3, 0x9, 0x3, 0x0, 0x2, 0x1, 0xB9, 0xA, 0xC1, 0x0, 0x2, 0x1, 0xD4, 0xB, 0xCC, 0x0, 0x2, 0x1, 0xB8, 0xA, 0x29, 0x0, 0x2, 0x1, 0xB1, 0xA, 0xC3, 0x0, 0x2, 0x1, 0xBA, 0xB, 0x3B, 0x0, 0x2, 0x1, 0xB5, 0xB, 0xD6, 0x0, 0x2, 0x1, 0xBB, 0xA, 0xC5, 0x0, 0x2, 0x1, 0xB4, 0x0, 0x6, 0x0, 0xE, 0x0, 0x14, 0x0, 0x1A, 0x0, 0x20, 0x0, 0x26, 0x0, 0x2C, 0x9, 0x74, 0x0, 0x2, 0x1, 0xB2, 0xB, 0xCE, 0x0, 0x2, 0x1, 0xB3, 0xB, 0xD0, 0x0, 0x2, 0x1, 0xD4, 0x9, 0x76, 0x0, 0x2, 0x1, 0xB8, 0xB, 0xD2, 0x0, 0x2, 0x1, 0xE2, 0x9, 0x78, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0x9, 0x79, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x3, 0x0, 0x2, 0x1, 0xB5, 0x0, 0x1, 0x0, 0x4, 0x9, 0x7B, 0x0, 0x2, 0x1, 0xB2, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0x9, 0x7A, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x4, 0x0, 0x2, 0x1, 0xB5, 0x0, 0x1, 0x0, 0x4, 0x9, 0x7C, 0x0, 0x2, 0x1, 0xB2, 0x0, 0xB, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0x0, 0x2A, 0x0, 0x30, 0x0, 0x36, 0x0, 0x3C, 0x0, 0x42, 0x0, 0x48, 0x0, 0x4E, 0x0, 0x54, 0x8, 0xF5, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x1F, 0x0, 0x2, 0x1, 0xC2, 0x9, 0x2D, 0x0, 0x2, 0x1, 0xB7, 0x8, 0xF6, 0x0, 0x2, 0x1, 0xB3, 0x8, 0xF7, 0x0, 0x2, 0x1, 0xB9, 0x8, 0xF4, 0x0, 0x2, 0x1, 0xB1, 0xA, 0x97, 0x0, 0x2, 0x1, 0xBA, 0x9, 0x2B, 0x0, 0x2, 0x1, 0xB5, 0x9, 0x29, 0x0, 0x2, 0x1, 0xB4, 0xA, 0xF1, 0x0, 0x2, 0x1, 0xBD, 0xB, 0x1D, 0x0, 0x2, 0x1, 0xC0, 0x0, 0x1, 0x0, 0x4, 0x4, 0x2F, 0x0, 0x2, 0x1, 0xB8, 0x0, 0x5, 0x0, 0xC, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0xA, 0xA8, 0x0, 0x2, 0x1, 0xB2, 0xA, 0xB0, 0x0, 0x2, 0x1, 0xD4, 0xA, 0xAA, 0x0, 0x2, 0x1, 0xB1, 0xA, 0xAC, 0x0, 0x2, 0x1, 0xBA, 0xA, 0xAE, 0x0, 0x2, 0x1, 0xB4, 0x0, 0x5, 0x0, 0xC, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0xA, 0xA9, 0x0, 0x2, 0x1, 0xB2, 0xA, 0xB1, 0x0, 0x2, 0x1, 0xD4, 0xA, 0xAB, 0x0, 0x2, 0x1, 0xB1, 0xA, 0xAD, 0x0, 0x2, 0x1, 0xBA, 0xA, 0xAF, 0x0, 0x2, 0x1, 0xB4, 0x0, 0x5, 0x0, 0xC, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0xA, 0xB6, 0x0, 0x2, 0x1, 0xB2, 0xA, 0xBE, 0x0, 0x2, 0x1, 0xD4, 0xA, 0xB8, 0x0, 0x2, 0x1, 0xB1, 0xA, 0xBA, 0x0, 0x2, 0x1, 0xBA, 0xA, 0xBC, 0x0, 0x2, 0x1, 0xB4, 0x0, 0x5, 0x0, 0xC, 0x0, 0x12, 0x0, 0x18, 0x0, 0x1E, 0x0, 0x24, 0xA, 0xB7, 0x0, 0x2, 0x1, 0xB2, 0xA, 0xBF, 0x0, 0x2, 0x1, 0xD4, 0xA, 0xB9, 0x0, 0x2, 0x1, 0xB1, 0xA, 0xBB, 0x0, 0x2, 0x1, 0xBA, 0xA, 0xBD, 0x0, 0x2, 0x1, 0xB4, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0x9, 0x34, 0x0, 0x2, 0x1, 0xB3, 0xA, 0x2D, 0x0, 0x2, 0x1, 0xBD, 0x0, 0x2, 0x0, 0x6, 0x0, 0xC, 0xB, 0x40, 0x0, 0x2, 0x1, 0xB2, 0xB, 0x41, 0x0, 0x2, 0x1, 0xB9, 0x0, 0x2, 0x0, 0xF, 0x0, 0x26, 0x0, 0x35, 0x0, 0x0, 0x0, 0x37, 0x0, 0x3F, 0x0, 0x10, 0x0, 0x46, 0x0, 0x4E, 0x0, 0x19, 0x0, 0x50, 0x0, 0x55, 0x0, 0x22, 0x0, 0x57, 0x0, 0x5F, 0x0, 0x28, 0x0, 0x82, 0x0, 0x82, 0x0, 0x31, 0x0, 0x84, 0x0, 0x84, 0x0, 0x32, 0x0, 0x87, 0x0, 0x87, 0x0, 0x33, 0x0, 0x8A, 0x0, 0x8A, 0x0, 0x34, 0x0, 0x8E, 0x0, 0x8E, 0x0, 0x35, 0x0, 0x96, 0x0, 0x96, 0x0, 0x36, 0x0, 0xB4, 0x0, 0xB5, 0x0, 0x37, 0x0, 0xC3, 0x0, 0xC4, 0x0, 0x39, 0x0, 0xEC, 0x0, 0xEC, 0x0, 0x3B, 0x2, 0x51, 0x2, 0x51, 0x0, 0x3C, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x5, 0x6A, 0x0, 0x5, 0x0, 0x10, 0x1, 0x22, 0x2, 0x34, 0x3, 0x46, 0x4, 0x58, 0x0, 0x1C, 0x0, 0x3A, 0x0, 0x42, 0x0, 0x4A, 0x0, 0x52, 0x0, 0x5A, 0x0, 0x62, 0x0, 0x6A, 0x0, 0x72, 0x0, 0x7A, 0x0, 0x82, 0x0, 0x8A, 0x0, 0x92, 0x0, 0x9A, 0x0, 0xA2, 0x0, 0xAA, 0x0, 0xB2, 0x0, 0xBA, 0x0, 0xC2, 0x0, 0xCA, 0x0, 0xD2, 0x0, 0xDA, 0x0, 0xE2, 0x0, 0xEA, 0x0, 0xF2, 0x0, 0xFA, 0x1, 0x0, 0x1, 0x6, 0x1, 0xC, 0x8, 0x35, 0x0, 0x3, 0x1, 0x96, 0x1, 0x97, 0x8, 0x36, 0x0, 0x3, 0x1, 0x96, 0x1, 0x98, 0x8, 0x33, 0x0, 0x3, 0x1, 0x96, 0x1, 0x99, 0x8, 0x34, 0x0, 0x3, 0x1, 0x96, 0x1, 0x9A, 0x8, 0x39, 0x0, 0x3, 0x1, 0x97, 0x1, 0x96, 0x8, 0x38, 0x0, 0x3, 0x1, 0x97, 0x1, 0x97, 0x8, 0x37, 0x0, 0x3, 0x1, 0x97, 0x1, 0x98, 0x8, 0x3E, 0x0, 0x3, 0x1, 0x97, 0x1, 0x99, 0x8, 0x3D, 0x0, 0x3, 0x1, 0x97, 0x1, 0x9A, 0x8, 0x4, 0x0, 0x3, 0x1, 0x98, 0x1, 0x96, 0x8, 0x2, 0x0, 0x3, 0x1, 0x98, 0x1, 0x97, 0x8, 0x3, 0x0, 0x3, 0x1, 0x98, 0x1, 0x98, 0x7, 0x40, 0x0, 0x3, 0x1, 0x98, 0x1, 0x99, 0x8, 0x0, 0x0, 0x3, 0x1, 0x98, 0x1, 0x9A, 0x8, 0x66, 0x0, 0x3, 0x1, 0x99, 0x1, 0x96, 0x8, 0x68, 0x0, 0x3, 0x1, 0x99, 0x1, 0x97, 0x8, 0x67, 0x0, 0x3, 0x1, 0x99, 0x1, 0x98, 0x8, 0x6F, 0x0, 0x3, 0x1, 0x99, 0x1, 0x99, 0x8, 0x6E, 0x0, 0x3, 0x1, 0x99, 0x1, 0x9A, 0x8, 0x16, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x96, 0x8, 0x11, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x97, 0x8, 0x12, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x98, 0x8, 0x5, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x99, 0x8, 0x32, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x9A, 0x8, 0x23, 0x0, 0x2, 0x1, 0x97, 0x8, 0x22, 0x0, 0x2, 0x1, 0x98, 0x8, 0x26, 0x0, 0x2, 0x1, 0x99, 0x8, 0x25, 0x0, 0x2, 0x1, 0x9A, 0x0, 0x1C, 0x0, 0x3A, 0x0, 0x42, 0x0, 0x4A, 0x0, 0x52, 0x0, 0x5A, 0x0, 0x62, 0x0, 0x6A, 0x0, 0x72, 0x0, 0x7A, 0x0, 0x82, 0x0, 0x8A, 0x0, 0x92, 0x0, 0x9A, 0x0, 0xA2, 0x0, 0xAA, 0x0, 0xB2, 0x0, 0xBA, 0x0, 0xC2, 0x0, 0xCA, 0x0, 0xD2, 0x0, 0xDA, 0x0, 0xE2, 0x0, 0xEA, 0x0, 0xF2, 0x0, 0xFA, 0x1, 0x0, 0x1, 0x6, 0x1, 0xC, 0x8, 0x21, 0x0, 0x3, 0x1, 0x96, 0x1, 0x96, 0x8, 0x20, 0x0, 0x3, 0x1, 0x96, 0x1, 0x97, 0x8, 0x1F, 0x0, 0x3, 0x1, 0x96, 0x1, 0x98, 0x8, 0x18, 0x0, 0x3, 0x1, 0x96, 0x1, 0x99, 0x8, 0x17, 0x0, 0x3, 0x1, 0x96, 0x1, 0x9A, 0x8, 0x2B, 0x0, 0x3, 0x1, 0x97, 0x1, 0x96, 0x8, 0x2C, 0x0, 0x3, 0x1, 0x97, 0x1, 0x98, 0x8, 0x2D, 0x0, 0x3, 0x1, 0x97, 0x1, 0x99, 0x8, 0x2E, 0x0, 0x3, 0x1, 0x97, 0x1, 0x9A, 0x8, 0x19, 0x0, 0x3, 0x1, 0x98, 0x1, 0x96, 0x8, 0x1C, 0x0, 0x3, 0x1, 0x98, 0x1, 0x97, 0x8, 0x1B, 0x0, 0x3, 0x1, 0x98, 0x1, 0x98, 0x8, 0x1E, 0x0, 0x3, 0x1, 0x98, 0x1, 0x99, 0x8, 0x1D, 0x0, 0x3, 0x1, 0x98, 0x1, 0x9A, 0x8, 0x6D, 0x0, 0x3, 0x1, 0x99, 0x1, 0x96, 0x8, 0x6B, 0x0, 0x3, 0x1, 0x99, 0x1, 0x97, 0x8, 0x6C, 0x0, 0x3, 0x1, 0x99, 0x1, 0x98, 0x8, 0x69, 0x0, 0x3, 0x1, 0x99, 0x1, 0x99, 0x8, 0x6A, 0x0, 0x3, 0x1, 0x99, 0x1, 0x9A, 0x8, 0x9, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x96, 0x8, 0x8, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x97, 0x8, 0x7, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x98, 0x8, 0xB, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x99, 0x8, 0xA, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x9A, 0x8, 0x88, 0x0, 0x2, 0x1, 0x96, 0x8, 0x89, 0x0, 0x2, 0x1, 0x98, 0x8, 0x85, 0x0, 0x2, 0x1, 0x99, 0x8, 0x86, 0x0, 0x2, 0x1, 0x9A, 0x0, 0x1C, 0x0, 0x3A, 0x0, 0x42, 0x0, 0x4A, 0x0, 0x52, 0x0, 0x5A, 0x0, 0x62, 0x0, 0x6A, 0x0, 0x72, 0x0, 0x7A, 0x0, 0x82, 0x0, 0x8A, 0x0, 0x92, 0x0, 0x9A, 0x0, 0xA2, 0x0, 0xAA, 0x0, 0xB2, 0x0, 0xBA, 0x0, 0xC2, 0x0, 0xCA, 0x0, 0xD2, 0x0, 0xDA, 0x0, 0xE2, 0x0, 0xEA, 0x0, 0xF2, 0x0, 0xFA, 0x1, 0x0, 0x1, 0x6, 0x1, 0xC, 0x8, 0xE, 0x0, 0x3, 0x1, 0x96, 0x1, 0x96, 0x8, 0xC, 0x0, 0x3, 0x1, 0x96, 0x1, 0x97, 0x8, 0xD, 0x0, 0x3, 0x1, 0x96, 0x1, 0x98, 0x8, 0xF, 0x0, 0x3, 0x1, 0x96, 0x1, 0x99, 0x8, 0x10, 0x0, 0x3, 0x1, 0x96, 0x1, 0x9A, 0x8, 0x7D, 0x0, 0x3, 0x1, 0x97, 0x1, 0x96, 0x8, 0x7F, 0x0, 0x3, 0x1, 0x97, 0x1, 0x97, 0x8, 0x7E, 0x0, 0x3, 0x1, 0x97, 0x1, 0x98, 0x8, 0x81, 0x0, 0x3, 0x1, 0x97, 0x1, 0x99, 0x8, 0x80, 0x0, 0x3, 0x1, 0x97, 0x1, 0x9A, 0x8, 0x5E, 0x0, 0x3, 0x1, 0x98, 0x1, 0x96, 0x8, 0x5F, 0x0, 0x3, 0x1, 0x98, 0x1, 0x97, 0x8, 0x5D, 0x0, 0x3, 0x1, 0x98, 0x1, 0x99, 0x8, 0x24, 0x0, 0x3, 0x1, 0x98, 0x1, 0x9A, 0x8, 0x4B, 0x0, 0x3, 0x1, 0x99, 0x1, 0x96, 0x8, 0x64, 0x0, 0x3, 0x1, 0x99, 0x1, 0x97, 0x8, 0x49, 0x0, 0x3, 0x1, 0x99, 0x1, 0x98, 0x8, 0x50, 0x0, 0x3, 0x1, 0x99, 0x1, 0x99, 0x8, 0x4F, 0x0, 0x3, 0x1, 0x99, 0x1, 0x9A, 0x8, 0x63, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x96, 0x8, 0x61, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x97, 0x8, 0x62, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x98, 0x8, 0x1A, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x99, 0x8, 0x60, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x9A, 0x8, 0x57, 0x0, 0x2, 0x1, 0x96, 0x8, 0x5A, 0x0, 0x2, 0x1, 0x97, 0x8, 0x54, 0x0, 0x2, 0x1, 0x99, 0x8, 0x53, 0x0, 0x2, 0x1, 0x9A, 0x0, 0x1C, 0x0, 0x3A, 0x0, 0x42, 0x0, 0x4A, 0x0, 0x52, 0x0, 0x5A, 0x0, 0x62, 0x0, 0x6A, 0x0, 0x72, 0x0, 0x7A, 0x0, 0x82, 0x0, 0x8A, 0x0, 0x92, 0x0, 0x9A, 0x0, 0xA2, 0x0, 0xAA, 0x0, 0xB2, 0x0, 0xBA, 0x0, 0xC2, 0x0, 0xCA, 0x0, 0xD2, 0x0, 0xDA, 0x0, 0xE2, 0x0, 0xEA, 0x0, 0xF2, 0x0, 0xFA, 0x1, 0x0, 0x1, 0x6, 0x1, 0xC, 0x8, 0x52, 0x0, 0x3, 0x1, 0x96, 0x1, 0x96, 0x8, 0x30, 0x0, 0x3, 0x1, 0x96, 0x1, 0x97, 0x8, 0x2F, 0x0, 0x3, 0x1, 0x96, 0x1, 0x98, 0x8, 0x51, 0x0, 0x3, 0x1, 0x96, 0x1, 0x99, 0x8, 0x2A, 0x0, 0x3, 0x1, 0x96, 0x1, 0x9A, 0x8, 0x48, 0x0, 0x3, 0x1, 0x97, 0x1, 0x96, 0x8, 0x46, 0x0, 0x3, 0x1, 0x97, 0x1, 0x97, 0x8, 0x47, 0x0, 0x3, 0x1, 0x97, 0x1, 0x98, 0x8, 0x44, 0x0, 0x3, 0x1, 0x97, 0x1, 0x99, 0x8, 0x45, 0x0, 0x3, 0x1, 0x97, 0x1, 0x9A, 0x8, 0x29, 0x0, 0x3, 0x1, 0x98, 0x1, 0x96, 0x8, 0x28, 0x0, 0x3, 0x1, 0x98, 0x1, 0x97, 0x8, 0x27, 0x0, 0x3, 0x1, 0x98, 0x1, 0x98, 0x8, 0x5C, 0x0, 0x3, 0x1, 0x98, 0x1, 0x99, 0x8, 0x31, 0x0, 0x3, 0x1, 0x98, 0x1, 0x9A, 0x8, 0x43, 0x0, 0x3, 0x1, 0x99, 0x1, 0x96, 0x8, 0x87, 0x0, 0x3, 0x1, 0x99, 0x1, 0x97, 0x8, 0x5B, 0x0, 0x3, 0x1, 0x99, 0x1, 0x98, 0x8, 0x65, 0x0, 0x3, 0x1, 0x99, 0x1, 0x9A, 0x8, 0x71, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x96, 0x8, 0x56, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x97, 0x8, 0x55, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x98, 0x8, 0x58, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x99, 0x8, 0x7A, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x9A, 0x8, 0x41, 0x0, 0x2, 0x1, 0x96, 0x8, 0x3F, 0x0, 0x2, 0x1, 0x97, 0x8, 0x40, 0x0, 0x2, 0x1, 0x98, 0x8, 0x42, 0x0, 0x2, 0x1, 0x9A, 0x0, 0x1C, 0x0, 0x3A, 0x0, 0x42, 0x0, 0x4A, 0x0, 0x52, 0x0, 0x5A, 0x0, 0x62, 0x0, 0x6A, 0x0, 0x72, 0x0, 0x7A, 0x0, 0x82, 0x0, 0x8A, 0x0, 0x92, 0x0, 0x9A, 0x0, 0xA2, 0x0, 0xAA, 0x0, 0xB2, 0x0, 0xBA, 0x0, 0xC2, 0x0, 0xCA, 0x0, 0xD2, 0x0, 0xDA, 0x0, 0xE2, 0x0, 0xEA, 0x0, 0xF2, 0x0, 0xFA, 0x1, 0x0, 0x1, 0x6, 0x1, 0xC, 0x8, 0x1, 0x0, 0x3, 0x1, 0x96, 0x1, 0x96, 0x8, 0x59, 0x0, 0x3, 0x1, 0x96, 0x1, 0x97, 0x8, 0x4C, 0x0, 0x3, 0x1, 0x96, 0x1, 0x98, 0x8, 0x4D, 0x0, 0x3, 0x1, 0x96, 0x1, 0x99, 0x8, 0x4E, 0x0, 0x3, 0x1, 0x96, 0x1, 0x9A, 0x8, 0x15, 0x0, 0x3, 0x1, 0x97, 0x1, 0x96, 0x8, 0x3C, 0x0, 0x3, 0x1, 0x97, 0x1, 0x97, 0x8, 0x3B, 0x0, 0x3, 0x1, 0x97, 0x1, 0x98, 0x8, 0x3A, 0x0, 0x3, 0x1, 0x97, 0x1, 0x99, 0x8, 0x7B, 0x0, 0x3, 0x1, 0x97, 0x1, 0x9A, 0x8, 0x6, 0x0, 0x3, 0x1, 0x98, 0x1, 0x96, 0x7, 0xFF, 0x0, 0x3, 0x1, 0x98, 0x1, 0x97, 0x8, 0x4A, 0x0, 0x3, 0x1, 0x98, 0x1, 0x98, 0x8, 0x13, 0x0, 0x3, 0x1, 0x98, 0x1, 0x99, 0x8, 0x14, 0x0, 0x3, 0x1, 0x98, 0x1, 0x9A, 0x8, 0x77, 0x0, 0x3, 0x1, 0x99, 0x1, 0x96, 0x8, 0x79, 0x0, 0x3, 0x1, 0x99, 0x1, 0x97, 0x8, 0x78, 0x0, 0x3, 0x1, 0x99, 0x1, 0x98, 0x8, 0x76, 0x0, 0x3, 0x1, 0x99, 0x1, 0x99, 0x8, 0x75, 0x0, 0x3, 0x1, 0x99, 0x1, 0x9A, 0x8, 0x82, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x96, 0x8, 0x83, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x97, 0x8, 0x84, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x98, 0x8, 0x7C, 0x0, 0x3, 0x1, 0x9A, 0x1, 0x99, 0x8, 0x74, 0x0, 0x2, 0x1, 0x96, 0x8, 0x73, 0x0, 0x2, 0x1, 0x97, 0x8, 0x72, 0x0, 0x2, 0x1, 0x98, 0x8, 0x70, 0x0, 0x2, 0x1, 0x99, 0x0, 0x2, 0x0, 0x1, 0x1, 0x96, 0x1, 0x9A, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0xC, 0x0, 0x1E, 0x0, 0x30, 0x0, 0x42, 0x0, 0x54, 0x0, 0x66, 0x0, 0x78, 0x0, 0x94, 0x0, 0xAC, 0x0, 0xC4, 0x0, 0xDC, 0x0, 0xF4, 0x1, 0xC, 0x0, 0x3, 0x0, 0x1, 0x0, 0x88, 0x0, 0x1, 0x0, 0x6C, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x9, 0x0, 0x3, 0x0, 0x1, 0x0, 0x8E, 0x0, 0x1, 0x0, 0x5A, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x9, 0x0, 0x3, 0x0, 0x1, 0x0, 0x94, 0x0, 0x1, 0x0, 0x48, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xA, 0x0, 0x3, 0x0, 0x1, 0x0, 0x9A, 0x0, 0x1, 0x0, 0x36, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xB, 0x0, 0x3, 0x0, 0x1, 0x0, 0xA0, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x9, 0x0, 0x3, 0x0, 0x1, 0x0, 0xA6, 0x0, 0x1, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xA, 0x0, 0x1, 0x0, 0x3, 0x3, 0x2B, 0x3, 0x2D, 0x3, 0x2E, 0x0, 0x3, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x90, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x9, 0x0, 0x1, 0x0, 0x1, 0x1, 0x20, 0x0, 0x3, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x78, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x9, 0x0, 0x1, 0x0, 0x1, 0x0, 0x8C, 0x0, 0x3, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x60, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xA, 0x0, 0x1, 0x0, 0x1, 0x0, 0x93, 0x0, 0x3, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x48, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xB, 0x0, 0x1, 0x0, 0x1, 0x0, 0xDC, 0x0, 0x3, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x30, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x9, 0x0, 0x1, 0x0, 0x1, 0x0, 0x97, 0x0, 0x3, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x18, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xA, 0x0, 0x1, 0x0, 0x1, 0x1, 0x31, 0x0, 0x1, 0x0, 0x1, 0x3, 0x2C, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x3A, 0x0, 0x4, 0x8, 0x9B, 0x8, 0x9E, 0x8, 0x9B, 0x8, 0x9B, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x24, 0x0, 0x4, 0x8, 0x9A, 0x8, 0x9D, 0x8, 0x9A, 0x8, 0x9A, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0xE, 0x0, 0x4, 0x8, 0x9C, 0x8, 0x9F, 0x8, 0x9C, 0x8, 0x9C, 0x0, 0x2, 0x0, 0x1, 0x3, 0x2B, 0x3, 0x2E, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x4E, 0x0, 0x6, 0x0, 0x12, 0x0, 0x1C, 0x0, 0x26, 0x0, 0x30, 0x0, 0x3A, 0x0, 0x44, 0x0, 0x1, 0x0, 0x4, 0x8, 0xAD, 0x0, 0x2, 0x8, 0x9B, 0x0, 0x1, 0x0, 0x4, 0x8, 0xAE, 0x0, 0x2, 0x8, 0x9A, 0x0, 0x1, 0x0, 0x4, 0x8, 0xB0, 0x0, 0x2, 0x8, 0x9B, 0x0, 0x1, 0x0, 0x4, 0x8, 0xAF, 0x0, 0x2, 0x8, 0x9C, 0x0, 0x1, 0x0, 0x4, 0x8, 0xAC, 0x0, 0x2, 0x8, 0x9B, 0x0, 0x1, 0x0, 0x4, 0x8, 0xB1, 0x0, 0x2, 0x8, 0x9A, 0x0, 0x1, 0x0, 0x6, 0x0, 0x8C, 0x0, 0x93, 0x0, 0x97, 0x0, 0xDC, 0x1, 0x20, 0x1, 0x31, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x6, 0x0, 0x2, 0x0, 0x1, 0x0, 0x2, 0x9, 0x56, 0x9, 0x57, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x18, 0x0, 0x9, 0xC, 0xF4, 0xC, 0xF5, 0xC, 0xF6, 0xC, 0xF7, 0xC, 0xFA, 0xC, 0xFB, 0xC, 0xFC, 0xC, 0xF8, 0xC, 0xF9, 0x0, 0x1, 0x0, 0x9, 0x9, 0x8, 0x9, 0x9, 0x9, 0x1A, 0x9, 0x1B, 0x9, 0x9D, 0x9, 0xA6, 0x9, 0xBE, 0xB, 0x9, 0xB, 0xA, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x6, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x4, 0x53, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x40, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x6, 0x0, 0xE, 0x7, 0x29, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x4E, 0x7, 0x27, 0x0, 0x2, 0x0, 0x4E, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x1C, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x6, 0x0, 0xE, 0x7, 0x2A, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x51, 0x7, 0x28, 0x0, 0x2, 0x0, 0x51, 0x0, 0x1, 0x0, 0x1, 0x0, 0x4B, 0x0, 0x4, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x2A, 0x0, 0x3, 0x0, 0xC, 0x0, 0x16, 0x0, 0x20, 0x0, 0x1, 0x0, 0x4, 0x7, 0x26, 0x0, 0x2, 0x0, 0x4B, 0x0, 0x1, 0x0, 0x4, 0x7, 0x2C, 0x0, 0x2, 0x0, 0x59, 0x0, 0x1, 0x0, 0x4, 0x7, 0x2B, 0x0, 0x2, 0x0, 0x59, 0x0, 0x1, 0x0, 0x3, 0x0, 0x4B, 0x0, 0x58, 0x0, 0x96, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0xA, 0x0, 0x2, 0x7, 0xAA, 0x7, 0xA7, 0x0, 0x1, 0x0, 0x2, 0x0, 0x30, 0x0, 0x4C, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x6, 0x7, 0x5B, 0x0, 0x1, 0x0, 0x1, 0x0, 0x4C, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x6, 0x5, 0x6E, 0x0, 0x1, 0x0, 0x1, 0x2, 0x3A, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x6, 0x7, 0x72, 0x0, 0x1, 0x0, 0x1, 0x0, 0x37, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x1C, 0x0, 0x2, 0x7, 0xAA, 0x7, 0xAB, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0xA, 0x0, 0x2, 0x7, 0xAC, 0x7, 0xAD, 0x0, 0x1, 0x0, 0x2, 0x0, 0x30, 0x0, 0x50, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x1E, 0x0, 0xC, 0x7, 0xCF, 0x7, 0xD1, 0x7, 0xD0, 0x7, 0xD2, 0x7, 0xD3, 0x8, 0xA1, 0x8, 0xA2, 0x8, 0xA3, 0x8, 0xA4, 0x8, 0xA5, 0x8, 0xA6, 0x8, 0xA7, 0x0, 0x1, 0x0, 0xC, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2C, 0x0, 0x34, 0x0, 0x36, 0x0, 0x47, 0x0, 0x48, 0x0, 0x49, 0x0, 0x4C, 0x0, 0x54, 0x0, 0x55, 0x0, 0x56, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0xC, 0x0, 0x3, 0x8, 0xA8, 0x8, 0xA9, 0x8, 0xA9, 0x0, 0x1, 0x0, 0x3, 0x0, 0x4A, 0x0, 0x4C, 0x8, 0xA4, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x2E, 0x0, 0x14, 0x7, 0xE9, 0x7, 0xED, 0x7, 0xE7, 0x7, 0xE4, 0x7, 0xE6, 0x7, 0xE5, 0x7, 0xEA, 0x7, 0xE8, 0x7, 0xEC, 0x7, 0xEB, 0x7, 0xD9, 0x7, 0xD4, 0x7, 0xD5, 0x7, 0xD6, 0x7, 0xD7, 0x7, 0xD8, 0x0, 0x1B, 0x0, 0x1D, 0x7, 0xDD, 0x8, 0x99, 0x0, 0x2, 0x0, 0x4, 0x0, 0x15, 0x0, 0x1E, 0x0, 0x0, 0x8, 0xA0, 0x8, 0xA0, 0x0, 0xA, 0x8, 0xAB, 0x8, 0xAB, 0x0, 0xB, 0xA, 0xDD, 0xA, 0xE4, 0x0, 0xC, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x2E, 0x0, 0x14, 0xA, 0xE4, 0x8, 0xAB, 0xA, 0xDD, 0xA, 0xDE, 0xA, 0xDF, 0xA, 0xE0, 0xA, 0xE1, 0x8, 0xA0, 0xA, 0xE2, 0xA, 0xE3, 0x7, 0xD6, 0x7, 0xD8, 0x7, 0xD7, 0x7, 0xD5, 0x7, 0xD9, 0x8, 0x99, 0x0, 0x1B, 0x7, 0xDD, 0x0, 0x1D, 0x7, 0xD4, 0x0, 0x2, 0x0, 0x2, 0x0, 0x15, 0x0, 0x1E, 0x0, 0x0, 0x7, 0xE4, 0x7, 0xED, 0x0, 0xA, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x2E, 0x0, 0x14, 0x7, 0xEA, 0x7, 0xEC, 0x7, 0xED, 0x7, 0xE7, 0x7, 0xE4, 0x7, 0xE6, 0x7, 0xE5, 0x7, 0xE8, 0x7, 0xEB, 0x7, 0xE9, 0x0, 0x1C, 0x0, 0x16, 0x0, 0x17, 0x0, 0x18, 0x0, 0x19, 0x0, 0x1A, 0x0, 0x1B, 0x0, 0x1D, 0x0, 0x1E, 0x0, 0x15, 0x0, 0x1, 0x0, 0x14, 0x0, 0x1B, 0x0, 0x1D, 0x7, 0xD4, 0x7, 0xD5, 0x7, 0xD6, 0x7, 0xD7, 0x7, 0xD8, 0x7, 0xD9, 0x7, 0xDD, 0x8, 0x99, 0x8, 0xA0, 0x8, 0xAB, 0xA, 0xDD, 0xA, 0xDE, 0xA, 0xDF, 0xA, 0xE0, 0xA, 0xE1, 0xA, 0xE2, 0xA, 0xE3, 0xA, 0xE4, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x2E, 0x0, 0x14, 0xA, 0xE1, 0xA, 0xE2, 0x8, 0xAB, 0xA, 0xDD, 0xA, 0xDE, 0xA, 0xDF, 0xA, 0xE0, 0x8, 0xA0, 0xA, 0xE3, 0x0, 0x18, 0x0, 0x1A, 0x0, 0x19, 0x0, 0x17, 0x0, 0x1C, 0x0, 0x15, 0x0, 0x1B, 0x0, 0x1E, 0x0, 0x1D, 0x0, 0x16, 0xA, 0xE4, 0x0, 0x2, 0x0, 0x6, 0x0, 0x1B, 0x0, 0x1B, 0x0, 0x0, 0x0, 0x1D, 0x0, 0x1D, 0x0, 0x1, 0x7, 0xD4, 0x7, 0xD9, 0x0, 0x2, 0x7, 0xDD, 0x7, 0xDD, 0x0, 0x8, 0x7, 0xE4, 0x7, 0xED, 0x0, 0x9, 0x8, 0x99, 0x8, 0x99, 0x0, 0x13, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x1, 0x0, 0x6, 0x4, 0x6F, 0x0, 0x1, 0x0, 0x1, 0x0, 0x14, 0x0, 0x6, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x3, 0x0, 0x1, 0x0, 0x12, 0x0, 0x1, 0x0, 0x6C, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x21, 0x0, 0x2, 0x0, 0x3, 0x4, 0x83, 0x4, 0x83, 0x0, 0x0, 0x7, 0x41, 0x7, 0x43, 0x0, 0x1, 0x7, 0x9D, 0x7, 0xA3, 0x0, 0x4, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x3C, 0x0, 0xA, 0x7, 0x43, 0x7, 0x42, 0x7, 0x41, 0x7, 0x9D, 0x7, 0x9E, 0x7, 0x9F, 0x7, 0xA0, 0x7, 0xA1, 0x7, 0xA2, 0x7, 0xA3, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, 0x0, 0x2, 0x0, 0x1A, 0x0, 0xA, 0x7, 0xC8, 0x0, 0x7B, 0x0, 0x74, 0x0, 0x75, 0x7, 0xC9, 0x7, 0xCA, 0x7, 0xCB, 0x7, 0xCC, 0x7, 0xCD, 0x7, 0xCE, 0x0, 0x2, 0x0, 0x1, 0x0, 0x15, 0x0, 0x1E, 0x0, 0x0} diff --git a/vendor/github.com/wcharczuk/go-chart/sequence.go b/vendor/github.com/wcharczuk/go-chart/sequence.go deleted file mode 100644 index 6801d64..0000000 --- a/vendor/github.com/wcharczuk/go-chart/sequence.go +++ /dev/null @@ -1,157 +0,0 @@ -package chart - -import ( - "math/rand" - "time" -) - -var ( - // Sequence contains some sequence utilities. - // These utilities can be useful for generating test data. - Sequence = &sequence{} -) - -type sequence struct{} - -// Float64 produces an array of floats from [start,end] by optional steps. -func (s sequence) Float64(start, end float64, steps ...float64) []float64 { - var values []float64 - step := 1.0 - if len(steps) > 0 { - step = steps[0] - } - - if start < end { - for x := start; x <= end; x += step { - values = append(values, x) - } - } else { - for x := start; x >= end; x = x - step { - values = append(values, x) - } - } - return values -} - -// Random generates a fixed length sequence of random values between (0, scale). -func (s sequence) Random(samples int, scale float64) []float64 { - rnd := rand.New(rand.NewSource(time.Now().Unix())) - values := make([]float64, samples) - - for x := 0; x < samples; x++ { - values[x] = rnd.Float64() * scale - } - - return values -} - -// Random generates a fixed length sequence of random values with a given average, above and below that average by (-scale, scale) -func (s sequence) RandomWithAverage(samples int, average, scale float64) []float64 { - rnd := rand.New(rand.NewSource(time.Now().Unix())) - values := make([]float64, samples) - - for x := 0; x < samples; x++ { - jitter := scale - (rnd.Float64() * (2 * scale)) - values[x] = average + jitter - } - - return values -} - -// Days generates a sequence of timestamps by day, from -days to today. -func (s sequence) Days(days int) []time.Time { - var values []time.Time - for day := days; day >= 0; day-- { - values = append(values, time.Now().AddDate(0, 0, -day)) - } - return values -} - -func (s sequence) MarketHours(from, to time.Time, marketOpen, marketClose time.Time, isHoliday HolidayProvider) []time.Time { - var times []time.Time - cursor := Date.On(marketOpen, from) - toClose := Date.On(marketClose, to) - for cursor.Before(toClose) || cursor.Equal(toClose) { - todayOpen := Date.On(marketOpen, cursor) - todayClose := Date.On(marketClose, cursor) - isValidTradingDay := !isHoliday(cursor) && Date.IsWeekDay(cursor.Weekday()) - - if (cursor.Equal(todayOpen) || cursor.After(todayOpen)) && (cursor.Equal(todayClose) || cursor.Before(todayClose)) && isValidTradingDay { - times = append(times, cursor) - } - if cursor.After(todayClose) { - cursor = Date.NextMarketOpen(cursor, marketOpen, isHoliday) - } else { - cursor = Date.NextHour(cursor) - } - } - return times -} - -func (s sequence) MarketHourQuarters(from, to time.Time, marketOpen, marketClose time.Time, isHoliday HolidayProvider) []time.Time { - var times []time.Time - cursor := Date.On(marketOpen, from) - toClose := Date.On(marketClose, to) - for cursor.Before(toClose) || cursor.Equal(toClose) { - - isValidTradingDay := !isHoliday(cursor) && Date.IsWeekDay(cursor.Weekday()) - - if isValidTradingDay { - todayOpen := Date.On(marketOpen, cursor) - todayNoon := Date.NoonOn(cursor) - today2pm := Date.On(Date.Time(14, 0, 0, 0, cursor.Location()), cursor) - todayClose := Date.On(marketClose, cursor) - times = append(times, todayOpen, todayNoon, today2pm, todayClose) - } - - cursor = Date.NextDay(cursor) - } - return times -} - -func (s sequence) MarketDayCloses(from, to time.Time, marketOpen, marketClose time.Time, isHoliday HolidayProvider) []time.Time { - var times []time.Time - cursor := Date.On(marketOpen, from) - toClose := Date.On(marketClose, to) - for cursor.Before(toClose) || cursor.Equal(toClose) { - isValidTradingDay := !isHoliday(cursor) && Date.IsWeekDay(cursor.Weekday()) - if isValidTradingDay { - todayClose := Date.On(marketClose, cursor) - times = append(times, todayClose) - } - - cursor = Date.NextDay(cursor) - } - return times -} - -func (s sequence) MarketDayAlternateCloses(from, to time.Time, marketOpen, marketClose time.Time, isHoliday HolidayProvider) []time.Time { - var times []time.Time - cursor := Date.On(marketOpen, from) - toClose := Date.On(marketClose, to) - for cursor.Before(toClose) || cursor.Equal(toClose) { - isValidTradingDay := !isHoliday(cursor) && Date.IsWeekDay(cursor.Weekday()) - if isValidTradingDay { - todayClose := Date.On(marketClose, cursor) - times = append(times, todayClose) - } - - cursor = cursor.AddDate(0, 0, 2) - } - return times -} - -func (s sequence) MarketDayMondayCloses(from, to time.Time, marketOpen, marketClose time.Time, isHoliday HolidayProvider) []time.Time { - var times []time.Time - cursor := Date.On(marketClose, from) - toClose := Date.On(marketClose, to) - - for cursor.Equal(toClose) || cursor.Before(toClose) { - isValidTradingDay := !isHoliday(cursor) && Date.IsWeekDay(cursor.Weekday()) - if isValidTradingDay { - times = append(times, cursor) - } - cursor = Date.NextDayOfWeek(cursor, time.Monday) - } - return times -} diff --git a/vendor/github.com/wcharczuk/go-chart/sequence_test.go b/vendor/github.com/wcharczuk/go-chart/sequence_test.go deleted file mode 100644 index 71f9cfb..0000000 --- a/vendor/github.com/wcharczuk/go-chart/sequence_test.go +++ /dev/null @@ -1,45 +0,0 @@ -package chart - -import ( - "testing" - "time" - - assert "github.com/blendlabs/go-assert" -) - -func TestSequenceFloat64(t *testing.T) { - assert := assert.New(t) - - asc := Sequence.Float64(1.0, 10.0) - assert.Len(asc, 10) - - desc := Sequence.Float64(10.0, 1.0) - assert.Len(desc, 10) -} - -func TestSequenceMarketHours(t *testing.T) { - assert := assert.New(t) - - today := time.Date(2016, 07, 01, 12, 0, 0, 0, Date.Eastern()) - mh := Sequence.MarketHours(today, today, NYSEOpen, NYSEClose, Date.IsNYSEHoliday) - assert.Len(mh, 8) - assert.Equal(Date.Eastern(), mh[0].Location()) -} - -func TestSequenceMarketQuarters(t *testing.T) { - assert := assert.New(t) - today := time.Date(2016, 07, 01, 12, 0, 0, 0, Date.Eastern()) - mh := Sequence.MarketHourQuarters(today, today, NYSEOpen, NYSEClose, Date.IsNYSEHoliday) - assert.Len(mh, 4) - assert.Equal(9, mh[0].Hour()) - assert.Equal(30, mh[0].Minute()) - assert.Equal(Date.Eastern(), mh[0].Location()) - - assert.Equal(12, mh[1].Hour()) - assert.Equal(00, mh[1].Minute()) - assert.Equal(Date.Eastern(), mh[1].Location()) - - assert.Equal(14, mh[2].Hour()) - assert.Equal(00, mh[2].Minute()) - assert.Equal(Date.Eastern(), mh[2].Location()) -} diff --git a/vendor/github.com/wcharczuk/go-chart/series.go b/vendor/github.com/wcharczuk/go-chart/series.go deleted file mode 100644 index 6145dcb..0000000 --- a/vendor/github.com/wcharczuk/go-chart/series.go +++ /dev/null @@ -1,9 +0,0 @@ -package chart - -// Series is an alias to Renderable. -type Series interface { - GetName() string - GetYAxis() YAxisType - GetStyle() Style - Render(r Renderer, canvasBox Box, xrange, yrange Range, s Style) -} diff --git a/vendor/github.com/wcharczuk/go-chart/sma_series.go b/vendor/github.com/wcharczuk/go-chart/sma_series.go deleted file mode 100644 index a7e0034..0000000 --- a/vendor/github.com/wcharczuk/go-chart/sma_series.go +++ /dev/null @@ -1,90 +0,0 @@ -package chart - -const ( - // DefaultSimpleMovingAveragePeriod is the default number of values to average. - DefaultSimpleMovingAveragePeriod = 16 -) - -// SMASeries is a computed series. -type SMASeries struct { - Name string - Style Style - YAxis YAxisType - - Period int - InnerSeries ValueProvider -} - -// GetName returns the name of the time series. -func (sma SMASeries) GetName() string { - return sma.Name -} - -// GetStyle returns the line style. -func (sma SMASeries) GetStyle() Style { - return sma.Style -} - -// GetYAxis returns which YAxis the series draws on. -func (sma SMASeries) GetYAxis() YAxisType { - return sma.YAxis -} - -// Len returns the number of elements in the series. -func (sma SMASeries) Len() int { - return sma.InnerSeries.Len() -} - -// GetPeriod returns the window size. -func (sma SMASeries) GetPeriod(defaults ...int) int { - if sma.Period == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return DefaultSimpleMovingAveragePeriod - } - return sma.Period -} - -// GetValue gets a value at a given index. -func (sma SMASeries) GetValue(index int) (x, y float64) { - if sma.InnerSeries == nil { - return - } - px, _ := sma.InnerSeries.GetValue(index) - x = px - y = sma.getAverage(index) - return -} - -// GetLastValue computes the last moving average value but walking back window size samples, -// and recomputing the last moving average chunk. -func (sma SMASeries) GetLastValue() (x, y float64) { - if sma.InnerSeries == nil { - return - } - seriesLen := sma.InnerSeries.Len() - px, _ := sma.InnerSeries.GetValue(seriesLen - 1) - x = px - y = sma.getAverage(seriesLen - 1) - return -} - -func (sma SMASeries) getAverage(index int) float64 { - period := sma.GetPeriod() - floor := Math.MaxInt(0, index-period) - var accum float64 - var count float64 - for x := index; x >= floor; x-- { - _, vy := sma.InnerSeries.GetValue(x) - accum += vy - count += 1.0 - } - return accum / count -} - -// Render renders the series. -func (sma SMASeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - style := sma.Style.InheritFrom(defaults) - Draw.LineSeries(r, canvasBox, xrange, yrange, style, sma) -} diff --git a/vendor/github.com/wcharczuk/go-chart/sma_series_test.go b/vendor/github.com/wcharczuk/go-chart/sma_series_test.go deleted file mode 100644 index 7a715cf..0000000 --- a/vendor/github.com/wcharczuk/go-chart/sma_series_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package chart - -import ( - "testing" - - "github.com/blendlabs/go-assert" -) - -type mockValueProvider struct { - X []float64 - Y []float64 -} - -func (m mockValueProvider) Len() int { - return Math.MinInt(len(m.X), len(m.Y)) -} - -func (m mockValueProvider) GetValue(index int) (x, y float64) { - if index < 0 { - panic("negative index at GetValue()") - } - if index > Math.MinInt(len(m.X), len(m.Y)) { - panic("index is outside the length of m.X or m.Y") - } - x = m.X[index] - y = m.Y[index] - return -} - -func TestSMASeriesGetValue(t *testing.T) { - assert := assert.New(t) - - mockSeries := mockValueProvider{ - Sequence.Float64(1.0, 10.0), - Sequence.Float64(10, 1.0), - } - assert.Equal(10, mockSeries.Len()) - - mas := &SMASeries{ - InnerSeries: mockSeries, - Period: 10, - } - - var yvalues []float64 - for x := 0; x < mas.Len(); x++ { - _, y := mas.GetValue(x) - yvalues = append(yvalues, y) - } - - assert.Equal(10.0, yvalues[0]) - assert.Equal(9.5, yvalues[1]) - assert.Equal(9.0, yvalues[2]) - assert.Equal(8.5, yvalues[3]) - assert.Equal(8.0, yvalues[4]) - assert.Equal(7.5, yvalues[5]) - assert.Equal(7.0, yvalues[6]) - assert.Equal(6.5, yvalues[7]) - assert.Equal(6.0, yvalues[8]) -} - -func TestSMASeriesGetLastValueWindowOverlap(t *testing.T) { - assert := assert.New(t) - - mockSeries := mockValueProvider{ - Sequence.Float64(1.0, 10.0), - Sequence.Float64(10, 1.0), - } - assert.Equal(10, mockSeries.Len()) - - mas := &SMASeries{ - InnerSeries: mockSeries, - Period: 15, - } - - var yvalues []float64 - for x := 0; x < mas.Len(); x++ { - _, y := mas.GetValue(x) - yvalues = append(yvalues, y) - } - - lx, ly := mas.GetLastValue() - assert.Equal(10.0, lx) - assert.Equal(5.5, ly) - assert.Equal(yvalues[len(yvalues)-1], ly) -} - -func TestSMASeriesGetLastValue(t *testing.T) { - assert := assert.New(t) - - mockSeries := mockValueProvider{ - Sequence.Float64(1.0, 100.0), - Sequence.Float64(100, 1.0), - } - assert.Equal(100, mockSeries.Len()) - - mas := &SMASeries{ - InnerSeries: mockSeries, - Period: 10, - } - - var yvalues []float64 - for x := 0; x < mas.Len(); x++ { - _, y := mas.GetValue(x) - yvalues = append(yvalues, y) - } - - lx, ly := mas.GetLastValue() - assert.Equal(100.0, lx) - assert.Equal(6, ly) - assert.Equal(yvalues[len(yvalues)-1], ly) -} diff --git a/vendor/github.com/wcharczuk/go-chart/stacked_bar_chart.go b/vendor/github.com/wcharczuk/go-chart/stacked_bar_chart.go deleted file mode 100644 index 511be46..0000000 --- a/vendor/github.com/wcharczuk/go-chart/stacked_bar_chart.go +++ /dev/null @@ -1,335 +0,0 @@ -package chart - -import ( - "errors" - "fmt" - "io" - "math" - - "github.com/golang/freetype/truetype" -) - -// StackedBar is a bar within a StackedBarChart. -type StackedBar struct { - Name string - Width int - Values []Value -} - -// GetWidth returns the width of the bar. -func (sb StackedBar) GetWidth() int { - if sb.Width == 0 { - return 50 - } - return sb.Width -} - -// StackedBarChart is a chart that draws sections of a bar based on percentages. -type StackedBarChart struct { - Title string - TitleStyle Style - - Width int - Height int - DPI float64 - - Background Style - Canvas Style - - XAxis Style - YAxis Style - - BarSpacing int - - Font *truetype.Font - defaultFont *truetype.Font - - Bars []StackedBar - Elements []Renderable -} - -// GetDPI returns the dpi for the chart. -func (sbc StackedBarChart) GetDPI(defaults ...float64) float64 { - if sbc.DPI == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return DefaultDPI - } - return sbc.DPI -} - -// GetFont returns the text font. -func (sbc StackedBarChart) GetFont() *truetype.Font { - if sbc.Font == nil { - return sbc.defaultFont - } - return sbc.Font -} - -// GetWidth returns the chart width or the default value. -func (sbc StackedBarChart) GetWidth() int { - if sbc.Width == 0 { - return DefaultChartWidth - } - return sbc.Width -} - -// GetHeight returns the chart height or the default value. -func (sbc StackedBarChart) GetHeight() int { - if sbc.Height == 0 { - return DefaultChartWidth - } - return sbc.Height -} - -// GetBarSpacing returns the spacing between bars. -func (sbc StackedBarChart) GetBarSpacing() int { - if sbc.BarSpacing == 0 { - return 100 - } - return sbc.BarSpacing -} - -// Render renders the chart with the given renderer to the given io.Writer. -func (sbc StackedBarChart) Render(rp RendererProvider, w io.Writer) error { - if len(sbc.Bars) == 0 { - return errors.New("Please provide at least one bar.") - } - - r, err := rp(sbc.GetWidth(), sbc.GetHeight()) - if err != nil { - return err - } - - if sbc.Font == nil { - defaultFont, err := GetDefaultFont() - if err != nil { - return err - } - sbc.defaultFont = defaultFont - } - r.SetDPI(sbc.GetDPI(DefaultDPI)) - - canvasBox := sbc.getAdjustedCanvasBox(r, sbc.getDefaultCanvasBox()) - sbc.drawBars(r, canvasBox) - sbc.drawXAxis(r, canvasBox) - sbc.drawYAxis(r, canvasBox) - - sbc.drawTitle(r) - for _, a := range sbc.Elements { - a(r, canvasBox, sbc.styleDefaultsElements()) - } - - return r.Save(w) -} - -func (sbc StackedBarChart) drawBars(r Renderer, canvasBox Box) { - xoffset := canvasBox.Left - for _, bar := range sbc.Bars { - sbc.drawBar(r, canvasBox, xoffset, bar) - xoffset += (sbc.GetBarSpacing() + bar.GetWidth()) - } -} - -func (sbc StackedBarChart) drawBar(r Renderer, canvasBox Box, xoffset int, bar StackedBar) int { - barSpacing2 := sbc.GetBarSpacing() >> 1 - bxl := xoffset + barSpacing2 - bxr := bxl + bar.GetWidth() - - normalizedBarComponents := Values(bar.Values).Normalize() - yoffset := canvasBox.Top - for index, bv := range normalizedBarComponents { - barHeight := int(math.Ceil(bv.Value * float64(canvasBox.Height()))) - barBox := Box{ - Top: yoffset, - Left: bxl, - Right: bxr, - Bottom: Math.MinInt(yoffset+barHeight, canvasBox.Bottom-DefaultStrokeWidth), - } - Draw.Box(r, barBox, bv.Style.InheritFrom(sbc.styleDefaultsStackedBarValue(index))) - yoffset += barHeight - } - - return bxr -} - -func (sbc StackedBarChart) drawXAxis(r Renderer, canvasBox Box) { - if sbc.XAxis.Show { - axisStyle := sbc.XAxis.InheritFrom(sbc.styleDefaultsAxes()) - axisStyle.WriteToRenderer(r) - - r.MoveTo(canvasBox.Left, canvasBox.Bottom) - r.LineTo(canvasBox.Right, canvasBox.Bottom) - r.Stroke() - - r.MoveTo(canvasBox.Left, canvasBox.Bottom) - r.LineTo(canvasBox.Left, canvasBox.Bottom+DefaultVerticalTickHeight) - r.Stroke() - - cursor := canvasBox.Left - for _, bar := range sbc.Bars { - - barLabelBox := Box{ - Top: canvasBox.Bottom + DefaultXAxisMargin, - Left: cursor, - Right: cursor + bar.GetWidth() + sbc.GetBarSpacing(), - Bottom: sbc.GetHeight(), - } - if len(bar.Name) > 0 { - Draw.TextWithin(r, bar.Name, barLabelBox, axisStyle) - } - axisStyle.WriteToRenderer(r) - r.MoveTo(barLabelBox.Right, canvasBox.Bottom) - r.LineTo(barLabelBox.Right, canvasBox.Bottom+DefaultVerticalTickHeight) - r.Stroke() - cursor += bar.GetWidth() + sbc.GetBarSpacing() - } - } -} - -func (sbc StackedBarChart) drawYAxis(r Renderer, canvasBox Box) { - if sbc.YAxis.Show { - axisStyle := sbc.YAxis.InheritFrom(sbc.styleDefaultsAxes()) - axisStyle.WriteToRenderer(r) - r.MoveTo(canvasBox.Right, canvasBox.Top) - r.LineTo(canvasBox.Right, canvasBox.Bottom) - r.Stroke() - - r.MoveTo(canvasBox.Right, canvasBox.Bottom) - r.LineTo(canvasBox.Right+DefaultHorizontalTickWidth, canvasBox.Bottom) - r.Stroke() - - ticks := Sequence.Float64(1.0, 0.0, 0.2) - for _, t := range ticks { - axisStyle.GetStrokeOptions().WriteToRenderer(r) - ty := canvasBox.Bottom - int(t*float64(canvasBox.Height())) - r.MoveTo(canvasBox.Right, ty) - r.LineTo(canvasBox.Right+DefaultHorizontalTickWidth, ty) - r.Stroke() - - axisStyle.GetTextOptions().WriteToRenderer(r) - text := fmt.Sprintf("%0.0f%%", t*100) - - tb := r.MeasureText(text) - Draw.Text(r, text, canvasBox.Right+DefaultYAxisMargin+5, ty+(tb.Height()>>1), axisStyle) - } - - } -} - -func (sbc StackedBarChart) drawTitle(r Renderer) { - if len(sbc.Title) > 0 && sbc.TitleStyle.Show { - Draw.TextWithin(r, sbc.Title, sbc.Box(), sbc.styleDefaultsTitle()) - } -} - -func (sbc StackedBarChart) getDefaultCanvasBox() Box { - return sbc.Box() -} - -func (sbc StackedBarChart) getAdjustedCanvasBox(r Renderer, canvasBox Box) Box { - var totalWidth int - for _, bar := range sbc.Bars { - totalWidth += bar.GetWidth() + sbc.GetBarSpacing() - } - - if sbc.XAxis.Show { - xaxisHeight := DefaultVerticalTickHeight - - axisStyle := sbc.XAxis.InheritFrom(sbc.styleDefaultsAxes()) - axisStyle.WriteToRenderer(r) - - cursor := canvasBox.Left - for _, bar := range sbc.Bars { - if len(bar.Name) > 0 { - barLabelBox := Box{ - Top: canvasBox.Bottom + DefaultXAxisMargin, - Left: cursor, - Right: cursor + bar.GetWidth() + sbc.GetBarSpacing(), - Bottom: sbc.GetHeight(), - } - lines := Text.WrapFit(r, bar.Name, barLabelBox.Width(), axisStyle) - linesBox := Text.MeasureLines(r, lines, axisStyle) - - xaxisHeight = Math.MaxInt(linesBox.Height()+(2*DefaultXAxisMargin), xaxisHeight) - } - } - return Box{ - Top: canvasBox.Top, - Left: canvasBox.Left, - Right: canvasBox.Left + totalWidth, - Bottom: sbc.GetHeight() - xaxisHeight, - } - } - return Box{ - Top: canvasBox.Top, - Left: canvasBox.Left, - Right: canvasBox.Left + totalWidth, - Bottom: canvasBox.Bottom, - } - -} - -// Box returns the chart bounds as a box. -func (sbc StackedBarChart) Box() Box { - dpr := sbc.Background.Padding.GetRight(10) - dpb := sbc.Background.Padding.GetBottom(50) - - return Box{ - Top: 20, - Left: 20, - Right: sbc.GetWidth() - dpr, - Bottom: sbc.GetHeight() - dpb, - } -} - -func (sbc StackedBarChart) styleDefaultsStackedBarValue(index int) Style { - return Style{ - StrokeColor: GetAlternateColor(index), - StrokeWidth: 3.0, - FillColor: GetAlternateColor(index), - } -} - -func (sbc StackedBarChart) styleDefaultsTitle() Style { - return sbc.TitleStyle.InheritFrom(Style{ - FontColor: DefaultTextColor, - Font: sbc.GetFont(), - FontSize: sbc.getTitleFontSize(), - TextHorizontalAlign: TextHorizontalAlignCenter, - TextVerticalAlign: TextVerticalAlignTop, - TextWrap: TextWrapWord, - }) -} - -func (sbc StackedBarChart) getTitleFontSize() float64 { - effectiveDimension := Math.MinInt(sbc.GetWidth(), sbc.GetHeight()) - if effectiveDimension >= 2048 { - return 48 - } else if effectiveDimension >= 1024 { - return 24 - } else if effectiveDimension >= 512 { - return 18 - } else if effectiveDimension >= 256 { - return 12 - } - return 10 -} - -func (sbc StackedBarChart) styleDefaultsAxes() Style { - return Style{ - StrokeColor: DefaultAxisColor, - Font: sbc.GetFont(), - FontSize: DefaultAxisFontSize, - FontColor: DefaultAxisColor, - TextHorizontalAlign: TextHorizontalAlignCenter, - TextVerticalAlign: TextVerticalAlignTop, - TextWrap: TextWrapWord, - } -} -func (sbc StackedBarChart) styleDefaultsElements() Style { - return Style{ - Font: sbc.GetFont(), - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/style.go b/vendor/github.com/wcharczuk/go-chart/style.go deleted file mode 100644 index d1db16b..0000000 --- a/vendor/github.com/wcharczuk/go-chart/style.go +++ /dev/null @@ -1,342 +0,0 @@ -package chart - -import ( - "fmt" - "strings" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/drawing" -) - -// StyleShow is a prebuilt style with the `Show` property set to true. -func StyleShow() Style { - return Style{ - Show: true, - } -} - -// Style is a simple style set. -type Style struct { - Show bool - Padding Box - - StrokeWidth float64 - StrokeColor drawing.Color - StrokeDashArray []float64 - - FillColor drawing.Color - FontSize float64 - FontColor drawing.Color - Font *truetype.Font - - TextHorizontalAlign TextHorizontalAlign - TextVerticalAlign TextVerticalAlign - TextWrap TextWrap - TextLineSpacing int - TextRotationDegrees float64 //0 is unset or normal -} - -// IsZero returns if the object is set or not. -func (s Style) IsZero() bool { - return s.StrokeColor.IsZero() && s.FillColor.IsZero() && s.StrokeWidth == 0 && s.FontColor.IsZero() && s.FontSize == 0 && s.Font == nil -} - -// String returns a text representation of the style. -func (s Style) String() string { - if s.IsZero() { - return "{}" - } - - var output []string - if s.Show { - output = []string{"\"show\": true"} - } else { - output = []string{"\"show\": false"} - } - - if !s.Padding.IsZero() { - output = append(output, fmt.Sprintf("\"padding\": %s", s.Padding.String())) - } else { - output = append(output, "\"padding\": null") - } - - if s.StrokeWidth >= 0 { - output = append(output, fmt.Sprintf("\"stroke_width\": %0.2f", s.StrokeWidth)) - } else { - output = append(output, "\"stroke_width\": null") - } - - if !s.StrokeColor.IsZero() { - output = append(output, fmt.Sprintf("\"stroke_color\": %s", s.StrokeColor.String())) - } else { - output = append(output, "\"stroke_color\": null") - } - - if len(s.StrokeDashArray) > 0 { - var elements []string - for _, v := range s.StrokeDashArray { - elements = append(elements, fmt.Sprintf("%.2f", v)) - } - dashArray := strings.Join(elements, ", ") - output = append(output, fmt.Sprintf("\"stroke_dash_array\": [%s]", dashArray)) - } else { - output = append(output, "\"stroke_dash_array\": null") - } - - if !s.FillColor.IsZero() { - output = append(output, fmt.Sprintf("\"fill_color\": %s", s.FillColor.String())) - } else { - output = append(output, "\"fill_color\": null") - } - - if s.FontSize != 0 { - output = append(output, fmt.Sprintf("\"font_size\": \"%0.2fpt\"", s.FontSize)) - } else { - output = append(output, "\"font_size\": null") - } - - if !s.FontColor.IsZero() { - output = append(output, fmt.Sprintf("\"font_color\": %s", s.FontColor.String())) - } else { - output = append(output, "\"font_color\": null") - } - - if s.Font != nil { - output = append(output, fmt.Sprintf("\"font\": \"%s\"", s.Font.Name(truetype.NameIDFontFamily))) - } else { - output = append(output, "\"font_color\": null") - } - - return "{" + strings.Join(output, ", ") + "}" -} - -// GetStrokeColor returns the stroke color. -func (s Style) GetStrokeColor(defaults ...drawing.Color) drawing.Color { - if s.StrokeColor.IsZero() { - if len(defaults) > 0 { - return defaults[0] - } - return drawing.ColorTransparent - } - return s.StrokeColor -} - -// GetFillColor returns the fill color. -func (s Style) GetFillColor(defaults ...drawing.Color) drawing.Color { - if s.FillColor.IsZero() { - if len(defaults) > 0 { - return defaults[0] - } - return drawing.ColorTransparent - } - return s.FillColor -} - -// GetStrokeWidth returns the stroke width. -func (s Style) GetStrokeWidth(defaults ...float64) float64 { - if s.StrokeWidth == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return DefaultStrokeWidth - } - return s.StrokeWidth -} - -// GetStrokeDashArray returns the stroke dash array. -func (s Style) GetStrokeDashArray(defaults ...[]float64) []float64 { - if len(s.StrokeDashArray) == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return nil - } - return s.StrokeDashArray -} - -// GetFontSize gets the font size. -func (s Style) GetFontSize(defaults ...float64) float64 { - if s.FontSize == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return DefaultFontSize - } - return s.FontSize -} - -// GetFontColor gets the font size. -func (s Style) GetFontColor(defaults ...drawing.Color) drawing.Color { - if s.FontColor.IsZero() { - if len(defaults) > 0 { - return defaults[0] - } - return drawing.ColorTransparent - } - return s.FontColor -} - -// GetFont returns the font face. -func (s Style) GetFont(defaults ...*truetype.Font) *truetype.Font { - if s.Font == nil { - if len(defaults) > 0 { - return defaults[0] - } - return nil - } - return s.Font -} - -// GetPadding returns the padding. -func (s Style) GetPadding(defaults ...Box) Box { - if s.Padding.IsZero() { - if len(defaults) > 0 { - return defaults[0] - } - return Box{} - } - return s.Padding -} - -// GetTextHorizontalAlign returns the horizontal alignment. -func (s Style) GetTextHorizontalAlign(defaults ...TextHorizontalAlign) TextHorizontalAlign { - if s.TextHorizontalAlign == TextHorizontalAlignUnset { - if len(defaults) > 0 { - return defaults[0] - } - return TextHorizontalAlignUnset - } - return s.TextHorizontalAlign -} - -// GetTextVerticalAlign returns the vertical alignment. -func (s Style) GetTextVerticalAlign(defaults ...TextVerticalAlign) TextVerticalAlign { - if s.TextVerticalAlign == TextVerticalAlignUnset { - if len(defaults) > 0 { - return defaults[0] - } - return TextVerticalAlignUnset - } - return s.TextVerticalAlign -} - -// GetTextWrap returns the word wrap. -func (s Style) GetTextWrap(defaults ...TextWrap) TextWrap { - if s.TextWrap == TextWrapUnset { - if len(defaults) > 0 { - return defaults[0] - } - return TextWrapUnset - } - return s.TextWrap -} - -// GetTextLineSpacing returns the spacing in pixels between lines of text (vertically). -func (s Style) GetTextLineSpacing(defaults ...int) int { - if s.TextLineSpacing == 0 { - if len(defaults) > 0 { - return defaults[0] - } - return DefaultLineSpacing - } - return s.TextLineSpacing -} - -// GetTextRotationDegrees returns the text rotation in degrees. -func (s Style) GetTextRotationDegrees(defaults ...float64) float64 { - if s.TextRotationDegrees == 0 { - if len(defaults) > 0 { - return defaults[0] - } - } - return s.TextRotationDegrees -} - -// WriteToRenderer passes the style's options to a renderer. -func (s Style) WriteToRenderer(r Renderer) { - r.SetStrokeColor(s.GetStrokeColor()) - r.SetStrokeWidth(s.GetStrokeWidth()) - r.SetStrokeDashArray(s.GetStrokeDashArray()) - r.SetFillColor(s.GetFillColor()) - r.SetFont(s.GetFont()) - r.SetFontColor(s.GetFontColor()) - r.SetFontSize(s.GetFontSize()) - - r.ClearTextRotation() - if s.GetTextRotationDegrees() != 0 { - r.SetTextRotation(Math.DegreesToRadians(s.GetTextRotationDegrees())) - } -} - -// WriteDrawingOptionsToRenderer passes just the drawing style options to a renderer. -func (s Style) WriteDrawingOptionsToRenderer(r Renderer) { - r.SetStrokeColor(s.GetStrokeColor()) - r.SetStrokeWidth(s.GetStrokeWidth()) - r.SetStrokeDashArray(s.GetStrokeDashArray()) - r.SetFillColor(s.GetFillColor()) -} - -// WriteTextOptionsToRenderer passes just the text style options to a renderer. -func (s Style) WriteTextOptionsToRenderer(r Renderer) { - r.SetFont(s.GetFont()) - r.SetFontColor(s.GetFontColor()) - r.SetFontSize(s.GetFontSize()) -} - -// InheritFrom coalesces two styles into a new style. -func (s Style) InheritFrom(defaults Style) (final Style) { - final.StrokeColor = s.GetStrokeColor(defaults.StrokeColor) - final.StrokeWidth = s.GetStrokeWidth(defaults.StrokeWidth) - final.StrokeDashArray = s.GetStrokeDashArray(defaults.StrokeDashArray) - final.FillColor = s.GetFillColor(defaults.FillColor) - final.FontColor = s.GetFontColor(defaults.FontColor) - final.FontSize = s.GetFontSize(defaults.FontSize) - final.Font = s.GetFont(defaults.Font) - final.Padding = s.GetPadding(defaults.Padding) - final.TextHorizontalAlign = s.GetTextHorizontalAlign(defaults.TextHorizontalAlign) - final.TextVerticalAlign = s.GetTextVerticalAlign(defaults.TextVerticalAlign) - final.TextWrap = s.GetTextWrap(defaults.TextWrap) - final.TextLineSpacing = s.GetTextLineSpacing(defaults.TextLineSpacing) - final.TextRotationDegrees = s.GetTextRotationDegrees(defaults.TextRotationDegrees) - return -} - -// GetStrokeOptions returns the stroke components. -func (s Style) GetStrokeOptions() Style { - return Style{ - StrokeDashArray: s.StrokeDashArray, - StrokeColor: s.StrokeColor, - StrokeWidth: s.StrokeWidth, - } -} - -// GetFillOptions returns the fill components. -func (s Style) GetFillOptions() Style { - return Style{ - FillColor: s.FillColor, - } -} - -// GetFillAndStrokeOptions returns the fill and stroke components. -func (s Style) GetFillAndStrokeOptions() Style { - return Style{ - StrokeDashArray: s.StrokeDashArray, - FillColor: s.FillColor, - StrokeColor: s.StrokeColor, - StrokeWidth: s.StrokeWidth, - } -} - -// GetTextOptions returns just the text components of the style. -func (s Style) GetTextOptions() Style { - return Style{ - FontColor: s.FontColor, - FontSize: s.FontSize, - Font: s.Font, - TextHorizontalAlign: s.TextHorizontalAlign, - TextVerticalAlign: s.TextVerticalAlign, - TextWrap: s.TextWrap, - TextLineSpacing: s.TextLineSpacing, - TextRotationDegrees: s.TextRotationDegrees, - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/style_test.go b/vendor/github.com/wcharczuk/go-chart/style_test.go deleted file mode 100644 index 4fe8303..0000000 --- a/vendor/github.com/wcharczuk/go-chart/style_test.go +++ /dev/null @@ -1,214 +0,0 @@ -package chart - -import ( - "testing" - - "github.com/blendlabs/go-assert" - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/drawing" -) - -func TestStyleIsZero(t *testing.T) { - assert := assert.New(t) - zero := Style{} - assert.True(zero.IsZero()) - - strokeColor := Style{StrokeColor: drawing.ColorWhite} - assert.False(strokeColor.IsZero()) - - fillColor := Style{FillColor: drawing.ColorWhite} - assert.False(fillColor.IsZero()) - - strokeWidth := Style{StrokeWidth: 5.0} - assert.False(strokeWidth.IsZero()) - - fontSize := Style{FontSize: 12.0} - assert.False(fontSize.IsZero()) - - fontColor := Style{FontColor: drawing.ColorWhite} - assert.False(fontColor.IsZero()) - - font := Style{Font: &truetype.Font{}} - assert.False(font.IsZero()) -} - -func TestStyleGetStrokeColor(t *testing.T) { - assert := assert.New(t) - - unset := Style{} - assert.Equal(drawing.ColorTransparent, unset.GetStrokeColor()) - assert.Equal(drawing.ColorWhite, unset.GetStrokeColor(drawing.ColorWhite)) - - set := Style{StrokeColor: drawing.ColorWhite} - assert.Equal(drawing.ColorWhite, set.GetStrokeColor()) - assert.Equal(drawing.ColorWhite, set.GetStrokeColor(drawing.ColorBlack)) -} - -func TestStyleGetFillColor(t *testing.T) { - assert := assert.New(t) - - unset := Style{} - assert.Equal(drawing.ColorTransparent, unset.GetFillColor()) - assert.Equal(drawing.ColorWhite, unset.GetFillColor(drawing.ColorWhite)) - - set := Style{FillColor: drawing.ColorWhite} - assert.Equal(drawing.ColorWhite, set.GetFillColor()) - assert.Equal(drawing.ColorWhite, set.GetFillColor(drawing.ColorBlack)) -} - -func TestStyleGetStrokeWidth(t *testing.T) { - assert := assert.New(t) - - unset := Style{} - assert.Equal(DefaultStrokeWidth, unset.GetStrokeWidth()) - assert.Equal(DefaultStrokeWidth+1, unset.GetStrokeWidth(DefaultStrokeWidth+1)) - - set := Style{StrokeWidth: DefaultStrokeWidth + 2} - assert.Equal(DefaultStrokeWidth+2, set.GetStrokeWidth()) - assert.Equal(DefaultStrokeWidth+2, set.GetStrokeWidth(DefaultStrokeWidth+1)) -} - -func TestStyleGetFontSize(t *testing.T) { - assert := assert.New(t) - - unset := Style{} - assert.Equal(DefaultFontSize, unset.GetFontSize()) - assert.Equal(DefaultFontSize+1, unset.GetFontSize(DefaultFontSize+1)) - - set := Style{FontSize: DefaultFontSize + 2} - assert.Equal(DefaultFontSize+2, set.GetFontSize()) - assert.Equal(DefaultFontSize+2, set.GetFontSize(DefaultFontSize+1)) -} - -func TestStyleGetFontColor(t *testing.T) { - assert := assert.New(t) - - unset := Style{} - assert.Equal(drawing.ColorTransparent, unset.GetFontColor()) - assert.Equal(drawing.ColorWhite, unset.GetFontColor(drawing.ColorWhite)) - - set := Style{FontColor: drawing.ColorWhite} - assert.Equal(drawing.ColorWhite, set.GetFontColor()) - assert.Equal(drawing.ColorWhite, set.GetFontColor(drawing.ColorBlack)) -} - -func TestStyleGetFont(t *testing.T) { - assert := assert.New(t) - - f, err := GetDefaultFont() - assert.Nil(err) - - unset := Style{} - assert.Nil(unset.GetFont()) - assert.Equal(f, unset.GetFont(f)) - - set := Style{Font: f} - assert.NotNil(set.GetFont()) -} - -func TestStyleGetPadding(t *testing.T) { - assert := assert.New(t) - - unset := Style{} - assert.True(unset.GetPadding().IsZero()) - assert.False(unset.GetPadding(DefaultBackgroundPadding).IsZero()) - assert.Equal(DefaultBackgroundPadding, unset.GetPadding(DefaultBackgroundPadding)) - - set := Style{Padding: DefaultBackgroundPadding} - assert.False(set.GetPadding().IsZero()) - assert.Equal(DefaultBackgroundPadding, set.GetPadding()) - assert.Equal(DefaultBackgroundPadding, set.GetPadding(Box{ - Top: DefaultBackgroundPadding.Top + 1, - Left: DefaultBackgroundPadding.Left + 1, - Right: DefaultBackgroundPadding.Right + 1, - Bottom: DefaultBackgroundPadding.Bottom + 1, - })) -} - -func TestStyleWithDefaultsFrom(t *testing.T) { - assert := assert.New(t) - - f, err := GetDefaultFont() - assert.Nil(err) - - unset := Style{} - set := Style{ - StrokeColor: drawing.ColorWhite, - StrokeWidth: 5.0, - FillColor: drawing.ColorWhite, - FontColor: drawing.ColorWhite, - Font: f, - Padding: DefaultBackgroundPadding, - } - - coalesced := unset.InheritFrom(set) - assert.Equal(set, coalesced) -} - -func TestStyleGetStrokeOptions(t *testing.T) { - assert := assert.New(t) - - set := Style{ - StrokeColor: drawing.ColorWhite, - StrokeWidth: 5.0, - FillColor: drawing.ColorWhite, - FontColor: drawing.ColorWhite, - Padding: DefaultBackgroundPadding, - } - svgStroke := set.GetStrokeOptions() - assert.False(svgStroke.StrokeColor.IsZero()) - assert.NotZero(svgStroke.StrokeWidth) - assert.True(svgStroke.FillColor.IsZero()) - assert.True(svgStroke.FontColor.IsZero()) -} - -func TestStyleGetFillOptions(t *testing.T) { - assert := assert.New(t) - - set := Style{ - StrokeColor: drawing.ColorWhite, - StrokeWidth: 5.0, - FillColor: drawing.ColorWhite, - FontColor: drawing.ColorWhite, - Padding: DefaultBackgroundPadding, - } - svgFill := set.GetFillOptions() - assert.False(svgFill.FillColor.IsZero()) - assert.Zero(svgFill.StrokeWidth) - assert.True(svgFill.StrokeColor.IsZero()) - assert.True(svgFill.FontColor.IsZero()) -} - -func TestStyleGetFillAndStrokeOptions(t *testing.T) { - assert := assert.New(t) - - set := Style{ - StrokeColor: drawing.ColorWhite, - StrokeWidth: 5.0, - FillColor: drawing.ColorWhite, - FontColor: drawing.ColorWhite, - Padding: DefaultBackgroundPadding, - } - svgFillAndStroke := set.GetFillAndStrokeOptions() - assert.False(svgFillAndStroke.FillColor.IsZero()) - assert.NotZero(svgFillAndStroke.StrokeWidth) - assert.False(svgFillAndStroke.StrokeColor.IsZero()) - assert.True(svgFillAndStroke.FontColor.IsZero()) -} - -func TestStyleGetTextOptions(t *testing.T) { - assert := assert.New(t) - - set := Style{ - StrokeColor: drawing.ColorWhite, - StrokeWidth: 5.0, - FillColor: drawing.ColorWhite, - FontColor: drawing.ColorWhite, - Padding: DefaultBackgroundPadding, - } - svgStroke := set.GetTextOptions() - assert.True(svgStroke.StrokeColor.IsZero()) - assert.Zero(svgStroke.StrokeWidth) - assert.True(svgStroke.FillColor.IsZero()) - assert.False(svgStroke.FontColor.IsZero()) -} diff --git a/vendor/github.com/wcharczuk/go-chart/text.go b/vendor/github.com/wcharczuk/go-chart/text.go deleted file mode 100644 index 156d5b3..0000000 --- a/vendor/github.com/wcharczuk/go-chart/text.go +++ /dev/null @@ -1,164 +0,0 @@ -package chart - -import "strings" - -// TextHorizontalAlign is an enum for the horizontal alignment options. -type TextHorizontalAlign int - -const ( - // TextHorizontalAlignUnset is the unset state for text horizontal alignment. - TextHorizontalAlignUnset TextHorizontalAlign = 0 - // TextHorizontalAlignLeft aligns a string horizontally so that it's left ligature starts at horizontal pixel 0. - TextHorizontalAlignLeft TextHorizontalAlign = 1 - // TextHorizontalAlignCenter left aligns a string horizontally so that there are equal pixels - // to the left and to the right of a string within a box. - TextHorizontalAlignCenter TextHorizontalAlign = 2 - // TextHorizontalAlignRight right aligns a string horizontally so that the right ligature ends at the right-most pixel - // of a box. - TextHorizontalAlignRight TextHorizontalAlign = 3 -) - -// TextWrap is an enum for the word wrap options. -type TextWrap int - -const ( - // TextWrapUnset is the unset state for text wrap options. - TextWrapUnset TextWrap = 0 - // TextWrapNone will spill text past horizontal boundaries. - TextWrapNone TextWrap = 1 - // TextWrapWord will split a string on words (i.e. spaces) to fit within a horizontal boundary. - TextWrapWord TextWrap = 2 - // TextWrapRune will split a string on a rune (i.e. utf-8 codepage) to fit within a horizontal boundary. - TextWrapRune TextWrap = 3 -) - -// TextVerticalAlign is an enum for the vertical alignment options. -type TextVerticalAlign int - -const ( - // TextVerticalAlignUnset is the unset state for vertical alignment options. - TextVerticalAlignUnset TextVerticalAlign = 0 - // TextVerticalAlignBaseline aligns text according to the "baseline" of the string, or where a normal ascender begins. - TextVerticalAlignBaseline TextVerticalAlign = 1 - // TextVerticalAlignBottom aligns the text according to the lowers pixel of any of the ligatures (ex. g or q both extend below the baseline). - TextVerticalAlignBottom TextVerticalAlign = 2 - // TextVerticalAlignMiddle aligns the text so that there is an equal amount of space above and below the top and bottom of the ligatures. - TextVerticalAlignMiddle TextVerticalAlign = 3 - // TextVerticalAlignMiddleBaseline aligns the text veritcally so that there is an equal number of pixels above and below the baseline of the string. - TextVerticalAlignMiddleBaseline TextVerticalAlign = 4 - // TextVerticalAlignTop alignts the text so that the top of the ligatures are at y-pixel 0 in the container. - TextVerticalAlignTop TextVerticalAlign = 5 -) - -var ( - // Text contains utilities for text. - Text = &text{} -) - -// TextStyle encapsulates text style options. -type TextStyle struct { - HorizontalAlign TextHorizontalAlign - VerticalAlign TextVerticalAlign - Wrap TextWrap -} - -type text struct{} - -func (t text) WrapFit(r Renderer, value string, width int, style Style) []string { - switch style.TextWrap { - case TextWrapRune: - return t.WrapFitRune(r, value, width, style) - case TextWrapWord: - return t.WrapFitWord(r, value, width, style) - } - return []string{value} -} - -func (t text) WrapFitWord(r Renderer, value string, width int, style Style) []string { - style.WriteToRenderer(r) - - var output []string - var line string - var word string - - var textBox Box - - for _, c := range value { - if c == rune('\n') { // commit the line to output - output = append(output, t.Trim(line+word)) - line = "" - word = "" - continue - } - - textBox = r.MeasureText(line + word + string(c)) - - if textBox.Width() >= width { - output = append(output, t.Trim(line)) - line = word - word = string(c) - continue - } - - if c == rune(' ') || c == rune('\t') { - line = line + word + string(c) - word = "" - continue - } - word = word + string(c) - } - - return append(output, t.Trim(line+word)) -} - -func (t text) WrapFitRune(r Renderer, value string, width int, style Style) []string { - style.WriteToRenderer(r) - - var output []string - var line string - var textBox Box - for _, c := range value { - if c == rune('\n') { - output = append(output, line) - line = "" - continue - } - - textBox = r.MeasureText(line + string(c)) - - if textBox.Width() >= width { - output = append(output, line) - line = string(c) - continue - } - line = line + string(c) - } - return t.appendLast(output, line) -} - -func (t text) Trim(value string) string { - return strings.Trim(value, " \t\n\r") -} - -func (t text) MeasureLines(r Renderer, lines []string, style Style) Box { - style.WriteTextOptionsToRenderer(r) - var output Box - for index, line := range lines { - lineBox := r.MeasureText(line) - output.Right = Math.MaxInt(lineBox.Right, output.Right) - output.Bottom += lineBox.Height() - if index < len(lines)-1 { - output.Bottom += +style.GetTextLineSpacing() - } - } - return output -} - -func (t text) appendLast(lines []string, text string) []string { - if len(lines) == 0 { - return []string{text} - } - lastLine := lines[len(lines)-1] - lines[len(lines)-1] = lastLine + text - return lines -} diff --git a/vendor/github.com/wcharczuk/go-chart/text_test.go b/vendor/github.com/wcharczuk/go-chart/text_test.go deleted file mode 100644 index 78c0e9b..0000000 --- a/vendor/github.com/wcharczuk/go-chart/text_test.go +++ /dev/null @@ -1,60 +0,0 @@ -package chart - -import ( - "testing" - - assert "github.com/blendlabs/go-assert" -) - -func TestTextWrapWord(t *testing.T) { - assert := assert.New(t) - - r, err := PNG(1024, 1024) - assert.Nil(err) - f, err := GetDefaultFont() - assert.Nil(err) - - basicTextStyle := Style{Font: f, FontSize: 24} - - output := Text.WrapFitWord(r, "this is a test string", 100, basicTextStyle) - assert.NotEmpty(output) - assert.Len(output, 3) - - for _, line := range output { - basicTextStyle.WriteToRenderer(r) - lineBox := r.MeasureText(line) - assert.True(lineBox.Width() < 100, line+": "+lineBox.String()) - } - assert.Equal("this is", output[0]) - assert.Equal("a test", output[1]) - assert.Equal("string", output[2]) - - output = Text.WrapFitWord(r, "foo", 100, basicTextStyle) - assert.Len(output, 1) - assert.Equal("foo", output[0]) - - // test that it handles newlines. - output = Text.WrapFitWord(r, "this\nis\na\ntest\nstring", 100, basicTextStyle) - assert.Len(output, 5) - - // test that it handles newlines and long lines. - output = Text.WrapFitWord(r, "this\nis\na\ntest\nstring that is very long", 100, basicTextStyle) - assert.Len(output, 8) -} - -func TestTextWrapRune(t *testing.T) { - assert := assert.New(t) - - r, err := PNG(1024, 1024) - assert.Nil(err) - f, err := GetDefaultFont() - assert.Nil(err) - - basicTextStyle := Style{Font: f, FontSize: 24} - - output := Text.WrapFitRune(r, "this is a test string", 150, basicTextStyle) - assert.NotEmpty(output) - assert.Len(output, 2) - assert.Equal("this is a t", output[0]) - assert.Equal("est string", output[1]) -} diff --git a/vendor/github.com/wcharczuk/go-chart/tick.go b/vendor/github.com/wcharczuk/go-chart/tick.go deleted file mode 100644 index c00cba0..0000000 --- a/vendor/github.com/wcharczuk/go-chart/tick.go +++ /dev/null @@ -1,82 +0,0 @@ -package chart - -import "math" - -// TicksProvider is a type that provides ticks. -type TicksProvider interface { - GetTicks(r Renderer, defaults Style, vf ValueFormatter) []Tick -} - -// Tick represents a label on an axis. -type Tick struct { - Value float64 - Label string -} - -// Ticks is an array of ticks. -type Ticks []Tick - -// Len returns the length of the ticks set. -func (t Ticks) Len() int { - return len(t) -} - -// Swap swaps two elements. -func (t Ticks) Swap(i, j int) { - t[i], t[j] = t[j], t[i] -} - -// Less returns if i's value is less than j's value. -func (t Ticks) Less(i, j int) bool { - return t[i].Value < t[j].Value -} - -// GenerateContinuousTicks generates a set of ticks. -func GenerateContinuousTicks(r Renderer, ra Range, isVertical bool, style Style, vf ValueFormatter) []Tick { - if vf == nil { - panic("vf is nil; did you remember to set a default value formatter?") - } - - var ticks []Tick - min, max := ra.GetMin(), ra.GetMax() - - ticks = append(ticks, Tick{ - Value: min, - Label: vf(min), - }) - - minLabel := vf(min) - style.GetTextOptions().WriteToRenderer(r) - labelBox := r.MeasureText(minLabel) - - var tickSize int - if isVertical { - tickSize = labelBox.Height() + DefaultMinimumTickVerticalSpacing - } else { - tickSize = labelBox.Width() + DefaultMinimumTickHorizontalSpacing - } - - domainRemainder := (ra.GetDomain()) - (tickSize * 2) - intermediateTickCount := int(math.Floor(float64(domainRemainder) / float64(tickSize))) - - rangeDelta := max - min - tickStep := rangeDelta / float64(intermediateTickCount) - - roundTo := Math.GetRoundToForDelta(rangeDelta) / 10 - intermediateTickCount = Math.MinInt(intermediateTickCount, 1<<10) - - for x := 1; x < intermediateTickCount; x++ { - tickValue := min + Math.RoundUp(tickStep*float64(x), roundTo) - ticks = append(ticks, Tick{ - Value: tickValue, - Label: vf(tickValue), - }) - } - - ticks = append(ticks, Tick{ - Value: max, - Label: vf(max), - }) - - return ticks -} diff --git a/vendor/github.com/wcharczuk/go-chart/tick_test.go b/vendor/github.com/wcharczuk/go-chart/tick_test.go deleted file mode 100644 index 1b69ded..0000000 --- a/vendor/github.com/wcharczuk/go-chart/tick_test.go +++ /dev/null @@ -1,12 +0,0 @@ -package chart - -/* -func TestGenerateTicksWithStep(t *testing.T) { - assert := assert.New(t) - - - - ticks := GenerateContinuousTicksWithStep(&ContinuousRange{Min: 1.0, Max: 10.0, Domain: 100}, 1.0, FloatValueFormatter, false) - assert.Len(ticks, 10) -} -*/ diff --git a/vendor/github.com/wcharczuk/go-chart/time_series.go b/vendor/github.com/wcharczuk/go-chart/time_series.go deleted file mode 100644 index 025e86a..0000000 --- a/vendor/github.com/wcharczuk/go-chart/time_series.go +++ /dev/null @@ -1,61 +0,0 @@ -package chart - -import "time" - -// TimeSeries is a line on a chart. -type TimeSeries struct { - Name string - Style Style - - YAxis YAxisType - - XValues []time.Time - YValues []float64 -} - -// GetName returns the name of the time series. -func (ts TimeSeries) GetName() string { - return ts.Name -} - -// GetStyle returns the line style. -func (ts TimeSeries) GetStyle() Style { - return ts.Style -} - -// Len returns the number of elements in the series. -func (ts TimeSeries) Len() int { - return len(ts.XValues) -} - -// GetValue gets a value at a given index. -func (ts TimeSeries) GetValue(index int) (x, y float64) { - x = Time.ToFloat64(ts.XValues[index]) - y = ts.YValues[index] - return -} - -// GetLastValue gets the last value. -func (ts TimeSeries) GetLastValue() (x, y float64) { - x = Time.ToFloat64(ts.XValues[len(ts.XValues)-1]) - y = ts.YValues[len(ts.YValues)-1] - return -} - -// GetValueFormatters returns value formatter defaults for the series. -func (ts TimeSeries) GetValueFormatters() (x, y ValueFormatter) { - x = TimeValueFormatter - y = FloatValueFormatter - return -} - -// GetYAxis returns which YAxis the series draws on. -func (ts TimeSeries) GetYAxis() YAxisType { - return ts.YAxis -} - -// Render renders the series. -func (ts TimeSeries) Render(r Renderer, canvasBox Box, xrange, yrange Range, defaults Style) { - style := ts.Style.InheritFrom(defaults) - Draw.LineSeries(r, canvasBox, xrange, yrange, style, ts) -} diff --git a/vendor/github.com/wcharczuk/go-chart/time_series_test.go b/vendor/github.com/wcharczuk/go-chart/time_series_test.go deleted file mode 100644 index 3194997..0000000 --- a/vendor/github.com/wcharczuk/go-chart/time_series_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package chart - -import ( - "testing" - "time" - - "github.com/blendlabs/go-assert" -) - -func TestTimeSeriesGetValue(t *testing.T) { - assert := assert.New(t) - - ts := TimeSeries{ - Name: "Test", - XValues: []time.Time{ - time.Now().AddDate(0, 0, -5), - time.Now().AddDate(0, 0, -4), - time.Now().AddDate(0, 0, -3), - time.Now().AddDate(0, 0, -2), - time.Now().AddDate(0, 0, -1), - }, - YValues: []float64{ - 1.0, 2.0, 3.0, 4.0, 5.0, - }, - } - - x0, y0 := ts.GetValue(0) - assert.NotZero(x0) - assert.Equal(1.0, y0) -} diff --git a/vendor/github.com/wcharczuk/go-chart/time_util.go b/vendor/github.com/wcharczuk/go-chart/time_util.go deleted file mode 100644 index 8937546..0000000 --- a/vendor/github.com/wcharczuk/go-chart/time_util.go +++ /dev/null @@ -1,20 +0,0 @@ -package chart - -import "time" - -var ( - // Time contains time utility functions. - Time = timeUtil{} -) - -type timeUtil struct{} - -// TimeToFloat64 returns a float64 representation of a time. -func (tu timeUtil) ToFloat64(t time.Time) float64 { - return float64(t.UnixNano()) -} - -// Float64ToTime returns a time from a float64. -func (tu timeUtil) FromFloat64(tf float64) time.Time { - return time.Unix(0, int64(tf)) -} diff --git a/vendor/github.com/wcharczuk/go-chart/value.go b/vendor/github.com/wcharczuk/go-chart/value.go deleted file mode 100644 index 8a1da0d..0000000 --- a/vendor/github.com/wcharczuk/go-chart/value.go +++ /dev/null @@ -1,46 +0,0 @@ -package chart - -// Value is a chart value. -type Value struct { - Style Style - Label string - Value float64 -} - -// Values is an array of Value. -type Values []Value - -// Values returns the values. -func (vs Values) Values() []float64 { - values := make([]float64, len(vs)) - for index, v := range vs { - values[index] = v.Value - } - return values -} - -// ValuesNormalized returns normalized values. -func (vs Values) ValuesNormalized() []float64 { - return Math.Normalize(vs.Values()...) -} - -// Normalize returns the values normalized. -func (vs Values) Normalize() []Value { - output := make([]Value, len(vs)) - total := Math.Sum(vs.Values()...) - for index, v := range vs { - output[index] = Value{ - Style: v.Style, - Label: v.Label, - Value: Math.RoundDown(v.Value/total, 0.0001), - } - } - return output -} - -// Value2 is a two axis value. -type Value2 struct { - Style Style - Label string - XValue, YValue float64 -} diff --git a/vendor/github.com/wcharczuk/go-chart/value_formatter.go b/vendor/github.com/wcharczuk/go-chart/value_formatter.go deleted file mode 100644 index 8789631..0000000 --- a/vendor/github.com/wcharczuk/go-chart/value_formatter.go +++ /dev/null @@ -1,69 +0,0 @@ -package chart - -import ( - "fmt" - "time" -) - -// ValueFormatter is a function that takes a value and produces a string. -type ValueFormatter func(v interface{}) string - -// TimeValueFormatter is a ValueFormatter for timestamps. -func TimeValueFormatter(v interface{}) string { - return TimeValueFormatterWithFormat(v, DefaultDateFormat) -} - -// TimeHourValueFormatter is a ValueFormatter for timestamps. -func TimeHourValueFormatter(v interface{}) string { - return TimeValueFormatterWithFormat(v, DefaultDateHourFormat) -} - -// TimeMinuteValueFormatter is a ValueFormatter for timestamps. -func TimeMinuteValueFormatter(v interface{}) string { - return TimeValueFormatterWithFormat(v, DefaultDateMinuteFormat) -} - -// TimeValueFormatterWithFormat is a ValueFormatter for timestamps with a given format. -func TimeValueFormatterWithFormat(v interface{}, dateFormat string) string { - if typed, isTyped := v.(time.Time); isTyped { - return typed.Format(dateFormat) - } - if typed, isTyped := v.(int64); isTyped { - return time.Unix(0, typed).Format(dateFormat) - } - if typed, isTyped := v.(float64); isTyped { - return time.Unix(0, int64(typed)).Format(dateFormat) - } - return "" -} - -// FloatValueFormatter is a ValueFormatter for float64. -func FloatValueFormatter(v interface{}) string { - return FloatValueFormatterWithFormat(v, DefaultFloatFormat) -} - -// PercentValueFormatter is a formatter for percent values. -// NOTE: it normalizes the values, i.e. multiplies by 100.0. -func PercentValueFormatter(v interface{}) string { - if typed, isTyped := v.(float64); isTyped { - return FloatValueFormatterWithFormat(typed*100.0, DefaultPercentValueFormat) - } - return "" -} - -// FloatValueFormatterWithFormat is a ValueFormatter for float64 with a given format. -func FloatValueFormatterWithFormat(v interface{}, floatFormat string) string { - if typed, isTyped := v.(float64); isTyped { - return fmt.Sprintf(floatFormat, typed) - } - if typed, isTyped := v.(float32); isTyped { - return fmt.Sprintf(floatFormat, typed) - } - if typed, isTyped := v.(int); isTyped { - return fmt.Sprintf(floatFormat, float64(typed)) - } - if typed, isTyped := v.(int64); isTyped { - return fmt.Sprintf(floatFormat, float64(typed)) - } - return "" -} diff --git a/vendor/github.com/wcharczuk/go-chart/value_formatter_provider.go b/vendor/github.com/wcharczuk/go-chart/value_formatter_provider.go deleted file mode 100644 index 829fb1d..0000000 --- a/vendor/github.com/wcharczuk/go-chart/value_formatter_provider.go +++ /dev/null @@ -1,6 +0,0 @@ -package chart - -// ValueFormatterProvider is a series that has custom formatters. -type ValueFormatterProvider interface { - GetValueFormatters() (x, y ValueFormatter) -} diff --git a/vendor/github.com/wcharczuk/go-chart/value_formatter_test.go b/vendor/github.com/wcharczuk/go-chart/value_formatter_test.go deleted file mode 100644 index 3bd8409..0000000 --- a/vendor/github.com/wcharczuk/go-chart/value_formatter_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package chart - -import ( - "testing" - "time" - - "github.com/blendlabs/go-assert" -) - -func TestTimeValueFormatterWithFormat(t *testing.T) { - assert := assert.New(t) - - d := time.Now() - di := Time.ToFloat64(d) - df := float64(di) - - s := TimeValueFormatterWithFormat(d, DefaultDateFormat) - si := TimeValueFormatterWithFormat(di, DefaultDateFormat) - sf := TimeValueFormatterWithFormat(df, DefaultDateFormat) - assert.Equal(s, si) - assert.Equal(s, sf) - - sd := TimeValueFormatter(d) - sdi := TimeValueFormatter(di) - sdf := TimeValueFormatter(df) - assert.Equal(s, sd) - assert.Equal(s, sdi) - assert.Equal(s, sdf) -} - -func TestFloatValueFormatter(t *testing.T) { - assert := assert.New(t) - assert.Equal("1234.00", FloatValueFormatter(1234.00)) -} - -func TestFloatValueFormatterWithFloat32Input(t *testing.T) { - assert := assert.New(t) - assert.Equal("1234.00", FloatValueFormatter(float32(1234.00))) -} - -func TestFloatValueFormatterWithIntegerInput(t *testing.T) { - assert := assert.New(t) - assert.Equal("1234.00", FloatValueFormatter(1234)) -} - -func TestFloatValueFormatterWithInt64Input(t *testing.T) { - assert := assert.New(t) - assert.Equal("1234.00", FloatValueFormatter(int64(1234))) -} - -func TestFloatValueFormatterWithFormat(t *testing.T) { - assert := assert.New(t) - - v := 123.456 - sv := FloatValueFormatterWithFormat(v, "%.3f") - assert.Equal("123.456", sv) - assert.Equal("123.000", FloatValueFormatterWithFormat(123, "%.3f")) -} diff --git a/vendor/github.com/wcharczuk/go-chart/value_provider.go b/vendor/github.com/wcharczuk/go-chart/value_provider.go deleted file mode 100644 index 90aec9d..0000000 --- a/vendor/github.com/wcharczuk/go-chart/value_provider.go +++ /dev/null @@ -1,35 +0,0 @@ -package chart - -// ValueProvider is a type that produces values. -type ValueProvider interface { - Len() int - GetValue(index int) (float64, float64) -} - -// BoundedValueProvider allows series to return a range. -type BoundedValueProvider interface { - Len() int - GetBoundedValue(index int) (x, y1, y2 float64) -} - -// LastValueProvider is a special type of value provider that can return it's (potentially computed) last value. -type LastValueProvider interface { - GetLastValue() (x, y float64) -} - -// BoundedLastValueProvider is a special type of value provider that can return it's (potentially computed) bounded last value. -type BoundedLastValueProvider interface { - GetBoundedLastValue() (x, y1, y2 float64) -} - -// FullValueProvider is an interface that combines `ValueProvider` and `LastValueProvider` -type FullValueProvider interface { - ValueProvider - LastValueProvider -} - -// FullBoundedValueProvider is an interface that combines `BoundedValueProvider` and `BoundedLastValueProvider` -type FullBoundedValueProvider interface { - BoundedValueProvider - BoundedLastValueProvider -} diff --git a/vendor/github.com/wcharczuk/go-chart/value_test.go b/vendor/github.com/wcharczuk/go-chart/value_test.go deleted file mode 100644 index 0b3b0b5..0000000 --- a/vendor/github.com/wcharczuk/go-chart/value_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package chart - -import ( - "testing" - - assert "github.com/blendlabs/go-assert" -) - -func TestValuesValues(t *testing.T) { - assert := assert.New(t) - - vs := []Value{ - {Value: 10, Label: "Blue"}, - {Value: 9, Label: "Green"}, - {Value: 8, Label: "Gray"}, - {Value: 7, Label: "Orange"}, - {Value: 6, Label: "HEANG"}, - {Value: 5, Label: "??"}, - {Value: 2, Label: "!!"}, - } - - values := Values(vs).Values() - assert.Len(values, 7) - assert.Equal(10, values[0]) - assert.Equal(9, values[1]) - assert.Equal(8, values[2]) - assert.Equal(7, values[3]) - assert.Equal(6, values[4]) - assert.Equal(5, values[5]) - assert.Equal(2, values[6]) -} - -func TestValuesValuesNormalized(t *testing.T) { - assert := assert.New(t) - - vs := []Value{ - {Value: 10, Label: "Blue"}, - {Value: 9, Label: "Green"}, - {Value: 8, Label: "Gray"}, - {Value: 7, Label: "Orange"}, - {Value: 6, Label: "HEANG"}, - {Value: 5, Label: "??"}, - {Value: 2, Label: "!!"}, - } - - values := Values(vs).ValuesNormalized() - assert.Len(values, 7) - assert.Equal(0.2127, values[0]) - assert.Equal(0.0425, values[6]) -} - -func TestValuesNormalize(t *testing.T) { - assert := assert.New(t) - - vs := []Value{ - {Value: 10, Label: "Blue"}, - {Value: 9, Label: "Green"}, - {Value: 8, Label: "Gray"}, - {Value: 7, Label: "Orange"}, - {Value: 6, Label: "HEANG"}, - {Value: 5, Label: "??"}, - {Value: 2, Label: "!!"}, - } - - values := Values(vs).Normalize() - assert.Len(values, 7) - assert.Equal(0.2127, values[0].Value) - assert.Equal(0.0425, values[6].Value) -} diff --git a/vendor/github.com/wcharczuk/go-chart/vector_renderer.go b/vendor/github.com/wcharczuk/go-chart/vector_renderer.go deleted file mode 100644 index c36f065..0000000 --- a/vendor/github.com/wcharczuk/go-chart/vector_renderer.go +++ /dev/null @@ -1,303 +0,0 @@ -package chart - -import ( - "bytes" - "fmt" - "io" - "math" - "strings" - - "golang.org/x/image/font" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/drawing" -) - -// SVG returns a new png/raster renderer. -func SVG(width, height int) (Renderer, error) { - buffer := bytes.NewBuffer([]byte{}) - canvas := newCanvas(buffer) - canvas.Start(width, height) - return &vectorRenderer{ - b: buffer, - c: canvas, - s: &Style{}, - p: []string{}, - }, nil -} - -// vectorRenderer renders chart commands to a bitmap. -type vectorRenderer struct { - dpi float64 - b *bytes.Buffer - c *canvas - s *Style - p []string - fc *font.Drawer -} - -func (vr *vectorRenderer) ResetStyle() { - vr.s = &Style{Font: vr.s.Font} - vr.fc = nil -} - -// GetDPI returns the dpi. -func (vr *vectorRenderer) GetDPI() float64 { - return vr.dpi -} - -// SetDPI implements the interface method. -func (vr *vectorRenderer) SetDPI(dpi float64) { - vr.dpi = dpi - vr.c.dpi = dpi -} - -// SetStrokeColor implements the interface method. -func (vr *vectorRenderer) SetStrokeColor(c drawing.Color) { - vr.s.StrokeColor = c -} - -// SetFillColor implements the interface method. -func (vr *vectorRenderer) SetFillColor(c drawing.Color) { - vr.s.FillColor = c -} - -// SetLineWidth implements the interface method. -func (vr *vectorRenderer) SetStrokeWidth(width float64) { - vr.s.StrokeWidth = width -} - -// StrokeDashArray sets the stroke dash array. -func (vr *vectorRenderer) SetStrokeDashArray(dashArray []float64) { - vr.s.StrokeDashArray = dashArray -} - -// MoveTo implements the interface method. -func (vr *vectorRenderer) MoveTo(x, y int) { - vr.p = append(vr.p, fmt.Sprintf("M %d %d", x, y)) -} - -// LineTo implements the interface method. -func (vr *vectorRenderer) LineTo(x, y int) { - vr.p = append(vr.p, fmt.Sprintf("L %d %d", x, y)) -} - -// QuadCurveTo draws a quad curve. -func (vr *vectorRenderer) QuadCurveTo(cx, cy, x, y int) { - vr.p = append(vr.p, fmt.Sprintf("Q%d,%d %d,%d", cx, cy, x, y)) -} - -func (vr *vectorRenderer) ArcTo(cx, cy int, rx, ry, startAngle, delta float64) { - startAngle = Math.RadianAdd(startAngle, _pi2) - endAngle := Math.RadianAdd(startAngle, delta) - - startx := cx + int(rx*math.Sin(startAngle)) - starty := cy - int(ry*math.Cos(startAngle)) - - if len(vr.p) > 0 { - vr.p = append(vr.p, fmt.Sprintf("L %d %d", startx, starty)) - } else { - vr.p = append(vr.p, fmt.Sprintf("M %d %d", startx, starty)) - } - - endx := cx + int(rx*math.Sin(endAngle)) - endy := cy - int(ry*math.Cos(endAngle)) - - dd := Math.RadiansToDegrees(delta) - - vr.p = append(vr.p, fmt.Sprintf("A %d %d %0.2f 0 1 %d %d", int(rx), int(ry), dd, endx, endy)) -} - -// Close closes a shape. -func (vr *vectorRenderer) Close() { - vr.p = append(vr.p, fmt.Sprintf("Z")) -} - -// Stroke draws the path with no fill. -func (vr *vectorRenderer) Stroke() { - vr.drawPath(vr.s.GetStrokeOptions()) -} - -// Fill draws the path with no stroke. -func (vr *vectorRenderer) Fill() { - vr.drawPath(vr.s.GetFillOptions()) -} - -// FillStroke draws the path with both fill and stroke. -func (vr *vectorRenderer) FillStroke() { - vr.drawPath(vr.s.GetFillAndStrokeOptions()) -} - -// drawPath draws a path. -func (vr *vectorRenderer) drawPath(s Style) { - vr.c.Path(strings.Join(vr.p, "\n"), vr.s.GetFillAndStrokeOptions()) - vr.p = []string{} // clear the path -} - -// Circle implements the interface method. -func (vr *vectorRenderer) Circle(radius float64, x, y int) { - vr.c.Circle(x, y, int(radius), vr.s.GetFillAndStrokeOptions()) -} - -// SetFont implements the interface method. -func (vr *vectorRenderer) SetFont(f *truetype.Font) { - vr.s.Font = f -} - -// SetFontColor implements the interface method. -func (vr *vectorRenderer) SetFontColor(c drawing.Color) { - vr.s.FontColor = c -} - -// SetFontSize implements the interface method. -func (vr *vectorRenderer) SetFontSize(size float64) { - vr.s.FontSize = size -} - -// Text draws a text blob. -func (vr *vectorRenderer) Text(body string, x, y int) { - vr.c.Text(x, y, body, vr.s.GetTextOptions()) -} - -// MeasureText uses the truetype font drawer to measure the width of text. -func (vr *vectorRenderer) MeasureText(body string) (box Box) { - if vr.s.GetFont() != nil { - vr.fc = &font.Drawer{ - Face: truetype.NewFace(vr.s.GetFont(), &truetype.Options{ - DPI: vr.dpi, - Size: vr.s.FontSize, - }), - } - w := vr.fc.MeasureString(body).Ceil() - - box.Right = w - box.Bottom = int(drawing.PointsToPixels(vr.dpi, vr.s.FontSize)) - if vr.c.textTheta == nil { - return - } - box = box.Corners().Rotate(Math.RadiansToDegrees(*vr.c.textTheta)).Box() - } - return -} - -// SetTextRotation sets the text rotation. -func (vr *vectorRenderer) SetTextRotation(radians float64) { - vr.c.textTheta = &radians -} - -// ClearTextRotation clears the text rotation. -func (vr *vectorRenderer) ClearTextRotation() { - vr.c.textTheta = nil -} - -// Save saves the renderer's contents to a writer. -func (vr *vectorRenderer) Save(w io.Writer) error { - vr.c.End() - _, err := w.Write(vr.b.Bytes()) - return err -} - -func newCanvas(w io.Writer) *canvas { - return &canvas{ - w: w, - } -} - -type canvas struct { - w io.Writer - dpi float64 - textTheta *float64 - width int - height int -} - -func (c *canvas) Start(width, height int) { - c.width = width - c.height = height - c.w.Write([]byte(fmt.Sprintf(`\n`, c.width, c.height))) -} - -func (c *canvas) Path(d string, style Style) { - var strokeDashArrayProperty string - if len(style.StrokeDashArray) > 0 { - strokeDashArrayProperty = c.getStrokeDashArray(style) - } - c.w.Write([]byte(fmt.Sprintf(`\n`, strokeDashArrayProperty, d, c.styleAsSVG(style)))) -} - -func (c *canvas) Text(x, y int, body string, style Style) { - if c.textTheta == nil { - c.w.Write([]byte(fmt.Sprintf(`%s`, x, y, c.styleAsSVG(style), body))) - } else { - transform := fmt.Sprintf(` transform="rotate(%0.2f,%d,%d)"`, Math.RadiansToDegrees(*c.textTheta), x, y) - c.w.Write([]byte(fmt.Sprintf(`%s`, x, y, c.styleAsSVG(style), transform, body))) - } -} - -func (c *canvas) Circle(x, y, r int, style Style) { - c.w.Write([]byte(fmt.Sprintf(``, x, y, r, c.styleAsSVG(style)))) -} - -func (c *canvas) End() { - c.w.Write([]byte("")) -} - -// getStrokeDashArray returns the stroke-dasharray property of a style. -func (c *canvas) getStrokeDashArray(s Style) string { - if len(s.StrokeDashArray) > 0 { - var values []string - for _, v := range s.StrokeDashArray { - values = append(values, fmt.Sprintf("%0.1f", v)) - } - return "stroke-dasharray=\"" + strings.Join(values, ", ") + "\"" - } - return "" -} - -// GetFontFace returns the font face for the style. -func (c *canvas) getFontFace(s Style) string { - family := "sans-serif" - if s.GetFont() != nil { - name := s.GetFont().Name(truetype.NameIDFontFamily) - if len(name) != 0 { - family = fmt.Sprintf(`'%s',%s`, name, family) - } - } - return fmt.Sprintf("font-family:%s", family) -} - -// styleAsSVG returns the style as a svg style string. -func (c *canvas) styleAsSVG(s Style) string { - sw := s.StrokeWidth - sc := s.StrokeColor - fc := s.FillColor - fs := s.FontSize - fnc := s.FontColor - - strokeWidthText := "stroke-width:0" - if sw != 0 { - strokeWidthText = "stroke-width:" + fmt.Sprintf("%d", int(sw)) - } - - strokeText := "stroke:none" - if !sc.IsZero() { - strokeText = "stroke:" + sc.String() - } - - fillText := "fill:none" - if !fc.IsZero() { - fillText = "fill:" + fc.String() - } - - fontSizeText := "" - if fs != 0 { - fontSizeText = "font-size:" + fmt.Sprintf("%.1fpx", drawing.PointsToPixels(c.dpi, fs)) - } - - if !fnc.IsZero() { - fillText = "fill:" + fnc.String() - } - - fontText := c.getFontFace(s) - return strings.Join([]string{strokeWidthText, strokeText, fillText, fontSizeText, fontText}, ";") -} diff --git a/vendor/github.com/wcharczuk/go-chart/vector_renderer_test.go b/vendor/github.com/wcharczuk/go-chart/vector_renderer_test.go deleted file mode 100644 index f802970..0000000 --- a/vendor/github.com/wcharczuk/go-chart/vector_renderer_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package chart - -import ( - "bytes" - "strings" - "testing" - - "github.com/blendlabs/go-assert" - "github.com/wcharczuk/go-chart/drawing" -) - -func TestVectorRendererPath(t *testing.T) { - assert := assert.New(t) - - vr, err := SVG(100, 100) - assert.Nil(err) - - typed, isTyped := vr.(*vectorRenderer) - assert.True(isTyped) - - typed.MoveTo(0, 0) - typed.LineTo(100, 100) - typed.LineTo(0, 100) - typed.Close() - typed.FillStroke() - - buffer := bytes.NewBuffer([]byte{}) - err = typed.Save(buffer) - assert.Nil(err) - - raw := string(buffer.Bytes()) - - assert.True(strings.HasPrefix(raw, "")) -} - -func TestVectorRendererMeasureText(t *testing.T) { - assert := assert.New(t) - - f, err := GetDefaultFont() - assert.Nil(err) - - vr, err := SVG(100, 100) - assert.Nil(err) - - vr.SetDPI(DefaultDPI) - vr.SetFont(f) - vr.SetFontSize(12.0) - - tb := vr.MeasureText("Ljp") - assert.Equal(21, tb.Width()) - assert.Equal(15, tb.Height()) -} - -func TestCanvasStyleSVG(t *testing.T) { - assert := assert.New(t) - - f, err := GetDefaultFont() - assert.Nil(err) - - set := Style{ - StrokeColor: drawing.ColorWhite, - StrokeWidth: 5.0, - FillColor: drawing.ColorWhite, - FontColor: drawing.ColorWhite, - Font: f, - Padding: DefaultBackgroundPadding, - } - - canvas := &canvas{dpi: DefaultDPI} - - svgString := canvas.styleAsSVG(set) - assert.NotEmpty(svgString) - assert.True(strings.Contains(svgString, "stroke:rgba(255,255,255,1.0)")) - assert.True(strings.Contains(svgString, "stroke-width:5")) - assert.True(strings.Contains(svgString, "fill:rgba(255,255,255,1.0)")) -} diff --git a/vendor/github.com/wcharczuk/go-chart/xaxis.go b/vendor/github.com/wcharczuk/go-chart/xaxis.go deleted file mode 100644 index 0728e9b..0000000 --- a/vendor/github.com/wcharczuk/go-chart/xaxis.go +++ /dev/null @@ -1,197 +0,0 @@ -package chart - -import ( - "math" - "sort" -) - -// XAxis represents the horizontal axis. -type XAxis struct { - Name string - NameStyle Style - - Style Style - ValueFormatter ValueFormatter - Range Range - - TickStyle Style - Ticks []Tick - TickPosition TickPosition - - GridLines []GridLine - GridMajorStyle Style - GridMinorStyle Style -} - -// GetName returns the name. -func (xa XAxis) GetName() string { - return xa.Name -} - -// GetStyle returns the style. -func (xa XAxis) GetStyle() Style { - return xa.Style -} - -// GetTickPosition returns the tick position option for the axis. -func (xa XAxis) GetTickPosition(defaults ...TickPosition) TickPosition { - if xa.TickPosition == TickPositionUnset { - if len(defaults) > 0 { - return defaults[0] - } - return TickPositionUnderTick - } - return xa.TickPosition -} - -// GetTicks returns the ticks for a series. -// The coalesce priority is: -// - User Supplied Ticks (i.e. Ticks array on the axis itself). -// - Range ticks (i.e. if the range provides ticks). -// - Generating continuous ticks based on minimum spacing and canvas width. -func (xa XAxis) GetTicks(r Renderer, ra Range, defaults Style, vf ValueFormatter) []Tick { - if len(xa.Ticks) > 0 { - return xa.Ticks - } - if tp, isTickProvider := ra.(TicksProvider); isTickProvider { - return tp.GetTicks(r, defaults, vf) - } - tickStyle := xa.Style.InheritFrom(defaults) - return GenerateContinuousTicks(r, ra, false, tickStyle, vf) -} - -// GetGridLines returns the gridlines for the axis. -func (xa XAxis) GetGridLines(ticks []Tick) []GridLine { - if len(xa.GridLines) > 0 { - return xa.GridLines - } - return GenerateGridLines(ticks, xa.GridMajorStyle, xa.GridMinorStyle) -} - -// Measure returns the bounds of the axis. -func (xa XAxis) Measure(r Renderer, canvasBox Box, ra Range, defaults Style, ticks []Tick) Box { - tickStyle := xa.TickStyle.InheritFrom(xa.Style.InheritFrom(defaults)) - sort.Sort(Ticks(ticks)) - - tp := xa.GetTickPosition() - - var ltx, rtx int - var tx, ty int - var left, right, bottom = math.MaxInt32, 0, 0 - for index, t := range ticks { - v := t.Value - tb := Draw.MeasureText(r, t.Label, tickStyle.GetTextOptions()) - - tx = canvasBox.Left + ra.Translate(v) - ty = canvasBox.Bottom + DefaultXAxisMargin + tb.Height() - switch tp { - case TickPositionUnderTick, TickPositionUnset: - ltx = tx - tb.Width()>>1 - rtx = tx + tb.Width()>>1 - break - case TickPositionBetweenTicks: - if index > 0 { - ltx = ra.Translate(ticks[index-1].Value) - rtx = tx - } - break - } - - left = Math.MinInt(left, ltx) - right = Math.MaxInt(right, rtx) - bottom = Math.MaxInt(bottom, ty) - } - - if xa.NameStyle.Show && len(xa.Name) > 0 { - tb := Draw.MeasureText(r, xa.Name, xa.NameStyle.InheritFrom(defaults)) - bottom += DefaultXAxisMargin + tb.Height() - } - - return Box{ - Top: canvasBox.Bottom, - Left: left, - Right: right, - Bottom: bottom, - } -} - -// Render renders the axis -func (xa XAxis) Render(r Renderer, canvasBox Box, ra Range, defaults Style, ticks []Tick) { - tickStyle := xa.TickStyle.InheritFrom(xa.Style.InheritFrom(defaults)) - - tickStyle.GetStrokeOptions().WriteToRenderer(r) - r.MoveTo(canvasBox.Left, canvasBox.Bottom) - r.LineTo(canvasBox.Right, canvasBox.Bottom) - r.Stroke() - - sort.Sort(Ticks(ticks)) - - tp := xa.GetTickPosition() - - var tx, ty int - var maxTextHeight int - for index, t := range ticks { - v := t.Value - lx := ra.Translate(v) - - tx = canvasBox.Left + lx - - tickStyle.GetStrokeOptions().WriteToRenderer(r) - r.MoveTo(tx, canvasBox.Bottom) - r.LineTo(tx, canvasBox.Bottom+DefaultVerticalTickHeight) - r.Stroke() - - tickWithAxisStyle := xa.TickStyle.InheritFrom(xa.Style.InheritFrom(defaults)) - tb := Draw.MeasureText(r, t.Label, tickWithAxisStyle) - - switch tp { - case TickPositionUnderTick, TickPositionUnset: - if tickStyle.TextRotationDegrees == 0 { - tx = tx - tb.Width()>>1 - ty = canvasBox.Bottom + DefaultXAxisMargin + tb.Height() - } else { - ty = canvasBox.Bottom + (2 * DefaultXAxisMargin) - } - Draw.Text(r, t.Label, tx, ty, tickWithAxisStyle) - maxTextHeight = Math.MaxInt(maxTextHeight, tb.Height()) - break - case TickPositionBetweenTicks: - if index > 0 { - llx := ra.Translate(ticks[index-1].Value) - ltx := canvasBox.Left + llx - finalTickStyle := tickWithAxisStyle.InheritFrom(Style{TextHorizontalAlign: TextHorizontalAlignCenter}) - - Draw.TextWithin(r, t.Label, Box{ - Left: ltx, - Right: tx, - Top: canvasBox.Bottom + DefaultXAxisMargin, - Bottom: canvasBox.Bottom + DefaultXAxisMargin, - }, finalTickStyle) - - ftb := Text.MeasureLines(r, Text.WrapFit(r, t.Label, tx-ltx, finalTickStyle), finalTickStyle) - maxTextHeight = Math.MaxInt(maxTextHeight, ftb.Height()) - } - break - } - } - - nameStyle := xa.NameStyle.InheritFrom(defaults) - if xa.NameStyle.Show && len(xa.Name) > 0 { - tb := Draw.MeasureText(r, xa.Name, nameStyle) - tx := canvasBox.Right - (canvasBox.Width()>>1 + tb.Width()>>1) - ty := canvasBox.Bottom + DefaultXAxisMargin + maxTextHeight + DefaultXAxisMargin + tb.Height() - Draw.Text(r, xa.Name, tx, ty, nameStyle) - } - - if xa.GridMajorStyle.Show || xa.GridMinorStyle.Show { - for _, gl := range xa.GetGridLines(ticks) { - if (gl.IsMinor && xa.GridMinorStyle.Show) || (!gl.IsMinor && xa.GridMajorStyle.Show) { - defaults := xa.GridMajorStyle - if gl.IsMinor { - defaults = xa.GridMinorStyle - } - gl.Render(r, canvasBox, ra, true, gl.Style.InheritFrom(defaults)) - } - } - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/xaxis_test.go b/vendor/github.com/wcharczuk/go-chart/xaxis_test.go deleted file mode 100644 index 289290b..0000000 --- a/vendor/github.com/wcharczuk/go-chart/xaxis_test.go +++ /dev/null @@ -1,67 +0,0 @@ -package chart - -import ( - "testing" - - "github.com/blendlabs/go-assert" -) - -func TestXAxisGetTicks(t *testing.T) { - assert := assert.New(t) - - r, err := PNG(1024, 1024) - assert.Nil(err) - - f, err := GetDefaultFont() - assert.Nil(err) - - xa := XAxis{} - xr := &ContinuousRange{Min: 10, Max: 100, Domain: 1024} - styleDefaults := Style{ - Font: f, - FontSize: 10.0, - } - vf := FloatValueFormatter - ticks := xa.GetTicks(r, xr, styleDefaults, vf) - assert.Len(ticks, 16) -} - -func TestXAxisGetTicksWithUserDefaults(t *testing.T) { - assert := assert.New(t) - - r, err := PNG(1024, 1024) - assert.Nil(err) - - f, err := GetDefaultFont() - assert.Nil(err) - - xa := XAxis{ - Ticks: []Tick{{Value: 1.0, Label: "1.0"}}, - } - xr := &ContinuousRange{Min: 10, Max: 100, Domain: 1024} - styleDefaults := Style{ - Font: f, - FontSize: 10.0, - } - vf := FloatValueFormatter - ticks := xa.GetTicks(r, xr, styleDefaults, vf) - assert.Len(ticks, 1) -} - -func TestXAxisMeasure(t *testing.T) { - assert := assert.New(t) - - f, err := GetDefaultFont() - assert.Nil(err) - style := Style{ - Font: f, - FontSize: 10.0, - } - r, err := PNG(100, 100) - assert.Nil(err) - ticks := []Tick{{Value: 1.0, Label: "1.0"}, {Value: 2.0, Label: "2.0"}, {Value: 3.0, Label: "3.0"}} - xa := XAxis{} - xab := xa.Measure(r, Box{0, 0, 100, 100}, &ContinuousRange{Min: 1.0, Max: 3.0, Domain: 100}, style, ticks) - assert.Equal(122, xab.Width()) - assert.Equal(21, xab.Height()) -} diff --git a/vendor/github.com/wcharczuk/go-chart/yaxis.go b/vendor/github.com/wcharczuk/go-chart/yaxis.go deleted file mode 100644 index da3a559..0000000 --- a/vendor/github.com/wcharczuk/go-chart/yaxis.go +++ /dev/null @@ -1,223 +0,0 @@ -package chart - -import ( - "math" - "sort" -) - -// YAxis is a veritcal rule of the range. -// There can be (2) y-axes; a primary and secondary. -type YAxis struct { - Name string - NameStyle Style - - Style Style - - Zero GridLine - - AxisType YAxisType - - ValueFormatter ValueFormatter - Range Range - - TickStyle Style - Ticks []Tick - - GridLines []GridLine - GridMajorStyle Style - GridMinorStyle Style -} - -// GetName returns the name. -func (ya YAxis) GetName() string { - return ya.Name -} - -// GetNameStyle returns the name style. -func (ya YAxis) GetNameStyle() Style { - return ya.NameStyle -} - -// GetStyle returns the style. -func (ya YAxis) GetStyle() Style { - return ya.Style -} - -// GetTickStyle returns the tick style. -func (ya YAxis) GetTickStyle() Style { - return ya.TickStyle -} - -// GetTicks returns the ticks for a series. -// The coalesce priority is: -// - User Supplied Ticks (i.e. Ticks array on the axis itself). -// - Range ticks (i.e. if the range provides ticks). -// - Generating continuous ticks based on minimum spacing and canvas width. -func (ya YAxis) GetTicks(r Renderer, ra Range, defaults Style, vf ValueFormatter) []Tick { - if len(ya.Ticks) > 0 { - return ya.Ticks - } - if tp, isTickProvider := ra.(TicksProvider); isTickProvider { - return tp.GetTicks(r, defaults, vf) - } - tickStyle := ya.Style.InheritFrom(defaults) - return GenerateContinuousTicks(r, ra, true, tickStyle, vf) -} - -// GetGridLines returns the gridlines for the axis. -func (ya YAxis) GetGridLines(ticks []Tick) []GridLine { - if len(ya.GridLines) > 0 { - return ya.GridLines - } - return GenerateGridLines(ticks, ya.GridMajorStyle, ya.GridMinorStyle) -} - -// Measure returns the bounds of the axis. -func (ya YAxis) Measure(r Renderer, canvasBox Box, ra Range, defaults Style, ticks []Tick) Box { - sort.Sort(Ticks(ticks)) - - var tx int - if ya.AxisType == YAxisPrimary { - tx = canvasBox.Right + DefaultYAxisMargin - } else if ya.AxisType == YAxisSecondary { - tx = canvasBox.Left - DefaultYAxisMargin - } - - ya.TickStyle.InheritFrom(ya.Style.InheritFrom(defaults)).WriteToRenderer(r) - var minx, maxx, miny, maxy = math.MaxInt32, 0, math.MaxInt32, 0 - var maxTextHeight int - for _, t := range ticks { - v := t.Value - ly := canvasBox.Bottom - ra.Translate(v) - - tb := r.MeasureText(t.Label) - tbh2 := tb.Height() >> 1 - finalTextX := tx - if ya.AxisType == YAxisSecondary { - finalTextX = tx - tb.Width() - } - - maxTextHeight = Math.MaxInt(tb.Height(), maxTextHeight) - - if ya.AxisType == YAxisPrimary { - minx = canvasBox.Right - maxx = Math.MaxInt(maxx, tx+tb.Width()) - } else if ya.AxisType == YAxisSecondary { - minx = Math.MinInt(minx, finalTextX) - maxx = Math.MaxInt(maxx, tx) - } - - miny = Math.MinInt(miny, ly-tbh2) - maxy = Math.MaxInt(maxy, ly+tbh2) - } - - if ya.NameStyle.Show && len(ya.Name) > 0 { - maxx += (DefaultYAxisMargin + maxTextHeight) - } - - return Box{ - Top: miny, - Left: minx, - Right: maxx, - Bottom: maxy, - } -} - -// Render renders the axis. -func (ya YAxis) Render(r Renderer, canvasBox Box, ra Range, defaults Style, ticks []Tick) { - tickStyle := ya.TickStyle.InheritFrom(ya.Style.InheritFrom(defaults)) - tickStyle.WriteToRenderer(r) - - sort.Sort(Ticks(ticks)) - - sw := tickStyle.GetStrokeWidth(defaults.StrokeWidth) - - var lx int - var tx int - if ya.AxisType == YAxisPrimary { - lx = canvasBox.Right + int(sw) - tx = lx + DefaultYAxisMargin - } else if ya.AxisType == YAxisSecondary { - lx = canvasBox.Left - int(sw) - tx = lx - DefaultYAxisMargin - } - - r.MoveTo(lx, canvasBox.Bottom) - r.LineTo(lx, canvasBox.Top) - r.Stroke() - - var maxTextWidth int - var finalTextX, finalTextY int - for _, t := range ticks { - v := t.Value - ly := canvasBox.Bottom - ra.Translate(v) - - tb := Draw.MeasureText(r, t.Label, tickStyle) - - if tb.Width() > maxTextWidth { - maxTextWidth = tb.Width() - } - - if ya.AxisType == YAxisSecondary { - finalTextX = tx - tb.Width() - } else { - finalTextX = tx - } - - if tickStyle.TextRotationDegrees == 0 { - finalTextY = ly + tb.Height()>>1 - } else { - finalTextY = ly - } - - tickStyle.WriteToRenderer(r) - - r.MoveTo(lx, ly) - if ya.AxisType == YAxisPrimary { - r.LineTo(lx+DefaultHorizontalTickWidth, ly) - } else if ya.AxisType == YAxisSecondary { - r.LineTo(lx-DefaultHorizontalTickWidth, ly) - } - r.Stroke() - - Draw.Text(r, t.Label, finalTextX, finalTextY, tickStyle) - } - - nameStyle := ya.NameStyle.InheritFrom(defaults.InheritFrom(Style{TextRotationDegrees: 90})) - if ya.NameStyle.Show && len(ya.Name) > 0 { - nameStyle.GetTextOptions().WriteToRenderer(r) - tb := Draw.MeasureText(r, ya.Name, nameStyle) - - var tx int - if ya.AxisType == YAxisPrimary { - tx = canvasBox.Right + int(sw) + DefaultYAxisMargin + maxTextWidth + DefaultYAxisMargin - } else if ya.AxisType == YAxisSecondary { - tx = canvasBox.Left - (DefaultYAxisMargin + int(sw) + maxTextWidth + DefaultYAxisMargin) - } - - var ty int - if nameStyle.TextRotationDegrees == 0 { - ty = canvasBox.Top + (canvasBox.Height()>>1 - tb.Width()>>1) - } else { - ty = canvasBox.Top + (canvasBox.Height()>>1 - tb.Height()>>1) - } - - Draw.Text(r, ya.Name, tx, ty, nameStyle) - } - - if ya.Zero.Style.Show { - ya.Zero.Render(r, canvasBox, ra, false, Style{}) - } - - if ya.GridMajorStyle.Show || ya.GridMinorStyle.Show { - for _, gl := range ya.GetGridLines(ticks) { - if (gl.IsMinor && ya.GridMinorStyle.Show) || (!gl.IsMinor && ya.GridMajorStyle.Show) { - defaults := ya.GridMajorStyle - if gl.IsMinor { - defaults = ya.GridMinorStyle - } - gl.Render(r, canvasBox, ra, false, gl.Style.InheritFrom(defaults)) - } - } - } -} diff --git a/vendor/github.com/wcharczuk/go-chart/yaxis_test.go b/vendor/github.com/wcharczuk/go-chart/yaxis_test.go deleted file mode 100644 index b603733..0000000 --- a/vendor/github.com/wcharczuk/go-chart/yaxis_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package chart - -import ( - "testing" - - "github.com/blendlabs/go-assert" -) - -func TestYAxisGetTicks(t *testing.T) { - assert := assert.New(t) - - r, err := PNG(1024, 1024) - assert.Nil(err) - - f, err := GetDefaultFont() - assert.Nil(err) - - ya := YAxis{} - yr := &ContinuousRange{Min: 10, Max: 100, Domain: 1024} - styleDefaults := Style{ - Font: f, - FontSize: 10.0, - } - vf := FloatValueFormatter - ticks := ya.GetTicks(r, yr, styleDefaults, vf) - assert.Len(ticks, 32) -} - -func TestYAxisGetTicksWithUserDefaults(t *testing.T) { - assert := assert.New(t) - - r, err := PNG(1024, 1024) - assert.Nil(err) - - f, err := GetDefaultFont() - assert.Nil(err) - - ya := YAxis{ - Ticks: []Tick{{Value: 1.0, Label: "1.0"}}, - } - yr := &ContinuousRange{Min: 10, Max: 100, Domain: 1024} - styleDefaults := Style{ - Font: f, - FontSize: 10.0, - } - vf := FloatValueFormatter - ticks := ya.GetTicks(r, yr, styleDefaults, vf) - assert.Len(ticks, 1) -} - -func TestYAxisMeasure(t *testing.T) { - assert := assert.New(t) - - f, err := GetDefaultFont() - assert.Nil(err) - style := Style{ - Font: f, - FontSize: 10.0, - } - r, err := PNG(100, 100) - assert.Nil(err) - ticks := []Tick{{Value: 1.0, Label: "1.0"}, {Value: 2.0, Label: "2.0"}, {Value: 3.0, Label: "3.0"}} - ya := YAxis{} - yab := ya.Measure(r, Box{0, 0, 100, 100}, &ContinuousRange{Min: 1.0, Max: 3.0, Domain: 100}, style, ticks) - assert.Equal(32, yab.Width()) - assert.Equal(110, yab.Height()) -} - -func TestYAxisSecondaryMeasure(t *testing.T) { - assert := assert.New(t) - - f, err := GetDefaultFont() - assert.Nil(err) - style := Style{ - Font: f, - FontSize: 10.0, - } - r, err := PNG(100, 100) - assert.Nil(err) - ticks := []Tick{{Value: 1.0, Label: "1.0"}, {Value: 2.0, Label: "2.0"}, {Value: 3.0, Label: "3.0"}} - ya := YAxis{AxisType: YAxisSecondary} - yab := ya.Measure(r, Box{0, 0, 100, 100}, &ContinuousRange{Min: 1.0, Max: 3.0, Domain: 100}, style, ticks) - assert.Equal(32, yab.Width()) - assert.Equal(110, yab.Height()) -} diff --git a/vendor/golang.org/x/image/.gitattributes b/vendor/golang.org/x/image/.gitattributes deleted file mode 100644 index d2f212e..0000000 --- a/vendor/golang.org/x/image/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -# Treat all files in this repo as binary, with no git magic updating -# line endings. Windows users contributing to Go will need to use a -# modern version of git and editors capable of LF line endings. -# -# We'll prevent accidental CRLF line endings from entering the repo -# via the git-review gofmt checks. -# -# See golang.org/issue/9281 - -* -text diff --git a/vendor/golang.org/x/image/.gitignore b/vendor/golang.org/x/image/.gitignore deleted file mode 100644 index 8339fd6..0000000 --- a/vendor/golang.org/x/image/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Add no patterns to .hgignore except for files generated by the build. -last-change diff --git a/vendor/golang.org/x/image/AUTHORS b/vendor/golang.org/x/image/AUTHORS deleted file mode 100644 index 15167cd..0000000 --- a/vendor/golang.org/x/image/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/image/CONTRIBUTING.md b/vendor/golang.org/x/image/CONTRIBUTING.md deleted file mode 100644 index d0485e8..0000000 --- a/vendor/golang.org/x/image/CONTRIBUTING.md +++ /dev/null @@ -1,26 +0,0 @@ -# Contributing to Go - -Go is an open source project. - -It is the work of hundreds of contributors. We appreciate your help! - -## Filing issues - -When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. -The gophers there will answer or ask you to file an issue if you've tripped over a bug. - -## Contributing code - -Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) -before sending patches. - -Unless otherwise noted, the Go source files are distributed under -the BSD-style license found in the LICENSE file. diff --git a/vendor/golang.org/x/image/CONTRIBUTORS b/vendor/golang.org/x/image/CONTRIBUTORS deleted file mode 100644 index 1c4577e..0000000 --- a/vendor/golang.org/x/image/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/image/LICENSE b/vendor/golang.org/x/image/LICENSE deleted file mode 100644 index 6a66aea..0000000 --- a/vendor/golang.org/x/image/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/image/PATENTS b/vendor/golang.org/x/image/PATENTS deleted file mode 100644 index 7330990..0000000 --- a/vendor/golang.org/x/image/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/image/README.md b/vendor/golang.org/x/image/README.md deleted file mode 100644 index 0a312b4..0000000 --- a/vendor/golang.org/x/image/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Go Images - -This repository holds supplementary Go image libraries. - -## Download/Install - -The easiest way to install is to run `go get -u golang.org/x/image`. You can -also manually git clone the repository to `$GOPATH/src/golang.org/x/image`. - -## Report Issues / Send Patches - -This repository uses Gerrit for code changes. To learn how to submit changes to -this repository, see https://golang.org/doc/contribute.html. - -The main issue tracker for the image repository is located at -https://github.com/golang/go/issues. Prefix your issue with "x/image:" in the -subject line, so it is easy to find. diff --git a/vendor/golang.org/x/image/codereview.cfg b/vendor/golang.org/x/image/codereview.cfg deleted file mode 100644 index 3f8b14b..0000000 --- a/vendor/golang.org/x/image/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/image/draw/draw.go b/vendor/golang.org/x/image/draw/draw.go deleted file mode 100644 index dfaa7fc..0000000 --- a/vendor/golang.org/x/image/draw/draw.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package draw provides image composition functions. -// -// See "The Go image/draw package" for an introduction to this package: -// http://golang.org/doc/articles/image_draw.html -// -// This package is a superset of and a drop-in replacement for the image/draw -// package in the standard library. -package draw - -// This file, and the go1_*.go files, just contains the API exported by the -// image/draw package in the standard library. Other files in this package -// provide additional features. - -import ( - "image" - "image/draw" -) - -// Draw calls DrawMask with a nil mask. -func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op) { - draw.Draw(dst, r, src, sp, draw.Op(op)) -} - -// DrawMask aligns r.Min in dst with sp in src and mp in mask and then -// replaces the rectangle r in dst with the result of a Porter-Duff -// composition. A nil mask is treated as opaque. -func DrawMask(dst Image, r image.Rectangle, src image.Image, sp image.Point, mask image.Image, mp image.Point, op Op) { - draw.DrawMask(dst, r, src, sp, mask, mp, draw.Op(op)) -} - -// FloydSteinberg is a Drawer that is the Src Op with Floyd-Steinberg error -// diffusion. -var FloydSteinberg Drawer = floydSteinberg{} - -type floydSteinberg struct{} - -func (floydSteinberg) Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) { - draw.FloydSteinberg.Draw(dst, r, src, sp) -} diff --git a/vendor/golang.org/x/image/draw/example_test.go b/vendor/golang.org/x/image/draw/example_test.go deleted file mode 100644 index bcb4662..0000000 --- a/vendor/golang.org/x/image/draw/example_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package draw_test - -import ( - "fmt" - "image" - "image/color" - "image/png" - "log" - "math" - "os" - - "golang.org/x/image/draw" - "golang.org/x/image/math/f64" -) - -func ExampleDraw() { - fSrc, err := os.Open("../testdata/blue-purple-pink.png") - if err != nil { - log.Fatal(err) - } - defer fSrc.Close() - src, err := png.Decode(fSrc) - if err != nil { - log.Fatal(err) - } - - dst := image.NewRGBA(image.Rect(0, 0, 400, 300)) - green := image.NewUniform(color.RGBA{0x00, 0x1f, 0x00, 0xff}) - draw.Copy(dst, image.Point{}, green, dst.Bounds(), draw.Src, nil) - qs := []draw.Interpolator{ - draw.NearestNeighbor, - draw.ApproxBiLinear, - draw.CatmullRom, - } - const cos60, sin60 = 0.5, 0.866025404 - t := f64.Aff3{ - +2 * cos60, -2 * sin60, 100, - +2 * sin60, +2 * cos60, 100, - } - - draw.Copy(dst, image.Point{20, 30}, src, src.Bounds(), draw.Over, nil) - for i, q := range qs { - q.Scale(dst, image.Rect(200+10*i, 100*i, 600+10*i, 150+100*i), src, src.Bounds(), draw.Over, nil) - } - draw.NearestNeighbor.Transform(dst, t, src, src.Bounds(), draw.Over, nil) - - red := image.NewNRGBA(image.Rect(0, 0, 16, 16)) - for y := 0; y < 16; y++ { - for x := 0; x < 16; x++ { - red.SetNRGBA(x, y, color.NRGBA{ - R: uint8(x * 0x11), - A: uint8(y * 0x11), - }) - } - } - red.SetNRGBA(0, 0, color.NRGBA{0xff, 0xff, 0x00, 0xff}) - red.SetNRGBA(15, 15, color.NRGBA{0xff, 0xff, 0x00, 0xff}) - - ops := []draw.Op{ - draw.Over, - draw.Src, - } - for i, op := range ops { - dr := image.Rect(120+10*i, 150+60*i, 170+10*i, 200+60*i) - draw.NearestNeighbor.Scale(dst, dr, red, red.Bounds(), op, nil) - t := f64.Aff3{ - +cos60, -sin60, float64(190 + 10*i), - +sin60, +cos60, float64(140 + 50*i), - } - draw.NearestNeighbor.Transform(dst, t, red, red.Bounds(), op, nil) - } - - dr := image.Rect(0, 0, 128, 128) - checkerboard := image.NewAlpha(dr) - for y := dr.Min.Y; y < dr.Max.Y; y++ { - for x := dr.Min.X; x < dr.Max.X; x++ { - if (x/20)%2 == (y/20)%2 { - checkerboard.SetAlpha(x, y, color.Alpha{0xff}) - } - } - } - sr := image.Rect(0, 0, 16, 16) - circle := image.NewAlpha(sr) - for y := sr.Min.Y; y < sr.Max.Y; y++ { - for x := sr.Min.X; x < sr.Max.X; x++ { - dx, dy := x-10, y-8 - if d := 32 * math.Sqrt(float64(dx*dx)+float64(dy*dy)); d < 0xff { - circle.SetAlpha(x, y, color.Alpha{0xff - uint8(d)}) - } - } - } - cyan := image.NewUniform(color.RGBA{0x00, 0xff, 0xff, 0xff}) - draw.NearestNeighbor.Scale(dst, dr, cyan, sr, draw.Over, &draw.Options{ - DstMask: checkerboard, - SrcMask: circle, - }) - - // Change false to true to write the resultant image to disk. - if false { - fDst, err := os.Create("out.png") - if err != nil { - log.Fatal(err) - } - defer fDst.Close() - err = png.Encode(fDst, dst) - if err != nil { - log.Fatal(err) - } - } - - fmt.Printf("dst has bounds %v.\n", dst.Bounds()) - // Output: - // dst has bounds (0,0)-(400,300). -} diff --git a/vendor/golang.org/x/image/draw/gen.go b/vendor/golang.org/x/image/draw/gen.go deleted file mode 100644 index 822bb6a..0000000 --- a/vendor/golang.org/x/image/draw/gen.go +++ /dev/null @@ -1,1404 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "bytes" - "flag" - "fmt" - "go/format" - "io/ioutil" - "log" - "os" - "strings" -) - -var debug = flag.Bool("debug", false, "") - -func main() { - flag.Parse() - - w := new(bytes.Buffer) - w.WriteString("// generated by \"go run gen.go\". DO NOT EDIT.\n\n" + - "package draw\n\nimport (\n" + - "\"image\"\n" + - "\"image/color\"\n" + - "\"math\"\n" + - "\n" + - "\"golang.org/x/image/math/f64\"\n" + - ")\n") - - gen(w, "nnInterpolator", codeNNScaleLeaf, codeNNTransformLeaf) - gen(w, "ablInterpolator", codeABLScaleLeaf, codeABLTransformLeaf) - genKernel(w) - - if *debug { - os.Stdout.Write(w.Bytes()) - return - } - out, err := format.Source(w.Bytes()) - if err != nil { - log.Fatal(err) - } - if err := ioutil.WriteFile("impl.go", out, 0660); err != nil { - log.Fatal(err) - } -} - -var ( - // dsTypes are the (dst image type, src image type) pairs to generate - // scale_DType_SType implementations for. The last element in the slice - // should be the fallback pair ("Image", "image.Image"). - // - // TODO: add *image.CMYK src type after Go 1.5 is released. - // An *image.CMYK is also alwaysOpaque. - dsTypes = []struct{ dType, sType string }{ - {"*image.RGBA", "*image.Gray"}, - {"*image.RGBA", "*image.NRGBA"}, - {"*image.RGBA", "*image.RGBA"}, - {"*image.RGBA", "*image.YCbCr"}, - {"*image.RGBA", "image.Image"}, - {"Image", "image.Image"}, - } - dTypes, sTypes []string - sTypesForDType = map[string][]string{} - subsampleRatios = []string{ - "444", - "422", - "420", - "440", - } - ops = []string{"Over", "Src"} - // alwaysOpaque are those image.Image implementations that are always - // opaque. For these types, Over is equivalent to the faster Src, in the - // absence of a source mask. - alwaysOpaque = map[string]bool{ - "*image.Gray": true, - "*image.YCbCr": true, - } -) - -func init() { - dTypesSeen := map[string]bool{} - sTypesSeen := map[string]bool{} - for _, t := range dsTypes { - if !sTypesSeen[t.sType] { - sTypesSeen[t.sType] = true - sTypes = append(sTypes, t.sType) - } - if !dTypesSeen[t.dType] { - dTypesSeen[t.dType] = true - dTypes = append(dTypes, t.dType) - } - sTypesForDType[t.dType] = append(sTypesForDType[t.dType], t.sType) - } - sTypesForDType["anyDType"] = sTypes -} - -type data struct { - dType string - sType string - sratio string - receiver string - op string -} - -func gen(w *bytes.Buffer, receiver string, codes ...string) { - expn(w, codeRoot, &data{receiver: receiver}) - for _, code := range codes { - for _, t := range dsTypes { - for _, op := range ops { - if op == "Over" && alwaysOpaque[t.sType] { - continue - } - expn(w, code, &data{ - dType: t.dType, - sType: t.sType, - receiver: receiver, - op: op, - }) - } - } - } -} - -func genKernel(w *bytes.Buffer) { - expn(w, codeKernelRoot, &data{}) - for _, sType := range sTypes { - expn(w, codeKernelScaleLeafX, &data{ - sType: sType, - }) - } - for _, dType := range dTypes { - for _, op := range ops { - expn(w, codeKernelScaleLeafY, &data{ - dType: dType, - op: op, - }) - } - } - for _, t := range dsTypes { - for _, op := range ops { - if op == "Over" && alwaysOpaque[t.sType] { - continue - } - expn(w, codeKernelTransformLeaf, &data{ - dType: t.dType, - sType: t.sType, - op: op, - }) - } - } -} - -func expn(w *bytes.Buffer, code string, d *data) { - if d.sType == "*image.YCbCr" && d.sratio == "" { - for _, sratio := range subsampleRatios { - e := *d - e.sratio = sratio - expn(w, code, &e) - } - return - } - - for _, line := range strings.Split(code, "\n") { - line = expnLine(line, d) - if line == ";" { - continue - } - fmt.Fprintln(w, line) - } -} - -func expnLine(line string, d *data) string { - for { - i := strings.IndexByte(line, '$') - if i < 0 { - break - } - prefix, s := line[:i], line[i+1:] - - i = len(s) - for j, c := range s { - if !('A' <= c && c <= 'Z' || 'a' <= c && c <= 'z') { - i = j - break - } - } - dollar, suffix := s[:i], s[i:] - - e := expnDollar(prefix, dollar, suffix, d) - if e == "" { - log.Fatalf("couldn't expand %q", line) - } - line = e - } - return line -} - -// expnDollar expands a "$foo" fragment in a line of generated code. It returns -// the empty string if there was a problem. It returns ";" if the generated -// code is a no-op. -func expnDollar(prefix, dollar, suffix string, d *data) string { - switch dollar { - case "dType": - return prefix + d.dType + suffix - case "dTypeRN": - return prefix + relName(d.dType) + suffix - case "sratio": - return prefix + d.sratio + suffix - case "sType": - return prefix + d.sType + suffix - case "sTypeRN": - return prefix + relName(d.sType) + suffix - case "receiver": - return prefix + d.receiver + suffix - case "op": - return prefix + d.op + suffix - - case "switch": - return expnSwitch("", "", true, suffix) - case "switchD": - return expnSwitch("", "", false, suffix) - case "switchS": - return expnSwitch("", "anyDType", false, suffix) - - case "preOuter": - switch d.dType { - default: - return ";" - case "Image": - s := "" - if d.sType == "image.Image" { - s = "srcMask, smp := opts.SrcMask, opts.SrcMaskP\n" - } - return s + - "dstMask, dmp := opts.DstMask, opts.DstMaskP\n" + - "dstColorRGBA64 := &color.RGBA64{}\n" + - "dstColor := color.Color(dstColorRGBA64)" - } - - case "preInner": - switch d.dType { - default: - return ";" - case "*image.RGBA": - return "d := " + pixOffset("dst", "dr.Min.X+adr.Min.X", "dr.Min.Y+int(dy)", "*4", "*dst.Stride") - } - - case "preKernelOuter": - switch d.sType { - default: - return ";" - case "image.Image": - return "srcMask, smp := opts.SrcMask, opts.SrcMaskP" - } - - case "preKernelInner": - switch d.dType { - default: - return ";" - case "*image.RGBA": - return "d := " + pixOffset("dst", "dr.Min.X+int(dx)", "dr.Min.Y+adr.Min.Y", "*4", "*dst.Stride") - } - - case "blend": - args, _ := splitArgs(suffix) - if len(args) != 4 { - return "" - } - switch d.sType { - default: - return argf(args, ""+ - "$3r = $0*$1r + $2*$3r\n"+ - "$3g = $0*$1g + $2*$3g\n"+ - "$3b = $0*$1b + $2*$3b\n"+ - "$3a = $0*$1a + $2*$3a", - ) - case "*image.Gray": - return argf(args, ""+ - "$3r = $0*$1r + $2*$3r", - ) - case "*image.YCbCr": - return argf(args, ""+ - "$3r = $0*$1r + $2*$3r\n"+ - "$3g = $0*$1g + $2*$3g\n"+ - "$3b = $0*$1b + $2*$3b", - ) - } - - case "clampToAlpha": - if alwaysOpaque[d.sType] { - return ";" - } - // Go uses alpha-premultiplied color. The naive computation can lead to - // invalid colors, e.g. red > alpha, when some weights are negative. - return ` - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - ` - - case "convFtou": - args, _ := splitArgs(suffix) - if len(args) != 2 { - return "" - } - - switch d.sType { - default: - return argf(args, ""+ - "$0r := uint32($1r)\n"+ - "$0g := uint32($1g)\n"+ - "$0b := uint32($1b)\n"+ - "$0a := uint32($1a)", - ) - case "*image.Gray": - return argf(args, ""+ - "$0r := uint32($1r)", - ) - case "*image.YCbCr": - return argf(args, ""+ - "$0r := uint32($1r)\n"+ - "$0g := uint32($1g)\n"+ - "$0b := uint32($1b)", - ) - } - - case "outputu": - args, _ := splitArgs(suffix) - if len(args) != 3 { - return "" - } - - switch d.op { - case "Over": - switch d.dType { - default: - log.Fatalf("bad dType %q", d.dType) - case "Image": - return argf(args, ""+ - "qr, qg, qb, qa := dst.At($0, $1).RGBA()\n"+ - "if dstMask != nil {\n"+ - " _, _, _, ma := dstMask.At(dmp.X + $0, dmp.Y + $1).RGBA()\n"+ - " $2r = $2r * ma / 0xffff\n"+ - " $2g = $2g * ma / 0xffff\n"+ - " $2b = $2b * ma / 0xffff\n"+ - " $2a = $2a * ma / 0xffff\n"+ - "}\n"+ - "$2a1 := 0xffff - $2a\n"+ - "dstColorRGBA64.R = uint16(qr*$2a1/0xffff + $2r)\n"+ - "dstColorRGBA64.G = uint16(qg*$2a1/0xffff + $2g)\n"+ - "dstColorRGBA64.B = uint16(qb*$2a1/0xffff + $2b)\n"+ - "dstColorRGBA64.A = uint16(qa*$2a1/0xffff + $2a)\n"+ - "dst.Set($0, $1, dstColor)", - ) - case "*image.RGBA": - return argf(args, ""+ - "$2a1 := (0xffff - $2a) * 0x101\n"+ - "dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*$2a1/0xffff + $2r) >> 8)\n"+ - "dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*$2a1/0xffff + $2g) >> 8)\n"+ - "dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*$2a1/0xffff + $2b) >> 8)\n"+ - "dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*$2a1/0xffff + $2a) >> 8)", - ) - } - - case "Src": - switch d.dType { - default: - log.Fatalf("bad dType %q", d.dType) - case "Image": - return argf(args, ""+ - "if dstMask != nil {\n"+ - " qr, qg, qb, qa := dst.At($0, $1).RGBA()\n"+ - " _, _, _, ma := dstMask.At(dmp.X + $0, dmp.Y + $1).RGBA()\n"+ - " pr = pr * ma / 0xffff\n"+ - " pg = pg * ma / 0xffff\n"+ - " pb = pb * ma / 0xffff\n"+ - " pa = pa * ma / 0xffff\n"+ - " $2a1 := 0xffff - ma\n"+ // Note that this is ma, not $2a. - " dstColorRGBA64.R = uint16(qr*$2a1/0xffff + $2r)\n"+ - " dstColorRGBA64.G = uint16(qg*$2a1/0xffff + $2g)\n"+ - " dstColorRGBA64.B = uint16(qb*$2a1/0xffff + $2b)\n"+ - " dstColorRGBA64.A = uint16(qa*$2a1/0xffff + $2a)\n"+ - " dst.Set($0, $1, dstColor)\n"+ - "} else {\n"+ - " dstColorRGBA64.R = uint16($2r)\n"+ - " dstColorRGBA64.G = uint16($2g)\n"+ - " dstColorRGBA64.B = uint16($2b)\n"+ - " dstColorRGBA64.A = uint16($2a)\n"+ - " dst.Set($0, $1, dstColor)\n"+ - "}", - ) - case "*image.RGBA": - switch d.sType { - default: - return argf(args, ""+ - "dst.Pix[d+0] = uint8($2r >> 8)\n"+ - "dst.Pix[d+1] = uint8($2g >> 8)\n"+ - "dst.Pix[d+2] = uint8($2b >> 8)\n"+ - "dst.Pix[d+3] = uint8($2a >> 8)", - ) - case "*image.Gray": - return argf(args, ""+ - "out := uint8($2r >> 8)\n"+ - "dst.Pix[d+0] = out\n"+ - "dst.Pix[d+1] = out\n"+ - "dst.Pix[d+2] = out\n"+ - "dst.Pix[d+3] = 0xff", - ) - case "*image.YCbCr": - return argf(args, ""+ - "dst.Pix[d+0] = uint8($2r >> 8)\n"+ - "dst.Pix[d+1] = uint8($2g >> 8)\n"+ - "dst.Pix[d+2] = uint8($2b >> 8)\n"+ - "dst.Pix[d+3] = 0xff", - ) - } - } - } - - case "outputf": - args, _ := splitArgs(suffix) - if len(args) != 5 { - return "" - } - ret := "" - - switch d.op { - case "Over": - switch d.dType { - default: - log.Fatalf("bad dType %q", d.dType) - case "Image": - ret = argf(args, ""+ - "qr, qg, qb, qa := dst.At($0, $1).RGBA()\n"+ - "$3r0 := uint32($2($3r * $4))\n"+ - "$3g0 := uint32($2($3g * $4))\n"+ - "$3b0 := uint32($2($3b * $4))\n"+ - "$3a0 := uint32($2($3a * $4))\n"+ - "if dstMask != nil {\n"+ - " _, _, _, ma := dstMask.At(dmp.X + $0, dmp.Y + $1).RGBA()\n"+ - " $3r0 = $3r0 * ma / 0xffff\n"+ - " $3g0 = $3g0 * ma / 0xffff\n"+ - " $3b0 = $3b0 * ma / 0xffff\n"+ - " $3a0 = $3a0 * ma / 0xffff\n"+ - "}\n"+ - "$3a1 := 0xffff - $3a0\n"+ - "dstColorRGBA64.R = uint16(qr*$3a1/0xffff + $3r0)\n"+ - "dstColorRGBA64.G = uint16(qg*$3a1/0xffff + $3g0)\n"+ - "dstColorRGBA64.B = uint16(qb*$3a1/0xffff + $3b0)\n"+ - "dstColorRGBA64.A = uint16(qa*$3a1/0xffff + $3a0)\n"+ - "dst.Set($0, $1, dstColor)", - ) - case "*image.RGBA": - ret = argf(args, ""+ - "$3r0 := uint32($2($3r * $4))\n"+ - "$3g0 := uint32($2($3g * $4))\n"+ - "$3b0 := uint32($2($3b * $4))\n"+ - "$3a0 := uint32($2($3a * $4))\n"+ - "$3a1 := (0xffff - uint32($3a0)) * 0x101\n"+ - "dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*$3a1/0xffff + $3r0) >> 8)\n"+ - "dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*$3a1/0xffff + $3g0) >> 8)\n"+ - "dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*$3a1/0xffff + $3b0) >> 8)\n"+ - "dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*$3a1/0xffff + $3a0) >> 8)", - ) - } - - case "Src": - switch d.dType { - default: - log.Fatalf("bad dType %q", d.dType) - case "Image": - ret = argf(args, ""+ - "if dstMask != nil {\n"+ - " qr, qg, qb, qa := dst.At($0, $1).RGBA()\n"+ - " _, _, _, ma := dstMask.At(dmp.X + $0, dmp.Y + $1).RGBA()\n"+ - " pr := uint32($2($3r * $4)) * ma / 0xffff\n"+ - " pg := uint32($2($3g * $4)) * ma / 0xffff\n"+ - " pb := uint32($2($3b * $4)) * ma / 0xffff\n"+ - " pa := uint32($2($3a * $4)) * ma / 0xffff\n"+ - " pa1 := 0xffff - ma\n"+ // Note that this is ma, not pa. - " dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr)\n"+ - " dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg)\n"+ - " dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb)\n"+ - " dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa)\n"+ - " dst.Set($0, $1, dstColor)\n"+ - "} else {\n"+ - " dstColorRGBA64.R = $2($3r * $4)\n"+ - " dstColorRGBA64.G = $2($3g * $4)\n"+ - " dstColorRGBA64.B = $2($3b * $4)\n"+ - " dstColorRGBA64.A = $2($3a * $4)\n"+ - " dst.Set($0, $1, dstColor)\n"+ - "}", - ) - case "*image.RGBA": - switch d.sType { - default: - ret = argf(args, ""+ - "dst.Pix[d+0] = uint8($2($3r * $4) >> 8)\n"+ - "dst.Pix[d+1] = uint8($2($3g * $4) >> 8)\n"+ - "dst.Pix[d+2] = uint8($2($3b * $4) >> 8)\n"+ - "dst.Pix[d+3] = uint8($2($3a * $4) >> 8)", - ) - case "*image.Gray": - ret = argf(args, ""+ - "out := uint8($2($3r * $4) >> 8)\n"+ - "dst.Pix[d+0] = out\n"+ - "dst.Pix[d+1] = out\n"+ - "dst.Pix[d+2] = out\n"+ - "dst.Pix[d+3] = 0xff", - ) - case "*image.YCbCr": - ret = argf(args, ""+ - "dst.Pix[d+0] = uint8($2($3r * $4) >> 8)\n"+ - "dst.Pix[d+1] = uint8($2($3g * $4) >> 8)\n"+ - "dst.Pix[d+2] = uint8($2($3b * $4) >> 8)\n"+ - "dst.Pix[d+3] = 0xff", - ) - } - } - } - - return strings.Replace(ret, " * 1)", ")", -1) - - case "srcf", "srcu": - lhs, eqOp := splitEq(prefix) - if lhs == "" { - return "" - } - args, extra := splitArgs(suffix) - if len(args) != 2 { - return "" - } - - tmp := "" - if dollar == "srcf" { - tmp = "u" - } - - // TODO: there's no need to multiply by 0x101 in the switch below if - // the next thing we're going to do is shift right by 8. - - buf := new(bytes.Buffer) - switch d.sType { - default: - log.Fatalf("bad sType %q", d.sType) - case "image.Image": - fmt.Fprintf(buf, ""+ - "%sr%s, %sg%s, %sb%s, %sa%s := src.At(%s, %s).RGBA()\n", - lhs, tmp, lhs, tmp, lhs, tmp, lhs, tmp, args[0], args[1], - ) - if d.dType == "" || d.dType == "Image" { - fmt.Fprintf(buf, ""+ - "if srcMask != nil {\n"+ - " _, _, _, ma := srcMask.At(smp.X+%s, smp.Y+%s).RGBA()\n"+ - " %sr%s = %sr%s * ma / 0xffff\n"+ - " %sg%s = %sg%s * ma / 0xffff\n"+ - " %sb%s = %sb%s * ma / 0xffff\n"+ - " %sa%s = %sa%s * ma / 0xffff\n"+ - "}\n", - args[0], args[1], - lhs, tmp, lhs, tmp, - lhs, tmp, lhs, tmp, - lhs, tmp, lhs, tmp, - lhs, tmp, lhs, tmp, - ) - } - case "*image.Gray": - fmt.Fprintf(buf, ""+ - "%si := %s\n"+ - "%sr%s := uint32(src.Pix[%si]) * 0x101\n", - lhs, pixOffset("src", args[0], args[1], "", "*src.Stride"), - lhs, tmp, lhs, - ) - case "*image.NRGBA": - fmt.Fprintf(buf, ""+ - "%si := %s\n"+ - "%sa%s := uint32(src.Pix[%si+3]) * 0x101\n"+ - "%sr%s := uint32(src.Pix[%si+0]) * %sa%s / 0xff\n"+ - "%sg%s := uint32(src.Pix[%si+1]) * %sa%s / 0xff\n"+ - "%sb%s := uint32(src.Pix[%si+2]) * %sa%s / 0xff\n", - lhs, pixOffset("src", args[0], args[1], "*4", "*src.Stride"), - lhs, tmp, lhs, - lhs, tmp, lhs, lhs, tmp, - lhs, tmp, lhs, lhs, tmp, - lhs, tmp, lhs, lhs, tmp, - ) - case "*image.RGBA": - fmt.Fprintf(buf, ""+ - "%si := %s\n"+ - "%sr%s := uint32(src.Pix[%si+0]) * 0x101\n"+ - "%sg%s := uint32(src.Pix[%si+1]) * 0x101\n"+ - "%sb%s := uint32(src.Pix[%si+2]) * 0x101\n"+ - "%sa%s := uint32(src.Pix[%si+3]) * 0x101\n", - lhs, pixOffset("src", args[0], args[1], "*4", "*src.Stride"), - lhs, tmp, lhs, - lhs, tmp, lhs, - lhs, tmp, lhs, - lhs, tmp, lhs, - ) - case "*image.YCbCr": - fmt.Fprintf(buf, ""+ - "%si := %s\n"+ - "%sj := %s\n"+ - "%s\n", - lhs, pixOffset("src", args[0], args[1], "", "*src.YStride"), - lhs, cOffset(args[0], args[1], d.sratio), - ycbcrToRGB(lhs, tmp), - ) - } - - if dollar == "srcf" { - switch d.sType { - default: - fmt.Fprintf(buf, ""+ - "%sr %s float64(%sru)%s\n"+ - "%sg %s float64(%sgu)%s\n"+ - "%sb %s float64(%sbu)%s\n"+ - "%sa %s float64(%sau)%s\n", - lhs, eqOp, lhs, extra, - lhs, eqOp, lhs, extra, - lhs, eqOp, lhs, extra, - lhs, eqOp, lhs, extra, - ) - case "*image.Gray": - fmt.Fprintf(buf, ""+ - "%sr %s float64(%sru)%s\n", - lhs, eqOp, lhs, extra, - ) - case "*image.YCbCr": - fmt.Fprintf(buf, ""+ - "%sr %s float64(%sru)%s\n"+ - "%sg %s float64(%sgu)%s\n"+ - "%sb %s float64(%sbu)%s\n", - lhs, eqOp, lhs, extra, - lhs, eqOp, lhs, extra, - lhs, eqOp, lhs, extra, - ) - } - } - - return strings.TrimSpace(buf.String()) - - case "tweakD": - if d.dType == "*image.RGBA" { - return "d += dst.Stride" - } - return ";" - - case "tweakDx": - if d.dType == "*image.RGBA" { - return strings.Replace(prefix, "dx++", "dx, d = dx+1, d+4", 1) - } - return prefix - - case "tweakDy": - if d.dType == "*image.RGBA" { - return strings.Replace(prefix, "for dy, s", "for _, s", 1) - } - return prefix - - case "tweakP": - switch d.sType { - case "*image.Gray": - if strings.HasPrefix(strings.TrimSpace(prefix), "pa * ") { - return "1," - } - return "pr," - case "*image.YCbCr": - if strings.HasPrefix(strings.TrimSpace(prefix), "pa * ") { - return "1," - } - } - return prefix - - case "tweakPr": - if d.sType == "*image.Gray" { - return "pr *= s.invTotalWeightFFFF" - } - return ";" - - case "tweakVarP": - switch d.sType { - case "*image.Gray": - return strings.Replace(prefix, "var pr, pg, pb, pa", "var pr", 1) - case "*image.YCbCr": - return strings.Replace(prefix, "var pr, pg, pb, pa", "var pr, pg, pb", 1) - } - return prefix - } - return "" -} - -func expnSwitch(op, dType string, expandBoth bool, template string) string { - if op == "" && dType != "anyDType" { - lines := []string{"switch op {"} - for _, op = range ops { - lines = append(lines, - fmt.Sprintf("case %s:", op), - expnSwitch(op, dType, expandBoth, template), - ) - } - lines = append(lines, "}") - return strings.Join(lines, "\n") - } - - switchVar := "dst" - if dType != "" { - switchVar = "src" - } - lines := []string{fmt.Sprintf("switch %s := %s.(type) {", switchVar, switchVar)} - - fallback, values := "Image", dTypes - if dType != "" { - fallback, values = "image.Image", sTypesForDType[dType] - } - for _, v := range values { - if dType != "" { - // v is the sType. Skip those always-opaque sTypes, where Over is - // equivalent to Src. - if op == "Over" && alwaysOpaque[v] { - continue - } - } - - if v == fallback { - lines = append(lines, "default:") - } else { - lines = append(lines, fmt.Sprintf("case %s:", v)) - } - - if dType != "" { - if v == "*image.YCbCr" { - lines = append(lines, expnSwitchYCbCr(op, dType, template)) - } else { - lines = append(lines, expnLine(template, &data{dType: dType, sType: v, op: op})) - } - } else if !expandBoth { - lines = append(lines, expnLine(template, &data{dType: v, op: op})) - } else { - lines = append(lines, expnSwitch(op, v, false, template)) - } - } - - lines = append(lines, "}") - return strings.Join(lines, "\n") -} - -func expnSwitchYCbCr(op, dType, template string) string { - lines := []string{ - "switch src.SubsampleRatio {", - "default:", - expnLine(template, &data{dType: dType, sType: "image.Image", op: op}), - } - for _, sratio := range subsampleRatios { - lines = append(lines, - fmt.Sprintf("case image.YCbCrSubsampleRatio%s:", sratio), - expnLine(template, &data{dType: dType, sType: "*image.YCbCr", sratio: sratio, op: op}), - ) - } - lines = append(lines, "}") - return strings.Join(lines, "\n") -} - -func argf(args []string, s string) string { - if len(args) > 9 { - panic("too many args") - } - for i, a := range args { - old := fmt.Sprintf("$%d", i) - s = strings.Replace(s, old, a, -1) - } - return s -} - -func pixOffset(m, x, y, xstride, ystride string) string { - return fmt.Sprintf("(%s-%s.Rect.Min.Y)%s + (%s-%s.Rect.Min.X)%s", y, m, ystride, x, m, xstride) -} - -func cOffset(x, y, sratio string) string { - switch sratio { - case "444": - return fmt.Sprintf("( %s - src.Rect.Min.Y )*src.CStride + ( %s - src.Rect.Min.X )", y, x) - case "422": - return fmt.Sprintf("( %s - src.Rect.Min.Y )*src.CStride + ((%s)/2 - src.Rect.Min.X/2)", y, x) - case "420": - return fmt.Sprintf("((%s)/2 - src.Rect.Min.Y/2)*src.CStride + ((%s)/2 - src.Rect.Min.X/2)", y, x) - case "440": - return fmt.Sprintf("((%s)/2 - src.Rect.Min.Y/2)*src.CStride + ( %s - src.Rect.Min.X )", y, x) - } - return fmt.Sprintf("unsupported sratio %q", sratio) -} - -func ycbcrToRGB(lhs, tmp string) string { - s := ` - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - $yy1 := int(src.Y[$i]) * 0x10101 - $cb1 := int(src.Cb[$j]) - 128 - $cr1 := int(src.Cr[$j]) - 128 - $r@ := ($yy1 + 91881*$cr1) >> 8 - $g@ := ($yy1 - 22554*$cb1 - 46802*$cr1) >> 8 - $b@ := ($yy1 + 116130*$cb1) >> 8 - if $r@ < 0 { - $r@ = 0 - } else if $r@ > 0xffff { - $r@ = 0xffff - } - if $g@ < 0 { - $g@ = 0 - } else if $g@ > 0xffff { - $g@ = 0xffff - } - if $b@ < 0 { - $b@ = 0 - } else if $b@ > 0xffff { - $b@ = 0xffff - } - ` - s = strings.Replace(s, "$", lhs, -1) - s = strings.Replace(s, "@", tmp, -1) - return s -} - -func split(s, sep string) (string, string) { - if i := strings.Index(s, sep); i >= 0 { - return strings.TrimSpace(s[:i]), strings.TrimSpace(s[i+len(sep):]) - } - return "", "" -} - -func splitEq(s string) (lhs, eqOp string) { - s = strings.TrimSpace(s) - if lhs, _ = split(s, ":="); lhs != "" { - return lhs, ":=" - } - if lhs, _ = split(s, "+="); lhs != "" { - return lhs, "+=" - } - return "", "" -} - -func splitArgs(s string) (args []string, extra string) { - s = strings.TrimSpace(s) - if s == "" || s[0] != '[' { - return nil, "" - } - s = s[1:] - - i := strings.IndexByte(s, ']') - if i < 0 { - return nil, "" - } - args, extra = strings.Split(s[:i], ","), s[i+1:] - for i := range args { - args[i] = strings.TrimSpace(args[i]) - } - return args, extra -} - -func relName(s string) string { - if i := strings.LastIndex(s, "."); i >= 0 { - return s[i+1:] - } - return s -} - -const ( - codeRoot = ` - func (z $receiver) Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) { - // Try to simplify a Scale to a Copy when DstMask is not specified. - // If DstMask is not nil, Copy will call Scale back with same dr and sr, and cause stack overflow. - if dr.Size() == sr.Size() && (opts == nil || opts.DstMask == nil) { - Copy(dst, dr.Min, src, sr, op, opts) - return - } - - var o Options - if opts != nil { - o = *opts - } - - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - z.scale_Image_Image_Over(dst, dr, adr, src, sr, &o) - case Src: - z.scale_Image_Image_Src(dst, dr, adr, src, sr, &o) - } - } else if _, ok := src.(*image.Uniform); ok { - Draw(dst, dr, src, src.Bounds().Min, op) - } else { - $switch z.scale_$dTypeRN_$sTypeRN$sratio_$op(dst, dr, adr, src, sr, &o) - } - } - - func (z $receiver) Transform(dst Image, s2d f64.Aff3, src image.Image, sr image.Rectangle, op Op, opts *Options) { - // Try to simplify a Transform to a Copy. - if s2d[0] == 1 && s2d[1] == 0 && s2d[3] == 0 && s2d[4] == 1 { - dx := int(s2d[2]) - dy := int(s2d[5]) - if float64(dx) == s2d[2] && float64(dy) == s2d[5] { - Copy(dst, image.Point{X: sr.Min.X + dx, Y: sr.Min.X + dy}, src, sr, op, opts) - return - } - } - - var o Options - if opts != nil { - o = *opts - } - - dr := transformRect(&s2d, &sr) - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - d2s := invert(&s2d) - // bias is a translation of the mapping from dst coordinates to src - // coordinates such that the latter temporarily have non-negative X - // and Y coordinates. This allows us to write int(f) instead of - // int(math.Floor(f)), since "round to zero" and "round down" are - // equivalent when f >= 0, but the former is much cheaper. The X-- - // and Y-- are because the TransformLeaf methods have a "sx -= 0.5" - // adjustment. - bias := transformRect(&d2s, &adr).Min - bias.X-- - bias.Y-- - d2s[2] -= float64(bias.X) - d2s[5] -= float64(bias.Y) - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - z.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - case Src: - z.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } else if u, ok := src.(*image.Uniform); ok { - transform_Uniform(dst, dr, adr, &d2s, u, sr, bias, op) - } else { - $switch z.transform_$dTypeRN_$sTypeRN$sratio_$op(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } - ` - - codeNNScaleLeaf = ` - func (nnInterpolator) scale_$dTypeRN_$sTypeRN$sratio_$op(dst $dType, dr, adr image.Rectangle, src $sType, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - $preOuter - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - $preInner - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { $tweakDx - sx := (2*uint64(dx) + 1) * sw / dw2 - p := $srcu[sr.Min.X + int(sx), sr.Min.Y + int(sy)] - $outputu[dr.Min.X + int(dx), dr.Min.Y + int(dy), p] - } - } - } - ` - - codeNNTransformLeaf = ` - func (nnInterpolator) transform_$dTypeRN_$sTypeRN$sratio_$op(dst $dType, dr, adr image.Rectangle, d2s *f64.Aff3, src $sType, sr image.Rectangle, bias image.Point, opts *Options) { - $preOuter - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y + int(dy)) + 0.5 - $preInner - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { $tweakDx - dxf := float64(dr.Min.X + int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf + d2s[1]*dyf + d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf + d2s[4]*dyf + d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - p := $srcu[sx0, sy0] - $outputu[dr.Min.X + int(dx), dr.Min.Y + int(dy), p] - } - } - } - ` - - codeABLScaleLeaf = ` - func (ablInterpolator) scale_$dTypeRN_$sTypeRN$sratio_$op(dst $dType, dr, adr image.Rectangle, src $sType, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw - 1, sh - 1 - $preOuter - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - $preInner - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { $tweakDx - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00 := $srcf[sr.Min.X + int(sx0), sr.Min.Y + int(sy0)] - s10 := $srcf[sr.Min.X + int(sx1), sr.Min.Y + int(sy0)] - $blend[xFrac1, s00, xFrac0, s10] - s01 := $srcf[sr.Min.X + int(sx0), sr.Min.Y + int(sy1)] - s11 := $srcf[sr.Min.X + int(sx1), sr.Min.Y + int(sy1)] - $blend[xFrac1, s01, xFrac0, s11] - $blend[yFrac1, s10, yFrac0, s11] - $convFtou[p, s11] - $outputu[dr.Min.X + int(dx), dr.Min.Y + int(dy), p] - } - } - } - ` - - codeABLTransformLeaf = ` - func (ablInterpolator) transform_$dTypeRN_$sTypeRN$sratio_$op(dst $dType, dr, adr image.Rectangle, d2s *f64.Aff3, src $sType, sr image.Rectangle, bias image.Point, opts *Options) { - $preOuter - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y + int(dy)) + 0.5 - $preInner - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { $tweakDx - dxf := float64(dr.Min.X + int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00 := $srcf[sx0, sy0] - s10 := $srcf[sx1, sy0] - $blend[xFrac1, s00, xFrac0, s10] - s01 := $srcf[sx0, sy1] - s11 := $srcf[sx1, sy1] - $blend[xFrac1, s01, xFrac0, s11] - $blend[yFrac1, s10, yFrac0, s11] - $convFtou[p, s11] - $outputu[dr.Min.X + int(dx), dr.Min.Y + int(dy), p] - } - } - } - ` - - codeKernelRoot = ` - func (z *kernelScaler) Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) { - if z.dw != int32(dr.Dx()) || z.dh != int32(dr.Dy()) || z.sw != int32(sr.Dx()) || z.sh != int32(sr.Dy()) { - z.kernel.Scale(dst, dr, src, sr, op, opts) - return - } - - var o Options - if opts != nil { - o = *opts - } - - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - if _, ok := src.(*image.Uniform); ok && o.DstMask == nil && o.SrcMask == nil && sr.In(src.Bounds()) { - Draw(dst, dr, src, src.Bounds().Min, op) - return - } - - // Create a temporary buffer: - // scaleX distributes the source image's columns over the temporary image. - // scaleY distributes the temporary image's rows over the destination image. - var tmp [][4]float64 - if z.pool.New != nil { - tmpp := z.pool.Get().(*[][4]float64) - defer z.pool.Put(tmpp) - tmp = *tmpp - } else { - tmp = z.makeTmpBuf() - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.SrcMask != nil || !sr.In(src.Bounds()) { - z.scaleX_Image(tmp, src, sr, &o) - } else { - $switchS z.scaleX_$sTypeRN$sratio(tmp, src, sr, &o) - } - - if o.DstMask != nil { - switch op { - case Over: - z.scaleY_Image_Over(dst, dr, adr, tmp, &o) - case Src: - z.scaleY_Image_Src(dst, dr, adr, tmp, &o) - } - } else { - $switchD z.scaleY_$dTypeRN_$op(dst, dr, adr, tmp, &o) - } - } - - func (q *Kernel) Transform(dst Image, s2d f64.Aff3, src image.Image, sr image.Rectangle, op Op, opts *Options) { - var o Options - if opts != nil { - o = *opts - } - - dr := transformRect(&s2d, &sr) - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - d2s := invert(&s2d) - // bias is a translation of the mapping from dst coordinates to src - // coordinates such that the latter temporarily have non-negative X - // and Y coordinates. This allows us to write int(f) instead of - // int(math.Floor(f)), since "round to zero" and "round down" are - // equivalent when f >= 0, but the former is much cheaper. The X-- - // and Y-- are because the TransformLeaf methods have a "sx -= 0.5" - // adjustment. - bias := transformRect(&d2s, &adr).Min - bias.X-- - bias.Y-- - d2s[2] -= float64(bias.X) - d2s[5] -= float64(bias.Y) - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - - if u, ok := src.(*image.Uniform); ok && o.DstMask != nil && o.SrcMask != nil && sr.In(src.Bounds()) { - transform_Uniform(dst, dr, adr, &d2s, u, sr, bias, op) - return - } - - xscale := abs(d2s[0]) - if s := abs(d2s[1]); xscale < s { - xscale = s - } - yscale := abs(d2s[3]) - if s := abs(d2s[4]); yscale < s { - yscale = s - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - q.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case Src: - q.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - } else { - $switch q.transform_$dTypeRN_$sTypeRN$sratio_$op(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - } - ` - - codeKernelScaleLeafX = ` - func (z *kernelScaler) scaleX_$sTypeRN$sratio(tmp [][4]float64, src $sType, sr image.Rectangle, opts *Options) { - t := 0 - $preKernelOuter - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb, pa float64 $tweakVarP - for _, c := range z.horizontal.contribs[s.i:s.j] { - p += $srcf[sr.Min.X + int(c.coord), sr.Min.Y + int(y)] * c.weight - } - $tweakPr - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, $tweakP - pg * s.invTotalWeightFFFF, $tweakP - pb * s.invTotalWeightFFFF, $tweakP - pa * s.invTotalWeightFFFF, $tweakP - } - t++ - } - } - } - ` - - codeKernelScaleLeafY = ` - func (z *kernelScaler) scaleY_$dTypeRN_$op(dst $dType, dr, adr image.Rectangle, tmp [][4]float64, opts *Options) { - $preOuter - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - $preKernelInner - for dy, s := range z.vertical.sources[adr.Min.Y:adr.Max.Y] { $tweakDy - var pr, pg, pb, pa float64 - for _, c := range z.vertical.contribs[s.i:s.j] { - p := &tmp[c.coord*z.dw+dx] - pr += p[0] * c.weight - pg += p[1] * c.weight - pb += p[2] * c.weight - pa += p[3] * c.weight - } - $clampToAlpha - $outputf[dr.Min.X + int(dx), dr.Min.Y + int(adr.Min.Y + dy), ftou, p, s.invTotalWeight] - $tweakD - } - } - } - ` - - codeKernelTransformLeaf = ` - func (q *Kernel) transform_$dTypeRN_$sTypeRN$sratio_$op(dst $dType, dr, adr image.Rectangle, d2s *f64.Aff3, src $sType, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1 + 2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1 + 2*int(math.Ceil(yHalfWidth))) - - $preOuter - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y + int(dy)) + 0.5 - $preInner - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { $tweakDx - dxf := float64(dr.Min.X + int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx - ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky - iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 $tweakVarP - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky - iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx - ix] * yWeight; w != 0 { - p += $srcf[kx, ky] * w - } - } - } - } - $clampToAlpha - $outputf[dr.Min.X + int(dx), dr.Min.Y + int(dy), fffftou, p, 1] - } - } - } - ` -) diff --git a/vendor/golang.org/x/image/draw/go1_8.go b/vendor/golang.org/x/image/draw/go1_8.go deleted file mode 100644 index ec192b7..0000000 --- a/vendor/golang.org/x/image/draw/go1_8.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.9,!go1.8.typealias - -package draw - -import ( - "image" - "image/color" - "image/draw" -) - -// Drawer contains the Draw method. -type Drawer interface { - // Draw aligns r.Min in dst with sp in src and then replaces the - // rectangle r in dst with the result of drawing src on dst. - Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) -} - -// Image is an image.Image with a Set method to change a single pixel. -type Image interface { - image.Image - Set(x, y int, c color.Color) -} - -// Op is a Porter-Duff compositing operator. -type Op int - -const ( - // Over specifies ``(src in mask) over dst''. - Over Op = Op(draw.Over) - // Src specifies ``src in mask''. - Src Op = Op(draw.Src) -) - -// Draw implements the Drawer interface by calling the Draw function with -// this Op. -func (op Op) Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) { - (draw.Op(op)).Draw(dst, r, src, sp) -} - -// Quantizer produces a palette for an image. -type Quantizer interface { - // Quantize appends up to cap(p) - len(p) colors to p and returns the - // updated palette suitable for converting m to a paletted image. - Quantize(p color.Palette, m image.Image) color.Palette -} diff --git a/vendor/golang.org/x/image/draw/go1_9.go b/vendor/golang.org/x/image/draw/go1_9.go deleted file mode 100644 index fc548e9..0000000 --- a/vendor/golang.org/x/image/draw/go1_9.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.9 go1.8.typealias - -package draw - -import ( - "image/draw" -) - -// We use type aliases (new in Go 1.9) for the exported names from the standard -// library's image/draw package. This is not merely syntactic sugar for -// -// type Drawer draw.Drawer -// -// as aliasing means that the types in this package, such as draw.Image and -// draw.Op, are identical to the corresponding draw.Image and draw.Op types in -// the standard library. In comparison, prior to Go 1.9, the code in go1_8.go -// defines new types that mimic the old but are different types. -// -// The package documentation, in draw.go, explicitly gives the intent of this -// package: -// -// This package is a superset of and a drop-in replacement for the -// image/draw package in the standard library. -// -// Drop-in replacement means that I can replace all of my "image/draw" imports -// with "golang.org/x/image/draw", to access additional features in this -// package, and no further changes are required. That's mostly true, but not -// completely true unless we use type aliases. -// -// Without type aliases, users might need to import both "image/draw" and -// "golang.org/x/image/draw" in order to convert from two conceptually -// equivalent but different (from the compiler's point of view) types, such as -// from one draw.Op type to another draw.Op type, to satisfy some other -// interface or function signature. - -// Drawer contains the Draw method. -type Drawer = draw.Drawer - -// Image is an image.Image with a Set method to change a single pixel. -type Image = draw.Image - -// Op is a Porter-Duff compositing operator. -type Op = draw.Op - -const ( - // Over specifies ``(src in mask) over dst''. - Over Op = draw.Over - // Src specifies ``src in mask''. - Src Op = draw.Src -) - -// Quantizer produces a palette for an image. -type Quantizer = draw.Quantizer diff --git a/vendor/golang.org/x/image/draw/impl.go b/vendor/golang.org/x/image/draw/impl.go deleted file mode 100644 index 75498ad..0000000 --- a/vendor/golang.org/x/image/draw/impl.go +++ /dev/null @@ -1,6670 +0,0 @@ -// generated by "go run gen.go". DO NOT EDIT. - -package draw - -import ( - "image" - "image/color" - "math" - - "golang.org/x/image/math/f64" -) - -func (z nnInterpolator) Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) { - // Try to simplify a Scale to a Copy when DstMask is not specified. - // If DstMask is not nil, Copy will call Scale back with same dr and sr, and cause stack overflow. - if dr.Size() == sr.Size() && (opts == nil || opts.DstMask == nil) { - Copy(dst, dr.Min, src, sr, op, opts) - return - } - - var o Options - if opts != nil { - o = *opts - } - - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - z.scale_Image_Image_Over(dst, dr, adr, src, sr, &o) - case Src: - z.scale_Image_Image_Src(dst, dr, adr, src, sr, &o) - } - } else if _, ok := src.(*image.Uniform); ok { - Draw(dst, dr, src, src.Bounds().Min, op) - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.NRGBA: - z.scale_RGBA_NRGBA_Over(dst, dr, adr, src, sr, &o) - case *image.RGBA: - z.scale_RGBA_RGBA_Over(dst, dr, adr, src, sr, &o) - default: - z.scale_RGBA_Image_Over(dst, dr, adr, src, sr, &o) - } - default: - switch src := src.(type) { - default: - z.scale_Image_Image_Over(dst, dr, adr, src, sr, &o) - } - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.Gray: - z.scale_RGBA_Gray_Src(dst, dr, adr, src, sr, &o) - case *image.NRGBA: - z.scale_RGBA_NRGBA_Src(dst, dr, adr, src, sr, &o) - case *image.RGBA: - z.scale_RGBA_RGBA_Src(dst, dr, adr, src, sr, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - z.scale_RGBA_Image_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio444: - z.scale_RGBA_YCbCr444_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio422: - z.scale_RGBA_YCbCr422_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio420: - z.scale_RGBA_YCbCr420_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio440: - z.scale_RGBA_YCbCr440_Src(dst, dr, adr, src, sr, &o) - } - default: - z.scale_RGBA_Image_Src(dst, dr, adr, src, sr, &o) - } - default: - switch src := src.(type) { - default: - z.scale_Image_Image_Src(dst, dr, adr, src, sr, &o) - } - } - } - } -} - -func (z nnInterpolator) Transform(dst Image, s2d f64.Aff3, src image.Image, sr image.Rectangle, op Op, opts *Options) { - // Try to simplify a Transform to a Copy. - if s2d[0] == 1 && s2d[1] == 0 && s2d[3] == 0 && s2d[4] == 1 { - dx := int(s2d[2]) - dy := int(s2d[5]) - if float64(dx) == s2d[2] && float64(dy) == s2d[5] { - Copy(dst, image.Point{X: sr.Min.X + dx, Y: sr.Min.X + dy}, src, sr, op, opts) - return - } - } - - var o Options - if opts != nil { - o = *opts - } - - dr := transformRect(&s2d, &sr) - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - d2s := invert(&s2d) - // bias is a translation of the mapping from dst coordinates to src - // coordinates such that the latter temporarily have non-negative X - // and Y coordinates. This allows us to write int(f) instead of - // int(math.Floor(f)), since "round to zero" and "round down" are - // equivalent when f >= 0, but the former is much cheaper. The X-- - // and Y-- are because the TransformLeaf methods have a "sx -= 0.5" - // adjustment. - bias := transformRect(&d2s, &adr).Min - bias.X-- - bias.Y-- - d2s[2] -= float64(bias.X) - d2s[5] -= float64(bias.Y) - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - z.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - case Src: - z.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } else if u, ok := src.(*image.Uniform); ok { - transform_Uniform(dst, dr, adr, &d2s, u, sr, bias, op) - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.NRGBA: - z.transform_RGBA_NRGBA_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.RGBA: - z.transform_RGBA_RGBA_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - default: - z.transform_RGBA_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - switch src := src.(type) { - default: - z.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.Gray: - z.transform_RGBA_Gray_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.NRGBA: - z.transform_RGBA_NRGBA_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.RGBA: - z.transform_RGBA_RGBA_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - z.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio444: - z.transform_RGBA_YCbCr444_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio422: - z.transform_RGBA_YCbCr422_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio420: - z.transform_RGBA_YCbCr420_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio440: - z.transform_RGBA_YCbCr440_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - z.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - switch src := src.(type) { - default: - z.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } - } - } -} - -func (nnInterpolator) scale_RGBA_Gray_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.Gray, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(sx) - src.Rect.Min.X) - pr := uint32(src.Pix[pi]) * 0x101 - out := uint8(pr >> 8) - dst.Pix[d+0] = out - dst.Pix[d+1] = out - dst.Pix[d+2] = out - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) scale_RGBA_NRGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, src *image.NRGBA, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx)-src.Rect.Min.X)*4 - pa := uint32(src.Pix[pi+3]) * 0x101 - pr := uint32(src.Pix[pi+0]) * pa / 0xff - pg := uint32(src.Pix[pi+1]) * pa / 0xff - pb := uint32(src.Pix[pi+2]) * pa / 0xff - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) scale_RGBA_NRGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.NRGBA, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx)-src.Rect.Min.X)*4 - pa := uint32(src.Pix[pi+3]) * 0x101 - pr := uint32(src.Pix[pi+0]) * pa / 0xff - pg := uint32(src.Pix[pi+1]) * pa / 0xff - pb := uint32(src.Pix[pi+2]) * pa / 0xff - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) scale_RGBA_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, src *image.RGBA, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx)-src.Rect.Min.X)*4 - pr := uint32(src.Pix[pi+0]) * 0x101 - pg := uint32(src.Pix[pi+1]) * 0x101 - pb := uint32(src.Pix[pi+2]) * 0x101 - pa := uint32(src.Pix[pi+3]) * 0x101 - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) scale_RGBA_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.RGBA, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx)-src.Rect.Min.X)*4 - pr := uint32(src.Pix[pi+0]) * 0x101 - pg := uint32(src.Pix[pi+1]) * 0x101 - pb := uint32(src.Pix[pi+2]) * 0x101 - pa := uint32(src.Pix[pi+3]) * 0x101 - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) scale_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - pj := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) scale_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - pj := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) scale_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - pj := ((sr.Min.Y+int(sy))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) scale_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - pj := ((sr.Min.Y+int(sy))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) scale_RGBA_Image_Over(dst *image.RGBA, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pr, pg, pb, pa := src.At(sr.Min.X+int(sx), sr.Min.Y+int(sy)).RGBA() - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) scale_RGBA_Image_Src(dst *image.RGBA, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pr, pg, pb, pa := src.At(sr.Min.X+int(sx), sr.Min.Y+int(sy)).RGBA() - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) scale_Image_Image_Over(dst Image, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - sx := (2*uint64(dx) + 1) * sw / dw2 - pr, pg, pb, pa := src.At(sr.Min.X+int(sx), sr.Min.Y+int(sy)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx), smp.Y+sr.Min.Y+int(sy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - pa1 := 0xffff - pa - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } -} - -func (nnInterpolator) scale_Image_Image_Src(dst Image, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - sx := (2*uint64(dx) + 1) * sw / dw2 - pr, pg, pb, pa := src.At(sr.Min.X+int(sx), sr.Min.Y+int(sy)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx), smp.Y+sr.Min.Y+int(sy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } else { - dstColorRGBA64.R = uint16(pr) - dstColorRGBA64.G = uint16(pg) - dstColorRGBA64.B = uint16(pb) - dstColorRGBA64.A = uint16(pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } -} - -func (nnInterpolator) transform_RGBA_Gray_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.Gray, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.Stride + (sx0 - src.Rect.Min.X) - pr := uint32(src.Pix[pi]) * 0x101 - out := uint8(pr >> 8) - dst.Pix[d+0] = out - dst.Pix[d+1] = out - dst.Pix[d+2] = out - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) transform_RGBA_NRGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - pa := uint32(src.Pix[pi+3]) * 0x101 - pr := uint32(src.Pix[pi+0]) * pa / 0xff - pg := uint32(src.Pix[pi+1]) * pa / 0xff - pb := uint32(src.Pix[pi+2]) * pa / 0xff - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) transform_RGBA_NRGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - pa := uint32(src.Pix[pi+3]) * 0x101 - pr := uint32(src.Pix[pi+0]) * pa / 0xff - pg := uint32(src.Pix[pi+1]) * pa / 0xff - pb := uint32(src.Pix[pi+2]) * pa / 0xff - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) transform_RGBA_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - pr := uint32(src.Pix[pi+0]) * 0x101 - pg := uint32(src.Pix[pi+1]) * 0x101 - pb := uint32(src.Pix[pi+2]) * 0x101 - pa := uint32(src.Pix[pi+3]) * 0x101 - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) transform_RGBA_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - pr := uint32(src.Pix[pi+0]) * 0x101 - pg := uint32(src.Pix[pi+1]) * 0x101 - pb := uint32(src.Pix[pi+2]) * 0x101 - pa := uint32(src.Pix[pi+3]) * 0x101 - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - pj := (sy0-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - pj := (sy0-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - pj := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - pj := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) transform_RGBA_Image_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pr, pg, pb, pa := src.At(sx0, sy0).RGBA() - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) transform_RGBA_Image_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pr, pg, pb, pa := src.At(sx0, sy0).RGBA() - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) transform_Image_Image_Over(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pr, pg, pb, pa := src.At(sx0, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy0).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - pa1 := 0xffff - pa - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } -} - -func (nnInterpolator) transform_Image_Image_Src(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pr, pg, pb, pa := src.At(sx0, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy0).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } else { - dstColorRGBA64.R = uint16(pr) - dstColorRGBA64.G = uint16(pg) - dstColorRGBA64.B = uint16(pb) - dstColorRGBA64.A = uint16(pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } -} - -func (z ablInterpolator) Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) { - // Try to simplify a Scale to a Copy when DstMask is not specified. - // If DstMask is not nil, Copy will call Scale back with same dr and sr, and cause stack overflow. - if dr.Size() == sr.Size() && (opts == nil || opts.DstMask == nil) { - Copy(dst, dr.Min, src, sr, op, opts) - return - } - - var o Options - if opts != nil { - o = *opts - } - - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - z.scale_Image_Image_Over(dst, dr, adr, src, sr, &o) - case Src: - z.scale_Image_Image_Src(dst, dr, adr, src, sr, &o) - } - } else if _, ok := src.(*image.Uniform); ok { - Draw(dst, dr, src, src.Bounds().Min, op) - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.NRGBA: - z.scale_RGBA_NRGBA_Over(dst, dr, adr, src, sr, &o) - case *image.RGBA: - z.scale_RGBA_RGBA_Over(dst, dr, adr, src, sr, &o) - default: - z.scale_RGBA_Image_Over(dst, dr, adr, src, sr, &o) - } - default: - switch src := src.(type) { - default: - z.scale_Image_Image_Over(dst, dr, adr, src, sr, &o) - } - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.Gray: - z.scale_RGBA_Gray_Src(dst, dr, adr, src, sr, &o) - case *image.NRGBA: - z.scale_RGBA_NRGBA_Src(dst, dr, adr, src, sr, &o) - case *image.RGBA: - z.scale_RGBA_RGBA_Src(dst, dr, adr, src, sr, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - z.scale_RGBA_Image_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio444: - z.scale_RGBA_YCbCr444_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio422: - z.scale_RGBA_YCbCr422_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio420: - z.scale_RGBA_YCbCr420_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio440: - z.scale_RGBA_YCbCr440_Src(dst, dr, adr, src, sr, &o) - } - default: - z.scale_RGBA_Image_Src(dst, dr, adr, src, sr, &o) - } - default: - switch src := src.(type) { - default: - z.scale_Image_Image_Src(dst, dr, adr, src, sr, &o) - } - } - } - } -} - -func (z ablInterpolator) Transform(dst Image, s2d f64.Aff3, src image.Image, sr image.Rectangle, op Op, opts *Options) { - // Try to simplify a Transform to a Copy. - if s2d[0] == 1 && s2d[1] == 0 && s2d[3] == 0 && s2d[4] == 1 { - dx := int(s2d[2]) - dy := int(s2d[5]) - if float64(dx) == s2d[2] && float64(dy) == s2d[5] { - Copy(dst, image.Point{X: sr.Min.X + dx, Y: sr.Min.X + dy}, src, sr, op, opts) - return - } - } - - var o Options - if opts != nil { - o = *opts - } - - dr := transformRect(&s2d, &sr) - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - d2s := invert(&s2d) - // bias is a translation of the mapping from dst coordinates to src - // coordinates such that the latter temporarily have non-negative X - // and Y coordinates. This allows us to write int(f) instead of - // int(math.Floor(f)), since "round to zero" and "round down" are - // equivalent when f >= 0, but the former is much cheaper. The X-- - // and Y-- are because the TransformLeaf methods have a "sx -= 0.5" - // adjustment. - bias := transformRect(&d2s, &adr).Min - bias.X-- - bias.Y-- - d2s[2] -= float64(bias.X) - d2s[5] -= float64(bias.Y) - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - z.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - case Src: - z.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } else if u, ok := src.(*image.Uniform); ok { - transform_Uniform(dst, dr, adr, &d2s, u, sr, bias, op) - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.NRGBA: - z.transform_RGBA_NRGBA_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.RGBA: - z.transform_RGBA_RGBA_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - default: - z.transform_RGBA_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - switch src := src.(type) { - default: - z.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.Gray: - z.transform_RGBA_Gray_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.NRGBA: - z.transform_RGBA_NRGBA_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.RGBA: - z.transform_RGBA_RGBA_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - z.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio444: - z.transform_RGBA_YCbCr444_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio422: - z.transform_RGBA_YCbCr422_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio420: - z.transform_RGBA_YCbCr420_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio440: - z.transform_RGBA_YCbCr440_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - z.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - switch src := src.(type) { - default: - z.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } - } - } -} - -func (ablInterpolator) scale_RGBA_Gray_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.Gray, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s00ru := uint32(src.Pix[s00i]) * 0x101 - s00r := float64(s00ru) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s10ru := uint32(src.Pix[s10i]) * 0x101 - s10r := float64(s10ru) - s10r = xFrac1*s00r + xFrac0*s10r - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s01ru := uint32(src.Pix[s01i]) * 0x101 - s01r := float64(s01ru) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s11ru := uint32(src.Pix[s11i]) * 0x101 - s11r := float64(s11ru) - s11r = xFrac1*s01r + xFrac0*s11r - s11r = yFrac1*s10r + yFrac0*s11r - pr := uint32(s11r) - out := uint8(pr >> 8) - dst.Pix[d+0] = out - dst.Pix[d+1] = out - dst.Pix[d+2] = out - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) scale_RGBA_NRGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, src *image.NRGBA, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00ru := uint32(src.Pix[s00i+0]) * s00au / 0xff - s00gu := uint32(src.Pix[s00i+1]) * s00au / 0xff - s00bu := uint32(src.Pix[s00i+2]) * s00au / 0xff - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10ru := uint32(src.Pix[s10i+0]) * s10au / 0xff - s10gu := uint32(src.Pix[s10i+1]) * s10au / 0xff - s10bu := uint32(src.Pix[s10i+2]) * s10au / 0xff - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01ru := uint32(src.Pix[s01i+0]) * s01au / 0xff - s01gu := uint32(src.Pix[s01i+1]) * s01au / 0xff - s01bu := uint32(src.Pix[s01i+2]) * s01au / 0xff - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11ru := uint32(src.Pix[s11i+0]) * s11au / 0xff - s11gu := uint32(src.Pix[s11i+1]) * s11au / 0xff - s11bu := uint32(src.Pix[s11i+2]) * s11au / 0xff - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) scale_RGBA_NRGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.NRGBA, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00ru := uint32(src.Pix[s00i+0]) * s00au / 0xff - s00gu := uint32(src.Pix[s00i+1]) * s00au / 0xff - s00bu := uint32(src.Pix[s00i+2]) * s00au / 0xff - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10ru := uint32(src.Pix[s10i+0]) * s10au / 0xff - s10gu := uint32(src.Pix[s10i+1]) * s10au / 0xff - s10bu := uint32(src.Pix[s10i+2]) * s10au / 0xff - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01ru := uint32(src.Pix[s01i+0]) * s01au / 0xff - s01gu := uint32(src.Pix[s01i+1]) * s01au / 0xff - s01bu := uint32(src.Pix[s01i+2]) * s01au / 0xff - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11ru := uint32(src.Pix[s11i+0]) * s11au / 0xff - s11gu := uint32(src.Pix[s11i+1]) * s11au / 0xff - s11bu := uint32(src.Pix[s11i+2]) * s11au / 0xff - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) scale_RGBA_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, src *image.RGBA, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s00ru := uint32(src.Pix[s00i+0]) * 0x101 - s00gu := uint32(src.Pix[s00i+1]) * 0x101 - s00bu := uint32(src.Pix[s00i+2]) * 0x101 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s10ru := uint32(src.Pix[s10i+0]) * 0x101 - s10gu := uint32(src.Pix[s10i+1]) * 0x101 - s10bu := uint32(src.Pix[s10i+2]) * 0x101 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s01ru := uint32(src.Pix[s01i+0]) * 0x101 - s01gu := uint32(src.Pix[s01i+1]) * 0x101 - s01bu := uint32(src.Pix[s01i+2]) * 0x101 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s11ru := uint32(src.Pix[s11i+0]) * 0x101 - s11gu := uint32(src.Pix[s11i+1]) * 0x101 - s11bu := uint32(src.Pix[s11i+2]) * 0x101 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) scale_RGBA_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.RGBA, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s00ru := uint32(src.Pix[s00i+0]) * 0x101 - s00gu := uint32(src.Pix[s00i+1]) * 0x101 - s00bu := uint32(src.Pix[s00i+2]) * 0x101 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s10ru := uint32(src.Pix[s10i+0]) * 0x101 - s10gu := uint32(src.Pix[s10i+1]) * 0x101 - s10bu := uint32(src.Pix[s10i+2]) * 0x101 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s01ru := uint32(src.Pix[s01i+0]) * 0x101 - s01gu := uint32(src.Pix[s01i+1]) * 0x101 - s01bu := uint32(src.Pix[s01i+2]) * 0x101 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s11ru := uint32(src.Pix[s11i+0]) * 0x101 - s11gu := uint32(src.Pix[s11i+1]) * 0x101 - s11bu := uint32(src.Pix[s11i+2]) * 0x101 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) scale_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s00j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s10j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s01j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s11j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) scale_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s00j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s10j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s01j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s11j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) scale_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s00j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s10j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s01j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s11j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) scale_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s00j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s10j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s01j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s11j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) scale_RGBA_Image_Over(dst *image.RGBA, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy0)).RGBA() - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy0)).RGBA() - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy1)).RGBA() - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy1)).RGBA() - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) scale_RGBA_Image_Src(dst *image.RGBA, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy0)).RGBA() - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy0)).RGBA() - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy1)).RGBA() - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy1)).RGBA() - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) scale_Image_Image_Over(dst Image, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy0)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx0), smp.Y+sr.Min.Y+int(sy0)).RGBA() - s00ru = s00ru * ma / 0xffff - s00gu = s00gu * ma / 0xffff - s00bu = s00bu * ma / 0xffff - s00au = s00au * ma / 0xffff - } - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy0)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx1), smp.Y+sr.Min.Y+int(sy0)).RGBA() - s10ru = s10ru * ma / 0xffff - s10gu = s10gu * ma / 0xffff - s10bu = s10bu * ma / 0xffff - s10au = s10au * ma / 0xffff - } - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy1)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx0), smp.Y+sr.Min.Y+int(sy1)).RGBA() - s01ru = s01ru * ma / 0xffff - s01gu = s01gu * ma / 0xffff - s01bu = s01bu * ma / 0xffff - s01au = s01au * ma / 0xffff - } - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy1)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx1), smp.Y+sr.Min.Y+int(sy1)).RGBA() - s11ru = s11ru * ma / 0xffff - s11gu = s11gu * ma / 0xffff - s11bu = s11bu * ma / 0xffff - s11au = s11au * ma / 0xffff - } - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - pa1 := 0xffff - pa - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } -} - -func (ablInterpolator) scale_Image_Image_Src(dst Image, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy0)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx0), smp.Y+sr.Min.Y+int(sy0)).RGBA() - s00ru = s00ru * ma / 0xffff - s00gu = s00gu * ma / 0xffff - s00bu = s00bu * ma / 0xffff - s00au = s00au * ma / 0xffff - } - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy0)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx1), smp.Y+sr.Min.Y+int(sy0)).RGBA() - s10ru = s10ru * ma / 0xffff - s10gu = s10gu * ma / 0xffff - s10bu = s10bu * ma / 0xffff - s10au = s10au * ma / 0xffff - } - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy1)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx0), smp.Y+sr.Min.Y+int(sy1)).RGBA() - s01ru = s01ru * ma / 0xffff - s01gu = s01gu * ma / 0xffff - s01bu = s01bu * ma / 0xffff - s01au = s01au * ma / 0xffff - } - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy1)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx1), smp.Y+sr.Min.Y+int(sy1)).RGBA() - s11ru = s11ru * ma / 0xffff - s11gu = s11gu * ma / 0xffff - s11bu = s11bu * ma / 0xffff - s11au = s11au * ma / 0xffff - } - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } else { - dstColorRGBA64.R = uint16(pr) - dstColorRGBA64.G = uint16(pg) - dstColorRGBA64.B = uint16(pb) - dstColorRGBA64.A = uint16(pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } -} - -func (ablInterpolator) transform_RGBA_Gray_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.Gray, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.Stride + (sx0 - src.Rect.Min.X) - s00ru := uint32(src.Pix[s00i]) * 0x101 - s00r := float64(s00ru) - s10i := (sy0-src.Rect.Min.Y)*src.Stride + (sx1 - src.Rect.Min.X) - s10ru := uint32(src.Pix[s10i]) * 0x101 - s10r := float64(s10ru) - s10r = xFrac1*s00r + xFrac0*s10r - s01i := (sy1-src.Rect.Min.Y)*src.Stride + (sx0 - src.Rect.Min.X) - s01ru := uint32(src.Pix[s01i]) * 0x101 - s01r := float64(s01ru) - s11i := (sy1-src.Rect.Min.Y)*src.Stride + (sx1 - src.Rect.Min.X) - s11ru := uint32(src.Pix[s11i]) * 0x101 - s11r := float64(s11ru) - s11r = xFrac1*s01r + xFrac0*s11r - s11r = yFrac1*s10r + yFrac0*s11r - pr := uint32(s11r) - out := uint8(pr >> 8) - dst.Pix[d+0] = out - dst.Pix[d+1] = out - dst.Pix[d+2] = out - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) transform_RGBA_NRGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00ru := uint32(src.Pix[s00i+0]) * s00au / 0xff - s00gu := uint32(src.Pix[s00i+1]) * s00au / 0xff - s00bu := uint32(src.Pix[s00i+2]) * s00au / 0xff - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sy0-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10ru := uint32(src.Pix[s10i+0]) * s10au / 0xff - s10gu := uint32(src.Pix[s10i+1]) * s10au / 0xff - s10bu := uint32(src.Pix[s10i+2]) * s10au / 0xff - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sy1-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01ru := uint32(src.Pix[s01i+0]) * s01au / 0xff - s01gu := uint32(src.Pix[s01i+1]) * s01au / 0xff - s01bu := uint32(src.Pix[s01i+2]) * s01au / 0xff - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sy1-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11ru := uint32(src.Pix[s11i+0]) * s11au / 0xff - s11gu := uint32(src.Pix[s11i+1]) * s11au / 0xff - s11bu := uint32(src.Pix[s11i+2]) * s11au / 0xff - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) transform_RGBA_NRGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00ru := uint32(src.Pix[s00i+0]) * s00au / 0xff - s00gu := uint32(src.Pix[s00i+1]) * s00au / 0xff - s00bu := uint32(src.Pix[s00i+2]) * s00au / 0xff - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sy0-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10ru := uint32(src.Pix[s10i+0]) * s10au / 0xff - s10gu := uint32(src.Pix[s10i+1]) * s10au / 0xff - s10bu := uint32(src.Pix[s10i+2]) * s10au / 0xff - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sy1-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01ru := uint32(src.Pix[s01i+0]) * s01au / 0xff - s01gu := uint32(src.Pix[s01i+1]) * s01au / 0xff - s01bu := uint32(src.Pix[s01i+2]) * s01au / 0xff - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sy1-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11ru := uint32(src.Pix[s11i+0]) * s11au / 0xff - s11gu := uint32(src.Pix[s11i+1]) * s11au / 0xff - s11bu := uint32(src.Pix[s11i+2]) * s11au / 0xff - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) transform_RGBA_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s00ru := uint32(src.Pix[s00i+0]) * 0x101 - s00gu := uint32(src.Pix[s00i+1]) * 0x101 - s00bu := uint32(src.Pix[s00i+2]) * 0x101 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sy0-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s10ru := uint32(src.Pix[s10i+0]) * 0x101 - s10gu := uint32(src.Pix[s10i+1]) * 0x101 - s10bu := uint32(src.Pix[s10i+2]) * 0x101 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sy1-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s01ru := uint32(src.Pix[s01i+0]) * 0x101 - s01gu := uint32(src.Pix[s01i+1]) * 0x101 - s01bu := uint32(src.Pix[s01i+2]) * 0x101 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sy1-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s11ru := uint32(src.Pix[s11i+0]) * 0x101 - s11gu := uint32(src.Pix[s11i+1]) * 0x101 - s11bu := uint32(src.Pix[s11i+2]) * 0x101 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) transform_RGBA_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s00ru := uint32(src.Pix[s00i+0]) * 0x101 - s00gu := uint32(src.Pix[s00i+1]) * 0x101 - s00bu := uint32(src.Pix[s00i+2]) * 0x101 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sy0-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s10ru := uint32(src.Pix[s10i+0]) * 0x101 - s10gu := uint32(src.Pix[s10i+1]) * 0x101 - s10bu := uint32(src.Pix[s10i+2]) * 0x101 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sy1-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s01ru := uint32(src.Pix[s01i+0]) * 0x101 - s01gu := uint32(src.Pix[s01i+1]) * 0x101 - s01bu := uint32(src.Pix[s01i+2]) * 0x101 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sy1-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s11ru := uint32(src.Pix[s11i+0]) * 0x101 - s11gu := uint32(src.Pix[s11i+1]) * 0x101 - s11bu := uint32(src.Pix[s11i+2]) * 0x101 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s00j := (sy0-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s10j := (sy0-src.Rect.Min.Y)*src.CStride + (sx1 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s01j := (sy1-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s11j := (sy1-src.Rect.Min.Y)*src.CStride + (sx1 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s00j := (sy0-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s10j := (sy0-src.Rect.Min.Y)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s01j := (sy1-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s11j := (sy1-src.Rect.Min.Y)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s00j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s10j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s01j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s11j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s00j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s10j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx1 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s01j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s11j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + (sx1 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) transform_RGBA_Image_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sx0, sy0).RGBA() - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sx1, sy0).RGBA() - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sx0, sy1).RGBA() - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sx1, sy1).RGBA() - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) transform_RGBA_Image_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sx0, sy0).RGBA() - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sx1, sy0).RGBA() - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sx0, sy1).RGBA() - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sx1, sy1).RGBA() - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) transform_Image_Image_Over(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sx0, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy0).RGBA() - s00ru = s00ru * ma / 0xffff - s00gu = s00gu * ma / 0xffff - s00bu = s00bu * ma / 0xffff - s00au = s00au * ma / 0xffff - } - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sx1, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx1, smp.Y+sy0).RGBA() - s10ru = s10ru * ma / 0xffff - s10gu = s10gu * ma / 0xffff - s10bu = s10bu * ma / 0xffff - s10au = s10au * ma / 0xffff - } - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sx0, sy1).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy1).RGBA() - s01ru = s01ru * ma / 0xffff - s01gu = s01gu * ma / 0xffff - s01bu = s01bu * ma / 0xffff - s01au = s01au * ma / 0xffff - } - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sx1, sy1).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx1, smp.Y+sy1).RGBA() - s11ru = s11ru * ma / 0xffff - s11gu = s11gu * ma / 0xffff - s11bu = s11bu * ma / 0xffff - s11au = s11au * ma / 0xffff - } - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - pa1 := 0xffff - pa - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } -} - -func (ablInterpolator) transform_Image_Image_Src(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sx0, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy0).RGBA() - s00ru = s00ru * ma / 0xffff - s00gu = s00gu * ma / 0xffff - s00bu = s00bu * ma / 0xffff - s00au = s00au * ma / 0xffff - } - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sx1, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx1, smp.Y+sy0).RGBA() - s10ru = s10ru * ma / 0xffff - s10gu = s10gu * ma / 0xffff - s10bu = s10bu * ma / 0xffff - s10au = s10au * ma / 0xffff - } - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sx0, sy1).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy1).RGBA() - s01ru = s01ru * ma / 0xffff - s01gu = s01gu * ma / 0xffff - s01bu = s01bu * ma / 0xffff - s01au = s01au * ma / 0xffff - } - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sx1, sy1).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx1, smp.Y+sy1).RGBA() - s11ru = s11ru * ma / 0xffff - s11gu = s11gu * ma / 0xffff - s11bu = s11bu * ma / 0xffff - s11au = s11au * ma / 0xffff - } - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } else { - dstColorRGBA64.R = uint16(pr) - dstColorRGBA64.G = uint16(pg) - dstColorRGBA64.B = uint16(pb) - dstColorRGBA64.A = uint16(pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } -} - -func (z *kernelScaler) Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) { - if z.dw != int32(dr.Dx()) || z.dh != int32(dr.Dy()) || z.sw != int32(sr.Dx()) || z.sh != int32(sr.Dy()) { - z.kernel.Scale(dst, dr, src, sr, op, opts) - return - } - - var o Options - if opts != nil { - o = *opts - } - - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - if _, ok := src.(*image.Uniform); ok && o.DstMask == nil && o.SrcMask == nil && sr.In(src.Bounds()) { - Draw(dst, dr, src, src.Bounds().Min, op) - return - } - - // Create a temporary buffer: - // scaleX distributes the source image's columns over the temporary image. - // scaleY distributes the temporary image's rows over the destination image. - var tmp [][4]float64 - if z.pool.New != nil { - tmpp := z.pool.Get().(*[][4]float64) - defer z.pool.Put(tmpp) - tmp = *tmpp - } else { - tmp = z.makeTmpBuf() - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.SrcMask != nil || !sr.In(src.Bounds()) { - z.scaleX_Image(tmp, src, sr, &o) - } else { - switch src := src.(type) { - case *image.Gray: - z.scaleX_Gray(tmp, src, sr, &o) - case *image.NRGBA: - z.scaleX_NRGBA(tmp, src, sr, &o) - case *image.RGBA: - z.scaleX_RGBA(tmp, src, sr, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - z.scaleX_Image(tmp, src, sr, &o) - case image.YCbCrSubsampleRatio444: - z.scaleX_YCbCr444(tmp, src, sr, &o) - case image.YCbCrSubsampleRatio422: - z.scaleX_YCbCr422(tmp, src, sr, &o) - case image.YCbCrSubsampleRatio420: - z.scaleX_YCbCr420(tmp, src, sr, &o) - case image.YCbCrSubsampleRatio440: - z.scaleX_YCbCr440(tmp, src, sr, &o) - } - default: - z.scaleX_Image(tmp, src, sr, &o) - } - } - - if o.DstMask != nil { - switch op { - case Over: - z.scaleY_Image_Over(dst, dr, adr, tmp, &o) - case Src: - z.scaleY_Image_Src(dst, dr, adr, tmp, &o) - } - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - z.scaleY_RGBA_Over(dst, dr, adr, tmp, &o) - default: - z.scaleY_Image_Over(dst, dr, adr, tmp, &o) - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - z.scaleY_RGBA_Src(dst, dr, adr, tmp, &o) - default: - z.scaleY_Image_Src(dst, dr, adr, tmp, &o) - } - } - } -} - -func (q *Kernel) Transform(dst Image, s2d f64.Aff3, src image.Image, sr image.Rectangle, op Op, opts *Options) { - var o Options - if opts != nil { - o = *opts - } - - dr := transformRect(&s2d, &sr) - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - d2s := invert(&s2d) - // bias is a translation of the mapping from dst coordinates to src - // coordinates such that the latter temporarily have non-negative X - // and Y coordinates. This allows us to write int(f) instead of - // int(math.Floor(f)), since "round to zero" and "round down" are - // equivalent when f >= 0, but the former is much cheaper. The X-- - // and Y-- are because the TransformLeaf methods have a "sx -= 0.5" - // adjustment. - bias := transformRect(&d2s, &adr).Min - bias.X-- - bias.Y-- - d2s[2] -= float64(bias.X) - d2s[5] -= float64(bias.Y) - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - - if u, ok := src.(*image.Uniform); ok && o.DstMask != nil && o.SrcMask != nil && sr.In(src.Bounds()) { - transform_Uniform(dst, dr, adr, &d2s, u, sr, bias, op) - return - } - - xscale := abs(d2s[0]) - if s := abs(d2s[1]); xscale < s { - xscale = s - } - yscale := abs(d2s[3]) - if s := abs(d2s[4]); yscale < s { - yscale = s - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - q.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case Src: - q.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.NRGBA: - q.transform_RGBA_NRGBA_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case *image.RGBA: - q.transform_RGBA_RGBA_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - default: - q.transform_RGBA_Image_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - default: - switch src := src.(type) { - default: - q.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.Gray: - q.transform_RGBA_Gray_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case *image.NRGBA: - q.transform_RGBA_NRGBA_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case *image.RGBA: - q.transform_RGBA_RGBA_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - q.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case image.YCbCrSubsampleRatio444: - q.transform_RGBA_YCbCr444_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case image.YCbCrSubsampleRatio422: - q.transform_RGBA_YCbCr422_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case image.YCbCrSubsampleRatio420: - q.transform_RGBA_YCbCr420_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case image.YCbCrSubsampleRatio440: - q.transform_RGBA_YCbCr440_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - default: - q.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - default: - switch src := src.(type) { - default: - q.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - } - } - } -} - -func (z *kernelScaler) scaleX_Gray(tmp [][4]float64, src *image.Gray, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - pru := uint32(src.Pix[pi]) * 0x101 - pr += float64(pru) * c.weight - } - pr *= s.invTotalWeightFFFF - tmp[t] = [4]float64{ - pr, - pr, - pr, - 1, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_NRGBA(tmp [][4]float64, src *image.NRGBA, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb, pa float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(c.coord)-src.Rect.Min.X)*4 - pau := uint32(src.Pix[pi+3]) * 0x101 - pru := uint32(src.Pix[pi+0]) * pau / 0xff - pgu := uint32(src.Pix[pi+1]) * pau / 0xff - pbu := uint32(src.Pix[pi+2]) * pau / 0xff - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - pa += float64(pau) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - pa * s.invTotalWeightFFFF, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_RGBA(tmp [][4]float64, src *image.RGBA, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb, pa float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(c.coord)-src.Rect.Min.X)*4 - pru := uint32(src.Pix[pi+0]) * 0x101 - pgu := uint32(src.Pix[pi+1]) * 0x101 - pbu := uint32(src.Pix[pi+2]) * 0x101 - pau := uint32(src.Pix[pi+3]) * 0x101 - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - pa += float64(pau) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - pa * s.invTotalWeightFFFF, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_YCbCr444(tmp [][4]float64, src *image.YCbCr, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - pj := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - 1, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_YCbCr422(tmp [][4]float64, src *image.YCbCr, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - pj := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(c.coord))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - 1, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_YCbCr420(tmp [][4]float64, src *image.YCbCr, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - pj := ((sr.Min.Y+int(y))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(c.coord))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - 1, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_YCbCr440(tmp [][4]float64, src *image.YCbCr, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - pj := ((sr.Min.Y+int(y))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - 1, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_Image(tmp [][4]float64, src image.Image, sr image.Rectangle, opts *Options) { - t := 0 - srcMask, smp := opts.SrcMask, opts.SrcMaskP - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb, pa float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pru, pgu, pbu, pau := src.At(sr.Min.X+int(c.coord), sr.Min.Y+int(y)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(c.coord), smp.Y+sr.Min.Y+int(y)).RGBA() - pru = pru * ma / 0xffff - pgu = pgu * ma / 0xffff - pbu = pbu * ma / 0xffff - pau = pau * ma / 0xffff - } - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - pa += float64(pau) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - pa * s.invTotalWeightFFFF, - } - t++ - } - } -} - -func (z *kernelScaler) scaleY_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, tmp [][4]float64, opts *Options) { - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - d := (dr.Min.Y+adr.Min.Y-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+int(dx)-dst.Rect.Min.X)*4 - for _, s := range z.vertical.sources[adr.Min.Y:adr.Max.Y] { - var pr, pg, pb, pa float64 - for _, c := range z.vertical.contribs[s.i:s.j] { - p := &tmp[c.coord*z.dw+dx] - pr += p[0] * c.weight - pg += p[1] * c.weight - pb += p[2] * c.weight - pa += p[3] * c.weight - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - pr0 := uint32(ftou(pr * s.invTotalWeight)) - pg0 := uint32(ftou(pg * s.invTotalWeight)) - pb0 := uint32(ftou(pb * s.invTotalWeight)) - pa0 := uint32(ftou(pa * s.invTotalWeight)) - pa1 := (0xffff - uint32(pa0)) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr0) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg0) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb0) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa0) >> 8) - d += dst.Stride - } - } -} - -func (z *kernelScaler) scaleY_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, tmp [][4]float64, opts *Options) { - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - d := (dr.Min.Y+adr.Min.Y-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+int(dx)-dst.Rect.Min.X)*4 - for _, s := range z.vertical.sources[adr.Min.Y:adr.Max.Y] { - var pr, pg, pb, pa float64 - for _, c := range z.vertical.contribs[s.i:s.j] { - p := &tmp[c.coord*z.dw+dx] - pr += p[0] * c.weight - pg += p[1] * c.weight - pb += p[2] * c.weight - pa += p[3] * c.weight - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - dst.Pix[d+0] = uint8(ftou(pr*s.invTotalWeight) >> 8) - dst.Pix[d+1] = uint8(ftou(pg*s.invTotalWeight) >> 8) - dst.Pix[d+2] = uint8(ftou(pb*s.invTotalWeight) >> 8) - dst.Pix[d+3] = uint8(ftou(pa*s.invTotalWeight) >> 8) - d += dst.Stride - } - } -} - -func (z *kernelScaler) scaleY_Image_Over(dst Image, dr, adr image.Rectangle, tmp [][4]float64, opts *Options) { - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - for dy, s := range z.vertical.sources[adr.Min.Y:adr.Max.Y] { - var pr, pg, pb, pa float64 - for _, c := range z.vertical.contribs[s.i:s.j] { - p := &tmp[c.coord*z.dw+dx] - pr += p[0] * c.weight - pg += p[1] * c.weight - pb += p[2] * c.weight - pa += p[3] * c.weight - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(adr.Min.Y+dy)).RGBA() - pr0 := uint32(ftou(pr * s.invTotalWeight)) - pg0 := uint32(ftou(pg * s.invTotalWeight)) - pb0 := uint32(ftou(pb * s.invTotalWeight)) - pa0 := uint32(ftou(pa * s.invTotalWeight)) - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(adr.Min.Y+dy)).RGBA() - pr0 = pr0 * ma / 0xffff - pg0 = pg0 * ma / 0xffff - pb0 = pb0 * ma / 0xffff - pa0 = pa0 * ma / 0xffff - } - pa1 := 0xffff - pa0 - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr0) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg0) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb0) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa0) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(adr.Min.Y+dy), dstColor) - } - } -} - -func (z *kernelScaler) scaleY_Image_Src(dst Image, dr, adr image.Rectangle, tmp [][4]float64, opts *Options) { - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - for dy, s := range z.vertical.sources[adr.Min.Y:adr.Max.Y] { - var pr, pg, pb, pa float64 - for _, c := range z.vertical.contribs[s.i:s.j] { - p := &tmp[c.coord*z.dw+dx] - pr += p[0] * c.weight - pg += p[1] * c.weight - pb += p[2] * c.weight - pa += p[3] * c.weight - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(adr.Min.Y+dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(adr.Min.Y+dy)).RGBA() - pr := uint32(ftou(pr*s.invTotalWeight)) * ma / 0xffff - pg := uint32(ftou(pg*s.invTotalWeight)) * ma / 0xffff - pb := uint32(ftou(pb*s.invTotalWeight)) * ma / 0xffff - pa := uint32(ftou(pa*s.invTotalWeight)) * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(adr.Min.Y+dy), dstColor) - } else { - dstColorRGBA64.R = ftou(pr * s.invTotalWeight) - dstColorRGBA64.G = ftou(pg * s.invTotalWeight) - dstColorRGBA64.B = ftou(pb * s.invTotalWeight) - dstColorRGBA64.A = ftou(pa * s.invTotalWeight) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(adr.Min.Y+dy), dstColor) - } - } - } -} - -func (q *Kernel) transform_RGBA_Gray_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.Gray, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.Stride + (kx - src.Rect.Min.X) - pru := uint32(src.Pix[pi]) * 0x101 - pr += float64(pru) * w - } - } - } - } - out := uint8(fffftou(pr) >> 8) - dst.Pix[d+0] = out - dst.Pix[d+1] = out - dst.Pix[d+2] = out - dst.Pix[d+3] = 0xff - } - } -} - -func (q *Kernel) transform_RGBA_NRGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.Stride + (kx-src.Rect.Min.X)*4 - pau := uint32(src.Pix[pi+3]) * 0x101 - pru := uint32(src.Pix[pi+0]) * pau / 0xff - pgu := uint32(src.Pix[pi+1]) * pau / 0xff - pbu := uint32(src.Pix[pi+2]) * pau / 0xff - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - pr0 := uint32(fffftou(pr)) - pg0 := uint32(fffftou(pg)) - pb0 := uint32(fffftou(pb)) - pa0 := uint32(fffftou(pa)) - pa1 := (0xffff - uint32(pa0)) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr0) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg0) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb0) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa0) >> 8) - } - } -} - -func (q *Kernel) transform_RGBA_NRGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.Stride + (kx-src.Rect.Min.X)*4 - pau := uint32(src.Pix[pi+3]) * 0x101 - pru := uint32(src.Pix[pi+0]) * pau / 0xff - pgu := uint32(src.Pix[pi+1]) * pau / 0xff - pbu := uint32(src.Pix[pi+2]) * pau / 0xff - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = uint8(fffftou(pa) >> 8) - } - } -} - -func (q *Kernel) transform_RGBA_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.Stride + (kx-src.Rect.Min.X)*4 - pru := uint32(src.Pix[pi+0]) * 0x101 - pgu := uint32(src.Pix[pi+1]) * 0x101 - pbu := uint32(src.Pix[pi+2]) * 0x101 - pau := uint32(src.Pix[pi+3]) * 0x101 - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - pr0 := uint32(fffftou(pr)) - pg0 := uint32(fffftou(pg)) - pb0 := uint32(fffftou(pb)) - pa0 := uint32(fffftou(pa)) - pa1 := (0xffff - uint32(pa0)) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr0) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg0) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb0) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa0) >> 8) - } - } -} - -func (q *Kernel) transform_RGBA_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.Stride + (kx-src.Rect.Min.X)*4 - pru := uint32(src.Pix[pi+0]) * 0x101 - pgu := uint32(src.Pix[pi+1]) * 0x101 - pbu := uint32(src.Pix[pi+2]) * 0x101 - pau := uint32(src.Pix[pi+3]) * 0x101 - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = uint8(fffftou(pa) >> 8) - } - } -} - -func (q *Kernel) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X) - pj := (ky-src.Rect.Min.Y)*src.CStride + (kx - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - } - } - } - } - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (q *Kernel) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X) - pj := (ky-src.Rect.Min.Y)*src.CStride + ((kx)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - } - } - } - } - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (q *Kernel) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X) - pj := ((ky)/2-src.Rect.Min.Y/2)*src.CStride + ((kx)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - } - } - } - } - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (q *Kernel) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X) - pj := ((ky)/2-src.Rect.Min.Y/2)*src.CStride + (kx - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - } - } - } - } - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (q *Kernel) transform_RGBA_Image_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pru, pgu, pbu, pau := src.At(kx, ky).RGBA() - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - pr0 := uint32(fffftou(pr)) - pg0 := uint32(fffftou(pg)) - pb0 := uint32(fffftou(pb)) - pa0 := uint32(fffftou(pa)) - pa1 := (0xffff - uint32(pa0)) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr0) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg0) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb0) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa0) >> 8) - } - } -} - -func (q *Kernel) transform_RGBA_Image_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pru, pgu, pbu, pau := src.At(kx, ky).RGBA() - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = uint8(fffftou(pa) >> 8) - } - } -} - -func (q *Kernel) transform_Image_Image_Over(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pru, pgu, pbu, pau := src.At(kx, ky).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+kx, smp.Y+ky).RGBA() - pru = pru * ma / 0xffff - pgu = pgu * ma / 0xffff - pbu = pbu * ma / 0xffff - pau = pau * ma / 0xffff - } - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - pr0 := uint32(fffftou(pr)) - pg0 := uint32(fffftou(pg)) - pb0 := uint32(fffftou(pb)) - pa0 := uint32(fffftou(pa)) - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr0 = pr0 * ma / 0xffff - pg0 = pg0 * ma / 0xffff - pb0 = pb0 * ma / 0xffff - pa0 = pa0 * ma / 0xffff - } - pa1 := 0xffff - pa0 - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr0) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg0) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb0) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa0) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } -} - -func (q *Kernel) transform_Image_Image_Src(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pru, pgu, pbu, pau := src.At(kx, ky).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+kx, smp.Y+ky).RGBA() - pru = pru * ma / 0xffff - pgu = pgu * ma / 0xffff - pbu = pbu * ma / 0xffff - pau = pau * ma / 0xffff - } - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr := uint32(fffftou(pr)) * ma / 0xffff - pg := uint32(fffftou(pg)) * ma / 0xffff - pb := uint32(fffftou(pb)) * ma / 0xffff - pa := uint32(fffftou(pa)) * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } else { - dstColorRGBA64.R = fffftou(pr) - dstColorRGBA64.G = fffftou(pg) - dstColorRGBA64.B = fffftou(pb) - dstColorRGBA64.A = fffftou(pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } -} diff --git a/vendor/golang.org/x/image/draw/scale.go b/vendor/golang.org/x/image/draw/scale.go deleted file mode 100644 index 98ab404..0000000 --- a/vendor/golang.org/x/image/draw/scale.go +++ /dev/null @@ -1,527 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go - -package draw - -import ( - "image" - "image/color" - "math" - "sync" - - "golang.org/x/image/math/f64" -) - -// Copy copies the part of the source image defined by src and sr and writes -// the result of a Porter-Duff composition to the part of the destination image -// defined by dst and the translation of sr so that sr.Min translates to dp. -func Copy(dst Image, dp image.Point, src image.Image, sr image.Rectangle, op Op, opts *Options) { - var o Options - if opts != nil { - o = *opts - } - dr := sr.Add(dp.Sub(sr.Min)) - if o.DstMask == nil { - DrawMask(dst, dr, src, sr.Min, o.SrcMask, o.SrcMaskP.Add(sr.Min), op) - } else { - NearestNeighbor.Scale(dst, dr, src, sr, op, opts) - } -} - -// Scaler scales the part of the source image defined by src and sr and writes -// the result of a Porter-Duff composition to the part of the destination image -// defined by dst and dr. -// -// A Scaler is safe to use concurrently. -type Scaler interface { - Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) -} - -// Transformer transforms the part of the source image defined by src and sr -// and writes the result of a Porter-Duff composition to the part of the -// destination image defined by dst and the affine transform m applied to sr. -// -// For example, if m is the matrix -// -// m00 m01 m02 -// m10 m11 m12 -// -// then the src-space point (sx, sy) maps to the dst-space point -// (m00*sx + m01*sy + m02, m10*sx + m11*sy + m12). -// -// A Transformer is safe to use concurrently. -type Transformer interface { - Transform(dst Image, m f64.Aff3, src image.Image, sr image.Rectangle, op Op, opts *Options) -} - -// Options are optional parameters to Copy, Scale and Transform. -// -// A nil *Options means to use the default (zero) values of each field. -type Options struct { - // Masks limit what parts of the dst image are drawn to and what parts of - // the src image are drawn from. - // - // A dst or src mask image having a zero alpha (transparent) pixel value in - // the respective coordinate space means that that dst pixel is entirely - // unaffected or that src pixel is considered transparent black. A full - // alpha (opaque) value means that the dst pixel is maximally affected or - // the src pixel contributes maximally. The default values, nil, are - // equivalent to fully opaque, infinitely large mask images. - // - // The DstMask is otherwise known as a clip mask, and its pixels map 1:1 to - // the dst image's pixels. DstMaskP in DstMask space corresponds to - // image.Point{X:0, Y:0} in dst space. For example, when limiting - // repainting to a 'dirty rectangle', use that image.Rectangle and a zero - // image.Point as the DstMask and DstMaskP. - // - // The SrcMask's pixels map 1:1 to the src image's pixels. SrcMaskP in - // SrcMask space corresponds to image.Point{X:0, Y:0} in src space. For - // example, when drawing font glyphs in a uniform color, use an - // *image.Uniform as the src, and use the glyph atlas image and the - // per-glyph offset as SrcMask and SrcMaskP: - // Copy(dst, dp, image.NewUniform(color), image.Rect(0, 0, glyphWidth, glyphHeight), &Options{ - // SrcMask: glyphAtlas, - // SrcMaskP: glyphOffset, - // }) - DstMask image.Image - DstMaskP image.Point - SrcMask image.Image - SrcMaskP image.Point - - // TODO: a smooth vs sharp edges option, for arbitrary rotations? -} - -// Interpolator is an interpolation algorithm, when dst and src pixels don't -// have a 1:1 correspondence. -// -// Of the interpolators provided by this package: -// - NearestNeighbor is fast but usually looks worst. -// - CatmullRom is slow but usually looks best. -// - ApproxBiLinear has reasonable speed and quality. -// -// The time taken depends on the size of dr. For kernel interpolators, the -// speed also depends on the size of sr, and so are often slower than -// non-kernel interpolators, especially when scaling down. -type Interpolator interface { - Scaler - Transformer -} - -// Kernel is an interpolator that blends source pixels weighted by a symmetric -// kernel function. -type Kernel struct { - // Support is the kernel support and must be >= 0. At(t) is assumed to be - // zero when t >= Support. - Support float64 - // At is the kernel function. It will only be called with t in the - // range [0, Support). - At func(t float64) float64 -} - -// Scale implements the Scaler interface. -func (q *Kernel) Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) { - q.newScaler(dr.Dx(), dr.Dy(), sr.Dx(), sr.Dy(), false).Scale(dst, dr, src, sr, op, opts) -} - -// NewScaler returns a Scaler that is optimized for scaling multiple times with -// the same fixed destination and source width and height. -func (q *Kernel) NewScaler(dw, dh, sw, sh int) Scaler { - return q.newScaler(dw, dh, sw, sh, true) -} - -func (q *Kernel) newScaler(dw, dh, sw, sh int, usePool bool) Scaler { - z := &kernelScaler{ - kernel: q, - dw: int32(dw), - dh: int32(dh), - sw: int32(sw), - sh: int32(sh), - horizontal: newDistrib(q, int32(dw), int32(sw)), - vertical: newDistrib(q, int32(dh), int32(sh)), - } - if usePool { - z.pool.New = func() interface{} { - tmp := z.makeTmpBuf() - return &tmp - } - } - return z -} - -var ( - // NearestNeighbor is the nearest neighbor interpolator. It is very fast, - // but usually gives very low quality results. When scaling up, the result - // will look 'blocky'. - NearestNeighbor = Interpolator(nnInterpolator{}) - - // ApproxBiLinear is a mixture of the nearest neighbor and bi-linear - // interpolators. It is fast, but usually gives medium quality results. - // - // It implements bi-linear interpolation when upscaling and a bi-linear - // blend of the 4 nearest neighbor pixels when downscaling. This yields - // nicer quality than nearest neighbor interpolation when upscaling, but - // the time taken is independent of the number of source pixels, unlike the - // bi-linear interpolator. When downscaling a large image, the performance - // difference can be significant. - ApproxBiLinear = Interpolator(ablInterpolator{}) - - // BiLinear is the tent kernel. It is slow, but usually gives high quality - // results. - BiLinear = &Kernel{1, func(t float64) float64 { - return 1 - t - }} - - // CatmullRom is the Catmull-Rom kernel. It is very slow, but usually gives - // very high quality results. - // - // It is an instance of the more general cubic BC-spline kernel with parameters - // B=0 and C=0.5. See Mitchell and Netravali, "Reconstruction Filters in - // Computer Graphics", Computer Graphics, Vol. 22, No. 4, pp. 221-228. - CatmullRom = &Kernel{2, func(t float64) float64 { - if t < 1 { - return (1.5*t-2.5)*t*t + 1 - } - return ((-0.5*t+2.5)*t-4)*t + 2 - }} - - // TODO: a Kaiser-Bessel kernel? -) - -type nnInterpolator struct{} - -type ablInterpolator struct{} - -type kernelScaler struct { - kernel *Kernel - dw, dh, sw, sh int32 - horizontal, vertical distrib - pool sync.Pool -} - -func (z *kernelScaler) makeTmpBuf() [][4]float64 { - return make([][4]float64, z.dw*z.sh) -} - -// source is a range of contribs, their inverse total weight, and that ITW -// divided by 0xffff. -type source struct { - i, j int32 - invTotalWeight float64 - invTotalWeightFFFF float64 -} - -// contrib is the weight of a column or row. -type contrib struct { - coord int32 - weight float64 -} - -// distrib measures how source pixels are distributed over destination pixels. -type distrib struct { - // sources are what contribs each column or row in the source image owns, - // and the total weight of those contribs. - sources []source - // contribs are the contributions indexed by sources[s].i and sources[s].j. - contribs []contrib -} - -// newDistrib returns a distrib that distributes sw source columns (or rows) -// over dw destination columns (or rows). -func newDistrib(q *Kernel, dw, sw int32) distrib { - scale := float64(sw) / float64(dw) - halfWidth, kernelArgScale := q.Support, 1.0 - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - if scale > 1 { - halfWidth *= scale - kernelArgScale = 1 / scale - } - - // Make the sources slice, one source for each column or row, and temporarily - // appropriate its elements' fields so that invTotalWeight is the scaled - // coordinate of the source column or row, and i and j are the lower and - // upper bounds of the range of destination columns or rows affected by the - // source column or row. - n, sources := int32(0), make([]source, dw) - for x := range sources { - center := (float64(x)+0.5)*scale - 0.5 - i := int32(math.Floor(center - halfWidth)) - if i < 0 { - i = 0 - } - j := int32(math.Ceil(center + halfWidth)) - if j > sw { - j = sw - if j < i { - j = i - } - } - sources[x] = source{i: i, j: j, invTotalWeight: center} - n += j - i - } - - contribs := make([]contrib, 0, n) - for k, b := range sources { - totalWeight := 0.0 - l := int32(len(contribs)) - for coord := b.i; coord < b.j; coord++ { - t := abs((b.invTotalWeight - float64(coord)) * kernelArgScale) - if t >= q.Support { - continue - } - weight := q.At(t) - if weight == 0 { - continue - } - totalWeight += weight - contribs = append(contribs, contrib{coord, weight}) - } - totalWeight = 1 / totalWeight - sources[k] = source{ - i: l, - j: int32(len(contribs)), - invTotalWeight: totalWeight, - invTotalWeightFFFF: totalWeight / 0xffff, - } - } - - return distrib{sources, contribs} -} - -// abs is like math.Abs, but it doesn't care about negative zero, infinities or -// NaNs. -func abs(f float64) float64 { - if f < 0 { - f = -f - } - return f -} - -// ftou converts the range [0.0, 1.0] to [0, 0xffff]. -func ftou(f float64) uint16 { - i := int32(0xffff*f + 0.5) - if i > 0xffff { - return 0xffff - } - if i > 0 { - return uint16(i) - } - return 0 -} - -// fffftou converts the range [0.0, 65535.0] to [0, 0xffff]. -func fffftou(f float64) uint16 { - i := int32(f + 0.5) - if i > 0xffff { - return 0xffff - } - if i > 0 { - return uint16(i) - } - return 0 -} - -// invert returns the inverse of m. -// -// TODO: move this into the f64 package, once we work out the convention for -// matrix methods in that package: do they modify the receiver, take a dst -// pointer argument, or return a new value? -func invert(m *f64.Aff3) f64.Aff3 { - m00 := +m[3*1+1] - m01 := -m[3*0+1] - m02 := +m[3*1+2]*m[3*0+1] - m[3*1+1]*m[3*0+2] - m10 := -m[3*1+0] - m11 := +m[3*0+0] - m12 := +m[3*1+0]*m[3*0+2] - m[3*1+2]*m[3*0+0] - - det := m00*m11 - m10*m01 - - return f64.Aff3{ - m00 / det, - m01 / det, - m02 / det, - m10 / det, - m11 / det, - m12 / det, - } -} - -func matMul(p, q *f64.Aff3) f64.Aff3 { - return f64.Aff3{ - p[3*0+0]*q[3*0+0] + p[3*0+1]*q[3*1+0], - p[3*0+0]*q[3*0+1] + p[3*0+1]*q[3*1+1], - p[3*0+0]*q[3*0+2] + p[3*0+1]*q[3*1+2] + p[3*0+2], - p[3*1+0]*q[3*0+0] + p[3*1+1]*q[3*1+0], - p[3*1+0]*q[3*0+1] + p[3*1+1]*q[3*1+1], - p[3*1+0]*q[3*0+2] + p[3*1+1]*q[3*1+2] + p[3*1+2], - } -} - -// transformRect returns a rectangle dr that contains sr transformed by s2d. -func transformRect(s2d *f64.Aff3, sr *image.Rectangle) (dr image.Rectangle) { - ps := [...]image.Point{ - {sr.Min.X, sr.Min.Y}, - {sr.Max.X, sr.Min.Y}, - {sr.Min.X, sr.Max.Y}, - {sr.Max.X, sr.Max.Y}, - } - for i, p := range ps { - sxf := float64(p.X) - syf := float64(p.Y) - dx := int(math.Floor(s2d[0]*sxf + s2d[1]*syf + s2d[2])) - dy := int(math.Floor(s2d[3]*sxf + s2d[4]*syf + s2d[5])) - - // The +1 adjustments below are because an image.Rectangle is inclusive - // on the low end but exclusive on the high end. - - if i == 0 { - dr = image.Rectangle{ - Min: image.Point{dx + 0, dy + 0}, - Max: image.Point{dx + 1, dy + 1}, - } - continue - } - - if dr.Min.X > dx { - dr.Min.X = dx - } - dx++ - if dr.Max.X < dx { - dr.Max.X = dx - } - - if dr.Min.Y > dy { - dr.Min.Y = dy - } - dy++ - if dr.Max.Y < dy { - dr.Max.Y = dy - } - } - return dr -} - -func clipAffectedDestRect(adr image.Rectangle, dstMask image.Image, dstMaskP image.Point) (image.Rectangle, image.Image) { - if dstMask == nil { - return adr, nil - } - // TODO: enable this fast path once Go 1.5 is released, where an - // image.Rectangle implements image.Image. - // if r, ok := dstMask.(image.Rectangle); ok { - // return adr.Intersect(r.Sub(dstMaskP)), nil - // } - // TODO: clip to dstMask.Bounds() if the color model implies that out-of-bounds means 0 alpha? - return adr, dstMask -} - -func transform_Uniform(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.Uniform, sr image.Rectangle, bias image.Point, op Op) { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - pr, pg, pb, pa := src.C.RGBA() - pa1 := (0xffff - pa) * 0x101 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := dst.PixOffset(dr.Min.X+adr.Min.X, dr.Min.Y+int(dy)) - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } - - default: - pr, pg, pb, pa := src.C.RGBA() - pa1 := 0xffff - pa - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } - - case Src: - switch dst := dst.(type) { - case *image.RGBA: - pr, pg, pb, pa := src.C.RGBA() - pr8 := uint8(pr >> 8) - pg8 := uint8(pg >> 8) - pb8 := uint8(pb >> 8) - pa8 := uint8(pa >> 8) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := dst.PixOffset(dr.Min.X+adr.Min.X, dr.Min.Y+int(dy)) - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - dst.Pix[d+0] = pr8 - dst.Pix[d+1] = pg8 - dst.Pix[d+2] = pb8 - dst.Pix[d+3] = pa8 - } - } - - default: - pr, pg, pb, pa := src.C.RGBA() - dstColorRGBA64 := &color.RGBA64{ - uint16(pr), - uint16(pg), - uint16(pb), - uint16(pa), - } - dstColor := color.Color(dstColorRGBA64) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } - } -} - -func opaque(m image.Image) bool { - o, ok := m.(interface { - Opaque() bool - }) - return ok && o.Opaque() -} diff --git a/vendor/golang.org/x/image/draw/scale_test.go b/vendor/golang.org/x/image/draw/scale_test.go deleted file mode 100644 index ea41940..0000000 --- a/vendor/golang.org/x/image/draw/scale_test.go +++ /dev/null @@ -1,742 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package draw - -import ( - "bytes" - "flag" - "fmt" - "image" - "image/color" - "image/png" - "math/rand" - "os" - "reflect" - "testing" - - "golang.org/x/image/math/f64" - - _ "image/jpeg" -) - -var genGoldenFiles = flag.Bool("gen_golden_files", false, "whether to generate the TestXxx golden files.") - -var transformMatrix = func(scale, tx, ty float64) f64.Aff3 { - const cos30, sin30 = 0.866025404, 0.5 - return f64.Aff3{ - +scale * cos30, -scale * sin30, tx, - +scale * sin30, +scale * cos30, ty, - } -} - -func encode(filename string, m image.Image) error { - f, err := os.Create(filename) - if err != nil { - return fmt.Errorf("Create: %v", err) - } - defer f.Close() - if err := png.Encode(f, m); err != nil { - return fmt.Errorf("Encode: %v", err) - } - return nil -} - -// testInterp tests that interpolating the source image gives the exact -// destination image. This is to ensure that any refactoring or optimization of -// the interpolation code doesn't change the behavior. Changing the actual -// algorithm or kernel used by any particular quality setting will obviously -// change the resultant pixels. In such a case, use the gen_golden_files flag -// to regenerate the golden files. -func testInterp(t *testing.T, w int, h int, direction, prefix, suffix string) { - f, err := os.Open("../testdata/" + prefix + suffix) - if err != nil { - t.Fatalf("Open: %v", err) - } - defer f.Close() - src, _, err := image.Decode(f) - if err != nil { - t.Fatalf("Decode: %v", err) - } - - op, scale := Src, 3.75 - if prefix == "tux" { - op, scale = Over, 0.125 - } - green := image.NewUniform(color.RGBA{0x00, 0x22, 0x11, 0xff}) - - testCases := map[string]Interpolator{ - "nn": NearestNeighbor, - "ab": ApproxBiLinear, - "bl": BiLinear, - "cr": CatmullRom, - } - for name, q := range testCases { - goldenFilename := fmt.Sprintf("../testdata/%s-%s-%s.png", prefix, direction, name) - - got := image.NewRGBA(image.Rect(0, 0, w, h)) - Copy(got, image.Point{}, green, got.Bounds(), Src, nil) - if direction == "rotate" { - q.Transform(got, transformMatrix(scale, 40, 10), src, src.Bounds(), op, nil) - } else { - q.Scale(got, got.Bounds(), src, src.Bounds(), op, nil) - } - - if *genGoldenFiles { - if err := encode(goldenFilename, got); err != nil { - t.Error(err) - } - continue - } - - g, err := os.Open(goldenFilename) - if err != nil { - t.Errorf("Open: %v", err) - continue - } - defer g.Close() - wantRaw, err := png.Decode(g) - if err != nil { - t.Errorf("Decode: %v", err) - continue - } - // convert wantRaw to RGBA. - want, ok := wantRaw.(*image.RGBA) - if !ok { - b := wantRaw.Bounds() - want = image.NewRGBA(b) - Draw(want, b, wantRaw, b.Min, Src) - } - - if !reflect.DeepEqual(got, want) { - t.Errorf("%s: actual image differs from golden image", goldenFilename) - continue - } - } -} - -func TestScaleDown(t *testing.T) { testInterp(t, 100, 100, "down", "go-turns-two", "-280x360.jpeg") } -func TestScaleUp(t *testing.T) { testInterp(t, 75, 100, "up", "go-turns-two", "-14x18.png") } -func TestTformSrc(t *testing.T) { testInterp(t, 100, 100, "rotate", "go-turns-two", "-14x18.png") } -func TestTformOver(t *testing.T) { testInterp(t, 100, 100, "rotate", "tux", ".png") } - -// TestSimpleTransforms tests Scale and Transform calls that simplify to Copy -// or Scale calls. -func TestSimpleTransforms(t *testing.T) { - f, err := os.Open("../testdata/testpattern.png") // A 100x100 image. - if err != nil { - t.Fatalf("Open: %v", err) - } - defer f.Close() - src, _, err := image.Decode(f) - if err != nil { - t.Fatalf("Decode: %v", err) - } - - dst0 := image.NewRGBA(image.Rect(0, 0, 120, 150)) - dst1 := image.NewRGBA(image.Rect(0, 0, 120, 150)) - for _, op := range []string{"scale/copy", "tform/copy", "tform/scale"} { - for _, epsilon := range []float64{0, 1e-50, 1e-1} { - Copy(dst0, image.Point{}, image.Transparent, dst0.Bounds(), Src, nil) - Copy(dst1, image.Point{}, image.Transparent, dst1.Bounds(), Src, nil) - - switch op { - case "scale/copy": - dr := image.Rect(10, 30, 10+100, 30+100) - if epsilon > 1e-10 { - dr.Max.X++ - } - Copy(dst0, image.Point{10, 30}, src, src.Bounds(), Src, nil) - ApproxBiLinear.Scale(dst1, dr, src, src.Bounds(), Src, nil) - case "tform/copy": - Copy(dst0, image.Point{10, 30}, src, src.Bounds(), Src, nil) - ApproxBiLinear.Transform(dst1, f64.Aff3{ - 1, 0 + epsilon, 10, - 0, 1, 30, - }, src, src.Bounds(), Src, nil) - case "tform/scale": - ApproxBiLinear.Scale(dst0, image.Rect(10, 50, 10+50, 50+50), src, src.Bounds(), Src, nil) - ApproxBiLinear.Transform(dst1, f64.Aff3{ - 0.5, 0.0 + epsilon, 10, - 0.0, 0.5, 50, - }, src, src.Bounds(), Src, nil) - } - - differ := !bytes.Equal(dst0.Pix, dst1.Pix) - if epsilon > 1e-10 { - if !differ { - t.Errorf("%s yielded same pixels, want different pixels: epsilon=%v", op, epsilon) - } - } else { - if differ { - t.Errorf("%s yielded different pixels, want same pixels: epsilon=%v", op, epsilon) - } - } - } - } -} - -func BenchmarkSimpleScaleCopy(b *testing.B) { - dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) - src := image.NewRGBA(image.Rect(0, 0, 400, 300)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - ApproxBiLinear.Scale(dst, image.Rect(10, 20, 10+400, 20+300), src, src.Bounds(), Src, nil) - } -} - -func BenchmarkSimpleTransformCopy(b *testing.B) { - dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) - src := image.NewRGBA(image.Rect(0, 0, 400, 300)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - ApproxBiLinear.Transform(dst, f64.Aff3{ - 1, 0, 10, - 0, 1, 20, - }, src, src.Bounds(), Src, nil) - } -} - -func BenchmarkSimpleTransformScale(b *testing.B) { - dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) - src := image.NewRGBA(image.Rect(0, 0, 400, 300)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - ApproxBiLinear.Transform(dst, f64.Aff3{ - 0.5, 0.0, 10, - 0.0, 0.5, 20, - }, src, src.Bounds(), Src, nil) - } -} - -func TestOps(t *testing.T) { - blue := image.NewUniform(color.RGBA{0x00, 0x00, 0xff, 0xff}) - testCases := map[Op]color.RGBA{ - Over: color.RGBA{0x7f, 0x00, 0x80, 0xff}, - Src: color.RGBA{0x7f, 0x00, 0x00, 0x7f}, - } - for op, want := range testCases { - dst := image.NewRGBA(image.Rect(0, 0, 2, 2)) - Copy(dst, image.Point{}, blue, dst.Bounds(), Src, nil) - - src := image.NewRGBA(image.Rect(0, 0, 1, 1)) - src.SetRGBA(0, 0, color.RGBA{0x7f, 0x00, 0x00, 0x7f}) - - NearestNeighbor.Scale(dst, dst.Bounds(), src, src.Bounds(), op, nil) - - if got := dst.RGBAAt(0, 0); got != want { - t.Errorf("op=%v: got %v, want %v", op, got, want) - } - } -} - -// TestNegativeWeights tests that scaling by a kernel that produces negative -// weights, such as the Catmull-Rom kernel, doesn't produce an invalid color -// according to Go's alpha-premultiplied model. -func TestNegativeWeights(t *testing.T) { - check := func(m *image.RGBA) error { - b := m.Bounds() - for y := b.Min.Y; y < b.Max.Y; y++ { - for x := b.Min.X; x < b.Max.X; x++ { - if c := m.RGBAAt(x, y); c.R > c.A || c.G > c.A || c.B > c.A { - return fmt.Errorf("invalid color.RGBA at (%d, %d): %v", x, y, c) - } - } - } - return nil - } - - src := image.NewRGBA(image.Rect(0, 0, 16, 16)) - for y := 0; y < 16; y++ { - for x := 0; x < 16; x++ { - a := y * 0x11 - src.Set(x, y, color.RGBA{ - R: uint8(x * 0x11 * a / 0xff), - A: uint8(a), - }) - } - } - if err := check(src); err != nil { - t.Fatalf("src image: %v", err) - } - - dst := image.NewRGBA(image.Rect(0, 0, 32, 32)) - CatmullRom.Scale(dst, dst.Bounds(), src, src.Bounds(), Over, nil) - if err := check(dst); err != nil { - t.Fatalf("dst image: %v", err) - } -} - -func fillPix(r *rand.Rand, pixs ...[]byte) { - for _, pix := range pixs { - for i := range pix { - pix[i] = uint8(r.Intn(256)) - } - } -} - -func TestInterpClipCommute(t *testing.T) { - src := image.NewNRGBA(image.Rect(0, 0, 20, 20)) - fillPix(rand.New(rand.NewSource(0)), src.Pix) - - outer := image.Rect(1, 1, 8, 5) - inner := image.Rect(2, 3, 6, 5) - qs := []Interpolator{ - NearestNeighbor, - ApproxBiLinear, - CatmullRom, - } - for _, transform := range []bool{false, true} { - for _, q := range qs { - dst0 := image.NewRGBA(image.Rect(1, 1, 10, 10)) - dst1 := image.NewRGBA(image.Rect(1, 1, 10, 10)) - for i := range dst0.Pix { - dst0.Pix[i] = uint8(i / 4) - dst1.Pix[i] = uint8(i / 4) - } - - var interp func(dst *image.RGBA) - if transform { - interp = func(dst *image.RGBA) { - q.Transform(dst, transformMatrix(3.75, 2, 1), src, src.Bounds(), Over, nil) - } - } else { - interp = func(dst *image.RGBA) { - q.Scale(dst, outer, src, src.Bounds(), Over, nil) - } - } - - // Interpolate then clip. - interp(dst0) - dst0 = dst0.SubImage(inner).(*image.RGBA) - - // Clip then interpolate. - dst1 = dst1.SubImage(inner).(*image.RGBA) - interp(dst1) - - loop: - for y := inner.Min.Y; y < inner.Max.Y; y++ { - for x := inner.Min.X; x < inner.Max.X; x++ { - if c0, c1 := dst0.RGBAAt(x, y), dst1.RGBAAt(x, y); c0 != c1 { - t.Errorf("q=%T: at (%d, %d): c0=%v, c1=%v", q, x, y, c0, c1) - break loop - } - } - } - } - } -} - -// translatedImage is an image m translated by t. -type translatedImage struct { - m image.Image - t image.Point -} - -func (t *translatedImage) At(x, y int) color.Color { return t.m.At(x-t.t.X, y-t.t.Y) } -func (t *translatedImage) Bounds() image.Rectangle { return t.m.Bounds().Add(t.t) } -func (t *translatedImage) ColorModel() color.Model { return t.m.ColorModel() } - -// TestSrcTranslationInvariance tests that Scale and Transform are invariant -// under src translations. Specifically, when some source pixels are not in the -// bottom-right quadrant of src coordinate space, we consistently round down, -// not round towards zero. -func TestSrcTranslationInvariance(t *testing.T) { - f, err := os.Open("../testdata/testpattern.png") - if err != nil { - t.Fatalf("Open: %v", err) - } - defer f.Close() - src, _, err := image.Decode(f) - if err != nil { - t.Fatalf("Decode: %v", err) - } - sr := image.Rect(2, 3, 16, 12) - if !sr.In(src.Bounds()) { - t.Fatalf("src bounds too small: got %v", src.Bounds()) - } - qs := []Interpolator{ - NearestNeighbor, - ApproxBiLinear, - CatmullRom, - } - deltas := []image.Point{ - {+0, +0}, - {+0, +5}, - {+0, -5}, - {+5, +0}, - {-5, +0}, - {+8, +8}, - {+8, -8}, - {-8, +8}, - {-8, -8}, - } - m00 := transformMatrix(3.75, 0, 0) - - for _, transform := range []bool{false, true} { - for _, q := range qs { - want := image.NewRGBA(image.Rect(0, 0, 20, 20)) - if transform { - q.Transform(want, m00, src, sr, Over, nil) - } else { - q.Scale(want, want.Bounds(), src, sr, Over, nil) - } - for _, delta := range deltas { - tsrc := &translatedImage{src, delta} - got := image.NewRGBA(image.Rect(0, 0, 20, 20)) - if transform { - m := matMul(&m00, &f64.Aff3{ - 1, 0, -float64(delta.X), - 0, 1, -float64(delta.Y), - }) - q.Transform(got, m, tsrc, sr.Add(delta), Over, nil) - } else { - q.Scale(got, got.Bounds(), tsrc, sr.Add(delta), Over, nil) - } - if !bytes.Equal(got.Pix, want.Pix) { - t.Errorf("pix differ for delta=%v, transform=%t, q=%T", delta, transform, q) - } - } - } - } -} - -func TestSrcMask(t *testing.T) { - srcMask := image.NewRGBA(image.Rect(0, 0, 23, 1)) - srcMask.SetRGBA(19, 0, color.RGBA{0x00, 0x00, 0x00, 0x7f}) - srcMask.SetRGBA(20, 0, color.RGBA{0x00, 0x00, 0x00, 0xff}) - srcMask.SetRGBA(21, 0, color.RGBA{0x00, 0x00, 0x00, 0x3f}) - srcMask.SetRGBA(22, 0, color.RGBA{0x00, 0x00, 0x00, 0x00}) - red := image.NewUniform(color.RGBA{0xff, 0x00, 0x00, 0xff}) - blue := image.NewUniform(color.RGBA{0x00, 0x00, 0xff, 0xff}) - dst := image.NewRGBA(image.Rect(0, 0, 6, 1)) - Copy(dst, image.Point{}, blue, dst.Bounds(), Src, nil) - NearestNeighbor.Scale(dst, dst.Bounds(), red, image.Rect(0, 0, 3, 1), Over, &Options{ - SrcMask: srcMask, - SrcMaskP: image.Point{20, 0}, - }) - got := [6]color.RGBA{ - dst.RGBAAt(0, 0), - dst.RGBAAt(1, 0), - dst.RGBAAt(2, 0), - dst.RGBAAt(3, 0), - dst.RGBAAt(4, 0), - dst.RGBAAt(5, 0), - } - want := [6]color.RGBA{ - {0xff, 0x00, 0x00, 0xff}, - {0xff, 0x00, 0x00, 0xff}, - {0x3f, 0x00, 0xc0, 0xff}, - {0x3f, 0x00, 0xc0, 0xff}, - {0x00, 0x00, 0xff, 0xff}, - {0x00, 0x00, 0xff, 0xff}, - } - if got != want { - t.Errorf("\ngot %v\nwant %v", got, want) - } -} - -func TestDstMask(t *testing.T) { - dstMask := image.NewRGBA(image.Rect(0, 0, 23, 1)) - dstMask.SetRGBA(19, 0, color.RGBA{0x00, 0x00, 0x00, 0x7f}) - dstMask.SetRGBA(20, 0, color.RGBA{0x00, 0x00, 0x00, 0xff}) - dstMask.SetRGBA(21, 0, color.RGBA{0x00, 0x00, 0x00, 0x3f}) - dstMask.SetRGBA(22, 0, color.RGBA{0x00, 0x00, 0x00, 0x00}) - red := image.NewRGBA(image.Rect(0, 0, 1, 1)) - red.SetRGBA(0, 0, color.RGBA{0xff, 0x00, 0x00, 0xff}) - blue := image.NewUniform(color.RGBA{0x00, 0x00, 0xff, 0xff}) - qs := []Interpolator{ - NearestNeighbor, - ApproxBiLinear, - CatmullRom, - } - for _, q := range qs { - dst := image.NewRGBA(image.Rect(0, 0, 3, 1)) - Copy(dst, image.Point{}, blue, dst.Bounds(), Src, nil) - q.Scale(dst, dst.Bounds(), red, red.Bounds(), Over, &Options{ - DstMask: dstMask, - DstMaskP: image.Point{20, 0}, - }) - got := [3]color.RGBA{ - dst.RGBAAt(0, 0), - dst.RGBAAt(1, 0), - dst.RGBAAt(2, 0), - } - want := [3]color.RGBA{ - {0xff, 0x00, 0x00, 0xff}, - {0x3f, 0x00, 0xc0, 0xff}, - {0x00, 0x00, 0xff, 0xff}, - } - if got != want { - t.Errorf("q=%T:\ngot %v\nwant %v", q, got, want) - } - } -} - -func TestRectDstMask(t *testing.T) { - f, err := os.Open("../testdata/testpattern.png") - if err != nil { - t.Fatalf("Open: %v", err) - } - defer f.Close() - src, _, err := image.Decode(f) - if err != nil { - t.Fatalf("Decode: %v", err) - } - m00 := transformMatrix(1, 0, 0) - - bounds := image.Rect(0, 0, 50, 50) - dstOutside := image.NewRGBA(bounds) - for y := bounds.Min.Y; y < bounds.Max.Y; y++ { - for x := bounds.Min.X; x < bounds.Max.X; x++ { - dstOutside.SetRGBA(x, y, color.RGBA{uint8(5 * x), uint8(5 * y), 0x00, 0xff}) - } - } - - mk := func(q Transformer, dstMask image.Image, dstMaskP image.Point) *image.RGBA { - m := image.NewRGBA(bounds) - Copy(m, bounds.Min, dstOutside, bounds, Src, nil) - q.Transform(m, m00, src, src.Bounds(), Over, &Options{ - DstMask: dstMask, - DstMaskP: dstMaskP, - }) - return m - } - - qs := []Interpolator{ - NearestNeighbor, - ApproxBiLinear, - CatmullRom, - } - dstMaskPs := []image.Point{ - {0, 0}, - {5, 7}, - {-3, 0}, - } - rect := image.Rect(10, 10, 30, 40) - for _, q := range qs { - for _, dstMaskP := range dstMaskPs { - dstInside := mk(q, nil, image.Point{}) - for _, wrap := range []bool{false, true} { - // TODO: replace "rectImage(rect)" with "rect" once Go 1.5 is - // released, where an image.Rectangle implements image.Image. - dstMask := image.Image(rectImage(rect)) - if wrap { - dstMask = srcWrapper{dstMask} - } - dst := mk(q, dstMask, dstMaskP) - - nError := 0 - loop: - for y := bounds.Min.Y; y < bounds.Max.Y; y++ { - for x := bounds.Min.X; x < bounds.Max.X; x++ { - which := dstOutside - if (image.Point{x, y}).Add(dstMaskP).In(rect) { - which = dstInside - } - if got, want := dst.RGBAAt(x, y), which.RGBAAt(x, y); got != want { - if nError == 10 { - t.Errorf("q=%T dmp=%v wrap=%v: ...and more errors", q, dstMaskP, wrap) - break loop - } - nError++ - t.Errorf("q=%T dmp=%v wrap=%v: x=%3d y=%3d: got %v, want %v", - q, dstMaskP, wrap, x, y, got, want) - } - } - } - } - } - } -} - -func TestDstMaskSameSizeCopy(t *testing.T) { - bounds := image.Rect(0, 0, 42, 42) - src := image.Opaque - dst := image.NewRGBA(bounds) - mask := image.NewRGBA(bounds) - - Copy(dst, image.ZP, src, bounds, Src, &Options{ - DstMask: mask, - }) -} - -// TODO: delete this wrapper type once Go 1.5 is released, where an -// image.Rectangle implements image.Image. -type rectImage image.Rectangle - -func (r rectImage) ColorModel() color.Model { return color.Alpha16Model } -func (r rectImage) Bounds() image.Rectangle { return image.Rectangle(r) } -func (r rectImage) At(x, y int) color.Color { - if (image.Point{x, y}).In(image.Rectangle(r)) { - return color.Opaque - } - return color.Transparent -} - -// The fooWrapper types wrap the dst or src image to avoid triggering the -// type-specific fast path implementations. -type ( - dstWrapper struct{ Image } - srcWrapper struct{ image.Image } -) - -func srcGray(boundsHint image.Rectangle) (image.Image, error) { - m := image.NewGray(boundsHint) - fillPix(rand.New(rand.NewSource(0)), m.Pix) - return m, nil -} - -func srcNRGBA(boundsHint image.Rectangle) (image.Image, error) { - m := image.NewNRGBA(boundsHint) - fillPix(rand.New(rand.NewSource(1)), m.Pix) - return m, nil -} - -func srcRGBA(boundsHint image.Rectangle) (image.Image, error) { - m := image.NewRGBA(boundsHint) - fillPix(rand.New(rand.NewSource(2)), m.Pix) - // RGBA is alpha-premultiplied, so the R, G and B values should - // be <= the A values. - for i := 0; i < len(m.Pix); i += 4 { - m.Pix[i+0] = uint8(uint32(m.Pix[i+0]) * uint32(m.Pix[i+3]) / 0xff) - m.Pix[i+1] = uint8(uint32(m.Pix[i+1]) * uint32(m.Pix[i+3]) / 0xff) - m.Pix[i+2] = uint8(uint32(m.Pix[i+2]) * uint32(m.Pix[i+3]) / 0xff) - } - return m, nil -} - -func srcUnif(boundsHint image.Rectangle) (image.Image, error) { - return image.NewUniform(color.RGBA64{0x1234, 0x5555, 0x9181, 0xbeef}), nil -} - -func srcYCbCr(boundsHint image.Rectangle) (image.Image, error) { - m := image.NewYCbCr(boundsHint, image.YCbCrSubsampleRatio420) - fillPix(rand.New(rand.NewSource(3)), m.Y, m.Cb, m.Cr) - return m, nil -} - -func srcLarge(boundsHint image.Rectangle) (image.Image, error) { - // 3072 x 2304 is over 7 million pixels at 4:3, comparable to a - // 2015 smart-phone camera's output. - return srcYCbCr(image.Rect(0, 0, 3072, 2304)) -} - -func srcTux(boundsHint image.Rectangle) (image.Image, error) { - // tux.png is a 386 x 395 image. - f, err := os.Open("../testdata/tux.png") - if err != nil { - return nil, fmt.Errorf("Open: %v", err) - } - defer f.Close() - src, err := png.Decode(f) - if err != nil { - return nil, fmt.Errorf("Decode: %v", err) - } - return src, nil -} - -func benchScale(b *testing.B, w int, h int, op Op, srcf func(image.Rectangle) (image.Image, error), q Interpolator) { - dst := image.NewRGBA(image.Rect(0, 0, w, h)) - src, err := srcf(image.Rect(0, 0, 1024, 768)) - if err != nil { - b.Fatal(err) - } - dr, sr := dst.Bounds(), src.Bounds() - scaler := Scaler(q) - if n, ok := q.(interface { - NewScaler(int, int, int, int) Scaler - }); ok { - scaler = n.NewScaler(dr.Dx(), dr.Dy(), sr.Dx(), sr.Dy()) - } - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - scaler.Scale(dst, dr, src, sr, op, nil) - } -} - -func benchTform(b *testing.B, w int, h int, op Op, srcf func(image.Rectangle) (image.Image, error), q Interpolator) { - dst := image.NewRGBA(image.Rect(0, 0, w, h)) - src, err := srcf(image.Rect(0, 0, 1024, 768)) - if err != nil { - b.Fatal(err) - } - sr := src.Bounds() - m := transformMatrix(3.75, 40, 10) - - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - q.Transform(dst, m, src, sr, op, nil) - } -} - -func BenchmarkScaleNNLargeDown(b *testing.B) { benchScale(b, 200, 150, Src, srcLarge, NearestNeighbor) } -func BenchmarkScaleABLargeDown(b *testing.B) { benchScale(b, 200, 150, Src, srcLarge, ApproxBiLinear) } -func BenchmarkScaleBLLargeDown(b *testing.B) { benchScale(b, 200, 150, Src, srcLarge, BiLinear) } -func BenchmarkScaleCRLargeDown(b *testing.B) { benchScale(b, 200, 150, Src, srcLarge, CatmullRom) } - -func BenchmarkScaleNNDown(b *testing.B) { benchScale(b, 120, 80, Src, srcTux, NearestNeighbor) } -func BenchmarkScaleABDown(b *testing.B) { benchScale(b, 120, 80, Src, srcTux, ApproxBiLinear) } -func BenchmarkScaleBLDown(b *testing.B) { benchScale(b, 120, 80, Src, srcTux, BiLinear) } -func BenchmarkScaleCRDown(b *testing.B) { benchScale(b, 120, 80, Src, srcTux, CatmullRom) } - -func BenchmarkScaleNNUp(b *testing.B) { benchScale(b, 800, 600, Src, srcTux, NearestNeighbor) } -func BenchmarkScaleABUp(b *testing.B) { benchScale(b, 800, 600, Src, srcTux, ApproxBiLinear) } -func BenchmarkScaleBLUp(b *testing.B) { benchScale(b, 800, 600, Src, srcTux, BiLinear) } -func BenchmarkScaleCRUp(b *testing.B) { benchScale(b, 800, 600, Src, srcTux, CatmullRom) } - -func BenchmarkScaleNNSrcRGBA(b *testing.B) { benchScale(b, 200, 150, Src, srcRGBA, NearestNeighbor) } -func BenchmarkScaleNNSrcUnif(b *testing.B) { benchScale(b, 200, 150, Src, srcUnif, NearestNeighbor) } - -func BenchmarkScaleNNOverRGBA(b *testing.B) { benchScale(b, 200, 150, Over, srcRGBA, NearestNeighbor) } -func BenchmarkScaleNNOverUnif(b *testing.B) { benchScale(b, 200, 150, Over, srcUnif, NearestNeighbor) } - -func BenchmarkTformNNSrcRGBA(b *testing.B) { benchTform(b, 200, 150, Src, srcRGBA, NearestNeighbor) } -func BenchmarkTformNNSrcUnif(b *testing.B) { benchTform(b, 200, 150, Src, srcUnif, NearestNeighbor) } - -func BenchmarkTformNNOverRGBA(b *testing.B) { benchTform(b, 200, 150, Over, srcRGBA, NearestNeighbor) } -func BenchmarkTformNNOverUnif(b *testing.B) { benchTform(b, 200, 150, Over, srcUnif, NearestNeighbor) } - -func BenchmarkScaleABSrcGray(b *testing.B) { benchScale(b, 200, 150, Src, srcGray, ApproxBiLinear) } -func BenchmarkScaleABSrcNRGBA(b *testing.B) { benchScale(b, 200, 150, Src, srcNRGBA, ApproxBiLinear) } -func BenchmarkScaleABSrcRGBA(b *testing.B) { benchScale(b, 200, 150, Src, srcRGBA, ApproxBiLinear) } -func BenchmarkScaleABSrcYCbCr(b *testing.B) { benchScale(b, 200, 150, Src, srcYCbCr, ApproxBiLinear) } - -func BenchmarkScaleABOverGray(b *testing.B) { benchScale(b, 200, 150, Over, srcGray, ApproxBiLinear) } -func BenchmarkScaleABOverNRGBA(b *testing.B) { benchScale(b, 200, 150, Over, srcNRGBA, ApproxBiLinear) } -func BenchmarkScaleABOverRGBA(b *testing.B) { benchScale(b, 200, 150, Over, srcRGBA, ApproxBiLinear) } -func BenchmarkScaleABOverYCbCr(b *testing.B) { benchScale(b, 200, 150, Over, srcYCbCr, ApproxBiLinear) } - -func BenchmarkTformABSrcGray(b *testing.B) { benchTform(b, 200, 150, Src, srcGray, ApproxBiLinear) } -func BenchmarkTformABSrcNRGBA(b *testing.B) { benchTform(b, 200, 150, Src, srcNRGBA, ApproxBiLinear) } -func BenchmarkTformABSrcRGBA(b *testing.B) { benchTform(b, 200, 150, Src, srcRGBA, ApproxBiLinear) } -func BenchmarkTformABSrcYCbCr(b *testing.B) { benchTform(b, 200, 150, Src, srcYCbCr, ApproxBiLinear) } - -func BenchmarkTformABOverGray(b *testing.B) { benchTform(b, 200, 150, Over, srcGray, ApproxBiLinear) } -func BenchmarkTformABOverNRGBA(b *testing.B) { benchTform(b, 200, 150, Over, srcNRGBA, ApproxBiLinear) } -func BenchmarkTformABOverRGBA(b *testing.B) { benchTform(b, 200, 150, Over, srcRGBA, ApproxBiLinear) } -func BenchmarkTformABOverYCbCr(b *testing.B) { benchTform(b, 200, 150, Over, srcYCbCr, ApproxBiLinear) } - -func BenchmarkScaleCRSrcGray(b *testing.B) { benchScale(b, 200, 150, Src, srcGray, CatmullRom) } -func BenchmarkScaleCRSrcNRGBA(b *testing.B) { benchScale(b, 200, 150, Src, srcNRGBA, CatmullRom) } -func BenchmarkScaleCRSrcRGBA(b *testing.B) { benchScale(b, 200, 150, Src, srcRGBA, CatmullRom) } -func BenchmarkScaleCRSrcYCbCr(b *testing.B) { benchScale(b, 200, 150, Src, srcYCbCr, CatmullRom) } - -func BenchmarkScaleCROverGray(b *testing.B) { benchScale(b, 200, 150, Over, srcGray, CatmullRom) } -func BenchmarkScaleCROverNRGBA(b *testing.B) { benchScale(b, 200, 150, Over, srcNRGBA, CatmullRom) } -func BenchmarkScaleCROverRGBA(b *testing.B) { benchScale(b, 200, 150, Over, srcRGBA, CatmullRom) } -func BenchmarkScaleCROverYCbCr(b *testing.B) { benchScale(b, 200, 150, Over, srcYCbCr, CatmullRom) } - -func BenchmarkTformCRSrcGray(b *testing.B) { benchTform(b, 200, 150, Src, srcGray, CatmullRom) } -func BenchmarkTformCRSrcNRGBA(b *testing.B) { benchTform(b, 200, 150, Src, srcNRGBA, CatmullRom) } -func BenchmarkTformCRSrcRGBA(b *testing.B) { benchTform(b, 200, 150, Src, srcRGBA, CatmullRom) } -func BenchmarkTformCRSrcYCbCr(b *testing.B) { benchTform(b, 200, 150, Src, srcYCbCr, CatmullRom) } - -func BenchmarkTformCROverGray(b *testing.B) { benchTform(b, 200, 150, Over, srcGray, CatmullRom) } -func BenchmarkTformCROverNRGBA(b *testing.B) { benchTform(b, 200, 150, Over, srcNRGBA, CatmullRom) } -func BenchmarkTformCROverRGBA(b *testing.B) { benchTform(b, 200, 150, Over, srcRGBA, CatmullRom) } -func BenchmarkTformCROverYCbCr(b *testing.B) { benchTform(b, 200, 150, Over, srcYCbCr, CatmullRom) } diff --git a/vendor/golang.org/x/image/draw/stdlib_test.go b/vendor/golang.org/x/image/draw/stdlib_test.go deleted file mode 100644 index 9015bfd..0000000 --- a/vendor/golang.org/x/image/draw/stdlib_test.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.9 - -package draw - -// This file contains tests that depend on the exact behavior of the -// image/color package in the standard library. The color conversion formula -// from YCbCr to RGBA changed between Go 1.4 and Go 1.5, and between Go 1.8 and -// Go 1.9, so this file's tests are only enabled for Go 1.9 and above. - -import ( - "bytes" - "image" - "image/color" - "testing" -) - -// TestFastPaths tests that the fast path implementations produce identical -// results to the generic implementation. -func TestFastPaths(t *testing.T) { - drs := []image.Rectangle{ - image.Rect(0, 0, 10, 10), // The dst bounds. - image.Rect(3, 4, 8, 6), // A strict subset of the dst bounds. - image.Rect(-3, -5, 2, 4), // Partial out-of-bounds #0. - image.Rect(4, -2, 6, 12), // Partial out-of-bounds #1. - image.Rect(12, 14, 23, 45), // Complete out-of-bounds. - image.Rect(5, 5, 5, 5), // Empty. - } - srs := []image.Rectangle{ - image.Rect(0, 0, 12, 9), // The src bounds. - image.Rect(2, 2, 10, 8), // A strict subset of the src bounds. - image.Rect(10, 5, 20, 20), // Partial out-of-bounds #0. - image.Rect(-40, 0, 40, 8), // Partial out-of-bounds #1. - image.Rect(-8, -8, -4, -4), // Complete out-of-bounds. - image.Rect(5, 5, 5, 5), // Empty. - } - srcfs := []func(image.Rectangle) (image.Image, error){ - srcGray, - srcNRGBA, - srcRGBA, - srcUnif, - srcYCbCr, - } - var srcs []image.Image - for _, srcf := range srcfs { - src, err := srcf(srs[0]) - if err != nil { - t.Fatal(err) - } - srcs = append(srcs, src) - } - qs := []Interpolator{ - NearestNeighbor, - ApproxBiLinear, - CatmullRom, - } - ops := []Op{ - Over, - Src, - } - blue := image.NewUniform(color.RGBA{0x11, 0x22, 0x44, 0x7f}) - - for _, dr := range drs { - for _, src := range srcs { - for _, sr := range srs { - for _, transform := range []bool{false, true} { - for _, q := range qs { - for _, op := range ops { - dst0 := image.NewRGBA(drs[0]) - dst1 := image.NewRGBA(drs[0]) - Draw(dst0, dst0.Bounds(), blue, image.Point{}, Src) - Draw(dstWrapper{dst1}, dst1.Bounds(), srcWrapper{blue}, image.Point{}, Src) - - if transform { - m := transformMatrix(3.75, 2, 1) - q.Transform(dst0, m, src, sr, op, nil) - q.Transform(dstWrapper{dst1}, m, srcWrapper{src}, sr, op, nil) - } else { - q.Scale(dst0, dr, src, sr, op, nil) - q.Scale(dstWrapper{dst1}, dr, srcWrapper{src}, sr, op, nil) - } - - if !bytes.Equal(dst0.Pix, dst1.Pix) { - t.Errorf("pix differ for dr=%v, src=%T, sr=%v, transform=%t, q=%T", - dr, src, sr, transform, q) - } - } - } - } - } - } - } -} diff --git a/vendor/golang.org/x/image/font/font.go b/vendor/golang.org/x/image/font/font.go deleted file mode 100644 index 05f4357..0000000 --- a/vendor/golang.org/x/image/font/font.go +++ /dev/null @@ -1,359 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package font defines an interface for font faces, for drawing text on an -// image. -// -// Other packages provide font face implementations. For example, a truetype -// package would provide one based on .ttf font files. -package font // import "golang.org/x/image/font" - -import ( - "image" - "image/draw" - "io" - "unicode/utf8" - - "golang.org/x/image/math/fixed" -) - -// TODO: who is responsible for caches (glyph images, glyph indices, kerns)? -// The Drawer or the Face? - -// Face is a font face. Its glyphs are often derived from a font file, such as -// "Comic_Sans_MS.ttf", but a face has a specific size, style, weight and -// hinting. For example, the 12pt and 18pt versions of Comic Sans are two -// different faces, even if derived from the same font file. -// -// A Face is not safe for concurrent use by multiple goroutines, as its methods -// may re-use implementation-specific caches and mask image buffers. -// -// To create a Face, look to other packages that implement specific font file -// formats. -type Face interface { - io.Closer - - // Glyph returns the draw.DrawMask parameters (dr, mask, maskp) to draw r's - // glyph at the sub-pixel destination location dot, and that glyph's - // advance width. - // - // It returns !ok if the face does not contain a glyph for r. - // - // The contents of the mask image returned by one Glyph call may change - // after the next Glyph call. Callers that want to cache the mask must make - // a copy. - Glyph(dot fixed.Point26_6, r rune) ( - dr image.Rectangle, mask image.Image, maskp image.Point, advance fixed.Int26_6, ok bool) - - // GlyphBounds returns the bounding box of r's glyph, drawn at a dot equal - // to the origin, and that glyph's advance width. - // - // It returns !ok if the face does not contain a glyph for r. - // - // The glyph's ascent and descent equal -bounds.Min.Y and +bounds.Max.Y. A - // visual depiction of what these metrics are is at - // https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/Art/glyph_metrics_2x.png - GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance fixed.Int26_6, ok bool) - - // GlyphAdvance returns the advance width of r's glyph. - // - // It returns !ok if the face does not contain a glyph for r. - GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool) - - // Kern returns the horizontal adjustment for the kerning pair (r0, r1). A - // positive kern means to move the glyphs further apart. - Kern(r0, r1 rune) fixed.Int26_6 - - // Metrics returns the metrics for this Face. - Metrics() Metrics - - // TODO: ColoredGlyph for various emoji? - // TODO: Ligatures? Shaping? -} - -// Metrics holds the metrics for a Face. A visual depiction is at -// https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/Art/glyph_metrics_2x.png -type Metrics struct { - // Height is the recommended amount of vertical space between two lines of - // text. - Height fixed.Int26_6 - - // Ascent is the distance from the top of a line to its baseline. - Ascent fixed.Int26_6 - - // Descent is the distance from the bottom of a line to its baseline. The - // value is typically positive, even though a descender goes below the - // baseline. - Descent fixed.Int26_6 -} - -// Drawer draws text on a destination image. -// -// A Drawer is not safe for concurrent use by multiple goroutines, since its -// Face is not. -type Drawer struct { - // Dst is the destination image. - Dst draw.Image - // Src is the source image. - Src image.Image - // Face provides the glyph mask images. - Face Face - // Dot is the baseline location to draw the next glyph. The majority of the - // affected pixels will be above and to the right of the dot, but some may - // be below or to the left. For example, drawing a 'j' in an italic face - // may affect pixels below and to the left of the dot. - Dot fixed.Point26_6 - - // TODO: Clip image.Image? - // TODO: SrcP image.Point for Src images other than *image.Uniform? How - // does it get updated during DrawString? -} - -// TODO: should DrawString return the last rune drawn, so the next DrawString -// call can kern beforehand? Or should that be the responsibility of the caller -// if they really want to do that, since they have to explicitly shift d.Dot -// anyway? What if ligatures span more than two runes? What if grapheme -// clusters span multiple runes? -// -// TODO: do we assume that the input is in any particular Unicode Normalization -// Form? -// -// TODO: have DrawRunes(s []rune)? DrawRuneReader(io.RuneReader)?? If we take -// io.RuneReader, we can't assume that we can rewind the stream. -// -// TODO: how does this work with line breaking: drawing text up until a -// vertical line? Should DrawString return the number of runes drawn? - -// DrawBytes draws s at the dot and advances the dot's location. -// -// It is equivalent to DrawString(string(s)) but may be more efficient. -func (d *Drawer) DrawBytes(s []byte) { - prevC := rune(-1) - for len(s) > 0 { - c, size := utf8.DecodeRune(s) - s = s[size:] - if prevC >= 0 { - d.Dot.X += d.Face.Kern(prevC, c) - } - dr, mask, maskp, advance, ok := d.Face.Glyph(d.Dot, c) - if !ok { - // TODO: is falling back on the U+FFFD glyph the responsibility of - // the Drawer or the Face? - // TODO: set prevC = '\ufffd'? - continue - } - draw.DrawMask(d.Dst, dr, d.Src, image.Point{}, mask, maskp, draw.Over) - d.Dot.X += advance - prevC = c - } -} - -// DrawString draws s at the dot and advances the dot's location. -func (d *Drawer) DrawString(s string) { - prevC := rune(-1) - for _, c := range s { - if prevC >= 0 { - d.Dot.X += d.Face.Kern(prevC, c) - } - dr, mask, maskp, advance, ok := d.Face.Glyph(d.Dot, c) - if !ok { - // TODO: is falling back on the U+FFFD glyph the responsibility of - // the Drawer or the Face? - // TODO: set prevC = '\ufffd'? - continue - } - draw.DrawMask(d.Dst, dr, d.Src, image.Point{}, mask, maskp, draw.Over) - d.Dot.X += advance - prevC = c - } -} - -// BoundBytes returns the bounding box of s, drawn at the drawer dot, as well as -// the advance. -// -// It is equivalent to BoundBytes(string(s)) but may be more efficient. -func (d *Drawer) BoundBytes(s []byte) (bounds fixed.Rectangle26_6, advance fixed.Int26_6) { - bounds, advance = BoundBytes(d.Face, s) - bounds.Min = bounds.Min.Add(d.Dot) - bounds.Max = bounds.Max.Add(d.Dot) - return -} - -// BoundString returns the bounding box of s, drawn at the drawer dot, as well -// as the advance. -func (d *Drawer) BoundString(s string) (bounds fixed.Rectangle26_6, advance fixed.Int26_6) { - bounds, advance = BoundString(d.Face, s) - bounds.Min = bounds.Min.Add(d.Dot) - bounds.Max = bounds.Max.Add(d.Dot) - return -} - -// MeasureBytes returns how far dot would advance by drawing s. -// -// It is equivalent to MeasureString(string(s)) but may be more efficient. -func (d *Drawer) MeasureBytes(s []byte) (advance fixed.Int26_6) { - return MeasureBytes(d.Face, s) -} - -// MeasureString returns how far dot would advance by drawing s. -func (d *Drawer) MeasureString(s string) (advance fixed.Int26_6) { - return MeasureString(d.Face, s) -} - -// BoundBytes returns the bounding box of s with f, drawn at a dot equal to the -// origin, as well as the advance. -// -// It is equivalent to BoundString(string(s)) but may be more efficient. -func BoundBytes(f Face, s []byte) (bounds fixed.Rectangle26_6, advance fixed.Int26_6) { - prevC := rune(-1) - for len(s) > 0 { - c, size := utf8.DecodeRune(s) - s = s[size:] - if prevC >= 0 { - advance += f.Kern(prevC, c) - } - b, a, ok := f.GlyphBounds(c) - if !ok { - // TODO: is falling back on the U+FFFD glyph the responsibility of - // the Drawer or the Face? - // TODO: set prevC = '\ufffd'? - continue - } - b.Min.X += advance - b.Max.X += advance - bounds = bounds.Union(b) - advance += a - prevC = c - } - return -} - -// BoundString returns the bounding box of s with f, drawn at a dot equal to the -// origin, as well as the advance. -func BoundString(f Face, s string) (bounds fixed.Rectangle26_6, advance fixed.Int26_6) { - prevC := rune(-1) - for _, c := range s { - if prevC >= 0 { - advance += f.Kern(prevC, c) - } - b, a, ok := f.GlyphBounds(c) - if !ok { - // TODO: is falling back on the U+FFFD glyph the responsibility of - // the Drawer or the Face? - // TODO: set prevC = '\ufffd'? - continue - } - b.Min.X += advance - b.Max.X += advance - bounds = bounds.Union(b) - advance += a - prevC = c - } - return -} - -// MeasureBytes returns how far dot would advance by drawing s with f. -// -// It is equivalent to MeasureString(string(s)) but may be more efficient. -func MeasureBytes(f Face, s []byte) (advance fixed.Int26_6) { - prevC := rune(-1) - for len(s) > 0 { - c, size := utf8.DecodeRune(s) - s = s[size:] - if prevC >= 0 { - advance += f.Kern(prevC, c) - } - a, ok := f.GlyphAdvance(c) - if !ok { - // TODO: is falling back on the U+FFFD glyph the responsibility of - // the Drawer or the Face? - // TODO: set prevC = '\ufffd'? - continue - } - advance += a - prevC = c - } - return advance -} - -// MeasureString returns how far dot would advance by drawing s with f. -func MeasureString(f Face, s string) (advance fixed.Int26_6) { - prevC := rune(-1) - for _, c := range s { - if prevC >= 0 { - advance += f.Kern(prevC, c) - } - a, ok := f.GlyphAdvance(c) - if !ok { - // TODO: is falling back on the U+FFFD glyph the responsibility of - // the Drawer or the Face? - // TODO: set prevC = '\ufffd'? - continue - } - advance += a - prevC = c - } - return advance -} - -// Hinting selects how to quantize a vector font's glyph nodes. -// -// Not all fonts support hinting. -type Hinting int - -const ( - HintingNone Hinting = iota - HintingVertical - HintingFull -) - -// Stretch selects a normal, condensed, or expanded face. -// -// Not all fonts support stretches. -type Stretch int - -const ( - StretchUltraCondensed Stretch = -4 - StretchExtraCondensed Stretch = -3 - StretchCondensed Stretch = -2 - StretchSemiCondensed Stretch = -1 - StretchNormal Stretch = +0 - StretchSemiExpanded Stretch = +1 - StretchExpanded Stretch = +2 - StretchExtraExpanded Stretch = +3 - StretchUltraExpanded Stretch = +4 -) - -// Style selects a normal, italic, or oblique face. -// -// Not all fonts support styles. -type Style int - -const ( - StyleNormal Style = iota - StyleItalic - StyleOblique -) - -// Weight selects a normal, light or bold face. -// -// Not all fonts support weights. -// -// The named Weight constants (e.g. WeightBold) correspond to CSS' common -// weight names (e.g. "Bold"), but the numerical values differ, so that in Go, -// the zero value means to use a normal weight. For the CSS names and values, -// see https://developer.mozilla.org/en/docs/Web/CSS/font-weight -type Weight int - -const ( - WeightThin Weight = -3 // CSS font-weight value 100. - WeightExtraLight Weight = -2 // CSS font-weight value 200. - WeightLight Weight = -1 // CSS font-weight value 300. - WeightNormal Weight = +0 // CSS font-weight value 400. - WeightMedium Weight = +1 // CSS font-weight value 500. - WeightSemiBold Weight = +2 // CSS font-weight value 600. - WeightBold Weight = +3 // CSS font-weight value 700. - WeightExtraBold Weight = +4 // CSS font-weight value 800. - WeightBlack Weight = +5 // CSS font-weight value 900. -) diff --git a/vendor/golang.org/x/image/font/font_test.go b/vendor/golang.org/x/image/font/font_test.go deleted file mode 100644 index 1f05524..0000000 --- a/vendor/golang.org/x/image/font/font_test.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package font - -import ( - "image" - "strings" - "testing" - - "golang.org/x/image/math/fixed" -) - -const toyAdvance = fixed.Int26_6(10 << 6) - -type toyFace struct{} - -func (toyFace) Close() error { - return nil -} - -func (toyFace) Glyph(dot fixed.Point26_6, r rune) (image.Rectangle, image.Image, image.Point, fixed.Int26_6, bool) { - panic("unimplemented") -} - -func (toyFace) GlyphBounds(r rune) (fixed.Rectangle26_6, fixed.Int26_6, bool) { - return fixed.Rectangle26_6{ - Min: fixed.P(2, 0), - Max: fixed.P(6, 1), - }, toyAdvance, true -} - -func (toyFace) GlyphAdvance(r rune) (fixed.Int26_6, bool) { - return toyAdvance, true -} - -func (toyFace) Kern(r0, r1 rune) fixed.Int26_6 { - return 0 -} - -func (toyFace) Metrics() Metrics { - return Metrics{} -} - -func TestBound(t *testing.T) { - wantBounds := []fixed.Rectangle26_6{ - {Min: fixed.P(0, 0), Max: fixed.P(0, 0)}, - {Min: fixed.P(2, 0), Max: fixed.P(6, 1)}, - {Min: fixed.P(2, 0), Max: fixed.P(16, 1)}, - {Min: fixed.P(2, 0), Max: fixed.P(26, 1)}, - } - - for i, wantBound := range wantBounds { - s := strings.Repeat("x", i) - gotBound, gotAdvance := BoundString(toyFace{}, s) - if gotBound != wantBound { - t.Errorf("i=%d: bound: got %v, want %v", i, gotBound, wantBound) - } - wantAdvance := toyAdvance * fixed.Int26_6(i) - if gotAdvance != wantAdvance { - t.Errorf("i=%d: advance: got %v, want %v", i, gotAdvance, wantAdvance) - } - } -} diff --git a/vendor/golang.org/x/image/math/f64/f64.go b/vendor/golang.org/x/image/math/f64/f64.go deleted file mode 100644 index a1f7fc0..0000000 --- a/vendor/golang.org/x/image/math/f64/f64.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package f64 implements float64 vector and matrix types. -package f64 // import "golang.org/x/image/math/f64" - -// Vec2 is a 2-element vector. -type Vec2 [2]float64 - -// Vec3 is a 3-element vector. -type Vec3 [3]float64 - -// Vec4 is a 4-element vector. -type Vec4 [4]float64 - -// Mat3 is a 3x3 matrix in row major order. -// -// m[3*r + c] is the element in the r'th row and c'th column. -type Mat3 [9]float64 - -// Mat4 is a 4x4 matrix in row major order. -// -// m[4*r + c] is the element in the r'th row and c'th column. -type Mat4 [16]float64 - -// Aff3 is a 3x3 affine transformation matrix in row major order, where the -// bottom row is implicitly [0 0 1]. -// -// m[3*r + c] is the element in the r'th row and c'th column. -type Aff3 [6]float64 - -// Aff4 is a 4x4 affine transformation matrix in row major order, where the -// bottom row is implicitly [0 0 0 1]. -// -// m[4*r + c] is the element in the r'th row and c'th column. -type Aff4 [12]float64 diff --git a/vendor/golang.org/x/image/math/fixed/fixed.go b/vendor/golang.org/x/image/math/fixed/fixed.go deleted file mode 100644 index 3d91663..0000000 --- a/vendor/golang.org/x/image/math/fixed/fixed.go +++ /dev/null @@ -1,410 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package fixed implements fixed-point integer types. -package fixed // import "golang.org/x/image/math/fixed" - -import ( - "fmt" -) - -// TODO: implement fmt.Formatter for %f and %g. - -// I returns the integer value i as an Int26_6. -// -// For example, passing the integer value 2 yields Int26_6(128). -func I(i int) Int26_6 { - return Int26_6(i << 6) -} - -// Int26_6 is a signed 26.6 fixed-point number. -// -// The integer part ranges from -33554432 to 33554431, inclusive. The -// fractional part has 6 bits of precision. -// -// For example, the number one-and-a-quarter is Int26_6(1<<6 + 1<<4). -type Int26_6 int32 - -// String returns a human-readable representation of a 26.6 fixed-point number. -// -// For example, the number one-and-a-quarter becomes "1:16". -func (x Int26_6) String() string { - const shift, mask = 6, 1<<6 - 1 - if x >= 0 { - return fmt.Sprintf("%d:%02d", int32(x>>shift), int32(x&mask)) - } - x = -x - if x >= 0 { - return fmt.Sprintf("-%d:%02d", int32(x>>shift), int32(x&mask)) - } - return "-33554432:00" // The minimum value is -(1<<25). -} - -// Floor returns the greatest integer value less than or equal to x. -// -// Its return type is int, not Int26_6. -func (x Int26_6) Floor() int { return int((x + 0x00) >> 6) } - -// Round returns the nearest integer value to x. Ties are rounded up. -// -// Its return type is int, not Int26_6. -func (x Int26_6) Round() int { return int((x + 0x20) >> 6) } - -// Ceil returns the least integer value greater than or equal to x. -// -// Its return type is int, not Int26_6. -func (x Int26_6) Ceil() int { return int((x + 0x3f) >> 6) } - -// Mul returns x*y in 26.6 fixed-point arithmetic. -func (x Int26_6) Mul(y Int26_6) Int26_6 { - return Int26_6((int64(x)*int64(y) + 1<<5) >> 6) -} - -// Int52_12 is a signed 52.12 fixed-point number. -// -// The integer part ranges from -2251799813685248 to 2251799813685247, -// inclusive. The fractional part has 12 bits of precision. -// -// For example, the number one-and-a-quarter is Int52_12(1<<12 + 1<<10). -type Int52_12 int64 - -// String returns a human-readable representation of a 52.12 fixed-point -// number. -// -// For example, the number one-and-a-quarter becomes "1:1024". -func (x Int52_12) String() string { - const shift, mask = 12, 1<<12 - 1 - if x >= 0 { - return fmt.Sprintf("%d:%04d", int64(x>>shift), int64(x&mask)) - } - x = -x - if x >= 0 { - return fmt.Sprintf("-%d:%04d", int64(x>>shift), int64(x&mask)) - } - return "-2251799813685248:0000" // The minimum value is -(1<<51). -} - -// Floor returns the greatest integer value less than or equal to x. -// -// Its return type is int, not Int52_12. -func (x Int52_12) Floor() int { return int((x + 0x000) >> 12) } - -// Round returns the nearest integer value to x. Ties are rounded up. -// -// Its return type is int, not Int52_12. -func (x Int52_12) Round() int { return int((x + 0x800) >> 12) } - -// Ceil returns the least integer value greater than or equal to x. -// -// Its return type is int, not Int52_12. -func (x Int52_12) Ceil() int { return int((x + 0xfff) >> 12) } - -// Mul returns x*y in 52.12 fixed-point arithmetic. -func (x Int52_12) Mul(y Int52_12) Int52_12 { - const M, N = 52, 12 - lo, hi := muli64(int64(x), int64(y)) - ret := Int52_12(hi<>N) - ret += Int52_12((lo >> (N - 1)) & 1) // Round to nearest, instead of rounding down. - return ret -} - -// muli64 multiplies two int64 values, returning the 128-bit signed integer -// result as two uint64 values. -// -// This implementation is similar to $GOROOT/src/runtime/softfloat64.go's mullu -// function, which is in turn adapted from Hacker's Delight. -func muli64(u, v int64) (lo, hi uint64) { - const ( - s = 32 - mask = 1<> s) - u0 := uint64(u & mask) - v1 := uint64(v >> s) - v0 := uint64(v & mask) - - w0 := u0 * v0 - t := u1*v0 + w0>>s - w1 := t & mask - w2 := uint64(int64(t) >> s) - w1 += u0 * v1 - return uint64(u) * uint64(v), u1*v1 + w2 + uint64(int64(w1)>>s) -} - -// P returns the integer values x and y as a Point26_6. -// -// For example, passing the integer values (2, -3) yields Point26_6{128, -192}. -func P(x, y int) Point26_6 { - return Point26_6{Int26_6(x << 6), Int26_6(y << 6)} -} - -// Point26_6 is a 26.6 fixed-point coordinate pair. -// -// It is analogous to the image.Point type in the standard library. -type Point26_6 struct { - X, Y Int26_6 -} - -// Add returns the vector p+q. -func (p Point26_6) Add(q Point26_6) Point26_6 { - return Point26_6{p.X + q.X, p.Y + q.Y} -} - -// Sub returns the vector p-q. -func (p Point26_6) Sub(q Point26_6) Point26_6 { - return Point26_6{p.X - q.X, p.Y - q.Y} -} - -// Mul returns the vector p*k. -func (p Point26_6) Mul(k Int26_6) Point26_6 { - return Point26_6{p.X * k / 64, p.Y * k / 64} -} - -// Div returns the vector p/k. -func (p Point26_6) Div(k Int26_6) Point26_6 { - return Point26_6{p.X * 64 / k, p.Y * 64 / k} -} - -// In returns whether p is in r. -func (p Point26_6) In(r Rectangle26_6) bool { - return r.Min.X <= p.X && p.X < r.Max.X && r.Min.Y <= p.Y && p.Y < r.Max.Y -} - -// Point52_12 is a 52.12 fixed-point coordinate pair. -// -// It is analogous to the image.Point type in the standard library. -type Point52_12 struct { - X, Y Int52_12 -} - -// Add returns the vector p+q. -func (p Point52_12) Add(q Point52_12) Point52_12 { - return Point52_12{p.X + q.X, p.Y + q.Y} -} - -// Sub returns the vector p-q. -func (p Point52_12) Sub(q Point52_12) Point52_12 { - return Point52_12{p.X - q.X, p.Y - q.Y} -} - -// Mul returns the vector p*k. -func (p Point52_12) Mul(k Int52_12) Point52_12 { - return Point52_12{p.X * k / 4096, p.Y * k / 4096} -} - -// Div returns the vector p/k. -func (p Point52_12) Div(k Int52_12) Point52_12 { - return Point52_12{p.X * 4096 / k, p.Y * 4096 / k} -} - -// In returns whether p is in r. -func (p Point52_12) In(r Rectangle52_12) bool { - return r.Min.X <= p.X && p.X < r.Max.X && r.Min.Y <= p.Y && p.Y < r.Max.Y -} - -// R returns the integer values minX, minY, maxX, maxY as a Rectangle26_6. -// -// For example, passing the integer values (0, 1, 2, 3) yields -// Rectangle26_6{Point26_6{0, 64}, Point26_6{128, 192}}. -// -// Like the image.Rect function in the standard library, the returned rectangle -// has minimum and maximum coordinates swapped if necessary so that it is -// well-formed. -func R(minX, minY, maxX, maxY int) Rectangle26_6 { - if minX > maxX { - minX, maxX = maxX, minX - } - if minY > maxY { - minY, maxY = maxY, minY - } - return Rectangle26_6{ - Point26_6{ - Int26_6(minX << 6), - Int26_6(minY << 6), - }, - Point26_6{ - Int26_6(maxX << 6), - Int26_6(maxY << 6), - }, - } -} - -// Rectangle26_6 is a 26.6 fixed-point coordinate rectangle. The Min bound is -// inclusive and the Max bound is exclusive. It is well-formed if Min.X <= -// Max.X and likewise for Y. -// -// It is analogous to the image.Rectangle type in the standard library. -type Rectangle26_6 struct { - Min, Max Point26_6 -} - -// Add returns the rectangle r translated by p. -func (r Rectangle26_6) Add(p Point26_6) Rectangle26_6 { - return Rectangle26_6{ - Point26_6{r.Min.X + p.X, r.Min.Y + p.Y}, - Point26_6{r.Max.X + p.X, r.Max.Y + p.Y}, - } -} - -// Sub returns the rectangle r translated by -p. -func (r Rectangle26_6) Sub(p Point26_6) Rectangle26_6 { - return Rectangle26_6{ - Point26_6{r.Min.X - p.X, r.Min.Y - p.Y}, - Point26_6{r.Max.X - p.X, r.Max.Y - p.Y}, - } -} - -// Intersect returns the largest rectangle contained by both r and s. If the -// two rectangles do not overlap then the zero rectangle will be returned. -func (r Rectangle26_6) Intersect(s Rectangle26_6) Rectangle26_6 { - if r.Min.X < s.Min.X { - r.Min.X = s.Min.X - } - if r.Min.Y < s.Min.Y { - r.Min.Y = s.Min.Y - } - if r.Max.X > s.Max.X { - r.Max.X = s.Max.X - } - if r.Max.Y > s.Max.Y { - r.Max.Y = s.Max.Y - } - // Letting r0 and s0 be the values of r and s at the time that the method - // is called, this next line is equivalent to: - // - // if max(r0.Min.X, s0.Min.X) >= min(r0.Max.X, s0.Max.X) || likewiseForY { etc } - if r.Empty() { - return Rectangle26_6{} - } - return r -} - -// Union returns the smallest rectangle that contains both r and s. -func (r Rectangle26_6) Union(s Rectangle26_6) Rectangle26_6 { - if r.Empty() { - return s - } - if s.Empty() { - return r - } - if r.Min.X > s.Min.X { - r.Min.X = s.Min.X - } - if r.Min.Y > s.Min.Y { - r.Min.Y = s.Min.Y - } - if r.Max.X < s.Max.X { - r.Max.X = s.Max.X - } - if r.Max.Y < s.Max.Y { - r.Max.Y = s.Max.Y - } - return r -} - -// Empty returns whether the rectangle contains no points. -func (r Rectangle26_6) Empty() bool { - return r.Min.X >= r.Max.X || r.Min.Y >= r.Max.Y -} - -// In returns whether every point in r is in s. -func (r Rectangle26_6) In(s Rectangle26_6) bool { - if r.Empty() { - return true - } - // Note that r.Max is an exclusive bound for r, so that r.In(s) - // does not require that r.Max.In(s). - return s.Min.X <= r.Min.X && r.Max.X <= s.Max.X && - s.Min.Y <= r.Min.Y && r.Max.Y <= s.Max.Y -} - -// Rectangle52_12 is a 52.12 fixed-point coordinate rectangle. The Min bound is -// inclusive and the Max bound is exclusive. It is well-formed if Min.X <= -// Max.X and likewise for Y. -// -// It is analogous to the image.Rectangle type in the standard library. -type Rectangle52_12 struct { - Min, Max Point52_12 -} - -// Add returns the rectangle r translated by p. -func (r Rectangle52_12) Add(p Point52_12) Rectangle52_12 { - return Rectangle52_12{ - Point52_12{r.Min.X + p.X, r.Min.Y + p.Y}, - Point52_12{r.Max.X + p.X, r.Max.Y + p.Y}, - } -} - -// Sub returns the rectangle r translated by -p. -func (r Rectangle52_12) Sub(p Point52_12) Rectangle52_12 { - return Rectangle52_12{ - Point52_12{r.Min.X - p.X, r.Min.Y - p.Y}, - Point52_12{r.Max.X - p.X, r.Max.Y - p.Y}, - } -} - -// Intersect returns the largest rectangle contained by both r and s. If the -// two rectangles do not overlap then the zero rectangle will be returned. -func (r Rectangle52_12) Intersect(s Rectangle52_12) Rectangle52_12 { - if r.Min.X < s.Min.X { - r.Min.X = s.Min.X - } - if r.Min.Y < s.Min.Y { - r.Min.Y = s.Min.Y - } - if r.Max.X > s.Max.X { - r.Max.X = s.Max.X - } - if r.Max.Y > s.Max.Y { - r.Max.Y = s.Max.Y - } - // Letting r0 and s0 be the values of r and s at the time that the method - // is called, this next line is equivalent to: - // - // if max(r0.Min.X, s0.Min.X) >= min(r0.Max.X, s0.Max.X) || likewiseForY { etc } - if r.Empty() { - return Rectangle52_12{} - } - return r -} - -// Union returns the smallest rectangle that contains both r and s. -func (r Rectangle52_12) Union(s Rectangle52_12) Rectangle52_12 { - if r.Empty() { - return s - } - if s.Empty() { - return r - } - if r.Min.X > s.Min.X { - r.Min.X = s.Min.X - } - if r.Min.Y > s.Min.Y { - r.Min.Y = s.Min.Y - } - if r.Max.X < s.Max.X { - r.Max.X = s.Max.X - } - if r.Max.Y < s.Max.Y { - r.Max.Y = s.Max.Y - } - return r -} - -// Empty returns whether the rectangle contains no points. -func (r Rectangle52_12) Empty() bool { - return r.Min.X >= r.Max.X || r.Min.Y >= r.Max.Y -} - -// In returns whether every point in r is in s. -func (r Rectangle52_12) In(s Rectangle52_12) bool { - if r.Empty() { - return true - } - // Note that r.Max is an exclusive bound for r, so that r.In(s) - // does not require that r.Max.In(s). - return s.Min.X <= r.Min.X && r.Max.X <= s.Max.X && - s.Min.Y <= r.Min.Y && r.Max.Y <= s.Max.Y -} diff --git a/vendor/golang.org/x/image/math/fixed/fixed_test.go b/vendor/golang.org/x/image/math/fixed/fixed_test.go deleted file mode 100644 index c81fb72..0000000 --- a/vendor/golang.org/x/image/math/fixed/fixed_test.go +++ /dev/null @@ -1,439 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package fixed - -import ( - "math" - "math/rand" - "testing" -) - -var testCases = []struct { - x float64 - s26_6 string - s52_12 string - floor int - round int - ceil int -}{{ - x: 0, - s26_6: "0:00", - s52_12: "0:0000", - floor: 0, - round: 0, - ceil: 0, -}, { - x: 1, - s26_6: "1:00", - s52_12: "1:0000", - floor: 1, - round: 1, - ceil: 1, -}, { - x: 1.25, - s26_6: "1:16", - s52_12: "1:1024", - floor: 1, - round: 1, - ceil: 2, -}, { - x: 2.5, - s26_6: "2:32", - s52_12: "2:2048", - floor: 2, - round: 3, - ceil: 3, -}, { - x: 63 / 64.0, - s26_6: "0:63", - s52_12: "0:4032", - floor: 0, - round: 1, - ceil: 1, -}, { - x: -0.5, - s26_6: "-0:32", - s52_12: "-0:2048", - floor: -1, - round: +0, - ceil: +0, -}, { - x: -4.125, - s26_6: "-4:08", - s52_12: "-4:0512", - floor: -5, - round: -4, - ceil: -4, -}, { - x: -7.75, - s26_6: "-7:48", - s52_12: "-7:3072", - floor: -8, - round: -8, - ceil: -7, -}} - -func TestInt26_6(t *testing.T) { - const one = Int26_6(1 << 6) - for _, tc := range testCases { - x := Int26_6(tc.x * (1 << 6)) - if got, want := x.String(), tc.s26_6; got != want { - t.Errorf("tc.x=%v: String: got %q, want %q", tc.x, got, want) - } - if got, want := x.Floor(), tc.floor; got != want { - t.Errorf("tc.x=%v: Floor: got %v, want %v", tc.x, got, want) - } - if got, want := x.Round(), tc.round; got != want { - t.Errorf("tc.x=%v: Round: got %v, want %v", tc.x, got, want) - } - if got, want := x.Ceil(), tc.ceil; got != want { - t.Errorf("tc.x=%v: Ceil: got %v, want %v", tc.x, got, want) - } - if got, want := x.Mul(one), x; got != want { - t.Errorf("tc.x=%v: Mul by one: got %v, want %v", tc.x, got, want) - } - if got, want := x.mul(one), x; got != want { - t.Errorf("tc.x=%v: mul by one: got %v, want %v", tc.x, got, want) - } - } -} - -func TestInt52_12(t *testing.T) { - const one = Int52_12(1 << 12) - for _, tc := range testCases { - x := Int52_12(tc.x * (1 << 12)) - if got, want := x.String(), tc.s52_12; got != want { - t.Errorf("tc.x=%v: String: got %q, want %q", tc.x, got, want) - } - if got, want := x.Floor(), tc.floor; got != want { - t.Errorf("tc.x=%v: Floor: got %v, want %v", tc.x, got, want) - } - if got, want := x.Round(), tc.round; got != want { - t.Errorf("tc.x=%v: Round: got %v, want %v", tc.x, got, want) - } - if got, want := x.Ceil(), tc.ceil; got != want { - t.Errorf("tc.x=%v: Ceil: got %v, want %v", tc.x, got, want) - } - if got, want := x.Mul(one), x; got != want { - t.Errorf("tc.x=%v: Mul by one: got %v, want %v", tc.x, got, want) - } - } -} - -var mulTestCases = []struct { - x float64 - y float64 - z26_6 float64 // Equals truncate26_6(x)*truncate26_6(y). - z52_12 float64 // Equals truncate52_12(x)*truncate52_12(y). - s26_6 string - s52_12 string -}{{ - x: 0, - y: 1.5, - z26_6: 0, - z52_12: 0, - s26_6: "0:00", - s52_12: "0:0000", -}, { - x: +1.25, - y: +4, - z26_6: +5, - z52_12: +5, - s26_6: "5:00", - s52_12: "5:0000", -}, { - x: +1.25, - y: -4, - z26_6: -5, - z52_12: -5, - s26_6: "-5:00", - s52_12: "-5:0000", -}, { - x: -1.25, - y: +4, - z26_6: -5, - z52_12: -5, - s26_6: "-5:00", - s52_12: "-5:0000", -}, { - x: -1.25, - y: -4, - z26_6: +5, - z52_12: +5, - s26_6: "5:00", - s52_12: "5:0000", -}, { - x: 1.25, - y: 1.5, - z26_6: 1.875, - z52_12: 1.875, - s26_6: "1:56", - s52_12: "1:3584", -}, { - x: 1234.5, - y: -8888.875, - z26_6: -10973316.1875, - z52_12: -10973316.1875, - s26_6: "-10973316:12", - s52_12: "-10973316:0768", -}, { - x: 1.515625, // 1 + 33/64 = 97/64 - y: 1.531250, // 1 + 34/64 = 98/64 - z26_6: 2.32080078125, // 2 + 1314/4096 = 9506/4096 - z52_12: 2.32080078125, // 2 + 1314/4096 = 9506/4096 - s26_6: "2:21", // 2.32812500000, which is closer than 2:20 (in decimal, 2.3125) - s52_12: "2:1314", // 2.32080078125 -}, { - x: 0.500244140625, // 2049/4096, approximately 32/64 - y: 0.500732421875, // 2051/4096, approximately 32/64 - z26_6: 0.25, // 4194304/16777216, or 1024/4096 - z52_12: 0.2504884600639343, // 4202499/16777216 - s26_6: "0:16", // 0.25000000000 - s52_12: "0:1026", // 0.25048828125, which is closer than 0:1027 (in decimal, 0.250732421875) -}, { - x: 0.015625, // 1/64 - y: 0.000244140625, // 1/4096, approximately 0/64 - z26_6: 0.0, // 0 - z52_12: 0.000003814697265625, // 1/262144 - s26_6: "0:00", // 0 - s52_12: "0:0000", // 0, which is closer than 0:0001 (in decimal, 0.000244140625) -}, { - // Round the Int52_12 calculation down. - x: 1.44140625, // 1 + 1808/4096 = 5904/4096, approximately 92/64 - y: 1.44140625, // 1 + 1808/4096 = 5904/4096, approximately 92/64 - z26_6: 2.06640625, // 2 + 272/4096 = 8464/4096 - z52_12: 2.0776519775390625, // 2 + 318/4096 + 256/16777216 = 34857216/16777216 - s26_6: "2:04", // 2.06250000000, which is closer than 2:05 (in decimal, 2.078125000000) - s52_12: "2:0318", // 2.07763671875, which is closer than 2:0319 (in decimal, 2.077880859375) -}, { - // Round the Int52_12 calculation up. - x: 1.44140625, // 1 + 1808/4096 = 5904/4096, approximately 92/64 - y: 1.441650390625, // 1 + 1809/4096 = 5905/4096, approximately 92/64 - z26_6: 2.06640625, // 2 + 272/4096 = 8464/4096 - z52_12: 2.0780038833618164, // 2 + 319/4096 + 2064/16777216 = 34863120/16777216 - s26_6: "2:04", // 2.06250000000, which is closer than 2:05 (in decimal, 2.078125000000) - s52_12: "2:0320", // 2.07812500000, which is closer than 2:0319 (in decimal, 2.077880859375) -}} - -func TestInt26_6Mul(t *testing.T) { - for _, tc := range mulTestCases { - x := Int26_6(tc.x * (1 << 6)) - y := Int26_6(tc.y * (1 << 6)) - if z := float64(x) * float64(y) / (1 << 12); z != tc.z26_6 { - t.Errorf("tc.x=%v, tc.y=%v: z: got %v, want %v", tc.x, tc.y, z, tc.z26_6) - continue - } - if got, want := x.Mul(y).String(), tc.s26_6; got != want { - t.Errorf("tc.x=%v: Mul: got %q, want %q", tc.x, got, want) - } - } -} - -func TestInt52_12Mul(t *testing.T) { - for _, tc := range mulTestCases { - x := Int52_12(tc.x * (1 << 12)) - y := Int52_12(tc.y * (1 << 12)) - if z := float64(x) * float64(y) / (1 << 24); z != tc.z52_12 { - t.Errorf("tc.x=%v, tc.y=%v: z: got %v, want %v", tc.x, tc.y, z, tc.z52_12) - continue - } - if got, want := x.Mul(y).String(), tc.s52_12; got != want { - t.Errorf("tc.x=%v: Mul: got %q, want %q", tc.x, got, want) - } - } -} - -func TestInt26_6MulByOneMinusIota(t *testing.T) { - const ( - totalBits = 32 - fracBits = 6 - - oneMinusIota = Int26_6(1<>N) - ret += Int26_6((lo >> (N - 1)) & 1) // Round to nearest, instead of rounding down. - return ret -} - -// muli32 multiplies two int32 values, returning the 64-bit signed integer -// result as two uint32 values. -// -// muli32 isn't used directly by this package, but it has the same structure as -// muli64, and muli32 is easier to test since Go has built-in 64-bit integers. -func muli32(u, v int32) (lo, hi uint32) { - const ( - s = 16 - mask = 1<> s) - u0 := uint32(u & mask) - v1 := uint32(v >> s) - v0 := uint32(v & mask) - - w0 := u0 * v0 - t := u1*v0 + w0>>s - w1 := t & mask - w2 := uint32(int32(t) >> s) - w1 += u0 * v1 - return uint32(u) * uint32(v), u1*v1 + w2 + uint32(int32(w1)>>s) -} - -// mulu32 is like muli32, except that it multiplies unsigned instead of signed -// values. -// -// This implementation comes from $GOROOT/src/runtime/softfloat64.go's mullu -// function, which is in turn adapted from Hacker's Delight. -// -// mulu32 (and its corresponding test, TestMulu32) isn't used directly by this -// package. It is provided in this test file as a reference point to compare -// the muli32 (and TestMuli32) implementations against. -func mulu32(u, v uint32) (lo, hi uint32) { - const ( - s = 16 - mask = 1<> s - v0 := v & mask - v1 := v >> s - - w0 := u0 * v0 - t := u1*v0 + w0>>s - w1 := t & mask - w2 := t >> s - w1 += u0 * v1 - return u * v, u1*v1 + w2 + w1>>s -} diff --git a/vendor/golang.org/x/net/.gitattributes b/vendor/golang.org/x/net/.gitattributes deleted file mode 100644 index d2f212e..0000000 --- a/vendor/golang.org/x/net/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -# Treat all files in this repo as binary, with no git magic updating -# line endings. Windows users contributing to Go will need to use a -# modern version of git and editors capable of LF line endings. -# -# We'll prevent accidental CRLF line endings from entering the repo -# via the git-review gofmt checks. -# -# See golang.org/issue/9281 - -* -text diff --git a/vendor/golang.org/x/net/.gitignore b/vendor/golang.org/x/net/.gitignore deleted file mode 100644 index 8339fd6..0000000 --- a/vendor/golang.org/x/net/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Add no patterns to .hgignore except for files generated by the build. -last-change diff --git a/vendor/golang.org/x/net/CONTRIBUTING.md b/vendor/golang.org/x/net/CONTRIBUTING.md deleted file mode 100644 index d0485e8..0000000 --- a/vendor/golang.org/x/net/CONTRIBUTING.md +++ /dev/null @@ -1,26 +0,0 @@ -# Contributing to Go - -Go is an open source project. - -It is the work of hundreds of contributors. We appreciate your help! - -## Filing issues - -When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. -The gophers there will answer or ask you to file an issue if you've tripped over a bug. - -## Contributing code - -Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) -before sending patches. - -Unless otherwise noted, the Go source files are distributed under -the BSD-style license found in the LICENSE file. diff --git a/vendor/golang.org/x/net/README.md b/vendor/golang.org/x/net/README.md deleted file mode 100644 index 00a9b6e..0000000 --- a/vendor/golang.org/x/net/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Go Networking - -This repository holds supplementary Go networking libraries. - -## Download/Install - -The easiest way to install is to run `go get -u golang.org/x/net`. You can -also manually git clone the repository to `$GOPATH/src/golang.org/x/net`. - -## Report Issues / Send Patches - -This repository uses Gerrit for code changes. To learn how to submit -changes to this repository, see https://golang.org/doc/contribute.html. -The main issue tracker for the net repository is located at -https://github.com/golang/go/issues. Prefix your issue with "x/net:" in the -subject line, so it is easy to find. diff --git a/vendor/golang.org/x/net/codereview.cfg b/vendor/golang.org/x/net/codereview.cfg deleted file mode 100644 index 3f8b14b..0000000 --- a/vendor/golang.org/x/net/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/net/context/context_test.go b/vendor/golang.org/x/net/context/context_test.go deleted file mode 100644 index 6284413..0000000 --- a/vendor/golang.org/x/net/context/context_test.go +++ /dev/null @@ -1,583 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.7 - -package context - -import ( - "fmt" - "math/rand" - "runtime" - "strings" - "sync" - "testing" - "time" -) - -// otherContext is a Context that's not one of the types defined in context.go. -// This lets us test code paths that differ based on the underlying type of the -// Context. -type otherContext struct { - Context -} - -func TestBackground(t *testing.T) { - c := Background() - if c == nil { - t.Fatalf("Background returned nil") - } - select { - case x := <-c.Done(): - t.Errorf("<-c.Done() == %v want nothing (it should block)", x) - default: - } - if got, want := fmt.Sprint(c), "context.Background"; got != want { - t.Errorf("Background().String() = %q want %q", got, want) - } -} - -func TestTODO(t *testing.T) { - c := TODO() - if c == nil { - t.Fatalf("TODO returned nil") - } - select { - case x := <-c.Done(): - t.Errorf("<-c.Done() == %v want nothing (it should block)", x) - default: - } - if got, want := fmt.Sprint(c), "context.TODO"; got != want { - t.Errorf("TODO().String() = %q want %q", got, want) - } -} - -func TestWithCancel(t *testing.T) { - c1, cancel := WithCancel(Background()) - - if got, want := fmt.Sprint(c1), "context.Background.WithCancel"; got != want { - t.Errorf("c1.String() = %q want %q", got, want) - } - - o := otherContext{c1} - c2, _ := WithCancel(o) - contexts := []Context{c1, o, c2} - - for i, c := range contexts { - if d := c.Done(); d == nil { - t.Errorf("c[%d].Done() == %v want non-nil", i, d) - } - if e := c.Err(); e != nil { - t.Errorf("c[%d].Err() == %v want nil", i, e) - } - - select { - case x := <-c.Done(): - t.Errorf("<-c.Done() == %v want nothing (it should block)", x) - default: - } - } - - cancel() - time.Sleep(100 * time.Millisecond) // let cancelation propagate - - for i, c := range contexts { - select { - case <-c.Done(): - default: - t.Errorf("<-c[%d].Done() blocked, but shouldn't have", i) - } - if e := c.Err(); e != Canceled { - t.Errorf("c[%d].Err() == %v want %v", i, e, Canceled) - } - } -} - -func TestParentFinishesChild(t *testing.T) { - // Context tree: - // parent -> cancelChild - // parent -> valueChild -> timerChild - parent, cancel := WithCancel(Background()) - cancelChild, stop := WithCancel(parent) - defer stop() - valueChild := WithValue(parent, "key", "value") - timerChild, stop := WithTimeout(valueChild, 10000*time.Hour) - defer stop() - - select { - case x := <-parent.Done(): - t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) - case x := <-cancelChild.Done(): - t.Errorf("<-cancelChild.Done() == %v want nothing (it should block)", x) - case x := <-timerChild.Done(): - t.Errorf("<-timerChild.Done() == %v want nothing (it should block)", x) - case x := <-valueChild.Done(): - t.Errorf("<-valueChild.Done() == %v want nothing (it should block)", x) - default: - } - - // The parent's children should contain the two cancelable children. - pc := parent.(*cancelCtx) - cc := cancelChild.(*cancelCtx) - tc := timerChild.(*timerCtx) - pc.mu.Lock() - if len(pc.children) != 2 || !pc.children[cc] || !pc.children[tc] { - t.Errorf("bad linkage: pc.children = %v, want %v and %v", - pc.children, cc, tc) - } - pc.mu.Unlock() - - if p, ok := parentCancelCtx(cc.Context); !ok || p != pc { - t.Errorf("bad linkage: parentCancelCtx(cancelChild.Context) = %v, %v want %v, true", p, ok, pc) - } - if p, ok := parentCancelCtx(tc.Context); !ok || p != pc { - t.Errorf("bad linkage: parentCancelCtx(timerChild.Context) = %v, %v want %v, true", p, ok, pc) - } - - cancel() - - pc.mu.Lock() - if len(pc.children) != 0 { - t.Errorf("pc.cancel didn't clear pc.children = %v", pc.children) - } - pc.mu.Unlock() - - // parent and children should all be finished. - check := func(ctx Context, name string) { - select { - case <-ctx.Done(): - default: - t.Errorf("<-%s.Done() blocked, but shouldn't have", name) - } - if e := ctx.Err(); e != Canceled { - t.Errorf("%s.Err() == %v want %v", name, e, Canceled) - } - } - check(parent, "parent") - check(cancelChild, "cancelChild") - check(valueChild, "valueChild") - check(timerChild, "timerChild") - - // WithCancel should return a canceled context on a canceled parent. - precanceledChild := WithValue(parent, "key", "value") - select { - case <-precanceledChild.Done(): - default: - t.Errorf("<-precanceledChild.Done() blocked, but shouldn't have") - } - if e := precanceledChild.Err(); e != Canceled { - t.Errorf("precanceledChild.Err() == %v want %v", e, Canceled) - } -} - -func TestChildFinishesFirst(t *testing.T) { - cancelable, stop := WithCancel(Background()) - defer stop() - for _, parent := range []Context{Background(), cancelable} { - child, cancel := WithCancel(parent) - - select { - case x := <-parent.Done(): - t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) - case x := <-child.Done(): - t.Errorf("<-child.Done() == %v want nothing (it should block)", x) - default: - } - - cc := child.(*cancelCtx) - pc, pcok := parent.(*cancelCtx) // pcok == false when parent == Background() - if p, ok := parentCancelCtx(cc.Context); ok != pcok || (ok && pc != p) { - t.Errorf("bad linkage: parentCancelCtx(cc.Context) = %v, %v want %v, %v", p, ok, pc, pcok) - } - - if pcok { - pc.mu.Lock() - if len(pc.children) != 1 || !pc.children[cc] { - t.Errorf("bad linkage: pc.children = %v, cc = %v", pc.children, cc) - } - pc.mu.Unlock() - } - - cancel() - - if pcok { - pc.mu.Lock() - if len(pc.children) != 0 { - t.Errorf("child's cancel didn't remove self from pc.children = %v", pc.children) - } - pc.mu.Unlock() - } - - // child should be finished. - select { - case <-child.Done(): - default: - t.Errorf("<-child.Done() blocked, but shouldn't have") - } - if e := child.Err(); e != Canceled { - t.Errorf("child.Err() == %v want %v", e, Canceled) - } - - // parent should not be finished. - select { - case x := <-parent.Done(): - t.Errorf("<-parent.Done() == %v want nothing (it should block)", x) - default: - } - if e := parent.Err(); e != nil { - t.Errorf("parent.Err() == %v want nil", e) - } - } -} - -func testDeadline(c Context, wait time.Duration, t *testing.T) { - select { - case <-time.After(wait): - t.Fatalf("context should have timed out") - case <-c.Done(): - } - if e := c.Err(); e != DeadlineExceeded { - t.Errorf("c.Err() == %v want %v", e, DeadlineExceeded) - } -} - -func TestDeadline(t *testing.T) { - t.Parallel() - const timeUnit = 500 * time.Millisecond - c, _ := WithDeadline(Background(), time.Now().Add(1*timeUnit)) - if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) { - t.Errorf("c.String() = %q want prefix %q", got, prefix) - } - testDeadline(c, 2*timeUnit, t) - - c, _ = WithDeadline(Background(), time.Now().Add(1*timeUnit)) - o := otherContext{c} - testDeadline(o, 2*timeUnit, t) - - c, _ = WithDeadline(Background(), time.Now().Add(1*timeUnit)) - o = otherContext{c} - c, _ = WithDeadline(o, time.Now().Add(3*timeUnit)) - testDeadline(c, 2*timeUnit, t) -} - -func TestTimeout(t *testing.T) { - t.Parallel() - const timeUnit = 500 * time.Millisecond - c, _ := WithTimeout(Background(), 1*timeUnit) - if got, prefix := fmt.Sprint(c), "context.Background.WithDeadline("; !strings.HasPrefix(got, prefix) { - t.Errorf("c.String() = %q want prefix %q", got, prefix) - } - testDeadline(c, 2*timeUnit, t) - - c, _ = WithTimeout(Background(), 1*timeUnit) - o := otherContext{c} - testDeadline(o, 2*timeUnit, t) - - c, _ = WithTimeout(Background(), 1*timeUnit) - o = otherContext{c} - c, _ = WithTimeout(o, 3*timeUnit) - testDeadline(c, 2*timeUnit, t) -} - -func TestCanceledTimeout(t *testing.T) { - t.Parallel() - const timeUnit = 500 * time.Millisecond - c, _ := WithTimeout(Background(), 2*timeUnit) - o := otherContext{c} - c, cancel := WithTimeout(o, 4*timeUnit) - cancel() - time.Sleep(1 * timeUnit) // let cancelation propagate - select { - case <-c.Done(): - default: - t.Errorf("<-c.Done() blocked, but shouldn't have") - } - if e := c.Err(); e != Canceled { - t.Errorf("c.Err() == %v want %v", e, Canceled) - } -} - -type key1 int -type key2 int - -var k1 = key1(1) -var k2 = key2(1) // same int as k1, different type -var k3 = key2(3) // same type as k2, different int - -func TestValues(t *testing.T) { - check := func(c Context, nm, v1, v2, v3 string) { - if v, ok := c.Value(k1).(string); ok == (len(v1) == 0) || v != v1 { - t.Errorf(`%s.Value(k1).(string) = %q, %t want %q, %t`, nm, v, ok, v1, len(v1) != 0) - } - if v, ok := c.Value(k2).(string); ok == (len(v2) == 0) || v != v2 { - t.Errorf(`%s.Value(k2).(string) = %q, %t want %q, %t`, nm, v, ok, v2, len(v2) != 0) - } - if v, ok := c.Value(k3).(string); ok == (len(v3) == 0) || v != v3 { - t.Errorf(`%s.Value(k3).(string) = %q, %t want %q, %t`, nm, v, ok, v3, len(v3) != 0) - } - } - - c0 := Background() - check(c0, "c0", "", "", "") - - c1 := WithValue(Background(), k1, "c1k1") - check(c1, "c1", "c1k1", "", "") - - if got, want := fmt.Sprint(c1), `context.Background.WithValue(1, "c1k1")`; got != want { - t.Errorf("c.String() = %q want %q", got, want) - } - - c2 := WithValue(c1, k2, "c2k2") - check(c2, "c2", "c1k1", "c2k2", "") - - c3 := WithValue(c2, k3, "c3k3") - check(c3, "c2", "c1k1", "c2k2", "c3k3") - - c4 := WithValue(c3, k1, nil) - check(c4, "c4", "", "c2k2", "c3k3") - - o0 := otherContext{Background()} - check(o0, "o0", "", "", "") - - o1 := otherContext{WithValue(Background(), k1, "c1k1")} - check(o1, "o1", "c1k1", "", "") - - o2 := WithValue(o1, k2, "o2k2") - check(o2, "o2", "c1k1", "o2k2", "") - - o3 := otherContext{c4} - check(o3, "o3", "", "c2k2", "c3k3") - - o4 := WithValue(o3, k3, nil) - check(o4, "o4", "", "c2k2", "") -} - -func TestAllocs(t *testing.T) { - bg := Background() - for _, test := range []struct { - desc string - f func() - limit float64 - gccgoLimit float64 - }{ - { - desc: "Background()", - f: func() { Background() }, - limit: 0, - gccgoLimit: 0, - }, - { - desc: fmt.Sprintf("WithValue(bg, %v, nil)", k1), - f: func() { - c := WithValue(bg, k1, nil) - c.Value(k1) - }, - limit: 3, - gccgoLimit: 3, - }, - { - desc: "WithTimeout(bg, 15*time.Millisecond)", - f: func() { - c, _ := WithTimeout(bg, 15*time.Millisecond) - <-c.Done() - }, - limit: 8, - gccgoLimit: 16, - }, - { - desc: "WithCancel(bg)", - f: func() { - c, cancel := WithCancel(bg) - cancel() - <-c.Done() - }, - limit: 5, - gccgoLimit: 8, - }, - { - desc: "WithTimeout(bg, 100*time.Millisecond)", - f: func() { - c, cancel := WithTimeout(bg, 100*time.Millisecond) - cancel() - <-c.Done() - }, - limit: 8, - gccgoLimit: 25, - }, - } { - limit := test.limit - if runtime.Compiler == "gccgo" { - // gccgo does not yet do escape analysis. - // TODO(iant): Remove this when gccgo does do escape analysis. - limit = test.gccgoLimit - } - if n := testing.AllocsPerRun(100, test.f); n > limit { - t.Errorf("%s allocs = %f want %d", test.desc, n, int(limit)) - } - } -} - -func TestSimultaneousCancels(t *testing.T) { - root, cancel := WithCancel(Background()) - m := map[Context]CancelFunc{root: cancel} - q := []Context{root} - // Create a tree of contexts. - for len(q) != 0 && len(m) < 100 { - parent := q[0] - q = q[1:] - for i := 0; i < 4; i++ { - ctx, cancel := WithCancel(parent) - m[ctx] = cancel - q = append(q, ctx) - } - } - // Start all the cancels in a random order. - var wg sync.WaitGroup - wg.Add(len(m)) - for _, cancel := range m { - go func(cancel CancelFunc) { - cancel() - wg.Done() - }(cancel) - } - // Wait on all the contexts in a random order. - for ctx := range m { - select { - case <-ctx.Done(): - case <-time.After(1 * time.Second): - buf := make([]byte, 10<<10) - n := runtime.Stack(buf, true) - t.Fatalf("timed out waiting for <-ctx.Done(); stacks:\n%s", buf[:n]) - } - } - // Wait for all the cancel functions to return. - done := make(chan struct{}) - go func() { - wg.Wait() - close(done) - }() - select { - case <-done: - case <-time.After(1 * time.Second): - buf := make([]byte, 10<<10) - n := runtime.Stack(buf, true) - t.Fatalf("timed out waiting for cancel functions; stacks:\n%s", buf[:n]) - } -} - -func TestInterlockedCancels(t *testing.T) { - parent, cancelParent := WithCancel(Background()) - child, cancelChild := WithCancel(parent) - go func() { - parent.Done() - cancelChild() - }() - cancelParent() - select { - case <-child.Done(): - case <-time.After(1 * time.Second): - buf := make([]byte, 10<<10) - n := runtime.Stack(buf, true) - t.Fatalf("timed out waiting for child.Done(); stacks:\n%s", buf[:n]) - } -} - -func TestLayersCancel(t *testing.T) { - testLayers(t, time.Now().UnixNano(), false) -} - -func TestLayersTimeout(t *testing.T) { - testLayers(t, time.Now().UnixNano(), true) -} - -func testLayers(t *testing.T, seed int64, testTimeout bool) { - rand.Seed(seed) - errorf := func(format string, a ...interface{}) { - t.Errorf(fmt.Sprintf("seed=%d: %s", seed, format), a...) - } - const ( - timeout = 200 * time.Millisecond - minLayers = 30 - ) - type value int - var ( - vals []*value - cancels []CancelFunc - numTimers int - ctx = Background() - ) - for i := 0; i < minLayers || numTimers == 0 || len(cancels) == 0 || len(vals) == 0; i++ { - switch rand.Intn(3) { - case 0: - v := new(value) - ctx = WithValue(ctx, v, v) - vals = append(vals, v) - case 1: - var cancel CancelFunc - ctx, cancel = WithCancel(ctx) - cancels = append(cancels, cancel) - case 2: - var cancel CancelFunc - ctx, cancel = WithTimeout(ctx, timeout) - cancels = append(cancels, cancel) - numTimers++ - } - } - checkValues := func(when string) { - for _, key := range vals { - if val := ctx.Value(key).(*value); key != val { - errorf("%s: ctx.Value(%p) = %p want %p", when, key, val, key) - } - } - } - select { - case <-ctx.Done(): - errorf("ctx should not be canceled yet") - default: - } - if s, prefix := fmt.Sprint(ctx), "context.Background."; !strings.HasPrefix(s, prefix) { - t.Errorf("ctx.String() = %q want prefix %q", s, prefix) - } - t.Log(ctx) - checkValues("before cancel") - if testTimeout { - select { - case <-ctx.Done(): - case <-time.After(timeout + 100*time.Millisecond): - errorf("ctx should have timed out") - } - checkValues("after timeout") - } else { - cancel := cancels[rand.Intn(len(cancels))] - cancel() - select { - case <-ctx.Done(): - default: - errorf("ctx should be canceled") - } - checkValues("after cancel") - } -} - -func TestCancelRemoves(t *testing.T) { - checkChildren := func(when string, ctx Context, want int) { - if got := len(ctx.(*cancelCtx).children); got != want { - t.Errorf("%s: context has %d children, want %d", when, got, want) - } - } - - ctx, _ := WithCancel(Background()) - checkChildren("after creation", ctx, 0) - _, cancel := WithCancel(ctx) - checkChildren("with WithCancel child ", ctx, 1) - cancel() - checkChildren("after cancelling WithCancel child", ctx, 0) - - ctx, _ = WithCancel(Background()) - checkChildren("after creation", ctx, 0) - _, cancel = WithTimeout(ctx, 60*time.Minute) - checkChildren("with WithTimeout child ", ctx, 1) - cancel() - checkChildren("after cancelling WithTimeout child", ctx, 0) -} diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go deleted file mode 100644 index 72411b1..0000000 --- a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !plan9,go1.7 - -package ctxhttp - -import ( - "io" - "net/http" - "net/http/httptest" - "testing" - - "context" -) - -func TestGo17Context(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - io.WriteString(w, "ok") - })) - defer ts.Close() - ctx := context.Background() - resp, err := Get(ctx, http.DefaultClient, ts.URL) - if resp == nil || err != nil { - t.Fatalf("error received from client: %v %v", err, resp) - } - resp.Body.Close() -} diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go deleted file mode 100644 index 9159cf0..0000000 --- a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17_test.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !plan9,!go1.7 - -package ctxhttp - -import ( - "net" - "net/http" - "net/http/httptest" - "sync" - "testing" - "time" - - "golang.org/x/net/context" -) - -// golang.org/issue/14065 -func TestClosesResponseBodyOnCancel(t *testing.T) { - defer func() { testHookContextDoneBeforeHeaders = nop }() - defer func() { testHookDoReturned = nop }() - defer func() { testHookDidBodyClose = nop }() - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) - defer ts.Close() - - ctx, cancel := context.WithCancel(context.Background()) - - // closed when Do enters select case <-ctx.Done() - enteredDonePath := make(chan struct{}) - - testHookContextDoneBeforeHeaders = func() { - close(enteredDonePath) - } - - testHookDoReturned = func() { - // We now have the result (the Flush'd headers) at least, - // so we can cancel the request. - cancel() - - // But block the client.Do goroutine from sending - // until Do enters into the <-ctx.Done() path, since - // otherwise if both channels are readable, select - // picks a random one. - <-enteredDonePath - } - - sawBodyClose := make(chan struct{}) - testHookDidBodyClose = func() { close(sawBodyClose) } - - tr := &http.Transport{} - defer tr.CloseIdleConnections() - c := &http.Client{Transport: tr} - req, _ := http.NewRequest("GET", ts.URL, nil) - _, doErr := Do(ctx, c, req) - - select { - case <-sawBodyClose: - case <-time.After(5 * time.Second): - t.Fatal("timeout waiting for body to close") - } - - if doErr != ctx.Err() { - t.Errorf("Do error = %v; want %v", doErr, ctx.Err()) - } -} - -type noteCloseConn struct { - net.Conn - onceClose sync.Once - closefn func() -} - -func (c *noteCloseConn) Close() error { - c.onceClose.Do(c.closefn) - return c.Conn.Close() -} diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go deleted file mode 100644 index 1e41551..0000000 --- a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_test.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !plan9 - -package ctxhttp - -import ( - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" - "time" - - "golang.org/x/net/context" -) - -const ( - requestDuration = 100 * time.Millisecond - requestBody = "ok" -) - -func okHandler(w http.ResponseWriter, r *http.Request) { - time.Sleep(requestDuration) - io.WriteString(w, requestBody) -} - -func TestNoTimeout(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(okHandler)) - defer ts.Close() - - ctx := context.Background() - res, err := Get(ctx, nil, ts.URL) - if err != nil { - t.Fatal(err) - } - defer res.Body.Close() - slurp, err := ioutil.ReadAll(res.Body) - if err != nil { - t.Fatal(err) - } - if string(slurp) != requestBody { - t.Errorf("body = %q; want %q", slurp, requestBody) - } -} - -func TestCancelBeforeHeaders(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - - blockServer := make(chan struct{}) - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - cancel() - <-blockServer - io.WriteString(w, requestBody) - })) - defer ts.Close() - defer close(blockServer) - - res, err := Get(ctx, nil, ts.URL) - if err == nil { - res.Body.Close() - t.Fatal("Get returned unexpected nil error") - } - if err != context.Canceled { - t.Errorf("err = %v; want %v", err, context.Canceled) - } -} - -func TestCancelAfterHangingRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - w.(http.Flusher).Flush() - <-w.(http.CloseNotifier).CloseNotify() - })) - defer ts.Close() - - ctx, cancel := context.WithCancel(context.Background()) - resp, err := Get(ctx, nil, ts.URL) - if err != nil { - t.Fatalf("unexpected error in Get: %v", err) - } - - // Cancel befer reading the body. - // Reading Request.Body should fail, since the request was - // canceled before anything was written. - cancel() - - done := make(chan struct{}) - - go func() { - b, err := ioutil.ReadAll(resp.Body) - if len(b) != 0 || err == nil { - t.Errorf(`Read got (%q, %v); want ("", error)`, b, err) - } - close(done) - }() - - select { - case <-time.After(1 * time.Second): - t.Errorf("Test timed out") - case <-done: - } -} diff --git a/vendor/golang.org/x/net/context/withtimeout_test.go b/vendor/golang.org/x/net/context/withtimeout_test.go deleted file mode 100644 index e6f5669..0000000 --- a/vendor/golang.org/x/net/context/withtimeout_test.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package context_test - -import ( - "fmt" - "time" - - "golang.org/x/net/context" -) - -// This example passes a context with a timeout to tell a blocking function that -// it should abandon its work after the timeout elapses. -func ExampleWithTimeout() { - // Pass a context with a timeout to tell a blocking function that it - // should abandon its work after the timeout elapses. - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) - defer cancel() - - select { - case <-time.After(1 * time.Second): - fmt.Println("overslept") - case <-ctx.Done(): - fmt.Println(ctx.Err()) // prints "context deadline exceeded" - } - - // Output: - // context deadline exceeded -} diff --git a/vendor/google.golang.org/api/.gitignore b/vendor/google.golang.org/api/.gitignore deleted file mode 100644 index 50d2a9b..0000000 --- a/vendor/google.golang.org/api/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -_obj/ -*_testmain.go -clientid.dat -clientsecret.dat -/google-api-go-generator/google-api-go-generator - -*.6 -*.8 -*~ -*.out -*.test -*.exe diff --git a/vendor/google.golang.org/api/.hgtags b/vendor/google.golang.org/api/.hgtags deleted file mode 100644 index f1a7357..0000000 --- a/vendor/google.golang.org/api/.hgtags +++ /dev/null @@ -1 +0,0 @@ -b571b553f8c057cb6952ce817dfb09b6e34a8c0b release diff --git a/vendor/google.golang.org/api/.travis.yml b/vendor/google.golang.org/api/.travis.yml deleted file mode 100644 index ef68b4b..0000000 --- a/vendor/google.golang.org/api/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -sudo: false - -language: go - -go: - - 1.6.x - - 1.7.x - - 1.8.x - - 1.9.x - -before_install: - - openssl aes-256-cbc -K $encrypted_6c6ebd86ce52_key -iv $encrypted_6c6ebd86ce52_iv -in key.json.enc -out key.json -d - -install: - - go get -v -t -p 1 google.golang.org/api/... - -script: - - GCLOUD_TESTS_GOLANG_PROJECT_ID="dulcet-port-762" GCLOUD_TESTS_GOLANG_DESTRUCTIVE_TEST_BUCKET_NAME="dulcet-port-762-api-go-client-storage-integration-test" GCLOUD_TESTS_GOLANG_KEY="$(pwd)/key.json" go test -v -tags=integration google.golang.org/api/... diff --git a/vendor/google.golang.org/api/CONTRIBUTING.md b/vendor/google.golang.org/api/CONTRIBUTING.md deleted file mode 100644 index e4d36da..0000000 --- a/vendor/google.golang.org/api/CONTRIBUTING.md +++ /dev/null @@ -1,484 +0,0 @@ -# Contributing to the Google API Go Client - -## Master git repo - -Our master git repo is https://code.googlesource.com/google-api-go-client - -## Pull Requests - -We do **NOT** use Github pull requests. We use Gerrit instead -with the same workflow as Go. See below. - -## The source tree - -Most of this project is auto-generated. - -The notable directories which are not auto-generated: - -``` - google-api-go-generator/ -- the generator itself - googleapi/ -- shared common code, used by auto-generated code - examples/ -- sample code -``` - -# Contribution Guidelines - -## Introduction - -This document explains how to contribute changes to the google-api-go-client project. - -## Testing redux - -You've written and tested your code, but -before sending code out for review, run all the tests for the whole -tree to make sure the changes don't break other packages or programs: - -``` -$ make cached -$ go test ./... -... -ok google.golang.org/api/google-api-go-generator 0.226s -ok google.golang.org/api/googleapi 0.015s -... -``` - -Ideally, you will add unit tests to one of the above directories to -demonstrate the changes you are making and include the tests with your -code review. - -## Code review - -Changes to google-api-go-client must be reviewed before they are submitted, -no matter who makes the change. -A custom git command called `git-codereview`, -discussed below, helps manage the code review process through a Google-hosted -[instance](https://code-review.googlesource.com/) of the code review -system called [Gerrit](https://code.google.com/p/gerrit/). - -### Set up authentication for code review - -The Git code hosting server and Gerrit code review server both use a Google -Account to authenticate. You therefore need a Google Account to proceed. -(If you can use the account to -[sign in at google.com](https://www.google.com/accounts/Login), -you can use it to sign in to the code review server.) -The email address you use with the code review system -needs to be added to the [`CONTRIBUTORS`](/CONTRIBUTORS) file -with your first code review. -You can [create a Google Account](https://www.google.com/accounts/NewAccount) -associated with any address where you receive email. - -Visit the site [code.googlesource.com](https://code.googlesource.com) -and log in using your Google Account. -Click on the "Generate Password" link that appears at the top of the page. - -Click the radio button that says "Only `code.googlesource.com`" -to use this authentication token only for the google-api-go-client project. - -Further down the page is a box containing commands to install -the authentication cookie in file called `.gitcookies` in your home -directory. -Copy the text for the commands into a Unix shell window to execute it. -That will install the authentication token. - -(If you are on a Windows computer, you should instead follow the instructions -in the yellow box to run the command.) - -### Register with Gerrit - -Now that you have a Google account and the authentication token, -you need to register your account with Gerrit, the code review system. -To do this, visit [golang.org/cl](https://golang.org/cl) -and log in using the same Google Account you used above. -That is all that is required. - -### Install the git-codereview command - -Now install the `git-codereview` command by running, - -``` -go get -u golang.org/x/review/git-codereview -``` - -Make sure `git-codereview` is installed in your shell path, so that the -`git` command can find it. Check that - -``` -$ git codereview help -``` - -prints help text, not an error. - -Note to Git aficionados: The `git-codereview` command is not required to -upload and manage Gerrit code reviews. For those who prefer plain Git, the text -below gives the Git equivalent of each git-codereview command. If you do use plain -Git, note that you still need the commit hooks that the git-codereview command -configures; those hooks add a Gerrit `Change-Id` line to the commit -message and check that all Go source files have been formatted with gofmt. Even -if you intend to use plain Git for daily work, install the hooks in a new Git -checkout by running `git-codereview hooks`. - -### Set up git aliases - -The `git-codereview` command can be run directly from the shell -by typing, for instance, - -``` -$ git codereview sync -``` - -but it is more convenient to set up aliases for `git-codereview`'s own -subcommands, so that the above becomes, - -``` -$ git sync -``` - -The `git-codereview` subcommands have been chosen to be distinct from -Git's own, so it's safe to do so. - -The aliases are optional, but in the rest of this document we will assume -they are installed. -To install them, copy this text into your Git configuration file -(usually `.gitconfig` in your home directory): - -``` -[alias] - change = codereview change - gofmt = codereview gofmt - mail = codereview mail - pending = codereview pending - submit = codereview submit - sync = codereview sync -``` - -### Understanding the git-codereview command - -After installing the `git-codereview` command, you can run - -``` -$ git codereview help -``` - -to learn more about its commands. -You can also read the [command documentation](https://godoc.org/golang.org/x/review/git-codereview). - -### Switch to the master branch - -New changes should -only be made based on the master branch. -Before making a change, make sure you start on the master branch: - -``` -$ git checkout master -$ git sync -```` - -(In Git terms, `git sync` runs -`git pull -r`.) - -### Make a change - -The entire checked-out tree is writable. -Once you have edited files, you must tell Git that they have been modified. -You must also tell Git about any files that are added, removed, or renamed files. -These operations are done with the usual Git commands, -`git add`, -`git rm`, -and -`git mv`. - -If you wish to checkpoint your work, or are ready to send the code out for review, run - -``` -$ git change -``` - -from any directory in your google-api-go-client repository to commit the changes so far. -The name `` is an arbitrary one you choose to identify the -local branch containing your changes. - -(In Git terms, `git change ` -runs `git checkout -b branch`, -then `git branch --set-upstream-to origin/master`, -then `git commit`.) - -Git will open a change description file in your editor. -(It uses the editor named by the `$EDITOR` environment variable, -`vi` by default.) -The file will look like: - -``` -# Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. -# On branch foo -# Changes not staged for commit: -# modified: editedfile.go -# -``` - -At the beginning of this file is a blank line; replace it -with a thorough description of your change. -The first line of the change description is conventionally a one-line -summary of the change, prefixed by `google-api-go-client:`, -and is used as the subject for code review mail. -The rest of the -description elaborates and should provide context for the -change and explain what it does. -If there is a helpful reference, mention it here. - -After editing, the template might now read: - -``` -math: improved Sin, Cos and Tan precision for very large arguments - -The existing implementation has poor numerical properties for -large arguments, so use the McGillicutty algorithm to improve -accuracy above 1e10. - -The algorithm is described at http://wikipedia.org/wiki/McGillicutty_Algorithm - -Fixes #54 - -# Please enter the commit message for your changes. Lines starting -# with '#' will be ignored, and an empty message aborts the commit. -# On branch foo -# Changes not staged for commit: -# modified: editedfile.go -# -``` - -The commented section of the file lists all the modified files in your client. -It is best to keep unrelated changes in different change lists, -so if you see a file listed that should not be included, abort -the command and move that file to a different branch. - -The special notation "Fixes #54" associates the change with issue 54 in the -[google-api-go-client issue tracker](https://github.com/google/google-api-go-client/issues/54). -When this change is eventually submitted, the issue -tracker will automatically mark the issue as fixed. -(There are several such conventions, described in detail in the -[GitHub Issue Tracker documentation](https://help.github.com/articles/closing-issues-via-commit-messages/).) - -Once you have finished writing the commit message, -save the file and exit the editor. - -If you wish to do more editing, re-stage your changes using -`git add`, and then run - -``` -$ git change -``` - -to update the change description and incorporate the staged changes. The -change description contains a `Change-Id` line near the bottom, -added by a Git commit hook during the initial -`git change`. -That line is used by Gerrit to match successive uploads of the same change. -Do not edit or delete it. - -(In Git terms, `git change` with no branch name -runs `git commit --amend`.) - -### Mail the change for review - -Once the change is ready, mail it out for review: - -``` -$ git mail -``` - -You can specify a reviewer or CC interested parties -using the `-r` or `-cc` options. -Both accept a comma-separated list of email addresses: - -``` -$ git mail -r joe@golang.org -cc mabel@example.com,math-nuts@swtch.com -``` - -Unless explicitly told otherwise, such as in the discussion leading -up to sending in the change list, please specify -`bradfitz@golang.org`, `gmlewis@google.com`, or -`mcgreevy@golang.org` as a reviewer. - -(In Git terms, `git mail` pushes the local committed -changes to Gerrit using `git push origin HEAD:refs/for/master`.) - -If your change relates to an open issue, please add a comment to the issue -announcing your proposed fix, including a link to your CL. - -The code review server assigns your change an issue number and URL, -which `git mail` will print, something like: - -``` -remote: New Changes: -remote: https://code-review.googlesource.com/99999 math: improved Sin, Cos and Tan precision for very large arguments -``` - -### Reviewing code - -Running `git mail` will send an email to you and the -reviewers asking them to visit the issue's URL and make comments on the change. -When done, the reviewer adds comments through the Gerrit user interface -and clicks "Reply" to send comments back. -You will receive a mail notification when this happens. -You must reply through the web interface. - -### Revise and upload - -You must respond to review comments through the web interface. - -When you have revised the code and are ready for another round of review, -stage those changes and use `git change` to update the -commit. -To send the update change list for another round of review, -run `git mail` again. - -The reviewer can comment on the new copy, and the process repeats. -The reviewer approves the change by giving it a positive score -(+1 or +2) and replying `LGTM`: looks good to me. - -You can see a list of your pending changes by running -`git pending`, and switch between change branches with -`git change `. - -### Synchronize your client - -While you were working, others might have submitted changes to the repository. -To update your local branch, run - -``` -$ git sync -``` - -(In git terms, `git sync` runs -`git pull -r`.) - -If files you were editing have changed, Git does its best to merge the -remote changes into your local changes. -It may leave some files to merge by hand. - -For example, suppose you have edited `sin.go` but -someone else has committed an independent change. -When you run `git sync`, -you will get the (scary-looking) output: - -``` -$ git sync -Failed to merge in the changes. -Patch failed at 0023 math: improved Sin, Cos and Tan precision for very large arguments -The copy of the patch that failed is found in: - /home/you/repo/.git/rebase-apply/patch - -When you have resolved this problem, run "git rebase --continue". -If you prefer to skip this patch, run "git rebase --skip" instead. -To check out the original branch and stop rebasing, run "git rebase --abort". -``` - - -If this happens, run - -``` -$ git status -``` - -to see which files failed to merge. -The output will look something like this: - -``` -rebase in progress; onto a24c3eb -You are currently rebasing branch 'mcgillicutty' on 'a24c3eb'. - (fix conflicts and then run "git rebase --continue") - (use "git rebase --skip" to skip this patch) - (use "git rebase --abort" to check out the original branch) - -Unmerged paths: - (use "git reset HEAD ..." to unstage) - (use "git add ..." to mark resolution) - - _both modified: sin.go_ -``` - - -The only important part in that transcript is the italicized "both modified" -line: Git failed to merge your changes with the conflicting change. -When this happens, Git leaves both sets of edits in the file, -with conflicts marked by `<<<<<<<` and -`>>>>>>>`. -It is now your job to edit the file to combine them. -Continuing the example, searching for those strings in `sin.go` -might turn up: - -``` - arg = scale(arg) -<<<<<<< HEAD - if arg > 1e9 { -======= - if arg > 1e10 { ->>>>>>> mcgillicutty - largeReduce(arg) -``` - -Git doesn't show it, but suppose the original text that both edits -started with was 1e8; you changed it to 1e10 and the other change to 1e9, -so the correct answer might now be 1e10. First, edit the section -to remove the markers and leave the correct code: - -``` - arg = scale(arg) - if arg > 1e10 { - largeReduce(arg) -``` - -Then tell Git that the conflict is resolved by running - -``` -$ git add sin.go -``` - -If you had been editing the file, say for debugging, but do not -care to preserve your changes, you can run -`git reset HEAD sin.go` -to abandon your changes. -Then run `git rebase --continue` to -restore the change commit. - -### Reviewing code by others - -You can import a change proposed by someone else into your local Git repository. -On the Gerrit review page, click the "Download ▼" link in the upper right -corner, copy the "Checkout" command and run it from your local Git repo. -It should look something like this: - -``` -$ git fetch https://code.googlesource.com/review refs/changes/21/1221/1 && git checkout FETCH_HEAD -``` - -To revert, change back to the branch you were working in. - -### Submit the change after the review - -After the code has been `LGTM`'ed, an approver may -submit it to the master branch using the Gerrit UI. -There is a "Submit" button on the web page for the change -that appears once the change is approved (marked +2). - -This checks the change into the repository. -The change description will include a link to the code review, -and the code review will be updated with a link to the change -in the repository. -Since the method used to integrate the changes is "Cherry Pick", -the commit hashes in the repository will be changed by -the submit operation. - -### More information - -In addition to the information here, the Go community maintains a [CodeReview](https://golang.org/wiki/CodeReview) wiki page. -Feel free to contribute to this page as you learn the review process. - -## Contributors - -Files in the google-api-go-client repository don't list author names, -both to avoid clutter and to avoid having to keep the lists up to date. -Instead, please add your name to the [`CONTRIBUTORS`](/CONTRIBUTORS) -file as your first code review, keeping the names in sorted order. diff --git a/vendor/google.golang.org/api/GettingStarted.md b/vendor/google.golang.org/api/GettingStarted.md deleted file mode 100644 index 08641d9..0000000 --- a/vendor/google.golang.org/api/GettingStarted.md +++ /dev/null @@ -1,130 +0,0 @@ -# Getting Started with the Google APIs for Go - -## Getting Started - -This is a quick walk-through of how to get started with the Google APIs for Go. - -## Background - -The first thing to understand is that the Google API libraries are auto-generated for -each language, including Go, so they may not feel like 100% natural for any language. -The Go versions are pretty natural, but please forgive any small non-idiomatic things. -(Suggestions welcome, though!) - -## Installing - -Pick an API and a version of that API to install. -You can find the complete list by looking at the -[directories here](https://github.com/google/google-api-go-client/tree/master/). - -For example, let's install the -[urlshortener's version 1 API](https://godoc.org/google.golang.org/api/urlshortener/v1): - -``` -$ go get -u google.golang.org/api/urlshortener/v1 -``` - -Now it's ready for use in your code. - -## Using - -Once you've installed a library, you import it like this: - -```go -package main - -import ( - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - "google.golang.org/api/urlshortener/v1" -) -``` - -The package name, if you don't override it on your import line, is the name of the -API without the version number. In the case above, just `urlshortener`. - -## Instantiating - -Each API has a `New` function taking an `*http.Client` and returning an API-specific `*Service`. - -You create the service like: - -```go - svc, err := urlshortener.New(httpClient) -``` - -## OAuth HTTP Client - -The HTTP client you pass in to the service must be one that automatically adds -Google-supported Authorization information to the requests. - -There are several ways to do authentication. They will all involve the package -[golang.org/x/oauth2](https://godoc.org/golang.org/x/oauth2) in some way. - -### 3-legged OAuth - -For 3-legged OAuth (your application redirecting a user through a website to get a -token giving your application access to that user's resources), you will need to -create an oauth2.Config, - - -```go - var config = &oauth2.Config{ - ClientID: "", // from https://console.developers.google.com/project//apiui/credential - ClientSecret: "", // from https://console.developers.google.com/project//apiui/credential - Endpoint: google.Endpoint, - Scopes: []string{urlshortener.UrlshortenerScope}, - } -``` - -... and then use the AuthCodeURL, Exchange, and Client methods on it. -For an example, see: https://godoc.org/golang.org/x/oauth2#example-Config - -For the redirect URL, see -https://developers.google.com/identity/protocols/OAuth2InstalledApp#choosingredirecturi - -### Service Accounts - -To use a Google service account, or the GCE metadata service, see -the [golang.org/x/oauth2/google](https://godoc.org/golang.org/x/oauth2/google) package. -In particular, see [google.DefaultClient](https://godoc.org/golang.org/x/oauth2/google#DefaultClient). - -### Using API Keys - -Some APIs require passing API keys from your application. -To do this, you can use -[transport.APIKey](https://godoc.org/google.golang.org/api/googleapi/transport#APIKey): - -```go - ctx := context.WithValue(context.Background(), oauth2.HTTPClient, &http.Client{ - Transport: &transport.APIKey{Key: developerKey}, - }) - oauthConfig := &oauth2.Config{ .... } - var token *oauth2.Token = .... // via cache, or oauthConfig.Exchange - httpClient := oauthConfig.Client(ctx, token) - svc, err := urlshortener.New(httpClient) - ... -``` - -## Using the Service - -Each service contains zero or more methods and zero or more sub-services. -The sub-services related to a specific type of "Resource". - -Those sub-services then contain their own methods. - -For instance, the urlshortener API has just the "Url" sub-service: - -```go - url, err := svc.Url.Get(shortURL).Do() - if err != nil { - ... - } - fmt.Printf("The URL %s goes to %s\n", shortURL, url.LongUrl) -``` - -For a more complete example, see -[urlshortener.go](https://github.com/google/google-api-go-client/tree/master/examples/urlshortener.go) -in the [examples directory](https://github.com/google/google-api-go-client/tree/master/examples/). -(the examples use some functions in `main.go` in the same directory) diff --git a/vendor/google.golang.org/api/NOTES b/vendor/google.golang.org/api/NOTES deleted file mode 100644 index 571f6ec..0000000 --- a/vendor/google.golang.org/api/NOTES +++ /dev/null @@ -1,13 +0,0 @@ -Discovery Service: -https://developers.google.com/discovery/ -https://developers.google.com/discovery/v1/reference/ - -The "type" key: -http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.1 - -The "format" key: -http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.23 -https://developers.google.com/discovery/v1/type-format - -Google JSON format docs: -http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml diff --git a/vendor/google.golang.org/api/README.md b/vendor/google.golang.org/api/README.md deleted file mode 100644 index 097d330..0000000 --- a/vendor/google.golang.org/api/README.md +++ /dev/null @@ -1,108 +0,0 @@ -# Google APIs Client Library for Go - -## Getting Started - -``` -$ go get google.golang.org/api/tasks/v1 -$ go get google.golang.org/api/moderator/v1 -$ go get google.golang.org/api/urlshortener/v1 -... etc ... -``` - -and using: - -```go -package main - -import ( - "net/http" - - "google.golang.org/api/urlshortener/v1" -) - -func main() { - svc, err := urlshortener.New(http.DefaultClient) - // ... -} -``` - -* For a longer tutorial, see the [Getting Started guide](https://github.com/google/google-api-go-client/blob/master/GettingStarted.md). -* For examples, see the [examples directory](https://github.com/google/google-api-go-client/tree/master/examples). -* For support, use the [golang-nuts](https://groups.google.com/group/golang-nuts) mailing list. - -## Status -[![Build Status](https://travis-ci.org/google/google-api-go-client.png)](https://travis-ci.org/google/google-api-go-client) -[![GoDoc](https://godoc.org/google.golang.org/api?status.svg)](https://godoc.org/google.golang.org/api) - -These are auto-generated Go libraries from the Google Discovery Service's JSON description files of the available "new style" Google APIs. - -Due to the auto-generated nature of this collection of libraries, complete APIs or specific versions can appear or go away without notice. -As a result, you should always locally vendor any API(s) that your code relies upon. - -This client library is supported, but in maintenance mode only. -We are fixing necessary bugs and adding essential features to ensure this -library continues to meet your needs for accessing Google APIs. -Non-critical issues will be closed. -Any issue may be reopened if it is causing ongoing problems. - -If you're working with Google Cloud Platform APIs such as Datastore or Pub/Sub, -consider using the -[Cloud Client Libraries for Go](https://github.com/GoogleCloudPlatform/google-cloud-go) -instead. These are the new and -idiomatic Go libraries targeted specifically at Google Cloud Platform Services. - -The generator itself and the code it produces are beta. Some APIs are -alpha/beta, and indicated as such in the import path (e.g., -"google.golang.org/api/someapi/v1alpha"). - -## Application Default Credentials Example - -Application Default Credentials provide a simplified way to obtain credentials -for authenticating with Google APIs. - -The Application Default Credentials authenticate as the application itself, -which make them great for working with Google Cloud APIs like Storage or -Datastore. They are the recommended form of authentication when building -applications that run on Google Compute Engine or Google App Engine. - -Default credentials are provided by the `golang.org/x/oauth2/google` package. To use them, add the following import: - -```go -import "golang.org/x/oauth2/google" -``` - -Some credentials types require you to specify scopes, and service entry points may not inject them. If you encounter this situation you may need to specify scopes as follows: - -```go -import ( - "golang.org/x/net/context" - "golang.org/x/oauth2/google" - "google.golang.org/api/compute/v1" -) - -func main() { - // Use oauth2.NoContext if there isn't a good context to pass in. - ctx := context.Background() - - client, err := google.DefaultClient(ctx, compute.ComputeScope) - if err != nil { - //... - } - computeService, err := compute.New(client) - if err != nil { - //... - } -} -``` - -If you need a `oauth2.TokenSource`, use the `DefaultTokenSource` function: - -```go -ts, err := google.DefaultTokenSource(ctx, scope1, scope2, ...) -if err != nil { - //... -} -client := oauth2.NewClient(ctx, ts) -``` - -See also: [golang.org/x/oauth2/google](https://godoc.org/golang.org/x/oauth2/google) package documentation. diff --git a/vendor/google.golang.org/api/TODO b/vendor/google.golang.org/api/TODO deleted file mode 100644 index de2467c..0000000 --- a/vendor/google.golang.org/api/TODO +++ /dev/null @@ -1,2 +0,0 @@ -Moved to: -https://github.com/google/google-api-go-client/issues diff --git a/vendor/google.golang.org/api/api-list.json b/vendor/google.golang.org/api/api-list.json deleted file mode 100644 index f6b4a42..0000000 --- a/vendor/google.golang.org/api/api-list.json +++ /dev/null @@ -1,3119 +0,0 @@ -{ - "kind": "discovery#directoryList", - "discoveryVersion": "v1", - "items": [ - { - "kind": "discovery#directoryItem", - "id": "abusiveexperiencereport:v1", - "name": "abusiveexperiencereport", - "version": "v1", - "title": "Google Abusive Experience Report API", - "description": "View Abusive Experience Report data, and get a list of sites that have a significant number of abusive experiences.", - "discoveryRestUrl": "https://abusiveexperiencereport.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/abusive-experience-report/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "acceleratedmobilepageurl:v1", - "name": "acceleratedmobilepageurl", - "version": "v1", - "title": "Accelerated Mobile Pages (AMP) URL API", - "description": "This API contains a single method, batchGet. Call this method to retrieve the AMP URL (and equivalent AMP Cache URL) for given public URL(s).", - "discoveryRestUrl": "https://acceleratedmobilepageurl.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/amp/cache/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "adexchangebuyer:v1.2", - "name": "adexchangebuyer", - "version": "v1.2", - "title": "Ad Exchange Buyer API", - "description": "Accesses your bidding-account information, submits creatives for validation, finds available direct deals, and retrieves performance reports.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adexchangebuyer/v1.2/rest", - "discoveryLink": "./apis/adexchangebuyer/v1.2/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif", - "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif" - }, - "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "adexchangebuyer:v1.3", - "name": "adexchangebuyer", - "version": "v1.3", - "title": "Ad Exchange Buyer API", - "description": "Accesses your bidding-account information, submits creatives for validation, finds available direct deals, and retrieves performance reports.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adexchangebuyer/v1.3/rest", - "discoveryLink": "./apis/adexchangebuyer/v1.3/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif", - "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif" - }, - "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "adexchangebuyer:v1.4", - "name": "adexchangebuyer", - "version": "v1.4", - "title": "Ad Exchange Buyer API", - "description": "Accesses your bidding-account information, submits creatives for validation, finds available direct deals, and retrieves performance reports.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adexchangebuyer/v1.4/rest", - "discoveryLink": "./apis/adexchangebuyer/v1.4/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif", - "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif" - }, - "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "adexchangebuyer2:v2beta1", - "name": "adexchangebuyer2", - "version": "v2beta1", - "title": "Ad Exchange Buyer API II", - "description": "Accesses the latest features for managing Ad Exchange accounts, Real-Time Bidding configurations and auction metrics, and Marketplace programmatic deals.", - "discoveryRestUrl": "https://adexchangebuyer.googleapis.com/$discovery/rest?version=v2beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest/reference/rest/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "adexchangeseller:v1", - "name": "adexchangeseller", - "version": "v1", - "title": "Ad Exchange Seller API", - "description": "Accesses the inventory of Ad Exchange seller users and generates reports.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adexchangeseller/v1/rest", - "discoveryLink": "./apis/adexchangeseller/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif", - "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif" - }, - "documentationLink": "https://developers.google.com/ad-exchange/seller-rest/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "adexchangeseller:v1.1", - "name": "adexchangeseller", - "version": "v1.1", - "title": "Ad Exchange Seller API", - "description": "Accesses the inventory of Ad Exchange seller users and generates reports.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adexchangeseller/v1.1/rest", - "discoveryLink": "./apis/adexchangeseller/v1.1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif", - "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif" - }, - "documentationLink": "https://developers.google.com/ad-exchange/seller-rest/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "adexchangeseller:v2.0", - "name": "adexchangeseller", - "version": "v2.0", - "title": "Ad Exchange Seller API", - "description": "Accesses the inventory of Ad Exchange seller users and generates reports.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adexchangeseller/v2.0/rest", - "discoveryLink": "./apis/adexchangeseller/v2.0/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif", - "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif" - }, - "documentationLink": "https://developers.google.com/ad-exchange/seller-rest/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "adexperiencereport:v1", - "name": "adexperiencereport", - "version": "v1", - "title": "Google Ad Experience Report API", - "description": "View Ad Experience Report data, and get a list of sites that have a significant number of annoying ads.", - "discoveryRestUrl": "https://adexperiencereport.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/ad-experience-report/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "admin:datatransfer_v1", - "name": "admin", - "version": "datatransfer_v1", - "title": "Admin Data Transfer API", - "description": "Transfers user data from one user to another.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/admin/datatransfer_v1/rest", - "discoveryLink": "./apis/admin/datatransfer_v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/admin-sdk/data-transfer/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "admin:directory_v1", - "name": "admin", - "version": "directory_v1", - "title": "Admin Directory API", - "description": "The Admin SDK Directory API lets you view and manage enterprise resources such as users and groups, administrative notifications, security features, and more.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/admin/directory_v1/rest", - "discoveryLink": "./apis/admin/directory_v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/admin-sdk/directory/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "admin:reports_v1", - "name": "admin", - "version": "reports_v1", - "title": "Admin Reports API", - "description": "Fetches reports for the administrators of G Suite customers about the usage, collaboration, security, and risk for their users.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/admin/reports_v1/rest", - "discoveryLink": "./apis/admin/reports_v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/admin-sdk/reports/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "adsense:v1.4", - "name": "adsense", - "version": "v1.4", - "title": "AdSense Management API", - "description": "Accesses AdSense publishers' inventory and generates performance reports.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adsense/v1.4/rest", - "discoveryLink": "./apis/adsense/v1.4/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/adsense-16.png", - "x32": "https://www.google.com/images/icons/product/adsense-32.png" - }, - "documentationLink": "https://developers.google.com/adsense/management/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "adsensehost:v4.1", - "name": "adsensehost", - "version": "v4.1", - "title": "AdSense Host API", - "description": "Generates performance reports, generates ad codes, and provides publisher management capabilities for AdSense Hosts.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adsensehost/v4.1/rest", - "discoveryLink": "./apis/adsensehost/v4.1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/adsense-16.png", - "x32": "https://www.google.com/images/icons/product/adsense-32.png" - }, - "documentationLink": "https://developers.google.com/adsense/host/", - "labels": [ - "limited_availability" - ], - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "analytics:v2.4", - "name": "analytics", - "version": "v2.4", - "title": "Google Analytics API", - "description": "Views and manages your Google Analytics data.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/analytics/v2.4/rest", - "discoveryLink": "./apis/analytics/v2.4/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/analytics-16.png", - "x32": "https://www.google.com/images/icons/product/analytics-32.png" - }, - "documentationLink": "https://developers.google.com/analytics/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "analytics:v3", - "name": "analytics", - "version": "v3", - "title": "Google Analytics API", - "description": "Views and manages your Google Analytics data.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/analytics/v3/rest", - "discoveryLink": "./apis/analytics/v3/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/analytics-16.png", - "x32": "https://www.google.com/images/icons/product/analytics-32.png" - }, - "documentationLink": "https://developers.google.com/analytics/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "analyticsreporting:v4", - "name": "analyticsreporting", - "version": "v4", - "title": "Google Analytics Reporting API", - "description": "Accesses Analytics report data.", - "discoveryRestUrl": "https://analyticsreporting.googleapis.com/$discovery/rest?version=v4", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/analytics/devguides/reporting/core/v4/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "androiddeviceprovisioning:v1", - "name": "androiddeviceprovisioning", - "version": "v1", - "title": "Android Device Provisioning Partner API", - "description": "Automates reseller integration into zero-touch enrollment by assigning devices to customers and creating device reports.", - "discoveryRestUrl": "https://androiddeviceprovisioning.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/zero-touch/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "androidenterprise:v1", - "name": "androidenterprise", - "version": "v1", - "title": "Google Play EMM API", - "description": "Manages the deployment of apps to Android for Work users.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/androidenterprise/v1/rest", - "discoveryLink": "./apis/androidenterprise/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/android-16.png", - "x32": "https://www.google.com/images/icons/product/android-32.png" - }, - "documentationLink": "https://developers.google.com/android/work/play/emm-api", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "androidmanagement:v1", - "name": "androidmanagement", - "version": "v1", - "title": "Android Management API", - "description": "The Android Management API provides remote enterprise management of Android devices and apps.", - "discoveryRestUrl": "https://androidmanagement.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/android/management", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "androidpublisher:v1", - "name": "androidpublisher", - "version": "v1", - "title": "Google Play Developer API", - "description": "Lets Android application developers access their Google Play accounts.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/androidpublisher/v1/rest", - "discoveryLink": "./apis/androidpublisher/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/android-16.png", - "x32": "https://www.google.com/images/icons/product/android-32.png" - }, - "documentationLink": "https://developers.google.com/android-publisher", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "androidpublisher:v1.1", - "name": "androidpublisher", - "version": "v1.1", - "title": "Google Play Developer API", - "description": "Lets Android application developers access their Google Play accounts.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/androidpublisher/v1.1/rest", - "discoveryLink": "./apis/androidpublisher/v1.1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/android-16.png", - "x32": "https://www.google.com/images/icons/product/android-32.png" - }, - "documentationLink": "https://developers.google.com/android-publisher", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "androidpublisher:v2", - "name": "androidpublisher", - "version": "v2", - "title": "Google Play Developer API", - "description": "Lets Android application developers access their Google Play accounts.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/androidpublisher/v2/rest", - "discoveryLink": "./apis/androidpublisher/v2/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/android-16.png", - "x32": "https://www.google.com/images/icons/product/android-32.png" - }, - "documentationLink": "https://developers.google.com/android-publisher", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "appengine:v1alpha", - "name": "appengine", - "version": "v1alpha", - "title": "Google App Engine Admin API", - "description": "The App Engine Admin API enables developers to provision and manage their App Engine applications.", - "discoveryRestUrl": "https://appengine.googleapis.com/$discovery/rest?version=v1alpha", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/appengine/docs/admin-api/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "appengine:v1beta", - "name": "appengine", - "version": "v1beta", - "title": "Google App Engine Admin API", - "description": "The App Engine Admin API enables developers to provision and manage their App Engine applications.", - "discoveryRestUrl": "https://appengine.googleapis.com/$discovery/rest?version=v1beta", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/appengine/docs/admin-api/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "appengine:v1", - "name": "appengine", - "version": "v1", - "title": "Google App Engine Admin API", - "description": "The App Engine Admin API enables developers to provision and manage their App Engine applications.", - "discoveryRestUrl": "https://appengine.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/appengine/docs/admin-api/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "appengine:v1beta4", - "name": "appengine", - "version": "v1beta4", - "title": "Google App Engine Admin API", - "description": "The App Engine Admin API enables developers to provision and manage their App Engine applications.", - "discoveryRestUrl": "https://appengine.googleapis.com/$discovery/rest?version=v1beta4", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/appengine/docs/admin-api/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "appengine:v1beta5", - "name": "appengine", - "version": "v1beta5", - "title": "Google App Engine Admin API", - "description": "The App Engine Admin API enables developers to provision and manage their App Engine applications.", - "discoveryRestUrl": "https://appengine.googleapis.com/$discovery/rest?version=v1beta5", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/appengine/docs/admin-api/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "appsactivity:v1", - "name": "appsactivity", - "version": "v1", - "title": "G Suite Activity API", - "description": "Provides a historical view of activity.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/appsactivity/v1/rest", - "discoveryLink": "./apis/appsactivity/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/google-apps/activity/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "appstate:v1", - "name": "appstate", - "version": "v1", - "title": "Google App State API", - "description": "The Google App State API.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/appstate/v1/rest", - "discoveryLink": "./apis/appstate/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/games/services/web/api/states", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "bigquery:v2", - "name": "bigquery", - "version": "v2", - "title": "BigQuery API", - "description": "A data platform for customers to create, manage, share and query data.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/bigquery/v2/rest", - "discoveryLink": "./apis/bigquery/v2/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/search-16.gif", - "x32": "https://www.google.com/images/icons/product/search-32.gif" - }, - "documentationLink": "https://cloud.google.com/bigquery/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "bigquerydatatransfer:v1", - "name": "bigquerydatatransfer", - "version": "v1", - "title": "BigQuery Data Transfer API", - "description": "Transfers data from partner SaaS applications to Google BigQuery on a scheduled, managed basis.", - "discoveryRestUrl": "https://bigquerydatatransfer.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/bigquery/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "blogger:v2", - "name": "blogger", - "version": "v2", - "title": "Blogger API", - "description": "API for access to the data within Blogger.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/blogger/v2/rest", - "discoveryLink": "./apis/blogger/v2/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/blogger-16.png", - "x32": "https://www.google.com/images/icons/product/blogger-32.png" - }, - "documentationLink": "https://developers.google.com/blogger/docs/2.0/json/getting_started", - "labels": [ - "limited_availability" - ], - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "blogger:v3", - "name": "blogger", - "version": "v3", - "title": "Blogger API", - "description": "API for access to the data within Blogger.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/blogger/v3/rest", - "discoveryLink": "./apis/blogger/v3/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/blogger-16.png", - "x32": "https://www.google.com/images/icons/product/blogger-32.png" - }, - "documentationLink": "https://developers.google.com/blogger/docs/3.0/getting_started", - "labels": [ - "limited_availability" - ], - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "books:v1", - "name": "books", - "version": "v1", - "title": "Books API", - "description": "Searches for books and manages your Google Books library.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/books/v1/rest", - "discoveryLink": "./apis/books/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/ebooks-16.png", - "x32": "https://www.google.com/images/icons/product/ebooks-32.png" - }, - "documentationLink": "https://developers.google.com/books/docs/v1/getting_started", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "calendar:v3", - "name": "calendar", - "version": "v3", - "title": "Calendar API", - "description": "Manipulates events and other calendar data.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest", - "discoveryLink": "./apis/calendar/v3/rest", - "icons": { - "x16": "http://www.google.com/images/icons/product/calendar-16.png", - "x32": "http://www.google.com/images/icons/product/calendar-32.png" - }, - "documentationLink": "https://developers.google.com/google-apps/calendar/firstapp", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "chat:v1", - "name": "chat", - "version": "v1", - "title": "Hangouts Chat API", - "description": "Create bots and extend the new Hangouts Chat.", - "discoveryRestUrl": "https://chat.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/hangouts/chat", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "civicinfo:v2", - "name": "civicinfo", - "version": "v2", - "title": "Google Civic Information API", - "description": "Provides polling places, early vote locations, contest data, election officials, and government representatives for U.S. residential addresses.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/civicinfo/v2/rest", - "discoveryLink": "./apis/civicinfo/v2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/civic-information", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "classroom:v1", - "name": "classroom", - "version": "v1", - "title": "Google Classroom API", - "description": "Manages classes, rosters, and invitations in Google Classroom.", - "discoveryRestUrl": "https://classroom.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/classroom", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "cloudbilling:v1", - "name": "cloudbilling", - "version": "v1", - "title": "Cloud Billing API", - "description": "Allows developers to manage billing for their Google Cloud Platform projects programmatically.", - "discoveryRestUrl": "https://cloudbilling.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/billing/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "cloudbuild:v1", - "name": "cloudbuild", - "version": "v1", - "title": "Cloud Container Builder API", - "description": "Builds container images in the cloud.", - "discoveryRestUrl": "https://cloudbuild.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/container-builder/docs/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "clouddebugger:v2", - "name": "clouddebugger", - "version": "v2", - "title": "Stackdriver Debugger API", - "description": "Examines the call stack and variables of a running application without stopping or slowing it down.", - "discoveryRestUrl": "https://clouddebugger.googleapis.com/$discovery/rest?version=v2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "http://cloud.google.com/debugger", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "clouderrorreporting:v1beta1", - "name": "clouderrorreporting", - "version": "v1beta1", - "title": "Stackdriver Error Reporting API", - "description": "Groups and counts similar errors from cloud services and applications, reports new errors, and provides access to error groups and their associated errors.", - "discoveryRestUrl": "https://clouderrorreporting.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/error-reporting/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "cloudfunctions:v2alpha1", - "name": "cloudfunctions", - "version": "v2alpha1", - "title": "Google Cloud Functions API", - "description": "API for managing lightweight user-provided functions executed in response to events.", - "discoveryRestUrl": "https://cloudfunctions.googleapis.com/$discovery/rest?version=v2alpha1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/functions", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "cloudfunctions:v1", - "name": "cloudfunctions", - "version": "v1", - "title": "Google Cloud Functions API", - "description": "API for managing lightweight user-provided functions executed in response to events.", - "discoveryRestUrl": "https://cloudfunctions.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/functions", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "cloudfunctions:v1beta2", - "name": "cloudfunctions", - "version": "v1beta2", - "title": "Google Cloud Functions API", - "description": "API for managing lightweight user-provided functions executed in response to events.", - "discoveryRestUrl": "https://cloudfunctions.googleapis.com/$discovery/rest?version=v1beta2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/functions", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "cloudiot:v1", - "name": "cloudiot", - "version": "v1", - "title": "Cloud IoT API", - "description": "Registers and manages IoT (Internet of Things) devices that connect to the Google Cloud Platform.", - "discoveryRestUrl": "https://cloudiot.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/iot", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "cloudiot:v1beta1", - "name": "cloudiot", - "version": "v1beta1", - "title": "Cloud IoT API", - "description": "Registers and manages IoT (Internet of Things) devices that connect to the Google Cloud Platform.", - "discoveryRestUrl": "https://cloudiot.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/iot", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "cloudkms:v1", - "name": "cloudkms", - "version": "v1", - "title": "Google Cloud Key Management Service (KMS) API", - "description": "Manages encryption for your cloud services the same way you do on-premises. You can generate, use, rotate, and destroy AES256 encryption keys.", - "discoveryRestUrl": "https://cloudkms.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/kms/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "cloudresourcemanager:v1", - "name": "cloudresourcemanager", - "version": "v1", - "title": "Cloud Resource Manager API", - "description": "The Google Cloud Resource Manager API provides methods for creating, reading, and updating project metadata.", - "discoveryRestUrl": "https://cloudresourcemanager.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/resource-manager", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "cloudresourcemanager:v1beta1", - "name": "cloudresourcemanager", - "version": "v1beta1", - "title": "Cloud Resource Manager API", - "description": "The Google Cloud Resource Manager API provides methods for creating, reading, and updating project metadata.", - "discoveryRestUrl": "https://cloudresourcemanager.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/resource-manager", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "cloudresourcemanager:v2", - "name": "cloudresourcemanager", - "version": "v2", - "title": "Cloud Resource Manager API", - "description": "The Google Cloud Resource Manager API provides methods for creating, reading, and updating project metadata.", - "discoveryRestUrl": "https://cloudresourcemanager.googleapis.com/$discovery/rest?version=v2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/resource-manager", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "cloudresourcemanager:v2beta1", - "name": "cloudresourcemanager", - "version": "v2beta1", - "title": "Cloud Resource Manager API", - "description": "The Google Cloud Resource Manager API provides methods for creating, reading, and updating project metadata.", - "discoveryRestUrl": "https://cloudresourcemanager.googleapis.com/$discovery/rest?version=v2beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/resource-manager", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "cloudshell:v1alpha1", - "name": "cloudshell", - "version": "v1alpha1", - "title": "Cloud Shell API", - "description": "", - "discoveryRestUrl": "https://cloudshell.googleapis.com/$discovery/rest?version=v1alpha1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/shell/docs/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "cloudshell:v1", - "name": "cloudshell", - "version": "v1", - "title": "Cloud Shell API", - "description": "", - "discoveryRestUrl": "https://cloudshell.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/shell/docs/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "cloudtasks:v2beta2", - "name": "cloudtasks", - "version": "v2beta2", - "title": "Cloud Tasks API", - "description": "Manages the execution of large numbers of distributed requests. Cloud Tasks is in Alpha.", - "discoveryRestUrl": "https://cloudtasks.googleapis.com/$discovery/rest?version=v2beta2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/cloud-tasks/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "cloudtrace:v1", - "name": "cloudtrace", - "version": "v1", - "title": "Stackdriver Trace API", - "description": "Sends application trace data to Stackdriver Trace for viewing. Trace data is collected for all App Engine applications by default. Trace data from other applications can be provided using this API.", - "discoveryRestUrl": "https://cloudtrace.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/trace", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "cloudtrace:v2", - "name": "cloudtrace", - "version": "v2", - "title": "Stackdriver Trace API", - "description": "Sends application trace data to Stackdriver Trace for viewing. Trace data is collected for all App Engine applications by default. Trace data from other applications can be provided using this API.", - "discoveryRestUrl": "https://cloudtrace.googleapis.com/$discovery/rest?version=v2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/trace", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "clouduseraccounts:alpha", - "name": "clouduseraccounts", - "version": "alpha", - "title": "Cloud User Accounts API", - "description": "Creates and manages users and groups for accessing Google Compute Engine virtual machines.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/clouduseraccounts/alpha/rest", - "discoveryLink": "./apis/clouduseraccounts/alpha/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/compute_engine-16.png", - "x32": "https://www.google.com/images/icons/product/compute_engine-32.png" - }, - "documentationLink": "https://cloud.google.com/compute/docs/access/user-accounts/api/latest/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "clouduseraccounts:beta", - "name": "clouduseraccounts", - "version": "beta", - "title": "Cloud User Accounts API", - "description": "Creates and manages users and groups for accessing Google Compute Engine virtual machines.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/clouduseraccounts/beta/rest", - "discoveryLink": "./apis/clouduseraccounts/beta/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/compute_engine-16.png", - "x32": "https://www.google.com/images/icons/product/compute_engine-32.png" - }, - "documentationLink": "https://cloud.google.com/compute/docs/access/user-accounts/api/latest/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "clouduseraccounts:vm_alpha", - "name": "clouduseraccounts", - "version": "vm_alpha", - "title": "Cloud User Accounts API", - "description": "Creates and manages users and groups for accessing Google Compute Engine virtual machines.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/clouduseraccounts/vm_alpha/rest", - "discoveryLink": "./apis/clouduseraccounts/vm_alpha/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/compute_engine-16.png", - "x32": "https://www.google.com/images/icons/product/compute_engine-32.png" - }, - "documentationLink": "https://cloud.google.com/compute/docs/access/user-accounts/api/latest/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "clouduseraccounts:vm_beta", - "name": "clouduseraccounts", - "version": "vm_beta", - "title": "Cloud User Accounts API", - "description": "Creates and manages users and groups for accessing Google Compute Engine virtual machines.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/clouduseraccounts/vm_beta/rest", - "discoveryLink": "./apis/clouduseraccounts/vm_beta/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/compute_engine-16.png", - "x32": "https://www.google.com/images/icons/product/compute_engine-32.png" - }, - "documentationLink": "https://cloud.google.com/compute/docs/access/user-accounts/api/latest/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "compute:alpha", - "name": "compute", - "version": "alpha", - "title": "Compute Engine API", - "description": "Creates and runs virtual machines on Google Cloud Platform.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/compute/alpha/rest", - "discoveryLink": "./apis/compute/alpha/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/compute_engine-16.png", - "x32": "https://www.google.com/images/icons/product/compute_engine-32.png" - }, - "documentationLink": "https://developers.google.com/compute/docs/reference/latest/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "compute:beta", - "name": "compute", - "version": "beta", - "title": "Compute Engine API", - "description": "Creates and runs virtual machines on Google Cloud Platform.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/compute/beta/rest", - "discoveryLink": "./apis/compute/beta/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/compute_engine-16.png", - "x32": "https://www.google.com/images/icons/product/compute_engine-32.png" - }, - "documentationLink": "https://developers.google.com/compute/docs/reference/latest/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "compute:v1", - "name": "compute", - "version": "v1", - "title": "Compute Engine API", - "description": "Creates and runs virtual machines on Google Cloud Platform.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/compute/v1/rest", - "discoveryLink": "./apis/compute/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/compute_engine-16.png", - "x32": "https://www.google.com/images/icons/product/compute_engine-32.png" - }, - "documentationLink": "https://developers.google.com/compute/docs/reference/latest/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "container:v1", - "name": "container", - "version": "v1", - "title": "Google Kubernetes Engine API", - "description": "The Google Kubernetes Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.", - "discoveryRestUrl": "https://container.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/container-engine/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "container:v1beta1", - "name": "container", - "version": "v1beta1", - "title": "Google Kubernetes Engine API", - "description": "The Google Kubernetes Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.", - "discoveryRestUrl": "https://container.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/container-engine/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "content:v2sandbox", - "name": "content", - "version": "v2sandbox", - "title": "Content API for Shopping", - "description": "Manages product items, inventory, and Merchant Center accounts for Google Shopping.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/content/v2sandbox/rest", - "discoveryLink": "./apis/content/v2sandbox/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/shopping-content", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "content:v2", - "name": "content", - "version": "v2", - "title": "Content API for Shopping", - "description": "Manages product items, inventory, and Merchant Center accounts for Google Shopping.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/content/v2/rest", - "discoveryLink": "./apis/content/v2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/shopping-content", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "customsearch:v1", - "name": "customsearch", - "version": "v1", - "title": "CustomSearch API", - "description": "Searches over a website or collection of websites", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/customsearch/v1/rest", - "discoveryLink": "./apis/customsearch/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/custom-search/v1/using_rest", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "dataflow:v1b3", - "name": "dataflow", - "version": "v1b3", - "title": "Dataflow API", - "description": "Manages Google Cloud Dataflow projects on Google Cloud Platform.", - "discoveryRestUrl": "https://dataflow.googleapis.com/$discovery/rest?version=v1b3", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/dataflow", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "dataproc:v1", - "name": "dataproc", - "version": "v1", - "title": "Google Cloud Dataproc API", - "description": "Manages Hadoop-based clusters and jobs on Google Cloud Platform.", - "discoveryRestUrl": "https://dataproc.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/dataproc/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "dataproc:v1beta2", - "name": "dataproc", - "version": "v1beta2", - "title": "Google Cloud Dataproc API", - "description": "Manages Hadoop-based clusters and jobs on Google Cloud Platform.", - "discoveryRestUrl": "https://dataproc.googleapis.com/$discovery/rest?version=v1beta2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/dataproc/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "datastore:v1", - "name": "datastore", - "version": "v1", - "title": "Google Cloud Datastore API", - "description": "Accesses the schemaless NoSQL database to provide fully managed, robust, scalable storage for your application.", - "discoveryRestUrl": "https://datastore.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/datastore/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "datastore:v1beta1", - "name": "datastore", - "version": "v1beta1", - "title": "Google Cloud Datastore API", - "description": "Accesses the schemaless NoSQL database to provide fully managed, robust, scalable storage for your application.", - "discoveryRestUrl": "https://datastore.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/datastore/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "datastore:v1beta3", - "name": "datastore", - "version": "v1beta3", - "title": "Google Cloud Datastore API", - "description": "Accesses the schemaless NoSQL database to provide fully managed, robust, scalable storage for your application.", - "discoveryRestUrl": "https://datastore.googleapis.com/$discovery/rest?version=v1beta3", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/datastore/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "deploymentmanager:alpha", - "name": "deploymentmanager", - "version": "alpha", - "title": "Google Cloud Deployment Manager Alpha API", - "description": "The Deployment Manager API allows users to declaratively configure, deploy and run complex solutions on the Google Cloud Platform.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/deploymentmanager/alpha/rest", - "discoveryLink": "./apis/deploymentmanager/alpha/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/deployment-manager/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "deploymentmanager:v2beta", - "name": "deploymentmanager", - "version": "v2beta", - "title": "Google Cloud Deployment Manager API V2Beta Methods", - "description": "The Deployment Manager API allows users to declaratively configure, deploy and run complex solutions on the Google Cloud Platform.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/deploymentmanager/v2beta/rest", - "discoveryLink": "./apis/deploymentmanager/v2beta/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/deployment-manager/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "deploymentmanager:v2", - "name": "deploymentmanager", - "version": "v2", - "title": "Google Cloud Deployment Manager API", - "description": "Declares, configures, and deploys complex solutions on Google Cloud Platform.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/deploymentmanager/v2/rest", - "discoveryLink": "./apis/deploymentmanager/v2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/deployment-manager/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "dfareporting:v2.8", - "name": "dfareporting", - "version": "v2.8", - "title": "DCM/DFA Reporting And Trafficking API", - "description": "Manages your DoubleClick Campaign Manager ad campaigns and reports.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dfareporting/v2.8/rest", - "discoveryLink": "./apis/dfareporting/v2.8/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif", - "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif" - }, - "documentationLink": "https://developers.google.com/doubleclick-advertisers/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "dfareporting:v3.0", - "name": "dfareporting", - "version": "v3.0", - "title": "DCM/DFA Reporting And Trafficking API", - "description": "Manages your DoubleClick Campaign Manager ad campaigns and reports.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dfareporting/v3.0/rest", - "discoveryLink": "./apis/dfareporting/v3.0/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif", - "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif" - }, - "documentationLink": "https://developers.google.com/doubleclick-advertisers/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "dialogflow:v2beta1", - "name": "dialogflow", - "version": "v2beta1", - "title": "Dialogflow API", - "description": "An end-to-end development suite for conversational interfaces (e.g., chatbots, voice-powered apps and devices).", - "discoveryRestUrl": "https://dialogflow.googleapis.com/$discovery/rest?version=v2beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/dialogflow-enterprise/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "digitalassetlinks:v1", - "name": "digitalassetlinks", - "version": "v1", - "title": "Digital Asset Links API", - "description": "API for discovering relationships between online assets such as web sites or mobile apps.", - "discoveryRestUrl": "https://digitalassetlinks.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/digital-asset-links/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "discovery:v1", - "name": "discovery", - "version": "v1", - "title": "APIs Discovery Service", - "description": "Provides information about other Google APIs, such as what APIs are available, the resource, and method details for each API.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/discovery/v1/rest", - "discoveryLink": "./apis/discovery/v1/rest", - "icons": { - "x16": "http://www.google.com/images/icons/feature/filing_cabinet_search-g16.png", - "x32": "http://www.google.com/images/icons/feature/filing_cabinet_search-g32.png" - }, - "documentationLink": "https://developers.google.com/discovery/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "dlp:v2beta1", - "name": "dlp", - "version": "v2beta1", - "title": "DLP API", - "description": "The Google Data Loss Prevention API provides methods for detection of privacy-sensitive fragments in text, images, and Google Cloud Platform storage repositories.", - "discoveryRestUrl": "https://dlp.googleapis.com/$discovery/rest?version=v2beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/dlp/docs/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "dlp:v2beta2", - "name": "dlp", - "version": "v2beta2", - "title": "DLP API", - "description": "The Google Data Loss Prevention API provides methods for detection of privacy-sensitive fragments in text, images, and Google Cloud Platform storage repositories.", - "discoveryRestUrl": "https://dlp.googleapis.com/$discovery/rest?version=v2beta2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/dlp/docs/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "dns:v1", - "name": "dns", - "version": "v1", - "title": "Google Cloud DNS API", - "description": "Configures and serves authoritative DNS records.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dns/v1/rest", - "discoveryLink": "./apis/dns/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/cloud-dns", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "dns:v1beta2", - "name": "dns", - "version": "v1beta2", - "title": "Google Cloud DNS API", - "description": "Configures and serves authoritative DNS records.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dns/v1beta2/rest", - "discoveryLink": "./apis/dns/v1beta2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/cloud-dns", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "dns:v2beta1", - "name": "dns", - "version": "v2beta1", - "title": "Google Cloud DNS API", - "description": "Configures and serves authoritative DNS records.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dns/v2beta1/rest", - "discoveryLink": "./apis/dns/v2beta1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/cloud-dns", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "doubleclickbidmanager:v1", - "name": "doubleclickbidmanager", - "version": "v1", - "title": "DoubleClick Bid Manager API", - "description": "API for viewing and managing your reports in DoubleClick Bid Manager.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/doubleclickbidmanager/v1/rest", - "discoveryLink": "./apis/doubleclickbidmanager/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/bid-manager/", - "labels": [ - "limited_availability" - ], - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "doubleclicksearch:v2", - "name": "doubleclicksearch", - "version": "v2", - "title": "DoubleClick Search API", - "description": "Reports and modifies your advertising data in DoubleClick Search (for example, campaigns, ad groups, keywords, and conversions).", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/doubleclicksearch/v2/rest", - "discoveryLink": "./apis/doubleclicksearch/v2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/doubleclick-search/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "drive:v2", - "name": "drive", - "version": "v2", - "title": "Drive API", - "description": "Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/drive/v2/rest", - "discoveryLink": "./apis/drive/v2/rest", - "icons": { - "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png", - "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png" - }, - "documentationLink": "https://developers.google.com/drive/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "drive:v3", - "name": "drive", - "version": "v3", - "title": "Drive API", - "description": "Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/drive/v3/rest", - "discoveryLink": "./apis/drive/v3/rest", - "icons": { - "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png", - "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png" - }, - "documentationLink": "https://developers.google.com/drive/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "firebasedynamiclinks:v1", - "name": "firebasedynamiclinks", - "version": "v1", - "title": "Firebase Dynamic Links API", - "description": "Programmatically creates and manages Firebase Dynamic Links.", - "discoveryRestUrl": "https://firebasedynamiclinks.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://firebase.google.com/docs/dynamic-links/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "firebaserules:v1", - "name": "firebaserules", - "version": "v1", - "title": "Firebase Rules API", - "description": "Creates and manages rules that determine when a Firebase Rules-enabled service should permit a request.", - "discoveryRestUrl": "https://firebaserules.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://firebase.google.com/docs/storage/security", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "firestore:v1beta1", - "name": "firestore", - "version": "v1beta1", - "title": "Google Cloud Firestore API", - "description": "", - "discoveryRestUrl": "https://firestore.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/firestore", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "fitness:v1", - "name": "fitness", - "version": "v1", - "title": "Fitness", - "description": "Stores and accesses user data in the fitness store from apps on any platform.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/fitness/v1/rest", - "discoveryLink": "./apis/fitness/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/fit/rest/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "fusiontables:v1", - "name": "fusiontables", - "version": "v1", - "title": "Fusion Tables API", - "description": "API for working with Fusion Tables data.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/fusiontables/v1/rest", - "discoveryLink": "./apis/fusiontables/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/fusiontables", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "fusiontables:v2", - "name": "fusiontables", - "version": "v2", - "title": "Fusion Tables API", - "description": "API for working with Fusion Tables data.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/fusiontables/v2/rest", - "discoveryLink": "./apis/fusiontables/v2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/fusiontables", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "games:v1", - "name": "games", - "version": "v1", - "title": "Google Play Game Services API", - "description": "The API for Google Play Game Services.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/games/v1/rest", - "discoveryLink": "./apis/games/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/games/services/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "gamesConfiguration:v1configuration", - "name": "gamesConfiguration", - "version": "v1configuration", - "title": "Google Play Game Services Publishing API", - "description": "The Publishing API for Google Play Game Services.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/gamesConfiguration/v1configuration/rest", - "discoveryLink": "./apis/gamesConfiguration/v1configuration/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/games/services", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "gamesManagement:v1management", - "name": "gamesManagement", - "version": "v1management", - "title": "Google Play Game Services Management API", - "description": "The Management API for Google Play Game Services.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/gamesManagement/v1management/rest", - "discoveryLink": "./apis/gamesManagement/v1management/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/games/services", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "genomics:v1alpha2", - "name": "genomics", - "version": "v1alpha2", - "title": "Genomics API", - "description": "Upload, process, query, and search Genomics data in the cloud.", - "discoveryRestUrl": "https://genomics.googleapis.com/$discovery/rest?version=v1alpha2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/genomics", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "genomics:v2alpha1", - "name": "genomics", - "version": "v2alpha1", - "title": "Genomics API", - "description": "Upload, process, query, and search Genomics data in the cloud.", - "discoveryRestUrl": "https://genomics.googleapis.com/$discovery/rest?version=v2alpha1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/genomics", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "genomics:v1", - "name": "genomics", - "version": "v1", - "title": "Genomics API", - "description": "Upload, process, query, and search Genomics data in the cloud.", - "discoveryRestUrl": "https://genomics.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/genomics", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "gmail:v1", - "name": "gmail", - "version": "v1", - "title": "Gmail API", - "description": "Access Gmail mailboxes including sending user email.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest", - "discoveryLink": "./apis/gmail/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/googlemail-16.png", - "x32": "https://www.google.com/images/icons/product/googlemail-32.png" - }, - "documentationLink": "https://developers.google.com/gmail/api/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "groupsmigration:v1", - "name": "groupsmigration", - "version": "v1", - "title": "Groups Migration API", - "description": "Groups Migration Api.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/groupsmigration/v1/rest", - "discoveryLink": "./apis/groupsmigration/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/discussions-16.gif", - "x32": "https://www.google.com/images/icons/product/discussions-32.gif" - }, - "documentationLink": "https://developers.google.com/google-apps/groups-migration/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "groupssettings:v1", - "name": "groupssettings", - "version": "v1", - "title": "Groups Settings API", - "description": "Lets you manage permission levels and related settings of a group.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/groupssettings/v1/rest", - "discoveryLink": "./apis/groupssettings/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/google-apps/groups-settings/get_started", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "iam:v1", - "name": "iam", - "version": "v1", - "title": "Google Identity and Access Management (IAM) API", - "description": "Manages identity and access control for Google Cloud Platform resources, including the creation of service accounts, which you can use to authenticate to Google and make API calls.", - "discoveryRestUrl": "https://iam.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/iam/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "identitytoolkit:v3", - "name": "identitytoolkit", - "version": "v3", - "title": "Google Identity Toolkit API", - "description": "Help the third party sites to implement federated login.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/identitytoolkit/v3/rest", - "discoveryLink": "./apis/identitytoolkit/v3/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/identity-toolkit/v3/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "kgsearch:v1", - "name": "kgsearch", - "version": "v1", - "title": "Knowledge Graph Search API", - "description": "Searches the Google Knowledge Graph for entities.", - "discoveryRestUrl": "https://kgsearch.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/knowledge-graph/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "language:v1", - "name": "language", - "version": "v1", - "title": "Cloud Natural Language API", - "description": "Provides natural language understanding technologies to developers. Examples include sentiment analysis, entity recognition, entity sentiment analysis, and text annotations.", - "discoveryRestUrl": "https://language.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/natural-language/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "language:v1beta1", - "name": "language", - "version": "v1beta1", - "title": "Cloud Natural Language API", - "description": "Provides natural language understanding technologies to developers. Examples include sentiment analysis, entity recognition, entity sentiment analysis, and text annotations.", - "discoveryRestUrl": "https://language.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/natural-language/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "language:v1beta2", - "name": "language", - "version": "v1beta2", - "title": "Cloud Natural Language API", - "description": "Provides natural language understanding technologies to developers. Examples include sentiment analysis, entity recognition, entity sentiment analysis, and text annotations.", - "discoveryRestUrl": "https://language.googleapis.com/$discovery/rest?version=v1beta2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/natural-language/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "licensing:v1", - "name": "licensing", - "version": "v1", - "title": "Enterprise License Manager API", - "description": "Views and manages licenses for your domain.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/licensing/v1/rest", - "discoveryLink": "./apis/licensing/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/google-apps/licensing/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "logging:v2", - "name": "logging", - "version": "v2", - "title": "Stackdriver Logging API", - "description": "Writes log entries and manages your Stackdriver Logging configuration.", - "discoveryRestUrl": "https://logging.googleapis.com/$discovery/rest?version=v2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/logging/docs/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "logging:v2beta1", - "name": "logging", - "version": "v2beta1", - "title": "Stackdriver Logging API", - "description": "Writes log entries and manages your Stackdriver Logging configuration.", - "discoveryRestUrl": "https://logging.googleapis.com/$discovery/rest?version=v2beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/logging/docs/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "manufacturers:v1", - "name": "manufacturers", - "version": "v1", - "title": "Manufacturer Center API", - "description": "Public API for managing Manufacturer Center related data.", - "discoveryRestUrl": "https://manufacturers.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/manufacturers/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "mirror:v1", - "name": "mirror", - "version": "v1", - "title": "Google Mirror API", - "description": "Interacts with Glass users via the timeline.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/mirror/v1/rest", - "discoveryLink": "./apis/mirror/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/glass", - "labels": [ - "limited_availability" - ], - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "ml:v1", - "name": "ml", - "version": "v1", - "title": "Google Cloud Machine Learning Engine", - "description": "An API to enable creating and using machine learning models.", - "discoveryRestUrl": "https://ml.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/ml/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "monitoring:v3", - "name": "monitoring", - "version": "v3", - "title": "Stackdriver Monitoring API", - "description": "Manages your Stackdriver Monitoring data and configurations. Most projects must be associated with a Stackdriver account, with a few exceptions as noted on the individual method pages.", - "discoveryRestUrl": "https://monitoring.googleapis.com/$discovery/rest?version=v3", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/monitoring/api/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "oauth2:v1", - "name": "oauth2", - "version": "v1", - "title": "Google OAuth2 API", - "description": "Obtains end-user authorization grants for use with other Google APIs.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/oauth2/v1/rest", - "discoveryLink": "./apis/oauth2/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/accounts/docs/OAuth2", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "oauth2:v2", - "name": "oauth2", - "version": "v2", - "title": "Google OAuth2 API", - "description": "Obtains end-user authorization grants for use with other Google APIs.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/oauth2/v2/rest", - "discoveryLink": "./apis/oauth2/v2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/accounts/docs/OAuth2", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "oslogin:v1alpha", - "name": "oslogin", - "version": "v1alpha", - "title": "Google Cloud OS Login API", - "description": "Manages OS login configuration for Google account users.", - "discoveryRestUrl": "https://oslogin.googleapis.com/$discovery/rest?version=v1alpha", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/compute/docs/oslogin/rest/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "oslogin:v1beta", - "name": "oslogin", - "version": "v1beta", - "title": "Google Cloud OS Login API", - "description": "Manages OS login configuration for Google account users.", - "discoveryRestUrl": "https://oslogin.googleapis.com/$discovery/rest?version=v1beta", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/compute/docs/oslogin/rest/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "oslogin:v1", - "name": "oslogin", - "version": "v1", - "title": "Google Cloud OS Login API", - "description": "Manages OS login configuration for Google account users.", - "discoveryRestUrl": "https://oslogin.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/compute/docs/oslogin/rest/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "pagespeedonline:v1", - "name": "pagespeedonline", - "version": "v1", - "title": "PageSpeed Insights API", - "description": "Analyzes the performance of a web page and provides tailored suggestions to make that page faster.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/pagespeedonline/v1/rest", - "discoveryLink": "./apis/pagespeedonline/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/pagespeed-16.png", - "x32": "https://www.google.com/images/icons/product/pagespeed-32.png" - }, - "documentationLink": "https://developers.google.com/speed/docs/insights/v1/getting_started", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "pagespeedonline:v2", - "name": "pagespeedonline", - "version": "v2", - "title": "PageSpeed Insights API", - "description": "Analyzes the performance of a web page and provides tailored suggestions to make that page faster.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/pagespeedonline/v2/rest", - "discoveryLink": "./apis/pagespeedonline/v2/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/pagespeed-16.png", - "x32": "https://www.google.com/images/icons/product/pagespeed-32.png" - }, - "documentationLink": "https://developers.google.com/speed/docs/insights/v2/getting-started", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "pagespeedonline:v4", - "name": "pagespeedonline", - "version": "v4", - "title": "PageSpeed Insights API", - "description": "Analyzes the performance of a web page and provides tailored suggestions to make that page faster.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/pagespeedonline/v4/rest", - "discoveryLink": "./apis/pagespeedonline/v4/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/pagespeed-16.png", - "x32": "https://www.google.com/images/icons/product/pagespeed-32.png" - }, - "documentationLink": "https://developers.google.com/speed/docs/insights/v4/getting-started", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "partners:v2", - "name": "partners", - "version": "v2", - "title": "Google Partners API", - "description": "Searches certified companies and creates contact leads with them, and also audits the usage of clients.", - "discoveryRestUrl": "https://partners.googleapis.com/$discovery/rest?version=v2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/partners/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "people:v1", - "name": "people", - "version": "v1", - "title": "People API", - "description": "Provides access to information about profiles and contacts.", - "discoveryRestUrl": "https://people.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/people/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "playcustomapp:v1", - "name": "playcustomapp", - "version": "v1", - "title": "Google Play Custom App Publishing API", - "description": "An API to publish custom Android apps.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/playcustomapp/v1/rest", - "discoveryLink": "./apis/playcustomapp/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/android/work/play/custom-app-api", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "plus:v1", - "name": "plus", - "version": "v1", - "title": "Google+ API", - "description": "Builds on top of the Google+ platform.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/plus/v1/rest", - "discoveryLink": "./apis/plus/v1/rest", - "icons": { - "x16": "http://www.google.com/images/icons/product/gplus-16.png", - "x32": "http://www.google.com/images/icons/product/gplus-32.png" - }, - "documentationLink": "https://developers.google.com/+/api/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "plusDomains:v1", - "name": "plusDomains", - "version": "v1", - "title": "Google+ Domains API", - "description": "Builds on top of the Google+ platform for Google Apps Domains.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/plusDomains/v1/rest", - "discoveryLink": "./apis/plusDomains/v1/rest", - "icons": { - "x16": "http://www.google.com/images/icons/product/gplus-16.png", - "x32": "http://www.google.com/images/icons/product/gplus-32.png" - }, - "documentationLink": "https://developers.google.com/+/domains/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "poly:v1", - "name": "poly", - "version": "v1", - "title": "Poly API", - "description": "The Poly API provides read-only access to assets hosted on poly.google.com.", - "discoveryRestUrl": "https://poly.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/poly/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "prediction:v1.2", - "name": "prediction", - "version": "v1.2", - "title": "Prediction API", - "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/prediction/v1.2/rest", - "discoveryLink": "./apis/prediction/v1.2/rest", - "icons": { - "x16": "https://www.google.com/images/icons/feature/predictionapi-16.png", - "x32": "https://www.google.com/images/icons/feature/predictionapi-32.png" - }, - "documentationLink": "https://developers.google.com/prediction/docs/developer-guide", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "prediction:v1.3", - "name": "prediction", - "version": "v1.3", - "title": "Prediction API", - "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/prediction/v1.3/rest", - "discoveryLink": "./apis/prediction/v1.3/rest", - "icons": { - "x16": "https://www.google.com/images/icons/feature/predictionapi-16.png", - "x32": "https://www.google.com/images/icons/feature/predictionapi-32.png" - }, - "documentationLink": "https://developers.google.com/prediction/docs/developer-guide", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "prediction:v1.4", - "name": "prediction", - "version": "v1.4", - "title": "Prediction API", - "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/prediction/v1.4/rest", - "discoveryLink": "./apis/prediction/v1.4/rest", - "icons": { - "x16": "https://www.google.com/images/icons/feature/predictionapi-16.png", - "x32": "https://www.google.com/images/icons/feature/predictionapi-32.png" - }, - "documentationLink": "https://developers.google.com/prediction/docs/developer-guide", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "prediction:v1.5", - "name": "prediction", - "version": "v1.5", - "title": "Prediction API", - "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/prediction/v1.5/rest", - "discoveryLink": "./apis/prediction/v1.5/rest", - "icons": { - "x16": "https://www.google.com/images/icons/feature/predictionapi-16.png", - "x32": "https://www.google.com/images/icons/feature/predictionapi-32.png" - }, - "documentationLink": "https://developers.google.com/prediction/docs/developer-guide", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "prediction:v1.6", - "name": "prediction", - "version": "v1.6", - "title": "Prediction API", - "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/prediction/v1.6/rest", - "discoveryLink": "./apis/prediction/v1.6/rest", - "icons": { - "x16": "https://www.google.com/images/icons/feature/predictionapi-16.png", - "x32": "https://www.google.com/images/icons/feature/predictionapi-32.png" - }, - "documentationLink": "https://developers.google.com/prediction/docs/developer-guide", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "proximitybeacon:v1beta1", - "name": "proximitybeacon", - "version": "v1beta1", - "title": "Google Proximity Beacon API", - "description": "Registers, manages, indexes, and searches beacons.", - "discoveryRestUrl": "https://proximitybeacon.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/beacons/proximity/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "pubsub:v1beta1a", - "name": "pubsub", - "version": "v1beta1a", - "title": "Google Cloud Pub/Sub API", - "description": "Provides reliable, many-to-many, asynchronous messaging between applications.", - "discoveryRestUrl": "https://pubsub.googleapis.com/$discovery/rest?version=v1beta1a", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/pubsub/docs", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "pubsub:v1", - "name": "pubsub", - "version": "v1", - "title": "Google Cloud Pub/Sub API", - "description": "Provides reliable, many-to-many, asynchronous messaging between applications.", - "discoveryRestUrl": "https://pubsub.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/pubsub/docs", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "pubsub:v1beta2", - "name": "pubsub", - "version": "v1beta2", - "title": "Google Cloud Pub/Sub API", - "description": "Provides reliable, many-to-many, asynchronous messaging between applications.", - "discoveryRestUrl": "https://pubsub.googleapis.com/$discovery/rest?version=v1beta2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/pubsub/docs", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "replicapool:v1beta1", - "name": "replicapool", - "version": "v1beta1", - "title": "Replica Pool API", - "description": "The Replica Pool API allows users to declaratively provision and manage groups of Google Compute Engine instances based on a common template.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/replicapool/v1beta1/rest", - "discoveryLink": "./apis/replicapool/v1beta1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/compute/docs/replica-pool/", - "labels": [ - "limited_availability" - ], - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "replicapool:v1beta2", - "name": "replicapool", - "version": "v1beta2", - "title": "Google Compute Engine Instance Group Manager API", - "description": "[Deprecated. Please use Instance Group Manager in Compute API] Provides groups of homogenous Compute Engine instances.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/replicapool/v1beta2/rest", - "discoveryLink": "./apis/replicapool/v1beta2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/compute/docs/instance-groups/manager/v1beta2", - "labels": [ - "limited_availability" - ], - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "replicapoolupdater:v1beta1", - "name": "replicapoolupdater", - "version": "v1beta1", - "title": "Google Compute Engine Instance Group Updater API", - "description": "[Deprecated. Please use compute.instanceGroupManagers.update method. replicapoolupdater API will be disabled after December 30th, 2016] Updates groups of Compute Engine instances.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/replicapoolupdater/v1beta1/rest", - "discoveryLink": "./apis/replicapoolupdater/v1beta1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/compute/docs/instance-groups/manager/#applying_rolling_updates_using_the_updater_service", - "labels": [ - "limited_availability" - ], - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "reseller:v1", - "name": "reseller", - "version": "v1", - "title": "Enterprise Apps Reseller API", - "description": "Creates and manages your customers and their subscriptions.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/reseller/v1/rest", - "discoveryLink": "./apis/reseller/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/google-apps/reseller/", - "labels": [ - "limited_availability" - ], - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "resourceviews:v1beta1", - "name": "resourceviews", - "version": "v1beta1", - "title": "Resource Views API", - "description": "The Resource View API allows users to create and manage logical sets of Google Compute Engine instances.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/resourceviews/v1beta1/rest", - "discoveryLink": "./apis/resourceviews/v1beta1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/compute/", - "labels": [ - "limited_availability" - ], - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "resourceviews:v1beta2", - "name": "resourceviews", - "version": "v1beta2", - "title": "Google Compute Engine Instance Groups API", - "description": "The Resource View API allows users to create and manage logical sets of Google Compute Engine instances.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/resourceviews/v1beta2/rest", - "discoveryLink": "./apis/resourceviews/v1beta2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/compute/", - "labels": [ - "limited_availability" - ], - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "runtimeconfig:v1", - "name": "runtimeconfig", - "version": "v1", - "title": "Google Cloud Runtime Configuration API", - "description": "The Runtime Configurator allows you to dynamically configure and expose variables through Google Cloud Platform. In addition, you can also set Watchers and Waiters that will watch for changes to your data and return based on certain conditions.", - "discoveryRestUrl": "https://runtimeconfig.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/deployment-manager/runtime-configurator/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "runtimeconfig:v1beta1", - "name": "runtimeconfig", - "version": "v1beta1", - "title": "Google Cloud Runtime Configuration API", - "description": "The Runtime Configurator allows you to dynamically configure and expose variables through Google Cloud Platform. In addition, you can also set Watchers and Waiters that will watch for changes to your data and return based on certain conditions.", - "discoveryRestUrl": "https://runtimeconfig.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/deployment-manager/runtime-configurator/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "safebrowsing:v4", - "name": "safebrowsing", - "version": "v4", - "title": "Google Safe Browsing API", - "description": "Enables client applications to check web resources (most commonly URLs) against Google-generated lists of unsafe web resources.", - "discoveryRestUrl": "https://safebrowsing.googleapis.com/$discovery/rest?version=v4", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/safe-browsing/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "script:v1", - "name": "script", - "version": "v1", - "title": "Google Apps Script API", - "description": "An API for managing and executing Google Apps Script projects.", - "discoveryRestUrl": "https://script.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/apps-script/api/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "searchconsole:v1", - "name": "searchconsole", - "version": "v1", - "title": "Google Search Console URL Testing Tools API", - "description": "Provides tools for running validation tests against single URLs", - "discoveryRestUrl": "https://searchconsole.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/webmaster-tools/search-console-api/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "serviceconsumermanagement:v1", - "name": "serviceconsumermanagement", - "version": "v1", - "title": "Service Consumer Management API", - "description": "Provides management methods for configuring service producer resources on Google Cloud.", - "discoveryRestUrl": "https://serviceconsumermanagement.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/service-consumer-management/docs/overview", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "servicecontrol:v1", - "name": "servicecontrol", - "version": "v1", - "title": "Google Service Control API", - "description": "Google Service Control provides control plane functionality to managed services, such as logging, monitoring, and status checks.", - "discoveryRestUrl": "https://servicecontrol.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/service-control/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "servicemanagement:v1", - "name": "servicemanagement", - "version": "v1", - "title": "Google Service Management API", - "description": "Google Service Management allows service producers to publish their services on Google Cloud Platform so that they can be discovered and used by service consumers.", - "discoveryRestUrl": "https://servicemanagement.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/service-management/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "serviceusage:v1beta1", - "name": "serviceusage", - "version": "v1beta1", - "title": "Service Usage API", - "description": "Enables services that service consumers want to use on Google Cloud Platform, lists the available or enabled services, or disables services that service consumers no longer use.", - "discoveryRestUrl": "https://serviceusage.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/service-usage/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "serviceuser:v1", - "name": "serviceuser", - "version": "v1", - "title": "Google Service User API", - "description": "Enables services that service consumers want to use on Google Cloud Platform, lists the available or enabled services, or disables services that service consumers no longer use.", - "discoveryRestUrl": "https://serviceuser.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/service-management/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "sheets:v4", - "name": "sheets", - "version": "v4", - "title": "Google Sheets API", - "description": "Reads and writes Google Sheets.", - "discoveryRestUrl": "https://sheets.googleapis.com/$discovery/rest?version=v4", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/sheets/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "siteVerification:v1", - "name": "siteVerification", - "version": "v1", - "title": "Google Site Verification API", - "description": "Verifies ownership of websites or domains with Google.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/siteVerification/v1/rest", - "discoveryLink": "./apis/siteVerification/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/site-verification/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "slides:v1", - "name": "slides", - "version": "v1", - "title": "Google Slides API", - "description": "An API for creating and editing Google Slides presentations.", - "discoveryRestUrl": "https://slides.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/slides/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "sourcerepo:v1", - "name": "sourcerepo", - "version": "v1", - "title": "Cloud Source Repositories API", - "description": "Access source code repositories hosted by Google.", - "discoveryRestUrl": "https://sourcerepo.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/source-repositories/docs/apis", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "spanner:v1", - "name": "spanner", - "version": "v1", - "title": "Cloud Spanner API", - "description": "Cloud Spanner is a managed, mission-critical, globally consistent and scalable relational database service.", - "discoveryRestUrl": "https://spanner.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/spanner/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "spectrum:v1explorer", - "name": "spectrum", - "version": "v1explorer", - "title": "Google Spectrum Database API", - "description": "API for spectrum-management functions.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/spectrum/v1explorer/rest", - "discoveryLink": "./apis/spectrum/v1explorer/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "http://developers.google.com/spectrum", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "speech:v1", - "name": "speech", - "version": "v1", - "title": "Cloud Speech API", - "description": "Converts audio to text by applying powerful neural network models.", - "discoveryRestUrl": "https://speech.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/speech/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "speech:v1beta1", - "name": "speech", - "version": "v1beta1", - "title": "Cloud Speech API", - "description": "Converts audio to text by applying powerful neural network models.", - "discoveryRestUrl": "https://speech.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/speech/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "sqladmin:v1beta3", - "name": "sqladmin", - "version": "v1beta3", - "title": "Cloud SQL Administration API", - "description": "Creates and configures Cloud SQL instances, which provide fully-managed MySQL databases.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/sqladmin/v1beta3/rest", - "discoveryLink": "./apis/sqladmin/v1beta3/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/sql/docs/reference/latest", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "sqladmin:v1beta4", - "name": "sqladmin", - "version": "v1beta4", - "title": "Cloud SQL Administration API", - "description": "Creates and configures Cloud SQL instances, which provide fully-managed MySQL databases.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/sqladmin/v1beta4/rest", - "discoveryLink": "./apis/sqladmin/v1beta4/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/sql/docs/reference/latest", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "storage:v1", - "name": "storage", - "version": "v1", - "title": "Cloud Storage JSON API", - "description": "Stores and retrieves potentially large, immutable data objects.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/storage/v1/rest", - "discoveryLink": "./apis/storage/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png", - "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png" - }, - "documentationLink": "https://developers.google.com/storage/docs/json_api/", - "labels": [ - "labs" - ], - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "storage:v1beta1", - "name": "storage", - "version": "v1beta1", - "title": "Cloud Storage JSON API", - "description": "Lets you store and retrieve potentially-large, immutable data objects.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/storage/v1beta1/rest", - "discoveryLink": "./apis/storage/v1beta1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png", - "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png" - }, - "documentationLink": "https://developers.google.com/storage/docs/json_api/", - "labels": [ - "labs" - ], - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "storage:v1beta2", - "name": "storage", - "version": "v1beta2", - "title": "Cloud Storage JSON API", - "description": "Lets you store and retrieve potentially-large, immutable data objects.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/storage/v1beta2/rest", - "discoveryLink": "./apis/storage/v1beta2/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png", - "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png" - }, - "documentationLink": "https://developers.google.com/storage/docs/json_api/", - "labels": [ - "labs" - ], - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "storagetransfer:v1", - "name": "storagetransfer", - "version": "v1", - "title": "Google Storage Transfer API", - "description": "Transfers data from external data sources to a Google Cloud Storage bucket or between Google Cloud Storage buckets.", - "discoveryRestUrl": "https://storagetransfer.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/storage/transfer", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "streetviewpublish:v1", - "name": "streetviewpublish", - "version": "v1", - "title": "Street View Publish API", - "description": "Publishes 360 photos to Google Maps, along with position, orientation, and connectivity metadata. Apps can offer an interface for positioning, connecting, and uploading user-generated Street View images.", - "discoveryRestUrl": "https://streetviewpublish.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/streetview/publish/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "surveys:v2", - "name": "surveys", - "version": "v2", - "title": "Surveys API", - "description": "Creates and conducts surveys, lists the surveys that an authenticated user owns, and retrieves survey results and information about specified surveys.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/surveys/v2/rest", - "discoveryLink": "./apis/surveys/v2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "tagmanager:v1", - "name": "tagmanager", - "version": "v1", - "title": "Tag Manager API", - "description": "Accesses Tag Manager accounts and containers.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/tagmanager/v1/rest", - "discoveryLink": "./apis/tagmanager/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/tag-manager/api/v1/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "tagmanager:v2", - "name": "tagmanager", - "version": "v2", - "title": "Tag Manager API", - "description": "Accesses Tag Manager accounts and containers.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/tagmanager/v2/rest", - "discoveryLink": "./apis/tagmanager/v2/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/tag-manager/api/v2/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "taskqueue:v1beta1", - "name": "taskqueue", - "version": "v1beta1", - "title": "TaskQueue API", - "description": "Accesses a Google App Engine Pull Task Queue over REST.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/taskqueue/v1beta1/rest", - "discoveryLink": "./apis/taskqueue/v1beta1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/app_engine-16.png", - "x32": "https://www.google.com/images/icons/product/app_engine-32.png" - }, - "documentationLink": "https://developers.google.com/appengine/docs/python/taskqueue/rest", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "taskqueue:v1beta2", - "name": "taskqueue", - "version": "v1beta2", - "title": "TaskQueue API", - "description": "Accesses a Google App Engine Pull Task Queue over REST.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/taskqueue/v1beta2/rest", - "discoveryLink": "./apis/taskqueue/v1beta2/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/app_engine-16.png", - "x32": "https://www.google.com/images/icons/product/app_engine-32.png" - }, - "documentationLink": "https://developers.google.com/appengine/docs/python/taskqueue/rest", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "tasks:v1", - "name": "tasks", - "version": "v1", - "title": "Tasks API", - "description": "Lets you manage your tasks and task lists.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/tasks/v1/rest", - "discoveryLink": "./apis/tasks/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/tasks-16.png", - "x32": "https://www.google.com/images/icons/product/tasks-32.png" - }, - "documentationLink": "https://developers.google.com/google-apps/tasks/firstapp", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "testing:v1", - "name": "testing", - "version": "v1", - "title": "Google Cloud Testing API", - "description": "Allows developers to run automated tests for their mobile applications on Google infrastructure.", - "discoveryRestUrl": "https://testing.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/cloud-test-lab/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "toolresults:v1beta3", - "name": "toolresults", - "version": "v1beta3", - "title": "Cloud Tool Results API", - "description": "Reads and publishes results from Firebase Test Lab.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/toolresults/v1beta3/rest", - "discoveryLink": "./apis/toolresults/v1beta3/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://firebase.google.com/docs/test-lab/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "tpu:v1alpha1", - "name": "tpu", - "version": "v1alpha1", - "title": "Cloud TPU API", - "description": "TPU API provides customers with access to Google TPU technology.", - "discoveryRestUrl": "https://tpu.googleapis.com/$discovery/rest?version=v1alpha1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/tpu/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "translate:v2", - "name": "translate", - "version": "v2", - "title": "Google Cloud Translation API", - "description": "The Google Cloud Translation API lets websites and programs integrate with Google Translate programmatically.", - "discoveryRestUrl": "https://translation.googleapis.com/$discovery/rest?version=v2", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://code.google.com/apis/language/translate/v2/getting_started.html", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "urlshortener:v1", - "name": "urlshortener", - "version": "v1", - "title": "URL Shortener API", - "description": "Lets you create, inspect, and manage goo.gl short URLs", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/urlshortener/v1/rest", - "discoveryLink": "./apis/urlshortener/v1/rest", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/url-shortener/v1/getting_started", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "vault:v1", - "name": "vault", - "version": "v1", - "title": "Google Vault API", - "description": "Archiving and eDiscovery for G Suite.", - "discoveryRestUrl": "https://vault.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/vault", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "videointelligence:v1beta1", - "name": "videointelligence", - "version": "v1beta1", - "title": "Cloud Video Intelligence API", - "description": "Cloud Video Intelligence API.", - "discoveryRestUrl": "https://videointelligence.googleapis.com/$discovery/rest?version=v1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/video-intelligence/docs/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "vision:v1p1beta1", - "name": "vision", - "version": "v1p1beta1", - "title": "Google Cloud Vision API", - "description": "Integrates Google Vision features, including image labeling, face, logo, and landmark detection, optical character recognition (OCR), and detection of explicit content, into applications.", - "discoveryRestUrl": "https://vision.googleapis.com/$discovery/rest?version=v1p1beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/vision/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "vision:v1p2beta1", - "name": "vision", - "version": "v1p2beta1", - "title": "Google Cloud Vision API", - "description": "Integrates Google Vision features, including image labeling, face, logo, and landmark detection, optical character recognition (OCR), and detection of explicit content, into applications.", - "discoveryRestUrl": "https://vision.googleapis.com/$discovery/rest?version=v1p2beta1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/vision/", - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "vision:v1", - "name": "vision", - "version": "v1", - "title": "Google Cloud Vision API", - "description": "Integrates Google Vision features, including image labeling, face, logo, and landmark detection, optical character recognition (OCR), and detection of explicit content, into applications.", - "discoveryRestUrl": "https://vision.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://cloud.google.com/vision/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "webfonts:v1", - "name": "webfonts", - "version": "v1", - "title": "Google Fonts Developer API", - "description": "Accesses the metadata for all families served by Google Fonts, providing a list of families currently available (including available styles and a list of supported script subsets).", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/webfonts/v1/rest", - "discoveryLink": "./apis/webfonts/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/feature/font_api-16.png", - "x32": "https://www.google.com/images/icons/feature/font_api-32.gif" - }, - "documentationLink": "https://developers.google.com/fonts/docs/developer_api", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "webmasters:v3", - "name": "webmasters", - "version": "v3", - "title": "Search Console API", - "description": "View Google Search Console data for your verified sites.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/webmasters/v3/rest", - "discoveryLink": "./apis/webmasters/v3/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/webmaster_tools-16.png", - "x32": "https://www.google.com/images/icons/product/webmaster_tools-32.png" - }, - "documentationLink": "https://developers.google.com/webmaster-tools/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "youtube:v3", - "name": "youtube", - "version": "v3", - "title": "YouTube Data API", - "description": "Supports core YouTube features, such as uploading videos, creating and managing playlists, searching for content, and much more.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest", - "discoveryLink": "./apis/youtube/v3/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/youtube-16.png", - "x32": "https://www.google.com/images/icons/product/youtube-32.png" - }, - "documentationLink": "https://developers.google.com/youtube/v3", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "youtubeAnalytics:v1", - "name": "youtubeAnalytics", - "version": "v1", - "title": "YouTube Analytics API", - "description": "Retrieves your YouTube Analytics data.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/youtubeAnalytics/v1/rest", - "discoveryLink": "./apis/youtubeAnalytics/v1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/youtube-16.png", - "x32": "https://www.google.com/images/icons/product/youtube-32.png" - }, - "documentationLink": "http://developers.google.com/youtube/analytics/", - "preferred": true - }, - { - "kind": "discovery#directoryItem", - "id": "youtubeAnalytics:v1beta1", - "name": "youtubeAnalytics", - "version": "v1beta1", - "title": "YouTube Analytics API", - "description": "Retrieves your YouTube Analytics data.", - "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/youtubeAnalytics/v1beta1/rest", - "discoveryLink": "./apis/youtubeAnalytics/v1beta1/rest", - "icons": { - "x16": "https://www.google.com/images/icons/product/youtube-16.png", - "x32": "https://www.google.com/images/icons/product/youtube-32.png" - }, - "documentationLink": "http://developers.google.com/youtube/analytics/", - "labels": [ - "deprecated" - ], - "preferred": false - }, - { - "kind": "discovery#directoryItem", - "id": "youtubereporting:v1", - "name": "youtubereporting", - "version": "v1", - "title": "YouTube Reporting API", - "description": "Schedules reporting jobs containing your YouTube Analytics data and downloads the resulting bulk data reports in the form of CSV files.", - "discoveryRestUrl": "https://youtubereporting.googleapis.com/$discovery/rest?version=v1", - "icons": { - "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png", - "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png" - }, - "documentationLink": "https://developers.google.com/youtube/reporting/v1/reports/", - "preferred": true - } - ] -} diff --git a/vendor/google.golang.org/api/gensupport/backoff_test.go b/vendor/google.golang.org/api/gensupport/backoff_test.go deleted file mode 100644 index ef8296b..0000000 --- a/vendor/google.golang.org/api/gensupport/backoff_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gensupport - -import ( - "testing" - "time" -) - -func TestBackoff(t *testing.T) { - eb := &ExponentialBackoff{Base: time.Millisecond, Max: time.Second} - - var total time.Duration - for n, max := 0, 2*time.Millisecond; ; n, max = n+1, max*2 { - if n > 100 { - // There's less than 1 in 10^28 of taking longer than 100 iterations, - // so this is just to check we don't have an infinite loop. - t.Fatalf("Failed to timeout after 100 iterations.") - } - pause, retry := eb.Pause() - if !retry { - break - } - - if 0 > pause || pause >= max { - t.Errorf("Iteration %d: pause = %v; want in range [0, %v)", n, pause, max) - } - total += pause - } - - if total < time.Second { - t.Errorf("Total time = %v; want > %v", total, time.Second) - } -} diff --git a/vendor/google.golang.org/api/gensupport/buffer_test.go b/vendor/google.golang.org/api/gensupport/buffer_test.go deleted file mode 100644 index 15ccc04..0000000 --- a/vendor/google.golang.org/api/gensupport/buffer_test.go +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gensupport - -import ( - "bytes" - "io" - "io/ioutil" - "reflect" - "testing" - "testing/iotest" - - "google.golang.org/api/googleapi" -) - -// getChunkAsString reads a chunk from mb, but does not call Next. -func getChunkAsString(t *testing.T, mb *MediaBuffer) (string, error) { - chunk, _, size, err := mb.Chunk() - - buf, e := ioutil.ReadAll(chunk) - if e != nil { - t.Fatalf("Failed reading chunk: %v", e) - } - if size != len(buf) { - t.Fatalf("reported chunk size doesn't match actual chunk size: got: %v; want: %v", size, len(buf)) - } - return string(buf), err -} - -func TestChunking(t *testing.T) { - type testCase struct { - data string // the data to read from the Reader - finalErr error // error to return after data has been read - chunkSize int - wantChunks []string - } - - for _, singleByteReads := range []bool{true, false} { - for _, tc := range []testCase{ - { - data: "abcdefg", - finalErr: nil, - chunkSize: 3, - wantChunks: []string{"abc", "def", "g"}, - }, - { - data: "abcdefg", - finalErr: nil, - chunkSize: 1, - wantChunks: []string{"a", "b", "c", "d", "e", "f", "g"}, - }, - { - data: "abcdefg", - finalErr: nil, - chunkSize: 7, - wantChunks: []string{"abcdefg"}, - }, - { - data: "abcdefg", - finalErr: nil, - chunkSize: 8, - wantChunks: []string{"abcdefg"}, - }, - { - data: "abcdefg", - finalErr: io.ErrUnexpectedEOF, - chunkSize: 3, - wantChunks: []string{"abc", "def", "g"}, - }, - { - data: "abcdefg", - finalErr: io.ErrUnexpectedEOF, - chunkSize: 8, - wantChunks: []string{"abcdefg"}, - }, - } { - var r io.Reader = &errReader{buf: []byte(tc.data), err: tc.finalErr} - - if singleByteReads { - r = iotest.OneByteReader(r) - } - - mb := NewMediaBuffer(r, tc.chunkSize) - var gotErr error - got := []string{} - for { - chunk, err := getChunkAsString(t, mb) - if len(chunk) != 0 { - got = append(got, string(chunk)) - } - if err != nil { - gotErr = err - break - } - mb.Next() - } - - if !reflect.DeepEqual(got, tc.wantChunks) { - t.Errorf("Failed reading buffer: got: %v; want:%v", got, tc.wantChunks) - } - - expectedErr := tc.finalErr - if expectedErr == nil { - expectedErr = io.EOF - } - if gotErr != expectedErr { - t.Errorf("Reading buffer error: got: %v; want: %v", gotErr, expectedErr) - } - } - } -} - -func TestChunkCanBeReused(t *testing.T) { - er := &errReader{buf: []byte("abcdefg")} - mb := NewMediaBuffer(er, 3) - - // expectChunk reads a chunk and checks that it got what was wanted. - expectChunk := func(want string, wantErr error) { - got, err := getChunkAsString(t, mb) - if err != wantErr { - t.Errorf("error reading buffer: got: %v; want: %v", err, wantErr) - } - if !reflect.DeepEqual(got, want) { - t.Errorf("Failed reading buffer: got: %q; want:%q", got, want) - } - } - expectChunk("abc", nil) - // On second call, should get same chunk again. - expectChunk("abc", nil) - mb.Next() - expectChunk("def", nil) - expectChunk("def", nil) - mb.Next() - expectChunk("g", io.EOF) - expectChunk("g", io.EOF) - mb.Next() - expectChunk("", io.EOF) -} - -func TestPos(t *testing.T) { - er := &errReader{buf: []byte("abcdefg")} - mb := NewMediaBuffer(er, 3) - - expectChunkAtOffset := func(want int64, wantErr error) { - _, off, _, err := mb.Chunk() - if err != wantErr { - t.Errorf("error reading buffer: got: %v; want: %v", err, wantErr) - } - if got := off; got != want { - t.Errorf("resumable buffer Pos: got: %v; want: %v", got, want) - } - } - - // We expect the first chunk to be at offset 0. - expectChunkAtOffset(0, nil) - // Fetching the same chunk should return the same offset. - expectChunkAtOffset(0, nil) - - // Calling Next multiple times should only cause off to advance by 3, since off is not advanced until - // the chunk is actually read. - mb.Next() - mb.Next() - expectChunkAtOffset(3, nil) - - mb.Next() - - // Load the final 1-byte chunk. - expectChunkAtOffset(6, io.EOF) - - // Next will advance 1 byte. But there are no more chunks, so off will not increase beyond 7. - mb.Next() - expectChunkAtOffset(7, io.EOF) - mb.Next() - expectChunkAtOffset(7, io.EOF) -} - -// bytes.Reader implements both Reader and ReaderAt. The following types -// implement various combinations of Reader, ReaderAt and ContentTyper, by -// wrapping bytes.Reader. All implement at least ReaderAt, so they can be -// passed to ReaderAtToReader. The following table summarizes which types -// implement which interfaces: -// -// ReaderAt Reader ContentTyper -// reader x x -// typerReader x x x -// readerAt x -// typerReaderAt x x - -// reader implements Reader, in addition to ReaderAt. -type reader struct { - r *bytes.Reader -} - -func (r *reader) ReadAt(b []byte, off int64) (n int, err error) { - return r.r.ReadAt(b, off) -} - -func (r *reader) Read(b []byte) (n int, err error) { - return r.r.Read(b) -} - -// typerReader implements Reader and ContentTyper, in addition to ReaderAt. -type typerReader struct { - r *bytes.Reader -} - -func (tr *typerReader) ReadAt(b []byte, off int64) (n int, err error) { - return tr.r.ReadAt(b, off) -} - -func (tr *typerReader) Read(b []byte) (n int, err error) { - return tr.r.Read(b) -} - -func (tr *typerReader) ContentType() string { - return "ctype" -} - -// readerAt implements only ReaderAt. -type readerAt struct { - r *bytes.Reader -} - -func (ra *readerAt) ReadAt(b []byte, off int64) (n int, err error) { - return ra.r.ReadAt(b, off) -} - -// typerReaderAt implements ContentTyper, in addition to ReaderAt. -type typerReaderAt struct { - r *bytes.Reader -} - -func (tra *typerReaderAt) ReadAt(b []byte, off int64) (n int, err error) { - return tra.r.ReadAt(b, off) -} - -func (tra *typerReaderAt) ContentType() string { - return "ctype" -} - -func TestAdapter(t *testing.T) { - data := "abc" - - checkConversion := func(to io.Reader, wantTyper bool) { - if _, ok := to.(googleapi.ContentTyper); ok != wantTyper { - t.Errorf("reader implements typer? got: %v; want: %v", ok, wantTyper) - } - if typer, ok := to.(googleapi.ContentTyper); ok && typer.ContentType() != "ctype" { - t.Errorf("content type: got: %s; want: ctype", typer.ContentType()) - } - buf, err := ioutil.ReadAll(to) - if err != nil { - t.Errorf("error reading data: %v", err) - return - } - if !bytes.Equal(buf, []byte(data)) { - t.Errorf("failed reading data: got: %s; want: %s", buf, data) - } - } - - type testCase struct { - from io.ReaderAt - wantTyper bool - } - for _, tc := range []testCase{ - { - from: &reader{bytes.NewReader([]byte(data))}, - wantTyper: false, - }, - { - // Reader and ContentTyper - from: &typerReader{bytes.NewReader([]byte(data))}, - wantTyper: true, - }, - { - // ReaderAt - from: &readerAt{bytes.NewReader([]byte(data))}, - wantTyper: false, - }, - { - // ReaderAt and ContentTyper - from: &typerReaderAt{bytes.NewReader([]byte(data))}, - wantTyper: true, - }, - } { - to := ReaderAtToReader(tc.from, int64(len(data))) - checkConversion(to, tc.wantTyper) - // tc.from is a ReaderAt, and should be treated like one, even - // if it also implements Reader. Specifically, it can be - // reused and read from the beginning. - to = ReaderAtToReader(tc.from, int64(len(data))) - checkConversion(to, tc.wantTyper) - } -} diff --git a/vendor/google.golang.org/api/gensupport/header_test.go b/vendor/google.golang.org/api/gensupport/header_test.go deleted file mode 100644 index 8fdb863..0000000 --- a/vendor/google.golang.org/api/gensupport/header_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gensupport - -import ( - "fmt" - "runtime" - "strings" - "testing" -) - -func TestGoogleClientHeader(t *testing.T) { - const genVersion = "20170101" - gv := strings.Replace(runtime.Version(), " ", "_", -1) - got := GoogleClientHeader(genVersion, "gccl/xyz") - want := fmt.Sprintf("gl-go/%s gccl/xyz gdcl/%s", gv, genVersion) - if got != want { - t.Errorf("got %q, want %q", got, want) - } - - got = GoogleClientHeader(genVersion, "") - want = fmt.Sprintf("gl-go/%s gdcl/%s", gv, genVersion) - if got != want { - t.Errorf("got %q, want %q", got, want) - } -} diff --git a/vendor/google.golang.org/api/gensupport/json_test.go b/vendor/google.golang.org/api/gensupport/json_test.go deleted file mode 100644 index 6d83ead..0000000 --- a/vendor/google.golang.org/api/gensupport/json_test.go +++ /dev/null @@ -1,516 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gensupport - -import ( - "encoding/json" - "reflect" - "testing" - - "google.golang.org/api/googleapi" -) - -type schema struct { - // Basic types - B bool `json:"b,omitempty"` - F float64 `json:"f,omitempty"` - I int64 `json:"i,omitempty"` - Istr int64 `json:"istr,omitempty,string"` - Str string `json:"str,omitempty"` - - // Pointers to basic types - PB *bool `json:"pb,omitempty"` - PF *float64 `json:"pf,omitempty"` - PI *int64 `json:"pi,omitempty"` - PIStr *int64 `json:"pistr,omitempty,string"` - PStr *string `json:"pstr,omitempty"` - - // Other types - Int64s googleapi.Int64s `json:"i64s,omitempty"` - S []int `json:"s,omitempty"` - M map[string]string `json:"m,omitempty"` - Any interface{} `json:"any,omitempty"` - Child *child `json:"child,omitempty"` - MapToAnyArray map[string][]interface{} `json:"maptoanyarray,omitempty"` - - ForceSendFields []string `json:"-"` - NullFields []string `json:"-"` -} - -type child struct { - B bool `json:"childbool,omitempty"` -} - -type testCase struct { - s schema - want string -} - -func TestBasics(t *testing.T) { - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{ - ForceSendFields: []string{"B", "F", "I", "Istr", "Str", "PB", "PF", "PI", "PIStr", "PStr"}, - }, - want: `{"b":false,"f":0.0,"i":0,"istr":"0","str":""}`, - }, - { - s: schema{ - NullFields: []string{"B", "F", "I", "Istr", "Str", "PB", "PF", "PI", "PIStr", "PStr"}, - }, - want: `{"b":null,"f":null,"i":null,"istr":null,"str":null,"pb":null,"pf":null,"pi":null,"pistr":null,"pstr":null}`, - }, - { - s: schema{ - B: true, - F: 1.2, - I: 1, - Istr: 2, - Str: "a", - PB: googleapi.Bool(true), - PF: googleapi.Float64(1.2), - PI: googleapi.Int64(int64(1)), - PIStr: googleapi.Int64(int64(2)), - PStr: googleapi.String("a"), - }, - want: `{"b":true,"f":1.2,"i":1,"istr":"2","str":"a","pb":true,"pf":1.2,"pi":1,"pistr":"2","pstr":"a"}`, - }, - { - s: schema{ - B: false, - F: 0.0, - I: 0, - Istr: 0, - Str: "", - PB: googleapi.Bool(false), - PF: googleapi.Float64(0.0), - PI: googleapi.Int64(int64(0)), - PIStr: googleapi.Int64(int64(0)), - PStr: googleapi.String(""), - }, - want: `{"pb":false,"pf":0.0,"pi":0,"pistr":"0","pstr":""}`, - }, - { - s: schema{ - B: false, - F: 0.0, - I: 0, - Istr: 0, - Str: "", - PB: googleapi.Bool(false), - PF: googleapi.Float64(0.0), - PI: googleapi.Int64(int64(0)), - PIStr: googleapi.Int64(int64(0)), - PStr: googleapi.String(""), - ForceSendFields: []string{"B", "F", "I", "Istr", "Str", "PB", "PF", "PI", "PIStr", "PStr"}, - }, - want: `{"b":false,"f":0.0,"i":0,"istr":"0","str":"","pb":false,"pf":0.0,"pi":0,"pistr":"0","pstr":""}`, - }, - { - s: schema{ - B: false, - F: 0.0, - I: 0, - Istr: 0, - Str: "", - PB: googleapi.Bool(false), - PF: googleapi.Float64(0.0), - PI: googleapi.Int64(int64(0)), - PIStr: googleapi.Int64(int64(0)), - PStr: googleapi.String(""), - NullFields: []string{"B", "F", "I", "Istr", "Str"}, - }, - want: `{"b":null,"f":null,"i":null,"istr":null,"str":null,"pb":false,"pf":0.0,"pi":0,"pistr":"0","pstr":""}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -func TestSliceFields(t *testing.T) { - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{S: []int{}, Int64s: googleapi.Int64s{}}, - want: `{}`, - }, - { - s: schema{S: []int{1}, Int64s: googleapi.Int64s{1}}, - want: `{"s":[1],"i64s":["1"]}`, - }, - { - s: schema{ - ForceSendFields: []string{"S", "Int64s"}, - }, - want: `{"s":[],"i64s":[]}`, - }, - { - s: schema{ - S: []int{}, - Int64s: googleapi.Int64s{}, - ForceSendFields: []string{"S", "Int64s"}, - }, - want: `{"s":[],"i64s":[]}`, - }, - { - s: schema{ - S: []int{1}, - Int64s: googleapi.Int64s{1}, - ForceSendFields: []string{"S", "Int64s"}, - }, - want: `{"s":[1],"i64s":["1"]}`, - }, - { - s: schema{ - NullFields: []string{"S", "Int64s"}, - }, - want: `{"s":null,"i64s":null}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -func TestMapField(t *testing.T) { - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{M: make(map[string]string)}, - want: `{}`, - }, - { - s: schema{M: map[string]string{"a": "b"}}, - want: `{"m":{"a":"b"}}`, - }, - { - s: schema{ - ForceSendFields: []string{"M"}, - }, - want: `{"m":{}}`, - }, - { - s: schema{ - NullFields: []string{"M"}, - }, - want: `{"m":null}`, - }, - { - s: schema{ - M: make(map[string]string), - ForceSendFields: []string{"M"}, - }, - want: `{"m":{}}`, - }, - { - s: schema{ - M: make(map[string]string), - NullFields: []string{"M"}, - }, - want: `{"m":null}`, - }, - { - s: schema{ - M: map[string]string{"a": "b"}, - ForceSendFields: []string{"M"}, - }, - want: `{"m":{"a":"b"}}`, - }, - { - s: schema{ - M: map[string]string{"a": "b"}, - NullFields: []string{"M.a", "M."}, - }, - want: `{"m": {"a": null, "":null}}`, - }, - { - s: schema{ - M: map[string]string{"a": "b"}, - NullFields: []string{"M.c"}, - }, - want: `{"m": {"a": "b", "c": null}}`, - }, - { - s: schema{ - NullFields: []string{"M.a"}, - ForceSendFields: []string{"M"}, - }, - want: `{"m": {"a": null}}`, - }, - { - s: schema{ - NullFields: []string{"M.a"}, - }, - want: `{}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -func TestMapToAnyArray(t *testing.T) { - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{MapToAnyArray: make(map[string][]interface{})}, - want: `{}`, - }, - { - s: schema{ - MapToAnyArray: map[string][]interface{}{ - "a": []interface{}{2, "b"}, - }, - }, - want: `{"maptoanyarray":{"a":[2, "b"]}}`, - }, - { - s: schema{ - MapToAnyArray: map[string][]interface{}{ - "a": nil, - }, - }, - want: `{"maptoanyarray":{"a": null}}`, - }, - { - s: schema{ - MapToAnyArray: map[string][]interface{}{ - "a": []interface{}{nil}, - }, - }, - want: `{"maptoanyarray":{"a":[null]}}`, - }, - { - s: schema{ - ForceSendFields: []string{"MapToAnyArray"}, - }, - want: `{"maptoanyarray":{}}`, - }, - { - s: schema{ - NullFields: []string{"MapToAnyArray"}, - }, - want: `{"maptoanyarray":null}`, - }, - { - s: schema{ - MapToAnyArray: make(map[string][]interface{}), - ForceSendFields: []string{"MapToAnyArray"}, - }, - want: `{"maptoanyarray":{}}`, - }, - { - s: schema{ - MapToAnyArray: map[string][]interface{}{ - "a": []interface{}{2, "b"}, - }, - ForceSendFields: []string{"MapToAnyArray"}, - }, - want: `{"maptoanyarray":{"a":[2, "b"]}}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -type anyType struct { - Field int -} - -func (a anyType) MarshalJSON() ([]byte, error) { - return []byte(`"anyType value"`), nil -} - -func TestAnyField(t *testing.T) { - // ForceSendFields has no effect on nil interfaces and interfaces that contain nil pointers. - var nilAny *anyType - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{Any: nilAny}, - want: `{"any": null}`, - }, - { - s: schema{Any: &anyType{}}, - want: `{"any":"anyType value"}`, - }, - { - s: schema{Any: anyType{}}, - want: `{"any":"anyType value"}`, - }, - { - s: schema{ - ForceSendFields: []string{"Any"}, - }, - want: `{}`, - }, - { - s: schema{ - NullFields: []string{"Any"}, - }, - want: `{"any":null}`, - }, - { - s: schema{ - Any: nilAny, - ForceSendFields: []string{"Any"}, - }, - want: `{"any": null}`, - }, - { - s: schema{ - Any: &anyType{}, - ForceSendFields: []string{"Any"}, - }, - want: `{"any":"anyType value"}`, - }, - { - s: schema{ - Any: anyType{}, - ForceSendFields: []string{"Any"}, - }, - want: `{"any":"anyType value"}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -func TestSubschema(t *testing.T) { - // Subschemas are always stored as pointers, so ForceSendFields has no effect on them. - for _, tc := range []testCase{ - { - s: schema{}, - want: `{}`, - }, - { - s: schema{ - ForceSendFields: []string{"Child"}, - }, - want: `{}`, - }, - { - s: schema{ - NullFields: []string{"Child"}, - }, - want: `{"child":null}`, - }, - { - s: schema{Child: &child{}}, - want: `{"child":{}}`, - }, - { - s: schema{ - Child: &child{}, - ForceSendFields: []string{"Child"}, - }, - want: `{"child":{}}`, - }, - { - s: schema{Child: &child{B: true}}, - want: `{"child":{"childbool":true}}`, - }, - - { - s: schema{ - Child: &child{B: true}, - ForceSendFields: []string{"Child"}, - }, - want: `{"child":{"childbool":true}}`, - }, - } { - checkMarshalJSON(t, tc) - } -} - -// checkMarshalJSON verifies that calling schemaToMap on tc.s yields a result which is equivalent to tc.want. -func checkMarshalJSON(t *testing.T, tc testCase) { - doCheckMarshalJSON(t, tc.s, tc.s.ForceSendFields, tc.s.NullFields, tc.want) - if len(tc.s.ForceSendFields) == 0 && len(tc.s.NullFields) == 0 { - // verify that the code path used when ForceSendFields and NullFields - // are non-empty produces the same output as the fast path that is used - // when they are empty. - doCheckMarshalJSON(t, tc.s, []string{"dummy"}, []string{"dummy"}, tc.want) - } -} - -func doCheckMarshalJSON(t *testing.T, s schema, forceSendFields, nullFields []string, wantJSON string) { - encoded, err := MarshalJSON(s, forceSendFields, nullFields) - if err != nil { - t.Fatalf("encoding json:\n got err: %v", err) - } - - // The expected and obtained JSON can differ in field ordering, so unmarshal before comparing. - var got interface{} - var want interface{} - err = json.Unmarshal(encoded, &got) - if err != nil { - t.Fatalf("decoding json:\n got err: %v", err) - } - err = json.Unmarshal([]byte(wantJSON), &want) - if err != nil { - t.Fatalf("decoding json:\n got err: %v", err) - } - if !reflect.DeepEqual(got, want) { - t.Errorf("schemaToMap:\ngot :%v\nwant: %v", got, want) - } -} - -func TestParseJSONTag(t *testing.T) { - for _, tc := range []struct { - tag string - want jsonTag - }{ - { - tag: "-", - want: jsonTag{ignore: true}, - }, { - tag: "name,omitempty", - want: jsonTag{apiName: "name"}, - }, { - tag: "name,omitempty,string", - want: jsonTag{apiName: "name", stringFormat: true}, - }, - } { - got, err := parseJSONTag(tc.tag) - if err != nil { - t.Fatalf("parsing json:\n got err: %v\ntag: %q", err, tc.tag) - } - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("parseJSONTage:\ngot :%v\nwant:%v", got, tc.want) - } - } -} -func TestParseMalformedJSONTag(t *testing.T) { - for _, tag := range []string{ - "", - "name", - "name,", - "name,blah", - "name,blah,string", - ",omitempty", - ",omitempty,string", - "name,omitempty,string,blah", - } { - _, err := parseJSONTag(tag) - if err == nil { - t.Fatalf("parsing json: expected err, got nil for tag: %v", tag) - } - } -} diff --git a/vendor/google.golang.org/api/gensupport/jsonfloat_test.go b/vendor/google.golang.org/api/gensupport/jsonfloat_test.go deleted file mode 100644 index aec41ee..0000000 --- a/vendor/google.golang.org/api/gensupport/jsonfloat_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2016 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gensupport - -import ( - "encoding/json" - "math" - "testing" -) - -func TestJSONFloat(t *testing.T) { - for _, test := range []struct { - in string - want float64 - }{ - {"0", 0}, - {"-10", -10}, - {"1e23", 1e23}, - {`"Infinity"`, math.Inf(1)}, - {`"-Infinity"`, math.Inf(-1)}, - {`"NaN"`, math.NaN()}, - } { - var f64 JSONFloat64 - if err := json.Unmarshal([]byte(test.in), &f64); err != nil { - t.Fatal(err) - } - got := float64(f64) - if got != test.want && math.IsNaN(got) != math.IsNaN(test.want) { - t.Errorf("%s: got %f, want %f", test.in, got, test.want) - } - } -} - -func TestJSONFloatErrors(t *testing.T) { - var f64 JSONFloat64 - for _, in := range []string{"", "a", `"Inf"`, `"-Inf"`, `"nan"`, `"nana"`} { - if err := json.Unmarshal([]byte(in), &f64); err == nil { - t.Errorf("%q: got nil, want error", in) - } - } -} diff --git a/vendor/google.golang.org/api/gensupport/media_test.go b/vendor/google.golang.org/api/gensupport/media_test.go deleted file mode 100644 index 6bf2b41..0000000 --- a/vendor/google.golang.org/api/gensupport/media_test.go +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gensupport - -import ( - "bytes" - "crypto/rand" - "io" - "io/ioutil" - "net/http" - "reflect" - "strings" - "testing" - - "google.golang.org/api/googleapi" -) - -func TestContentSniffing(t *testing.T) { - type testCase struct { - data []byte // the data to read from the Reader - finalErr error // error to return after data has been read - - wantContentType string - wantContentTypeResult bool - } - - for _, tc := range []testCase{ - { - data: []byte{0, 0, 0, 0}, - finalErr: nil, - wantContentType: "application/octet-stream", - wantContentTypeResult: true, - }, - { - data: []byte(""), - finalErr: nil, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: true, - }, - { - data: []byte(""), - finalErr: io.ErrUnexpectedEOF, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: false, - }, - { - data: []byte("abc"), - finalErr: nil, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: true, - }, - { - data: []byte("abc"), - finalErr: io.ErrUnexpectedEOF, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: false, - }, - // The following examples contain more bytes than are buffered for sniffing. - { - data: bytes.Repeat([]byte("a"), 513), - finalErr: nil, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: true, - }, - { - data: bytes.Repeat([]byte("a"), 513), - finalErr: io.ErrUnexpectedEOF, - wantContentType: "text/plain; charset=utf-8", - wantContentTypeResult: true, // true because error is after first 512 bytes. - }, - } { - er := &errReader{buf: tc.data, err: tc.finalErr} - - sct := newContentSniffer(er) - - // Even if was an error during the first 512 bytes, we should still be able to read those bytes. - buf, err := ioutil.ReadAll(sct) - - if !reflect.DeepEqual(buf, tc.data) { - t.Fatalf("Failed reading buffer: got: %q; want:%q", buf, tc.data) - } - - if err != tc.finalErr { - t.Fatalf("Reading buffer error: got: %v; want: %v", err, tc.finalErr) - } - - ct, ok := sct.ContentType() - if ok != tc.wantContentTypeResult { - t.Fatalf("Content type result got: %v; want: %v", ok, tc.wantContentTypeResult) - } - if ok && ct != tc.wantContentType { - t.Fatalf("Content type got: %q; want: %q", ct, tc.wantContentType) - } - } -} - -type staticContentTyper struct { - io.Reader -} - -func (sct staticContentTyper) ContentType() string { - return "static content type" -} - -func TestDetermineContentType(t *testing.T) { - data := []byte("abc") - rdr := func() io.Reader { - return bytes.NewBuffer(data) - } - - type testCase struct { - r io.Reader - explicitConentType string - wantContentType string - } - - for _, tc := range []testCase{ - { - r: rdr(), - wantContentType: "text/plain; charset=utf-8", - }, - { - r: staticContentTyper{rdr()}, - wantContentType: "static content type", - }, - { - r: staticContentTyper{rdr()}, - explicitConentType: "explicit", - wantContentType: "explicit", - }, - } { - r, ctype := DetermineContentType(tc.r, tc.explicitConentType) - got, err := ioutil.ReadAll(r) - if err != nil { - t.Fatalf("Failed reading buffer: %v", err) - } - if !reflect.DeepEqual(got, data) { - t.Fatalf("Failed reading buffer: got: %q; want:%q", got, data) - } - - if ctype != tc.wantContentType { - t.Fatalf("Content type got: %q; want: %q", ctype, tc.wantContentType) - } - } -} - -func TestNewInfoFromMedia(t *testing.T) { - const textType = "text/plain; charset=utf-8" - for _, test := range []struct { - desc string - r io.Reader - opts []googleapi.MediaOption - wantType string - wantMedia, wantBuffer, wantSingleChunk bool - }{ - { - desc: "an empty reader results in a MediaBuffer with a single, empty chunk", - r: new(bytes.Buffer), - opts: nil, - wantType: textType, - wantBuffer: true, - wantSingleChunk: true, - }, - { - desc: "ContentType is observed", - r: new(bytes.Buffer), - opts: []googleapi.MediaOption{googleapi.ContentType("xyz")}, - wantType: "xyz", - wantBuffer: true, - wantSingleChunk: true, - }, - { - desc: "chunk size of zero: don't use a MediaBuffer; upload as a single chunk", - r: strings.NewReader("12345"), - opts: []googleapi.MediaOption{googleapi.ChunkSize(0)}, - wantType: textType, - wantMedia: true, - wantSingleChunk: true, - }, - { - desc: "chunk size > data size: MediaBuffer with single chunk", - r: strings.NewReader("12345"), - opts: []googleapi.MediaOption{googleapi.ChunkSize(100)}, - wantType: textType, - wantBuffer: true, - wantSingleChunk: true, - }, - { - desc: "chunk size == data size: MediaBuffer with single chunk", - r: &nullReader{googleapi.MinUploadChunkSize}, - opts: []googleapi.MediaOption{googleapi.ChunkSize(1)}, - wantType: "application/octet-stream", - wantBuffer: true, - wantSingleChunk: true, - }, - { - desc: "chunk size < data size: MediaBuffer, not single chunk", - // Note that ChunkSize = 1 is rounded up to googleapi.MinUploadChunkSize. - r: &nullReader{2 * googleapi.MinUploadChunkSize}, - opts: []googleapi.MediaOption{googleapi.ChunkSize(1)}, - wantType: "application/octet-stream", - wantBuffer: true, - wantSingleChunk: false, - }, - } { - - mi := NewInfoFromMedia(test.r, test.opts) - if got, want := mi.mType, test.wantType; got != want { - t.Errorf("%s: type: got %q, want %q", test.desc, got, want) - } - if got, want := (mi.media != nil), test.wantMedia; got != want { - t.Errorf("%s: media non-nil: got %t, want %t", test.desc, got, want) - } - if got, want := (mi.buffer != nil), test.wantBuffer; got != want { - t.Errorf("%s: buffer non-nil: got %t, want %t", test.desc, got, want) - } - if got, want := mi.singleChunk, test.wantSingleChunk; got != want { - t.Errorf("%s: singleChunk: got %t, want %t", test.desc, got, want) - } - } -} - -func TestUploadRequest(t *testing.T) { - for _, test := range []struct { - desc string - r io.Reader - chunkSize int - wantContentType string - wantUploadType string - }{ - { - desc: "chunk size of zero: don't use a MediaBuffer; upload as a single chunk", - r: strings.NewReader("12345"), - chunkSize: 0, - wantContentType: "multipart/related;", - }, - { - desc: "chunk size > data size: MediaBuffer with single chunk", - r: strings.NewReader("12345"), - chunkSize: 100, - wantContentType: "multipart/related;", - }, - { - desc: "chunk size == data size: MediaBuffer with single chunk", - r: &nullReader{googleapi.MinUploadChunkSize}, - chunkSize: 1, - wantContentType: "multipart/related;", - }, - { - desc: "chunk size < data size: MediaBuffer, not single chunk", - // Note that ChunkSize = 1 is rounded up to googleapi.MinUploadChunkSize. - r: &nullReader{2 * googleapi.MinUploadChunkSize}, - chunkSize: 1, - wantUploadType: "application/octet-stream", - }, - } { - mi := NewInfoFromMedia(test.r, []googleapi.MediaOption{googleapi.ChunkSize(test.chunkSize)}) - h := http.Header{} - mi.UploadRequest(h, new(bytes.Buffer)) - if got, want := h.Get("Content-Type"), test.wantContentType; !strings.HasPrefix(got, want) { - t.Errorf("%s: Content-Type: got %q, want prefix %q", test.desc, got, want) - } - if got, want := h.Get("X-Upload-Content-Type"), test.wantUploadType; got != want { - t.Errorf("%s: X-Upload-Content-Type: got %q, want %q", test.desc, got, want) - } - } -} - -func TestUploadRequestGetBody(t *testing.T) { - // Test that a single chunk results in a getBody function that is non-nil, and - // that produces the same content as the original body. - - // Mock out rand.Reader so we use the same multipart boundary every time. - rr := rand.Reader - rand.Reader = &nullReader{1000} - defer func() { - rand.Reader = rr - }() - - for _, test := range []struct { - desc string - r io.Reader - chunkSize int - wantGetBody bool - wantContentType string - wantUploadType string - }{ - { - desc: "chunk size of zero: no getBody", - r: &nullReader{10}, - chunkSize: 0, - wantGetBody: false, - }, - { - desc: "chunk size == data size: 1 chunk, getBody", - r: &nullReader{googleapi.MinUploadChunkSize}, - chunkSize: 1, - wantGetBody: true, - }, - { - desc: "chunk size < data size: MediaBuffer, >1 chunk, no getBody", - // No getBody here, because the initial request contains no media data - // Note that ChunkSize = 1 is rounded up to googleapi.MinUploadChunkSize. - r: &nullReader{2 * googleapi.MinUploadChunkSize}, - chunkSize: 1, - wantGetBody: false, - }, - } { - mi := NewInfoFromMedia(test.r, []googleapi.MediaOption{googleapi.ChunkSize(test.chunkSize)}) - r, getBody, _ := mi.UploadRequest(http.Header{}, bytes.NewBuffer([]byte("body"))) - if got, want := (getBody != nil), test.wantGetBody; got != want { - t.Errorf("%s: getBody: got %t, want %t", test.desc, got, want) - continue - } - if getBody == nil { - continue - } - want, err := ioutil.ReadAll(r) - if err != nil { - t.Fatal(err) - } - for i := 0; i < 3; i++ { - rc, err := getBody() - if err != nil { - t.Fatal(err) - } - got, err := ioutil.ReadAll(rc) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(got, want) { - t.Errorf("%s, %d:\ngot:\n%s\nwant:\n%s", test.desc, i, string(got), string(want)) - } - } - } -} - -func TestResumableUpload(t *testing.T) { - for _, test := range []struct { - desc string - r io.Reader - chunkSize int - wantUploadType string - wantResumableUpload bool - }{ - { - desc: "chunk size of zero: don't use a MediaBuffer; upload as a single chunk", - r: strings.NewReader("12345"), - chunkSize: 0, - wantUploadType: "multipart", - wantResumableUpload: false, - }, - { - desc: "chunk size > data size: MediaBuffer with single chunk", - r: strings.NewReader("12345"), - chunkSize: 100, - wantUploadType: "multipart", - wantResumableUpload: false, - }, - { - desc: "chunk size == data size: MediaBuffer with single chunk", - // (Because nullReader returns EOF with the last bytes.) - r: &nullReader{googleapi.MinUploadChunkSize}, - chunkSize: googleapi.MinUploadChunkSize, - wantUploadType: "multipart", - wantResumableUpload: false, - }, - { - desc: "chunk size < data size: MediaBuffer, not single chunk", - // Note that ChunkSize = 1 is rounded up to googleapi.MinUploadChunkSize. - r: &nullReader{2 * googleapi.MinUploadChunkSize}, - chunkSize: 1, - wantUploadType: "resumable", - wantResumableUpload: true, - }, - } { - mi := NewInfoFromMedia(test.r, []googleapi.MediaOption{googleapi.ChunkSize(test.chunkSize)}) - if got, want := mi.UploadType(), test.wantUploadType; got != want { - t.Errorf("%s: upload type: got %q, want %q", test.desc, got, want) - } - if got, want := mi.ResumableUpload("") != nil, test.wantResumableUpload; got != want { - t.Errorf("%s: resumable upload non-nil: got %t, want %t", test.desc, got, want) - } - } -} - -// A nullReader simulates reading a fixed number of bytes. -type nullReader struct { - remain int -} - -// Read doesn't touch buf, but it does reduce the amount of bytes remaining -// by len(buf). -func (r *nullReader) Read(buf []byte) (int, error) { - n := len(buf) - if r.remain < n { - n = r.remain - } - r.remain -= n - var err error - if r.remain == 0 { - err = io.EOF - } - return n, err -} diff --git a/vendor/google.golang.org/api/gensupport/resumable_test.go b/vendor/google.golang.org/api/gensupport/resumable_test.go deleted file mode 100644 index 1934603..0000000 --- a/vendor/google.golang.org/api/gensupport/resumable_test.go +++ /dev/null @@ -1,281 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gensupport - -import ( - "fmt" - "io" - "io/ioutil" - "net/http" - "reflect" - "strings" - "testing" - - "golang.org/x/net/context" -) - -type unexpectedReader struct{} - -func (unexpectedReader) Read([]byte) (int, error) { - return 0, fmt.Errorf("unexpected read in test") -} - -// event is an expected request/response pair -type event struct { - // the byte range header that should be present in a request. - byteRange string - // the http status code to send in response. - responseStatus int -} - -// interruptibleTransport is configured with a canned set of requests/responses. -// It records the incoming data, unless the corresponding event is configured to return -// http.StatusServiceUnavailable. -type interruptibleTransport struct { - events []event - buf []byte - bodies bodyTracker -} - -// bodyTracker keeps track of response bodies that have not been closed. -type bodyTracker map[io.ReadCloser]struct{} - -func (bt bodyTracker) Add(body io.ReadCloser) { - bt[body] = struct{}{} -} - -func (bt bodyTracker) Close(body io.ReadCloser) { - delete(bt, body) -} - -type trackingCloser struct { - io.Reader - tracker bodyTracker -} - -func (tc *trackingCloser) Close() error { - tc.tracker.Close(tc) - return nil -} - -func (tc *trackingCloser) Open() { - tc.tracker.Add(tc) -} - -func (t *interruptibleTransport) RoundTrip(req *http.Request) (*http.Response, error) { - ev := t.events[0] - t.events = t.events[1:] - if got, want := req.Header.Get("Content-Range"), ev.byteRange; got != want { - return nil, fmt.Errorf("byte range: got %s; want %s", got, want) - } - - if ev.responseStatus != http.StatusServiceUnavailable { - buf, err := ioutil.ReadAll(req.Body) - if err != nil { - return nil, fmt.Errorf("error reading from request data: %v", err) - } - t.buf = append(t.buf, buf...) - } - - tc := &trackingCloser{unexpectedReader{}, t.bodies} - tc.Open() - h := http.Header{} - status := ev.responseStatus - - // Support "X-GUploader-No-308" like Google: - if status == 308 && req.Header.Get("X-GUploader-No-308") == "yes" { - status = 200 - h.Set("X-Http-Status-Code-Override", "308") - } - - res := &http.Response{ - StatusCode: status, - Header: h, - Body: tc, - } - return res, nil -} - -// progressRecorder records updates, and calls f for every invocation of ProgressUpdate. -type progressRecorder struct { - updates []int64 - f func() -} - -func (pr *progressRecorder) ProgressUpdate(current int64) { - pr.updates = append(pr.updates, current) - if pr.f != nil { - pr.f() - } -} - -func TestInterruptedTransferChunks(t *testing.T) { - type testCase struct { - data string - chunkSize int - events []event - wantProgress []int64 - } - - for _, tc := range []testCase{ - { - data: strings.Repeat("a", 300), - chunkSize: 90, - events: []event{ - {"bytes 0-89/*", http.StatusServiceUnavailable}, - {"bytes 0-89/*", 308}, - {"bytes 90-179/*", 308}, - {"bytes 180-269/*", http.StatusServiceUnavailable}, - {"bytes 180-269/*", 308}, - {"bytes 270-299/300", 200}, - }, - - wantProgress: []int64{90, 180, 270, 300}, - }, - { - data: strings.Repeat("a", 20), - chunkSize: 10, - events: []event{ - {"bytes 0-9/*", http.StatusServiceUnavailable}, - {"bytes 0-9/*", 308}, - {"bytes 10-19/*", http.StatusServiceUnavailable}, - {"bytes 10-19/*", 308}, - // 0 byte final request demands a byte range with leading asterix. - {"bytes */20", http.StatusServiceUnavailable}, - {"bytes */20", 200}, - }, - - wantProgress: []int64{10, 20}, - }, - } { - media := strings.NewReader(tc.data) - - tr := &interruptibleTransport{ - buf: make([]byte, 0, len(tc.data)), - events: tc.events, - bodies: bodyTracker{}, - } - - pr := progressRecorder{} - rx := &ResumableUpload{ - Client: &http.Client{Transport: tr}, - Media: NewMediaBuffer(media, tc.chunkSize), - MediaType: "text/plain", - Callback: pr.ProgressUpdate, - Backoff: NoPauseStrategy, - } - res, err := rx.Upload(context.Background()) - if err == nil { - res.Body.Close() - } - if err != nil || res == nil || res.StatusCode != http.StatusOK { - if res == nil { - t.Errorf("Upload not successful, res=nil: %v", err) - } else { - t.Errorf("Upload not successful, statusCode=%v: %v", res.StatusCode, err) - } - } - if !reflect.DeepEqual(tr.buf, []byte(tc.data)) { - t.Errorf("transferred contents:\ngot %s\nwant %s", tr.buf, tc.data) - } - - if !reflect.DeepEqual(pr.updates, tc.wantProgress) { - t.Errorf("progress updates: got %v, want %v", pr.updates, tc.wantProgress) - } - - if len(tr.events) > 0 { - t.Errorf("did not observe all expected events. leftover events: %v", tr.events) - } - if len(tr.bodies) > 0 { - t.Errorf("unclosed request bodies: %v", tr.bodies) - } - } -} - -func TestCancelUploadFast(t *testing.T) { - const ( - chunkSize = 90 - mediaSize = 300 - ) - media := strings.NewReader(strings.Repeat("a", mediaSize)) - - tr := &interruptibleTransport{ - buf: make([]byte, 0, mediaSize), - } - - pr := progressRecorder{} - rx := &ResumableUpload{ - Client: &http.Client{Transport: tr}, - Media: NewMediaBuffer(media, chunkSize), - MediaType: "text/plain", - Callback: pr.ProgressUpdate, - Backoff: NoPauseStrategy, - } - ctx, cancelFunc := context.WithCancel(context.Background()) - cancelFunc() // stop the upload that hasn't started yet - res, err := rx.Upload(ctx) - if err != context.Canceled { - t.Errorf("Upload err: got: %v; want: context cancelled", err) - } - if res != nil { - t.Errorf("Upload result: got: %v; want: nil", res) - } - if pr.updates != nil { - t.Errorf("progress updates: got %v; want: nil", pr.updates) - } -} - -func TestCancelUpload(t *testing.T) { - const ( - chunkSize = 90 - mediaSize = 300 - ) - media := strings.NewReader(strings.Repeat("a", mediaSize)) - - tr := &interruptibleTransport{ - buf: make([]byte, 0, mediaSize), - events: []event{ - {"bytes 0-89/*", http.StatusServiceUnavailable}, - {"bytes 0-89/*", 308}, - {"bytes 90-179/*", 308}, - {"bytes 180-269/*", 308}, // Upload should be cancelled before this event. - }, - bodies: bodyTracker{}, - } - - ctx, cancelFunc := context.WithCancel(context.Background()) - numUpdates := 0 - - pr := progressRecorder{f: func() { - numUpdates++ - if numUpdates >= 2 { - cancelFunc() - } - }} - - rx := &ResumableUpload{ - Client: &http.Client{Transport: tr}, - Media: NewMediaBuffer(media, chunkSize), - MediaType: "text/plain", - Callback: pr.ProgressUpdate, - Backoff: NoPauseStrategy, - } - res, err := rx.Upload(ctx) - if err != context.Canceled { - t.Errorf("Upload err: got: %v; want: context cancelled", err) - } - if res != nil { - t.Errorf("Upload result: got: %v; want: nil", res) - } - if got, want := tr.buf, []byte(strings.Repeat("a", chunkSize*2)); !reflect.DeepEqual(got, want) { - t.Errorf("transferred contents:\ngot %s\nwant %s", got, want) - } - if got, want := pr.updates, []int64{chunkSize, chunkSize * 2}; !reflect.DeepEqual(got, want) { - t.Errorf("progress updates: got %v; want: %v", got, want) - } - if len(tr.bodies) > 0 { - t.Errorf("unclosed request bodies: %v", tr.bodies) - } -} diff --git a/vendor/google.golang.org/api/gensupport/retry_test.go b/vendor/google.golang.org/api/gensupport/retry_test.go deleted file mode 100644 index dd5e96d..0000000 --- a/vendor/google.golang.org/api/gensupport/retry_test.go +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package gensupport - -import ( - "errors" - "io" - "net" - "net/http" - "testing" - "time" - - "golang.org/x/net/context" -) - -func TestRetry(t *testing.T) { - testCases := []struct { - desc string - respStatus []int // HTTP status codes returned (length indicates number of calls we expect). - maxRetry int // Max number of calls allowed by the BackoffStrategy. - wantStatus int // StatusCode of returned response. - }{ - { - desc: "First call successful", - respStatus: []int{200}, - maxRetry: 3, - wantStatus: 200, - }, - { - desc: "Retry before success", - respStatus: []int{500, 500, 500, 200}, - maxRetry: 3, - wantStatus: 200, - }, - { - desc: "Backoff strategy abandons after 3 retries", - respStatus: []int{500, 500, 500, 500}, - maxRetry: 3, - wantStatus: 500, - }, - { - desc: "Backoff strategy abandons after 2 retries", - respStatus: []int{500, 500, 500}, - maxRetry: 2, - wantStatus: 500, - }, - } - for _, tt := range testCases { - // Function consumes tt.respStatus - f := func() (*http.Response, error) { - if len(tt.respStatus) == 0 { - return nil, errors.New("too many requests to function") - } - resp := &http.Response{StatusCode: tt.respStatus[0]} - tt.respStatus = tt.respStatus[1:] - return resp, nil - } - - backoff := &LimitRetryStrategy{ - Max: tt.maxRetry, - Strategy: NoPauseStrategy, - } - - resp, err := Retry(nil, f, backoff) - if err != nil { - t.Errorf("%s: Retry returned err %v", tt.desc, err) - } - if got := resp.StatusCode; got != tt.wantStatus { - t.Errorf("%s: Retry returned response with StatusCode=%d; want %d", tt.desc, got, tt.wantStatus) - } - if len(tt.respStatus) != 0 { - t.Errorf("%s: f was not called enough; status codes remaining: %v", tt.desc, tt.respStatus) - } - } -} - -type checkCloseReader struct { - closed bool -} - -func (c *checkCloseReader) Read(p []byte) (n int, err error) { return 0, io.EOF } -func (c *checkCloseReader) Close() error { - c.closed = true - return nil -} - -func TestRetryClosesBody(t *testing.T) { - var i int - responses := []*http.Response{ - {StatusCode: 500, Body: &checkCloseReader{}}, - {StatusCode: 500, Body: &checkCloseReader{}}, - {StatusCode: 200, Body: &checkCloseReader{}}, - } - f := func() (*http.Response, error) { - resp := responses[i] - i++ - return resp, nil - } - - resp, err := Retry(nil, f, NoPauseStrategy) - if err != nil { - t.Fatalf("Retry returned error: %v", err) - } - if resp != responses[2] { - t.Errorf("Retry returned %v; want %v", resp, responses[2]) - } - for i, resp := range responses { - want := i != 2 // Only the last response should not be closed. - got := resp.Body.(*checkCloseReader).closed - if got != want { - t.Errorf("response[%d].Body closed = %t, want %t", i, got, want) - } - } -} - -func RetryReturnsOnContextCancel(t *testing.T) { - f := func() (*http.Response, error) { - return nil, io.ErrUnexpectedEOF - } - backoff := UniformPauseStrategy(time.Hour) - ctx, cancel := context.WithCancel(context.Background()) - - errc := make(chan error, 1) - go func() { - _, err := Retry(ctx, f, backoff) - errc <- err - }() - - cancel() - select { - case err := <-errc: - if err != ctx.Err() { - t.Errorf("Retry returned err: %v, want %v", err, ctx.Err()) - } - case <-time.After(5 * time.Second): - t.Errorf("Timed out waiting for Retry to return") - } -} - -func TestShouldRetry(t *testing.T) { - testCases := []struct { - status int - err error - want bool - }{ - {status: 200, want: false}, - {status: 308, want: false}, - {status: 403, want: false}, - {status: 429, want: true}, - {status: 500, want: true}, - {status: 503, want: true}, - {status: 600, want: false}, - {err: io.EOF, want: false}, - {err: errors.New("random badness"), want: false}, - {err: io.ErrUnexpectedEOF, want: true}, - {err: &net.AddrError{}, want: false}, // Not temporary. - {err: &net.DNSError{IsTimeout: true}, want: true}, // Temporary. - } - for _, tt := range testCases { - if got := shouldRetry(tt.status, tt.err); got != tt.want { - t.Errorf("shouldRetry(%d, %v) = %t; want %t", tt.status, tt.err, got, tt.want) - } - } -} diff --git a/vendor/google.golang.org/api/gensupport/send_test.go b/vendor/google.golang.org/api/gensupport/send_test.go deleted file mode 100644 index 2219eb3..0000000 --- a/vendor/google.golang.org/api/gensupport/send_test.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gensupport - -import ( - "net/http" - "testing" -) - -func TestSendRequest(t *testing.T) { - // Setting Accept-Encoding should give an error immediately. - req, _ := http.NewRequest("GET", "url", nil) - req.Header.Set("Accept-Encoding", "") - _, err := SendRequest(nil, nil, req) - if err == nil { - t.Error("got nil, want error") - } -} diff --git a/vendor/google.golang.org/api/gensupport/util_test.go b/vendor/google.golang.org/api/gensupport/util_test.go deleted file mode 100644 index 3b13056..0000000 --- a/vendor/google.golang.org/api/gensupport/util_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2016 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gensupport - -import ( - "io" - "time" -) - -// errReader reads out of a buffer until it is empty, then returns the specified error. -type errReader struct { - buf []byte - err error -} - -func (er *errReader) Read(p []byte) (int, error) { - if len(er.buf) == 0 { - if er.err == nil { - return 0, io.EOF - } - return 0, er.err - } - n := copy(p, er.buf) - er.buf = er.buf[n:] - return n, nil -} - -// UniformPauseStrategy implements BackoffStrategy with uniform pause. -type UniformPauseStrategy time.Duration - -func (p UniformPauseStrategy) Pause() (time.Duration, bool) { return time.Duration(p), true } -func (p UniformPauseStrategy) Reset() {} - -// NoPauseStrategy implements BackoffStrategy with infinite 0-length pauses. -const NoPauseStrategy = UniformPauseStrategy(0) - -// LimitRetryStrategy wraps a BackoffStrategy but limits the number of retries. -type LimitRetryStrategy struct { - Max int - Strategy BackoffStrategy - n int -} - -func (l *LimitRetryStrategy) Pause() (time.Duration, bool) { - l.n++ - if l.n > l.Max { - return 0, false - } - return l.Strategy.Pause() -} - -func (l *LimitRetryStrategy) Reset() { - l.n = 0 - l.Strategy.Reset() -} diff --git a/vendor/google.golang.org/api/googleapi/googleapi_test.go b/vendor/google.golang.org/api/googleapi/googleapi_test.go deleted file mode 100644 index dd39a5c..0000000 --- a/vendor/google.golang.org/api/googleapi/googleapi_test.go +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package googleapi - -import ( - "encoding/json" - "io/ioutil" - "net/http" - "net/url" - "reflect" - "strings" - "testing" -) - -type ExpandTest struct { - in string - expansions map[string]string - want string -} - -var expandTests = []ExpandTest{ - // no expansions - { - "http://www.golang.org/", - map[string]string{}, - "http://www.golang.org/", - }, - // one expansion, no escaping - { - "http://www.golang.org/{bucket}/delete", - map[string]string{ - "bucket": "red", - }, - "http://www.golang.org/red/delete", - }, - // one expansion, with hex escapes - { - "http://www.golang.org/{bucket}/delete", - map[string]string{ - "bucket": "red/blue", - }, - "http://www.golang.org/red%2Fblue/delete", - }, - // one expansion, with space - { - "http://www.golang.org/{bucket}/delete", - map[string]string{ - "bucket": "red or blue", - }, - "http://www.golang.org/red%20or%20blue/delete", - }, - // expansion not found - { - "http://www.golang.org/{object}/delete", - map[string]string{ - "bucket": "red or blue", - }, - "http://www.golang.org//delete", - }, - // multiple expansions - { - "http://www.golang.org/{one}/{two}/{three}/get", - map[string]string{ - "one": "ONE", - "two": "TWO", - "three": "THREE", - }, - "http://www.golang.org/ONE/TWO/THREE/get", - }, - // utf-8 characters - { - "http://www.golang.org/{bucket}/get", - map[string]string{ - "bucket": "£100", - }, - "http://www.golang.org/%C2%A3100/get", - }, - // punctuations - { - "http://www.golang.org/{bucket}/get", - map[string]string{ - "bucket": `/\@:,.`, - }, - "http://www.golang.org/%2F%5C%40%3A%2C./get", - }, - // mis-matched brackets - { - "http://www.golang.org/{bucket/get", - map[string]string{ - "bucket": "red", - }, - "http://www.golang.org/%7Bbucket/get", - }, - // "+" prefix for suppressing escape - // See also: http://tools.ietf.org/html/rfc6570#section-3.2.3 - { - "http://www.golang.org/{+topic}", - map[string]string{ - "topic": "/topics/myproject/mytopic", - }, - // The double slashes here look weird, but it's intentional - "http://www.golang.org//topics/myproject/mytopic", - }, -} - -func TestExpand(t *testing.T) { - for i, test := range expandTests { - u := url.URL{ - Path: test.in, - } - Expand(&u, test.expansions) - got := u.EscapedPath() - if got != test.want { - t.Errorf("got %q expected %q in test %d", got, test.want, i+1) - } - } -} - -type CheckResponseTest struct { - in *http.Response - bodyText string - want error - errText string -} - -var checkResponseTests = []CheckResponseTest{ - { - &http.Response{ - StatusCode: http.StatusOK, - }, - "", - nil, - "", - }, - { - &http.Response{ - StatusCode: http.StatusInternalServerError, - }, - `{"error":{}}`, - &Error{ - Code: http.StatusInternalServerError, - Body: `{"error":{}}`, - }, - `googleapi: got HTTP response code 500 with body: {"error":{}}`, - }, - { - &http.Response{ - StatusCode: http.StatusNotFound, - }, - `{"error":{"message":"Error message for StatusNotFound."}}`, - &Error{ - Code: http.StatusNotFound, - Message: "Error message for StatusNotFound.", - Body: `{"error":{"message":"Error message for StatusNotFound."}}`, - }, - "googleapi: Error 404: Error message for StatusNotFound.", - }, - { - &http.Response{ - StatusCode: http.StatusBadRequest, - }, - `{"error":"invalid_token","error_description":"Invalid Value"}`, - &Error{ - Code: http.StatusBadRequest, - Body: `{"error":"invalid_token","error_description":"Invalid Value"}`, - }, - `googleapi: got HTTP response code 400 with body: {"error":"invalid_token","error_description":"Invalid Value"}`, - }, - { - &http.Response{ - StatusCode: http.StatusBadRequest, - }, - `{"error":{"errors":[{"domain":"usageLimits","reason":"keyInvalid","message":"Bad Request"}],"code":400,"message":"Bad Request"}}`, - &Error{ - Code: http.StatusBadRequest, - Errors: []ErrorItem{ - { - Reason: "keyInvalid", - Message: "Bad Request", - }, - }, - Body: `{"error":{"errors":[{"domain":"usageLimits","reason":"keyInvalid","message":"Bad Request"}],"code":400,"message":"Bad Request"}}`, - Message: "Bad Request", - }, - "googleapi: Error 400: Bad Request, keyInvalid", - }, -} - -func TestCheckResponse(t *testing.T) { - for _, test := range checkResponseTests { - res := test.in - if test.bodyText != "" { - res.Body = ioutil.NopCloser(strings.NewReader(test.bodyText)) - } - g := CheckResponse(res) - if !reflect.DeepEqual(g, test.want) { - t.Errorf("CheckResponse: got %v, want %v", g, test.want) - gotJson, err := json.Marshal(g) - if err != nil { - t.Error(err) - } - wantJson, err := json.Marshal(test.want) - if err != nil { - t.Error(err) - } - t.Errorf("json(got): %q\njson(want): %q", string(gotJson), string(wantJson)) - } - if g != nil && g.Error() != test.errText { - t.Errorf("CheckResponse: unexpected error message.\nGot: %q\nwant: %q", g, test.errText) - } - } -} - -type VariantPoint struct { - Type string - Coordinates []float64 -} - -type VariantTest struct { - in map[string]interface{} - result bool - want VariantPoint -} - -var coords = []interface{}{1.0, 2.0} - -var variantTests = []VariantTest{ - { - in: map[string]interface{}{ - "type": "Point", - "coordinates": coords, - }, - result: true, - want: VariantPoint{ - Type: "Point", - Coordinates: []float64{1.0, 2.0}, - }, - }, - { - in: map[string]interface{}{ - "type": "Point", - "bogus": coords, - }, - result: true, - want: VariantPoint{ - Type: "Point", - }, - }, -} - -func TestVariantType(t *testing.T) { - for _, test := range variantTests { - if g := VariantType(test.in); g != test.want.Type { - t.Errorf("VariantType(%v): got %v, want %v", test.in, g, test.want.Type) - } - } -} - -func TestConvertVariant(t *testing.T) { - for _, test := range variantTests { - g := VariantPoint{} - r := ConvertVariant(test.in, &g) - if r != test.result { - t.Errorf("ConvertVariant(%v): got %v, want %v", test.in, r, test.result) - } - if !reflect.DeepEqual(g, test.want) { - t.Errorf("ConvertVariant(%v): got %v, want %v", test.in, g, test.want) - } - } -} - -func TestRoundChunkSize(t *testing.T) { - type testCase struct { - in int - want int - } - for _, tc := range []testCase{ - {0, 0}, - {256*1024 - 1, 256 * 1024}, - {256 * 1024, 256 * 1024}, - {256*1024 + 1, 2 * 256 * 1024}, - } { - mo := &MediaOptions{} - ChunkSize(tc.in).setOptions(mo) - if got := mo.ChunkSize; got != tc.want { - t.Errorf("rounding chunk size: got: %v; want %v", got, tc.want) - } - } -} diff --git a/vendor/google.golang.org/api/googleapi/internal/uritemplates/uritemplates_test.go b/vendor/google.golang.org/api/googleapi/internal/uritemplates/uritemplates_test.go deleted file mode 100644 index a60c4ef..0000000 --- a/vendor/google.golang.org/api/googleapi/internal/uritemplates/uritemplates_test.go +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uritemplates - -import ( - "fmt" - "log" - "net/url" - "testing" -) - -func ExampleExpand() { - values := map[string]string{ - "user": "golang", - "repo": "go", - } - expanded, _, err := Expand("https://api.github.com/repos{/user,repo}", values) - if err != nil { - log.Fatalf("Error expanding template: %v", err) - } - fmt.Println(expanded) - // Output: - // https://api.github.com/repos/golang/go -} - -func TestExpand(t *testing.T) { - testCases := []struct { - tmpl string - values map[string]string - want string - }{ - // These examples come from the RFC: - // http://tools.ietf.org/html/rfc6570 - { - tmpl: "http://www.example.com/foo{?query,number}", - values: map[string]string{"query": "mycelium", "number": "100"}, - want: "http://www.example.com/foo?query=mycelium&number=100", - }, - { - tmpl: "http://www.example.com/foo{?query,number}", - values: map[string]string{"query": "mycelium"}, - want: "http://www.example.com/foo?query=mycelium", - }, - { - tmpl: "http://www.example.com/foo{?query,number}", - values: map[string]string{}, - want: "http://www.example.com/foo", - }, - } - - for _, tt := range testCases { - exp, _, err := Expand(tt.tmpl, tt.values) - if err != nil { - t.Errorf("Expand(%q, %v) error: %v", tt.tmpl, tt.values, err) - continue - } - if exp != tt.want { - t.Errorf("Expand(%q, %v)\ngot %q\nwant %q", tt.tmpl, tt.values, exp, tt.want) - } - } -} - -func TestExpandRFCLevels(t *testing.T) { - values := map[string]string{ - "dub": "me/too", - "hello": "Hello World!", - "half": "50%", - "var": "value", - "who": "fred", - "base": "http://example.com/home/", - "path": "/foo/bar", - "semi": ";", - "v": "6", - "x": "1024", - "y": "768", - "empty": "", - // undef not mapped. - } - testCases := []struct { - tmpl, want string - }{ - // These examples come from the RFC levels specification. - // http://tools.ietf.org/html/rfc6570 - // Level 1 examples. - {tmpl: "{var}", want: "value"}, - {tmpl: "{hello}", want: "Hello%20World%21"}, - - // Level 2 examples. - {tmpl: "{+var}", want: "value"}, - {tmpl: "{+hello}", want: "Hello%20World!"}, - {tmpl: "{+path}/here", want: "/foo/bar/here"}, - {tmpl: "here?ref={+path}", want: "here?ref=/foo/bar"}, - {tmpl: "X{#var}", want: "X#value"}, - {tmpl: "X{#hello}", want: "X#Hello%20World!"}, - - // Level 3 examples. - {tmpl: "map?{x,y}", want: "map?1024,768"}, - {tmpl: "{x,hello,y}", want: "1024,Hello%20World%21,768"}, - {tmpl: "{+x,hello,y}", want: "1024,Hello%20World!,768"}, - {tmpl: "{+path,x}/here", want: "/foo/bar,1024/here"}, - {tmpl: "{#x,hello,y}", want: "#1024,Hello%20World!,768"}, - {tmpl: "{#path,x}/here", want: "#/foo/bar,1024/here"}, - {tmpl: "X{.var}", want: "X.value"}, - {tmpl: "X{.x,y}", want: "X.1024.768"}, - {tmpl: "{/var}", want: "/value"}, - {tmpl: "{/var,x}/here", want: "/value/1024/here"}, - {tmpl: "{;x,y}", want: ";x=1024;y=768"}, - {tmpl: "{;x,y,empty}", want: ";x=1024;y=768;empty"}, - {tmpl: "{?x,y}", want: "?x=1024&y=768"}, - {tmpl: "{?x,y,empty}", want: "?x=1024&y=768&empty="}, - {tmpl: "?fixed=yes{&x}", want: "?fixed=yes&x=1024"}, - {tmpl: "{&x,y,empty}", want: "&x=1024&y=768&empty="}, - - {tmpl: "{var:3}", want: "val"}, - {tmpl: "{var:30}", want: "value"}, - {tmpl: "{+path:6}/here", want: "/foo/b/here"}, - {tmpl: "{#path:6}/here", want: "#/foo/b/here"}, - {tmpl: "X{.var:3}", want: "X.val"}, - {tmpl: "{/var:1,var}", want: "/v/value"}, - {tmpl: "{;hello:5}", want: ";hello=Hello"}, - {tmpl: "{?var:3}", want: "?var=val"}, - {tmpl: "{&var:3}", want: "&var=val"}, - - // 2.4.1 Prefix values. - {tmpl: "{var}", want: "value"}, - {tmpl: "{var:20}", want: "value"}, - {tmpl: "{var:3}", want: "val"}, - {tmpl: "{semi}", want: "%3B"}, - {tmpl: "{semi:2}", want: "%3B"}, - // 3.2.2. Simple String Expansion: {var} - {tmpl: "{var}", want: "value"}, - {tmpl: "{hello}", want: "Hello%20World%21"}, - {tmpl: "{half}", want: "50%25"}, - {tmpl: "O{empty}X", want: "OX"}, - {tmpl: "O{undef}X", want: "OX"}, - {tmpl: "{x,y}", want: "1024,768"}, - {tmpl: "{x,hello,y}", want: "1024,Hello%20World%21,768"}, - {tmpl: "?{x,empty}", want: "?1024,"}, - {tmpl: "?{x,undef}", want: "?1024"}, - {tmpl: "?{undef,y}", want: "?768"}, - {tmpl: "{var:3}", want: "val"}, - {tmpl: "{var:30}", want: "value"}, - // 3.2.3. Reserved Expansion: {+var} - {tmpl: "{+var}", want: "value"}, - {tmpl: "{+hello}", want: "Hello%20World!"}, - {tmpl: "{+half}", want: "50%25"}, - {tmpl: "{base}index", want: "http%3A%2F%2Fexample.com%2Fhome%2Findex"}, - {tmpl: "{+base}index", want: "http://example.com/home/index"}, - {tmpl: "O{+empty}X", want: "OX"}, - {tmpl: "O{+undef}X", want: "OX"}, - {tmpl: "{+path}/here", want: "/foo/bar/here"}, - {tmpl: "here?ref={+path}", want: "here?ref=/foo/bar"}, - {tmpl: "up{+path}{var}/here", want: "up/foo/barvalue/here"}, - {tmpl: "{+x,hello,y}", want: "1024,Hello%20World!,768"}, - {tmpl: "{+path,x}/here", want: "/foo/bar,1024/here"}, - {tmpl: "{+path:6}/here", want: "/foo/b/here"}, - // 3.2.4. Fragment Expansion: {#var} - {tmpl: "{#var}", want: "#value"}, - {tmpl: "{#hello}", want: "#Hello%20World!"}, - {tmpl: "{#half}", want: "#50%25"}, - {tmpl: "foo{#empty}", want: "foo#"}, - {tmpl: "foo{#undef}", want: "foo"}, - {tmpl: "{#x,hello,y}", want: "#1024,Hello%20World!,768"}, - {tmpl: "{#path,x}/here", want: "#/foo/bar,1024/here"}, - {tmpl: "{#path:6}/here", want: "#/foo/b/here"}, - // 3.2.5. Label Expansion with Dot-Prefix: {.var} - {tmpl: "{.who}", want: ".fred"}, - {tmpl: "{.who,who}", want: ".fred.fred"}, - {tmpl: "{.half,who}", want: ".50%25.fred"}, - {tmpl: "X{.var}", want: "X.value"}, - {tmpl: "X{.empty}", want: "X."}, - {tmpl: "X{.undef}", want: "X"}, - {tmpl: "X{.var:3}", want: "X.val"}, - // 3.2.6. Path Segment Expansion: {/var} - {tmpl: "{/who}", want: "/fred"}, - {tmpl: "{/who,who}", want: "/fred/fred"}, - {tmpl: "{/half,who}", want: "/50%25/fred"}, - {tmpl: "{/who,dub}", want: "/fred/me%2Ftoo"}, - {tmpl: "{/var}", want: "/value"}, - {tmpl: "{/var,empty}", want: "/value/"}, - {tmpl: "{/var,undef}", want: "/value"}, - {tmpl: "{/var,x}/here", want: "/value/1024/here"}, - {tmpl: "{/var:1,var}", want: "/v/value"}, - // 3.2.7. Path-Style Parameter Expansion: {;var} - {tmpl: "{;who}", want: ";who=fred"}, - {tmpl: "{;half}", want: ";half=50%25"}, - {tmpl: "{;empty}", want: ";empty"}, - {tmpl: "{;v,empty,who}", want: ";v=6;empty;who=fred"}, - {tmpl: "{;v,bar,who}", want: ";v=6;who=fred"}, - {tmpl: "{;x,y}", want: ";x=1024;y=768"}, - {tmpl: "{;x,y,empty}", want: ";x=1024;y=768;empty"}, - {tmpl: "{;x,y,undef}", want: ";x=1024;y=768"}, - {tmpl: "{;hello:5}", want: ";hello=Hello"}, - // 3.2.8. Form-Style Query Expansion: {?var} - {tmpl: "{?who}", want: "?who=fred"}, - {tmpl: "{?half}", want: "?half=50%25"}, - {tmpl: "{?x,y}", want: "?x=1024&y=768"}, - {tmpl: "{?x,y,empty}", want: "?x=1024&y=768&empty="}, - {tmpl: "{?x,y,undef}", want: "?x=1024&y=768"}, - {tmpl: "{?var:3}", want: "?var=val"}, - // 3.2.9. Form-Style Query Continuation: {&var} - {tmpl: "{&who}", want: "&who=fred"}, - {tmpl: "{&half}", want: "&half=50%25"}, - {tmpl: "?fixed=yes{&x}", want: "?fixed=yes&x=1024"}, - {tmpl: "{&x,y,empty}", want: "&x=1024&y=768&empty="}, - {tmpl: "{&x,y,undef}", want: "&x=1024&y=768"}, - {tmpl: "{&var:3}", want: "&var=val"}, - } - for _, tt := range testCases { - esc, unesc, err := Expand(tt.tmpl, values) - if err != nil { - t.Errorf("Expand(%q) error: %v", tt.tmpl, err) - continue - } - if esc != tt.want { - t.Errorf("Expand(%q)\ngot %q\nwant %q", tt.tmpl, esc, tt.want) - } - // Check that the escaped form is equivalent to unescaped. - urlUnesc, err := url.QueryUnescape(esc) - if err != nil { - t.Errorf("Expand(%q) gave invalid escaping %q: %v", tt.tmpl, esc, err) - continue - } - if urlUnesc != unesc { - t.Errorf("Expand(%q) gave inconsistent escaped/unescaped\nunescaped %q\nescaped %q\nwhich is %q", tt.tmpl, unesc, esc, urlUnesc) - } - } -} - -func TestExpandUnescaped(t *testing.T) { - testCases := []struct { - tmpl, wantEsc, wantUnesc string - values map[string]string - }{ - { - tmpl: "/foo/{bucket}/bar", - values: map[string]string{ - "bucket": "simple", - }, - wantEsc: "/foo/simple/bar", - wantUnesc: "/foo/simple/bar", - }, - { - tmpl: "/foo/{bucket}/bar", - values: map[string]string{ - "bucket": "path/with/slash", - }, - wantEsc: "/foo/path%2Fwith%2Fslash/bar", - wantUnesc: "/foo/path/with/slash/bar", - }, - { - tmpl: "/foo/{+bucket}/bar", - values: map[string]string{ - "bucket": "path/with/slash", - }, - wantEsc: "/foo/path/with/slash/bar", - wantUnesc: "/foo/path/with/slash/bar", - }, - { - tmpl: "/foo/{bucket}/bar", - values: map[string]string{ - "bucket": "double%2Fescaped", - }, - wantEsc: "/foo/double%252Fescaped/bar", - wantUnesc: "/foo/double%2Fescaped/bar", - }, - } - for _, tt := range testCases { - esc, unesc, err := Expand(tt.tmpl, tt.values) - if err != nil { - t.Errorf("Expand(%q) error: %v", tt.tmpl, err) - continue - } - if esc != tt.wantEsc || unesc != tt.wantUnesc { - t.Errorf("Expand(%q)\ngot esc=%q, unesc=%q\nwant esc=%q, unesc=%q", tt.tmpl, esc, unesc, tt.wantEsc, tt.wantUnesc) - } - } -} diff --git a/vendor/google.golang.org/api/googleapi/types_test.go b/vendor/google.golang.org/api/googleapi/types_test.go deleted file mode 100644 index da38647..0000000 --- a/vendor/google.golang.org/api/googleapi/types_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2013 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package googleapi - -import ( - "bytes" - "encoding/json" - "reflect" - "testing" -) - -func TestTypes(t *testing.T) { - type T struct { - I32 Int32s - I64 Int64s - U32 Uint32s - U64 Uint64s - F64 Float64s - } - v := &T{ - I32: Int32s{-1, 2, 3}, - I64: Int64s{-1, 2, 1 << 33}, - U32: Uint32s{1, 2}, - U64: Uint64s{1, 2, 1 << 33}, - F64: Float64s{1.5, 3.33}, - } - got, err := json.Marshal(v) - if err != nil { - t.Fatal(err) - } - want := `{"I32":["-1","2","3"],"I64":["-1","2","8589934592"],"U32":["1","2"],"U64":["1","2","8589934592"],"F64":["1.5","3.33"]}` - if string(got) != want { - t.Fatalf("Marshal mismatch.\n got: %s\nwant: %s\n", got, want) - } - - v2 := new(T) - if err := json.Unmarshal(got, v2); err != nil { - t.Fatalf("Unmarshal: %v", err) - } - if !reflect.DeepEqual(v, v2) { - t.Fatalf("Unmarshal didn't produce same results.\n got: %#v\nwant: %#v\n", v, v2) - } -} - -func TestRawMessageMarshal(t *testing.T) { - // https://golang.org/issue/14493 - const want = "{}" - b, err := json.Marshal(RawMessage(want)) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - if !bytes.Equal(b, []byte(want)) { - t.Errorf("Marshal(RawMessage(%q)) = %q; want %q", want, b, want) - } -} - -func TestRawMessageUnmarshal(t *testing.T) { - const want = "{}" - var m RawMessage - if err := json.Unmarshal([]byte(want), &m); err != nil { - t.Fatalf("Unmarshal: %v", err) - } - if !bytes.Equal([]byte(m), []byte(want)) { - t.Errorf("Unmarshal([]byte(%q), &m); m = %q; want %q", want, string(m), want) - } -} diff --git a/vendor/google.golang.org/api/key.json.enc b/vendor/google.golang.org/api/key.json.enc deleted file mode 100644 index 1286368010e083568344f647654071f7ceb8b97b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2432 zcmV-`34iv1%C6-HLz|k4h;vcrNKKz7QY$uvqLZrA#+ENMaijsr2O^{nlC~UeXsauO zyYC8hS)d;K)UHb-QtlD#IKYdJ?g}fxv6g?6vTk#!0L=Vf3fPH)eBOm5U~8RID32xj z!lLCp_&HFw`%U#Tys4(-#FgY|R$>uPJ7w;orm0Oc>(uZqL>UM3789vKL;ynRdAMh6;6TW5aMs+{3tB^Yc6w*{Cl{GH4Czv@r>GO`DSp!3dzo zR3uepj;3ZqnWfD}rNkoyWgz@_1lrhU1G(&G0UfzeBANC#d?Gj z8$uhd=K|SSFC=S8TgPPvJpv{j?Vy-vE+5n5t-cG!$*~5~6^&c5sD%R-7!QlkDU40Z zlD@Y9kS}fnbJ24Mma6v1r6*9qwXW>;C6%b~>gdgTBGG?+scG)OC>M$E5BNXbUW8;7 zc8i3cDaOc1Y6LhRvBw6JbT80Fhi$HaYini#G)kk~!E#LlsRQq=16HTHM-_CfBzToM zj8%ZqYnlH)fdWV1#41R67OFrpWD)_=MLFQqOokkW4o7BuG`Knp&36oWYIqQVEe?4I ztncN^cxebyD-z=9CzXhhf;iu+2tl-DQRIXuze*rO0=7oD7RPu+bICNWzdY}qc;R?1 zkyR18aH*LL^y@!jQpHA4x)sB8f6zdHm6G+cFY(69HgC?Uj=t^G;D<0(EC=QU{+5qU z?fsf>_9Av!U8ZP8%@okz;q%TE?z}&CiRf;dT7_aFrtVWH!jAAoguht{Uhj!S(sz$f z*%7NLG)!%&kGW{+(HUW{Q&8J(d}V!<=^8>+lsS3FkBYLHG*(h|?DW2TJ{)byUFA1C znor2|5@&ZN@Sg{bFA=;R0xzJr#J6*+bqHwYL0AG5%M&GlFhq2V%wj0b6HEk{Lyd+M zcMiac2axL@)s?BrEnoCdqK<-@P~J3LQqhFU94)8iZB&S2c<@KnZfLAm zNCWRle&_F~{0J|scVj=y=sS8USPOlRAUgiu1d#2qOH?IXrV`34*c}c%fW$G4Jzhf> zGvbqKd=144q$(kRH#OSM{5OyGZgSV;+@UvFdJ3)+PGEKlGB-l1Hnbz4UI0ii> zXN)^d`DiU(TgWx;L191Le9)veY+s~Drx8- zpyY_kxT0mLv9&V8Dn8YsvWf@4e7Kd;Gaid|=+))CiiRty{5@B~%ABJSP#7L; zMz07@PP9bY$uKt0^xDVV9GU!xUEIt1AQ5wEJd(kzrAKE{-dt+s&Cni~eWGw}kX0zMWYSj#!?Bc2PT6+;RU}RkzgPbqlLu4h4J9z*$Sj{&V?*FS ziRI(AY=-x6Hp6wYo&v+7gAwHs)eeiP;Jx?_8i_T5(WyTD+z0lvBLrJz=>g4*_cM@?U#t(GCvmsYeKlA&RON^GQ~U_W{$dp+|-R zoU21CG7kyafD0Ga>!q>G51XtnMu^O8726k|O2H|>iamt~oWAREElPma?xBU)7$s|9 z<=Jj+*Kj8ZI^lGK7Jh2(kPi7M8tgiTGi}m!qG13zB$^TIKyX|EPrnayRWF=uw{%c# z@kXpI-e~J3(qA?4o(4L?_fw+7mkt1>WU_E_=i=(!jc;ep=2iX2|4S`}PWTU-8_?$o zn~w9Hw!YVezofK)d->quDBY)~__2rv2dD6H4hNMgzk8GiTdl`1kIYt!Puj4)usus( z^w8HQcU-k&)W^py)N{Oa2KPnetpmbJTi2sBWYp3%rLU9bN**|Qvsm44Y|EhQT-$w6 z>h%&u5S%oMku+El8pC(CE64QgZ`I@$tJn!JdM$O!LmZK1*bU?iwGHb`EYRh3fUY}s zbu?f~HG#eXk-Q!0yU=;@ut;L`zA603{4g51>h(HfMriPid>X@?Xgi{vlNPq*7M-T@ yw(pSQU{u||=+p-tA;gzyD6))#<~f@qU4sSK<16G359nTZ3^o2G67!Z^Xw-)Qqq7VE diff --git a/vendor/modules.txt b/vendor/modules.txt new file mode 100644 index 0000000..d6868e3 --- /dev/null +++ b/vendor/modules.txt @@ -0,0 +1,36 @@ +# github.com/aaron-lebo/ocd v0.0.0-20140809093605-ee9a3f6eca21 +github.com/aaron-lebo/ocd/feeds/atom +# github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a +github.com/beorn7/perks/quantile +# github.com/burntsushi/toml v0.3.0 +github.com/burntsushi/toml +# github.com/golang/protobuf v1.0.0 +github.com/golang/protobuf/proto +# github.com/igungor/telegram v0.0.0-20170723120259-1b4b07524109 +github.com/igungor/telegram +# github.com/matttproud/golang_protobuf_extensions v1.0.0 +github.com/matttproud/golang_protobuf_extensions/pbutil +# github.com/prometheus/client_golang v0.8.0 +github.com/prometheus/client_golang/prometheus +github.com/prometheus/client_golang/prometheus/promhttp +# github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5 +github.com/prometheus/client_model/go +# github.com/prometheus/common v0.0.0-20180312112859-e4aa40a9169a +github.com/prometheus/common/expfmt +github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg +github.com/prometheus/common/model +# github.com/prometheus/procfs v0.0.0-20180310141954-54d17b57dd7d +github.com/prometheus/procfs +github.com/prometheus/procfs/internal/util +github.com/prometheus/procfs/nfs +github.com/prometheus/procfs/xfs +# golang.org/x/net v0.0.0-20180317175401-24dd3780ca4f +golang.org/x/net/context +golang.org/x/net/context/ctxhttp +# google.golang.org/api v0.0.0-20180319000549-55e9fb4044f4 +google.golang.org/api/customsearch/v1 +google.golang.org/api/gensupport +google.golang.org/api/googleapi +google.golang.org/api/googleapi/internal/uritemplates +google.golang.org/api/googleapi/transport +google.golang.org/api/youtube/v3