fast image operations
70 files changed, 396 insertions, 5813 deletions
@@ -1,85 +1,30 @@ [package] name = "fimg" -version = "0.4.52" +version = "0.1.0" authors = ["bend-n <[email protected]>"] license = "MIT" -edition = "2024" +edition = "2021" description = "fast image operations" -repository = "https://git.bendn.org/fimg" -exclude = ["tdata", "benches/", ".gitignore"] -keywords = ["image", "affine", "scale", "drawing"] -categories = ["multimedia::images", "graphics"] +repository = "https://github.com/bend-n/fimg" -[dependencies] -mattr = "0.0.2" -png = { version = "0.18", features = ["unstable"], optional = true } -fontdue = { version = "0.7.3", optional = true } -vecto = "0.1.1" -umath = "0.0.7" -fr = { version = "0.1.1", package = "fer", optional = true } -slur = { version = "0.1.0", optional = true } -clipline = "0.4.0" -minifb = { version = "0.25.0", default-features = false, features = [ - "x11", - "wayland", -], optional = true } -wgpu = { version = "0.19.1", default-features = false, optional = true } -atools = "0.1.9" -qwant = { version = "1.0.2", optional = true } -libc = "0.2.154" -hinted = { version = "1.0.0", features = ["nightly"] } -lower = "0.2.0" -array_chunks = "1.0.0" -car = "0.1.3" +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[target.'cfg(windows)'.dependencies] -windows = { version = "0.53.0", features = [ - "Win32_System_Console", -], optional = true } +[dependencies] +png = { version = "0.17", features = ["unstable"], optional = true } [dev-dependencies] -iai = { git = "https://github.com/bend-n/iai.git" } +criterion = "0.5" [[bench]] name = "overlays" -path = "benches/overlays.rs" -harness = false - -[[bench]] -name = "drawing" -path = "benches/drawing.rs" -# harness = false - -[[bench]] -name = "affine_transformations" -path = "benches/affine_transformations.rs" -harness = false - -[[bench]] -name = "scaling" -path = "benches/scaling.rs" -harness = false - -[[bench]] -name = "tile" -path = "benches/tile.rs" harness = false [features] -scale = ["fr"] save = ["png"] -text = ["fontdue"] -blur = ["slur"] -term = ["qwant", "save", "scale", "windows"] -real-show = ["minifb", "text"] -default = ["save", "scale", "term"] -wgpu-convert = ["dep:wgpu"] +default = ["save"] [profile.release] debug = 2 opt-level = 3 lto = "thin" incremental = true - -[package.metadata.docs.rs] -all-features = true @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 bendn +Copyright (c) 2023 bendn Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -6,13 +6,4 @@ quick simple image operations - [x] overlay - [x] rotation -- [x] flipping -- [x] image tiling -- [x] image scaling -- [x] triangle drawing -- [x] line drawing -- [x] box drawing -- [x] polygon drawing -- [x] circle drawing -- [x] text drawing -- [x] blur
\ No newline at end of file +- [x] flipping
\ No newline at end of file diff --git a/benches/3_8x8.imgbuf b/benches/3_4x4.imgbuf index f3a8624..f3a8624 100644 --- a/benches/3_8x8.imgbuf +++ b/benches/3_4x4.imgbuf diff --git a/benches/3x3_at_out.imgbuf b/benches/3x3_at_out.imgbuf new file mode 100644 index 0000000..21d0141 --- /dev/null +++ b/benches/3x3_at_out.imgbuf @@ -0,0 +1 @@ +Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ��ˤ�ˤӮ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�Ӯ�
\ No newline at end of file diff --git a/benches/4_128x128.imgbuf b/benches/4_128x128.imgbuf Binary files differdeleted file mode 100644 index 07fffe9..0000000 --- a/benches/4_128x128.imgbuf +++ /dev/null diff --git a/benches/4_8x8.imgbuf b/benches/4_4x4.imgbuf index bc6cdf8..bc6cdf8 100644 --- a/benches/4_8x8.imgbuf +++ b/benches/4_4x4.imgbuf diff --git a/benches/4x3_at_out.imgbuf b/benches/4x3_at_out.imgbuf new file mode 100644 index 0000000..d5d8851 --- /dev/null +++ b/benches/4x3_at_out.imgbuf @@ -0,0 +1 @@ +������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
\ No newline at end of file diff --git a/benches/4x4_at_out.imgbuf b/benches/4x4_at_out.imgbuf new file mode 100644 index 0000000..4dedb62 --- /dev/null +++ b/benches/4x4_at_out.imgbuf @@ -0,0 +1 @@ +����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
\ No newline at end of file diff --git a/benches/affine_transformations.rs b/benches/affine_transformations.rs deleted file mode 100644 index 8ac03a4..0000000 --- a/benches/affine_transformations.rs +++ /dev/null @@ -1,36 +0,0 @@ -use fimg::*; - -macro_rules! bench { - (fn $name: ident() { run $fn: ident() } $($namec:ident)?) => { - fn $name() { - let mut bytes = *include_bytes!("4_128x128.imgbuf"); - let mut img: Image<_, 4> = - Image::build(128, 128).buf(&mut bytes); - for _ in 0..256 { - #[allow(unused_unsafe)] - unsafe { - img.as_mut().$fn() - }; - } - } - - $(fn $namec() { - let img: Image<&[u8], 4> = - Image::build(128, 128).buf(include_bytes!("4_128x128.imgbuf")); - #[allow(unused_unsafe)] - unsafe { - std::hint::black_box(img.cloner().$fn()) - }; - })? - }; -} - -bench!(fn flip_h() { run flip_h() } flip_hc); -bench!(fn flip_v() { run flip_v() } flip_vc); -bench!(fn rotate_90() { run rot_90() } rot_90c); -bench!(fn rotate_180() { run rot_180() } rot_180c); -bench!(fn rotate_270() { run rot_270() } rot_270c); -iai::main!( - flip_h, flip_v, rotate_90, rotate_180, rotate_270, flip_hc, flip_vc, rot_90c, rot_180c, - rot_270c -); diff --git a/benches/drawing.rs b/benches/drawing.rs deleted file mode 100644 index fede930..0000000 --- a/benches/drawing.rs +++ /dev/null @@ -1,21 +0,0 @@ -use fimg::*; -use umath::{generic_float::Constructors, FF32}; -fn tri() { - let mut i: Image<_, 4> = fimg::make!(4 channels 1000 x 1000).boxed(); - unsafe { - i.tri::<FF32>( - (FF32::zero(), FF32::zero()), - (FF32::new(1000.), FF32::new(500.)), - (FF32::zero(), FF32::new(999.)), - [255, 255, 255, 255], - ) - }; - iai::black_box(i); -} -fn line() { - let mut i: Image<_, 4> = fimg::make!(4 channels 500 x 750).boxed(); - i.line((-50, 20), (550, 800), [255, 165, 0, 255]); - i.save("z.png"); - iai::black_box(i); -} -iai::main!(tri, line); diff --git a/benches/overlays.rs b/benches/overlays.rs index 715a226..2236905 100644 --- a/benches/overlays.rs +++ b/benches/overlays.rs @@ -1,32 +1,65 @@ +use criterion::{criterion_group, criterion_main, Criterion}; use fimg::*; -fn overlay_3on3at() { - let mut a = fimg::make!(3 channels 128 x 128); - let b: Image<&[u8], 3> = Image::build(8, 8).buf(include_bytes!("3_8x8.imgbuf")); - for x in 0..16 { - for y in 0..16 { - unsafe { a.as_mut().overlay_at(&b, x * 8, y * 8) }; - } +pub fn criterion_benchmark(bench: &mut Criterion) { + let mut group = bench.benchmark_group("overlays"); + { + let mut a: Image<_, 3> = Image::alloc(64, 64); + let b = Image::<&[u8], 3>::new( + 4.try_into().unwrap(), + 4.try_into().unwrap(), + *&include_bytes!("3_4x4.imgbuf"), + ); + group.bench_function("overlay 3x3 offset", |bench| { + bench.iter(|| unsafe { + for x in 0..16 { + for y in 0..16 { + a.as_mut().overlay_at(&b, x * 4, y * 4); + } + } + }); + }); + assert_eq!(a.as_ref().buffer, include_bytes!("3x3_at_out.imgbuf")); } -} + { + let mut a: Image<_, 3> = Image::alloc(64, 64); + let b = Image::<&[u8], 4>::new( + 4.try_into().unwrap(), + 4.try_into().unwrap(), + *&include_bytes!("4_4x4.imgbuf"), + ); + group.bench_function("overlay 4x3 offset", |bench| { + bench.iter(|| unsafe { + for x in 0..16 { + for y in 0..16 { + a.as_mut().overlay_at(&b, x * 4, y * 4); + } + } + }); + }); -fn overlay_4on3at() { - let mut a = fimg::make!(3 channels 128 x 128); - let b: Image<&[u8], 4> = Image::build(8, 8).buf(include_bytes!("4_8x8.imgbuf")); - for x in 0..16 { - for y in 0..16 { - unsafe { a.as_mut().overlay_at(&b, x * 8, y * 8) }; - } + assert_eq!(a.as_ref().buffer, include_bytes!("4x3_at_out.imgbuf")); } -} - -fn overlay_4on4at() { - let mut a = fimg::make!(4 channels 128 x 128); - let b: Image<&[u8], 4> = Image::build(8, 8).buf(include_bytes!("4_8x8.imgbuf")); - for x in 0..16 { - for y in 0..16 { - unsafe { a.as_mut().overlay_at(&b, x * 8, y * 8) }; - } + { + let mut a: Image<_, 4> = Image::alloc(64, 64); + let b = Image::<&[u8], 4>::new( + 4.try_into().unwrap(), + 4.try_into().unwrap(), + *&include_bytes!("4_4x4.imgbuf"), + ); + group.bench_function("overlay 4x4 offset", |bench| { + bench.iter(|| unsafe { + for x in 0..16 { + for y in 0..16 { + a.as_mut().overlay_at(&b, x * 4, y * 4); + } + } + }); + }); + assert_eq!(a.as_ref().buffer, include_bytes!("4x4_at_out.imgbuf")); } + group.finish(); } -iai::main!(overlay_3on3at, overlay_4on3at, overlay_4on4at); + +criterion_group!(benches, criterion_benchmark); +criterion_main!(benches); diff --git a/benches/scaling.rs b/benches/scaling.rs deleted file mode 100644 index 3a55a6a..0000000 --- a/benches/scaling.rs +++ /dev/null @@ -1,23 +0,0 @@ -#![feature(generic_const_exprs)] -#![allow(incomplete_features)] -use fimg::{Image, scale::*}; - -macro_rules! bench { - ($([$a: ident, $alg:ident]),+ $(,)?) => { - $(fn $a() { - let img: Image<_, 3> = Image::open("tdata/cat.png"); - iai::black_box(img.scale::<$alg>(267, 178)); - })+ - - iai::main!($($a,)+); - }; -} -bench![ - [nearest, Nearest], - [bilinear, Bilinear], - [boxs, Box], - [lanczos3, Lanczos3], - [catmull, CatmullRom], - [mitchell, Mitchell], - [hamming, Hamming], -]; diff --git a/benches/tile.rs b/benches/tile.rs deleted file mode 100644 index 9d47d28..0000000 --- a/benches/tile.rs +++ /dev/null @@ -1,6 +0,0 @@ -use fimg::*; -fn repeat() { - let x: Image<&[u8], 3> = Image::build(8, 8).buf(include_bytes!("3_8x8.imgbuf")); - let _ = unsafe { x.repeated(128, 128) }; // repeat 16 times -} -iai::main!(repeat); diff --git a/data/CascadiaCode.ttf b/data/CascadiaCode.ttf Binary files differdeleted file mode 100644 index 09a679e..0000000 --- a/data/CascadiaCode.ttf +++ /dev/null diff --git a/src/affine.rs b/src/affine.rs index fe3656d..393b571 100644 --- a/src/affine.rs +++ b/src/affine.rs @@ -1,297 +1,136 @@ -//! Manages the affine image transformations. -use crate::{Image, cloner::ImageCloner}; +use crate::{FromRefMut, Image}; -impl<const CHANNELS: usize> ImageCloner<'_, CHANNELS> { - /// Flip an image vertically. - /// ``` - /// # use fimg::Image; - /// let a = Image::<_, 1>::build(2,2).buf(vec![21,42,90,01]); - /// assert_eq!(a.cloner().flip_v().take_buffer(), [90,01,21,42]); - /// ``` - #[must_use = "function does not modify the original image"] - pub fn flip_v(&self) -> Image<Vec<u8>, CHANNELS> { - let mut out = self.uninit(); - for y in 0..self.height() { - for x in 0..self.width() { - // SAFETY: looping over self, all ok (could be safe versions, bounds would be elided) - let p = unsafe { self.pixel(x, y) }; - // SAFETY: looping over self. - unsafe { out.write(p, (x, self.height() - y - 1)) }; - } - } - // SAFETY: init - unsafe { out.assume_init() } - } +pub trait Rotations { + /// Rotate a image 180 degrees clockwise. + fn rot_180(&mut self); + /// Rotate a image 90 degrees clockwise. + /// # Safety + /// + /// UB if the image is not square + unsafe fn rot_90(&mut self); + /// Rotate a image 270 degrees clockwise, or 90 degrees anti clockwise. + /// # Safety + /// + /// UB if the image is not square + unsafe fn rot_270(&mut self); +} - /// Flip an image horizontally - /// ``` - /// # use fimg::Image; - /// let a = Image::<_,1>::build(2,2).buf(vec![90,01,21,42]); - /// assert_eq!(a.cloner().flip_h().take_buffer(), [01,90,42,21]); - /// ``` - #[must_use = "function does not modify the original image"] - pub fn flip_h(&self) -> Image<Vec<u8>, CHANNELS> { - let mut out = self.uninit(); - for y in 0..self.height() { - for x in 0..self.width() { - // SAFETY: looping over self, all ok - let p = unsafe { self.pixel(x, y) }; - // SAFETY: looping over self, all ok - unsafe { out.write(p, (self.width() - x - 1, y)) }; - } - } - // SAFETY: init - unsafe { out.assume_init() } +pub trait Flips { + /// Flip a image vertically. + fn flip_v(&mut self); + + /// Flip a image horizontally. + fn flip_h(&mut self); +} + +impl<const CHANNELS: usize> Flips for Image<Vec<u8>, CHANNELS> { + fn flip_h(&mut self) { + self.as_mut().flip_h(); + } + fn flip_v(&mut self) { + self.as_mut().flip_v(); } } -impl<const CHANNELS: usize, T: AsMut<[u8]> + AsRef<[u8]>> Image<T, CHANNELS> { - /// Flip an image vertically. - pub fn flip_v(&mut self) { +impl<const CHANNELS: usize> Flips for Image<&mut [u8], CHANNELS> { + fn flip_v(&mut self) { for y in 0..self.height() / 2 { for x in 0..self.width() { let y2 = self.height() - y - 1; - #[allow(clippy::multiple_unsafe_ops_per_block)] // SAFETY: within bounds - unsafe { - self.swap_pixel((x, y2), (x, y)) - } + let p2 = unsafe { self.pixel(x, y2) }; + let p = unsafe { self.pixel(x, y) }; + unsafe { self.set_pixel(x, y2, p) }; + unsafe { self.set_pixel(x, y, p2) }; } } } - /// Flip an image horizontally. - pub fn flip_h(&mut self) { + fn flip_h(&mut self) { for y in 0..self.height() { for x in 0..self.width() / 2 { let x2 = self.width() - x - 1; - #[allow(clippy::multiple_unsafe_ops_per_block)] - // SAFETY: bounded - unsafe { - self.swap_pixel((x2, y), (x, y)) - } + let p2 = unsafe { self.pixel(x2, y) }; + let p = unsafe { self.pixel(x, y) }; + unsafe { self.set_pixel(x2, y, p) }; + unsafe { self.set_pixel(x, y, p2) }; } } } } -impl<const CHANNELS: usize> ImageCloner<'_, CHANNELS> { - /// Rotate an image 180 degrees clockwise. - /// - /// ``` - /// # use fimg::Image; - /// let a = Image::<_,1>::build(2,2).buf(vec![00,01,02,10]); - /// assert_eq!(a.cloner().rot_180().take_buffer(), vec![10,02,01,00]); - /// ``` - #[must_use = "function does not modify the original image"] - pub fn rot_180(&self) -> Image<Vec<u8>, CHANNELS> { - let s = (self.width() * self.height()) as usize; - let mut v: Vec<[u8; CHANNELS]> = Vec::with_capacity(s); - for (x, y) in self.chunked().rev().zip(&mut v.spare_capacity_mut()[..]) { - y.write(*x); - } - // SAFETY: we just wrote the right amount - unsafe { v.set_len(s) }; - Image::build(self.width(), self.height()).buf(v.into_flattened()) +impl<const CHANNELS: usize> Rotations for Image<Vec<u8>, CHANNELS> { + fn rot_180(&mut self) { + self.as_mut().rot_180(); } - /// Rotate an image 90 degrees clockwise. - /// # Safety - /// - /// UB if the image is not square - #[must_use = "function does not modify the original image"] - pub unsafe fn rot_90(&self) -> Image<Vec<u8>, CHANNELS> { - // SAFETY: yep - let mut out = unsafe { transpose_out(self) }; - // SAFETY: sqar - unsafe { crev(out.as_mut()) }; - out + unsafe fn rot_90(&mut self) { + unsafe { self.as_mut().rot_90() } } - /// Rotate an image 270 degrees clockwise, or 90 degrees anti clockwise. - /// # Safety - /// - /// UB if the image is not square - #[must_use = "function does not modify the original image"] - pub unsafe fn rot_270(&self) -> Image<Vec<u8>, CHANNELS> { - // SAFETY: yep - let mut out = unsafe { transpose_out(self) }; - out.flip_v(); - out + unsafe fn rot_270(&mut self) { + unsafe { self.as_mut().rot_270() } } } -impl<const CHANNELS: usize, T: AsMut<[u8]> + AsRef<[u8]>> Image<T, CHANNELS> { - /// Rotate an image 180 degrees clockwise. - pub fn rot_180(&mut self) { - self.flatten_mut().reverse(); +impl<const CHANNELS: usize> Rotations for Image<&mut [u8], CHANNELS> { + fn rot_180(&mut self) { + for y in 0..self.height() / 2 { + for x in 0..self.width() { + let p = unsafe { self.pixel(x, y) }; + let x2 = self.width() - x - 1; + let y2 = self.height() - y - 1; + let p2 = unsafe { self.pixel(x2, y2) }; + unsafe { self.set_pixel(x, y, p2) }; + unsafe { self.set_pixel(x2, y2, p) }; + } + } + + if self.height() % 2 != 0 { + let middle = self.height() / 2; + + for x in 0..self.width() / 2 { + let p = unsafe { self.pixel(x, middle) }; + let x2 = self.width() - x - 1; + let p2 = unsafe { self.pixel(x2, middle) }; + unsafe { self.set_pixel(x, middle, p2) }; + unsafe { self.set_pixel(x2, middle, p) }; + } + } } - /// Rotate an image 90 degrees clockwise. - /// # Safety - /// - /// UB if the image is not square #[inline] - pub unsafe fn rot_90(&mut self) { + unsafe fn rot_90(&mut self) { // This is done by first flipping self.flip_v(); - // Then transposing the image, as to not allocate. + // Then transposing the image, to save allocations. // SAFETY: caller ensures square unsafe { transpose(self) }; } - /// Rotate an image 270 degrees clockwise, or 90 degrees anti clockwise. - /// # Safety - /// - /// UB if the image is not square #[inline] - pub unsafe fn rot_270(&mut self) { + unsafe fn rot_270(&mut self) { self.flip_h(); // SAFETY: caller ensures squareness unsafe { transpose(self) }; } } -/// Reverse columns of square image -/// # Safety -/// -/// UB if supplied image not square -unsafe fn crev<const CHANNELS: usize, T: AsMut<[u8]> + AsRef<[u8]>>(mut img: Image<T, CHANNELS>) { - debug_assert_eq!(img.width(), img.height()); - let size = img.width() as usize; - let b = img.flatten_mut(); - for i in 0..size { - let mut start = 0; - let mut end = size - 1; - while start < end { - // SAFETY: hmm - unsafe { b.swap_unchecked(i * size + start, i * size + end) }; - start += 1; - end -= 1; - } - } -} - -/// Transpose a square image out of place -/// # Safety -/// -/// UB if provided image rectangular -unsafe fn transpose_out<const CHANNELS: usize>( - i: &ImageCloner<'_, CHANNELS>, -) -> Image<Vec<u8>, CHANNELS> { - let mut out = i.alloc(); - // SAFETY: yep - unsafe { - mattr::transpose( - i.flatten(), - out.flatten_mut(), - i.height() as usize, - i.width() as usize, - ) - }; - out -} - /// Transpose a square image /// # Safety /// /// UB if supplied image rectangular -unsafe fn transpose<const CHANNELS: usize, T: AsMut<[u8]> + AsRef<[u8]>>( - img: &mut Image<T, CHANNELS>, -) { - debug_assert_eq!(img.width(), img.height()); - if img.width().is_power_of_two() { - // SAFETY: caller guarantees - unsafe { transpose_diag(img, 0, img.width() as usize) }; - } else { - // SAFETY: caller guarantees - unsafe { transpose_non_power_of_two(img) }; - } -} - -/// Transpose a square (non power of two) image. -/// -/// # Safety -/// -/// UB if image not square -unsafe fn transpose_non_power_of_two<const CHANNELS: usize, T: AsMut<[u8]> + AsRef<[u8]>>( - img: &mut Image<T, CHANNELS>, -) { +unsafe fn transpose<const CHANNELS: usize>(img: &mut Image<&mut [u8], CHANNELS>) { debug_assert_eq!(img.width(), img.height()); let size = img.width() as usize; - let b = img.flatten_mut(); + // SAFETY: no half pixels + let b = unsafe { img.buffer.as_chunks_unchecked_mut::<CHANNELS>() }; for i in 0..size { for j in i..size { // SAFETY: caller ensures squarity - unsafe { b.swap_unchecked(i * size + j, j * size + i) }; - } - } -} - -/// break it down until -const TILE: usize = 4; -/// # Safety -/// -/// be careful -unsafe fn transpose_tile<const CHANNELS: usize, T: AsMut<[u8]> + AsRef<[u8]>>( - img: &mut Image<T, CHANNELS>, - row: usize, - col: usize, - size: usize, -) { - if size > TILE { - #[allow( - clippy::multiple_unsafe_ops_per_block, - clippy::undocumented_unsafe_blocks - )] - unsafe { - // top left - transpose_tile(img, row, col, size / 2); - // top right - transpose_tile(img, row, col + size / 2, size / 2); - // bottom left - transpose_tile(img, row + size / 2, col, size / 2); - // bottom right - transpose_tile(img, row + size / 2, col + size / 2, size / 2); - } - } else { - let s = img.width() as usize; - let b = img.flatten_mut(); - for i in 0..size { - for j in 0..size { - // SAFETY: this should be okay if we careful - unsafe { b.swap_unchecked((row + i) * s + (col + j), (col + j) * s + (row + i)) }; - } - } - } -} - -/// # Safety -/// -/// be careful -unsafe fn transpose_diag<const CHANNELS: usize, T: AsMut<[u8]> + AsRef<[u8]>>( - img: &mut Image<T, CHANNELS>, - pos: usize, - size: usize, -) { - if size > TILE { - #[allow( - clippy::multiple_unsafe_ops_per_block, - clippy::undocumented_unsafe_blocks - )] - unsafe { - transpose_diag(img, pos, size / 2); - transpose_tile(img, pos, pos + size / 2, size / 2); - transpose_diag(img, pos + size / 2, size / 2); - } - } else { - let s = img.width() as usize; - let b = img.flatten_mut(); - for i in 1..size { - for j in 0..i { - // SAFETY: this is fine unless pos / size is out of bounds, which it cant be - unsafe { b.swap_unchecked((pos + i) * s + (pos + j), (pos + j) * s + (pos + i)) }; - } + unsafe { + b.swap_unchecked(i * size + j, j * size + i); + }; } } } @@ -302,62 +141,6 @@ mod tests { use crate::img; #[test] - fn transp() { - #[rustfmt::skip] - let mut i = Image::<_, 1>::build(8, 8).buf(vec![ - 0, 0, 1, 1, 0, 0, 1, 1, - 0, 1, 0, 1, 1, 0, 1, 1, - 0, 1, 1, 0, 1, 0, 1, 1, - 0, 1, 1, 1, 0, 0, 1, 1, - 0, 1, 1, 1, 1, 0, 1, 1, - 0, 1, 1, 1, 1, 0, 0, 1, - 0, 1, 1, 1, 1, 0, 1, 0, - 0, 0, 1, 1, 1, 0, 1, 1, - ]); - unsafe { transpose(&mut i.as_mut()) }; - #[rustfmt::skip] - assert_eq!(i.take_buffer(), vec![ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 0, - 1, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 1, - 0, 1, 1, 0, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1 - ]); - } - - #[test] - fn transp9() { - #[rustfmt::skip] - let mut i = Image::<_, 1>::build(9, 9).buf(vec![ - 0, 0, 1, 1, 0, 0, 1, 1, 0, - 0, 1, 0, 1, 1, 0, 1, 1, 1, - 0, 1, 1, 0, 1, 0, 1, 1, 0, - 0, 1, 1, 1, 0, 0, 1, 1, 0, - 0, 1, 1, 1, 1, 0, 1, 1, 1, - 0, 1, 1, 1, 1, 0, 0, 1, 1, - 0, 1, 1, 1, 1, 0, 1, 0, 1, - 0, 0, 1, 1, 1, 0, 1, 1, 0, - 1, 1, 1, 0, 1, 1, 0, 1, 0, - ]); - unsafe { transpose(&mut i.as_mut()) }; - #[rustfmt::skip] - assert_eq!(i.take_buffer(), vec![ - 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 0, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 1, 1, 1, 1, 1, 0, - 0, 1, 1, 0, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 1, 0, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 0, 1, 1, - 0, 1, 0, 0, 1, 1, 1, 0, 0 - ]); - } - - #[test] fn rotate_90() { let mut from = img![ [00, 01] @@ -436,3 +219,35 @@ mod tests { ); } } + +#[cfg(test)] +mod bench { + use super::*; + extern crate test; + use crate::Image; + use test::Bencher; + + macro_rules! bench { + (fn $name: ident() { run $fn: ident() }) => { + #[bench] + fn $name(b: &mut Bencher) { + let mut img: Image<_, 4> = Image::new( + 64.try_into().unwrap(), + 64.try_into().unwrap(), + include_bytes!("../test_data/4_180x180.imgbuf").to_vec(), + ); + b.iter(|| { + for _ in 0..256 { + img.flip_h(); + } + }); + } + }; + } + + bench!(fn flip_h() { run flip_h() }); + bench!(fn flip_v() { run flip_v() }); + bench!(fn rotate_90() { run rot_90() }); + bench!(fn rotate_180() { run rot_180() }); + bench!(fn rotate_270() { run rot_270() }); +} diff --git a/src/blur.rs b/src/blur.rs deleted file mode 100644 index a2ad92e..0000000 --- a/src/blur.rs +++ /dev/null @@ -1,169 +0,0 @@ -use slur::{ - color::{u32xN, BlurU32}, - imgref::ImgRefMut, -}; -use std::{ - ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign}, - simd::Simd, -}; - -use crate::Image; - -impl<T: AsMut<[u32]> + AsRef<[u32]>> Image<T, 1> { - /// Blur a image of packed 32 bit integers, `[0xAARRGGBB]`. - pub fn blur_argb(&mut self, radius: usize) { - let w = self.width() as usize; - let h = self.height() as usize; - slur::simd_blur_argb::<4>(&mut ImgRefMut::new(self.buffer.as_mut(), w, h), radius) - } -} - -macro_rules! simd { - ($n:literal) => { - impl<T: AsMut<[u8]> + AsRef<[u8]>> Image<T, $n> { - /// Blur a image. - pub fn blur_in(&mut self, radius: usize) { - let (w, h) = (self.width() as usize, self.height() as usize); - let px = self.flatten_mut(); - slur::blur( - &mut ImgRefMut::new(px, w, h), - radius, - |x| slur::color::u32xN(std::simd::Simd::from_array(x.map(|x| x as u32))), - |x| x.0.to_array().map(|x| x as u8), - ); - } - } - }; -} - -simd!(4); -simd!(2); - -impl<T: AsMut<[u8]> + AsRef<[u8]>> Image<T, 3> { - /// Blur a image. - /// ``` - /// # use fimg::Image; - /// let mut i = Image::alloc(300, 300).boxed(); - /// // draw a trongle - /// i.poly((150., 150.), 3, 100.0, 0.0, [255, 255, 255]); - /// // give it some blur - /// i.blur_in(25); - /// ``` - pub fn blur_in(&mut self, radius: usize) { - let (w, h) = (self.width() as usize, self.height() as usize); - let px = self.flatten_mut(); - slur::blur( - &mut ImgRefMut::new(px, w, h), - radius, - |x| Px::from(*x), - |x| x.into(), - ); - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>> Image<T, 1> { - /// Blur a image. No copy. - /// ``` - /// # use fimg::Image; - /// let mut i = Image::alloc(300, 300); - /// // draw a lil pentagon - /// i.poly((150., 150.), 5, 100.0, 0.0, [255]); - /// // give it some blur - /// i.blur(25); - /// # assert_eq!(include_bytes!("../tdata/blurred_pentagon.imgbuf"), i.bytes()) - /// ``` - pub fn blur(&mut self, radius: usize) { - let (w, h) = (self.width() as usize, self.height() as usize); - slur::simd_blur::<_, _, _, 8>( - &mut ImgRefMut::new(self.buffer.as_mut(), w, h), - radius, - |x| u32xN(Simd::from_array(x.map(|&x| x as u32))), - |x| x.0.as_array().map(|x| x as u8), - |&x| BlurU32(x as u32), - |x| x.0 as u8, - ); - } -} - -macro_rules! blur_packing { - ($n:literal) => { - impl<T: AsRef<[u8]> + AsMut<[u8]>> Image<T, $n> { - /// Blur a image. This will allocate a <code>[Image]<[Box]<[[u32]]>, 1></code>. - /// If you want no copy, but slower if you dont have a simd-able cpu, check out [`Image::blur_in`]. - /// ``` - /// # use fimg::Image; - /// let mut i = Image::alloc(300, 300); - /// // draw a sqar - /// i.poly((150., 150.), 4, 100.0, 0.0, [255]); - /// // give it some blur - /// i.blur(25); - /// ``` - pub fn blur(&mut self, radius: usize) { - // the bit twiddling lets it simd better - let mut argb = Image::<Box<[u32]>, 1>::from(self.as_ref()); - argb.blur_argb(radius); - for (i, n) in crate::convert::unpack_all::<$n>(&argb.buffer).enumerate() { - *unsafe { self.buffer.as_mut().get_unchecked_mut(i) } = n; - } - } - } - }; -} -blur_packing!(2); -blur_packing!(3); -blur_packing!(4); - -#[repr(transparent)] -#[derive(Copy, Clone)] -struct Px<const N: usize>([u32; N]); - -impl<const N: usize> Default for Px<N> { - fn default() -> Self { - Self([0; N]) - } -} - -impl<const N: usize> From<[u8; N]> for Px<N> { - fn from(x: [u8; N]) -> Self { - Self(x.map(|x| x as u32)) - } -} - -impl<const N: usize> From<Px<N>> for [u8; N] { - fn from(v: Px<N>) -> Self { - v.0.map(|x| x as u8) - } -} - -macro_rules! op { - ($name:ident, $as:ident, $fn:ident, $ass_fn:ident, $meth:ident) => { - impl<const N: usize> $name<usize> for Px<N> { - type Output = Px<N>; - - fn $fn(self, rhs: usize) -> Self::Output { - Self(self.0.map(|x| x.$meth(rhs as u32))) - } - } - - impl<const N: usize> $name for Px<N> { - type Output = Px<N>; - fn $fn(self, rhs: Px<N>) -> Self::Output { - let mut out = [0; N]; - for ((a, b), x) in self.0.iter().zip(rhs.0.iter()).zip(out.iter_mut()) { - *x = a.$meth(*b); - } - Self(out) - } - } - - impl<const N: usize> $as for Px<N> { - fn $ass_fn(&mut self, rhs: Self) { - *self = self.$fn(rhs); - } - } - }; -} -op!(Mul, MulAssign, mul, mul_assign, wrapping_mul); -op!(Sub, SubAssign, sub, sub_assign, wrapping_sub); -op!(Add, AddAssign, add, add_assign, wrapping_add); -op!(Div, DivAssign, div, div_assign, wrapping_div); diff --git a/src/builder.rs b/src/builder.rs deleted file mode 100644 index ec0e518..0000000 --- a/src/builder.rs +++ /dev/null @@ -1,92 +0,0 @@ -//! safe builder for the image -//! -//! does not let you do funny things -use std::marker::PhantomData; - -use crate::Image; - -impl<B, const C: usize> Image<B, C> { - /// creates a builder - pub const fn build<I>(w: u32, h: u32) -> Builder<B, C> - where - B: AsRef<[I]>, - { - Builder::new(w, h) - } -} - -/// Safe [`Image`] builder. -#[must_use = "builder must be consumed"] -pub struct Builder<B, const C: usize> { - /// the width in a zeroable type. zeroable so as to make the check in [`buf`] easier. - width: u32, - /// the height in a zeroable type. - height: u32, - #[allow(clippy::missing_docs_in_private_items)] - _buffer: PhantomData<B>, -} -impl<B, const C: usize> Builder<B, C> { - /// create new builder - pub const fn new(w: u32, h: u32) -> Self { - Self { - width: w, - height: h, - _buffer: PhantomData, - } - } - - /// apply a buffer, and build - #[track_caller] - #[must_use = "what is it going to do?"] - pub fn buf<I>(self, buffer: B) -> Image<B, C> - where - B: AsRef<[I]>, - { - let len = C as u32 * self.width * self.height; - assert!( - buffer.as_ref().len() as u32 == len, - "invalid buffer size (expected {len}, got {})", - buffer.as_ref().len() - ); - // SAFETY: checked! - unsafe { self.buf_unchecked(buffer) } - } - /// apply a buffer, and build (length unchecked) - #[track_caller] - #[must_use = "what is it going to do?"] - pub unsafe fn buf_unchecked<I>(self, buffer: B) -> Image<B, C> - where - B: AsRef<[I]>, - { - Image { - buffer, - width: self.width.try_into().expect("passed zero width to builder"), - height: self - .height - .try_into() - .expect("passed zero height to builder"), - } - } -} - -impl<const C: usize> Builder<Vec<u8>, C> { - /// allocate this image - #[must_use = "what is it going to do?"] - pub fn alloc(self) -> Image<Vec<u8>, C> { - Image::alloc(self.width, self.height) - } -} - -impl<T: Copy, const C: usize> Builder<Box<[T]>, C> { - /// Fill this image with a certain pixel. - /// ``` - /// # use fimg::Image; - /// - /// // fill black - /// Image::build(50, 50).fill([0, 0, 0, 255]); - /// ``` - pub fn fill(self, with: [T; C]) -> Image<Box<[T]>, C> { - Image::build(self.width, self.height) - .buf((0..self.width * self.height).flat_map(|_| with).collect()) - } -} diff --git a/src/cloner.rs b/src/cloner.rs deleted file mode 100644 index 0d92db7..0000000 --- a/src/cloner.rs +++ /dev/null @@ -1,44 +0,0 @@ -//! provides a [`ImageCloner`] -//! -//! ``` -//! # use fimg::Image; -//! # let i = Image::<_, 1>::alloc(5, 5); -//! unsafe { i.cloner().rot_270() }; -//! ``` -use crate::{Image, uninit}; - -/// A neat way to clone a image. -/// -/// Consider it a way to clone->apply a image operation, but better. -/// Please note that some methods may(although none at current) have different safety invariants from their in place counterparts. -pub struct ImageCloner<'a, const C: usize>(Image<&'a [u8], C>); - -impl<'a, const C: usize> ImageCloner<'a, C> { - /// duplicate the inner image. - pub(crate) fn dup(&self) -> Image<Vec<u8>, C> { - self.0.to_owned() - } - - /// create a new uninit image the right size for use - pub(crate) fn uninit(&self) -> uninit::Image<u8, C> { - uninit::Image::new(self.width, self.height) - } - - /// Create a [`ImageCloner`] from a <code>[Image]<&\[[u8]\]></code> - pub const fn from(i: Image<&'a [u8], C>) -> Self { - Self(i) - } - - /// Alloc a buffer the right size for use - pub(crate) fn alloc(&self) -> Image<Vec<u8>, C> { - Image::alloc(self.width(), self.height()) - } -} - -impl<'a, const C: usize> std::ops::Deref for ImageCloner<'a, C> { - type Target = Image<&'a [u8], C>; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} diff --git a/src/convert.rs b/src/convert.rs deleted file mode 100644 index daa04fb..0000000 --- a/src/convert.rs +++ /dev/null @@ -1,195 +0,0 @@ -//! define From's for images. -//! these conversions are defined by [`PFrom`]. -use crate::{Image, Pack, pixels::convert::PFrom}; -use array_chunks::*; -use core::intrinsics::{fmul_algebraic, fsub_algebraic, transmute_unchecked as transmute}; -use std::{ - mem::MaybeUninit as MU, - simd::{SimdElement, StdFloat, prelude::*}, -}; - -fn map<const A: usize, const B: usize>(image: Image<&[u8], A>) -> Image<Box<[u8]>, B> -where - [u8; B]: PFrom<A>, -{ - // SAFETY: size unchanged, just change pixels - unsafe { - image.mapped(|buf| { - buf.array_chunks::<A>() - .copied() - .flat_map(<[u8; B] as PFrom<A>>::pfrom) - .collect() - }) - } -} - -macro_rules! convert { - ($a:literal => $b:literal) => { - impl From<Image<&[u8], $b>> for Image<Box<[u8]>, $a> { - fn from(value: Image<&[u8], $b>) -> Self { - map(value) - } - } - }; -} - -macro_rules! cv { - [$($n:literal),+] => { - $(convert!($n => 1); - convert!($n => 2); - convert!($n => 3); - convert!($n => 4);)+ - }; -} - -cv![1, 2, 3, 4]; - -macro_rules! boxconv { - ($a:literal => $b: literal) => { - impl From<Image<Box<[u8]>, $b>> for Image<Box<[u8]>, $a> { - fn from(value: Image<Box<[u8]>, $b>) -> Self { - value.as_ref().into() - } - } - }; -} - -boxconv!(1 => 2); -boxconv!(1 => 3); -boxconv!(1 => 4); - -boxconv!(2 => 1); -boxconv!(2 => 3); -boxconv!(2 => 4); - -boxconv!(3 => 1); -boxconv!(3 => 2); -boxconv!(3 => 4); - -boxconv!(4 => 1); -boxconv!(4 => 2); -boxconv!(4 => 3); - -impl<const N: usize> From<Image<&[u8], N>> for Image<Box<[u32]>, 1> -where - [u8; N]: Pack, -{ - /// Pack into ARGB. - fn from(value: Image<&[u8], N>) -> Self { - let buf = value.chunked().map(Pack::pack).collect(); - // SAFETY: ctor - unsafe { Self::new(value.width, value.height, buf) } - } -} - -pub fn unpack_all<const N: usize>(buffer: &[u32]) -> impl Iterator<Item = u8> + '_ -where - [u8; N]: Pack, -{ - buffer.iter().copied().flat_map(<[u8; N]>::unpack) -} - -impl<const N: usize> From<Image<&[u32], 1>> for Image<Box<[u8]>, N> -where - [u8; N]: Pack, -{ - fn from(value: Image<&[u32], 1>) -> Self { - let buf = unpack_all(value.buffer).collect(); - // SAFETY: ctor - unsafe { Self::new(value.width, value.height, buf) } - } -} - -fn u8_to_f32(x: u8) -> f32 { - let magic = 2.0f32.powf(23.); - // x = 2^23 + x - let x = f32::from_bits((x as u32) ^ magic.to_bits()); - fmul_algebraic(fsub_algebraic(x, magic), 1.0 / 255.0) -} - -fn u8s_to_f32s(x: u8x8) -> f32x8 { - let x = x.cast::<u32>(); - let magic = (1 << 23) as f32; - // SAFETY: its a simd, i can do what i want with it - let x = unsafe { transmute::<_, f32x8>(x ^ Simd::splat(magic.to_bits())) }; - x.mul_add(Simd::splat(1.0 / 255.0), Simd::splat(-magic / 255.0)) -} - -// notice: this f32 better be in range 0.0-1.0 -fn f32_to_u8(x: f32) -> u8 { - let magic = (1 << 23) as f32; - (x.mul_add(255.0, magic).to_bits() ^ magic.to_bits()) as u8 -} - -fn f32s_to_u8s(x: f32x8) -> u8x8 { - let magic = (1 << 23) as f32; - (x.mul_add(Simd::splat(255.0), Simd::splat(magic)).cast() ^ Simd::splat(magic.to_bits())).cast() -} - -fn mapping<T, U>( - x: &[T], - mut f: impl FnMut(Simd<T, 8>) -> Simd<U, 8>, - mut single: impl FnMut(T) -> U, -) -> Vec<U> -where - T: SimdElement, - U: SimdElement, - [(); (size_of::<Simd<T, 8>>() == size_of::<[T; 8]>()) as usize - 1]:, -{ - let mut out = Vec::with_capacity(x.len()); - let to = out.spare_capacity_mut(); - let (to, to_rest) = to.as_chunks_mut::<8>(); - let (from, from_rest) = x.as_chunks::<8>(); - for (&line, into) in from.iter().zip(to) { - // SAFETY: safe transmute (see condition) - unsafe { *into = transmute::<_, [MU<U>; 8]>(f(Simd::from_array(line))) }; - } - for (i, &from) in from_rest.iter().enumerate() { - // SAFETY: compiler doesnt like it when i zip this - unsafe { to_rest.get_unchecked_mut(i) }.write(single(from)); - } - // SAFETY: initialized. - unsafe { out.set_len(x.len()) }; - out -} - -impl<const N: usize> From<Image<&[u8], N>> for Image<Box<[f32]>, N> { - /// Reduce to 0.0-1.0 from 0-255. - fn from(value: Image<&[u8], N>) -> Self { - // SAFETY: length unchanged - unsafe { value.mapped(|x| mapping(x, u8s_to_f32s, u8_to_f32).into_boxed_slice()) } - } -} - -impl<const N: usize> From<Image<&[f32], N>> for Image<Box<[u8]>, N> { - /// Expand to 0-255 from 0.0-1.0 - fn from(value: Image<&[f32], N>) -> Self { - // SAFETY: length unchanged - unsafe { value.mapped(|x| mapping(x, f32s_to_u8s, f32_to_u8).into_boxed_slice()) } - } -} - -#[test] -fn roundtrip() { - let original = Image::<_, 3>::open("tdata/small_cat.png"); - assert!( - Image::<Box<[u8]>, 3>::from(Image::<Box<[f32]>, 3>::from(original.as_ref()).as_ref(),) - // .show() - .bytes() - == original.bytes() - ); -} - -impl<const N: usize, T: AsRef<[u8]>> Image<T, N> { - /// just an `into` wrapper - pub fn to_f32(&self) -> Image<Box<[f32]>, N> { - self.as_ref().into() - } -} - -impl<const N: usize, T: AsRef<[f32]>> Image<T, N> { - /// just an `into` wrapper - pub fn to_u8(&self) -> Image<Box<[u8]>, N> { - self.as_ref().into() - } -} diff --git a/src/drawing/box.rs b/src/drawing/box.rs deleted file mode 100644 index a2c90bd..0000000 --- a/src/drawing/box.rs +++ /dev/null @@ -1,110 +0,0 @@ -//! `Box<cat>` -use std::ops::Range; - -use crate::Image; - -impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS> { - /// Draw a bordered box - /// ``` - /// # use fimg::Image; - /// let mut b = Image::alloc(10, 9); - /// b.as_mut().r#box((1, 1), 7, 6, [255]); - /// # assert_eq!(b.buffer(), b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\x00\x00\x00\x00\x00\x00\xff\x00\x00\xff\x00\x00\x00\x00\x00\x00\xff\x00\x00\xff\x00\x00\x00\x00\x00\x00\xff\x00\x00\xff\x00\x00\x00\x00\x00\x00\xff\x00\x00\xff\x00\x00\x00\x00\x00\x00\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") - /// ``` - pub fn r#box(&mut self, (x1, y1): (u32, u32), width: u32, height: u32, c: [u8; CHANNELS]) { - // skip sides, leave that to second loop - for x in clamp(x1 + 1..width + x1, 0..self.width()) { - // SAFETY: clamped to bounds - unsafe { self.set_pixel(x, y1, &c) }; - } - for x in clamp(x1 + 1..width + x1, 0..self.width()) { - // SAFETY: clamped to bounds - unsafe { self.set_pixel(x, (y1 + height).min(self.height() - 1), &c) }; - } - for y in clamp(y1..height + y1 + 1, 0..self.height()) { - // SAFETY: clamped to bounds - unsafe { self.set_pixel(x1, y, &c) }; - } - for y in clamp(y1..height + y1 + 1, 0..self.height()) { - // SAFETY: clamped to bounds - unsafe { self.set_pixel((x1 + width).min(self.width() - 1), y, &c) }; - } - } - - /// Draw a *filled* box. - /// ``` - /// # use fimg::Image; - /// let mut b = Image::alloc(10, 9); - /// b.as_mut().filled_box((1, 1), 7, 6, [255]); - /// # assert_eq!(b.buffer(), b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") - /// ``` - pub fn filled_box(&mut self, (x1, y1): (u32, u32), width: u32, height: u32, c: [u8; CHANNELS]) { - for x in clamp(x1..1 + width + x1, 0..self.width()) { - for y in clamp(y1..1 + height + y1, 0..self.height()) { - // SAFETY: clamped to bounds - unsafe { self.set_pixel(x, y, &c) }; - } - } - } - - /// Draw a stroked box - /// ``` - /// # use fimg::Image; - /// let mut b = Image::alloc(11, 11); - /// b.as_mut().stroked_box((2, 2), 6, 6, 2, [255]); - /// # assert_eq!(b.buffer(), b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"); - /// ``` - pub fn stroked_box( - &mut self, - (x1, y1): (u32, u32), - width: u32, - height: u32, - stroke: u32, - c: [u8; CHANNELS], - ) { - let n = stroke / 2; - for n in 0..=n { - // TODO this is slightly stupid - // move it up and left, expand w, h - self.r#box((x1 - n, y1 - n), width + n + n, height + n + n, c) - } - } -} - -/// clamp a range with another range -fn clamp(r: Range<u32>, within: Range<u32>) -> Range<u32> { - r.start.clamp(within.start, within.end)..r.end.clamp(within.start, within.end) -} - -#[cfg(test)] -mod tests { - use crate::Image; - #[test] - fn box_oob() { - let mut i = Image::alloc(5, 5); - i.r#box((7, 7), 5, 5, [255]); - assert_eq!(i.buffer(), &[0u8; 5 * 5]); - } - - #[test] - fn partial_oob() { - let mut i = Image::alloc(5, 5); - i.r#box((2, 2), 2, 17, [255]); - assert_eq!(i.buffer(),b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\xff\x00\xff\x00\x00\xff\xff\xff"); - } - - #[test] - fn thick_box_oob() { - let mut i = Image::alloc(5, 5); - i.stroked_box((7, 7), 5, 5, 2, [255]); - assert_eq!(i.buffer(), &[0u8; 5 * 5]); - } - - #[test] - fn thick_box_partial_oob() { - let mut i = Image::alloc(15, 15); - i.stroked_box((2, 2), 4, 17, 2, [255]); - // ideally the bottom would have a 2 stroke line, alas tis difficult. - assert_eq!(i.buffer(), b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00"); - } -} diff --git a/src/drawing/circle.rs b/src/drawing/circle.rs deleted file mode 100644 index 421cb6a..0000000 --- a/src/drawing/circle.rs +++ /dev/null @@ -1,66 +0,0 @@ -//! draw 2d circles -use crate::Image; - -impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS> { - /// Draws a circle, using the [Bresenham's circle](https://en.wikipedia.org/wiki/Midpoint_circle_algorithm) algorithm. - /// ``` - /// # use fimg::Image; - /// let mut i = Image::alloc(50, 50); - /// i.border_circle((25, 25), 20, [255]); - /// # assert_eq!(i.buffer(), include_bytes!("../../tdata/circle.imgbuf")); - /// ``` - pub fn border_circle(&mut self, (xc, yc): (i32, i32), radius: i32, c: [u8; CHANNELS]) { - let mut x = 0; - let mut y = radius; - let mut p = 1 - radius; - /// bounds the pixels - macro_rules! bound { - ($($x:expr,$y:expr);+;) => { - $(if $x >= 0 && $x < self.width() as i32 && $y >= 0 && $y < self.height() as i32 { - // SAFETY: ^ - unsafe { self.set_pixel($x as u32, $y as u32, &c) }; - })+ - }; - } - while x <= y { - bound! { - xc + x, yc + y; - xc + y, yc + x; - xc - y, yc + x; - xc - x, yc + y; - xc - x, yc - y; - xc - y, yc - x; - xc + y, yc - x; - xc + x, yc - y; - }; - x += 1; - if p < 0 { - p += 2 * x + 1; - } else { - y -= 1; - p += 2 * (x - y) + 1; - } - } - } - - /// Draw a filled circle. - /// ``` - /// # use fimg::Image; - /// let mut i = Image::alloc(50, 50); - /// i.circle((25, 25), 20, [255]); - /// # assert_eq!(i.buffer(), include_bytes!("../../tdata/circle2.imgbuf")); - /// ``` - pub fn circle(&mut self, (xc, yc): (i32, i32), radius: i32, c: [u8; CHANNELS]) { - for x in -radius..radius { - let h = ((radius * radius - x * x) as f32).sqrt().round() as i32; - for y in -h..h { - let x = x + xc; - let y = y + yc; - if x >= 0 && x < self.width() as i32 && y >= 0 && y < self.height() as i32 { - // SAFETY: ^ - unsafe { self.set_pixel(x as u32, y as u32, &c) }; - } - } - } - } -} diff --git a/src/drawing/line.rs b/src/drawing/line.rs deleted file mode 100644 index 24c0df4..0000000 --- a/src/drawing/line.rs +++ /dev/null @@ -1,71 +0,0 @@ -//! adds a `line` function to Image -use crate::Image; -use vecto::Vec2; - -impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS> { - /// Draw a half-open line from point a to point b. - /// - /// Points not in bounds will not be included. - pub fn line(&mut self, a: (i32, i32), b: (i32, i32), color: [u8; CHANNELS]) { - clipline::Clip::<i32>::from_size(self.width(), self.height()) - .unwrap() // fixme: panics if width or height > i32::MAX + 1 - .line_b_proj(a.0, a.1, b.0, b.1) - .into_iter() - .flatten() - .for_each(|(x, y)| { - // SAFETY: x, y are clipped to self. - unsafe { self.set_pixel(x, y, &color) } - }); - } - - /// Draw a thick line from point a to point b. - /// Prefer [`Image::line`] when possible. - /// - /// Points not in bounds will not be included. - /// - /// Uses [`Image::quad`]. - /// ``` - /// # use fimg::Image; - /// let mut i = Image::alloc(10, 10); - /// i.thick_line((2.0, 2.0), (8.0, 8.0), 2.0, [255]); - /// # assert_eq!(i.buffer(), b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00"); - /// ``` - pub fn thick_line( - &mut self, - a: impl Into<Vec2>, - b: impl Into<Vec2>, - stroke: f32, - color: [u8; CHANNELS], - ) { - let a = a.into(); - let b = b.into(); - let w = (a - b).orthogonal().normalized() * (stroke / 2.0); - macro_rules! p { - ($x:expr) => { - #[allow(clippy::cast_possible_truncation)] - ($x.x.round() as i32, $x.y.round() as i32) - }; - } - // order: - // v x1 v x2 - // [ ] - // ^ x3 ^ x4 - self.quad( - p!(a - w), // x1 - p!(b - w), // x2 - p!(b + w), // x3 - p!(a + w), // x4 - color, - ); - } -} - -#[test] -fn line() { - let mut a = Image::build(5, 5).alloc(); - a.as_mut().line((0, 1), (6, 4), [255]); - assert_eq!( - a.buffer, - b"\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00" - ) -} diff --git a/src/drawing/mod.rs b/src/drawing/mod.rs deleted file mode 100644 index 2196925..0000000 --- a/src/drawing/mod.rs +++ /dev/null @@ -1,10 +0,0 @@ -//! contains drawing operations, like -//! {line, box, triangle, polygon, circle, text} -//! drawing -mod r#box; -mod circle; -mod line; -mod poly; -#[cfg(feature = "text")] -mod text; -mod tri; diff --git a/src/drawing/poly.rs b/src/drawing/poly.rs deleted file mode 100644 index 5a67a07..0000000 --- a/src/drawing/poly.rs +++ /dev/null @@ -1,186 +0,0 @@ -//! draw polygons -use crate::Image; -use crate::math::{FExt, madd}; -use array_chunks::*; -use std::cmp::{max, min}; -use std::f32::consts::TAU; -use vecto::Vec2; - -impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS> { - /// Draws a filled polygon from a slice of points. Please close your poly. (first == last) - /// - /// Borrowed from [imageproc](https://docs.rs/imageproc/latest/src/imageproc/drawing/polygon.rs.html#31), modified for less allocations. - /// ``` - /// # use fimg::Image; - /// let mut i = Image::alloc(10, 10); - /// i.points(&[(1, 8), (3, 1), (8, 1), (6, 6), (8, 8), (1, 8)], [255]); - /// # assert_eq!(i.buffer(), b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"); - /// ``` - pub fn points(&mut self, poly: &[(i32, i32)], c: [u8; CHANNELS]) { - if poly.len() <= 1 { - return; - } - let (mut y_max, mut y_min) = poly[..poly.len() - 1] - .iter() - .fold((i32::MIN, i32::MAX), |(max, min), &(_, y)| { - (y.max(max), y.min(min)) - }); - y_min = max(0, min(y_min, self.height() as i32 - 1)); - y_max = max(0, min(y_max, self.height() as i32 - 1)); - let mut intersections = vec![]; - for y in y_min..=y_max { - for [p0, p1] in poly.array_windows::<2>() { - if p0.1 <= y && p1.1 >= y || p1.1 <= y && p0.1 >= y { - if p0.1 == p1.1 { - intersections.push(p0.0); - intersections.push(p1.0); - } else if p0.1 == y || p1.1 == y { - if p1.1 > y { - intersections.push(p0.0); - } - if p0.1 > y { - intersections.push(p1.0); - } - } else { - let fraction = (y - p0.1) as f32 / (p1.1 - p0.1) as f32; - let inter = madd(fraction, (p1.0 - p0.0) as f32, p0.0 as f32); - intersections.push(inter.round() as i32); - } - } - } - intersections.sort_unstable(); - for &[x, y_] in intersections.array_chunks::<2>() { - let mut from = min(x, self.width() as i32); - let mut to = min(y_, self.width() as i32 - 1); - if from < self.width() as i32 && to >= 0 { - // check bounds - from = max(0, from); - to = max(0, to); - - for x in from..=to { - // SAFETY: bounds are checked - unsafe { self.set_pixel(x as u32, y as u32, &c) }; - } - } - } - intersections.clear(); - } - - for &[(x1, y1), (x2, y2)] in poly.array_windows::<2>() { - self.line((x1, y1), (x2, y2), c); - } - } - - /// Draws a filled quadrilateral. - /// This currently just uses [`Image::points`], but in the future this may change. - pub fn quad( - &mut self, - a: (i32, i32), - b: (i32, i32), - c: (i32, i32), - d: (i32, i32), - col: [u8; CHANNELS], - ) { - self.points(&[a, b, c, d, a], col); - } - - /// Draws a regular convex polygon with a specified number of sides, a radius, and a rotation (radians). - /// Prefer [`Image::circle`] over `poly(.., 600, ..)`. - /// Calls into [`Image::tri`] and [`Image::quad`]. - /// ``` - /// # use fimg::Image; - /// let mut i = Image::alloc(300, 300); - /// // draw a enneagon - /// // at x150, y150 │ unrotated white - /// // with a radius of ─┼──╮ │ │ - /// i.poly((150., 150.), 9, 100.0, 0.0, [255]); - /// # assert_eq!(i.buffer(), include_bytes!("../../tdata/enneagon.imgbuf")); - /// ``` - pub fn poly( - &mut self, - pos: impl Into<Vec2>, - sides: usize, - radius: f32, - rotation: f32, - c: [u8; CHANNELS], - ) { - let pos = pos.into(); - let trans = |a: f32| Vec2::from_angle(a) * radius; - let r = |v: Vec2| (v.x.round() as i32, v.y.round() as i32); - match sides { - 3 => { - let space = TAU / 3.0; - self.tri::<f32>( - trans(space + rotation) + pos, - trans(rotation) + pos, - trans(madd(space, 2.0, rotation)) + pos, - c, - ); - } - _ => { - let space = TAU / sides as f32; - for i in (0..sides - 1).step_by(2).map(|i| i as f32) { - self.quad( - r(pos), - r(trans(madd(space, i, rotation)) + pos), - r(trans(madd(space, i + 1., rotation)) + pos), - r(trans(madd(space, i + 2., rotation)) + pos), - c, - ); - } - - if sides % 2 != 0 && sides > 4 { - let i = (sides - 1) as f32; - // the missing piece - self.tri::<f32>( - pos, - trans(madd(space, i, rotation)) + pos, - trans(madd(space, i + 1., rotation)) + pos, - c, - ); - } - } - } - } - - /// Draw a bordered polygon. - /// Prefer [`Image::border_circle`] to draw circles. - /// See also [`Image::poly`]. - /// ``` - /// let mut i = fimg::Image::alloc(100, 100); - /// i.border_poly((50., 50.), 5, 25., 0., 7., [255]); - /// # assert_eq!(i.buffer(), include_bytes!("../../tdata/border_pentagon.imgbuf")); - /// ``` - pub fn border_poly( - &mut self, - pos: impl Into<Vec2>, - sides: usize, - radius: f32, - rotation: f32, - stroke: f32, - c: [u8; CHANNELS], - ) { - let pos = pos.into(); - let space = TAU / sides as f32; - let step = stroke / 2.0 / (space / 2.0).cos(); - let r1 = radius - step; - let r2 = radius + step; - let r = |a: f32, b: f32| (a.round() as i32, b.round() as i32); - for i in 0..sides { - let a = space.madd(i as f32, rotation); - self.quad( - r(r1.madd(a.cos(), pos.x), r1.madd(a.sin(), pos.y)), - r( - r1.madd((a + space).cos(), pos.x), - r1.madd((a + space).sin(), pos.y), - ), - r( - r2.madd((a + space).cos(), pos.x), - r2.madd((a + space).sin(), pos.y), - ), - r(r2.madd(a.cos(), pos.x), r2.madd(a.sin(), pos.y)), - c, - ); - } - } -} diff --git a/src/drawing/text.rs b/src/drawing/text.rs deleted file mode 100644 index 00a2d65..0000000 --- a/src/drawing/text.rs +++ /dev/null @@ -1,106 +0,0 @@ -//! text raster - -use crate::{ - Image, Pack, - pixels::{Wam, float}, -}; -use fontdue::{Font, layout::TextStyle}; -use umath::{FF32, generic_float::Constructors}; - -/// note: `N` may != channels -pub trait Text<const N: usize> { - fn text(&mut self, x: u32, y: u32, size: f32, font: &Font, text: &str, color: [u8; N]); -} - -impl<T: AsMut<[u32]> + AsRef<[u32]>> Text<4> for Image<T, 1> { - fn text(&mut self, x: u32, y: u32, size: f32, font: &Font, text: &str, color: [u8; 4]) { - let mut lay = - fontdue::layout::Layout::new(fontdue::layout::CoordinateSystem::PositiveYDown); - lay.append(&[font], &TextStyle::new(text, size, 0)); - for glpyh in lay.glyphs() { - let (metrics, bitmap) = font.rasterize(glpyh.parent, size); - for i in 0..metrics.width { - for j in 0..metrics.height { - let x = x + i as u32 + glpyh.x as u32; - if x >= self.width() { - continue; - } - let y = y + j as u32 + glpyh.y as u32; - if y >= self.height() { - continue; - } - - // SAFETY: the rasterizer kinda promises that metrics width and height are in bounds - let fill = unsafe { float(*bitmap.get_unchecked(j * metrics.width + i)) }; - // SAFETY: we clampin - let bg: [u8; 4] = unsafe { Pack::unpack(self.pixel(x, y)[0]) }; - // SAFETY: see above - *(&mut unsafe { self.pixel_mut(x, y) }[0]) = - // SAFETY: fill is 0..=1 - Pack::pack(& bg.wam(color, 1.0 - fill, fill)); - } - } - } - } -} - -impl<const N: usize, T: AsMut<[u8]> + AsRef<[u8]>> Text<N> for Image<T, N> { - fn text(&mut self, x: u32, y: u32, size: f32, font: &Font, text: &str, color: [u8; N]) { - let mut lay = - fontdue::layout::Layout::new(fontdue::layout::CoordinateSystem::PositiveYDown); - lay.append(&[font], &TextStyle::new(text, size, 0)); - for glpyh in lay.glyphs() { - let (metrics, bitmap) = font.rasterize(glpyh.parent, size); - for i in 0..metrics.width { - for j in 0..metrics.height { - let x = x + i as u32 + glpyh.x as u32; - if x >= self.width() { - continue; - } - let y = y + j as u32 + glpyh.y as u32; - if y >= self.height() { - continue; - } - - // SAFETY: the rasterizer kinda promises that metrics width and height are in bounds - let fill = unsafe { float(*bitmap.get_unchecked(j * metrics.width + i)) }; - // SAFETY: we clampin - let bg = unsafe { &mut *(self.pixel_mut(x, y).as_mut_ptr() as *mut [u8; N]) }; - // SAFETY: fill is 0..=1 - *bg = unsafe { bg.wam(color, *(FF32::one() - fill), fill) }; - } - } - } - } -} - -impl<const N: usize, T> Image<T, N> { - /// Draw text. - /// - /// ``` - /// # use fimg::Image; - /// let font = fontdue::Font::from_bytes( - /// &include_bytes!("../../data/CascadiaCode.ttf")[..], - /// fontdue::FontSettings { - /// scale: 200.0, - /// ..Default::default() - /// }, - /// ).unwrap(); - /// let mut i: Image<_, 4> = Image::alloc(750, 250).boxed(); - /// i.text(50, 10, 200.0, &font, "hello", [0, 0, 0, 255]); - /// # assert_eq!(&**i.buffer(), include_bytes!("../../tdata/text.imgbuf")); - /// ``` - pub fn text<const P: usize>( - &mut self, - x: u32, - y: u32, - size: f32, - font: &Font, - text: &str, - color: [u8; P], - ) where - Image<T, N>: Text<P>, - { - Text::text(self, x, y, size, font, text, color) - } -} diff --git a/src/drawing/tri.rs b/src/drawing/tri.rs deleted file mode 100644 index 7ca13b6..0000000 --- a/src/drawing/tri.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! trongle drawing -use umath::Float; -use vecto::Vector2; - -use crate::Image; -use std::cmp::{max, min}; - -impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS> { - /// Draw a (filled) triangle - /// ``` - /// # use fimg::*; - /// let mut a = Image::alloc(10, 10); - /// // draw a triangle - /// a.as_mut().tri::<f32>( - /// (3.0, 2.0), // point a - /// (8.0, 7.0), // point b - /// (1.0, 8.0), // point c - /// [255] // white - /// ); - /// # assert_eq!(a.buffer(), b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"); - /// ``` - pub fn tri<F: Float<f32>>( - &mut self, - a: impl Into<Vector2<F>>, - b: impl Into<Vector2<F>>, - c: impl Into<Vector2<F>>, - col: [u8; CHANNELS], - ) { - let Vector2 { - x: mut x1, - y: mut y1, - } = a.into(); - let Vector2 { - x: mut x2, - y: mut y2, - } = b.into(); - let Vector2 { x: x3, y: y3 } = c.into(); - // fix winding - if (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1) > 0.0 { - std::mem::swap(&mut x1, &mut x2); - std::mem::swap(&mut y1, &mut y2); - } - let ymin = max(y1.min(y2).min(y3).take() as u32, 0); - let ymax = min(y1.max(y2).max(y3).take() as u32, self.height()); - let xmin = max(x1.min(x2).min(x3).take() as u32, 0); - let xmax = min(x1.max(x2).max(x3).take() as u32, self.width()); - for y in ymin..ymax { - for x in xmin..xmax { - // algorithm from https://web.archive.org/web/20050408192410/http://sw-shader.sourceforge.net/rasterizer.html, but im too dumb to implement the faster ones - // SAFETY: nNaN - if unsafe { - (x1 - x2) * (F::new(y as f32) - y1) + (-(y1 - y2) * (F::new(x as f32) - x1)) - > 0. - && (x2 - x3) * (F::new(y as f32) - y2) - + (-(y2 - y3) * (F::new(x as f32) - x2)) - > 0. - && (x3 - x1) * (F::new(y as f32) - y3) - + (-(y3 - y1) * (F::new(x as f32) - x3)) - > 0. - } { - // SAFETY: x, y are bounded - unsafe { self.set_pixel(x, y, &col) }; - } - } - } - } -} diff --git a/src/dyn/affine.rs b/src/dyn/affine.rs deleted file mode 100644 index 2c425c0..0000000 --- a/src/dyn/affine.rs +++ /dev/null @@ -1,38 +0,0 @@ -use super::{e, DynImage}; - -impl<T: AsMut<[u8]> + AsRef<[u8]>> DynImage<T> { - /// Rotate this image 90 degrees clockwise. - /// - /// # Safety - /// - /// UB if this image is not square - pub unsafe fn rot_90(&mut self) { - // SAFETY: caller guarantees - unsafe { e!(self, |i| i.rot_90()) } - } - - /// Rotate this image 180 degrees clockwise. - pub fn rot_180(&mut self) { - e!(self, |i| i.rot_180()) - } - - /// Rotate this image 270 degrees clockwise. - /// - /// # Safety - /// - /// UB if this image is not square - pub unsafe fn rot_270(&mut self) { - // SAFETY: caller guarantees - unsafe { e!(self, |i| i.rot_270()) } - } - - /// Flip this image horizontally. - pub fn flip_h(&mut self) { - e!(self, |i| i.flip_h()) - } - - /// Flip this image vertically. - pub fn flip_v(&mut self) { - e!(self, |i| i.flip_v()) - } -} diff --git a/src/dyn/convert.rs b/src/dyn/convert.rs deleted file mode 100644 index 146c73e..0000000 --- a/src/dyn/convert.rs +++ /dev/null @@ -1,110 +0,0 @@ -#![allow(clippy::useless_conversion)] -use super::{e, DynImage, Image}; - -impl From<DynImage<Box<[u8]>>> for Image<Box<[u8]>, 1> { - fn from(value: DynImage<Box<[u8]>>) -> Self { - e!(value, |i| i.into()) - } -} - -impl From<DynImage<Box<[u8]>>> for Image<Box<[u8]>, 2> { - fn from(value: DynImage<Box<[u8]>>) -> Self { - e!(value, |i| i.into()) - } -} -impl From<DynImage<Box<[u8]>>> for Image<Box<[u8]>, 3> { - fn from(value: DynImage<Box<[u8]>>) -> Self { - e!(value, |i| i.into()) - } -} -impl From<DynImage<Box<[u8]>>> for Image<Box<[u8]>, 4> { - fn from(value: DynImage<Box<[u8]>>) -> Self { - e!(value, |i| i.into()) - } -} - -impl<T> DynImage<T> { - /// Gets out the Y image, if its there, else returning self. - /// - /// If you want to convert, see [`DynImage::to_y`]. - pub fn get_y(self) -> Result<Image<T, 1>, Self> { - match self { - Self::Y(i) => Ok(i), - _ => Err(self), - } - } - - /// Gets out the YA image, if its there, else returning self. - /// - /// If you want to convert, see [`DynImage::to_ya`]. - pub fn get_ya(self) -> Result<Image<T, 2>, Self> { - match self { - Self::Ya(i) => Ok(i), - _ => Err(self), - } - } - - /// Gets out the RGB image, if its there, else returning self. - /// - /// If you want to convert, see [`DynImage::to_rgb`]. - pub fn get_rgb(self) -> Result<Image<T, 3>, Self> { - match self { - Self::Rgb(i) => Ok(i), - _ => Err(self), - } - } - - /// Gets out the RGBA image, if its there, else returning self. - /// - /// If you want to convert, see [`DynImage::to_rgba`]. - pub fn get_rgba(self) -> Result<Image<T, 4>, Self> { - match self { - Self::Rgba(i) => Ok(i), - _ => Err(self), - } - } -} - -impl DynImage<Box<[u8]>> { - /// Convert this dyn image into a Y image. - pub fn to_y(self) -> Image<Box<[u8]>, 1> { - self.into() - } - - /// Convert this dyn image into a YA image. - pub fn to_ya(self) -> Image<Box<[u8]>, 2> { - self.into() - } - - /// Convert this dyn image into a RGB image. - pub fn to_rgb(self) -> Image<Box<[u8]>, 3> { - self.into() - } - - /// Convert this dyn image into a RGBA image. - pub fn to_rgba(self) -> Image<Box<[u8]>, 4> { - self.into() - } -} - -impl<T: AsRef<[u8]>> DynImage<T> { - /// Produce a Y image from this dyn image. - pub fn y(&self) -> Image<Box<[u8]>, 1> { - e!(self, |i| i.as_ref().into()) - } - - /// Produce a YA image from this dyn image. - pub fn ya(&self) -> Image<Box<[u8]>, 2> { - e!(self, |i| i.as_ref().into()) - } - - /// Produce a RGB image from this dyn image. - pub fn rgb(&self) -> Image<Box<[u8]>, 3> { - e!(self, |i| i.as_ref().into()) - } - - /// Produce a RGBA image from this dyn image. - pub fn rgba(&self) -> Image<Box<[u8]>, 4> { - e!(self, |i| i.as_ref().into()) - } -} diff --git a/src/dyn/mod.rs b/src/dyn/mod.rs deleted file mode 100644 index c36a7c1..0000000 --- a/src/dyn/mod.rs +++ /dev/null @@ -1,198 +0,0 @@ -use crate::{Image, pixels::convert::PFrom}; -mod affine; -mod convert; -#[cfg(feature = "scale")] -mod scale; - -#[derive(Clone, Debug, PartialEq, Hash)] -/// Dynamic image. -/// Can be any of {`Y8`, `YA8`, `RGB8`, `RGB16`}. -pub enum DynImage<T> { - /// Y image - Y(Image<T, 1>), - /// YA image - Ya(Image<T, 2>), - /// RGB image - Rgb(Image<T, 3>), - /// RGBA image - Rgba(Image<T, 4>), -} - -impl Copy for DynImage<&[u8]> {} - -impl<T> const From<Image<T, 1>> for DynImage<T> { - fn from(x: Image<T, 1>) -> Self { - Self::Y(x) - } -} - -impl<T> const From<Image<T, 2>> for DynImage<T> { - fn from(x: Image<T, 2>) -> Self { - Self::Ya(x) - } -} - -impl<T> const From<Image<T, 3>> for DynImage<T> { - fn from(x: Image<T, 3>) -> Self { - Self::Rgb(x) - } -} - -impl<T> const From<Image<T, 4>> for DynImage<T> { - fn from(x: Image<T, 4>) -> Self { - Self::Rgba(x) - } -} - -macro_rules! e { - ($dyn:expr => |$image: pat_param| $do:expr) => { - match $dyn { - DynImage::Y($image) => DynImage::Y($do), - DynImage::Ya($image) => DynImage::Ya($do), - DynImage::Rgb($image) => DynImage::Rgb($do), - DynImage::Rgba($image) => DynImage::Rgba($do), - } - }; - ($dyn:expr, |$image: pat_param| $do:expr) => { - match $dyn { - DynImage::Y($image) => $do, - DynImage::Ya($image) => $do, - DynImage::Rgb($image) => $do, - DynImage::Rgba($image) => $do, - } - }; -} -pub(crate) use e; - -#[cfg(feature = "term")] -impl<T: AsRef<[u8]>> std::fmt::Display for crate::term::Display<DynImage<T>> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - e!(&self.0, |x| crate::term::Display(x.as_ref()).write(f)) - } -} - -#[cfg(feature = "term")] -impl<T: AsRef<[u8]>> std::fmt::Debug for crate::term::Display<DynImage<T>> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - e!(&self.0, |x| crate::term::Display(x.as_ref()).write(f)) - } -} - -#[cfg(feature = "term")] -impl<T: AsRef<[u8]>> std::fmt::Display for DynImage<T> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - e!(&self, |x| crate::term::Display(x.as_ref()).write(f)) - } -} - -impl<T> DynImage<T> { - /// Get the width of this image. - pub const fn width(&self) -> u32 { - e!(self, |i| i.width()) - } - - /// Get the height of this image. - pub const fn height(&self) -> u32 { - e!(self, |i| i.height()) - } - - #[doc(hidden)] - pub unsafe fn mapped<U, F: FnOnce(T) -> U>(self, f: F) -> DynImage<U> { - // SAFETY: we dont change anything, why check - unsafe { e!(self => |i| i.mapped(f)) } - } - - /// Get the image buffer. - pub const fn buffer(&self) -> &T { - e!(self, |i| i.buffer()) - } - - /// Take the image buffer. - pub fn take_buffer(self) -> T { - e!(self, |i| i.take_buffer()) - } -} - -impl DynImage<&[u8]> { - /// Copy this ref image - pub fn copy(&self) -> Self { - e!(self => |i| i.copy()) - } -} - -impl<T: AsRef<[u8]>> DynImage<T> { - /// Reference this image. - pub fn as_ref(&self) -> DynImage<&[u8]> { - e!(self => |i| i.as_ref()) - } - - /// Get a pixel, of a type. - /// ``` - /// # use fimg::{Image, DynImage}; - /// let i = DynImage::Rgb(Image::alloc(50, 50)); - /// assert_eq!(unsafe { i.pixel::<4>(25, 25) }, [0, 0, 0, 255]); - /// ``` - /// # Safety - /// - /// undefined behaviour if pixel is out of bounds. - pub unsafe fn pixel<const P: usize>(&self, x: u32, y: u32) -> [u8; P] - where - [u8; P]: PFrom<1>, - [u8; P]: PFrom<2>, - [u8; P]: PFrom<3>, - [u8; P]: PFrom<4>, - { - e!(self, |i| PFrom::pfrom(unsafe { *i.pixel(x, y) })) - } - - /// Bytes of this image. - pub fn bytes(&self) -> &[u8] { - e!(self, |i| i.bytes()) - } -} - -impl DynImage<Box<[u8]>> { - #[cfg(feature = "save")] - /// Open a PNG image - pub fn open(f: impl AsRef<std::path::Path>) -> Self { - use png::Transformations as T; - let p = std::fs::File::open(f).unwrap(); - let r = std::io::BufReader::new(p); - let mut dec = png::Decoder::new(r); - dec.set_transformations(T::STRIP_16 | T::EXPAND); - let mut reader = dec.read_info().unwrap(); - let mut buf = vec![0; reader.output_buffer_size().unwrap()].into_boxed_slice(); - let info = reader.next_frame(&mut buf).unwrap(); - use png::ColorType::*; - match info.color_type { - Indexed | Grayscale => Self::Y(Image::build(info.width, info.height).buf(buf)), - Rgb => Self::Rgb(Image::build(info.width, info.height).buf(buf)), - Rgba => Self::Rgba(Image::build(info.width, info.height).buf(buf)), - GrayscaleAlpha => Self::Ya(Image::build(info.width, info.height).buf(buf)), - } - } - - #[cfg(feature = "save")] - /// Save this image to a PNG. - pub fn save(&self, f: impl AsRef<std::path::Path>) { - let p = std::fs::File::create(f).unwrap(); - let w = &mut std::io::BufWriter::new(p); - let mut enc = png::Encoder::new(w, self.width(), self.height()); - enc.set_depth(png::BitDepth::Eight); - enc.set_color(match self { - Self::Y(_) => png::ColorType::Grayscale, - Self::Ya(_) => png::ColorType::GrayscaleAlpha, - Self::Rgb(_) => png::ColorType::Rgb, - Self::Rgba(_) => png::ColorType::Rgba, - }); - enc.set_source_gamma(png::ScaledFloat::new(1.0 / 2.2)); - enc.set_source_chromaticities(png::SourceChromaticities::new( - (0.31270, 0.32900), - (0.64000, 0.33000), - (0.30000, 0.60000), - (0.15000, 0.06000), - )); - let mut writer = enc.write_header().unwrap(); - writer.write_image_data(self.bytes()).unwrap(); - } -} diff --git a/src/dyn/scale.rs b/src/dyn/scale.rs deleted file mode 100644 index f827a1f..0000000 --- a/src/dyn/scale.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::scale::traits::ScalingAlgorithm; - -use super::{e, DynImage}; - -impl<T: AsMut<[u8]> + AsRef<[u8]>> DynImage<T> { - /// Scale this image with a given scaling algorithm. - pub fn scale<A: ScalingAlgorithm>(&mut self, width: u32, height: u32) -> DynImage<Box<[u8]>> { - e!(self => |i| i.scale::<A>(width, height)) - } -} diff --git a/src/indexed.rs b/src/indexed.rs deleted file mode 100644 index 65e4359..0000000 --- a/src/indexed.rs +++ /dev/null @@ -1,120 +0,0 @@ -//! indexed images! whoo! (palette and `Image<[u8], 1>`, basically.) -#![allow(private_bounds)] -mod builder; - -use std::mem::MaybeUninit; - -use crate::Image; - -#[allow(non_camel_case_types)] -trait uint: Default + Copy + TryInto<usize> { - fn nat(self) -> usize { - self.try_into().ok().unwrap() - } -} - -macro_rules! int { - ($($t:ty)+) => { - $(impl uint for $t {})+ - }; -} -int!(u8 u16 u32 u64 usize u128); - -/// An image with a palette. -#[derive(Clone)] -pub struct IndexedImage<INDEX, PALETTE> { - // likely Box<[u8]>, … - // safety invariant: when INDEX<impl uint>, and PALETTE: Buffer, U must be < len(PALETTE) - buffer: Image<INDEX, 1>, - palette: PALETTE, // likely Box<[[f32; 4]]>, … -} - -impl<I, P> IndexedImage<I, P> { - /// Indexes the palette with each index. - pub fn to<PIXEL: Copy, INDEX: uint, const CHANNELS: usize>( - &self, - ) -> Image<Box<[PIXEL]>, CHANNELS> - where - P: AsRef<[[PIXEL; CHANNELS]]>, - I: AsRef<[INDEX]>, - { - unsafe { - self.buffer.map(|x| { - x.as_ref() - .iter() - // SAFETY: invariant. - .flat_map(|x| *self.palette.as_ref().get_unchecked(x.nat())) - .collect() - }) - } - } - - /// Sets the pixel. Does not check if the index is in bounds, nor if it is even a valid pixel. - pub unsafe fn set_unchecked<INDEX: Copy>(&mut self, x: u32, y: u32, pixel: INDEX) - where - I: AsMut<[INDEX]>, - { - // SAFETY: they checked! - unsafe { *self.pixel_mut(x, y) = pixel }; - } - - /// Gets a mutref to pixel. pls (is ub!) no set out of bound. - pub unsafe fn pixel_mut<INDEX: Copy>(&mut self, x: u32, y: u32) -> &mut INDEX - where - I: AsMut<[INDEX]>, - { - let p = self.buffer.at(x, y); - unsafe { self.raw().buffer.get_unchecked_mut(p) } - } - - /// Sets the pixel. Panics if bounds are not met. - pub fn set<INDEX: uint, PIXEL>(&mut self, x: u32, y: u32, pixel: INDEX) - where - I: AsMut<[INDEX]>, - P: AsRef<[PIXEL]>, - { - assert!(self.buffer.width() < x); - assert!(self.buffer.height() < x); - assert!(pixel.nat() < self.palette.as_ref().len()); - // SAFETY: we checked! - unsafe { self.set_unchecked(x, y, pixel) }; - } - - /// Gets a mut ref to raw parts. - pub unsafe fn raw<INDEX>(&mut self) -> Image<&mut [INDEX], 1> - where - I: AsMut<[INDEX]>, - { - self.buffer.as_mut() - } - - /// Provides the buffer and palette of this image. - pub fn into_raw_parts(self) -> (Image<I, 1>, P) { - (self.buffer, self.palette) - } - - /// Creates a indexed image from its 1 channel image representation and palette. - pub fn from_raw_parts<INDEX: uint, PIXEL>( - buffer: Image<I, 1>, - palette: P, - ) -> Result<Self, &'static str> - where - I: AsRef<[INDEX]>, - P: AsRef<[PIXEL]>, - { - let good = buffer.chunked().all(|[x]| x.nat() < palette.as_ref().len()); - good.then_some(Self { buffer, palette }) - .ok_or("not all indexes are in palette") - } -} - -impl<P, I: uint> IndexedImage<Box<[MaybeUninit<I>]>, P> { - /// Assumes this MU image is, in fact, initialized. You must be very sure that it is. Also, none of the pixels can be out of bounds. - pub unsafe fn assume_init(self) -> IndexedImage<Box<[I]>, P> { - IndexedImage { - // SAFETY: it really isnt. - buffer: unsafe { self.buffer.mapped(|x| x.assume_init()) }, - ..self - } - } -} diff --git a/src/indexed/builder.rs b/src/indexed/builder.rs deleted file mode 100644 index faa38c7..0000000 --- a/src/indexed/builder.rs +++ /dev/null @@ -1,118 +0,0 @@ -use super::{uint, IndexedImage as Image}; -use std::{marker::PhantomData, mem::MaybeUninit}; -impl<B, P> Image<B, P> { - /// creates a builder - pub const fn build<I, J>(w: u32, h: u32) -> Builder<B, P> - where - B: AsRef<[I]>, - P: AsRef<[J]>, - { - Builder::new(w, h) - } -} - -/// Safe [`Image`] builder. -#[must_use = "builder must be consumed"] -pub struct Builder<B, P> { - /// the width in a zeroable type. zeroable so as to make the check in [`buf`] easier. - width: u32, - /// the height in a zeroable type. - height: u32, - palette: Option<P>, - #[allow(clippy::missing_docs_in_private_items)] - _buffer: PhantomData<B>, -} -impl<B, P> Builder<B, P> { - /// create new builder - pub const fn new(w: u32, h: u32) -> Self { - Self { - width: w, - height: h, - _buffer: PhantomData, - palette: None, - } - } - - /// add a palette - pub fn pal(self, p: P) -> Self { - Self { - palette: Some(p), - ..self - } - } - - /// apply a buffer, and build - #[track_caller] - #[must_use = "what is it going to do?"] - #[allow(private_bounds)] - pub fn buf<I: uint, J>(self, buffer: B) -> Image<B, P> - where - B: AsRef<[I]>, - P: AsRef<[J]>, - { - Image::from_raw_parts( - crate::Image::build(self.width, self.height).buf(buffer), - self.palette.expect("require palette"), - ) - .unwrap() - } - - pub unsafe fn buf_unchecked<I>(self, buffer: B) -> Image<B, P> - where - B: AsRef<[I]>, - { - Image { - buffer: unsafe { crate::Image::build(self.width, self.height).buf_unchecked(buffer) }, - palette: self.palette.expect("require palette"), - } - } - - /// Allocates a zeroed buffer. - #[track_caller] - #[must_use] - pub fn alloc<I: uint, J>(self) -> Image<Box<[I]>, P> - where - P: AsRef<[J]>, - { - let palette = self.palette.expect("require palette"); - assert!(palette.as_ref().len() != 0, "need some palette"); - Image { - buffer: crate::Image::build(self.width, self.height).buf( - vec![I::default(); self.width as usize * self.height as usize].into_boxed_slice(), - ), - palette, - } - } - - pub fn uninit<I: uint, J>(self) -> Image<Box<[MaybeUninit<I>]>, P> - where - P: AsRef<[J]>, - { - Image { - buffer: crate::Image::build(self.width, self.height).buf(Box::new_uninit_slice( - self.width as usize * self.height as usize, - )), - palette: self.palette.expect("require palette"), - } - } - - /// Safety - /// - /// read implementation - pub unsafe fn from_iter<I: uint, J>( - self, - iter: impl Iterator<Item = ((u32, u32), I)> + ExactSizeIterator, - ) -> Image<Box<[I]>, P> - where - P: AsRef<[J]>, - { - debug_assert!(iter.len() >= self.width as usize * self.height as usize); - let mut me = self.uninit(); - // SAFETY: the pixel must be in bounds - iter.for_each(|((x, y), item)| unsafe { - me.pixel_mut(x, y).write(item); - }); - // SAFETY: all pixels must have been visited at least once - unsafe { me.assume_init() } - } -} @@ -1,370 +1,114 @@ -//! # fimg -//! -//! Provides fast image operations, such as rotation, flipping, and overlaying. -//! -//! ## Organization -//! -//! Image types: -//! -//! - [`Image`]: the main image type. -//! - [`DynImage`]: This is the image type you use when, say, loading a png. You should immediately convert this into a -//! - [`ImageCloner`]: This is... a [`Image`], but about to be cloned. It just allows some simple out-of-place optimizations, that `.clone().op()` dont allow. (produce with [`Image::cloner`]) -//! - [`uninit::Image`]: A uninitialized image. Used for performance optimization. -//! -//! ### Operations -//! -//! Affine: -//! - [`Image::rot_90`] -//! - [`Image::rot_180`] -//! - [`Image::rot_270`] -//! - [`Image::flip_h`] -//! - [`Image::flip_v`] -//! -//! Drawing: -//! - [`Image::box`], [`Image::filled_box`], [`Image::stroked_box`] -//! - [`Image::circle`], [`Image::border_circle`] -//! - [`Image::line`], [`Image::thick_line`] -//! - [`Image::points`] -//! - [`Image::quad`] -//! - [`Image::poly`], [`Image::border_poly`] -//! - [`Image::tri`] -//! - [`Image::text`] -//! -//! Scaling: [`Image::scale`] -//! -//! Misc image ops: -//! - [`Image::repeated`] -//! - [`Image::overlay`](Overlay), [`Image::overlay_at`](OverlayAt), [`Image::overlay_blended`](BlendingOverlay) -//! - [`Image::blur`] -//! - [`Image::crop`] -//! -//! ## feature flags -//! -//! - `scale`: enables the [`scale`] module. -//! - `save`: enables [`Image::save`], via the [`png`](https://crates.io/crates/png) crate. -//! - `text`: enables [`Image::text`], via the [`fontdue`](https://crates.io/crates/fontdue) crate. -//! - `blur`: enables [`Image::blur`], via the [`stackblur`](https://crates.io/crates/stackblur-iter) crate. -//! - `real-show`: [`Image::show`], if the `save` feature is enabled, will, by default, simply open the appropriate image viewing program. -//! if, for some reason, this is inadequate/you dont have a good image viewer, enable the `real-show` feature to make [`Image::show`] open up a window of its own. -//! without the `real-show` feature, [`Image::show`] will save itself to your temp directory, which you may not want. -//! - `term`: [`term::print`]. this enables printing images directly to the terminal, if you don't want to open a window or something. supports `{iterm2, kitty, sixel, fallback}` graphics. -//! - `default`: \[`save`, `scale`\]. -#![cfg_attr(all(feature = "term", windows), windows_subsystem = "console")] #![feature( - type_changing_struct_update, - custom_inner_attributes, slice_swap_unchecked, - generic_const_exprs, - proc_macro_hygiene, - iter_array_chunks, - const_trait_impl, - core_intrinsics, - new_range_api, - rustc_private, + slice_as_chunks, + unchecked_math, portable_simd, - const_convert, - try_blocks, - doc_cfg, + array_chunks, test )] #![warn( - clippy::undocumented_unsafe_blocks, + clippy::multiple_unsafe_ops_per_block, clippy::missing_const_for_fn, clippy::missing_safety_doc, - clippy::suboptimal_flops, unsafe_op_in_unsafe_fn, clippy::dbg_macro, - clippy::use_self, - missing_docs + clippy::perf )] -#![allow( - clippy::zero_prefixed_literal, - mixed_script_confusables, - incomplete_features, - confusable_idents, - internal_features -)] -use array_chunks::*; -use hinted::HintExt; -use std::{hint::assert_unchecked, intrinsics::transmute_unchecked, num::NonZeroU32, ops::Range}; +#![allow(clippy::zero_prefixed_literal)] + +use std::{num::NonZeroU32, slice::SliceIndex}; mod affine; -#[cfg(feature = "blur")] -mod blur; -mod slicing; -pub use sub::{Cropper, SubImage}; -pub mod builder; -#[doc(hidden)] -pub mod cloner; -mod convert; -mod drawing; -mod r#dyn; -pub mod indexed; -pub(crate) mod math; -#[doc(hidden)] -pub mod overlay; -mod pack; -mod span; -mod sub; -pub mod uninit; -#[cfg(feature = "wgpu-convert")] -mod wgpu_convert; -pub use pack::Pack; -pub mod pixels; -#[cfg(feature = "scale")] -pub mod scale; -#[cfg(any(feature = "save", feature = "real-show"))] -mod show; -#[cfg(feature = "term")] -pub mod term; -pub use cloner::ImageCloner; -pub use r#dyn::DynImage; -pub use overlay::{ - BlendingOverlay, BlendingOverlayAt, ClonerOverlay, ClonerOverlayAt, Overlay, OverlayAt, - OverlayAtClipping, -}; +mod overlay; +pub use affine::{Flips, Rotations}; +pub use overlay::{Overlay, OverlayAt}; -trait CopyWithinUnchecked { +pub trait RepeatNew { + type Output; + /// Repeat self till it fills a new image of size x, y /// # Safety /// - /// panicless version of [`[T]::copy_within`](`slice::copy_within`), where the slices cant overlap. this uses `memcpy`. - /// your slices must be in bounds. - /// this isnt a public function, so im not going to say exactly what "in bounds" means. - unsafe fn copy_within_unchecked(&mut self, src: Range<usize>, dest: usize); -} - -impl<T> CopyWithinUnchecked for [T] { - unsafe fn copy_within_unchecked(&mut self, src: Range<usize>, dest: usize) { - let std::ops::Range { start, end } = src; - debug_assert!(dest <= self.len() - end - start, "dest is out of bounds"); - #[allow(clippy::multiple_unsafe_ops_per_block)] - // SAFETY: the caller better be good - unsafe { - let ptr = self.as_mut_ptr(); - std::ptr::copy_nonoverlapping(ptr.add(start), ptr.add(dest), end - start) - }; - } -} - -trait At { - fn at<const C: usize>(self, x: u32, y: u32) -> usize; + /// UB if self's width is not a multiple of x, or self's height is not a multiple of y + unsafe fn repeated(&self, x: u32, y: u32) -> Self::Output; } -impl At for (u32, u32) { - #[inline] - fn at<const C: usize>(self, x: u32, y: u32) -> usize { - #[allow(clippy::multiple_unsafe_ops_per_block)] - // SAFETY: me when uncheck math: 😧 (FIXME) - let index = unsafe { - // y * w + x - let tmp = (y as usize).unchecked_mul(self.0 as usize); - tmp.unchecked_add(x as usize) - }; - // SAFETY: 🧐 is unsound? 😖 - unsafe { index.unchecked_mul(C) } - } +macro_rules! assert_unchecked { + ($cond:expr) => {{ + if !$cond { + #[cfg(debug_assertions)] + let _ = ::core::ptr::NonNull::<()>::dangling().as_ref(); // force unsafe wrapping block + #[cfg(debug_assertions)] + panic!("assertion failed: {} returned false", stringify!($cond)); + #[cfg(not(debug_assertions))] + std::hint::unreachable_unchecked() + } + }}; } - -impl<T: AsRef<[u8]>> Image<T, 3> { - /// Tile self till it fills a new image of size x, y - /// # Safety - /// - /// UB if self's width is not a multiple of x, or self's height is not a multiple of y - /// ``` - /// # use fimg::Image; - /// let x: Image<&[u8], 3> = Image::build(8, 8).buf(include_bytes!("../benches/3_8x8.imgbuf")); - /// let tiled = unsafe { x.repeated(48, 48) }; // repeat 6 times - /// # assert_eq!(tiled.buffer(), b"\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xf7\xcb\xa4\xf7\xcb\xa4\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d\xd3\xae\x8d") - /// ``` - #[must_use = "function does not modify the original image"] - pub unsafe fn repeated(&self, out_width: u32, out_height: u32) -> Image<Vec<u8>, 3> { - let mut img = uninit::Image::new( - out_width.try_into().unwrap(), - out_height.try_into().unwrap(), - ); - debug_assert!(out_width % self.width() == 0); - debug_assert!(out_height % self.height() == 0); - for y in 0..self.height() { - // SAFETY: get one row of pixels - let from = unsafe { - self.buffer - .as_ref() - .get_unchecked(self.at(0, y)..self.at(0, y) + (self.width() as usize * 3)) - }; - debug_assert_eq!(from.len(), self.width() as usize * 3); - let first = (0, y)..(self.width(), y); - // SAFETY: copy it in - unsafe { img.write(from, first.clone()) }; - - for x in 1..(out_width / self.width()) { - let section = img.at(x * self.width(), y); - // SAFETY: copy each row of the image one by one - unsafe { img.copy_within(first.clone(), section) }; +use assert_unchecked; + +impl RepeatNew for Image<&[u8], 3> { + type Output = Image<Vec<u8>, 3>; + unsafe fn repeated(&self, x: u32, y: u32) -> Self::Output { + let mut img = Image::alloc(x, y); // could probably optimize this a ton but eh + for x in 0..(x / self.width()) { + for y in 0..(y / self.height()) { + let a: &mut Image<&mut [u8], 3> = &mut img.as_mut(); + // SAFETY: caller upholds + unsafe { a.overlay_at(self, x * self.width(), y * self.height()) }; } } - let first_row = 0..img.at(0, self.height()); - for y in 1..(out_height / self.height()) { - let this_row = img.at(0, y * self.height()); - // SAFETY: copy entire blocks of image at a time - unsafe { img.copy_within(first_row.clone(), this_row) }; - } - // SAFETY: we init - unsafe { img.assume_init() } + img } } -/// A image with a variable number of channels, and a nonzero size. -#[derive(Debug, PartialEq, Eq, Hash)] -#[repr(C)] +#[inline] +unsafe fn really_unsafe_index(x: u32, y: u32, w: u32) -> usize { + // y * w + x + let tmp = unsafe { (y as usize).unchecked_mul(w as usize) }; + unsafe { tmp.unchecked_add(x as usize) } +} + +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Image<T, const CHANNELS: usize> { - /// column order 2d slice/vec - buffer: T, - /// image horizontal size - width: NonZeroU32, - /// image vertical size - height: NonZeroU32, + pub buffer: T, + pub width: NonZeroU32, + pub height: NonZeroU32, } -impl<T: Clone, const CHANNELS: usize> Clone for Image<T, CHANNELS> { - /// Returns a duplicate of this image. - /// ``` - /// # use fimg::Image; - /// # let i = Image::<Vec<_>, 1>::alloc(5,5); - /// let new_i = i.clone(); - /// ``` - /// If you find yourself in the pattern of - /// ``` - /// # use fimg::Image; - /// # let i = Image::<Vec<_>, 1>::alloc(5,5); - /// let mut i = i.clone(); - /// unsafe { i.rot_90() }; - /// ``` - /// STOP! - /// - /// Instead use - /// ``` - /// # use fimg::Image; - /// # let i = Image::<Vec<_>, 1>::alloc(5,5); - /// let i = unsafe { i.cloner().rot_90() }; - /// ``` - fn clone(&self) -> Self { +impl<const CHANNELS: usize> Default for Image<&'static [u8], CHANNELS> { + fn default() -> Self { Self { - buffer: self.buffer.clone(), - width: self.width, - height: self.height, + buffer: &[0; CHANNELS], + width: NonZeroU32::new(1).unwrap(), + height: NonZeroU32::new(1).unwrap(), } } } impl<T, const CHANNELS: usize> Image<T, CHANNELS> { - #[doc(hidden)] - pub const fn channels(&self) -> usize { - CHANNELS - } - #[inline] - /// get the height as a [`u32`] - pub const fn height(&self) -> u32 { - self.height.get() + pub fn height(&self) -> u32 { + self.height.into() } #[inline] - /// get the width as a [`u32`] - pub const fn width(&self) -> u32 { - self.width.get() + pub fn width(&self) -> u32 { + self.width.into() } #[inline] - /// create a new image - /// - /// # Safety - /// - /// does not check that buffer.len() == w * h * C - /// - /// using this with invalid values may result in future UB - pub const unsafe fn new(width: NonZeroU32, height: NonZeroU32, buffer: T) -> Self { - Self { + pub const fn new(width: NonZeroU32, height: NonZeroU32, buffer: T) -> Self { + Image { buffer, width, height, } } - - /// consumes the image, returning the image buffer - pub fn take_buffer(self) -> T { - self.buffer - } - - /// returns a immutable reference to the backing buffer - pub const fn buffer(&self) -> &T { - &self.buffer - } - - /// returns a mutable(!) reference to the backing buffer - /// - /// # Safety - /// - /// please do not change buffer size. - pub unsafe fn buffer_mut(&mut self) -> &mut T { - &mut self.buffer - } - - /// # Safety - /// - /// the output index is not guaranteed to be in bounds - #[inline] - #[cfg_attr(debug_assertions, track_caller)] - pub fn at(&self, x: u32, y: u32) -> usize { - (self.width(), self.height()).at::<CHANNELS>(x, y) - } - - /// # Safety - /// keep the buffer size the same - unsafe fn with<U, const N: usize>(&self, x: U) -> Image<U, N> { - unsafe { Image::new(self.width, self.height, x) } - } - - /// # Safety - /// keep the buffer size the same - unsafe fn map<U, const N: usize, F: FnOnce(&T) -> U>(&self, f: F) -> Image<U, N> { - // SAFETY: we dont change anything, why check - unsafe { self.with(f(self.buffer())) } - } - #[doc(hidden)] - pub unsafe fn mapped<U, const N: usize, F: FnOnce(T) -> U>(self, f: F) -> Image<U, N> { - // SAFETY: we dont change anything, why check - unsafe { Image::new(self.width, self.height, f(self.buffer)) } - } - - /// # Safety - /// buffer size must be the same. - unsafe fn map_into<U: From<T>, const N: usize>(self) -> Image<U, N> { - unsafe { self.mapped(Into::into) } - } } -impl<const CHANNELS: usize, T: Clone> Image<&[T], CHANNELS> { - /// Allocate a new `Image<Vec<T>>` from this imageref. - pub fn to_owned(&self) -> Image<Vec<T>, CHANNELS> { - // SAFETY: size not changed - unsafe { self.map(|b| b.to_vec()) } - } -} - -impl<const CHANNELS: usize, T: Clone> Image<&mut [T], CHANNELS> { - /// Allocate a new `Image<Vec<T>>` from this mutable imageref. - pub fn to_owned(&self) -> Image<Vec<T>, CHANNELS> { - // SAFETY: size not changed - unsafe { self.map(|b| b.to_vec()) } - } -} - -impl<const CHANNELS: usize> Copy for Image<&[u8], CHANNELS> {} - impl<const CHANNELS: usize> Image<&[u8], CHANNELS> { #[inline] #[must_use] - /// Copy this ref image pub const fn copy(&self) -> Self { Self { width: self.width, @@ -372,179 +116,31 @@ impl<const CHANNELS: usize> Image<&[u8], CHANNELS> { buffer: self.buffer, } } - - /// Create a new immutable image of width x, y. - /// - /// # Panics - /// - /// if width || height == 0 - /// - /// ``` - /// # use fimg::Image; - /// let img = Image::make::<5, 5>(); - /// # let img: Image<_, 4> = img; - /// ``` - pub const fn make<'a, const WIDTH: u32, const HEIGHT: u32>() -> Image<&'a [u8], CHANNELS> - where - [(); CHANNELS * WIDTH as usize * HEIGHT as usize]:, - { - Image { - width: NonZeroU32::new(WIDTH).expect("passed zero width to builder"), - height: NonZeroU32::new(HEIGHT).expect("passed zero height to builder"), - buffer: &[0; CHANNELS * WIDTH as usize * HEIGHT as usize], - } - } -} - -impl<const CHANNELS: usize, const N: usize, T> Image<[T; N], CHANNELS> { - /// Box this array image. - pub fn boxed(self) -> Image<Box<[T]>, CHANNELS> { - // SAFETY: size not changed - unsafe { self.map_into() } - } } -impl<const CHANNELS: usize, T: Copy> Image<&[T], CHANNELS> { - /// Box this image. - pub fn boxed(self) -> Image<Box<[T]>, CHANNELS> { - // SAFETY: size not changed - unsafe { self.map_into() } - } -} - -impl<const CHANNELS: usize, T> Image<Vec<T>, CHANNELS> { - /// Box this owned image. - pub fn boxed(self) -> Image<Box<[T]>, CHANNELS> { - // SAFETY: ctor - unsafe { self.map_into() } - } -} - -impl<const CHANNELS: usize, T> Image<Box<[T]>, CHANNELS> { - /// Unbox this vec image. - pub fn unbox(self) -> Image<Vec<T>, CHANNELS> { - // SAFETY: ctor - unsafe { self.map_into() } - } -} - -#[macro_export] -/// Create a <code>[Image]<[[u8]; N], C></code> with ease. If your looking for a <code>[Image]<&'static [[u8]]></code>, try [`Image::make`]. -/// -/// ``` -/// let mut i = fimg::make!(4 channels 128 x 128); -/// ``` -/// -/// Implementation note: -/// This is doable with a const generic fn, but it returns a `fimg::Image<[u8; fimg::::{impl#7}::array::{constant#1}], _>` which means you cant actually type it, so its useless. -macro_rules! make { - ($channels:literal channels $w:literal x $h: literal) => { - unsafe { - $crate::Image::<_, $channels>::new( - match ::core::num::NonZeroU32::new($w) { - ::core::option::Option::Some(n) => n, - ::core::option::Option::None => panic!("width is 0"), - }, - match ::core::num::NonZeroU32::new($h) { - ::core::option::Option::Some(n) => n, - ::core::option::Option::None => panic!("height is 0"), - }, - [0_u8; $channels * $w * $h], - ) - } - }; -} - -impl<T, const CHANNELS: usize> Image<T, CHANNELS> { - /// The size of the underlying buffer. - #[allow(clippy::len_without_is_empty)] - pub fn len<U>(&self) -> usize - where - T: AsRef<[U]>, - { - self.buffer().as_ref().len() - } - - /// Transforms the N - /// - /// # Safety - /// - /// i think you can see why this is a problem. - /// - /// # WHY??? - /// - /// sometimes rust is silly with generics - unsafe fn trans<const N: usize>(self) -> Image<T, N> { - unsafe { transmute_unchecked(self) } - } +impl<T: std::ops::Deref<Target = [u8]>, const CHANNELS: usize> Image<T, CHANNELS> { /// # Safety /// - /// the output index is not guaranteed to be in bounds + /// - UB if x, y is out of bounds + /// - UB if buffer is too small #[inline] - fn slice<U>(&self, x: u32, y: u32) -> Range<usize> - where - T: AsRef<[U]>, - { - let index = self.at(x, y); - // SAFETY: as long as the buffer isnt wrong, this is 😄 + unsafe fn slice(&self, x: u32, y: u32) -> impl SliceIndex<[u8], Output = [u8]> { + debug_assert!(x < self.width(), "x out of bounds"); + debug_assert!(y < self.height(), "y out of bounds"); + let index = unsafe { really_unsafe_index(x, y, self.width()) }; + let index = unsafe { index.unchecked_mul(CHANNELS) }; + debug_assert!(self.buffer.len() > index); index..unsafe { index.unchecked_add(CHANNELS) } } #[inline] /// Returns a iterator over every pixel - pub fn chunked<'a, U: 'a>( - &'a self, - ) -> impl DoubleEndedIterator<Item = &'a [U; CHANNELS]> + ExactSizeIterator - where - T: AsRef<[U]>, - { + pub fn chunked(&self) -> impl Iterator<Item = &[u8; CHANNELS]> { // SAFETY: 0 sized images illegal - unsafe { assert_unchecked(self.len() >= CHANNELS) }; + unsafe { assert_unchecked!(self.buffer.len() > CHANNELS) }; // SAFETY: no half pixels! - unsafe { assert_unchecked(self.len() % CHANNELS == 0) }; - self.buffer().as_ref().array_chunks::<CHANNELS>() - } - - #[inline] - /// Flatten the chunks of this image into a slice of slices. - pub fn flatten<U>(&self) -> &[[U; CHANNELS]] - where - T: AsRef<[U]>, - { - // SAFETY: buffer cannot have half pixels - unsafe { self.buffer().as_ref().as_chunks_unchecked::<CHANNELS>() } - } - - /// Create a mutref to this image - pub fn as_mut<U>(&mut self) -> Image<&mut [U], CHANNELS> - where - T: AsMut<[U]>, - { - // SAFETY: construction went okay - unsafe { Image::new(self.width, self.height, self.buffer.as_mut()) } - } - - /// Reference this image. - pub fn as_ref<U>(&self) -> Image<&[U], CHANNELS> - where - T: AsRef<[U]>, - { - // SAFETY: we got constructed okay, parameters must be valid - unsafe { Image::new(self.width, self.height, self.buffer().as_ref()) } - } - - /// Get a pixel. Optionally. Yeah! - pub fn get_pixel<U>(&self, x: u32, y: u32) -> Option<&[U; CHANNELS]> - where - T: AsRef<[U]>, - { - ((x < self.width()) & (y < self.height())).then(|| unsafe { - self.buffer() - .as_ref() - .get_unchecked(self.slice(x, y)) - .as_array() - .unwrap_unchecked() - }) + unsafe { assert_unchecked!(self.buffer.len() % CHANNELS == 0) }; + self.buffer.array_chunks::<CHANNELS>() } /// Return a pixel at (x, y). @@ -553,240 +149,33 @@ impl<T, const CHANNELS: usize> Image<T, CHANNELS> { /// - UB if x, y is out of bounds /// - UB if buffer is too small #[inline] - pub unsafe fn pixel<U>(&self, x: u32, y: u32) -> &[U; CHANNELS] - where - T: AsRef<[U]>, - { - debug_assert!(x < self.width()); - debug_assert!(y < self.height()); - - // SAFETY: x and y in bounds - unsafe { self.get_pixel(x, y).unwrap_unchecked() } - } - - /// pixels contiguously from start to end - /// they gotta be in bounds - /// - /// i think this is unsound because you can make asref do whatever the fucking fuck you fucking want but thats fucking on you - pub unsafe fn pixels<U: Copy>(&self, r: impl PBounds) -> &[[U; CHANNELS]] - where - T: AsRef<[U]>, - { - let b = self.bounds(r); - unsafe { self.buffer.as_ref().get_unchecked(b).as_chunks_unchecked() } - } - /// pixels contiguously from start to end - pub unsafe fn pixels_mut<U: Copy>(&mut self, r: impl PBounds) -> &mut [[U; CHANNELS]] - where - T: AsRef<[U]> + AsMut<[U]>, - { - let b = self.bounds(r); - unsafe { - self.buffer - .as_mut() - .get_unchecked_mut(b) - .as_chunks_unchecked_mut() - } - } - - /// Returns a [`PixelEntry`] - pub fn replace<U: Copy>( - &mut self, - x: u32, - y: u32, - f: impl FnOnce([U; CHANNELS]) -> [U; CHANNELS], - ) -> Option<[U; CHANNELS]> - where - T: AsRef<[U]> + AsMut<[U]>, - { - if x < self.width() && y < self.height() { - let x = unsafe { self.pixel_mut(x, y) }; - let v = *x; - *x = f(v); - Some(v) - } else { - None - } + pub unsafe fn pixel(&self, x: u32, y: u32) -> [u8; CHANNELS] { + let idx = unsafe { self.slice(x, y) }; + let ptr = unsafe { self.buffer.get_unchecked(idx).as_ptr().cast() }; + unsafe { *ptr } } +} +impl<T: std::ops::DerefMut<Target = [u8]>, const CHANNELS: usize> Image<T, CHANNELS> { /// Return a mutable reference to a pixel at (x, y). /// # Safety /// /// - UB if x, y is out of bounds /// - UB if buffer is too small #[inline] - #[cfg_attr(debug_assertions, track_caller)] - pub unsafe fn pixel_mut<U: Copy>(&mut self, x: u32, y: u32) -> &mut [U; CHANNELS] - where - T: AsMut<[U]> + AsRef<[U]>, - { - debug_assert!(x < self.width()); - debug_assert!(y < self.height()); - - // SAFETY: we have been told x, y is in bounds. - unsafe { self.get_pixel_mut(x, y).unwrap_unchecked() } - } - - /// Returns a mutable reference to a pixel at (x, y), if (x, y) is in bounds. - #[cfg_attr(debug_assertions, track_caller)] - pub fn get_pixel_mut<U>(&mut self, x: u32, y: u32) -> Option<&mut [U; CHANNELS]> - where - T: AsMut<[U]> + AsRef<[U]>, - { - let sl = self.slice(x, y); - ((x < self.width()) & (y < self.height())).then(|| unsafe { - self.buffer_mut() - .as_mut() - .get_unchecked_mut(sl) - .as_mut_array() - .unwrap_unchecked() - }) + pub unsafe fn pixel_mut(&mut self, x: u32, y: u32) -> &mut [u8] { + let idx = unsafe { self.slice(x, y) }; + unsafe { self.buffer.get_unchecked_mut(idx) } } - /// iterator over columns - /// returned iterator returns a iterator for each column - /// - /// ```text - /// ┌ ┐┌ ┐┌ ┐ - /// │1││2││3│ - /// │4││5││6│ - /// │7││8││9│ - /// └ ┘└ ┘└ ┘ - /// ``` - /// - /// ``` - /// # use fimg::Image; - /// let img: Image<&[u8],1> = Image::build(2, 3).buf(&[ - /// 1, 5, - /// 2, 4, - /// 7, 9 - /// ]); - /// assert_eq!( - /// img.cols().map(|x| x.collect::<Vec<_>>()).collect::<Vec<_>>(), - /// [[[1], [2], [7]], [[5], [4], [9]]] - /// ); - /// ``` - #[must_use = "iterators are lazy and do nothing unless consumed"] - pub fn cols<'a, U: Copy + 'a>( - &'a self, - ) -> impl DoubleEndedIterator - + ExactSizeIterator< - Item = impl ExactSizeIterator + DoubleEndedIterator<Item = &'a [U; CHANNELS]>, - > - where - T: AsRef<[U]>, - { - (0..self.width()).map(move |x| (0..self.height()).map(move |y| unsafe { self.pixel(x, y) })) - } - - /// iterator over rows - /// returns a iterator over each row - /// ```text - /// [ 1 2 3 ] - /// [ 4 5 6 ] - /// [ 7 8 9 ] - /// ``` - /// - /// ``` - /// # use fimg::Image; - /// let img: Image<&[u8],1> = Image::build(2, 3).buf(&[ - /// 1, 5, - /// 2, 4, - /// 7, 9 - /// ]); - /// assert_eq!( - /// img.rows().collect::<Vec<_>>(), - /// [[[1], [5]], [[2], [4]], [[7], [9]]] - /// ); - /// ``` - #[must_use = "iterators are lazy and do nothing unless consumed"] - pub fn rows<'a, U: 'a>( - &'a self, - ) -> impl ExactSizeIterator + DoubleEndedIterator<Item = &'a [[U; CHANNELS]]> - where - T: AsRef<[U]>, - { - self.flatten().chunks_exact(self.width() as usize) - } - - /// Itearte the pixels of this image in parse order. - /// use [`Image::chunked`] if you just want the pixels. - pub fn ordered( - &self, - ) -> impl ExactSizeIterator + DoubleEndedIterator<Item = (u32, u32)> + use<T, CHANNELS> { - let w = self.width(); - unsafe { - (0..self.height()) - .flat_map(move |y| (0..w).map(move |x| (x, y))) - .has(self.width() as usize * self.height() as usize) - } - } - - /// Iterate the pixels of this image in serpentine order. - /// - /// # Safety - /// - /// The points are guaranteed to be on the image. - pub fn serpent( - &self, - ) -> impl ExactSizeIterator + Iterator<Item = (u32, u32)> + use<T, CHANNELS> { - let w = self.width(); - unsafe { - (0..self.height() / 2) - .flat_map(move |y| { - std::iter::chain( - (0..w).map(move |x| (x, y * 2)), - (0..w).rev().map(move |x| (x, (y * 2) + 1)), - ) - }) - .take(self.width() as usize * self.height() as usize) - .has(self.width() as usize * self.height() as usize) - } - } - - /// Get the pixels from an iterator. - /// # Safety - /// the points must be on the image. - pub unsafe fn pixels_of<'l, U: Copy + 'l>( - &'l self, - iterator: impl ExactSizeIterator<Item = (u32, u32)> + 'l, - ) -> impl ExactSizeIterator<Item = &'l [U; CHANNELS]> - where - T: AsRef<[U]>, - { - iterator.map(move |(x, y)| unsafe { self.pixel(x, y) }) - } -} - -impl<T: AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS> { - /// Bytes of this image. - pub fn bytes(&self) -> &[u8] { - self.buffer.as_ref() - } - - /// Procure a [`ImageCloner`]. - #[must_use = "function does not modify the original image"] - pub fn cloner(&self) -> ImageCloner<'_, CHANNELS> { - ImageCloner::from(self.as_ref()) - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS> { #[inline] /// Returns a iterator over every pixel, mutably pub fn chunked_mut(&mut self) -> impl Iterator<Item = &mut [u8; CHANNELS]> { // SAFETY: 0 sized images are not allowed - unsafe { assert_unchecked(self.len() >= CHANNELS) }; - // SAFETY: buffer cannot have half pixels - unsafe { assert_unchecked(self.len() % CHANNELS == 0) }; - self.buffer.as_mut().array_chunks_mut::<CHANNELS>() - } - - #[inline] - /// Flatten the chunks of this image into a mutable slice of slices. - pub fn flatten_mut(&mut self) -> &mut [[u8; CHANNELS]] { + unsafe { assert_unchecked!(self.buffer.len() > CHANNELS) }; // SAFETY: buffer cannot have half pixels - unsafe { self.buffer.as_mut().as_chunks_unchecked_mut::<CHANNELS>() } + unsafe { assert_unchecked!(self.buffer.len() % CHANNELS == 0) }; + self.buffer.array_chunks_mut::<CHANNELS>() } /// Set the pixel at x, y @@ -795,93 +184,74 @@ impl<T: AsMut<[u8]> + AsRef<[u8]>, const CHANNELS: usize> Image<T, CHANNELS> { /// /// UB if x, y is out of bounds. #[inline] - pub unsafe fn set_pixel(&mut self, x: u32, y: u32, px: &[u8; CHANNELS]) { + pub unsafe fn set_pixel(&mut self, x: u32, y: u32, px: [u8; CHANNELS]) { // SAFETY: Caller says that x, y is in bounds let out = unsafe { self.pixel_mut(x, y) }; // SAFETY: px must be CHANNELS long unsafe { std::ptr::copy_nonoverlapping(px.as_ptr(), out.as_mut_ptr(), CHANNELS) }; } +} - /// Such swap. not actually implemented properly. - pub unsafe fn swap_pixel(&mut self, (x1, y1): (u32, u32), (x2, y2): (u32, u32)) { - unsafe { - let &p2 = self.pixel(x2, y2); - let &p1 = self.pixel(x1, y1); - self.set_pixel(x2, y2, &p1); - self.set_pixel(x1, y1, &p2); - } +pub trait FromRef<const CHANNELS: usize> { + /// Reference the buffer + fn as_ref(&self) -> Image<&[u8], CHANNELS>; +} + +pub trait FromRefMut<const CHANNELS: usize> { + /// Reference the buffer, mutably + fn as_mut(&mut self) -> Image<&mut [u8], CHANNELS>; +} + +impl<const CHANNELS: usize> FromRef<CHANNELS> for Image<&mut [u8], CHANNELS> { + fn as_ref(&self) -> Image<&[u8], CHANNELS> { + Image::new(self.width, self.height, self.buffer) } } -impl<const CHANNELS: usize> Image<&mut [u8], CHANNELS> { - /// Copy this ref image - pub fn copy(&mut self) -> Image<&mut [u8], CHANNELS> { - #[allow(clippy::undocumented_unsafe_blocks)] - unsafe { - Image::new(self.width, self.height, self.buffer) - } +impl<const CHANNELS: usize> FromRefMut<CHANNELS> for Image<&mut [u8], CHANNELS> { + fn as_mut(&mut self) -> Image<&mut [u8], CHANNELS> { + Image::new(self.width, self.height, self.buffer) + } +} + +impl<const CHANNELS: usize> FromRef<CHANNELS> for Image<Vec<u8>, CHANNELS> { + fn as_ref(&self) -> Image<&[u8], CHANNELS> { + Image::new(self.width, self.height, &self.buffer) + } +} + +impl<const CHANNELS: usize> FromRefMut<CHANNELS> for Image<Vec<u8>, CHANNELS> { + fn as_mut(&mut self) -> Image<&mut [u8], CHANNELS> { + Image::new(self.width, self.height, &mut self.buffer) } } impl<const CHANNELS: usize> Image<Vec<u8>, CHANNELS> { - /// Allocates a new image. If `width` and `height` are constant, try using [`make`]. + /// Allocates a new image /// /// # Panics /// /// if width || height == 0 #[must_use] pub fn alloc(width: u32, height: u32) -> Self { - Self { + Image { width: width.try_into().unwrap(), height: height.try_into().unwrap(), buffer: vec![0; CHANNELS * width as usize * height as usize], } } - - /// Consumes and leaks this image, returning a reference to the image. - #[must_use = "not using the returned reference is a memory leak"] - pub fn leak(self) -> Image<&'static mut [u8], CHANNELS> { - // SAFETY: size unchanged - unsafe { self.mapped(Vec::leak) } - } -} - -impl<const CHANNELS: usize, T: ?Sized> Image<Box<T>, CHANNELS> { - /// Consumes and leaks this image, returning a reference to the image. - #[must_use = "not using the returned reference is a memory leak"] - pub fn leak(self) -> Image<&'static mut T, CHANNELS> { - // SAFETY: size unchanged - unsafe { self.mapped(Box::leak) } - } -} - -#[cfg(feature = "save")] -/// Write a png image. -pub trait WritePng { - /// Write this png image. - fn write(&self, f: &mut impl std::io::Write) -> std::io::Result<()>; } - -/// Read png. -#[cfg(feature = "save")] -pub trait ReadPng -where - Self: Sized, -{ - /// Read a png into an image. - fn read<T: std::io::BufRead + std::io::Seek>(f: &mut T) -> std::io::Result<Self>; -} - -/// helper macro for defining the save() method. macro_rules! save { ($channels:literal == $clr:ident ($clrhuman:literal)) => { - #[cfg(feature = "save")] - impl<T: AsRef<[u8]>> WritePng for Image<T, $channels> { + impl Image<&[u8], $channels> { + #[cfg(feature = "save")] #[doc = "Save this "] #[doc = $clrhuman] #[doc = " image."] - fn write(&self, f: &mut impl std::io::Write) -> std::io::Result<()> { - let mut enc = png::Encoder::new(f, self.width(), self.height()); + pub fn save(&self, f: impl AsRef<std::path::Path>) { + let p = std::fs::File::create(f).unwrap(); + let w = &mut std::io::BufWriter::new(p); + let mut enc = png::Encoder::new(w, self.width(), self.height()); enc.set_color(png::ColorType::$clr); enc.set_depth(png::BitDepth::Eight); enc.set_source_gamma(png::ScaledFloat::new(1.0 / 2.2)); @@ -891,88 +261,13 @@ macro_rules! save { (0.30000, 0.60000), (0.15000, 0.06000), )); - let mut writer = enc.write_header()?; - writer.write_image_data(self.bytes())?; - Ok(()) - } - } - impl<T: AsRef<[u8]>> Image<T, $channels> { - #[cfg(feature = "save")] - #[doc = "Save this "] - #[doc = $clrhuman] - #[doc = " image."] - pub fn save(&self, f: impl AsRef<std::path::Path>) { - self.write(&mut std::io::BufWriter::new( - std::fs::File::create(f).unwrap(), - )) - .unwrap(); + let mut writer = enc.write_header().unwrap(); + writer.write_image_data(self.buffer).unwrap(); } } }; } -macro_rules! read { - ($n:literal) => { - #[cfg(feature = "save")] - impl ReadPng for Image<Box<[u8]>, $n> { - /// Open a PNG image - fn read<T: std::io::BufRead + std::io::Seek>(f: &mut T) -> std::io::Result<Self> { - use png::Transformations as T; - let mut dec = png::Decoder::new(f); - match $n { - 1 | 3 => dec.set_transformations(T::STRIP_16 | T::EXPAND), - 2 | 4 => dec.set_transformations(T::STRIP_16 | T::ALPHA), // alpha implies expand - _ => (), - } - let mut reader = dec.read_info()?; - let mut buf = vec![0; reader.output_buffer_size().unwrap()].into_boxed_slice(); - let info = reader.next_frame(&mut buf)?; - use png::ColorType::*; - macro_rules! n { - ($x:literal) => { - Image::<_, $x>::build(info.width, info.height) - .buf(buf) - .into() - }; - } - Ok(match info.color_type { - Indexed => unreachable!(), // see EXPAND - Grayscale => n![1], - GrayscaleAlpha => n![2], - Rgb => n![3], - Rgba => n![4], - }) - } - } - }; -} -impl<const CHANNELS: usize> Image<Vec<u8>, CHANNELS> -where - [(); { (CHANNELS <= 4) as usize } - 1]:, -{ - #[cfg(feature = "save")] - /// Open a PNG image - pub fn open(f: impl AsRef<std::path::Path>) -> Self { - let p = std::fs::File::open(f).unwrap(); - let r = &mut std::io::BufReader::new(p); - use core::intrinsics::transmute_unchecked as t; - // SAFETY: ... this is idiotic. - unsafe { - match CHANNELS { - 1 => t(Image::<Box<_>, 1>::read(r).unwrap().unbox()), - 2 => t(Image::<Box<_>, 2>::read(r).unwrap().unbox()), - 3 => t(Image::<Box<_>, 3>::read(r).unwrap().unbox()), - 4 => t(Image::<Box<_>, 4>::read(r).unwrap().unbox()), - _ => unreachable!(), - } - } - } -} -read!(1); -read!(2); -read!(3); -read!(4); - save!(3 == Rgb("RGB")); save!(4 == Rgba("RGBA")); save!(2 == GrayscaleAlpha("YA")); @@ -980,11 +275,14 @@ save!(1 == Grayscale("Y")); #[cfg(test)] macro_rules! img { - [[$($v:literal),+] [$($v2:literal),+]] => { - Image::<Vec<u8>, 1>::build(2,2).buf(vec![$($v,)+ $($v2,)+]) - } + [[$($v:literal),+] [$($v2:literal),+]] => {{ + let from: Image<Vec<u8>, 1> = Image::new( + 2.try_into().unwrap(), + 2.try_into().unwrap(), + vec![$($v,)+ $($v2,)+] + ); + from + }} } #[cfg(test)] use img; - -use crate::slicing::PBounds; diff --git a/src/math.rs b/src/math.rs deleted file mode 100644 index 08e8457..0000000 --- a/src/math.rs +++ /dev/null @@ -1,22 +0,0 @@ -//! utility math -/// Calculates `a * b + c`, with hardware support if possible. -#[allow(clippy::suboptimal_flops)] -pub fn madd(a: f32, b: f32, c: f32) -> f32 { - if cfg!(target_feature = "fma") { - a.mul_add(b, c) - } else { - a * b + c - } -} - -/// helps -pub trait FExt { - /// Calculates `a * b + c`, with hardware support if possible. - fn madd(self, a: f32, b: f32) -> Self; -} - -impl FExt for f32 { - fn madd(self, a: f32, b: f32) -> Self { - madd(self, a, b) - } -} diff --git a/src/overlay.rs b/src/overlay.rs index 0725453..d1211a9 100644 --- a/src/overlay.rs +++ b/src/overlay.rs @@ -1,12 +1,8 @@ -//! Handles image overlay -// TODO Y/YA -use crate::{DynImage, cloner::ImageCloner, uninit}; +use super::{assert_unchecked, really_unsafe_index, Image}; +use std::simd::SimdInt; +use std::simd::SimdPartialOrd; +use std::simd::{simd_swizzle, Simd}; -use super::{Image, assert_unchecked}; -use crate::pixels::Blend; -use std::{mem::transmute, simd::prelude::*}; - -/// Trait for layering a image ontop of another, with a offset to the second image. pub trait OverlayAt<W> { /// Overlay with => self at coordinates x, y, without blending /// # Safety @@ -15,228 +11,82 @@ pub trait OverlayAt<W> { unsafe fn overlay_at(&mut self, with: &W, x: u32, y: u32) -> &mut Self; } -/// Useful for debugging, sometimes. -#[doc(hidden)] -pub trait OverlayAtClipping<W> { - fn clipping_overlay_at(&mut self, with: &W, x: u32, y: u32) -> &mut Self; -} - -/// Sealant module -mod sealed { - /// Seals the cloner traits - pub trait Sealed {} -} -use sealed::Sealed; -impl<const N: usize> Sealed for ImageCloner<'_, N> {} - -/// [`OverlayAt`] but owned -pub trait ClonerOverlayAt<const W: usize, const C: usize>: Sealed { - /// Overlay with => self at coordinates x, y, without blending, and returning a new image. - /// # Safety - /// - /// UB if x, y is out of bounds - #[must_use = "function does not modify the original image"] - unsafe fn overlay_at(&self, with: &Image<&[u8], W>, x: u32, y: u32) -> Image<Vec<u8>, C>; -} - -/// Trait for layering images ontop of each other. -/// Think `magick a b -layers flatten a` pub trait Overlay<W> { /// Overlay with => self (does not blend) - /// /// # Safety /// /// UB if a.width != b.width || a.height != b.height unsafe fn overlay(&mut self, with: &W) -> &mut Self; } -/// This blends the images together, like [`imageops::overlay`](https://docs.rs/image/latest/image/imageops/fn.overlay.html). -pub trait BlendingOverlay<W> { - /// Overlay with => self, blending. You probably do not need this, unless your images make much usage of alpha. - /// If you only have 2 alpha states, `0` | `255` (transparent | opaque), please use [`Overlay`], as it is much faster. - /// # Safety - /// - /// UB if a.width != b.width || a.height != b.height - unsafe fn overlay_blended(&mut self, with: &W) -> &mut Self; -} -/// Blending overlay at. -pub trait BlendingOverlayAt<W> { - /// See [BlendingOverlay::overlay_blended]. - /// # Safety - /// - /// UB if x, y is out of bounds - unsafe fn overlay_blended_at(&mut self, with: &W, x: u32, y: u32) -> &mut Self; -} - -/// [`Overlay`] but owned -pub trait ClonerOverlay<const W: usize, const C: usize>: Sealed { - /// Overlay with => self (does not blend) - /// # Safety - /// - /// UB if a.width != b.width || a.height != b.height - unsafe fn overlay(&self, with: &Image<&[u8], W>) -> Image<Vec<u8>, C>; -} - #[inline] -/// SIMD accelerated rgba => rgb overlay. -/// -/// See [blit](https://en.wikipedia.org/wiki/Bit_blit) -/// -/// # Safety -/// - UB if rgb.len() % 3 != 0 -/// - UB if rgba.len() % 4 != 0 -unsafe fn blit(mut rgb: &mut [u8], mut rgba: &[u8]) { - while rgb.len() >= 16 { - let dst = rgb.first_chunk_mut::<16>().unwrap(); - let src = rgba.first_chunk::<16>().unwrap(); - let old = Simd::from_slice(dst); - let new: u8x16 = Simd::from_slice(src); - - let threshold = new.simd_ge(Simd::splat(128)).to_simd().cast::<u8>(); +unsafe fn blit(rgb: &mut [u8], rgba: &[u8]) { + const LAST4: Simd<u8, 16> = Simd::from_array([ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, + ]); + + let mut srci = 0; + let mut dsti = 0; + while dsti + 16 <= rgb.len() { + let old: Simd<u8, 16> = Simd::from_slice(unsafe { rgb.get_unchecked(dsti..dsti + 16) }); + let new: Simd<u8, 16> = Simd::from_slice(unsafe { rgba.get_unchecked(srci..srci + 16) }); + + let threshold = new.simd_ge(Simd::splat(128)).to_int().cast::<u8>(); let mut mask = simd_swizzle!( threshold, - // [r, g, b, a (3)] [r, g, b, a(7)] [3, 3, 3, 7, 7, 7, 11, 11, 11, 15, 15, 15, 0, 0, 0, 0] ); - mask &= Simd::from_array([ - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, - ]); - // [r(0), g, b] <skip a> [r(4), g, b] + mask &= LAST4; + let new_rgb = simd_swizzle!(new, [0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 0, 0, 0, 0]); let blended = (new_rgb & mask) | (old & !mask); - blended.copy_to_slice(dst); - rgb = &mut rgb[12..]; - rgba = &rgba[16..]; + blended.copy_to_slice(unsafe { rgb.get_unchecked_mut(dsti..dsti + 16) }); + + srci += 16; + dsti += 12; } - while rgb.len() >= 3 { - // SAFETY: guaranteed - if unsafe { *rgba.get_unchecked(3) } >= 128 { - rgb[..3].copy_from_slice(&rgba[..3]); + + while dsti + 3 <= rgb.len() { + if unsafe { *rgba.get_unchecked(srci + 3) } >= 128 { + let src = unsafe { rgba.get_unchecked(srci..srci + 3) }; + let end = unsafe { rgb.get_unchecked_mut(dsti..dsti + 3) }; + unsafe { std::ptr::copy_nonoverlapping(src.as_ptr(), end.as_mut_ptr(), 3) }; } - rgba = &rgba[4..]; - rgb = &mut rgb[3..]; - } -} -#[doc(hidden)] -#[unsafe(no_mangle)] -pub fn copy_rgb_bgr_(i: &[[u8; 3]], o: &mut [[u8; 4]]) { - unsafe { assert_unchecked(i.len() == o.len()) }; - let mut i = i.as_flattened(); - let mut o = o.as_flattened_mut(); - while i.len() >= 32 { - let dst = unsafe { o.first_chunk_mut::<32>().unwrap_unchecked() }; // 8 pixels (32) - let src = u8x32::from_array(*i.first_chunk().unwrap()); // 8 pixels (24) - let src = simd_swizzle!( - src, - // range::<8>().map(_ * 3).map(|x| [x + 2, x + 1, x, 31]).flatten() - [ - 2, 1, 0, 31, 5, 4, 3, 31, 8, 7, 6, 31, 11, 10, 9, 31, 14, 13, 12, 31, 17, 16, 15, - 31, 20, 19, 18, 31, 23, 22, 21, 31, - ], - ); - src.copy_to_slice(dst); - i = &i[24..]; - o = &mut o[32..]; - } - while let Some(&[r, g, b]) = i.first_chunk() { - unsafe { *o.first_chunk_mut::<4>().unwrap_unchecked() = [b, g, r, 0] }; - o = &mut o[4..]; - i = &i[3..]; + srci += 4; + dsti += 3; } } -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> Overlay<Image<U, 4>> for Image<T, 4> { +impl Overlay<Image<&[u8], 4>> for Image<&mut [u8], 4> { #[inline] - #[cfg_attr(debug_assertions, track_caller)] - unsafe fn overlay(&mut self, with: &Image<U, 4>) -> &mut Self { + unsafe fn overlay(&mut self, with: &Image<&[u8], 4>) -> &mut Self { debug_assert!(self.width() == with.width()); debug_assert!(self.height() == with.height()); for (i, other_pixels) in with.chunked().enumerate() { if other_pixels[3] >= 128 { - // SAFETY: outside are bounds of index from slice - let own_pixels = - unsafe { self.buffer.as_mut().get_unchecked_mut(i * 4..i * 4 + 4) }; - own_pixels.copy_from_slice(other_pixels); + let idx_begin = unsafe { i.unchecked_mul(4) }; + let idx_end = unsafe { idx_begin.unchecked_add(4) }; + let own_pixels = unsafe { self.buffer.get_unchecked_mut(idx_begin..idx_end) }; + unsafe { + std::ptr::copy_nonoverlapping( + other_pixels.as_ptr(), + own_pixels.as_mut_ptr(), + 4, + ); + }; } } self } } -impl<const A: usize, const B: usize, T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> - BlendingOverlay<Image<U, B>> for Image<T, A> -where - [u8; A]: Blend<B>, -{ +impl OverlayAt<Image<&[u8], 4>> for Image<&mut [u8], 3> { #[inline] - #[cfg_attr(debug_assertions, track_caller)] - unsafe fn overlay_blended(&mut self, with: &Image<U, B>) -> &mut Self { - debug_assert!(self.width() == with.width()); - debug_assert!(self.height() == with.height()); - for (other_pixels, own_pixels) in with.chunked().zip(self.chunked_mut()) { - own_pixels.blend(*other_pixels); - } - self - } -} - -impl<const A: usize, const B: usize, T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> - BlendingOverlayAt<Image<U, B>> for Image<T, A> -where - [u8; A]: Blend<B>, -{ - #[inline] - unsafe fn overlay_blended_at(&mut self, with: &Image<U, B>, x: u32, y: u32) -> &mut Self { - for j in 0..with.height() { - for i in 0..with.width() { - // SAFETY: i, j is in bounds. - let their_px = unsafe { with.pixel(i, j) }; - let our_px = unsafe { self.pixel_mut(i + x, j + y) }; - our_px.blend(*their_px); - } - } - self - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>> Image<T, 3> { - #[doc(hidden)] - #[cfg_attr(debug_assertions, track_caller)] - pub unsafe fn blend_alpha_and_color_at( - &mut self, - with: &Image<&[u8], 1>, - color: [u8; 3], - x: u32, - y: u32, - ) { - for j in 0..with.height() { - for i in 0..with.width() { - let &[their_alpha] = unsafe { with.pixel(i, j) }; - let our_pixel = unsafe { self.pixel_mut(i + x, j + y) }; - crate::pixels::blending::blend_alpha_and_color(their_alpha, color, our_pixel); - } - } - } -} - -impl ClonerOverlay<4, 4> for ImageCloner<'_, 4> { - #[inline] - unsafe fn overlay(&self, with: &Image<&[u8], 4>) -> Image<Vec<u8>, 4> { - let mut out = self.dup(); - // SAFETY: same - unsafe { out.as_mut().overlay(with) }; - out - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<Image<U, 4>> for Image<T, 3> { - #[inline] - #[cfg_attr(debug_assertions, track_caller)] - unsafe fn overlay_at(&mut self, with: &Image<U, 4>, x: u32, y: u32) -> &mut Self { - // SAFETY: caller upholds this - unsafe { assert_unchecked(x + with.width() <= self.width()) }; - debug_assert!(y + with.height() <= self.height()); + unsafe fn overlay_at(&mut self, with: &Image<&[u8], 4>, x: u32, y: u32) -> &mut Self { + // SAFETY: caller upholds these + unsafe { assert_unchecked!(x + with.width() <= self.width()) }; + unsafe { assert_unchecked!(y + with.height() <= self.height()) }; for j in 0..with.height() { let i_x = j as usize * with.width() as usize * 4 ..(j as usize + 1) * with.width() as usize * 4; @@ -245,274 +95,73 @@ impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<Image<U, 4>> for Im + x as usize + with.width() as usize) * 3; - // SAFETY: index is in bounds - let rgb = unsafe { self.buffer.as_mut().get_unchecked_mut(o_x) }; - // SAFETY: bounds are outside index - let rgba = unsafe { with.buffer.as_ref().get_unchecked(i_x) }; - // SAFETY: arguments are 🟢 + let rgb = unsafe { self.buffer.get_unchecked_mut(o_x) }; + let rgba = unsafe { with.buffer.get_unchecked(i_x) }; unsafe { blit(rgb, rgba) } } self } } -impl<U: AsRef<[u8]>> OverlayAt<Image<U, 4>> for uninit::Image<u8, 3> { - #[cfg_attr(debug_assertions, track_caller)] - unsafe fn overlay_at(&mut self, with: &Image<U, 4>, x: u32, y: u32) -> &mut Self { - // SAFETY: caller upholds this - unsafe { assert_unchecked(x + with.width() <= self.width()) }; - debug_assert!(y + with.height() <= self.height()); - for j in 0..with.height() { - let i_x = j as usize * with.width() as usize * 4 - ..(j as usize + 1) * with.width() as usize * 4; - let o_x = ((j as usize + y as usize) * self.width() as usize + x as usize) * 3 - ..((j as usize + y as usize) * self.width() as usize - + x as usize - + with.width() as usize) - * 3; - // SAFETY: index is in bounds - let rgb = unsafe { transmute(self.buf().get_unchecked_mut(o_x)) }; - // SAFETY: bounds are outside index - let rgba = unsafe { with.buffer.as_ref().get_unchecked(i_x) }; - // SAFETY: arguments are 🟢 - unsafe { blit(rgb, rgba) } - } - self - } -} - -impl ClonerOverlayAt<4, 3> for ImageCloner<'_, 3> { - #[inline] - unsafe fn overlay_at(&self, with: &Image<&[u8], 4>, x: u32, y: u32) -> Image<Vec<u8>, 3> { - let mut new = self.dup(); - // SAFETY: same - unsafe { new.as_mut().overlay_at(with, x, y) }; - new - } -} - -impl<U: AsRef<[u8]>> OverlayAt<Image<U, 3>> for uninit::Image<u8, 3> { - #[inline] - #[cfg_attr(debug_assertions, track_caller)] - unsafe fn overlay_at(&mut self, with: &Image<U, 3>, x: u32, y: u32) -> &mut Self { - for j in 0..(with.width() as usize) { - let i_x = j * (with.width() as usize) * 3..(j + 1) * (with.width() as usize) * 3; - let o_x = ((j + y as usize) * self.width() as usize + x as usize) * 3 - ..((j + y as usize) * self.width() as usize + x as usize + (with.width() as usize)) - * 3; - // <= because ".." range - // debug_assert!(o_x.end <= self.buffer().as_ref().len()); - debug_assert!(i_x.end <= with.buffer().as_ref().len()); - // SAFETY: we are in ⬜! - let b = unsafe { with.buffer.as_ref().get_unchecked(i_x) }; - // SAFETY: should work - unsafe { self.write(b, o_x) }; - } - self - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<Image<U, 1>> for Image<T, 3> { +impl OverlayAt<Image<&[u8], 3>> for Image<&mut [u8], 3> { #[inline] - #[cfg_attr(debug_assertions, track_caller)] - /// this impl doesnt make much sense without a color. - unsafe fn overlay_at(&mut self, with: &Image<U, 1>, x: u32, y: u32) -> &mut Self { - for j in 0..with.height() { - for i in 0..with.width() { - // SAFETY: i, j is in bounds. - let &[their_px] = unsafe { with.pixel(i, j) }; - let our_px = unsafe { self.pixel_mut(i + x, j + y) }; - our_px.copy_from_slice(&[their_px; 3]); - } - } - self - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<Image<U, 2>> for Image<T, 3> { - #[inline] - #[cfg_attr(debug_assertions, track_caller)] - /// this impl doesnt make much sense without a color. - unsafe fn overlay_at(&mut self, with: &Image<U, 2>, x: u32, y: u32) -> &mut Self { - for j in 0..with.height() { - for i in 0..with.width() { - // SAFETY: i, j is in bounds. - let &[their_px, a] = unsafe { with.pixel(i, j) }; - if a >= 128 { - let our_px = unsafe { self.pixel_mut(i + x, j + y) }; - our_px.copy_from_slice(&[their_px; 3]); + unsafe fn overlay_at(&mut self, with: &Image<&[u8], 3>, x: u32, y: u32) -> &mut Self { + macro_rules! o3x3 { + ($n:expr) => {{ + for j in 0..($n as usize) { + let i_x = j * ($n as usize) * 3..(j + 1) * ($n as usize) * 3; + let o_x = ((j + y as usize) * self.width() as usize + x as usize) * 3 + ..((j + y as usize) * self.width() as usize + x as usize + ($n as usize)) + * 3; + let a = unsafe { self.buffer.get_unchecked_mut(o_x) }; + let b = unsafe { with.buffer.get_unchecked(i_x) }; + a.copy_from_slice(b); } - } + }}; } - self - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<Image<U, 1>> for Image<T, 4> { - #[inline] - #[cfg_attr(debug_assertions, track_caller)] - /// this impl doesnt make much sense without a color. - unsafe fn overlay_at(&mut self, with: &Image<U, 1>, x: u32, y: u32) -> &mut Self { - for j in 0..with.height() { - for i in 0..with.width() { - // SAFETY: i, j is in bounds. - let &[their_px] = unsafe { with.pixel(i, j) }; - let our_px = unsafe { self.pixel_mut(i + x, j + y) }; - our_px.copy_from_slice(&[their_px; 4]); - } - } - self - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<Image<U, 2>> for Image<T, 4> { - #[inline] - #[cfg_attr(debug_assertions, track_caller)] - /// this impl doesnt make much sense without a color. - unsafe fn overlay_at(&mut self, with: &Image<U, 2>, x: u32, y: u32) -> &mut Self { - for j in 0..with.height() { - for i in 0..with.width() { - // SAFETY: i, j is in bounds. - let &[their_px, a] = unsafe { with.pixel(i, j) }; - if a >= 128 { - let our_px = unsafe { self.pixel_mut(i + x, j + y) }; - our_px.copy_from_slice(&[their_px; 4]); - } - } + // let it unroll + match with.width() { + 8 => o3x3!(8), + 16 => o3x3!(16), // this branch makes 8x8 0.16 times slower; but 16x16 0.2 times faster. + _ => o3x3!(with.width()), } self } } -impl<const N: usize, T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAtClipping<Image<U, N>> - for Image<T, N> -{ - #[inline] - #[cfg_attr(debug_assertions, track_caller)] - fn clipping_overlay_at(&mut self, with: &Image<U, N>, x: u32, y: u32) -> &mut Self { - for j in 0..with.height() { - for i in 0..with.width() { - // SAFETY: i, j is in bounds. - if let Some(their_px) = with.get_pixel(i, j) - && let Some(our_px) = self.get_pixel_mut(i + x, j + y) - { - our_px.copy_from_slice(their_px); - } - } - } - self - } -} -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<Image<U, 3>> for Image<T, 4> { +impl Overlay<Image<&[u8], 4>> for Image<&mut [u8], 3> { #[inline] - #[cfg_attr(debug_assertions, track_caller)] - /// its not a optimized impl - unsafe fn overlay_at(&mut self, with: &Image<U, 3>, x: u32, y: u32) -> &mut Self { - for j in 0..with.height() { - for i in 0..with.width() { - // SAFETY: i, j is in bounds. - let their_px = unsafe { with.pixel(i, j) }; - let our_px = unsafe { self.pixel_mut(i + x, j + y) }; - our_px.copy_from_slice(their_px); - } - } - self - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<Image<U, 3>> for Image<T, 3> { - /// Overlay a RGB image(with) => self at coordinates x, y. - /// As this is a `RGBxRGB` operation, blending is unnecessary, - /// and this is simply a copy. - /// - /// # Safety - /// - /// UB if x, y is out of bounds - #[inline] - #[cfg_attr(debug_assertions, track_caller)] - unsafe fn overlay_at(&mut self, with: &Image<U, 3>, x: u32, y: u32) -> &mut Self { - for j in 0..with.height() as usize { - let i_x = // copy entire rows at a time - j * (with.width() as usize) * 3 - ..(j + 1) * (with.width() as usize) * 3; - let o_x = // _ - ((j + y as usize) * self.width() as usize + x as usize) * 3 - ..((j + y as usize) * self.width() as usize + x as usize + with.width() as usize) * 3; - // <= because ".." range - debug_assert!(o_x.end <= self.buffer().as_ref().len()); - debug_assert!(i_x.end <= with.buffer().as_ref().len()); - // SAFETY: bounds are ✅ - let a = unsafe { self.buffer.as_mut().get_unchecked_mut(o_x) }; - // SAFETY: we are in ⬜! - let b = unsafe { with.buffer.as_ref().get_unchecked(i_x) }; - a.copy_from_slice(b); - } - self - } -} - -impl ClonerOverlayAt<3, 3> for ImageCloner<'_, 3> { - /// Overlay a RGB image(with) => self at coordinates x, y. - /// As this is a `RGBxRGB` operation, blending is unnecessary, - /// and this is simply a copy. - /// - /// # Safety - /// - /// UB if x, y is out of bounds - #[inline] - unsafe fn overlay_at(&self, with: &Image<&[u8], 3>, x: u32, y: u32) -> Image<Vec<u8>, 3> { - let mut out = self.dup(); - // SAFETY: same - unsafe { out.as_mut().overlay_at(with, x, y) }; - out - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> Overlay<Image<U, 4>> for Image<T, 3> { - #[inline] - #[cfg_attr(debug_assertions, track_caller)] - unsafe fn overlay(&mut self, with: &Image<U, 4>) -> &mut Self { + unsafe fn overlay(&mut self, with: &Image<&[u8], 4>) -> &mut Self { debug_assert!(self.width() == with.width()); debug_assert!(self.height() == with.height()); for (i, chunk) in with .buffer - .as_ref() .chunks_exact(with.width() as usize * 4) .enumerate() { - // SAFETY: all the bounds are good let rgb = unsafe { - self.buffer.as_mut().get_unchecked_mut( + self.buffer.get_unchecked_mut( i * with.width() as usize * 3..(i + 1) * with.width() as usize * 3, ) }; - // SAFETY: we have the rgb and rgba arguments right unsafe { blit(rgb, chunk) }; } self } } -impl ClonerOverlay<4, 3> for ImageCloner<'_, 3> { - #[inline] - unsafe fn overlay(&self, with: &Image<&[u8], 4>) -> Image<Vec<u8>, 3> { - let mut out = self.dup(); - // SAFETY: same - unsafe { out.as_mut().overlay(with) }; - out - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<Image<U, 4>> for Image<T, 4> { +impl OverlayAt<Image<&[u8], 4>> for Image<&mut [u8], 4> { #[inline] - unsafe fn overlay_at(&mut self, with: &Image<U, 4>, x: u32, y: u32) -> &mut Self { + unsafe fn overlay_at(&mut self, with: &Image<&[u8], 4>, x: u32, y: u32) -> &mut Self { for j in 0..with.height() { for i in 0..with.width() { - // SAFETY: i, j is in bounds. - let their_px = unsafe { with.pixel(i, j) }; - if their_px[3] >= 128 { - // SAFETY: if everything else goes well, this is fine - let our_px = unsafe { self.pixel_mut(i + x, j + y) }; + let index = unsafe { really_unsafe_index(i, j, with.width()) }; + let their_px = unsafe { with.buffer.get_unchecked(index * 4..index * 4 + 4) }; + if unsafe { *their_px.get_unchecked(3) } >= 128 { + let x = unsafe { i.unchecked_add(x) }; + let y = unsafe { j.unchecked_add(y) }; + let index = unsafe { really_unsafe_index(x, y, self.width()) }; + let our_px = unsafe { self.buffer.get_unchecked_mut(index * 4..index * 4 + 4) }; our_px.copy_from_slice(their_px); } } @@ -521,42 +170,3 @@ impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<Image<U, 4>> for Im self } } - -impl ClonerOverlayAt<4, 4> for ImageCloner<'_, 4> { - #[inline] - unsafe fn overlay_at(&self, with: &Image<&[u8], 4>, x: u32, y: u32) -> Image<Vec<u8>, 4> { - let mut out = self.dup(); - // SAFETY: same - unsafe { out.as_mut().overlay_at(with, x, y) }; - out - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<DynImage<U>> for Image<T, 3> { - unsafe fn overlay_at(&mut self, with: &DynImage<U>, x: u32, y: u32) -> &mut Self { - crate::r#dyn::e!(with, |with| unsafe { - self.overlay_at(with, x, y); - }); - self - } -} - -impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> OverlayAt<DynImage<U>> for Image<T, 4> { - unsafe fn overlay_at(&mut self, with: &DynImage<U>, x: u32, y: u32) -> &mut Self { - crate::r#dyn::e!(with, |with| unsafe { - self.overlay_at(with, x, y); - }); - self - } -} - -impl<U: AsRef<[u8]>> OverlayAt<DynImage<U>> for uninit::Image<u8, 3> { - unsafe fn overlay_at(&mut self, with: &DynImage<U>, x: u32, y: u32) -> &mut Self { - match with { - DynImage::Rgb(with) => unsafe { self.overlay_at(with, x, y) }, - DynImage::Rgba(with) => unsafe { self.overlay_at(with, x, y) }, - _ => unimplemented!(), - }; - self - } -} diff --git a/src/pack.rs b/src/pack.rs deleted file mode 100644 index e9ae84a..0000000 --- a/src/pack.rs +++ /dev/null @@ -1,50 +0,0 @@ -//! trait for packing pixels - -use crate::pixels::convert::{PFrom, RGB, RGBA, Y, YA}; - -#[inline] -pub const fn pack(x: [u8; 4]) -> u32 { - u32::from_le_bytes(x).rotate_left(8).swap_bytes() -} - -#[inline] -pub const fn unpack(n: u32) -> [u8; 4] { - n.rotate_left(8).to_be_bytes() -} - -/// packs and unpacks this pixel -/// note that `unpack(pack(p))` may not equal `p` -pub trait Pack<P = u32> { - /// pack this pixel - fn pack(&self) -> P; - /// unpacks this pixel - fn unpack(from: P) -> Self; -} - -macro_rules! simple { - ($p:ident) => { - impl Pack for $p { - fn pack(&self) -> u32 { - pack(PFrom::pfrom(*self)) - } - - fn unpack(from: u32) -> $p { - PFrom::pfrom(unpack(from)) - } - } - }; -} -simple!(RGBA); -simple!(RGB); -simple!(YA); -simple!(Y); - -impl Pack<u8> for Y { - fn pack(&self) -> u8 { - self[0] - } - - fn unpack(from: u8) -> Self { - [from] - } -} diff --git a/src/pixels/blending.rs b/src/pixels/blending.rs deleted file mode 100644 index cecc742..0000000 --- a/src/pixels/blending.rs +++ /dev/null @@ -1,127 +0,0 @@ -//! module for pixel blending ops -#![allow(redundant_semicolons)] -use super::{Floatify, Unfloatify, convert::PFrom, float, unfloat}; -use atools::prelude::*; - -/// Trait for blending pixels together. -pub trait Blend<const W: usize> { - /// blends self with another pixel - fn blend(&mut self, with: [u8; W]); -} - -pub(crate) fn blend_alpha_and_color(a: u8, color: [u8; 3], onto: &mut [u8; 3]) { - if a == 0 { - return; - } - if a == 255 { - *onto = color; - return; - } - - let [br, bg, bb] = *onto; - let [fr, fg, fb] = color; - - onto[0] = lerp(br, fr, a); - onto[1] = lerp(bg, fg, a); - onto[2] = lerp(bb, fb, a); - - // onto.copy_from_slice(&fg.zip(bg).map(|(f, b)| a * (f - b) + b)); -} - -fn lerp(ba: u8, fo: u8, a: u8) -> u8 { - ((fo as i32 - ba as i32) * a as i32 / 256 + ba as i32) as u8 -} - -impl Blend<4> for [u8; 4] { - #[lower::apply(algebraic)] - fn blend(&mut self, fg: [u8; 4]) { - if fg[3] == 0 { - return; - } - if fg[3] == 255 { - *self = fg; - return; - } - let fg = fg.float(); - let bg = self.float(); - let a = bg[3] + fg[3] - bg[3] * fg[3]; - if a == 0.0 { - return; - }; - self[..3].copy_from_slice( - &fg.init() - .zip(bg.init()) - .map(|(f, b)| (f * fg[3] + b * bg[3] * (1.0 - fg[3])) / a) - .unfloat(), - ); - self[3] = unfloat(a) - } -} - -impl Blend<3> for [u8; 3] { - fn blend(&mut self, with: [u8; 3]) { - *self = with; - } -} - -impl Blend<4> for [u8; 3] { - fn blend(&mut self, with: [u8; 4]) { - let mut us: [u8; 4] = PFrom::pfrom(*self); - us.blend(with); - *self = PFrom::pfrom(us); - } -} - -impl Blend<2> for [u8; 2] { - #[lower::apply(algebraic)] - fn blend(&mut self, with: [u8; 2]) { - let bg = self.float(); - let fg = with.float(); - - let a = bg[1] + fg[1] - bg[1] * fg[1]; - if a == 0.0 { - return; - } - *self = [ - // SAFETY: no u8 can do transform bad - (fg[0] * fg[1] + bg[0] * bg[1] * (unsafe { (1.0) } - fg[1])) / a, - a, - ] - .unfloat() - } -} - -impl Blend<1> for [u8; 1] { - fn blend(&mut self, with: [u8; 1]) { - *self = with; - } -} - -#[cfg(test)] -mod blend { - use super::*; - - macro_rules! blend { - ([$($a:literal),+] + [$($b:literal),+] = $what:expr) => { - let mut a = [$($a,)+]; - a.blend([$($b,)+]); - assert_eq!(a, $what); - }; -} - - #[test] - fn test_blend_rgba() { - blend!([255, 255, 255, 255] + [255, 255, 255, 255] = [255, 255, 255, 255]); - blend!([255, 255, 255, 0] + [255, 255, 255, 255] = [255, 255, 255, 255]); - blend!([255, 255, 255, 255] + [255_u8, 255, 255, 0] = [255, 255, 255, 255]); - blend!([255, 255, 255, 0] + [255_u8, 255, 255, 0] = [255, 255, 255, 0]); - } - - #[test] - fn test_blend_ya() { - blend!([255, 255] + [255, 255] = [255, 255]); - blend!([255, 0] + [255, 255] = [255, 255]); - blend!([255, 255] + [255, 0] = [255, 255]); - blend!([255, 0] + [255, 0] = [255, 0]); - } -} diff --git a/src/pixels/convert.rs b/src/pixels/convert.rs deleted file mode 100644 index 0f26312..0000000 --- a/src/pixels/convert.rs +++ /dev/null @@ -1,96 +0,0 @@ -//! provides From's for pixels. -use atools::prelude::*; - -/// Converts a pixel to another pixel. -pub trait PFrom<const N: usize> { - /// Convert a pixel to this pixel. - fn pfrom(f: [u8; N]) -> Self; -} - -impl<const N: usize> PFrom<N> for [u8; N] { - fn pfrom(f: [u8; N]) -> Self { - f - } -} - -/// Y pixel -pub type Y = [u8; 1]; -impl PFrom<2> for Y { - fn pfrom(f: YA) -> Self { - f.init() - } -} - -impl PFrom<3> for Y { - fn pfrom([r, g, b]: RGB) -> Self { - [((2126 * r as u32 + 7152 * g as u32 + 722 * b as u32) / 10000) as u8] - } -} - -impl PFrom<4> for Y { - fn pfrom(f: RGBA) -> Self { - PFrom::pfrom(f.init()) - } -} - -/// YA pixel -pub type YA = [u8; 2]; -impl PFrom<1> for YA { - fn pfrom(f: Y) -> Self { - f.join(255) - } -} - -impl PFrom<3> for YA { - fn pfrom(f: RGB) -> Self { - Y::pfrom(f).join(255) - } -} - -impl PFrom<4> for YA { - fn pfrom(f: RGBA) -> Self { - Y::pfrom(f.init()).join(255) - } -} - -/// RGB pixel -pub type RGB = [u8; 3]; - -impl PFrom<1> for RGB { - fn pfrom([y]: Y) -> Self { - [y; 3] - } -} - -impl PFrom<2> for RGB { - fn pfrom([y, _]: YA) -> Self { - [y; 3] - } -} - -impl PFrom<4> for RGB { - fn pfrom(f: RGBA) -> Self { - f.init() - } -} - -/// RGBA pixel -pub type RGBA = [u8; 4]; - -impl PFrom<1> for RGBA { - fn pfrom([y]: Y) -> Self { - [y; 3].join(255) - } -} - -impl PFrom<2> for RGBA { - fn pfrom([y, a]: YA) -> Self { - [y; 3].join(a) - } -} - -impl PFrom<3> for RGBA { - fn pfrom(f: [u8; 3]) -> Self { - f.join(255) - } -} diff --git a/src/pixels/mod.rs b/src/pixels/mod.rs deleted file mode 100644 index ceaa3d4..0000000 --- a/src/pixels/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -//! module for pixels ops. -#![allow(unused_imports)] -pub mod blending; -mod utility; -mod wam; -pub use blending::Blend; -pub(crate) use utility::{Floatify, Unfloatify, float, unfloat}; -pub(crate) use wam::Wam; -pub mod convert; diff --git a/src/pixels/utility.rs b/src/pixels/utility.rs deleted file mode 100644 index 78795ac..0000000 --- a/src/pixels/utility.rs +++ /dev/null @@ -1,42 +0,0 @@ -#[lower::apply(algebraic)] -pub trait Unfloatify<const N: usize> { - /// computes 255 * n, for all elements - fn unfloat(self) -> [u8; N]; -} - -#[inline(always)] -/// computes 255 * n -pub fn unfloat(n: f32) -> u8 { - // SAFETY: n is 0..=1 - (255.0 * n) as u8 -} - -impl<const N: usize> Unfloatify<N> for [f32; N] { - fn unfloat(self) -> [u8; N] { - self.map(unfloat) - } -} - -#[rustfmt::skip] -impl<const N:usize>Unfloatify<N>for[u8; N]{fn unfloat(self)->[u8;N]{self}} - -pub trait Floatify<const N: usize> { - /// computes n / 255, for all elements - fn float(self) -> [f32; N]; -} - -/// computes n / 255 -#[lower::apply(algebraic)] -pub fn float(n: u8) -> f32 { - // SAFETY: 0..=255 / 0..=255 mayn't ever be NAN / INF - n as f32 / 255.0 -} - -impl<const N: usize> Floatify<N> for [u8; N] { - fn float(self) -> [f32; N] { - self.map(float) - } -} - -#[rustfmt::skip] -impl<const N:usize>Floatify<N>for[f32;N]{fn float(self)->[f32;N]{self}} diff --git a/src/pixels/wam.rs b/src/pixels/wam.rs deleted file mode 100644 index e33d496..0000000 --- a/src/pixels/wam.rs +++ /dev/null @@ -1,27 +0,0 @@ -use super::{float, unfloat}; -use atools::prelude::*; -#[allow(dead_code)] -pub trait Wam { - /// this function weighs the sides and combines - fn wam(self, b: Self, l: f32, r: f32) -> Self; -} - -impl<const N: usize> Wam for [u8; N] { - fn wam(self, b: Self, l: f32, r: f32) -> Self { - // SAFETY: read [`weigh`] - self.zip(b).map(|(a, b)| weigh(a, b, l, r)) - } -} - -#[inline(always)] -#[lower::apply(algebraic)] -fn weigh(a: u8, b: u8, l: f32, r: f32) -> u8 { - unfloat((float(a) * l + float(b) * r).clamp(0., 1.)) -} - -#[test] -fn weig() { - assert_eq!(weigh(10, 20, 0.5, 0.5), 15); - assert_eq!(weigh(10, 20, 0.9, 0.1), 11); - assert_eq!(weigh(150, 150, 1.8, 0.8), 255); -} diff --git a/src/scale/algorithms.rs b/src/scale/algorithms.rs deleted file mode 100644 index eaec38c..0000000 --- a/src/scale/algorithms.rs +++ /dev/null @@ -1,113 +0,0 @@ -use super::{traits::*, *}; -use std::num::NonZeroU32; - -/// [Nearest Neighbor](https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation) image scaling algorithm. -pub struct Nearest; - -impl ScalingAlgorithm for Nearest { - /// Can be used on non opaque too! (Nearest is special like that). - fn scale_opaque<const N: usize>( - i: Image<&[u8], N>, - w: NonZeroU32, - h: NonZeroU32, - ) -> Image<std::boxed::Box<[u8]>, N> - where - ChannelCount<N>: ToImageView<N>, - { - let mut dst = fr::Image::new(w, h); - // SAFETY: swear, the pixel types are the same - unsafe { - fr::Resizer::new(fr::ResizeAlg::Nearest) - .resize(&ChannelCount::<N>::wrap(i), &mut dst.view_mut()) - }; - - // SAFETY: ctor - unsafe { Image::new(dst.width(), dst.height(), dst.into_vec().into()) } - } - - #[inline] - fn scale_transparent<const N: usize>( - i: Image<&mut [u8], N>, - w: NonZeroU32, - h: NonZeroU32, - ) -> Image<std::boxed::Box<[u8]>, N> - where - ChannelCount<N>: AlphaDiv<N>, - { - Self::scale_opaque(i.as_ref(), w, h) - } -} - -macro_rules! alg { - ($for:ident) => { - impl ScalingAlgorithm for $for { - fn scale_opaque<const N: usize>( - i: Image<&[u8], N>, - w: NonZeroU32, - h: NonZeroU32, - ) -> Image<std::boxed::Box<[u8]>, N> - where - ChannelCount<N>: ToImageView<N>, - { - let mut dst = fr::Image::new(w, h); - // SAFETY: swear, the pixel types are the same - unsafe { - fr::Resizer::new(fr::ResizeAlg::Convolution(fr::FilterType::$for)) - .resize(&ChannelCount::<N>::wrap(i), &mut dst.view_mut()) - }; - - // SAFETY: ctor - unsafe { Image::new(dst.width(), dst.height(), dst.into_vec().into()) } - } - - fn scale_transparent<const N: usize>( - i: Image<&mut [u8], N>, - w: NonZeroU32, - h: NonZeroU32, - ) -> Image<std::boxed::Box<[u8]>, N> - where - ChannelCount<N>: AlphaDiv<N>, - { - let mut dst = fr::Image::new(w, h); - // SAFETY: yes - unsafe { - fr::Resizer::new(fr::ResizeAlg::Convolution(fr::FilterType::$for)) - .resize(&ChannelCount::<N>::handle(i).view(), &mut dst.view_mut()) - } - - ChannelCount::<N>::unhandle(&mut dst); - - // SAFETY: ctor - unsafe { Image::new(dst.width(), dst.height(), dst.into_vec().into()) } - } - } - }; -} - -/// [Lanczos](https://en.wikipedia.org/wiki/Lanczos_resampling) scaling with a filter size (*a*) of 3. -pub struct Lanczos3 {} -alg!(Lanczos3); - -/// [Catmull-Rom](https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline) bicubic filtering. -pub struct CatmullRom {} -alg!(CatmullRom); - -/// Linear interpolation. -pub struct Bilinear {} -alg!(Bilinear); - -/// The opposite of [`Nearest`]. -pub struct Box {} -alg!(Box); - -/// Hamming filtering has the same performance as a [`Bilinear`] filter, while -/// providing image (downscaling) quality comparable to bicubic filters like -/// [`CatmullRom`] or [`Mitchell`]. Creates a sharper image than [`Bilinear`] filtering, -/// and doesn't have dislocations on local level like [`Box`] suffers from. -/// Not recommended for upscaling. -pub struct Hamming {} -alg!(Hamming); - -/// [Mitchell–Netravali](https://en.wikipedia.org/wiki/Mitchell%E2%80%93Netravali_filters) bicubic filtering. -pub struct Mitchell {} -alg!(Mitchell); diff --git a/src/scale/mod.rs b/src/scale/mod.rs deleted file mode 100644 index c83aae4..0000000 --- a/src/scale/mod.rs +++ /dev/null @@ -1,79 +0,0 @@ -//! holds scaling operations. -//! -//! choose from the wide expanse of options (ordered fastest to slowest): -//! -//! - [`Nearest`]: quickest, dumbest, jaggedest, scaling algorithm -//! - [`Box`]: you want slightly less pixels than nearest? here you go! kinda blurry though. -//! - [`Bilinear`]: _smooth_ scaling algorithm. rather fuzzy. -//! - [`Hamming`]: solves the [`Box`] problems. clearer image. -//! - [`CatmullRom`]: about the same as [`Hamming`], just a little slower. -//! - [`Mitchell`]: honestly, cant see the difference from [`CatmullRom`]. -//! - [`Lanczos3`]: prettiest scaling algorithm. highly recommend. -//! -//! usage: -//! ``` -//! # use fimg::{Image, scale::Lanczos3}; -//! let i = Image::<_, 3>::open("tdata/small_cat.png"); -//! let scaled = i.scale::<Lanczos3>(2144, 1424); -//! ``` -use crate::Image; - -mod algorithms; -pub mod traits; -pub use algorithms::*; - -macro_rules! transparent { - ($n: literal, $name: ident) => { - impl<T: AsMut<[u8]> + AsRef<[u8]>> Image<T, $n> { - /// Scale a - #[doc = stringify!($name)] - /// image with a given scaling algorithm. - pub fn scale<A: traits::ScalingAlgorithm>( - &mut self, - width: u32, - height: u32, - ) -> Image<std::boxed::Box<[u8]>, $n> { - A::scale_transparent( - self.as_mut(), - width.try_into().unwrap(), - height.try_into().unwrap(), - ) - } - } - }; -} - -macro_rules! opaque { - ($n: literal, $name: ident) => { - impl<T: AsRef<[u8]>> Image<T, $n> { - /// Scale a - #[doc = stringify!($name)] - /// image with a given scaling algorithm. - pub fn scale<A: traits::ScalingAlgorithm>( - &self, - width: u32, - height: u32, - ) -> Image<std::boxed::Box<[u8]>, $n> { - A::scale_opaque( - self.as_ref(), - width.try_into().unwrap(), - height.try_into().unwrap(), - ) - } - } - }; -} - -opaque!(1, Y); -transparent!(2, YA); -opaque!(3, RGB); -transparent!(4, RGBA); - -#[test] -fn test_nearest() { - let i = Image::<_, 3>::open("tdata/cat.png"); - assert_eq!( - &*i.scale::<Nearest>(268, 178).buffer, - &*Image::<_, 3>::open("tdata/small_cat.png").buffer - ); -} diff --git a/src/scale/traits.rs b/src/scale/traits.rs deleted file mode 100644 index 647f3bd..0000000 --- a/src/scale/traits.rs +++ /dev/null @@ -1,98 +0,0 @@ -//! implementation detail for scaling. look into if you want to add a algorithm -use std::num::NonZeroU32; - -#[doc(hidden)] -mod seal { - #[doc(hidden)] - pub trait Sealed {} -} - -use seal::Sealed; - -use crate::Image; -impl Sealed for ChannelCount<1> {} -impl Sealed for ChannelCount<2> {} -impl Sealed for ChannelCount<3> {} -impl Sealed for ChannelCount<4> {} - -/// How to scale a image -pub trait ScalingAlgorithm { - /// Y/Rgb scale - fn scale_opaque<const N: usize>( - i: Image<&[u8], N>, - w: NonZeroU32, - h: NonZeroU32, - ) -> Image<Box<[u8]>, N> - where - ChannelCount<N>: ToImageView<N>; - /// Ya/Rgba scale - fn scale_transparent<const N: usize>( - i: Image<&mut [u8], N>, - w: NonZeroU32, - h: NonZeroU32, - ) -> Image<Box<[u8]>, N> - where - ChannelCount<N>: AlphaDiv<N>; -} - -/// helper -pub trait ToImageView<const N: usize>: Sealed { - #[doc(hidden)] - type P: fr::PixelExt + fr::Convolution; - #[doc(hidden)] - fn wrap(i: Image<&[u8], N>) -> fr::ImageView<'_, Self::P>; -} - -/// helper -pub trait AlphaDiv<const N: usize>: Sealed + ToImageView<N> { - #[doc(hidden)] - type P: fr::PixelExt + fr::Convolution + fr::AlphaMulDiv; - #[doc(hidden)] - fn handle(i: Image<&mut [u8], N>) -> fr::Image<'_, <Self as AlphaDiv<N>>::P>; - #[doc(hidden)] - fn unhandle(i: &mut fr::Image<<Self as AlphaDiv<N>>::P>); -} - -/// Generic helper for [`Image`] and [`fr::Image`] transfers. -pub struct ChannelCount<const N: usize> {} - -macro_rules! tiv { - ($n:literal, $which:ident) => { - impl ToImageView<$n> for ChannelCount<$n> { - type P = fr::$which; - fn wrap(i: Image<&[u8], $n>) -> fr::ImageView<'_, Self::P> { - // SAFETY: same conds - unsafe { fr::ImageView::new(i.width, i.height, i.buffer()) } - } - } - }; -} - -tiv!(1, U8); -tiv!(2, U8x2); -tiv!(3, U8x3); -tiv!(4, U8x4); - -macro_rules! adiv { - ($n:literal, $which:ident) => { - impl AlphaDiv<$n> for ChannelCount<$n> { - type P = fr::$which; - fn handle(i: Image<&mut [u8], $n>) -> fr::Image<'_, <Self as AlphaDiv<$n>>::P> { - // SAFETY: we kinda have the same conditions - let mut i = unsafe { fr::Image::from_slice_u8(i.width, i.height, i.take_buffer()) }; - // SAFETY: mhm - unsafe { fr::MulDiv::default().multiply_alpha_inplace(&mut i.view_mut()) }; - - i - } - - fn unhandle(i: &mut fr::Image<<Self as AlphaDiv<$n>>::P>) { - // SAFETY: mhm - unsafe { fr::MulDiv::default().divide_alpha_inplace(&mut i.view_mut()) } - } - } - }; -} - -adiv!(2, U8x2); -adiv!(4, U8x4); diff --git a/src/show.rs b/src/show.rs deleted file mode 100644 index dc1ee4f..0000000 --- a/src/show.rs +++ /dev/null @@ -1,165 +0,0 @@ -use crate::Image; - -#[cfg(feature = "real-show")] -mod real { - use crate::Image; - use minifb::{Key, Window}; - - pub fn show<const CHANNELS: usize>(i: Image<&[u8], CHANNELS>) - where - [u8; CHANNELS]: crate::Pack, - { - let mut win = Window::new( - "show", - i.width() as usize, - i.height() as usize, - Default::default(), - ) - .unwrap(); - win.set_title("image viewer"); - let font = fontdue::Font::from_bytes( - &include_bytes!("../data/CascadiaCode.ttf")[..], - fontdue::FontSettings { - scale: 12.0, - ..Default::default() - }, - ) - .unwrap(); - while win.is_open() && !win.is_key_down(Key::Q) && !win.is_key_down(Key::Escape) { - let mut buf = Image::<Box<[u32]>, 1>::from(i.as_ref()); - - if !win.is_key_down(Key::H) - && let Some((x, y)) = win - .get_mouse_pos(minifb::MouseMode::Discard) - .map(|(x, y)| (x.round() as u32, y.round() as u32)) - .map(|(x, y)| (x.min(i.width()), y.min(i.height()))) - { - // SAFETY: ctor - let pix = unsafe { i.pixel(x, y) }; - unsafe { Image::new(buf.width, buf.height, &mut *buf.buffer) }.text( - 5, - i.height() - 20, - 12.0, - &font, - &format!( - "P ({x}, {y}), {}", - // SAFETY: clampd - match &pix[..] { - [y] => format!("(Y {y})"), - [y, a] => format!("(Y {y} A {a})"), - [r, g, b] => format!("(R {r} G {g} B {b})"), - [r, g, b, a] => format!("(R {r} G {g} B {b} A {a})"), - _ => unreachable!(), - } - ), - [238, 232, 213, 255], - ) - } - win.update_with_buffer(&buf.buffer, i.width() as usize, i.height() as usize) - .expect("window update fail"); - } - } -} - -#[cfg(not(feature = "real-show"))] -mod fake { - use std::process::{Command, Stdio}; - - macro_rules! c { - ($p:literal) => { - std::process::Command::new($p) - }; - ($p:literal $($args:expr)+) => { - std::process::Command::new($p).args([$($args,)+]) - } - } - pub(crate) use c; - - pub fn has(c: &'static str) -> bool { - complete(c!("which").arg(c)) - } - - pub fn complete(c: &mut Command) -> bool { - c.stdout(Stdio::null()) - .stderr(Stdio::null()) - .status() - .expect("ok") - .success() - } - - macro_rules! show { - ($me:expr) => { - let file = std::env::temp_dir().join("viewing.png"); - $me.save(&file); - #[cfg(target_family = "windows")] - assert!(fake::complete(fake::c!("start" "%Temp%/viewing.png")), "command should complete successfully."); - #[cfg(target_family = "unix")] - assert!( - if fake::has("feh") { fake::complete(fake::c!("feh" file)) - } else if fake::has("xdg-open") { fake::complete(fake::c!("xdg-open" file)) - } else if fake::has("gio") { fake::complete(fake::c!("gio" file)) - } else if fake::has("gnome-open") { fake::complete(fake::c!("gnome-open" file)) - } else if fake::has("kde-open") { fake::complete(fake::c!("kde-open" file)) - } else if fake::has("open") { fake::complete(fake::c!("open" file)) - } else { panic!("no image viewer found, please enable the `real-show` feature.") }, - "command should complete successfully."); - }; - - } - pub(crate) use show; -} - -fn r(i: &Image<Box<[u32]>, 1>) -> Image<&[u32], 1> { - // SAFETY: ctor - unsafe { Image::new(i.width, i.height, &*i.buffer) } -} - -macro_rules! show { - ($buf:ty) => { - show!($buf, 1); - show!($buf, 2); - show!($buf, 3); - show!($buf, 4); - }; - ($buf:ty, $n:literal) => { - impl Image<$buf, $n> { - /// Open a window showing this image. - /// Blocks until the window finishes. - /// - /// This is like [`dbg!`] for images. - /// - /// # Panics - /// - /// if the window is un creatable - pub fn show(self) -> Self { - #[cfg(feature = "real-show")] - real::show(self.as_ref()); - #[cfg(not(feature = "real-show"))] - fake::show!(self); - self - } - } - }; -} - -show!(Vec<u8>); -show!(Box<[u8]>); -show!(&[u8]); - -impl Image<Box<[u32]>, 1> { - /// Open a window showing this image. - /// Blocks until the window finishes. - /// - /// This is like [`dbg!`] for images. - /// - /// # Panics - /// - /// if the window is un creatable - pub fn show(self) -> Self { - #[cfg(feature = "real-show")] - real::show(Image::<Box<[u8]>, 4>::from(r(&self)).as_ref()); - #[cfg(not(feature = "real-show"))] - fake::show!(Image::<Box<[u8]>, 4>::from(r(&self))); - self - } -} diff --git a/src/slicing.rs b/src/slicing.rs deleted file mode 100644 index 86924d3..0000000 --- a/src/slicing.rs +++ /dev/null @@ -1,51 +0,0 @@ -use std::ops::{Range, RangeBounds, RangeInclusive}; - -use crate::Image; - -impl<const CHANNELS: usize, T> Image<T, CHANNELS> { - /// ``` - /// let i = fimg::Image::<_, 1>::alloc(5, 5); - /// dbg!(i.bounds((0, 0)..(6, 0))); - /// panic!(); - /// ``` - pub fn bounds<U>(&self, r: impl PBounds) -> std::ops::Range<usize> - where - T: AsRef<[U]>, - { - let r = r.bound(); - let start = match r.start_bound() { - std::ops::Bound::Included(&(x, y)) => self.at(x, y), - std::ops::Bound::Excluded(&(x, y)) => self.at(x, y) + CHANNELS, - std::ops::Bound::Unbounded => 0, - }; - let end = match r.end_bound() { - std::ops::Bound::Included(&(x, y)) => self.at(x, y) + CHANNELS, - std::ops::Bound::Excluded(&(x, y)) => self.at(x, y), - std::ops::Bound::Unbounded => self.buffer.as_ref().len(), - }; - start..end - } -} -pub trait PBounds { - fn bound(self) -> impl RangeBounds<(u32, u32)>; -} -impl PBounds for Range<(u32, u32)> { - fn bound(self) -> impl RangeBounds<(u32, u32)> { - self - } -} -impl PBounds for RangeInclusive<(u32, u32)> { - fn bound(self) -> impl RangeBounds<(u32, u32)> { - self - } -} -impl PBounds for (Range<u32>, u32) { - fn bound(self) -> impl RangeBounds<(u32, u32)> { - (self.0.start, self.1)..(self.0.end, self.1) - } -} -impl PBounds for (u32, Range<u32>) { - fn bound(self) -> impl RangeBounds<(u32, u32)> { - (self.0, self.1.start)..(self.0, self.1.end) - } -} diff --git a/src/span.rs b/src/span.rs deleted file mode 100644 index 69a01ad..0000000 --- a/src/span.rs +++ /dev/null @@ -1,42 +0,0 @@ -use crate::At; -use std::ops::Range; - -mod sealer { - #[doc(hidden)] - pub trait Sealed {} -} -use sealer::Sealed; - -/// Trait for that which can be used to index a image. -pub trait Span: Sealed { - #[doc(hidden)] - fn range<const C: usize>(self, i: (u32, u32)) -> Range<usize>; -} - -impl Sealed for Range<usize> {} -impl Span for Range<usize> { - #[inline(always)] - fn range<const C: usize>(self, _: (u32, u32)) -> Range<usize> { - self - } -} - -impl Sealed for Range<(u32, u32)> {} -impl Span for Range<(u32, u32)> { - #[inline(always)] - fn range<const C: usize>(self, i: (u32, u32)) -> Range<usize> { - let Self { - start: (sx, sy), - end: (ex, ey), - } = self; - i.at::<C>(sx, sy)..i.at::<C>(ex, ey) - } -} - -impl Sealed for (u32, u32) {} -impl Span for (u32, u32) { - #[inline(always)] - fn range<const C: usize>(self, i: (u32, u32)) -> Range<usize> { - i.at::<C>(self.0, self.1)..i.at::<C>(self.0, self.1) + C - } -} diff --git a/src/sub.rs b/src/sub.rs deleted file mode 100644 index 531bfe7..0000000 --- a/src/sub.rs +++ /dev/null @@ -1,181 +0,0 @@ -use std::{marker::PhantomData, num::NonZeroU32}; - -use crate::Image; - -/// A smaller part of a larger image. -/// -/// ```text -/// ┏━━━━━━━━━━━━━━┓ hard borders represent the full image -/// ┃ 1 2 3 1 ┃ vvvv the top left of the new image -/// ┃ ┌──────┐ ┃ crop(2, 2).from(1, 1) -/// ┃ 4 │ 5 6 │ 2 ┃ ^^^^ width and height -/// ┃ │ │ ┃ -/// ┃ 7 │ 8 9 │ 3 ┃ -/// ┗━━━┷━━━━━━┷━━━┛ soft borders represent the new image -/// ``` -#[derive(Clone)] -pub struct SubImage<T, const CHANNELS: usize> { - inner: Image<T, CHANNELS>, - /// in pixels - offset_x: u32, - real_width: NonZeroU32, - real_height: NonZeroU32, -} - -/// Trait for cropping a image. -pub trait Cropper<T, const C: usize> { - /// # Panics - /// - /// if w - y == 0 - fn from(self, x: u32, y: u32) -> SubImage<T, C>; -} - -impl<T: Clone, const N: usize> Copy for SubImage<T, N> where Image<T, N>: Copy {} - -macro_rules! def { - ($t:ty, $($what:ident)?) => { - struct Crop<'a, T, const C: usize> { - dimensions: (NonZeroU32, NonZeroU32), - _d: PhantomData<SubImage<$t, C>>, - image: Image<$t, C>, - } - - impl<'a, T, const C: usize> Cropper<$t, C> for Crop<'a, T, C> { - fn from(self, x: u32, y: u32) -> SubImage<$t, C> { - let w = self.image.width(); - // SAFETY: ctor - let i = unsafe { - Image::new( - self.image.width, - NonZeroU32::new(self.image.height() - y).unwrap(), - &$($what)?(self.image.take_buffer()[(y as usize * C) * w as usize..]), - ) - }; - SubImage { - offset_x: x, - inner: i, - real_width: self.dimensions.0, - real_height: self.dimensions.1, - } - } - } - }; -} - -impl<T, const C: usize> Image<T, C> { - /// Crop a image. - /// - /// The signature looks something like: `i.crop(width, height).from(top_left_x, top_left_y)`, which gives you a <code>[SubImage]<&\[T\], _></code> - /// - /// If you want a owned image, `i.crop(w, h).from(x, y).own()` gets you a <code>[`Image`]<[Box]<\[T\], _>></code> back. - /// - /// ``` - /// # use fimg::{Image, Cropper}; - /// let mut i = Image::<_, 1>::build(4, 3).buf([ - /// 1, 2, 3, 1, - /// 4, 5, 6, 2, - /// 7, 8, 9, 3, - /// ]); - /// let c = i.crop(2, 2).from(1, 1); - /// # unsafe { - /// assert_eq!(c.pixel(0, 0), [5]); - /// assert_eq!(c.pixel(1, 1), [9]); - /// assert_eq!( - /// c.own().bytes(), - /// &[5, 6, - /// 8, 9] - /// ); - /// # } - /// ``` - /// - /// # Panics - /// - /// if width == 0 || height == 0 - pub fn crop<'a, U: 'a>(&'a self, width: u32, height: u32) -> impl Cropper<&'a [U], C> - where - T: AsRef<[U]>, - { - def!(&'a [T],); - Crop { - dimensions: ( - NonZeroU32::new(width).expect("Image::crop panics when width == 0"), - NonZeroU32::new(height).expect("Image::crop panics when height == 0"), - ), - _d: PhantomData, - image: self.as_ref(), - } - } - - /// Like [`Image::crop`], but returns a mutable [`SubImage`]. - pub fn crop_mut<'a, U: 'a>( - &'a mut self, - width: u32, - height: u32, - ) -> impl Cropper<&'a mut [U], C> - where - T: AsMut<[U]> + AsRef<[U]>, - { - def!(&'a mut [T], mut); - Crop { - dimensions: ( - NonZeroU32::new(width).expect("Image::crop panics when width == 0"), - NonZeroU32::new(height).expect("Image::crop panics when height == 0"), - ), - _d: PhantomData, - image: self.as_mut(), - } - } -} - -impl<T: Clone, const C: usize> SubImage<&[T], C> { - /// Clones this [`SubImage`] into its own [`Image`] - pub fn own(&self) -> Image<Box<[T]>, C> { - let mut out = Vec::with_capacity( - self.real_width.get() as usize * self.real_height.get() as usize * C, - ); - - for row in self.inner.rows().take(self.real_height.get() as usize) { - out.extend_from_slice( - &row[self.offset_x as usize - ..self.offset_x as usize + self.real_width.get() as usize] - .as_flattened(), - ); - } - // SAFETY: ctor - unsafe { Image::new(self.real_width, self.real_height, out.into()) } - } -} - -// TODO crop() -impl<W, const C: usize> SubImage<W, C> { - /// Get a pixel. - /// - /// # Safety - /// - /// this pixel must be in bounds. - pub unsafe fn pixel<U: Copy>(&self, x: u32, y: u32) -> &[U; C] - where - W: AsRef<[U]>, - { - // note: if you get a pixel, in release mode, that is in bounds of the outer image, but not the sub image, that would be library-ub. - debug_assert!(x < self.real_width.get()); - debug_assert!(y < self.real_height.get()); - // SAFETY: caller - unsafe { self.inner.pixel(x + self.offset_x, y) } - } - - /// Get a pixel, mutably. - /// - /// # Safety - /// - /// this pixel must be in bounds. - pub unsafe fn pixel_mut<U: Copy>(&mut self, x: u32, y: u32) -> &mut [U] - where - W: AsMut<[U]> + AsRef<[U]>, - { - debug_assert!(x < self.real_width.get()); - debug_assert!(y < self.real_height.get()); - // SAFETY: caller - unsafe { self.inner.pixel_mut(x, y) } - } -} diff --git a/src/term.rs b/src/term.rs deleted file mode 100644 index aeae9fb..0000000 --- a/src/term.rs +++ /dev/null @@ -1,199 +0,0 @@ -//! terminal outputs -//! produces output for any terminal supporting one of the -//! ```text -//! Kitty Graphics Protocol -//! Iterm2 Inline Image Protocol -//! Sixel Bitmap Graphics Format -//! ``` -//! with a fallback for dumb terminals. -//! -//! the (second?) best way to debug your images. -mod bloc; -mod kitty; -mod sixel; -mod size; -use crate::Image; -pub use bloc::Bloc; -pub use iterm2::Iterm2; -pub use kitty::Kitty; -pub use sixel::Sixel; -use std::fmt::{Result, Write}; - -mod seal { - pub trait Sealed {} -} -use seal::Sealed; -#[doc(hidden)] -pub trait Basic: Sealed {} -impl Sealed for [(); 1] {} -impl Basic for [(); 1] {} -impl Sealed for [(); 2] {} -impl Basic for [(); 2] {} -impl Sealed for [(); 3] {} -impl Basic for [(); 3] {} -impl Sealed for [(); 4] {} -impl Basic for [(); 4] {} - -mod b64; -mod iterm2; - -impl<'a, const N: usize> std::fmt::Display for Image<&'a [u8], N> -where - [(); N]: Basic, -{ - /// Display an image in the terminal. - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result { - Display(*self).write(f) - } -} - -/// Print an image in the terminal. -/// -/// This is a wrapper for `print!("{}", term::Display(image))` -pub fn print<T: AsRef<[u8]>, const N: usize>(i: Image<T, N>) -where - [(); N]: Basic, - Display<Image<T, N>>: std::fmt::Display, -{ - print!("{}", Display(i)) -} - -#[derive(Copy, Clone)] -/// Display an image in the terminal. -/// This type implements [`Display`](std::fmt::Display) and [`Debug`](std::fmt::Debug). -pub struct Display<T>(pub T); - -impl<T> std::ops::Deref for Display<T> { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl<T: AsRef<[u8]>, const N: usize> std::fmt::Debug for Display<Image<T, N>> -where - [(); N]: Basic, -{ - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result { - Display(self.as_ref()).write(f) - } -} - -impl<const N: usize> Display<Image<&[u8], N>> -where - [(); N]: Basic, -{ - /// Write $TERM protocol encoded image data. - pub fn write(self, f: &mut impl Write) -> Result { - if let Ok(term) = std::env::var("TERM") { - match &*term { - "mlterm" | "yaft-256color" => return Sixel(self.0).write(f), - x if x.contains("kitty") => return Kitty(self.0).write(f), - _ => (), - } - } - if let Ok(term_program) = std::env::var("TERM_PROGRAM") { - match &*term_program { - "MacTerm" => return Sixel(self.0).write(f), - "iTerm" | "WezTerm" => return Iterm2(self.0).write(f), - _ => (), - } - } - if let Ok("iTerm") = std::env::var("LC_TERMINAL").as_deref() { - return Iterm2(self.0).write(f); - } - #[cfg(unix)] - return self - .guess_harder(f) - .unwrap_or_else(|| Bloc(self.0).write(f)); - #[cfg(not(unix))] - return Bloc(*self).write(f); - } - - #[cfg(unix)] - // https://github.com/benjajaja/ratatui-image/blob/eeb2a1b26fbe360259f213d6d5eb5449c8ae1d6e/src/picker.rs#L226 - fn guess_harder(&self, to: &mut impl Write) -> Option<Result> { - // contains a kitty gfx and sixel query, the `\x1b[c` is for sixels - let buf = query(r"_Gi=31,s=1,v=1,a=q,t=d,f=24;AAAA\[c")?; - if buf.contains("_Gi=31;OK") { - Some(Kitty(self.as_ref()).write(to)) - } else if buf.contains(";4;") - || buf.contains("?4;") - || buf.contains(";4c") - || buf.contains("?4c") - { - Some(Sixel(self.as_ref()).write(to)) - } else { - None - } - } -} -#[cfg(not(unix))] -fn query(device_query_code: &'static str) -> Option<String> { - None -} -#[cfg(unix)] -// https://github.com/benjajaja/ratatui-image/blob/master/src/picker.rs#L226 -fn query(device_query_code: &'static str) -> Option<String> { - extern crate libc; - use std::mem::MaybeUninit; - fn r(result: i32) -> Option<()> { - (result != -1).then_some(()) - } - - let mut termios = MaybeUninit::<libc::termios>::uninit(); - // SAFETY: get termios of stdin - r(unsafe { libc::tcgetattr(0, termios.as_mut_ptr()) })?; - // SAFETY: gotten - let termios = unsafe { termios.assume_init() }; - - // SAFETY: turn off echo and canonical (requires enter before stdin reads) modes - unsafe { - libc::tcsetattr( - 0, - libc::TCSADRAIN, - &libc::termios { - c_lflag: termios.c_lflag & !libc::ICANON & !libc::ECHO, - ..termios - }, - ) - }; - - let buf = try { - // SAFETY: linux time out'd reading - unsafe { - println!("{device_query_code}"); - let mut buf = Vec::new(); - let mut tmp = [0; 1 << 5]; - loop { - let mut x: libc::fd_set = std::mem::zeroed::<libc::fd_set>(); - libc::FD_SET(0, &mut x); - match libc::select( - 1, - &mut x, - 0 as _, - 0 as _, - &mut libc::timeval { - tv_sec: 0, - tv_usec: 5e5 as _, - }, - ) { - 0 => break, - -1 => return None, - _ => {} - } - match libc::read(libc::STDIN_FILENO, tmp.as_mut_ptr().cast(), tmp.len()) { - 0 => continue, - -1 => return None, - n => buf.extend_from_slice(&tmp[..n as _]), - } - } - String::from_utf8(buf).ok()? - } - }; - - // SAFETY: reset attrs to what they were before we became nosy - unsafe { libc::tcsetattr(0, libc::TCSADRAIN, &termios) }; - buf -} diff --git a/src/term/b64.rs b/src/term/b64.rs deleted file mode 100644 index b91cdfd..0000000 --- a/src/term/b64.rs +++ /dev/null @@ -1,187 +0,0 @@ -#![allow(clippy::undocumented_unsafe_blocks)] -use core::intrinsics::simd::simd_cast; -#[cfg(all(target_feature = "avx2", not(miri)))] -use std::arch::x86_64::*; -use std::{ - intrinsics::transmute_unchecked, - simd::{MaskElement, SimdElement, prelude::*}, -}; - -#[test] -fn b64() { - fn t(i: &'static str, o: &'static str) { - let mut x = Vec::with_capacity(size(i.as_bytes())); - unsafe { portable(i.as_bytes(), x.as_mut_ptr()) }; - unsafe { x.set_len(size(i.as_bytes())) }; - assert_eq!(x, o.as_bytes()); - } - - t("Hello World!", "SGVsbG8gV29ybGQh"); - t("Hello World", "SGVsbG8gV29ybGQ="); -} - -pub fn encode(i: &[u8]) -> String { - let mut x = Vec::with_capacity(size(i)); - unsafe { portable(i, x.as_mut_ptr()) }; - unsafe { x.set_len(size(i)) }; - unsafe { String::from_utf8_unchecked(x) } -} - -trait Cast<T, const N: usize> { - fn cas<U: SimdT>(self) -> U; -} -trait SimdT {} -impl<T: SimdElement, const N: usize> SimdT for Simd<T, N> {} -impl<T: MaskElement, const N: usize> SimdT for Mask<T, N> {} -impl<T: SimdElement, const N: usize> Cast<T, N> for Simd<T, N> { - fn cas<U>(self) -> U { - assert!(std::mem::size_of::<U>() == std::mem::size_of::<Self>()); - unsafe { transmute_unchecked(self) } - } -} - -impl<T: MaskElement, const N: usize> Cast<T, N> for Mask<T, N> { - fn cas<U>(self) -> U { - assert!(std::mem::size_of::<U>() == std::mem::size_of::<Self>()); - unsafe { transmute_unchecked(self) } - } -} - -#[allow(non_camel_case_types)] -type c = u8x32; -unsafe fn portable(mut input: &[u8], mut output: *mut u8) { - while input.len() >= 32 { - #[allow(unsafe_op_in_unsafe_fn)] - #[cfg(all(target_feature = "avx2", not(miri)))] - let indices = { - let lo = _mm_loadu_si128(input.as_ptr() as *const __m128i); - let hi = _mm_loadu_si128(input.as_ptr().add(12) as *const __m128i); - let i = _mm256_shuffle_epi8( - _mm256_set_m128i(hi, lo), - _mm256_set_epi8( - 10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1, // - 10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1, // - ), - ); - let t0 = _mm256_and_si256(i, _mm256_set1_epi32(0x0fc0fc00)); - let t1 = _mm256_mulhi_epu16(t0, _mm256_set1_epi32(0x04000040)); - let t2 = _mm256_and_si256(i, _mm256_set1_epi32(0x003f03f0)); - let t3 = _mm256_mullo_epi16(t2, _mm256_set1_epi32(0x01000010)); - - c::from(_mm256_or_si256(t1, t3)) - }; - #[cfg(not(all(target_feature = "avx2", not(miri))))] - let indices = { - let v = c::from_slice(input); - let i = simd_swizzle!( - v, - [ - 1, 0, 2, 1, 4, 3, 5, 4, 7, 6, 8, 7, 10, 9, 11, 10, 13, 12, // - 14, 13, 16, 15, 17, 16, 19, 18, 20, 19, 22, 21, 23, 22 - ] - ); - - // https://github.com/WojciechMula/base64simd - let t0 = i & u32x8::splat(0x0fc0fc00).cas::<c>(); - let t1 = Cast::cas::<c>(mulhi(t0.cas(), u32x8::splat(0x04000040).cas())); - let t2 = i & u32x8::splat(0x003f03f0).cas::<c>(); - let t3 = mullo(t2.cas(), u32x8::splat(0x01000010).cas()).cas::<c>(); - t1 | t3 - }; - lookup(indices).copy_to_slice(unsafe { std::slice::from_raw_parts_mut(output, 32) }); - output = unsafe { output.add(32) }; - - input = &input[24..]; - } - unsafe { encode_simple(input, output) }; -} -#[allow(dead_code)] -fn mulhi(x: u16x16, y: u16x16) -> u16x16 { - unsafe { - simd_cast::<_, u16x16>( - simd_cast::<_, u32x16>(x) * simd_cast::<_, u32x16>(y) >> u32x16::splat(16), - ) - } -} - -#[allow(dead_code)] -fn mullo(x: u16x16, y: u16x16) -> u16x16 { - x * y -} - -fn lookup(x: c) -> c { - let result = x.saturating_sub(c::splat(51)); - let less = cmpgt(c::splat(26), x); - let result = result | (less & c::splat(13)); - - #[rustfmt::skip] - const LUT: i8x32 = i8x32::from_array([ - b'a' as i8 - 26, b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, - b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, b'+' as i8 - 62, - b'/' as i8 - 63, b'A' as i8, 0, 0, - - b'a' as i8 - 26, b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, - b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, b'0' as i8 - 52, b'+' as i8 - 62, - b'/' as i8 - 63, b'A' as i8, 0, 0 - ]); - #[cfg(all(target_feature = "avx2", not(miri)))] - let result = unsafe { i8x32::from(_mm256_shuffle_epi8(LUT.into(), result.into())) }; - #[cfg(not(all(target_feature = "avx2", not(miri))))] - let result = (LUT.cas::<c>().swizzle_dyn(result)).cas::<i8x32>(); - - Cast::cas(result + x.cas::<i8x32>()) -} - -pub fn cmpgt(x: c, y: c) -> c { - x.cas::<i8x32>().simd_gt(y.cas::<i8x32>()).cas() -} - -trait P { - unsafe fn p<const N: usize>(&mut self, data: [u8; N]); -} - -impl P for *mut u8 { - unsafe fn p<const N: usize>(&mut self, data: [u8; N]) { - unsafe { self.copy_from(data.as_ptr(), N) }; - *self = unsafe { self.add(N) }; - } -} - -#[allow(unsafe_op_in_unsafe_fn)] -/// # Safety -/// ptr valid for [`size`]`(input)` writes. -pub unsafe fn encode_simple(mut input: &[u8], mut output: *mut u8) { - const Α: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - while let [a, b, c, rest @ ..] = input { - let α = ((*a as usize) << 16) | ((*b as usize) << 8) | *c as usize; - output.p([ - Α[α >> 18], - Α[(α >> 12) & 0x3F], - Α[(α >> 6) & 0x3F], - Α[α & 0x3F], - ]); - input = rest; - } - if !input.is_empty() { - let mut α = (input[0] as usize) << 16; - if input.len() > 1 { - α |= (input[1] as usize) << 8; - } - output.p([Α[α >> 18], Α[α >> 12 & 0x3F]]); - if input.len() > 1 { - output.p([Α[α >> 6 & 0x3f]]); - } else { - output.p([b'=']); - } - output.p([b'=']); - } -} - -pub const fn size(of: &[u8]) -> usize { - let use_pad = of.len() % 3 != 0; - if use_pad { - 4 * (of.len() / 3 + 1) - } else { - 4 * (of.len() / 3) - } -} diff --git a/src/term/bloc.rs b/src/term/bloc.rs deleted file mode 100644 index 58c8655..0000000 --- a/src/term/bloc.rs +++ /dev/null @@ -1,115 +0,0 @@ -use super::Basic; -use crate::{pixels::convert::PFrom, scale, term::size::fit, Image}; -use core::intrinsics::transmute_unchecked as transmute; -use std::fmt::{Debug, Display, Formatter, Result, Write}; - -/// Colored `▀`s. The simple, stupid solution. -/// May be too big for your terminal. -pub struct Bloc<T: AsRef<[u8]>, const N: usize>(pub Image<T, N>); -impl<T: AsRef<[u8]>, const N: usize> std::ops::Deref for Bloc<T, N> { - type Target = Image<T, N>; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl<T: AsRef<[u8]>, const N: usize> Display for Bloc<T, N> -where - [(); N]: Basic, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> Result { - self.write(f) - } -} - -impl<T: AsRef<[u8]>, const N: usize> Debug for Bloc<T, N> -where - [(); N]: Basic, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> Result { - self.write(f) - } -} - -impl<T: AsRef<[u8]>, const N: usize> Bloc<T, N> -where - [(); N]: Basic, -{ - /// Write out halfblocks. - pub fn write(&self, to: &mut impl Write) -> Result { - macro_rules! c { - (fg $fg:expr, bg $bg:expr) => {{ - let [fr, fg, fb] = $fg; - let [br, bg, bb] = $bg; - write!(to, "\x1b[38;2;{fr};{fg};{fb};48;2;{br};{bg};{bb}m▀")?; - }}; - } - let buf; - let i = if !cfg!(test) { - let (w, h) = fit((self.width(), self.height())); - macro_rules! n { - ($n:literal) => { - self.as_ref() - .trans::<$n>() - .scale::<scale::Nearest>(w, h) - .trans::<N>() - }; - (o $n:literal) => { - self.as_ref() - .to_owned() - .trans::<1>() - .scale::<scale::Nearest>(w, h) - .trans::<N>() - }; - } - // SAFETY: #[allow(clippy::undocumented_unsafe_blocks)] - buf = unsafe { - match N { - 1 => n![1], - 2 => n![o 2], - 3 => n![3], - 4 => n![o 4], - _ => unreachable!(), - } - }; - buf.as_ref() - } else { - self.as_ref() - }; - - for [a, b] in i - .flatten() - .chunks_exact(i.width() as _) - .map(|x| { - #[allow(clippy::undocumented_unsafe_blocks)] - x.iter().copied().map(|x| unsafe { - match N { - 1 => <[u8; 3] as PFrom<1>>::pfrom(transmute(x)), - 2 => <[u8; 3] as PFrom<2>>::pfrom(transmute(x)), - 3 => <[u8; 3] as PFrom<3>>::pfrom(transmute(x)), - 4 => <[u8; 3] as PFrom<4>>::pfrom(transmute(x)), - _ => unreachable!(), - } - }) - }) - .array_chunks::<2>() - { - for (a, b) in a.zip(b) { - c! { fg a, bg b }; - } - writeln!(to)?; - } - write!(to, "\x1b[0m")?; - Ok(()) - } -} - -#[test] -fn test() { - let x = Image::<_, 3>::open("tdata/small_cat.png"); - use std::hash::Hasher; - let mut h = std::hash::DefaultHasher::new(); - h.write(Bloc(x).to_string().as_bytes()); - assert_eq!(h.finish(), 0x6546104ffee16f77); -} diff --git a/src/term/iterm2.rs b/src/term/iterm2.rs deleted file mode 100644 index d9831d9..0000000 --- a/src/term/iterm2.rs +++ /dev/null @@ -1,74 +0,0 @@ -use super::{b64, Basic}; -use crate::{Image, WritePng}; -use std::fmt::{Debug, Display, Formatter, Result, Write}; - -/// Outputs [Iterm2 Inline image protocol](https://iterm2.com/documentation-images.html) encoded data. -pub struct Iterm2<T: AsRef<[u8]>, const N: usize>(pub Image<T, N>); -impl<T: AsRef<[u8]>, const N: usize> std::ops::Deref for Iterm2<T, N> { - type Target = Image<T, N>; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl<T: AsRef<[u8]>, const N: usize> Display for Iterm2<T, N> -where - [(); N]: Basic, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> Result { - self.write(f) - } -} - -impl<T: AsRef<[u8]>, const N: usize> Debug for Iterm2<T, N> -where - [(); N]: Basic, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> Result { - self.write(f) - } -} - -impl<T: AsRef<[u8]>, const N: usize> Iterm2<T, N> -where - [(); N]: Basic, -{ - /// Write out kitty gfx data. - pub fn write(&self, to: &mut impl Write) -> Result { - let mut d = Vec::with_capacity(1024); - macro_rules! n { - ($n:literal) => { - WritePng::write( - // SAFETY: ... i renounce traits - &unsafe { self.as_ref().trans::<$n>() }, - &mut d, - ) - .unwrap() - }; - } - match N { - 1 => n![1], - 2 => n![2], - 3 => n![3], - 4 => n![4], - _ => unreachable!(), - } - let e = b64::encode(&d); - writeln!( - to, - "]1337;File=inline=1;preserveAspectRatio=1;size={}:{e}", - d.len(), - )?; - Ok(()) - } -} - -#[test] -fn test() { - let x = Image::<_, 3>::open("tdata/small_cat.png"); - use std::hash::Hasher; - let mut h = std::hash::DefaultHasher::new(); - h.write(Iterm2(x).to_string().as_bytes()); - assert_eq!(h.finish(), 0x32e81fb3cea8336f); -} diff --git a/src/term/kitty.rs b/src/term/kitty.rs deleted file mode 100644 index cb692b4..0000000 --- a/src/term/kitty.rs +++ /dev/null @@ -1,105 +0,0 @@ -use super::{b64, Basic}; -use crate::Image; -use std::borrow::Cow; -use std::fmt::{Debug, Display, Formatter, Result, Write}; - -/// Outputs [Kitty Graphics Protocol](https://sw.kovidgoyal.net/kitty/graphics-protocol) encoded data. -pub struct Kitty<T: AsRef<[u8]>, const N: usize>(pub Image<T, N>); - -impl<T: AsRef<[u8]>, const N: usize> std::ops::Deref for Kitty<T, N> { - type Target = Image<T, N>; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl<T: AsRef<[u8]>, const N: usize> Display for Kitty<T, N> -where - [(); N]: Basic, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> Result { - self.write(f) - } -} - -impl<T: AsRef<[u8]>, const N: usize> Debug for Kitty<T, N> -where - [(); N]: Basic, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> Result { - self.write(f) - } -} - -impl<T: AsRef<[u8]>, const N: usize> Kitty<T, N> { - /// Write out kitty gfx data. - pub fn write(&self, to: &mut impl Write) -> Result - where - [(); N]: Basic, - { - macro_rules! cast { - ($n:literal) => { - ( - Cow::Owned( - <Image<Box<[u8]>, 3>>::from({ - // SAFETY: ... - unsafe { self.as_ref().trans::<$n>() } - }) - .take_buffer() - .to_vec(), - ), - "24", - ) - }; - } - let (bytes, dtype) = { - match N { - 1 => cast!(1), - 2 => cast!(2), - 3 => (Cow::from(self.bytes()), "24"), - 4 => (Cow::from(self.bytes()), "32"), - _ => unreachable!(), - } - }; - let (w, h) = (self.width(), self.height()); - - let enc = b64::encode(&bytes); - let mut chunks = enc - .as_bytes() - .chunks(4096) - // SAFETY: b64 - .map(|x| unsafe { std::str::from_utf8_unchecked(x) }); - - let last = chunks.len(); - const H: &str = "_G"; - const MORE: &str = "m"; - - const DISPLAY: char = 'T'; - const ACTION: char = 'a'; - const DATATYPE: char = 'f'; - const TYPE: char = 't'; - const DIRECT: char = 'd'; - - const E: &str = r"\"; - - let payload = chunks.next().unwrap(); - let more = (last > 1) as u8; - write!(to, "{H}{DATATYPE}={dtype},{ACTION}={DISPLAY},{TYPE}={DIRECT},s={w},v={h},{MORE}={more};{payload}{E}")?; - - for (payload, i) in chunks.zip(2..) { - let more = (i != last) as u8; - write!(to, "{H}{MORE}={more};{payload}{E}")?; - } - Ok(()) - } -} - -#[test] -fn test() { - let x = Image::<_, 3>::open("tdata/cat.png"); - use std::hash::Hasher; - let mut h = std::hash::DefaultHasher::new(); - h.write(Kitty(x).to_string().as_bytes()); - assert_eq!(h.finish(), 0x1cc13114bcf3cc3); -} diff --git a/src/term/sixel.rs b/src/term/sixel.rs deleted file mode 100644 index 9b18074..0000000 --- a/src/term/sixel.rs +++ /dev/null @@ -1,167 +0,0 @@ -use core::intrinsics::transmute_unchecked as transmute; -use std::fmt::{Debug, Display, Formatter, Result, Write}; - -use crate::{Image, pixels::convert::PFrom}; - -use super::Basic; - -/// Outputs [sixel](https://en.wikipedia.org/wiki/Sixel) encoded data in its [`Display`] and [`Debug`] implementations, for easy visual debugging. -pub struct Sixel<T: AsRef<[u8]>, const N: usize>(pub Image<T, N>); - -impl<T: AsRef<[u8]>, const N: usize> std::ops::Deref for Sixel<T, N> { - type Target = Image<T, N>; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl<T: AsRef<[u8]>, const N: usize> Display for Sixel<T, N> -where - [(); N]: Basic, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> Result { - self.write(f) - } -} - -impl<T: AsRef<[u8]>, const N: usize> Debug for Sixel<T, N> -where - [(); N]: Basic, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> Result { - self.write(f) - } -} - -impl<T: AsRef<[u8]>, const N: usize> Sixel<T, N> { - /// Write out sixel data. - pub fn write(&self, to: &mut impl Write) -> Result - where - [(); N]: Basic, - { - #[cfg(unix)] - let q = { - extern crate libc; - // SAFETY: is stdout a tty - (unsafe { libc::isatty(1) } == 1) - }; - #[cfg(not(unix))] - let q = true; - let colors = q - .then(|| { - super::query("[?1;1;0S").and_then(|x| { - // [?1;0;65536S - if let [b'?', b'1', b';', b'0', b';', n @ ..] = x.as_bytes() { - Some( - n.iter() - .copied() - .take_while(u8::is_ascii_digit) - .fold(0u16, |acc, x| { - acc.saturating_mul(10).saturating_add((x - b'0') as u16) - }) - .max(64) - .min(0xfff), - ) - } else { - None - } - }) - }) - .flatten() - .unwrap_or(255); - to.write_str("Pq")?; - write!(to, r#""1;1;{};{}"#, self.width(), self.height())?; - let buf; - let rgba = if N == 4 { - // SAFETY: buffer cannot have half pixels (cant use flatten bcoz N) - unsafe { self.buffer().as_ref().as_chunks_unchecked() } - } else { - buf = self - .chunked() - .copied() - // SAFETY: #[allow(clippy::undocumented_unsafe_blocks)] - .map(|x| unsafe { - match N { - 1 => <[u8; 4] as PFrom<1>>::pfrom(transmute(x)), - 2 => <[u8; 4] as PFrom<2>>::pfrom(transmute(x)), - 3 => <[u8; 4] as PFrom<3>>::pfrom(transmute(x)), - _ => unreachable!(), - } - }) - .collect::<Vec<_>>(); - &*buf - }; - - let q = qwant::NeuQuant::new(15, colors as _, rgba); - - // TODO: don't colllect - let pixels: Vec<u16> = rgba.iter().map(|&pix| q.index_of(pix) as _).collect(); - - for ([r, g, b], i) in q - .color_map_rgb() - .map(|x| x.map(|x| (x as f32 * (100. / 255.)) as u32)) - .zip(0u64..) - { - write!(to, "#{i};2;{r};{g};{b}")?; - } - for sixel_row in pixels.chunks_exact(self.width() as usize * 6).map(|x| { - x.iter() - .zip(0u32..) - .map(|(&p, j)| (p, (j % self.width(), j / self.width()))) - .collect::<Vec<_>>() - }) { - // extracted - for samples in Grouped(&sixel_row, |r| r.0) { - write!(to, "#{}", samples[0].0)?; - let mut last = -1; - for (x, byte) in Grouped(samples, |(_, (x, _))| x).map(|v| { - ( - v[0].1.0 as i32, - v.iter() - .map(|&(_, (_, y))| 1 << y) - .fold(0, |acc, x| acc | x), - ) - }) { - if last + 1 != x { - write!(to, "!{}?", x - last - 1)?; - } - to.write_char((byte + b'?') as char)?; - last = x; - } - - write!(to, "$")?; - } - write!(to, "-")?; - } - write!(to, r"\")?; - - Ok(()) - } -} - -struct Grouped<'a, K: Eq, T, F: Fn(T) -> K>(&'a [T], F); -impl<'a, K: Eq, T: Copy, F: Fn(T) -> K> Iterator for Grouped<'a, K, T, F> { - type Item = &'a [T]; - fn next(&mut self) -> Option<Self::Item> { - self.0.first()?; - self.0 - .split_at_checked( - self.0 - .array_windows::<2>() - .take_while(|&&[a, b]| (self.1)(a) == (self.1)(b)) - .count() - + 1, - ) - .inspect(|(_, t)| self.0 = t) - .map(|(h, _)| h) - } -} - -#[test] -fn test() { - assert_eq!( - Sixel(Image::<Vec<u8>, 3>::open("tdata/small_cat.png")).to_string(), - include_str!("../../tdata/small_cat.six") - ); -} diff --git a/src/term/size.rs b/src/term/size.rs deleted file mode 100644 index c0a3c04..0000000 --- a/src/term/size.rs +++ /dev/null @@ -1,28 +0,0 @@ -#[cfg(unix)] -mod unix; -#[cfg(windows)] -mod windows; -use std::cmp::max; - -#[cfg(unix)] -pub use unix::size; -#[cfg(windows)] -pub use windows::size; -#[cfg(all(not(unix), not(windows)))] -pub fn size() -> Option<(u16, u16)> { - #[cfg(debug_assertions)] - eprintln!("unable to get terminal size"); - None -} - -pub fn fit((w, h): (u32, u32)) -> (u32, u32) { - if let Some((mw, mh)) = size().map(|(a, b)| (a as u32, b as u32)) { - match () { - () if w <= mw && h <= 2 * mh => (w, 2 * max(1, h / 2 + h % 2) - h % 2), - () if mw * h <= w * 2 * mh => (mw, 2 * max(1, h * mw / w / 2) - h % 2), - () => (w * 2 * mh / h, 2 * max(1, 2 * mh / 2) - h % 2), - } - } else { - (w, h) - } -} diff --git a/src/term/size/unix.rs b/src/term/size/unix.rs deleted file mode 100644 index 2fefc8f..0000000 --- a/src/term/size/unix.rs +++ /dev/null @@ -1,68 +0,0 @@ -extern crate libc; -use std::fs::File; -use std::mem::MaybeUninit as MU; -use std::ops::Deref; -use std::os::fd::IntoRawFd; - -use libc::*; - -struct Fd(i32, bool); -impl Drop for Fd { - fn drop(&mut self) { - if self.1 { - // SAFETY: #[allow(clippy::undocumented_unsafe_blocks)] - unsafe { close(self.0) }; - } - } -} -impl Fd { - pub fn new(x: File) -> Self { - Self(x.into_raw_fd(), true) - } -} - -impl From<i32> for Fd { - fn from(value: i32) -> Self { - Self(value, false) - } -} - -impl Deref for Fd { - type Target = i32; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -pub fn size() -> Option<(u16, u16)> { - // SAFETY: SYS - unsafe { - let mut size = MU::<winsize>::uninit(); - - if ioctl( - *File::open("/dev/tty") - .map(Fd::new) - .unwrap_or(Fd::from(STDIN_FILENO)), - TIOCGWINSZ, - size.as_mut_ptr(), - ) != -1 - { - let winsize { ws_col, ws_row, .. } = size.assume_init(); - return Some((ws_col as _, ws_row as _)).filter(|&(w, h)| w != 0 && h != 0); - } - tput("cols").and_then(|w| tput("lines").map(|h| (w, h))) - } -} - -pub fn tput(arg: &'static str) -> Option<u16> { - let x = std::process::Command::new("tput").arg(arg).output().ok()?; - String::from_utf8(x.stdout) - .ok() - .and_then(|x| x.parse::<u16>().ok()) -} - -#[test] -fn t() { - println!("{:?}", size().unwrap()); -} diff --git a/src/term/size/windows.rs b/src/term/size/windows.rs deleted file mode 100644 index b7499cc..0000000 --- a/src/term/size/windows.rs +++ /dev/null @@ -1,25 +0,0 @@ -use std::mem::MaybeUninit as MU; -use windows::Win32::System::Console::{ - GetConsoleScreenBufferInfo, GetStdHandle, CONSOLE_SCREEN_BUFFER_INFO as winsize, - SMALL_RECT as rect, STD_OUTPUT_HANDLE, -}; - -pub fn size() -> Option<(u16, u16)> { - // SAFETY: SYS - unsafe { - let mut info = MU::uninit(); - GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE).ok()?, info.as_mut_ptr()) - .ok()?; - let winsize { - srWindow: - rect { - Top, - Left, - Right, - Bottom, - }, - .. - } = info.assume_init(); - Some(((Bottom - Top - 1) as u16, (Right - Left - 1) as u16)) - } -} diff --git a/src/uninit.rs b/src/uninit.rs deleted file mode 100644 index 220b137..0000000 --- a/src/uninit.rs +++ /dev/null @@ -1,140 +0,0 @@ -//! the houser of uninitialized memory. €$@!0В!℡ -//! -//! contains [`Image`], an uninitialized image. -use crate::{CopyWithinUnchecked, span::Span}; -use std::{hint::assert_unchecked, mem::MaybeUninit, num::NonZeroU32, ops::Index}; - -/// A uninitialized image. Be sure to initialize it! -#[derive(Hash)] -pub struct Image<T: Copy, const CHANNELS: usize> { - /// Has capacity w * h * c - buffer: Vec<T>, - width: NonZeroU32, - height: NonZeroU32, -} - -impl<I: Span, T: Copy, const C: usize> Index<I> for Image<T, C> { - type Output = [T]; - - fn index(&self, index: I) -> &Self::Output { - &self.buffer()[index.range::<C>((self.width(), self.height()))] - } -} - -impl<T: Copy, const CHANNELS: usize> Image<T, CHANNELS> { - /// Create a new uninit image. This is not init. - pub fn new(width: NonZeroU32, height: NonZeroU32) -> Self { - Self { - buffer: Vec::with_capacity(width.get() as usize * height.get() as usize * CHANNELS), - width, - height, - } - } - - /// Write to the image. - /// - /// # Safety - /// index must be in bounds. - /// data and indexed range must have same len. - pub unsafe fn write(&mut self, data: &[T], i: impl Span) { - // SAFETY: caller - let dat = unsafe { self.slice(i) }; - // SAFETY: caller - unsafe { assert_unchecked(dat.len() == data.len()) }; - dat.write_copy_of_slice(data); - } - - /// Slice the image. - /// - /// # Safety - /// index must be in bounds. - pub unsafe fn slice(&mut self, i: impl Span) -> &mut [MaybeUninit<T>] { - let range = i.range::<CHANNELS>((self.width(), self.height())); - // SAFETY: assured - unsafe { self.buf().get_unchecked_mut(range) } - } - - /// Copy a range to a position. - /// - /// # Safety - /// - /// both parts must be in bounds. - pub unsafe fn copy_within(&mut self, i: impl Span, to: usize) { - let range = i.range::<CHANNELS>((self.width(), self.height())); - // SAFETY: copy! - unsafe { self.buf().copy_within_unchecked(range, to) }; - } - - /// # Safety - /// - /// the output index is not guaranteed to be in bounds - #[inline] - pub fn at(&self, x: u32, y: u32) -> usize { - crate::At::at::<CHANNELS>((self.width(), self.height()), x, y) - } - - #[inline] - /// get the height as a [`u32`] - pub const fn height(&self) -> u32 { - self.height.get() - } - - #[inline] - /// get the width as a [`u32`] - pub const fn width(&self) -> u32 { - self.width.get() - } - - #[inline] - /// create a new image - /// - /// # Safety - /// - /// does not check that buffer.capacity() == w * h * C - /// - /// using this with invalid values may result in future UB - pub const unsafe fn with_buf(buffer: Vec<T>, width: NonZeroU32, height: NonZeroU32) -> Self { - Self { - buffer, - width, - height, - } - } - - /// consumes the image, returning the image buffer - pub fn take_buffer(self) -> Vec<T> { - self.buffer - } - - /// returns a immutable reference to the backing buffer - pub fn buffer(&self) -> &[T] { - &self.buffer - } - - /// returns a mutable reference to the backing buffer - pub fn buf(&mut self) -> &mut [MaybeUninit<T>] { - self.buffer.spare_capacity_mut() - } - - /// initializes this image, assuming you have done your job - /// # Safety - /// requires initialization - pub unsafe fn init(&mut self) { - // SAFETY: we have trust for our callers. - unsafe { - self.buffer - .set_len(self.width() as usize * self.height() as usize * CHANNELS) - }; - } - - /// initializes this image, mapping to a normal [`crate::Image`] type. - /// - /// # Safety - /// UB if you have not init the image - pub unsafe fn assume_init(mut self) -> crate::Image<Vec<T>, CHANNELS> { - // SAFETY: its apparently init - unsafe { self.init() }; - // SAFETY: image all init, good to go - unsafe { crate::Image::new(self.width, self.height, self.buffer) } - } -} diff --git a/src/wgpu_convert.rs b/src/wgpu_convert.rs deleted file mode 100644 index 1c668ce..0000000 --- a/src/wgpu_convert.rs +++ /dev/null @@ -1,105 +0,0 @@ -use std::num::NonZeroU32; - -use wgpu::{util::*, *}; - -use crate::Image; - -impl<T, const N: usize> Image<T, N> { - /// Get the size as a [`wgpu::Extend3d`]. - pub fn wgpu_size(&self) -> Extent3d { - Extent3d { - width: self.width(), - height: self.height(), - depth_or_array_layers: 1, - } - } -} - -impl<T: AsRef<[u8]>> Image<T, 4> { - /// Upload this image to the gpu, returning a [`wgpu::Texture`]. - pub fn send(&self, dev: &Device, q: &Queue, usage: TextureUsages) -> Texture { - dev.create_texture_with_data( - &q, - &TextureDescriptor { - label: None, - size: self.wgpu_size(), - mip_level_count: 1, - sample_count: 1, - dimension: TextureDimension::D2, - format: TextureFormat::Rgba8Unorm, - view_formats: &[], - usage, - }, - util::TextureDataOrder::LayerMajor, - self.bytes(), - ) - } -} - -impl Image<Box<[u8]>, 4> { - /// Downloads a purportedly [`TextureFormat::Rgba8Unorm`] image from the gpu. - /// # Panics - /// - /// When a "error occurs while trying to async map a buffer". - pub fn download( - dev: &Device, - q: &Queue, - texture: &Texture, - (width, height): (NonZeroU32, NonZeroU32), - ) -> Self { - let mut encoder = dev.create_command_encoder(&CommandEncoderDescriptor { label: None }); - let texture_size = Extent3d { - width: width.get(), - height: height.get(), - depth_or_array_layers: 1, - }; - - let row = width.get() as usize * 4; - let pad = { - let padding = (256 - row % 256) % 256; - row + padding - }; - - let output_buffer = dev.create_buffer(&BufferDescriptor { - label: None, - size: pad as u64 * height.get() as u64, - usage: BufferUsages::COPY_DST | BufferUsages::MAP_READ, - mapped_at_creation: false, - }); - - encoder.copy_texture_to_buffer( - wgpu::ImageCopyTexture { - aspect: wgpu::TextureAspect::All, - texture, - mip_level: 0, - origin: wgpu::Origin3d::ZERO, - }, - wgpu::ImageCopyBuffer { - buffer: &output_buffer, - layout: wgpu::ImageDataLayout { - offset: 0, - bytes_per_row: Some(pad as u32), - rows_per_image: Some(height.get()), - }, - }, - texture_size, - ); - q.submit(Some(encoder.finish())); - - let buffer_slice = output_buffer.slice(..); - buffer_slice.map_async(wgpu::MapMode::Read, Result::unwrap); - - dev.poll(wgpu::Maintain::Wait); - - let mut out = crate::uninit::Image::<_, 4>::new(width, height); - for (padded, pixels) in buffer_slice - .get_mapped_range() - .chunks_exact(pad) - .zip(out.buf().chunks_exact_mut(row)) - { - ::core::mem::MaybeUninit::copy_from_slice(pixels, &padded[..row]); - } - - unsafe { out.assume_init().boxed() } - } -} diff --git a/tdata/blurred_pentagon.imgbuf b/tdata/blurred_pentagon.imgbuf Binary files differdeleted file mode 100644 index a73a99c..0000000 --- a/tdata/blurred_pentagon.imgbuf +++ /dev/null diff --git a/tdata/border_pentagon.imgbuf b/tdata/border_pentagon.imgbuf Binary files differdeleted file mode 100644 index a711027..0000000 --- a/tdata/border_pentagon.imgbuf +++ /dev/null diff --git a/tdata/cat.png b/tdata/cat.png Binary files differdeleted file mode 100644 index ca8455b..0000000 --- a/tdata/cat.png +++ /dev/null diff --git a/tdata/circle.imgbuf b/tdata/circle.imgbuf Binary files differdeleted file mode 100644 index 3235779..0000000 --- a/tdata/circle.imgbuf +++ /dev/null diff --git a/tdata/circle2.imgbuf b/tdata/circle2.imgbuf Binary files differdeleted file mode 100644 index 26d22fd..0000000 --- a/tdata/circle2.imgbuf +++ /dev/null diff --git a/tdata/enneagon.imgbuf b/tdata/enneagon.imgbuf Binary files differdeleted file mode 100644 index 57bb6b3..0000000 --- a/tdata/enneagon.imgbuf +++ /dev/null diff --git a/tdata/small_cat.png b/tdata/small_cat.png Binary files differdeleted file mode 100644 index f0e3fda..0000000 --- a/tdata/small_cat.png +++ /dev/null diff --git a/tdata/small_cat.six b/tdata/small_cat.six deleted file mode 100644 index 9e3c33d..0000000 --- a/tdata/small_cat.six +++ /dev/null @@ -1 +0,0 @@ -Pq"1;1;268;178#0;2;0;0;0#1;2;3;2;1#2;2;3;2;1#3;2;3;2;1#4;2;3;2;1#5;2;3;2;1#6;2;3;2;1#7;2;3;2;1#8;2;4;2;1#9;2;3;2;1#10;2;4;2;1#11;2;4;2;1#12;2;3;2;1#13;2;3;2;1#14;2;3;2;1#15;2;5;3;1#16;2;5;3;1#17;2;4;3;1#18;2;5;3;1#19;2;4;3;1#20;2;5;3;1#21;2;5;3;2#22;2;5;3;1#23;2;5;3;2#24;2;5;3;2#25;2;5;3;2#26;2;5;3;2#27;2;5;3;2#28;2;6;4;2#29;2;6;4;2#30;2;6;4;2#31;2;6;4;2#32;2;7;4;2#33;2;7;4;2#34;2;7;4;2#35;2;7;4;3#36;2;7;4;3#37;2;8;5;3#38;2;9;6;3#39;2;9;6;4#40;2;10;7;4#41;2;11;7;4#42;2;10;7;5#43;2;11;8;5#44;2;11;9;6#45;2;12;9;7#46;2;14;10;7#47;2;15;10;6#48;2;15;11;7#49;2;15;11;8#50;2;16;12;8#51;2;16;12;9#52;2;17;12;9#53;2;18;13;9#54;2;19;13;7#55;2;18;13;9#56;2;19;13;8#57;2;18;13;9#58;2;23;13;6#59;2;24;13;5#60;2;25;14;6#61;2;27;16;7#62;2;22;16;10#63;2;20;16;11#64;2;19;16;12#65;2;27;16;7#66;2;26;16;8#67;2;24;16;9#68;2;20;17;13#69;2;21;17;13#70;2;23;18;12#71;2;23;18;12#72;2;24;18;12#73;2;25;18;12#74;2;25;19;12#75;2;26;19;12#76;2;26;20;13#77;2;27;20;14#78;2;27;20;14#79;2;30;20;11#80;2;29;21;14#81;2;29;21;14#82;2;28;21;14#83;2;30;21;14#84;2;30;21;12#85;2;32;21;12#86;2;34;21;10#87;2;35;22;10#88;2;36;22;10#89;2;33;22;12#90;2;37;23;10#91;2;36;24;12#92;2;35;24;14#93;2;33;24;15#94;2;32;25;16#95;2;33;26;18#96;2;33;28;19#97;2;44;28;16#98;2;45;28;17#99;2;41;28;16#100;2;43;28;16#101;2;34;29;20#102;2;46;29;17#103;2;40;30;16#104;2;36;30;22#105;2;46;31;16#106;2;38;32;21#107;2;41;32;20#108;2;46;32;16#109;2;40;32;22#110;2;46;32;17#111;2;41;33;22#112;2;48;33;16#113;2;50;34;14#114;2;50;36;16#115;2;50;36;18#116;2;49;37;20#117;2;48;38;22#118;2;56;38;18#119;2;53;38;20#120;2;54;38;18#121;2;55;38;18#122;2;57;38;18#123;2;48;39;22#124;2;58;39;18#125;2;52;40;21#126;2;50;40;22#127;2;50;40;21#128;2;58;40;19#129;2;58;41;20#130;2;51;42;29#131;2;49;42;31#132;2;50;42;30#133;2;58;43;21#134;2;50;43;31#135;2;54;43;26#136;2;54;43;27#137;2;53;43;28#138;2;52;43;29#139;2;58;43;22#140;2;55;44;27#141;2;59;44;22#142;2;51;44;32#143;2;56;44;26#144;2;58;45;24#145;2;58;45;23#146;2;58;45;26#147;2;52;45;34#148;2;54;47;34#149;2;56;47;34#150;2;56;48;33#151;2;60;48;30#152;2;57;48;34#153;2;58;48;34#154;2;60;48;33#155;2;61;48;29#156;2;61;49;29#157;2;56;49;35#158;2;63;49;27#159;2;62;49;29#160;2;63;49;27#161;2;65;50;27#162;2;65;51;29#163;2;65;51;30#164;2;65;52;32#165;2;61;52;38#166;2;62;53;40#167;2;63;53;39#168;2;60;53;41#169;2;60;53;42#170;2;67;54;32#171;2;60;54;43#172;2;66;54;33#173;2;64;54;40#174;2;60;54;45#175;2;61;55;45#176;2;65;55;41#177;2;68;55;34#178;2;61;56;46#179;2;67;56;38#180;2;65;56;41#181;2;68;56;36#182;2;66;56;41#183;2;67;56;39#184;2;61;56;46#185;2;62;56;47#186;2;62;57;47#187;2;63;57;47#188;2;63;57;47#189;2;64;58;49#190;2;64;59;49#191;2;64;59;49#192;2;69;59;43#193;2;65;60;49#194;2;65;60;49#195;2;67;60;45#196;2;69;60;44#197;2;65;60;49#198;2;70;60;42#199;2;67;60;47#200;2;72;60;40#201;2;65;60;50#202;2;67;60;47#203;2;66;61;50#204;2;67;61;49#205;2;67;61;49#206;2;66;61;50#207;2;73;61;41#208;2;74;62;43#209;2;72;62;46#210;2;73;63;44#211;2;70;63;47#212;2;70;63;48#213;2;74;63;45#214;2;69;63;49#215;2;69;63;51#216;2;69;63;52#217;2;69;63;52#218;2;70;64;52#219;2;70;65;52#220;2;71;65;54#221;2;72;66;54#222;2;72;66;54#223;2;72;66;54#224;2;73;66;53#225;2;74;66;52#226;2;74;66;50#227;2;74;66;50#228;2;76;67;49#229;2;77;67;49#230;2;77;68;50#231;2;75;68;55#232;2;74;68;56#233;2;78;69;50#234;2;74;69;56#235;2;76;69;55#236;2;77;69;54#237;2;79;69;51#238;2;79;69;50#239;2;75;69;58#240;2;78;70;52#241;2;78;70;54#242;2;76;70;58#243;2;77;71;59#244;2;78;71;57#245;2;78;72;58#246;2;78;72;58#247;2;79;72;58#248;2;80;73;58#249;2;80;74;60#250;2;80;74;61#251;2;80;74;63#252;2;81;76;63#253;2;82;76;63#254;2;83;77;65#18@@$#11!2?@@@$#23!5?@@$#30!7?@$#18!8?@$#4!9?@$#19!10?@$#4!11?@@@$#7!14?@$#11!15?@$#4!16?@@@$#11!19?@@@@$#4!23?@@@$#5!26?@$#11!27?@$#4!28?@@$#19!30?@$#18!31?@$#24!32?@@$#22!34?@$#27!35?@$#23!36?@$#32!37?@$#36!38?@$#34!39?@$#25!40?@$#32!41?@$#15!42?@$#27!43?@$#18!44?@$#11!45?@@$#4!47?@$#11!48?@$#15!49?@@@@$#23!53?@@@@@@@@$#15!61?@$#23!62?@@$#32!64?@$#23!65?@@@@@@@@$#34!73?@$#38!74?@$#42!75?@$#46!76?@$#52!77?@$#55!78?@$#63!79?@@@@$#56!83?@$#62!84?@@@$#63!87?@@$#57!89?@$#63!90?@$#56!91?@$#63!92?@$#57!93?@$#56!94?@$#57!95?@$#56!96?@$#63!97?@$#56!98?@@$#57!100?@@$#52!102?@$#57!103?@@@$#53!106?@$#52!107?@$#53!108?@$#57!109?@$#53!110?@$#52!111?@$#53!112?@$#57!113?@@$#49!115?@$#57!116?@$#52!117?@@@$#48!120?@$#52!121?@$#48!122?@$#52!123?@$#53!124?@$#57!125?@@$#63!127?@$#53!128?@$#57!129?@$#53!130?@$#57!131?@$#52!132?@$#53!133?@@$#52!135?@@$#48!137?@@$#52!139?@$#50!140?@@$#48!142?@@$#46!144?@$#44!145?@$#39!146?@@$#30!148?@$#27!149?@$#14!150?@$#12!151?@$#14!152?@@$#21!154?@$#36!155?@@$#39!157?@$#42!158?@$#45!159?@@@$#46!162?@@$#50!164?@@$#48!166?@$#50!167?@@$#49!169?@$#45!170?@$#46!171?@@$#48!173?@$#46!174?@@@$#48!177?@$#46!178?@@@$#45!181?@@$#43!183?@@$#39!185?@$#42!186?@$#44!187?@$#49!188?@$#46!189?@$#51!190?@$#64!191?@$#69!192?@$#70!193?@$#77!194?@$#69!195?@@@@$#68!199?@@$#64!201?@$#69!202?@@$#77!204?@$#69!205?@$#68!206?@$#82!207?@$#96!208?@@$#101!210?@@$#104!212?@$#109!213?@@@$#131!216?@@@@@@@$#142!223?@$#174!224?@$#203!225?@$#169!226?@$#175!227?@$#188!228?@$#178!229?@$#174!230?@$#169!231?@$#157!232?@$#168!233?@$#169!234?@$#174!235?@@$#184!237?@$#188!238?@$#185!239?@$#187!240?@$#184!241?@$#186!242?@$#191!243?@$#184!244?@$#185!245?@$#189!246?@$#188!247?@@@$#189!250?@$#186!251?@$#178!252?@$#188!253?@@$#191!255?@$#203!256?@$#201!257?@$#189!258?@$#191!259?@@@@$#188!263?@$#193!264?@$#197!265?@$#190!266?@$#206!267?@$#18AA$#11!2?A$#18!3?A$#27!4?AA$#32!6?A$#22!7?A$#19!8?AA$#4!10?AAAA$#1!14?A$#7!15?A$#4!16?AAA$#5!19?A$#4!20?AAA$#11!23?AA$#4!25?A$#11!26?AA$#21!28?A$#11!29?AA$#19!31?A$#11!32?A$#24!33?A$#22!34?A$#27!35?A$#34!36?AA$#32!38?A$#36!39?A$#32!40?AA$#27!42?A$#24!43?A$#11!44?A$#18!45?A$#4!46?A$#18!47?A$#11!48?A$#15!49?AAA$#23!52?AAAA$#15!56?A$#23!57?AA$#15!59?AAA$#23!62?AAAAAAA$#15!69?A$#23!70?AA$#32!72?A$#36!73?A$#38!74?A$#45!75?A$#47!76?A$#57!77?A$#62!78?AAAA$#71!82?A$#62!83?AAA$#71!86?A$#62!87?A$#71!88?AAAA$#56!92?A$#62!93?AA$#71!95?A$#62!96?AAA$#63!99?A$#62!100?AAAA$#63!104?AA$#62!106?A$#56!107?A$#62!108?AA$#63!110?A$#56!111?AAAAAA$#62!117?A$#63!118?AAA$#62!121?A$#56!122?A$#63!123?A$#56!124?AA$#62!126?AA$#56!128?AAA$#63!131?A$#57!132?AA$#63!134?AA$#52!136?A$#57!137?A$#53!138?A$#55!139?A$#53!140?AA$#52!142?A$#53!143?A$#50!144?A$#46!145?A$#44!146?A$#39!147?A$#37!148?A$#27!149?A$#21!150?A$#12!151?A$#14!152?A$#21!153?A$#27!154?A$#30!155?A$#37!156?A$#39!157?AA$#43!159?A$#42!160?A$#45!161?A$#49!162?A$#50!163?A$#53!164?AAAA$#51!168?A$#49!169?A$#46!170?AAA$#48!173?A$#46!174?A$#49!175?A$#50!176?A$#48!177?A$#50!178?A$#49!179?AAA$#44!182?A$#39!183?A$#42!184?A$#39!185?A$#42!186?A$#44!187?A$#49!188?AA$#51!190?A$#64!191?A$#68!192?A$#69!193?AAAAAAA$#68!200?A$#69!201?AA$#77!203?A$#70!204?A$#68!205?A$#69!206?A$#82!207?A$#95!208?A$#96!209?A$#101!210?A$#96!211?A$#104!212?A$#109!213?AAAA$#131!217?A$#109!218?A$#131!219?AAAA$#147!223?A$#189!224?A$#186!225?A$#169!226?A$#178!227?A$#175!228?A$#171!229?AA$#157!231?A$#168!232?A$#171!233?AA$#175!235?A$#171!236?A$#186!237?A$#188!238?A$#186!239?A$#185!240?A$#189!241?AA$#190!243?A$#175!244?A$#188!245?A$#189!246?AA$#186!248?A$#185!249?A$#186!250?AA$#178!252?A$#188!253?A$#186!254?A$#201!255?A$#191!256?A$#201!257?A$#190!258?AA$#191!260?AA$#189!262?A$#193!263?AA$#206!265?A$#193!266?A$#194!267?A$#18CCC$#11!3?C$#18!4?CCC$#27!7?C$#11!8?CC$#5!10?C$#4!11?CC$#7!13?CC$#4!15?CCC$#11!18?C$#4!19?C$#11!20?C$#5!21?C$#11!22?CCC$#5!25?C$#11!26?C$#4!27?C$#11!28?CCC$#19!31?C$#11!32?C$#24!33?C$#27!34?C$#30!35?C$#34!36?CC$#36!38?C$#34!39?C$#32!40?C$#34!41?C$#22!42?C$#18!43?C$#11!44?C$#18!45?C$#11!46?CC$#18!48?C$#15!49?CCC$#23!52?C$#15!53?C$#4!54?C$#15!55?CC$#23!57?CC$#15!59?C$#23!60?CCC$#15!63?C$#23!64?CCCCCC$#15!70?C$#23!71?CC$#36!73?C$#40!74?C$#44!75?C$#48!76?C$#56!77?C$#62!78?C$#72!79?C$#74!80?CCC$#75!83?CC$#73!85?C$#72!86?C$#73!87?C$#75!88?C$#76!89?C$#73!90?CC$#75!92?C$#76!93?C$#74!94?C$#73!95?C$#76!96?C$#74!97?CC$#73!99?C$#72!100?CCC$#75!103?C$#71!104?C$#72!105?C$#76!106?C$#62!107?C$#72!108?C$#75!109?C$#71!110?C$#73!111?CC$#71!113?CCC$#62!116?C$#71!117?CCC$#62!120?C$#71!121?CCCCC$#72!126?C$#71!127?CC$#62!129?CC$#71!131?CC$#62!133?CC$#63!135?CC$#62!137?CCC$#56!140?C$#63!141?CC$#56!143?C$#57!144?C$#50!145?C$#46!146?C$#43!147?C$#39!148?C$#36!149?C$#21!150?C$#12!151?C$#14!152?C$#21!153?C$#14!154?C$#36!155?C$#37!156?C$#39!157?CC$#43!159?C$#45!160?C$#46!161?C$#48!162?C$#51!163?CC$#53!165?C$#64!166?C$#63!167?C$#50!168?C$#49!169?C$#48!170?C$#50!171?C$#48!172?C$#49!173?C$#48!174?CC$#52!176?C$#50!177?C$#52!178?CC$#47!180?C$#46!181?C$#44!182?C$#42!183?C$#44!184?C$#43!185?CC$#44!187?C$#50!188?C$#49!189?C$#51!190?C$#64!191?C$#69!192?C$#77!193?C$#69!194?CCCCCC$#68!200?C$#69!201?CCC$#77!204?C$#64!205?C$#69!206?C$#77!207?C$#95!208?C$#96!209?CC$#101!211?CC$#104!213?C$#109!214?CCC$#131!217?CCCCCC$#147!223?C$#201!224?C$#188!225?C$#174!226?C$#189!227?C$#174!228?C$#178!229?C$#171!230?C$#157!231?C$#169!232?CC$#175!234?C$#174!235?C$#186!236?C$#188!237?C$#197!238?C$#188!239?CC$#189!241?C$#190!242?C$#189!243?C$#184!244?CC$#197!246?C$#188!247?C$#184!248?C$#186!249?CCCC$#178!253?C$#189!254?C$#191!255?C$#203!256?C$#191!257?C$#190!258?CC$#201!260?C$#191!261?C$#201!262?C$#189!263?C$#193!264?C$#194!265?C$#206!266?C$#194!267?C$#24G$#11!1?G$#18!2?G$#19!3?G$#24!4?G$#22!5?G$#27!6?G$#24!7?G$#11!8?GG$#4!10?GGG$#11!13?G$#7!14?G$#4!15?G$#5!16?G$#4!17?GG$#11!19?G$#5!20?G$#4!21?G$#11!22?G$#19!23?G$#11!24?GG$#19!26?G$#4!27?GG$#21!29?G$#19!30?GG$#24!32?G$#27!33?G$#30!34?G$#27!35?G$#30!36?G$#32!37?G$#34!38?GG$#36!40?G$#30!41?G$#27!42?G$#22!43?GG$#18!45?G$#11!46?GG$#4!48?G$#15!49?GGGGG$#23!54?G$#15!55?G$#23!56?GGGG$#32!60?G$#23!61?GGGGGGGG$#32!69?G$#23!70?GG$#32!72?G$#34!73?G$#38!74?G$#43!75?G$#52!76?G$#56!77?G$#72!78?G$#78!79?G$#76!80?G$#82!81?G$#78!82?GG$#82!84?G$#76!85?G$#82!86?GG$#75!88?G$#82!89?GG$#78!91?GG$#81!93?G$#80!94?G$#75!95?G$#82!96?G$#75!97?GG$#77!99?G$#75!100?G$#78!101?GG$#76!103?G$#73!104?G$#76!105?G$#82!106?G$#73!107?G$#76!108?G$#74!109?G$#75!110?G$#76!111?G$#71!112?G$#72!113?G$#75!114?G$#72!115?GG$#76!117?G$#73!118?G$#76!119?G$#73!120?GGG$#78!123?G$#73!124?G$#77!125?G$#72!126?G$#76!127?GG$#75!129?G$#71!130?G$#72!131?G$#71!132?G$#73!133?G$#71!134?GGG$#62!137?G$#72!138?G$#62!139?GGGGG$#63!144?G$#57!145?G$#45!146?G$#44!147?G$#39!148?G$#37!149?G$#21!150?G$#14!151?GG$#27!153?G$#21!154?G$#30!155?G$#37!156?G$#39!157?G$#42!158?G$#44!159?G$#43!160?G$#49!161?G$#48!162?G$#51!163?G$#53!164?G$#57!165?GG$#52!167?G$#53!168?G$#50!169?G$#49!170?GGGG$#48!174?G$#52!175?GG$#57!177?G$#52!178?G$#57!179?G$#50!180?G$#46!181?G$#44!182?GG$#39!184?G$#42!185?GG$#44!187?G$#45!188?G$#51!189?GG$#64!191?G$#68!192?GG$#69!194?GG$#68!196?GG$#69!198?G$#68!199?G$#64!200?G$#68!201?G$#69!202?GGG$#68!205?GG$#82!207?G$#95!208?GG$#96!210?G$#101!211?GG$#104!213?G$#109!214?GGGG$#131!218?GGGGG$#147!223?G$#206!224?G$#175!225?GG$#188!227?G$#197!228?G$#175!229?GG$#157!231?G$#175!232?G$#193!233?G$#185!234?G$#175!235?G$#188!236?G$#189!237?GGG$#188!240?G$#189!241?GG$#201!243?G$#175!244?G$#187!245?G$#190!246?G$#193!247?G$#186!248?G$#188!249?G$#189!250?G$#178!251?G$#186!252?GG$#190!254?G$#201!255?G$#191!256?G$#201!257?G$#189!258?G$#191!259?G$#201!260?G$#191!261?G$#188!262?G$#194!263?G$#190!264?G$#201!265?G$#206!266?GG$#24O$#11!1?O$#4!2?O$#18!3?O$#27!4?OOO$#24!7?O$#19!8?O$#11!9?OO$#5!11?O$#7!12?O$#5!13?O$#11!14?O$#1!15?O$#11!16?O$#1!17?O$#7!18?O$#5!19?OO$#4!21?O$#11!22?O$#4!23?O$#11!24?OOO$#4!27?O$#11!28?OO$#4!30?O$#27!31?O$#24!32?OO$#27!34?OO$#32!36?OO$#34!38?O$#32!39?O$#23!40?O$#30!41?O$#27!42?O$#18!43?O$#24!44?O$#11!45?OOO$#18!48?O$#15!49?O$#4!50?O$#15!51?OOOOO$#23!56?O$#15!57?OO$#23!59?O$#15!60?O$#23!61?OOO$#15!64?O$#23!65?OOOOOOO$#32!72?O$#34!73?O$#41!74?O$#46!75?O$#53!76?O$#62!77?O$#73!78?O$#82!79?O$#81!80?OO$#94!82?O$#83!83?O$#94!84?O$#82!85?O$#83!86?O$#78!87?O$#83!88?O$#94!89?OO$#83!91?O$#81!92?O$#83!93?O$#81!94?O$#76!95?O$#80!96?O$#82!97?O$#80!98?O$#83!99?OO$#82!101?O$#80!102?OO$#81!104?O$#83!105?O$#78!106?O$#81!107?O$#78!108?OO$#82!110?O$#81!111?O$#78!112?O$#82!113?O$#75!114?O$#78!115?OO$#83!117?O$#78!118?O$#75!119?O$#78!120?OO$#73!122?O$#76!123?O$#75!124?O$#78!125?O$#82!126?O$#75!127?OO$#76!129?OO$#75!131?O$#77!132?O$#76!133?OO$#75!135?O$#74!136?OOO$#73!139?O$#71!140?OOO$#62!143?OO$#57!145?O$#51!146?O$#45!147?O$#43!148?O$#37!149?O$#27!150?O$#14!151?OO$#21!153?O$#27!154?O$#30!155?O$#39!156?OO$#42!158?OO$#46!160?OO$#50!162?O$#53!163?O$#52!164?O$#53!165?O$#63!166?O$#57!167?O$#52!168?O$#57!169?O$#50!170?OO$#49!172?O$#52!173?O$#50!174?O$#57!175?OOO$#52!178?O$#57!179?O$#52!180?O$#46!181?O$#45!182?O$#44!183?O$#39!184?OO$#43!186?O$#44!187?O$#46!188?O$#50!189?O$#51!190?O$#64!191?O$#68!192?O$#69!193?OO$#68!195?OO$#69!197?O$#68!198?O$#64!199?O$#69!200?O$#68!201?O$#69!202?OO$#68!204?O$#64!205?O$#68!206?O$#77!207?O$#94!208?O$#95!209?O$#96!210?O$#101!211?O$#96!212?O$#104!213?O$#109!214?OOOO$#131!218?OOOOO$#157!223?O$#219!224?O$#171!225?O$#185!226?O$#178!227?O$#188!228?O$#171!229?O$#184!230?O$#157!231?O$#175!232?O$#203!233?O$#189!234?O$#175!235?O$#185!236?O$#178!237?O$#186!238?O$#188!239?O$#187!240?O$#188!241?O$#191!242?OO$#169!244?O$#184!245?O$#188!246?OOO$#186!249?O$#189!250?O$#178!251?O$#186!252?O$#184!253?O$#186!254?O$#191!255?OOO$#189!258?O$#191!259?OO$#190!261?O$#188!262?OO$#190!264?O$#206!265?OOO$#27_$#18!1?_$#24!2?__$#27!4?_$#22!5?__$#19!7?_$#11!8?_$#4!9?_$#5!10?_$#4!11?__$#11!13?_$#5!14?___$#12!17?_$#1!18?_$#5!19?_$#7!20?_$#4!21?_$#11!22?_$#4!23?____$#11!27?_$#5!28?_$#4!29?_$#19!30?__$#27!32?__$#18!34?_$#22!35?_$#34!36?_$#23!37?_$#32!38?_$#34!39?__$#22!41?_$#27!42?_$#11!43?_$#18!44?__$#11!46?_$#4!47?__$#11!49?_$#15!50?_____$#23!55?_$#15!56?____$#23!60?_$#15!61?_$#23!62?__$#15!64?_$#23!65?_______$#32!72?_$#34!73?_$#42!74?_$#47!75?_$#53!76?_$#72!77?_$#78!78?_$#80!79?_$#94!80?__$#93!82?_$#94!83?____$#93!87?_$#94!88?_$#83!89?_$#94!90?____$#93!94?_$#83!95?__$#93!97?__$#83!99?_$#81!100?_$#94!101?_$#83!102?____$#94!106?_$#83!107?__$#81!109?_$#83!110?__$#81!112?__$#80!114?_$#83!115?_$#81!116?_$#78!117?_$#81!118?__$#94!120?_$#78!121?__$#80!123?_$#81!124?_$#83!125?__$#81!127?_$#78!128?_$#80!129?_$#83!130?_$#80!131?_$#78!132?__$#82!134?_$#74!135?_$#78!136?_$#73!137?_$#74!138?_$#73!139?_$#77!140?_$#76!141?_$#73!142?_$#72!143?_$#62!144?_$#63!145?_$#53!146?_$#49!147?_$#42!148?_$#37!149?_$#30!150?_$#12!151?_$#21!152?_$#14!153?_$#27!154?_$#36!155?_$#37!156?__$#42!158?_$#43!159?_$#45!160?_$#49!161?_$#50!162?_$#52!163?_$#53!164?_$#63!165?___$#57!168?_$#53!169?__$#52!171?_$#50!172?_$#52!173?_$#57!174?__$#56!176?_$#53!177?_$#57!178?__$#53!180?_$#47!181?_$#44!182?_$#42!183?_$#39!184?_$#42!185?_$#39!186?_$#45!187?_$#46!188?_$#50!189?_$#51!190?_$#64!191?_$#51!192?_$#64!193?__$#68!195?___$#64!198?___$#51!201?_$#68!202?___$#64!205?__$#77!207?_$#94!208?_$#95!209?_$#96!210?_$#101!211?__$#104!213?_$#109!214?_____$#131!219?____$#157!223?_$#220!224?_$#174!225?_$#184!226?_$#174!227?_$#188!228?_$#171!229?_$#185!230?_$#157!231?_$#175!232?_$#187!233?_$#184!234?_$#168!235?_$#190!236?_$#188!237?_$#189!238?__$#184!240?_$#197!241?_$#189!242?__$#175!244?__$#197!246?_$#188!247?__$#186!249?___$#178!252?_$#186!253?_$#189!254?_$#191!255?___$#190!258?_$#201!259?_$#191!260?_$#189!261?_$#188!262?__$#197!264?_$#201!265?_$#197!266?_$#216!267?_$-#24@@$#18!2?@$#22!3?@@$#30!5?@$#27!6?@$#21!7?@$#11!8?@$#5!9?@$#7!10?@$#4!11?@@$#7!13?@$#5!14?@$#12!15?@$#7!16?@@@$#12!19?@$#5!20?@$#11!21?@$#4!22?@@@$#5!25?@@$#4!27?@@$#11!29?@$#19!30?@@$#24!32?@@$#27!34?@@$#23!36?@$#34!37?@@$#23!39?@@$#34!41?@$#22!42?@$#27!43?@$#18!44?@$#11!45?@$#18!46?@$#4!47?@$#11!48?@$#15!49?@$#23!50?@$#4!51?@$#15!52?@@@@$#23!56?@$#15!57?@$#23!58?@@@$#15!61?@$#23!62?@$#15!63?@$#23!64?@@@$#15!67?@$#23!68?@$#32!69?@$#23!70?@@@$#20!73?@$#40!74?@$#47!75?@$#54!76?@$#72!77?@$#78!78?@$#83!79?@$#94!80?@@$#95!82?@$#94!83?@@$#95!85?@$#94!86?@$#93!87?@$#95!88?@$#94!89?@$#93!90?@$#94!91?@@@@$#93!95?@$#94!96?@@@$#83!99?@$#94!100?@$#83!101?@$#94!102?@$#93!103?@@$#94!105?@$#93!106?@$#83!107?@$#93!108?@$#83!109?@$#94!110?@$#93!111?@$#83!112?@$#94!113?@$#83!114?@$#81!115?@$#83!116?@@@$#81!119?@$#78!120?@$#82!121?@$#81!122?@$#83!123?@$#94!124?@$#81!125?@$#93!126?@$#94!127?@$#83!128?@@@@$#81!132?@$#76!133?@$#82!134?@$#78!135?@$#81!136?@@$#76!138?@@$#78!140?@$#76!141?@@@$#72!144?@$#62!145?@$#52!146?@$#48!147?@$#45!148?@$#37!149?@$#30!150?@$#21!151?@@@@$#30!155?@$#36!156?@$#39!157?@@@$#44!160?@$#45!161?@$#50!162?@$#53!163?@@$#63!165?@@@@$#57!169?@$#52!170?@$#53!171?@$#57!172?@$#53!173?@$#57!174?@@$#63!176?@$#56!177?@$#63!178?@$#56!179?@$#57!180?@$#53!181?@$#46!182?@$#42!183?@$#43!184?@$#42!185?@@$#45!187?@$#46!188?@$#49!189?@@$#51!191?@$#64!192?@$#51!193?@$#64!194?@@$#68!196?@$#64!197?@@@@@@$#68!203?@$#64!204?@$#51!205?@$#64!206?@$#74!207?@$#94!208?@$#95!209?@$#96!210?@$#101!211?@@$#96!213?@$#104!214?@$#109!215?@@@@$#131!219?@@@@$#169!223?@$#222!224?@$#174!225?@@$#171!227?@$#197!228?@$#169!229?@$#174!230?@$#157!231?@$#169!232?@$#175!233?@$#184!234?@$#168!235?@$#189!236?@$#188!237?@$#189!238?@$#188!239?@$#184!240?@$#191!241?@$#190!242?@$#189!243?@$#185!244?@$#187!245?@$#188!246?@@$#178!248?@$#188!249?@$#189!250?@$#186!251?@$#174!252?@$#184!253?@$#189!254?@$#190!255?@$#191!256?@@@$#189!259?@$#201!260?@$#190!261?@$#188!262?@$#193!263?@$#201!264?@$#206!265?@@@$#18AAA$#27!3?A$#31!4?A$#27!5?AA$#21!7?A$#5!8?A$#7!9?AA$#1!11?AA$#5!13?AA$#1!15?AA$#5!17?A$#1!18?A$#11!19?A$#7!20?A$#4!21?A$#5!22?A$#4!23?AA$#5!25?A$#4!26?AAAA$#5!30?A$#19!31?A$#27!32?AA$#30!34?A$#34!35?A$#32!36?AA$#34!38?A$#32!39?A$#34!40?A$#23!41?A$#22!42?A$#24!43?A$#18!44?AA$#11!46?AAA$#15!49?AA$#4!51?A$#18!52?A$#23!53?A$#15!54?AAA$#23!57?AAA$#15!60?A$#23!61?A$#15!62?A$#23!63?AAA$#15!66?AA$#23!68?AA$#32!70?A$#23!71?AA$#36!73?A$#37!74?A$#48!75?A$#54!76?A$#67!77?A$#80!78?A$#93!79?A$#94!80?A$#95!81?AAAAAAA$#94!88?AA$#95!90?A$#93!91?A$#95!92?A$#94!93?A$#93!94?A$#94!95?A$#95!96?AA$#93!98?A$#95!99?A$#94!100?A$#95!101?A$#94!102?AAA$#95!105?A$#94!106?AA$#93!108?A$#94!109?AAA$#93!112?AAA$#83!115?A$#93!116?A$#80!117?A$#83!118?AA$#80!120?A$#83!121?A$#94!122?AA$#83!124?A$#94!125?A$#83!126?AA$#94!128?AA$#93!130?A$#83!131?A$#94!132?A$#83!133?AA$#94!135?A$#83!136?AA$#81!138?AA$#82!140?A$#76!141?A$#78!142?A$#75!143?A$#73!144?A$#62!145?A$#57!146?A$#50!147?A$#45!148?A$#39!149?A$#30!150?A$#21!151?A$#14!152?A$#21!153?A$#27!154?A$#30!155?A$#37!156?A$#39!157?A$#42!158?AA$#43!160?A$#46!161?A$#51!162?A$#53!163?A$#63!164?AAAAA$#57!169?A$#63!170?A$#57!171?A$#52!172?AA$#57!174?AA$#63!176?AAAA$#53!180?A$#51!181?A$#49!182?A$#44!183?A$#39!184?A$#42!185?A$#43!186?A$#45!187?A$#46!188?AA$#49!190?A$#51!191?AA$#64!193?AA$#68!195?A$#64!196?AAA$#51!199?AA$#64!201?AA$#68!203?AAA$#64!206?A$#77!207?A$#94!208?AA$#95!210?A$#96!211?A$#101!212?AA$#104!214?A$#109!215?AAA$#111!218?A$#131!219?AAAA$#178!223?A$#239!224?A$#178!225?AA$#175!227?A$#188!228?A$#174!229?A$#175!230?A$#165!231?A$#169!232?A$#187!233?AA$#174!235?A$#188!236?A$#186!237?A$#184!238?A$#175!239?AA$#188!241?AAA$#184!244?A$#188!245?AA$#184!247?A$#185!248?A$#189!249?A$#186!250?A$#185!251?A$#186!252?A$#175!253?A$#189!254?AA$#201!256?AA$#191!258?A$#203!259?A$#190!260?AA$#189!262?AA$#201!264?A$#197!265?A$#206!266?A$#216!267?A$#11C$#18!1?C$#11!2?C$#22!3?C$#32!4?C$#30!5?C$#24!6?C$#11!7?CC$#1!9?CC$#5!11?C$#1!12?CCCCC$#5!17?CC$#7!19?C$#1!20?C$#7!21?CC$#4!23?CCC$#1!26?C$#5!27?C$#11!28?C$#19!29?C$#11!30?C$#19!31?C$#27!32?C$#24!33?C$#27!34?C$#32!35?CCC$#36!38?C$#34!39?CC$#32!41?C$#23!42?CC$#24!44?CC$#4!46?CC$#11!48?CCC$#18!51?C$#11!52?C$#4!53?C$#15!54?CCC$#23!57?C$#15!58?C$#23!59?CCC$#15!62?C$#23!63?CC$#15!65?C$#23!66?CC$#15!68?C$#23!69?CCCC$#34!73?C$#40!74?C$#46!75?C$#56!76?C$#72!77?C$#81!78?C$#94!79?C$#95!80?CCCCCCCCCC$#93!90?C$#83!91?CC$#95!93?CC$#93!95?CC$#94!97?CC$#93!99?CC$#94!101?C$#95!102?C$#94!103?C$#95!104?C$#94!105?CCCC$#93!109?C$#94!110?C$#83!111?C$#94!112?C$#83!113?C$#93!114?CC$#83!116?C$#93!117?C$#94!118?C$#83!119?C$#93!120?C$#83!121?CC$#94!123?CCC$#93!126?C$#94!127?CC$#93!129?C$#83!130?C$#94!131?CC$#83!133?C$#94!134?C$#93!135?C$#83!136?CC$#80!138?C$#81!139?C$#82!140?C$#81!141?C$#82!142?C$#73!143?C$#76!144?C$#62!145?C$#50!146?C$#48!147?C$#42!148?C$#37!149?C$#30!150?C$#14!151?CCC$#27!154?C$#30!155?C$#36!156?C$#39!157?CC$#42!159?C$#43!160?C$#46!161?C$#49!162?C$#53!163?C$#57!164?C$#63!165?CCC$#56!168?C$#63!169?C$#57!170?CC$#52!172?C$#53!173?C$#57!174?C$#56!175?CC$#57!177?C$#62!178?C$#63!179?C$#56!180?C$#50!181?C$#46!182?C$#44!183?C$#39!184?CCC$#42!187?C$#45!188?CC$#46!190?C$#50!191?C$#51!192?C$#64!193?C$#69!194?C$#68!195?CC$#64!197?C$#51!198?CCC$#64!201?CCC$#68!204?CCC$#77!207?C$#94!208?C$#82!209?C$#95!210?C$#96!211?C$#101!212?C$#104!213?C$#109!214?CCCCC$#131!219?CCC$#142!222?C$#203!223?C$#242!224?C$#171!225?C$#178!226?C$#190!227?C$#178!228?C$#171!229?CC$#157!231?C$#169!232?C$#184!233?C$#175!234?CC$#188!236?C$#178!237?C$#184!238?CC$#175!240?C$#188!241?C$#189!242?C$#184!243?C$#175!244?C$#188!245?CC$#185!247?C$#175!248?C$#186!249?CC$#174!251?C$#184!252?C$#178!253?C$#188!254?C$#191!255?C$#189!256?C$#203!257?C$#201!258?C$#203!259?C$#191!260?C$#190!261?C$#189!262?C$#190!263?C$#197!264?C$#201!265?CC$#203!267?C$#18G$#24!1?G$#18!2?G$#27!3?G$#32!4?G$#22!5?G$#18!6?G$#11!7?G$#1!8?G$#5!9?G$#1!10?G$#7!11?GG$#1!13?G$#7!14?G$#1!15?G$#7!16?G$#1!17?G$#7!18?GG$#1!20?GG$#7!22?GG$#4!24?GGGGGG$#11!30?G$#27!31?G$#18!32?G$#30!33?GG$#23!35?G$#34!36?G$#32!37?G$#34!38?G$#36!39?G$#34!40?G$#32!41?G$#23!42?G$#24!43?G$#18!44?GG$#11!46?GGGGGG$#18!52?G$#15!53?GGGG$#18!57?G$#15!58?G$#23!59?G$#15!60?G$#23!61?G$#15!62?G$#23!63?GGGGG$#15!68?G$#23!69?GGGG$#32!73?G$#38!74?G$#41!75?G$#54!76?G$#72!77?G$#83!78?GG$#94!80?G$#95!81?GGGGGG$#94!87?G$#95!88?G$#101!89?G$#95!90?GGG$#94!93?G$#95!94?G$#93!95?G$#95!96?GGG$#94!99?GGG$#95!102?G$#94!103?G$#95!104?GG$#93!106?G$#94!107?G$#95!108?G$#93!109?G$#94!110?G$#83!111?GG$#94!113?GG$#83!115?GG$#94!117?GG$#83!119?G$#94!120?GG$#83!122?GGG$#81!125?G$#94!126?G$#93!127?G$#83!128?G$#93!129?GG$#94!131?G$#83!132?GG$#94!134?G$#83!135?GGGG$#94!139?G$#82!140?G$#81!141?G$#78!142?G$#76!143?G$#82!144?G$#71!145?G$#56!146?G$#50!147?G$#45!148?G$#39!149?G$#27!150?G$#14!151?GGG$#21!154?G$#27!155?G$#30!156?G$#39!157?GGG$#44!160?G$#46!161?G$#48!162?G$#50!163?G$#63!164?GGG$#70!167?G$#63!168?GG$#57!170?GGG$#52!173?G$#57!174?GG$#56!176?G$#63!177?G$#56!178?GGG$#52!181?G$#46!182?G$#44!183?G$#42!184?G$#39!185?G$#43!186?G$#44!187?G$#45!188?G$#44!189?G$#45!190?G$#49!191?G$#51!192?G$#68!193?GGG$#64!196?GGGG$#51!200?GG$#64!202?GG$#68!204?GG$#64!206?G$#69!207?G$#82!208?GG$#94!210?G$#96!211?GG$#109!213?GGGGGGG$#131!220?GGG$#220!223?G$#242!224?G$#171!225?G$#178!226?G$#174!227?G$#184!228?G$#174!229?G$#169!230?G$#165!231?G$#168!232?G$#171!233?GGG$#174!236?G$#185!237?G$#184!238?G$#175!239?GG$#188!241?GG$#175!243?GG$#184!245?G$#187!246?G$#184!247?G$#175!248?G$#186!249?G$#189!250?G$#178!251?G$#175!252?G$#184!253?G$#189!254?G$#191!255?G$#189!256?G$#201!257?GG$#203!259?G$#191!260?G$#197!261?G$#189!262?G$#193!263?G$#201!264?G$#203!265?G$#206!266?G$#203!267?G$#18O$#11!1?O$#22!2?O$#15!3?O$#27!4?O$#30!5?O$#19!6?O$#11!7?O$#7!8?O$#1!9?O$#5!10?OO$#12!12?O$#1!13?OO$#5!15?O$#4!16?O$#5!17?O$#7!18?O$#1!19?OO$#7!21?O$#4!22?O$#7!23?O$#4!24?O$#11!25?O$#4!26?OO$#19!28?OOO$#21!31?O$#27!32?O$#30!33?OO$#34!35?O$#36!36?O$#34!37?OOOO$#32!41?O$#18!42?O$#27!43?O$#18!44?OOO$#11!47?OO$#4!49?OO$#11!51?OOO$#4!54?O$#18!55?O$#15!56?OOOOOOO$#23!63?O$#15!64?O$#23!65?OOOO$#32!69?O$#23!70?OO$#32!72?O$#34!73?O$#38!74?O$#46!75?O$#56!76?O$#71!77?O$#82!78?O$#93!79?OO$#94!81?O$#93!82?O$#96!83?O$#95!84?OO$#94!86?O$#95!87?O$#93!88?O$#95!89?OOO$#94!92?O$#83!93?O$#94!94?O$#93!95?OOOOOO$#94!101?OOOO$#93!105?OO$#94!107?O$#83!108?O$#94!109?O$#83!110?O$#93!111?OO$#83!113?OOO$#81!116?O$#83!117?O$#78!118?O$#82!119?O$#80!120?O$#78!121?O$#82!122?OO$#83!124?OOOO$#80!128?O$#81!129?O$#83!130?OO$#93!132?O$#83!133?O$#80!134?O$#83!135?O$#80!136?O$#83!137?O$#80!138?OOO$#76!141?O$#82!142?O$#78!143?O$#77!144?O$#62!145?O$#56!146?O$#47!147?O$#45!148?O$#39!149?O$#27!150?O$#14!151?OOO$#21!154?O$#30!155?O$#37!156?O$#39!157?OOO$#44!160?O$#45!161?O$#49!162?O$#52!163?O$#57!164?O$#63!165?OOOOO$#52!170?OO$#57!172?OOOOOOOOO$#51!181?O$#45!182?O$#44!183?O$#39!184?OO$#43!186?O$#44!187?O$#45!188?O$#44!189?O$#45!190?O$#49!191?O$#51!192?O$#64!193?O$#69!194?O$#68!195?O$#64!196?OOOOOO$#51!202?O$#64!203?O$#68!204?OO$#64!206?O$#70!207?O$#77!208?O$#82!209?OO$#95!211?O$#101!212?O$#104!213?O$#109!214?OOOOOO$#131!220?OOO$#239!223?OO$#178!225?OO$#184!227?OO$#174!229?OO$#165!231?O$#168!232?O$#175!233?O$#169!234?OO$#178!236?O$#186!237?OO$#184!239?O$#185!240?O$#186!241?O$#188!242?O$#187!243?OO$#184!245?O$#189!246?O$#185!247?O$#184!248?O$#188!249?O$#186!250?O$#178!251?O$#186!252?O$#188!253?O$#186!254?O$#189!255?OO$#191!257?OO$#201!259?OO$#193!261?O$#189!262?O$#188!263?O$#201!264?O$#203!265?OO$#206!267?O$#18__$#23!2?__$#27!4?__$#19!6?_$#11!7?_$#7!8?_$#1!9?_$#12!10?_$#5!11?__$#1!13?_$#5!14?_$#4!15?___$#5!18?_$#4!19?_$#1!20?_$#7!21?_$#4!22?_$#11!23?_$#4!24?_$#5!25?_$#4!26?_$#11!27?__$#19!29?__$#11!31?_$#30!32?_$#27!33?_$#31!34?_$#23!35?_$#36!36?_$#34!37?____$#23!41?_$#27!42?_$#22!43?_$#18!44?__$#11!46?___$#4!49?_$#11!50?_$#4!51?___$#18!54?_$#11!55?__$#15!57?_$#23!58?__$#15!60?_$#23!61?_$#15!62?__$#23!64?_______$#32!71?_$#23!72?_$#32!73?_$#37!74?_$#46!75?_$#48!76?_$#62!77?_$#76!78?_$#82!79?_$#83!80?_$#93!81?_$#94!82?_$#93!83?_$#83!84?_$#95!85?_$#94!86?____$#83!90?_$#93!91?_$#94!92?_____$#93!97?_$#94!98?__$#83!100?___$#94!103?___$#83!106?_$#81!107?_$#82!108?__$#78!110?_$#81!111?_$#82!112?__$#81!114?_$#83!115?_$#78!116?_$#76!117?__$#78!119?____$#81!123?_$#82!124?_$#81!125?_$#82!126?_$#83!127?__$#80!129?_$#82!130?__$#78!132?_$#82!133?__$#76!135?_$#77!136?_$#78!137?_$#82!138?_$#78!139?_$#82!140?_$#76!141?_$#78!142?_$#82!143?_$#75!144?_$#71!145?_$#57!146?_$#48!147?_$#45!148?_$#39!149?_$#30!150?_$#14!151?___$#21!154?_$#27!155?_$#37!156?_$#39!157?__$#42!159?_$#45!160?_$#44!161?_$#46!162?_$#52!163?_$#53!164?_$#63!165?_$#56!166?_$#52!167?_$#63!168?_$#56!169?_$#53!170?_$#52!171?_$#50!172?_$#53!173?_$#57!174?_$#53!175?_$#57!176?___$#53!179?_$#57!180?_$#50!181?_$#46!182?_$#43!183?__$#39!185?_$#42!186?_$#43!187?_$#44!188?_$#45!189?__$#49!191?_$#51!192?_$#68!193?_$#69!194?__$#64!196?_$#68!197?_$#64!198?___$#51!201?_$#64!202?__$#68!204?__$#64!206?_$#69!207?_$#82!208?___$#96!211?_$#101!212?_$#104!213?_$#109!214?_____$#131!219?____$#243!223?_$#242!224?_$#174!225?____$#171!229?_$#174!230?_$#165!231?_$#187!232?_$#174!233?_$#157!234?_$#171!235?__$#184!237?_$#188!238?_$#184!239?__$#188!241?_$#184!242?_$#175!243?_$#184!244?_$#187!245?_$#184!246?___$#189!249?_$#186!250?___$#188!253?___$#191!256?__$#203!258?__$#190!260?_$#193!261?_$#187!262?_$#193!263?_$#201!264?_$#203!265?__$#216!267?_$-#11@$#18!1?@$#32!2?@@$#27!4?@$#30!5?@$#19!6?@$#7!7?@$#5!8?@$#1!9?@@$#5!11?@@$#1!13?@$#7!14?@@$#4!16?@$#11!17?@$#4!18?@$#5!19?@$#4!20?@@$#7!22?@@$#4!24?@@$#11!26?@@$#24!28?@$#4!29?@$#27!30?@$#24!31?@@$#27!33?@$#32!34?@$#34!35?@@$#36!37?@@$#32!39?@$#34!40?@@$#30!42?@$#18!43?@@$#11!45?@@@$#4!48?@$#11!49?@$#5!50?@$#4!51?@$#11!52?@@@@$#18!56?@$#15!57?@@$#23!59?@$#15!60?@$#23!61?@$#4!62?@$#23!63?@$#15!64?@$#23!65?@@@@@@$#32!71?@$#23!72?@@$#37!74?@$#43!75?@$#47!76?@$#62!77?@$#72!78?@$#75!79?@$#83!80?@$#94!81?@@$#83!83?@@$#94!85?@$#83!86?@$#80!87?@$#83!88?@@$#81!90?@@$#80!92?@$#82!93?@@@$#83!96?@$#81!97?@@$#83!99?@$#80!100?@$#81!101?@$#82!102?@@$#94!104?@$#82!105?@@$#83!107?@$#81!108?@$#73!109?@$#78!110?@$#76!111?@$#75!112?@$#76!113?@$#75!114?@$#77!115?@$#73!116?@$#78!117?@$#76!118?@@@$#74!121?@$#78!122?@$#77!123?@$#82!124?@$#75!125?@$#82!126?@$#78!127?@$#75!128?@$#78!129?@$#74!130?@$#75!131?@$#78!132?@@$#75!134?@$#76!135?@$#78!136?@@$#76!138?@$#72!139?@$#78!140?@$#73!141?@$#74!142?@$#73!143?@$#75!144?@$#62!145?@$#57!146?@$#49!147?@$#45!148?@$#39!149?@$#30!150?@$#14!151?@@@@$#30!155?@$#37!156?@$#39!157?@$#36!158?@$#43!159?@$#44!160?@$#46!161?@$#50!162?@@$#49!164?@$#63!165?@$#69!166?@$#63!167?@$#57!168?@@$#53!170?@$#50!171?@@$#53!173?@$#52!174?@$#53!175?@$#57!176?@@$#53!178?@@@$#50!181?@$#42!182?@@$#39!184?@@@$#43!187?@$#44!188?@$#45!189?@$#44!190?@$#46!191?@$#51!192?@$#68!193?@$#69!194?@@$#64!196?@$#68!197?@$#64!198?@@@@@$#69!203?@$#68!204?@$#69!205?@$#64!206?@$#69!207?@$#77!208?@@$#82!210?@$#95!211?@$#96!212?@$#104!213?@$#109!214?@@@@@@$#131!220?@@$#147!222?@$#250!223?@$#232!224?@$#178!225?@$#174!226?@$#186!227?@$#175!228?@$#169!229?@@$#165!231?@$#169!232?@$#168!233?@$#165!234?@$#174!235?@$#184!236?@$#189!237?@@$#185!239?@$#184!240?@$#189!241?@$#188!242?@$#187!243?@$#184!244?@@@$#185!247?@$#184!248?@$#189!249?@$#186!250?@$#178!251?@$#188!252?@$#178!253?@$#188!254?@$#189!255?@$#190!256?@$#191!257?@$#203!258?@@$#191!260?@$#188!261?@$#193!262?@@$#203!264?@@$#216!266?@$#203!267?@$#24A$#23!1?A$#32!2?AA$#22!4?A$#18!5?A$#4!6?A$#5!7?A$#1!8?AA$#7!10?A$#1!11?AAAA$#7!15?AAA$#5!18?AA$#11!20?A$#4!21?AAA$#11!24?A$#4!25?A$#11!26?AA$#18!28?AA$#21!30?A$#18!31?A$#22!32?A$#30!33?A$#23!34?A$#34!35?AAA$#36!38?A$#34!39?A$#32!40?A$#34!41?A$#30!42?A$#27!43?A$#18!44?A$#11!45?AA$#4!47?A$#7!48?A$#5!49?A$#4!50?AAAA$#11!54?AAA$#4!57?A$#11!58?A$#15!59?A$#23!60?AA$#15!62?A$#23!63?AAAAAA$#32!69?A$#23!70?AAA$#34!73?A$#37!74?A$#41!75?A$#48!76?A$#53!77?A$#71!78?A$#76!79?A$#77!80?A$#83!81?A$#82!82?AAAA$#78!86?A$#83!87?A$#80!88?A$#82!89?AA$#78!91?A$#82!92?A$#83!93?A$#78!94?A$#75!95?A$#82!96?A$#80!97?A$#83!98?A$#82!99?A$#76!100?A$#82!101?AA$#76!103?A$#78!104?A$#82!105?A$#78!106?A$#82!107?A$#77!108?AA$#78!110?A$#76!111?A$#71!112?A$#76!113?AA$#74!115?A$#72!116?A$#62!117?A$#73!118?AA$#76!120?A$#75!121?A$#72!122?A$#74!123?A$#75!124?A$#76!125?A$#71!126?A$#75!127?AA$#62!129?A$#73!130?A$#76!131?A$#73!132?A$#77!133?A$#75!134?A$#77!135?A$#73!136?A$#78!137?A$#71!138?A$#75!139?AA$#74!141?A$#77!142?A$#71!143?A$#73!144?A$#63!145?A$#52!146?A$#48!147?A$#44!148?A$#37!149?A$#30!150?A$#14!151?A$#12!152?A$#14!153?A$#27!154?A$#21!155?A$#37!156?A$#39!157?A$#42!158?AA$#45!160?A$#46!161?AA$#50!163?A$#52!164?A$#63!165?A$#57!166?A$#63!167?A$#57!168?A$#52!169?AA$#48!171?A$#49!172?AA$#52!174?AA$#48!176?A$#52!177?A$#48!178?A$#57!179?A$#50!180?A$#49!181?A$#45!182?A$#39!183?AAAA$#43!187?A$#44!188?A$#45!189?AA$#46!191?A$#50!192?A$#64!193?A$#68!194?AA$#69!196?A$#64!197?AA$#51!199?A$#64!200?A$#51!201?A$#64!202?AA$#69!204?AA$#68!206?A$#69!207?A$#82!208?AA$#95!210?A$#96!211?AA$#104!213?AAAA$#109!217?AAA$#131!220?AA$#147!222?A$#251!223?A$#220!224?A$#174!225?A$#169!226?A$#188!227?A$#169!228?AA$#168!230?A$#157!231?A$#168!232?AA$#157!234?A$#171!235?A$#174!236?A$#186!237?A$#184!238?A$#174!239?A$#187!240?A$#188!241?A$#189!242?A$#188!243?A$#185!244?A$#188!245?AA$#184!247?AA$#189!249?A$#186!250?A$#184!251?A$#178!252?A$#184!253?A$#188!254?AA$#189!256?A$#190!257?A$#203!258?AA$#201!260?A$#189!261?A$#188!262?A$#197!263?AA$#203!265?A$#216!266?AA$#24C$#23!1?C$#32!2?C$#30!3?C$#22!4?C$#18!5?C$#4!6?C$#1!7?C$#5!8?CCC$#1!11?CC$#7!13?CCC$#4!16?CC$#5!18?C$#7!19?C$#4!20?C$#11!21?C$#4!22?CC$#11!24?C$#4!25?CC$#11!27?CC$#27!29?C$#11!30?C$#27!31?CC$#31!33?C$#36!34?C$#34!35?C$#36!36?CC$#34!38?C$#32!39?C$#34!40?CC$#23!42?C$#24!43?C$#18!44?C$#19!45?C$#5!46?CC$#1!48?C$#4!49?CCC$#11!52?C$#5!53?C$#4!54?C$#11!55?C$#4!56?C$#11!57?CC$#24!59?C$#15!60?C$#23!61?C$#32!62?C$#15!63?C$#23!64?CCCCCCC$#32!71?CC$#34!73?C$#37!74?C$#40!75?C$#47!76?C$#48!77?C$#62!78?C$#73!79?C$#78!80?C$#82!81?C$#78!82?C$#82!83?CC$#78!85?C$#76!86?CC$#78!88?CCC$#74!91?C$#83!92?C$#82!93?C$#76!94?C$#78!95?C$#75!96?C$#78!97?CC$#73!99?C$#82!100?CC$#77!102?C$#78!103?C$#75!104?C$#76!105?C$#73!106?C$#74!107?C$#73!108?C$#74!109?C$#73!110?C$#71!111?CC$#73!113?CC$#75!115?C$#71!116?CC$#74!118?C$#71!119?C$#72!120?C$#73!121?C$#71!122?C$#74!123?C$#71!124?C$#74!125?C$#75!126?C$#73!127?C$#76!128?C$#71!129?CCC$#74!132?C$#72!133?C$#71!134?C$#62!135?C$#73!136?CCC$#74!139?C$#73!140?C$#71!141?CC$#62!143?C$#71!144?C$#63!145?C$#53!146?C$#48!147?C$#43!148?C$#39!149?C$#30!150?C$#14!151?C$#12!152?C$#14!153?C$#21!154?C$#30!155?C$#37!156?C$#39!157?CC$#42!159?C$#45!160?C$#49!161?CC$#52!163?C$#64!164?C$#57!165?C$#63!166?CC$#53!168?CC$#50!170?CC$#45!172?C$#48!173?C$#50!174?C$#48!175?C$#50!176?C$#52!177?C$#48!178?C$#49!179?C$#50!180?C$#46!181?CC$#43!183?C$#39!184?CCC$#43!187?C$#44!188?C$#46!189?CC$#49!191?C$#51!192?CC$#68!194?CCCC$#64!198?CC$#51!200?C$#64!201?CC$#68!203?CCC$#64!206?C$#69!207?C$#77!208?C$#82!209?CC$#96!211?CC$#101!213?C$#104!214?CCC$#109!217?CC$#111!219?C$#131!220?CC$#157!222?C$#254!223?C$#217!224?C$#174!225?C$#169!226?C$#185!227?C$#174!228?C$#169!229?C$#165!230?C$#157!231?CC$#168!233?C$#148!234?C$#174!235?C$#171!236?C$#189!237?C$#184!238?C$#178!239?C$#185!240?C$#189!241?CC$#184!243?C$#188!244?CCC$#174!247?C$#185!248?C$#189!249?C$#186!250?C$#188!251?CCCC$#190!255?C$#189!256?CC$#201!258?C$#203!259?C$#201!260?C$#188!261?CC$#193!263?C$#197!264?C$#201!265?C$#216!266?C$#203!267?C$#24G$#30!1?G$#23!2?G$#30!3?GG$#19!5?G$#11!6?G$#7!7?GGGGG$#1!12?G$#7!13?G$#4!14?G$#7!15?G$#4!16?G$#5!17?G$#11!18?GG$#4!20?GGGG$#11!24?G$#18!25?G$#11!26?G$#24!27?G$#11!28?G$#27!29?G$#19!30?G$#24!31?G$#27!32?GG$#34!34?G$#32!35?G$#34!36?GG$#36!38?GG$#32!40?GGG$#22!43?G$#24!44?G$#4!45?GG$#7!47?GG$#1!49?GG$#4!51?GGGGG$#11!56?G$#18!57?G$#11!58?GG$#23!60?G$#15!61?GG$#23!63?G$#15!64?G$#23!65?GGGGGGGG$#34!73?G$#37!74?G$#41!75?G$#46!76?G$#52!77?G$#62!78?G$#72!79?G$#76!80?G$#82!81?G$#78!82?G$#74!83?G$#78!84?GG$#82!86?GG$#75!88?G$#77!89?G$#78!90?G$#77!91?G$#76!92?G$#78!93?G$#76!94?G$#78!95?G$#72!96?G$#73!97?GG$#76!99?G$#72!100?G$#73!101?G$#71!102?G$#72!103?G$#71!104?G$#75!105?G$#72!106?G$#71!107?GG$#74!109?G$#72!110?G$#73!111?G$#62!112?G$#71!113?G$#72!114?G$#71!115?GGGG$#62!119?G$#71!120?GGGGGGGG$#62!128?G$#73!129?G$#71!130?GGGGG$#73!135?G$#71!136?G$#62!137?G$#71!138?GGGGGG$#63!144?GG$#52!146?G$#49!147?G$#44!148?G$#39!149?G$#30!150?G$#12!151?G$#14!152?GG$#21!154?G$#27!155?G$#36!156?G$#39!157?G$#42!158?G$#40!159?G$#46!160?GG$#50!162?G$#53!163?GG$#63!165?G$#57!166?GGG$#50!169?G$#49!170?G$#48!171?GG$#46!173?G$#51!174?G$#49!175?G$#50!176?G$#48!177?G$#50!178?G$#52!179?GG$#46!181?G$#43!182?GG$#39!184?GGG$#42!187?GG$#45!189?G$#46!190?G$#51!191?GG$#64!193?G$#69!194?GGG$#68!197?G$#51!198?G$#64!199?GG$#51!201?G$#64!202?G$#68!203?G$#69!204?G$#64!205?G$#68!206?G$#69!207?G$#82!208?GGG$#95!211?GG$#101!213?G$#104!214?GGG$#109!217?GG$#111!219?G$#131!220?GG$#169!222?G$#254!223?G$#201!224?G$#174!225?G$#189!226?G$#184!227?G$#169!228?GG$#157!230?GG$#168!232?G$#169!233?G$#157!234?G$#171!235?G$#185!236?G$#186!237?G$#184!238?G$#174!239?G$#188!240?GG$#186!242?G$#188!243?GG$#186!245?G$#188!246?G$#184!247?G$#185!248?G$#178!249?G$#186!250?G$#178!251?G$#188!252?GGG$#189!255?G$#190!256?G$#191!257?G$#203!258?GG$#191!260?G$#188!261?GG$#194!263?G$#206!264?G$#203!265?G$#216!266?GG$#31O$#24!1?O$#34!2?O$#31!3?O$#24!4?O$#19!5?O$#11!6?O$#7!7?OO$#4!9?O$#5!10?O$#11!11?O$#7!12?O$#4!13?O$#11!14?O$#7!15?O$#4!16?O$#5!17?O$#4!18?O$#11!19?O$#4!20?OO$#11!22?O$#4!23?O$#11!24?OOO$#4!27?O$#24!28?OOOO$#30!32?O$#27!33?O$#34!34?OO$#36!36?OOO$#32!39?O$#34!40?O$#32!41?O$#31!42?O$#22!43?O$#11!44?OO$#5!46?O$#7!47?O$#1!48?O$#7!49?O$#1!50?O$#7!51?O$#4!52?OOO$#11!55?OOOO$#18!59?O$#15!60?O$#23!61?OOOOOOOOOO$#32!71?O$#23!72?OO$#37!74?O$#42!75?O$#47!76?O$#48!77?O$#62!78?O$#72!79?OO$#77!81?O$#82!82?OO$#78!84?OOO$#82!87?OO$#78!89?O$#82!90?O$#78!91?O$#77!92?O$#76!93?O$#78!94?O$#73!95?O$#77!96?O$#76!97?O$#73!98?OO$#77!100?O$#72!101?O$#74!102?O$#77!103?O$#73!104?OO$#71!106?OO$#62!108?O$#73!109?O$#71!110?OOOOOOO$#72!117?O$#71!118?O$#62!119?O$#71!120?O$#72!121?O$#71!122?O$#72!123?O$#71!124?OOO$#62!127?O$#71!128?OO$#62!130?OOO$#71!133?O$#62!134?O$#71!135?O$#62!136?OOO$#71!139?O$#62!140?O$#71!141?O$#63!142?O$#62!143?O$#63!144?OO$#50!146?O$#45!147?O$#43!148?O$#37!149?O$#21!150?O$#14!151?OOO$#21!154?O$#30!155?O$#36!156?O$#39!157?O$#37!158?O$#43!159?O$#45!160?O$#46!161?O$#49!162?O$#51!163?OO$#57!165?OO$#64!167?O$#53!168?O$#52!169?O$#49!170?O$#48!171?O$#50!172?O$#48!173?OO$#51!175?O$#49!176?O$#48!177?O$#49!178?O$#48!179?O$#53!180?O$#46!181?O$#45!182?O$#43!183?O$#39!184?OO$#42!186?O$#39!187?O$#43!188?O$#46!189?O$#45!190?O$#49!191?O$#51!192?O$#64!193?OO$#69!195?O$#68!196?O$#64!197?O$#68!198?O$#51!199?O$#64!200?O$#51!201?OO$#64!203?O$#68!204?O$#69!205?O$#64!206?O$#69!207?O$#77!208?O$#82!209?OO$#95!211?OO$#101!213?O$#104!214?OOO$#109!217?OO$#111!219?O$#131!220?OO$#174!222?O$#254!223?O$#186!224?O$#178!225?OO$#174!227?O$#157!228?O$#175!229?O$#157!230?OO$#168!232?O$#169!233?O$#157!234?O$#171!235?O$#174!236?O$#185!237?O$#178!238?O$#174!239?O$#186!240?O$#175!241?O$#187!242?O$#185!243?O$#186!244?O$#190!245?O$#184!246?OO$#174!248?O$#178!249?O$#186!250?O$#178!251?O$#188!252?O$#187!253?O$#185!254?O$#190!255?O$#189!256?O$#191!257?O$#203!258?OO$#201!260?O$#193!261?OOO$#203!264?OO$#216!266?OO$#32_$#27!1?_$#30!2?_$#22!3?_$#18!4?_$#11!5?_$#5!6?_$#7!7?_$#1!8?_$#7!9?__$#1!11?_$#7!12?_$#11!13?__$#7!15?_$#4!16?__$#11!18?_$#4!19?__$#11!21?_$#4!22?_$#11!23?_$#19!24?_$#5!25?_$#11!26?_$#19!27?_$#24!28?__$#22!30?__$#30!32?_$#32!33?__$#34!35?_$#37!36?__$#34!38?_$#36!39?_$#34!40?_$#32!41?_$#23!42?_$#30!43?_$#18!44?_$#19!45?_$#11!46?_$#1!47?_$#5!48?_$#1!49?_$#7!50?__$#5!52?_$#4!53?_$#11!54?__$#4!56?_$#11!57?_$#4!58?_$#15!59?____$#23!63?_______$#32!70?_$#23!71?__$#34!73?__$#40!75?_$#45!76?_$#48!77?_$#62!78?_$#72!79?_$#73!80?_$#76!81?_$#77!82?_$#78!83?_$#75!84?_$#82!85?_$#78!86?_$#82!87?_$#78!88?_$#74!89?_$#77!90?_$#78!91?_$#77!92?_$#76!93?_$#75!94?_$#74!95?_$#76!96?_$#74!97?___$#78!100?_$#75!101?_$#74!102?_$#73!103?_$#72!104?_$#74!105?_$#71!106?_$#72!107?_$#62!108?_$#71!109?_$#62!110?_$#71!111?____$#62!115?___$#71!118?__$#62!120?___$#72!123?_$#71!124?__$#72!126?_$#71!127?__$#62!129?__$#71!131?_$#62!132?_$#71!133?____$#62!137?____$#71!141?_$#62!142?_$#56!143?_$#63!144?_$#48!145?__$#45!147?_$#42!148?_$#37!149?_$#30!150?_$#14!151?___$#21!154?_$#30!155?_$#37!156?_$#39!157?_$#42!158?_$#43!159?_$#44!160?_$#49!161?_$#51!162?___$#57!165?__$#52!167?_$#48!168?__$#50!170?_$#51!171?_$#48!172?_$#50!173?__$#48!175?_$#51!176?_$#46!177?_$#50!178?_$#48!179?__$#46!181?_$#43!182?_$#39!183?_____$#43!188?_$#45!189?__$#50!191?_$#51!192?_$#64!193?_$#69!194?_$#68!195?_$#69!196?_$#64!197?_$#51!198?_$#64!199?_$#51!200?_$#64!201?_$#51!202?_$#64!203?__$#68!205?_$#64!206?_$#69!207?_$#77!208?__$#82!210?__$#96!212?_$#101!213?_$#104!214?__$#101!216?_$#109!217?___$#131!220?__$#189!222?_$#254!223?_$#178!224?_$#174!225?_$#186!226?_$#169!227?_$#148!228?_$#175!229?_$#148!230?_$#168!231?_$#169!232?___$#175!235?_$#178!236?__$#175!238?_$#174!239?_$#178!240?_$#186!241?_$#184!242?__$#188!244?__$#187!246?_$#184!247?_$#178!248?_$#189!249?_$#186!250?_$#188!251?_$#186!252?_$#184!253?_$#175!254?_$#189!255?_$#188!256?_$#190!257?_$#203!258?___$#193!261?_$#188!262?_$#197!263?_$#203!264?____$-#23@$#30!1?@$#27!2?@$#22!3?@$#24!4?@$#11!5?@$#5!6?@$#1!7?@$#7!8?@@$#1!10?@$#7!11?@@$#5!13?@$#7!14?@$#11!15?@$#5!16?@$#4!17?@@@$#11!20?@@$#19!22?@$#11!23?@@@$#21!26?@$#19!27?@$#11!28?@$#24!29?@$#22!30?@$#27!31?@$#30!32?@$#31!33?@$#34!34?@$#25!35?@$#34!36?@@$#37!38?@$#34!39?@$#32!40?@$#34!41?@$#32!42?@$#27!43?@$#18!44?@$#11!45?@@$#7!47?@@@@@$#1!52?@$#4!53?@@@@$#11!57?@$#18!58?@$#15!59?@$#4!60?@$#11!61?@$#23!62?@@$#4!64?@$#15!65?@$#23!66?@$#18!67?@$#24!68?@$#15!69?@$#23!70?@@$#15!72?@$#32!73?@@$#37!75?@$#42!76?@$#47!77?@$#56!78?@$#62!79?@$#72!80?@$#76!81?@$#77!82?@$#76!83?@$#71!84?@$#76!85?@$#77!86?@$#75!87?@$#74!88?@$#78!89?@$#76!90?@$#75!91?@$#72!92?@$#75!93?@@$#73!95?@$#76!96?@$#74!97?@$#73!98?@$#74!99?@$#76!100?@$#72!101?@$#71!102?@$#75!103?@$#73!104?@$#72!105?@$#71!106?@@@$#62!109?@@@$#71!112?@@$#62!114?@@$#71!116?@@$#62!118?@@@$#71!121?@$#62!122?@$#63!123?@$#71!124?@@$#62!126?@@@@@$#71!131?@$#62!132?@$#71!133?@@$#62!135?@@@@@@$#56!141?@@$#57!143?@$#52!144?@$#50!145?@$#45!146?@$#42!147?@$#39!148?@$#37!149?@$#27!150?@$#14!151?@@@$#27!154?@$#30!155?@$#37!156?@$#39!157?@@$#43!159?@$#44!160?@$#45!161?@$#50!162?@@$#51!164?@$#52!165?@@$#50!167?@$#51!168?@$#49!169?@@$#48!171?@$#46!172?@$#48!173?@@@$#49!176?@$#48!177?@@$#50!179?@$#52!180?@$#45!181?@@$#43!183?@$#39!184?@@@@$#43!188?@$#45!189?@$#46!190?@$#49!191?@@$#51!193?@$#69!194?@@$#68!196?@$#64!197?@$#51!198?@$#64!199?@$#51!200?@$#64!201?@$#51!202?@$#64!203?@@$#68!205?@@$#69!207?@$#77!208?@@@$#82!211?@$#94!212?@$#101!213?@$#104!214?@@@@$#109!218?@@$#131!220?@@$#191!222?@$#254!223?@$#184!224?@$#178!225?@@$#171!227?@$#148!228?@$#157!229?@@$#168!231?@$#169!232?@@$#175!234?@$#174!235?@$#178!236?@$#174!237?@$#185!238?@$#174!239?@$#184!240?@$#189!241?@$#188!242?@$#184!243?@$#186!244?@$#175!245?@@$#184!247?@$#186!248?@$#188!249?@$#186!250?@@$#188!252?@@$#184!254?@$#189!255?@$#188!256?@$#191!257?@$#203!258?@$#201!259?@$#203!260?@$#194!261?@$#188!262?@$#197!263?@$#203!264?@@$#217!266?@$#216!267?@$#23AA$#18!2?A$#27!3?A$#19!4?A$#5!5?A$#14!6?A$#1!7?A$#11!8?A$#12!9?A$#7!10?A$#1!11?A$#7!12?AAAAA$#4!17?A$#5!18?AA$#11!20?AAA$#4!23?A$#19!24?A$#4!25?A$#11!26?A$#4!27?A$#18!28?A$#27!29?A$#22!30?AA$#27!32?A$#30!33?A$#34!34?AAAA$#37!38?A$#34!39?AA$#32!41?A$#23!42?A$#22!43?A$#18!44?A$#19!45?A$#5!46?A$#1!47?A$#7!48?AAA$#4!51?A$#5!52?A$#4!53?AA$#11!55?A$#4!56?A$#18!57?A$#11!58?A$#18!59?A$#11!60?A$#18!61?A$#11!62?AA$#15!64?A$#18!65?AAAA$#24!69?A$#18!70?A$#22!71?A$#18!72?A$#15!73?A$#32!74?A$#37!75?A$#41!76?A$#47!77?A$#48!78?A$#62!79?A$#72!80?A$#75!81?A$#73!82?A$#77!83?AA$#73!85?A$#76!86?A$#77!87?A$#75!88?A$#76!89?AA$#75!91?A$#72!92?A$#73!93?AA$#72!95?AA$#71!97?A$#73!98?A$#71!99?A$#73!100?A$#72!101?A$#71!102?A$#62!103?AAA$#71!106?AAAAA$#62!111?A$#71!112?A$#62!113?A$#56!114?A$#62!115?AAAA$#56!119?A$#62!120?AAAAAAAAAAAAAAA$#56!135?A$#63!136?A$#56!137?A$#63!138?AA$#56!140?AA$#53!142?AA$#50!144?A$#49!145?A$#44!146?A$#42!147?A$#39!148?A$#37!149?A$#21!150?A$#14!151?A$#12!152?A$#14!153?A$#21!154?A$#27!155?A$#37!156?A$#39!157?AA$#43!159?A$#45!160?AA$#49!162?A$#46!163?A$#49!164?A$#51!165?A$#52!166?A$#50!167?AA$#48!169?A$#46!170?AAAA$#50!174?A$#49!175?A$#48!176?AA$#50!178?A$#48!179?A$#47!180?A$#46!181?A$#44!182?A$#42!183?A$#39!184?AAAA$#43!188?A$#45!189?A$#49!190?AA$#64!192?AA$#68!194?A$#69!195?AA$#64!197?AAA$#51!200?AAA$#64!203?AA$#68!205?AA$#70!207?A$#77!208?A$#82!209?A$#77!210?A$#82!211?A$#94!212?A$#101!213?AAA$#109!216?AAAA$#131!220?AA$#203!222?A$#254!223?A$#178!224?A$#171!225?A$#178!226?A$#174!227?A$#168!228?A$#157!229?A$#168!230?A$#171!231?A$#184!232?A$#169!233?AA$#175!235?A$#178!236?A$#174!237?AAA$#184!240?A$#189!241?A$#188!242?A$#187!243?A$#188!244?A$#186!245?A$#175!246?AA$#189!248?A$#178!249?A$#186!250?A$#185!251?A$#188!252?A$#175!253?AA$#188!255?AA$#189!257?A$#203!258?AAA$#194!261?A$#193!262?A$#203!263?A$#191!264?A$#203!265?AAA$#23C$#27!1?CC$#18!3?C$#4!4?C$#11!5?C$#7!6?C$#5!7?C$#11!8?C$#4!9?C$#7!10?CCCCCCC$#11!17?C$#4!18?CCCC$#19!22?CC$#11!24?CCC$#18!27?C$#22!28?C$#11!29?C$#22!30?C$#27!31?C$#30!32?C$#34!33?CC$#32!35?C$#36!36?C$#32!37?C$#34!38?C$#36!39?C$#32!40?C$#23!41?C$#34!42?C$#22!43?C$#4!44?C$#11!45?C$#4!46?C$#1!47?CC$#7!49?C$#11!50?C$#5!51?C$#4!52?CC$#11!54?C$#4!55?CCC$#11!58?CCCC$#18!62?CC$#11!64?CCC$#24!67?C$#11!68?C$#18!69?CCCC$#24!73?C$#27!74?C$#34!75?C$#42!76?C$#46!77?C$#52!78?C$#62!79?C$#72!80?CC$#71!82?C$#73!83?C$#74!84?C$#72!85?C$#77!86?C$#72!87?C$#71!88?C$#72!89?C$#74!90?C$#71!91?C$#74!92?C$#73!93?C$#62!94?CC$#73!96?C$#72!97?CC$#74!99?C$#73!100?C$#72!101?C$#62!102?C$#71!103?C$#62!104?CC$#74!106?C$#62!107?CCCC$#56!111?C$#71!112?C$#62!113?CC$#54!115?C$#62!116?C$#56!117?CCC$#63!120?CC$#71!122?C$#62!123?C$#56!124?C$#63!125?CCCCC$#56!130?C$#62!131?CC$#56!133?C$#63!134?C$#56!135?C$#63!136?C$#56!137?CC$#57!139?CC$#55!141?C$#53!142?C$#52!143?C$#50!144?C$#46!145?C$#45!146?C$#39!147?C$#37!148?C$#30!149?C$#21!150?C$#14!151?CCC$#21!154?C$#30!155?C$#37!156?C$#39!157?CC$#43!159?CC$#44!161?C$#46!162?C$#49!163?C$#48!164?C$#50!165?C$#51!166?C$#49!167?C$#48!168?CCC$#45!171?C$#46!172?CC$#48!174?C$#46!175?CCC$#48!178?CC$#46!180?C$#44!181?C$#46!182?C$#42!183?C$#39!184?CCC$#43!187?C$#42!188?C$#45!189?CC$#49!191?C$#51!192?CC$#64!194?C$#69!195?CC$#68!197?C$#64!198?C$#51!199?CCCC$#64!203?C$#68!204?CCC$#64!207?C$#77!208?C$#82!209?CCC$#94!212?C$#96!213?C$#104!214?CCCC$#109!218?CC$#131!220?CC$#220!222?C$#254!223?C$#184!224?C$#178!225?C$#175!226?C$#171!227?C$#157!228?C$#168!229?C$#165!230?C$#168!231?C$#169!232?C$#148!233?C$#169!234?C$#175!235?C$#184!236?C$#175!237?CCC$#187!240?C$#188!241?CC$#184!243?C$#188!244?CC$#175!246?CC$#188!248?C$#178!249?CCC$#188!252?C$#184!253?C$#175!254?C$#189!255?C$#186!256?C$#190!257?C$#203!258?CC$#191!260?C$#189!261?C$#193!262?C$#197!263?C$#203!264?CC$#216!266?C$#203!267?C$#23G$#27!1?GG$#24!3?G$#4!4?G$#11!5?G$#4!6?G$#5!7?GG$#1!9?GG$#5!11?GG$#7!13?GG$#1!15?G$#7!16?G$#4!17?G$#5!18?G$#11!19?GGGGG$#4!24?G$#11!25?GG$#24!27?GG$#11!29?G$#27!30?GGG$#34!33?G$#36!34?G$#34!35?G$#36!36?G$#32!37?G$#34!38?G$#32!39?GGG$#27!42?G$#24!43?G$#18!44?G$#19!45?G$#11!46?G$#7!47?G$#1!48?GG$#11!50?G$#1!51?G$#4!52?G$#11!53?G$#4!54?GG$#11!56?G$#4!57?G$#11!58?GG$#4!60?GGGG$#11!64?GGGGG$#18!69?G$#24!70?G$#18!71?G$#11!72?G$#24!73?G$#27!74?G$#34!75?G$#38!76?G$#45!77?G$#50!78?G$#62!79?GG$#72!81?GG$#75!83?G$#71!84?G$#74!85?G$#73!86?G$#74!87?G$#73!88?G$#75!89?G$#71!90?G$#75!91?G$#71!92?GG$#72!94?G$#71!95?G$#62!96?G$#71!97?GG$#62!99?G$#71!100?GG$#62!102?G$#71!103?G$#62!104?G$#71!105?G$#62!106?GGGG$#71!110?GG$#62!112?G$#56!113?GG$#62!115?G$#63!116?G$#62!117?G$#63!118?G$#56!119?G$#63!120?G$#56!121?G$#63!122?GGG$#56!125?G$#63!126?G$#56!127?GG$#63!129?G$#56!130?GGGG$#57!134?GG$#52!136?G$#56!137?G$#57!138?G$#63!139?G$#57!140?G$#52!141?G$#50!142?G$#52!143?G$#48!144?G$#44!145?G$#43!146?G$#39!147?G$#37!148?G$#27!149?G$#14!150?GG$#12!152?G$#14!153?G$#27!154?GG$#36!156?G$#37!157?G$#39!158?G$#42!159?G$#44!160?G$#45!161?GG$#49!163?G$#48!164?G$#49!165?G$#51!166?G$#46!167?G$#49!168?G$#46!169?GGGGGG$#48!175?GG$#46!177?G$#48!178?G$#49!179?G$#46!180?GG$#42!182?GG$#39!184?GGGGG$#44!189?G$#46!190?GG$#51!192?GG$#68!194?GGGG$#64!198?G$#51!199?G$#64!200?G$#51!201?GGG$#64!204?G$#68!205?G$#64!206?G$#69!207?G$#77!208?G$#82!209?G$#77!210?G$#82!211?G$#94!212?G$#101!213?GG$#104!215?GG$#109!217?GGG$#131!220?GG$#220!222?G$#254!223?G$#178!224?GG$#186!226?G$#169!227?G$#157!228?GGG$#168!231?G$#175!232?G$#147!233?G$#171!234?G$#175!235?G$#188!236?GG$#171!238?G$#175!239?G$#188!240?GG$#187!242?G$#184!243?G$#188!244?G$#186!245?G$#184!246?G$#175!247?G$#186!248?G$#178!249?G$#188!250?G$#186!251?G$#184!252?G$#188!253?G$#187!254?G$#190!255?G$#186!256?G$#191!257?G$#203!258?G$#201!259?GG$#194!261?G$#201!262?G$#191!263?G$#203!264?G$#216!265?G$#203!266?GG$#23O$#32!1?O$#27!2?O$#11!3?OO$#19!5?O$#7!6?O$#11!7?O$#7!8?OOOO$#1!12?OO$#4!14?OO$#11!16?O$#1!17?O$#4!18?O$#11!19?OOOOOOO$#21!26?O$#18!27?O$#24!28?O$#27!29?OO$#30!31?O$#32!32?OO$#36!34?OO$#37!36?O$#36!37?O$#34!38?O$#36!39?O$#34!40?O$#31!41?O$#27!42?O$#18!43?OO$#11!45?O$#7!46?OOOO$#1!50?OO$#4!52?OOO$#11!55?OOO$#4!58?OO$#19!60?O$#4!61?O$#19!62?O$#4!63?O$#11!64?OOOO$#4!68?O$#24!69?O$#11!70?OO$#24!72?O$#11!73?O$#18!74?O$#27!75?O$#39!76?O$#44!77?O$#52!78?O$#56!79?O$#70!80?O$#73!81?OOO$#72!84?O$#73!85?O$#74!86?O$#73!87?O$#75!88?O$#74!89?O$#72!90?OO$#75!92?O$#71!93?O$#72!94?O$#62!95?O$#71!96?O$#62!97?O$#71!98?OO$#62!100?O$#71!101?O$#62!102?O$#71!103?O$#62!104?O$#71!105?O$#62!106?OOO$#56!109?O$#62!110?OOOOOO$#63!116?O$#62!117?O$#56!118?OO$#63!120?O$#57!121?O$#56!122?OOOO$#53!126?O$#56!127?OO$#63!129?OO$#57!131?O$#56!132?O$#53!133?O$#57!134?O$#63!135?O$#57!136?O$#56!137?O$#57!138?OO$#53!140?O$#52!141?O$#48!142?OO$#45!144?O$#43!145?O$#39!146?OO$#30!148?O$#21!149?O$#14!150?O$#12!151?O$#14!152?OO$#27!154?O$#30!155?OO$#39!157?OO$#42!159?O$#43!160?O$#44!161?OO$#46!163?OO$#50!165?O$#51!166?O$#50!167?OO$#46!169?OO$#45!171?OOO$#49!174?O$#46!175?O$#48!176?OOO$#49!179?O$#46!180?OO$#42!182?O$#43!183?O$#39!184?OOO$#42!187?OO$#43!189?O$#46!190?O$#49!191?O$#51!192?OO$#64!194?O$#69!195?OO$#64!197?OOO$#51!200?OOO$#64!203?OO$#68!205?O$#69!206?OO$#77!208?OO$#82!210?O$#77!211?O$#95!212?O$#96!213?O$#101!214?O$#104!215?O$#101!216?O$#109!217?OOO$#131!220?OO$#239!222?O$#254!223?O$#186!224?O$#178!225?O$#174!226?O$#169!227?O$#157!228?OO$#148!230?O$#168!231?O$#169!232?O$#157!233?O$#171!234?OO$#188!236?O$#175!237?O$#171!238?O$#184!239?O$#189!240?OO$#187!242?O$#175!243?O$#188!244?O$#189!245?O$#184!246?O$#188!247?O$#186!248?OO$#178!250?O$#189!251?O$#188!252?O$#187!253?O$#188!254?OOO$#203!257?OO$#191!259?OO$#187!261?O$#206!262?OOO$#203!265?OOO$#30_$#27!1?__$#11!3?__$#7!5?__$#5!7?_$#7!8?_$#1!9?_$#5!10?_$#7!11?___$#1!14?_$#4!15?_$#11!16?_$#7!17?_$#4!18?_$#11!19?_______$#18!26?__$#24!28?_$#27!29?__$#22!31?_$#31!32?_$#34!33?_$#36!34?_$#23!35?_$#36!36?_$#34!37?_$#32!38?_$#34!39?_$#36!40?_$#34!41?_$#30!42?_$#22!43?_$#18!44?_$#11!45?__$#7!47?_$#1!48?_$#4!49?__$#7!51?_$#4!52?__$#11!54?___$#5!57?_$#19!58?_$#11!59?_$#4!60?___$#11!63?_$#4!64?__$#18!66?_$#11!67?_$#18!68?___$#19!71?_$#11!72?_$#18!73?___$#37!76?_$#43!77?_$#48!78?_$#52!79?_$#62!80?_$#73!81?___$#72!84?__$#74!86?__$#72!88?_$#71!89?_$#75!90?_$#71!91?_$#73!92?_$#75!93?_$#71!94?_$#72!95?__$#62!97?_$#71!98?_____$#62!103?_$#71!104?__$#62!106?_________$#71!115?_$#62!116?_$#63!117?_$#56!118?__$#63!120?_$#56!121?_$#63!122?_$#56!123?___$#63!126?_$#56!127?__$#57!129?_$#56!130?_$#63!131?__$#56!133?_$#55!134?_$#53!135?_$#56!136?__$#57!138?__$#63!140?_$#53!141?__$#49!143?_$#46!144?_$#44!145?_$#39!146?_$#37!147?_$#27!148?_$#14!149?_$#12!150?__$#14!152?__$#27!154?_$#30!155?_$#36!156?_$#39!157?___$#43!160?_$#44!161?_$#46!162?_$#49!163?_$#48!164?_$#46!165?_$#51!166?_$#50!167?_$#49!168?_$#45!169?_$#46!170?_____$#45!175?_$#49!176?_$#48!177?__$#49!179?_$#48!180?_$#46!181?_$#45!182?_$#42!183?_$#39!184?_$#37!185?_$#39!186?___$#43!189?_$#46!190?_$#49!191?_$#51!192?_$#64!193?_$#68!194?_$#69!195?_$#68!196?___$#51!199?_____$#64!204?__$#68!206?_$#70!207?_$#77!208?_$#82!209?___$#77!212?_$#96!213?__$#104!215?_$#101!216?_$#104!217?_$#109!218?__$#131!220?__$#242!222?_$#254!223?_$#186!224?_$#174!225?__$#169!227?_$#157!228?___$#175!231?_$#169!232?_$#148!233?_$#169!234?_$#188!235?_$#186!236?_$#189!237?_$#175!238?__$#190!240?_$#185!241?_$#184!242?_$#187!243?_$#188!244?_$#187!245?_$#188!246?_$#184!247?_$#186!248?_$#178!249?__$#184!251?_$#188!252?_$#184!253?_$#186!254?_$#189!255?_$#191!256?_$#201!257?_$#203!258?_$#201!259?_$#197!260?_$#190!261?_$#206!262?_$#203!263?_____$-#27@$#24!1?@$#18!2?@$#19!3?@$#11!4?@$#7!5?@@@@@$#4!10?@$#11!11?@$#7!12?@$#11!13?@$#7!14?@$#11!15?@@$#5!17?@$#11!18?@@@@@@@@$#19!26?@$#18!27?@$#27!28?@$#24!29?@$#27!30?@$#11!31?@$#27!32?@$#32!33?@$#23!34?@$#34!35?@@$#32!37?@$#34!38?@@$#32!40?@$#34!41?@$#27!42?@$#11!43?@@@@$#5!47?@$#1!48?@$#11!49?@@$#5!51?@@@$#4!54?@@$#11!56?@@$#19!58?@@$#4!60?@$#11!61?@$#4!62?@@$#11!64?@@@@@$#19!69?@$#18!70?@$#11!71?@$#19!72?@$#18!73?@$#24!74?@$#30!75?@$#37!76?@$#43!77?@$#46!78?@$#63!79?@$#62!80?@$#71!81?@$#73!82?@$#75!83?@$#78!84?@$#72!85?@$#76!86?@@$#73!88?@$#76!89?@@$#71!91?@$#73!92?@$#75!93?@@$#73!95?@@@$#72!98?@$#71!99?@$#62!100?@$#73!101?@$#72!102?@$#71!103?@$#62!104?@$#71!105?@@$#62!107?@@$#76!109?@$#71!110?@$#62!111?@$#71!112?@@$#62!114?@@@@@@$#63!120?@$#62!121?@@@@$#63!125?@@$#62!127?@$#56!128?@@$#63!130?@$#56!131?@$#71!132?@$#56!133?@$#63!134?@$#56!135?@$#63!136?@$#56!137?@@@$#63!140?@$#56!141?@$#57!142?@$#49!143?@$#46!144?@$#45!145?@$#39!146?@$#36!147?@$#21!148?@$#14!149?@$#12!150?@$#14!151?@@@$#21!154?@$#30!155?@$#37!156?@@$#39!158?@@$#43!160?@@$#46!162?@@$#48!164?@$#50!165?@@$#51!167?@$#49!168?@$#52!169?@$#48!170?@$#49!171?@$#48!172?@@$#49!174?@$#48!175?@@@$#50!178?@@@$#46!181?@$#45!182?@$#43!183?@$#39!184?@$#37!185?@$#39!186?@@@$#44!189?@$#49!190?@$#51!191?@@$#57!193?@$#64!194?@$#69!195?@@$#64!197?@@@$#51!200?@@@$#64!203?@$#68!204?@$#64!205?@@$#68!207?@$#70!208?@$#77!209?@$#82!210?@@@$#96!213?@$#104!214?@@@$#109!217?@$#104!218?@$#109!219?@$#131!220?@@$#239!222?@$#254!223?@$#178!224?@@$#171!226?@$#188!227?@$#169!228?@$#157!229?@@$#184!231?@$#171!232?@$#199!233?@$#169!234?@$#185!235?@@$#191!237?@$#184!238?@$#185!239?@$#186!240?@$#189!241?@$#184!242?@$#185!243?@$#188!244?@$#187!245?@@$#188!247?@$#189!248?@@$#178!250?@$#186!251?@$#188!252?@@$#191!254?@$#188!255?@$#189!256?@$#201!257?@$#203!258?@$#191!259?@$#188!260?@$#194!261?@$#197!262?@$#203!263?@@@@@$#27A$#24!1?A$#27!2?A$#5!3?A$#11!4?A$#7!5?A$#11!6?A$#7!7?A$#1!8?AA$#4!10?AA$#1!12?AA$#5!14?A$#7!15?A$#4!16?A$#5!17?A$#11!18?AA$#4!20?AA$#11!22?A$#4!23?AA$#19!25?A$#21!26?A$#24!27?A$#27!28?A$#24!29?A$#22!30?AAA$#36!33?A$#23!34?A$#32!35?A$#23!36?A$#34!37?A$#32!38?A$#34!39?AA$#32!41?A$#27!42?A$#11!43?A$#24!44?A$#11!45?A$#4!46?A$#7!47?AA$#4!49?AA$#11!51?AAA$#4!54?A$#11!55?AAA$#4!58?A$#11!59?AA$#4!61?AA$#18!63?A$#11!64?A$#18!65?AAAAAA$#11!71?A$#18!72?A$#11!73?A$#18!74?A$#36!75?A$#40!76?A$#44!77?A$#50!78?A$#56!79?A$#71!80?AA$#78!82?A$#75!83?A$#78!84?A$#82!85?A$#76!86?A$#75!87?A$#73!88?A$#82!89?A$#76!90?A$#75!91?A$#76!92?AA$#77!94?A$#75!95?A$#76!96?A$#75!97?A$#76!98?A$#74!99?A$#73!100?A$#72!101?A$#73!102?AAA$#74!105?A$#73!106?A$#76!107?A$#71!108?A$#72!109?A$#74!110?A$#73!111?A$#71!112?A$#62!113?A$#71!114?AAAAA$#62!119?A$#71!120?A$#62!121?AAA$#71!124?AAA$#63!127?A$#62!128?AA$#71!130?A$#62!131?AA$#56!133?A$#62!134?AAA$#63!137?AAA$#56!140?AA$#52!142?A$#51!143?A$#48!144?A$#44!145?A$#39!146?A$#37!147?A$#14!148?AAA$#12!151?A$#14!152?AA$#27!154?AA$#36!156?A$#37!157?A$#39!158?AA$#42!160?A$#45!161?AA$#46!163?A$#48!164?A$#50!165?A$#49!166?A$#51!167?A$#50!168?AA$#52!170?A$#49!171?A$#48!172?A$#50!173?A$#48!174?A$#50!175?AA$#49!177?A$#53!178?AA$#52!180?A$#50!181?A$#45!182?A$#44!183?A$#39!184?AAAA$#42!188?A$#45!189?AA$#49!191?A$#51!192?A$#53!193?A$#68!194?A$#69!195?AAA$#64!198?AA$#51!200?AA$#64!202?AAA$#68!205?AA$#69!207?A$#70!208?A$#82!209?AAAA$#95!213?A$#101!214?A$#104!215?AAAA$#109!219?A$#131!220?AA$#234!222?A$#250!223?A$#178!224?AA$#184!226?AA$#169!228?AA$#165!230?A$#169!231?A$#175!232?A$#187!233?A$#175!234?A$#186!235?A$#178!236?A$#185!237?A$#169!238?A$#188!239?A$#175!240?A$#189!241?A$#187!242?A$#188!243?A$#189!244?A$#187!245?AA$#186!247?A$#188!248?AA$#178!250?A$#188!251?AAA$#191!254?A$#188!255?A$#191!256?A$#203!257?A$#189!258?AAAA$#190!262?A$#201!263?A$#203!264?AA$#216!266?A$#203!267?A$#27C$#24!1?C$#4!2?CCC$#7!5?CCC$#1!8?C$#7!9?CC$#11!11?C$#7!12?C$#4!13?CC$#11!15?CCC$#4!18?C$#19!19?C$#4!20?C$#11!21?CCCCC$#24!26?C$#27!27?CC$#30!29?C$#27!30?CCCC$#34!34?C$#36!35?CC$#23!37?C$#34!38?CC$#32!40?CC$#22!42?C$#24!43?CC$#11!45?C$#4!46?CCC$#5!49?C$#19!50?C$#5!51?C$#11!52?C$#4!53?C$#11!54?C$#19!55?C$#18!56?C$#4!57?C$#11!58?CC$#4!60?C$#11!61?CC$#4!63?C$#11!64?C$#4!65?CC$#11!67?C$#18!68?CC$#24!70?CC$#18!72?C$#4!73?C$#18!74?C$#27!75?C$#38!76?C$#44!77?C$#52!78?C$#56!79?C$#72!80?C$#78!81?C$#80!82?C$#82!83?C$#83!84?C$#82!85?CCCCC$#76!90?C$#81!91?C$#82!92?C$#83!93?C$#78!94?CCC$#82!97?C$#75!98?C$#76!99?CCC$#78!102?CC$#76!104?C$#75!105?CC$#73!107?C$#78!108?C$#75!109?C$#76!110?C$#75!111?CCC$#72!114?C$#73!115?CC$#75!117?C$#76!118?C$#73!119?CCCC$#72!123?C$#73!124?C$#74!125?C$#76!126?C$#73!127?CC$#71!129?C$#62!130?C$#71!131?C$#73!132?C$#71!133?C$#62!134?CCCCCCCC$#63!142?C$#52!143?C$#48!144?C$#46!145?C$#42!146?C$#37!147?C$#30!148?C$#14!149?CC$#5!151?C$#14!152?C$#5!153?C$#27!154?C$#21!155?C$#30!156?C$#37!157?CC$#42!159?C$#39!160?C$#43!161?C$#46!162?CC$#50!164?C$#51!165?C$#53!166?C$#52!167?C$#53!168?C$#52!169?C$#50!170?CC$#48!172?C$#50!173?C$#52!174?C$#50!175?C$#53!176?CC$#57!178?CC$#52!180?C$#48!181?CC$#43!183?C$#37!184?CCC$#39!187?CC$#45!189?CC$#51!191?CC$#64!193?C$#69!194?CCC$#68!197?C$#64!198?CC$#51!200?CC$#64!202?CC$#69!204?C$#68!205?C$#64!206?CC$#77!208?CCCC$#82!212?C$#94!213?C$#101!214?C$#104!215?CCC$#109!218?C$#104!219?C$#131!220?CC$#220!222?C$#239!223?C$#178!224?C$#171!225?C$#201!226?C$#175!227?C$#157!228?C$#168!229?C$#149!230?C$#168!231?C$#169!232?C$#142!233?C$#169!234?C$#178!235?C$#185!236?C$#178!237?C$#169!238?C$#178!239?CC$#188!241?C$#185!242?C$#188!243?C$#184!244?C$#189!245?C$#188!246?CC$#186!248?CC$#188!250?C$#184!251?C$#188!252?C$#189!253?C$#191!254?C$#190!255?C$#189!256?C$#203!257?C$#191!258?C$#188!259?CC$#197!261?C$#201!262?CC$#203!264?C$#216!265?C$#203!266?C$#216!267?C$#27G$#24!1?G$#11!2?GGG$#1!5?G$#7!6?G$#1!7?GG$#7!9?G$#11!10?G$#5!11?G$#7!12?G$#4!13?GG$#11!15?GGG$#5!18?G$#11!19?GG$#5!21?G$#11!22?GGGGG$#30!27?G$#24!28?G$#18!29?GG$#22!31?G$#27!32?G$#31!33?G$#32!34?G$#34!35?G$#32!36?GG$#34!38?G$#32!39?G$#23!40?G$#30!41?G$#27!42?G$#24!43?G$#11!44?GGGGGGGGGG$#4!54?G$#11!55?G$#4!56?G$#18!57?G$#4!58?G$#11!59?G$#19!60?G$#18!61?G$#4!62?G$#11!63?G$#4!64?G$#11!65?G$#18!66?G$#11!67?G$#18!68?G$#11!69?G$#19!70?G$#4!71?GG$#11!73?GG$#30!75?G$#39!76?G$#42!77?G$#52!78?G$#62!79?G$#74!80?G$#82!81?G$#83!82?G$#82!83?GG$#81!85?G$#78!86?G$#80!87?G$#81!88?G$#83!89?G$#76!90?G$#82!91?G$#80!92?G$#83!93?G$#80!94?G$#83!95?G$#80!96?G$#78!97?G$#82!98?G$#76!99?GG$#78!101?G$#82!102?G$#78!103?GGG$#76!106?GG$#82!108?G$#78!109?G$#76!110?G$#78!111?G$#76!112?G$#78!113?G$#76!114?GGG$#78!117?G$#76!118?G$#72!119?G$#77!120?G$#74!121?G$#76!122?G$#75!123?G$#73!124?G$#76!125?G$#73!126?G$#74!127?G$#73!128?GGGG$#62!132?G$#73!133?G$#71!134?GGGG$#73!138?G$#62!139?GGG$#63!142?G$#57!143?G$#50!144?G$#45!145?G$#43!146?G$#39!147?G$#30!148?G$#14!149?G$#12!150?G$#14!151?GGG$#27!154?G$#30!155?GG$#37!157?G$#39!158?GG$#43!160?G$#44!161?G$#45!162?G$#49!163?GG$#51!165?G$#52!166?G$#53!167?GG$#52!169?G$#50!170?G$#52!171?G$#49!172?G$#50!173?G$#52!174?G$#57!175?G$#53!176?GGG$#57!179?G$#53!180?G$#52!181?G$#49!182?G$#43!183?G$#39!184?GGGG$#43!188?G$#45!189?G$#46!190?G$#51!191?GG$#64!193?GGG$#69!196?G$#64!197?GG$#51!199?GG$#64!201?GG$#51!203?G$#64!204?GG$#68!206?G$#53!207?G$#69!208?G$#77!209?GG$#82!211?GG$#94!213?G$#101!214?G$#104!215?G$#101!216?G$#104!217?G$#109!218?GG$#111!220?G$#131!221?G$#220!222?G$#222!223?G$#174!224?G$#169!225?G$#184!226?G$#175!227?G$#157!228?G$#175!229?G$#147!230?G$#168!231?G$#169!232?G$#147!233?G$#171!234?GG$#175!236?G$#188!237?G$#168!238?G$#187!239?G$#185!240?G$#188!241?G$#184!242?G$#188!243?G$#189!244?G$#188!245?G$#187!246?G$#189!247?G$#186!248?GG$#188!250?G$#189!251?G$#184!252?G$#188!253?G$#197!254?GG$#201!256?G$#203!257?G$#191!258?G$#189!259?GG$#197!261?G$#201!262?G$#203!263?GGGG$#216!267?G$#22O$#18!1?O$#19!2?O$#4!3?O$#7!4?O$#1!5?O$#7!6?OO$#11!8?OO$#4!10?O$#11!11?O$#5!12?O$#4!13?O$#11!14?O$#19!15?O$#4!16?O$#11!17?OOOO$#19!21?O$#11!22?O$#19!23?O$#4!24?O$#11!25?O$#24!26?O$#18!27?OO$#24!29?O$#27!30?O$#30!31?O$#27!32?O$#30!33?O$#37!34?O$#34!35?O$#36!36?O$#34!37?OO$#23!39?O$#34!40?O$#22!41?O$#30!42?O$#24!43?O$#11!44?O$#19!45?O$#4!46?O$#11!47?OOOO$#4!51?OO$#11!53?OO$#4!55?OOO$#11!58?O$#5!59?OO$#11!61?OOOOOOOOO$#4!70?O$#19!71?OO$#11!73?OO$#30!75?O$#39!76?O$#46!77?O$#57!78?O$#62!79?O$#74!80?O$#78!81?O$#83!82?O$#82!83?OO$#83!85?O$#82!86?O$#83!87?OOOOO$#81!92?O$#80!93?OOO$#78!96?OOO$#82!99?O$#78!100?O$#76!101?O$#75!102?O$#76!103?O$#78!104?OO$#75!106?O$#72!107?O$#78!108?O$#73!109?O$#75!110?O$#76!111?O$#72!112?O$#78!113?O$#73!114?O$#76!115?OO$#74!117?O$#76!118?O$#75!119?O$#76!120?O$#74!121?O$#75!122?O$#73!123?O$#72!124?OO$#77!126?OO$#74!128?O$#73!129?O$#75!130?O$#73!131?O$#72!132?O$#73!133?O$#71!134?OO$#73!136?O$#71!137?O$#62!138?O$#71!139?OO$#62!141?OO$#53!143?O$#49!144?O$#46!145?O$#40!146?O$#39!147?O$#36!148?O$#21!149?O$#14!150?O$#5!151?O$#12!152?O$#14!153?O$#21!154?O$#30!155?OO$#37!157?O$#39!158?OO$#42!160?O$#44!161?O$#45!162?O$#49!163?OO$#50!165?OOO$#52!168?O$#50!169?O$#47!170?O$#48!171?O$#50!172?O$#52!173?O$#50!174?O$#53!175?OO$#57!177?OO$#53!179?O$#52!180?OO$#48!182?O$#43!183?O$#39!184?O$#37!185?O$#39!186?OO$#43!188?O$#45!189?O$#46!190?O$#49!191?O$#51!192?OO$#64!194?O$#68!195?O$#69!196?O$#68!197?OO$#64!199?OO$#51!201?OOO$#64!204?OOOO$#69!208?O$#77!209?OOO$#82!212?OO$#96!214?O$#101!215?OOO$#109!218?OO$#111!220?O$#131!221?O$#220!222?O$#216!223?O$#178!224?O$#171!225?O$#174!226?OO$#157!228?O$#171!229?O$#157!230?O$#169!231?OO$#148!233?O$#174!234?O$#171!235?O$#185!236?O$#184!237?O$#168!238?O$#174!239?O$#184!240?O$#187!241?O$#175!242?O$#188!243?O$#189!244?O$#188!245?OOO$#189!248?O$#178!249?O$#189!250?O$#186!251?O$#188!252?O$#189!253?OO$#201!255?O$#203!256?O$#201!257?OOO$#190!260?O$#197!261?O$#189!262?O$#203!263?OOO$#217!266?O$#203!267?O$#31_$#24!1?_$#11!2?__$#1!4?_$#7!5?_$#11!6?__$#4!8?_$#19!9?_$#11!10?___$#4!13?_$#19!14?_$#11!15?_$#5!16?_$#4!17?_$#11!18?______$#19!24?_$#11!25?_$#27!26?_$#24!27?__$#18!29?__$#22!31?_$#27!32?_$#32!33?_$#36!34?_$#34!35?_$#32!36?_$#30!37?_$#34!38?_$#32!39?__$#30!41?_$#27!42?_$#18!43?__$#21!45?_$#11!46?_______$#4!53?_____$#11!58?__$#4!60?__$#11!62?_$#18!63?_$#11!64?_$#18!65?_$#11!66?_$#4!67?_$#11!68?__$#4!70?_$#19!71?_$#11!72?__$#19!74?_$#30!75?_$#39!76?_$#42!77?_$#50!78?_$#62!79?_$#75!80?_$#78!81?_$#81!82?_$#82!83?__$#78!85?_$#82!86?_$#76!87?_$#81!88?_$#82!89?_$#76!90?_$#83!91?_$#78!92?_$#80!93?_$#75!94?_$#83!95?_$#81!96?_$#80!97?_$#76!98?_$#78!99?_$#76!100?__$#73!102?__$#76!104?__$#75!106?_$#76!107?_$#73!108?_$#72!109?_$#78!110?_$#73!111?_$#76!112?_$#75!113?__$#73!115?_$#76!116?_$#75!117?_$#72!118?_$#74!119?_$#73!120?_$#71!121?__$#73!123?__$#72!125?_$#73!126?_$#74!127?_$#73!128?_$#62!129?_$#72!130?_$#74!131?_$#72!132?_$#73!133?_$#71!134?__$#62!136?_$#71!137?___$#62!140?__$#71!142?_$#57!143?_$#49!144?_$#45!145?_$#44!146?_$#36!147?_$#30!148?_$#14!149?_$#12!150?__$#14!152?__$#21!154?__$#30!156?_$#39!157?___$#42!160?_$#43!161?_$#45!162?_$#46!163?_$#49!164?_$#50!165?___$#52!168?_$#48!169?_$#50!170?_$#51!171?_$#48!172?_$#52!173?____$#53!177?__$#57!179?_$#52!180?__$#46!182?_$#45!183?_$#43!184?_$#39!185?___$#44!188?_$#46!189?_$#49!190?__$#51!192?_$#64!193?__$#69!195?_$#68!196?_$#69!197?_$#68!198?_$#51!199?__$#64!201?__$#51!203?_$#64!204?_$#68!205?__$#64!207?_$#69!208?_$#77!209?___$#82!212?_$#94!213?_$#101!214?_$#104!215?_$#96!216?_$#104!217?_$#109!218?__$#111!220?_$#131!221?_$#220!222?_$#203!223?_$#178!224?_$#169!225?_$#175!226?_$#169!227?_$#157!228?_$#169!229?_$#157!230?_$#169!231?_$#168!232?_$#157!233?_$#174!234?_$#184!235?___$#171!238?_$#175!239?_$#188!240?__$#184!242?_$#189!243?_$#188!244?_$#187!245?_$#188!246?_____$#189!251?_$#186!252?_$#191!253?_$#190!254?_$#188!255?_$#203!256?___$#197!259?_$#190!260?__$#197!262?_$#203!263?_$#201!264?__$#216!266?_$#203!267?_$-#23@$#18!1?@$#11!2?@$#4!3?@$#7!4?@$#4!5?@@$#11!7?@@$#4!9?@@$#11!11?@@@@$#4!15?@@@$#11!18?@@$#5!20?@$#11!21?@@@@$#18!25?@@$#27!27?@$#22!28?@$#11!29?@$#22!30?@$#30!31?@@$#32!33?@$#34!34?@$#32!35?@$#36!36?@@$#32!38?@$#23!39?@$#34!40?@$#23!41?@$#27!42?@@$#24!44?@$#19!45?@$#11!46?@@@$#19!49?@$#4!50?@$#11!51?@@$#4!53?@@@@$#5!57?@$#4!58?@$#11!59?@$#4!60?@@@$#11!63?@@$#4!65?@$#11!66?@$#4!67?@$#11!68?@$#5!69?@$#11!70?@@@@$#18!74?@$#22!75?@$#39!76?@$#43!77?@$#50!78?@$#62!79?@$#72!80?@$#76!81?@$#78!82?@$#82!83?@$#78!84?@$#82!85?@$#76!86?@$#82!87?@@@$#78!90?@@$#82!92?@$#80!93?@$#75!94?@$#78!95?@$#82!96?@$#76!97?@$#78!98?@$#76!99?@$#75!100?@$#73!101?@@@@$#76!105?@$#72!106?@$#74!107?@$#75!108?@$#73!109?@$#75!110?@$#71!111?@$#75!112?@$#72!113?@$#71!114?@@$#72!116?@$#71!117?@$#62!118?@@$#73!120?@$#71!121?@@@@@$#73!126?@@@@$#71!130?@$#72!131?@$#71!132?@$#72!133?@$#62!134?@@@$#56!137?@$#71!138?@$#62!139?@@@@$#53!143?@$#50!144?@$#45!145?@$#42!146?@$#37!147?@$#30!148?@$#14!149?@$#12!150?@@@$#14!153?@$#21!154?@$#27!155?@$#36!156?@@$#37!158?@$#39!159?@$#42!160?@$#43!161?@$#45!162?@@$#46!164?@$#51!165?@$#50!166?@@$#47!168?@$#50!169?@$#48!170?@$#49!171?@$#46!172?@$#49!173?@$#52!174?@@@$#57!177?@$#52!178?@$#53!179?@$#52!180?@$#50!181?@$#49!182?@$#43!183?@$#39!184?@$#37!185?@@$#39!187?@$#43!188?@$#45!189?@$#50!190?@$#45!191?@$#46!192?@$#51!193?@$#64!194?@$#69!195?@@@$#68!198?@$#51!199?@@@@@$#64!204?@@$#68!206?@$#64!207?@$#68!208?@$#77!209?@$#82!210?@$#77!211?@@$#82!213?@$#96!214?@$#101!215?@$#96!216?@$#104!217?@@$#109!219?@@$#131!221?@$#220!222?@$#186!223?@$#174!224?@$#169!225?@@$#174!227?@$#168!228?@@$#157!230?@$#168!231?@$#171!232?@$#169!233?@$#175!234?@@$#184!236?@@$#157!238?@$#184!239?@$#188!240?@$#175!241?@@$#188!243?@@@$#187!246?@$#189!247?@$#178!248?@$#185!249?@$#186!250?@$#189!251?@@$#191!253?@$#189!254?@$#191!255?@$#201!256?@$#203!257?@@@$#191!260?@$#197!261?@@$#194!263?@$#216!264?@@@@$#27A$#18!1?A$#19!2?A$#4!3?A$#7!4?A$#11!5?A$#19!6?A$#4!7?A$#11!8?A$#19!9?A$#4!10?AAA$#11!13?A$#4!14?A$#21!15?A$#11!16?AA$#4!18?A$#11!19?AAA$#4!22?A$#19!23?A$#24!24?A$#18!25?A$#27!26?AA$#30!28?A$#22!29?A$#23!30?AA$#32!32?A$#34!33?AA$#32!35?A$#34!36?A$#32!37?A$#34!38?A$#36!39?A$#32!40?A$#27!41?AAA$#18!44?A$#19!45?A$#11!46?A$#21!47?A$#19!48?A$#4!49?A$#11!50?AAA$#4!53?A$#11!54?A$#4!55?AA$#5!57?AA$#4!59?A$#5!60?AA$#11!62?A$#5!63?A$#11!64?AA$#4!66?A$#11!67?AAAA$#4!71?A$#11!72?AAA$#27!75?A$#37!76?A$#43!77?A$#50!78?A$#56!79?A$#62!80?A$#73!81?A$#78!82?A$#76!83?A$#78!84?AA$#82!86?A$#76!87?A$#82!88?AA$#76!90?AAA$#78!93?AA$#73!95?AAA$#74!98?A$#75!99?A$#73!100?A$#76!101?A$#73!102?AAA$#74!105?A$#73!106?AA$#71!108?AA$#73!110?AA$#74!112?A$#71!113?AAA$#62!116?A$#71!117?AA$#62!119?AA$#71!121?A$#62!122?A$#71!123?A$#62!124?A$#72!125?A$#71!126?AA$#62!128?A$#71!129?AAA$#62!132?AAAAAAAAA$#56!141?AA$#52!143?A$#49!144?A$#44!145?A$#39!146?A$#37!147?A$#21!148?A$#12!149?AAA$#14!152?AAA$#27!155?A$#36!156?A$#37!157?AA$#39!159?A$#42!160?AA$#45!162?A$#46!163?A$#49!164?A$#50!165?A$#49!166?A$#52!167?A$#49!168?A$#48!169?A$#51!170?AA$#50!172?A$#46!173?A$#51!174?A$#53!175?AA$#52!177?A$#53!178?A$#52!179?A$#50!180?AA$#48!182?A$#44!183?A$#39!184?AAAA$#44!188?A$#45!189?A$#49!190?AA$#51!192?A$#64!193?A$#68!194?A$#69!195?AAA$#64!198?AAA$#51!201?AA$#49!203?A$#51!204?A$#68!205?A$#64!206?AA$#63!208?A$#77!209?AAAA$#95!213?AA$#101!215?AA$#104!217?A$#109!218?AAA$#131!221?A$#220!222?A$#171!223?AA$#169!225?A$#174!226?A$#169!227?A$#175!228?A$#157!229?A$#168!230?AA$#169!232?A$#171!233?A$#175!234?AAAA$#168!238?A$#184!239?A$#188!240?A$#187!241?A$#175!242?A$#188!243?AA$#187!245?A$#188!246?A$#189!247?AA$#186!249?A$#188!250?A$#186!251?A$#189!252?A$#191!253?A$#189!254?A$#191!255?AA$#203!257?AAAA$#191!261?A$#189!262?A$#201!263?A$#203!264?A$#216!265?AAA$#22C$#18!1?C$#19!2?C$#11!3?C$#19!4?C$#5!5?C$#4!6?C$#11!7?CCCCCCC$#4!14?C$#19!15?C$#11!16?CCC$#21!19?C$#11!20?CCCCC$#18!25?C$#24!26?CC$#27!28?C$#22!29?C$#27!30?C$#32!31?C$#34!32?C$#32!33?C$#31!34?C$#23!35?C$#32!36?C$#36!37?C$#31!38?C$#27!39?C$#34!40?C$#31!41?C$#27!42?C$#24!43?C$#18!44?C$#19!45?C$#4!46?C$#11!47?CCC$#4!50?CC$#11!52?C$#4!53?CCCCC$#5!58?C$#4!59?CC$#5!61?C$#11!62?CC$#4!64?CCCCCCCCCC$#19!74?C$#22!75?C$#37!76?C$#43!77?C$#48!78?C$#56!79?C$#71!80?C$#73!81?C$#82!82?C$#76!83?CCCC$#78!87?CCCC$#76!91?CC$#78!93?CCC$#72!96?C$#73!97?C$#72!98?CCC$#73!101?C$#74!102?C$#73!103?CCCCC$#62!108?C$#73!109?CC$#75!111?C$#72!112?C$#71!113?C$#62!114?CCC$#71!117?C$#62!118?C$#71!119?C$#62!120?C$#71!121?C$#62!122?CCC$#71!125?CC$#62!127?C$#71!128?C$#62!129?C$#71!130?C$#62!131?CC$#56!133?C$#62!134?CC$#63!136?C$#62!137?CC$#56!139?C$#63!140?C$#62!141?C$#55!142?C$#52!143?C$#46!144?C$#45!145?C$#39!146?C$#30!147?C$#14!148?CC$#5!150?C$#12!151?C$#14!152?C$#21!153?C$#12!154?C$#21!155?C$#36!156?C$#30!157?C$#39!158?CC$#43!160?C$#44!161?C$#45!162?C$#46!163?C$#49!164?C$#48!165?C$#50!166?C$#49!167?CC$#50!169?C$#45!170?C$#46!171?C$#48!172?C$#49!173?C$#47!174?C$#52!175?C$#50!176?CC$#52!178?C$#48!179?C$#52!180?C$#49!181?C$#48!182?C$#44!183?C$#39!184?CC$#37!186?C$#39!187?C$#44!188?C$#45!189?C$#46!190?C$#49!191?C$#50!192?C$#64!193?C$#69!194?CC$#68!196?CCC$#64!199?CC$#51!201?CCCC$#64!205?C$#51!206?C$#53!207?C$#64!208?C$#74!209?C$#77!210?CC$#74!212?C$#82!213?C$#101!214?CC$#96!216?C$#101!217?C$#104!218?C$#109!219?CC$#131!221?C$#217!222?C$#169!223?C$#171!224?C$#169!225?C$#175!226?C$#169!227?C$#157!228?CCCC$#169!232?C$#175!233?C$#178!234?C$#174!235?C$#189!236?C$#184!237?C$#168!238?C$#187!239?C$#188!240?C$#184!241?CC$#188!243?C$#197!244?C$#187!245?C$#189!246?CC$#178!248?CC$#189!250?CCC$#188!253?C$#189!254?C$#191!255?C$#203!256?CCCC$#206!260?C$#193!261?C$#197!262?C$#201!263?C$#203!264?CCCC$#18GG$#11!2?GG$#19!4?G$#11!5?GGGG$#19!9?G$#4!10?G$#11!11?GGGG$#19!15?G$#11!16?GG$#19!18?G$#18!19?GGG$#19!22?G$#11!23?G$#18!24?G$#11!25?GG$#24!27?G$#27!28?G$#18!29?G$#30!30?GG$#27!32?G$#34!33?G$#32!34?GG$#23!36?G$#36!37?G$#34!38?G$#23!39?G$#32!40?G$#27!41?G$#22!42?G$#24!43?GG$#21!45?G$#19!46?G$#11!47?GG$#4!49?G$#11!50?G$#4!51?G$#11!52?G$#5!53?G$#11!54?GG$#5!56?G$#4!57?G$#5!58?G$#4!59?GGGGG$#11!64?GGG$#5!67?G$#4!68?G$#11!69?G$#19!70?G$#11!71?G$#19!72?G$#11!73?GG$#27!75?G$#37!76?G$#42!77?G$#48!78?G$#57!79?G$#71!80?G$#76!81?G$#78!82?GGG$#82!85?GG$#78!87?GGG$#76!90?G$#78!91?G$#82!92?G$#72!93?G$#73!94?G$#77!95?G$#74!96?G$#76!97?GG$#71!99?G$#75!100?G$#71!101?G$#74!102?G$#73!103?GGG$#74!106?G$#73!107?G$#72!108?G$#73!109?G$#72!110?GG$#62!112?G$#71!113?G$#62!114?G$#71!115?G$#62!116?GGGG$#56!120?G$#62!121?GGGGGG$#71!127?G$#62!128?GGGGGG$#71!134?G$#62!135?G$#56!136?G$#62!137?G$#63!138?G$#62!139?G$#63!140?G$#56!141?G$#55!142?G$#50!143?G$#44!144?G$#43!145?G$#39!146?G$#30!147?G$#14!148?G$#12!149?GG$#5!151?G$#12!152?G$#14!153?G$#27!154?GG$#36!156?G$#39!157?GGG$#43!160?G$#44!161?G$#45!162?GG$#46!164?G$#50!165?G$#52!166?G$#50!167?GGG$#46!170?G$#47!171?GG$#52!173?G$#49!174?G$#52!175?G$#50!176?G$#52!177?GG$#57!179?G$#52!180?G$#47!181?G$#46!182?G$#43!183?G$#42!184?G$#37!185?G$#39!186?GG$#44!188?G$#46!189?GG$#49!191?G$#46!192?G$#64!193?GG$#69!195?GG$#64!197?GGG$#68!200?G$#51!201?GGGG$#64!205?GG$#51!207?G$#69!208?G$#70!209?G$#77!210?GGG$#95!213?GG$#96!215?G$#101!216?GG$#104!218?GG$#109!220?G$#131!221?G$#203!222?G$#171!223?G$#157!224?G$#171!225?G$#174!226?G$#168!227?GG$#157!229?G$#168!230?GGG$#178!233?G$#184!234?GG$#187!236?G$#174!237?G$#175!238?G$#174!239?G$#188!240?G$#175!241?G$#185!242?G$#189!243?G$#197!244?G$#187!245?G$#188!246?G$#185!247?G$#186!248?G$#189!249?GGG$#188!252?G$#191!253?GG$#190!255?G$#203!256?GGGG$#191!260?G$#197!261?G$#201!262?G$#190!263?G$#203!264?GGGG$#24OO$#11!2?OOOOO$#4!7?O$#11!8?OOO$#18!11?O$#11!12?O$#4!13?OO$#11!15?O$#4!16?OOO$#11!19?OO$#24!21?O$#18!22?O$#11!23?O$#18!24?O$#11!25?O$#18!26?O$#24!27?OOO$#27!30?O$#22!31?O$#30!32?O$#32!33?O$#36!34?O$#23!35?O$#32!36?O$#36!37?OO$#32!39?OO$#31!41?O$#27!42?O$#24!43?OO$#11!45?OOOO$#19!49?O$#4!50?O$#11!51?OOOO$#4!55?O$#5!56?OO$#4!58?O$#11!59?OOOO$#19!63?O$#11!64?OO$#4!66?O$#11!67?OOO$#4!70?OO$#5!72?O$#11!73?O$#4!74?O$#18!75?O$#27!76?O$#42!77?O$#50!78?O$#56!79?O$#71!80?O$#73!81?O$#78!82?O$#82!83?OOOOOO$#78!89?O$#82!90?O$#78!91?OO$#76!93?O$#75!94?O$#77!95?OO$#76!97?OO$#75!99?O$#78!100?O$#77!101?O$#73!102?O$#71!103?O$#73!104?O$#76!105?OO$#75!107?O$#74!108?OOO$#73!111?O$#62!112?O$#73!113?O$#71!114?OOO$#62!117?O$#71!118?O$#62!119?O$#56!120?O$#62!121?O$#71!122?OO$#62!124?O$#71!125?O$#62!126?OOO$#71!129?O$#62!130?OOOOO$#56!135?O$#62!136?OOOO$#56!140?O$#62!141?O$#56!142?O$#52!143?O$#45!144?O$#43!145?O$#39!146?O$#30!147?O$#21!148?O$#14!149?O$#12!150?OO$#14!152?OO$#21!154?O$#30!155?O$#36!156?OO$#39!158?O$#42!159?OO$#43!161?O$#45!162?OO$#49!164?OO$#47!166?O$#52!167?O$#49!168?O$#48!169?O$#46!170?O$#48!171?O$#47!172?O$#50!173?O$#48!174?O$#53!175?O$#50!176?O$#53!177?OOO$#48!180?O$#50!181?O$#46!182?O$#45!183?O$#39!184?OOO$#42!187?O$#44!188?O$#45!189?O$#43!190?O$#49!191?OO$#64!193?O$#69!194?OOO$#64!197?OOO$#51!200?OOOOO$#64!205?OOOO$#70!209?O$#74!210?O$#77!211?OO$#82!213?O$#96!214?O$#101!215?O$#95!216?OO$#104!218?O$#109!219?OO$#131!221?O$#191!222?O$#171!223?OO$#157!225?O$#169!226?O$#157!227?O$#169!228?O$#168!229?O$#157!230?O$#169!231?O$#157!232?O$#184!233?O$#175!234?O$#185!235?O$#184!236?O$#187!237?O$#184!238?O$#187!239?OO$#171!241?O$#184!242?O$#197!243?O$#189!244?O$#188!245?O$#189!246?OO$#186!248?O$#189!249?OO$#188!251?O$#197!252?O$#191!253?O$#189!254?OO$#203!256?OOOO$#201!260?OO$#197!262?O$#206!263?O$#203!264?O$#216!265?OO$#206!267?O$#21_$#11!1?__$#19!3?_$#4!4?_$#19!5?_$#4!6?__$#11!8?_$#4!9?_$#11!10?__$#5!12?_$#11!13?__$#19!15?_$#11!16?_$#19!17?_$#11!18?___$#18!21?_$#4!22?_$#19!23?_$#18!24?_$#11!25?_$#24!26?_$#18!27?_$#24!28?_$#30!29?_$#27!30?___$#31!33?_$#27!34?__$#31!36?_$#32!37?_$#30!38?_$#31!39?_$#30!40?_$#22!41?_$#18!42?_$#24!43?_$#18!44?__$#11!46?_$#4!47?_$#11!48?_$#21!49?_$#18!50?_$#11!51?_$#4!52?___$#5!55?_$#4!56?__$#11!58?_$#5!59?_$#4!60?_$#5!61?_$#4!62?_$#5!63?_$#4!64?_$#11!65?___$#4!68?__$#19!70?_$#4!71?_$#11!72?__$#5!74?_$#18!75?_$#36!76?_$#40!77?_$#48!78?_$#56!79?_$#74!80?_$#75!81?_$#82!82?_$#83!83?_$#78!84?_$#80!85?_$#83!86?_$#78!87?_$#81!88?_$#83!89?_$#82!90?_$#83!91?__$#80!93?_$#78!94?_$#81!95?_$#78!96?_$#76!97?_$#80!98?_$#76!99?_$#78!100?_$#76!101?___$#78!104?_$#82!105?_$#76!106?_$#78!107?_$#75!108?_$#73!109?___$#74!112?_$#75!113?_$#71!114?_$#73!115?_$#71!116?____$#72!120?_$#62!121?_$#71!122?_____$#72!127?_$#62!128?_$#73!129?_$#72!130?_$#62!131?_$#71!132?_$#72!133?__$#62!135?__$#72!137?_$#71!138?_$#56!139?_$#62!140?__$#56!142?_$#50!143?_$#46!144?_$#45!145?_$#37!146?_$#30!147?_$#21!148?_$#12!149?___$#14!152?___$#36!155?__$#37!157?_$#44!158?_$#39!159?_$#43!160?__$#45!162?_$#46!163?_$#48!164?__$#50!166?_$#52!167?_$#51!168?_$#50!169?_$#52!170?_$#48!171?_$#52!172?_$#53!173?_$#52!174?__$#57!176?_$#52!177?_$#63!178?_$#55!179?_$#53!180?_$#52!181?_$#50!182?_$#43!183?_$#39!184?___$#43!187?_$#44!188?_$#45!189?__$#49!191?_$#45!192?_$#51!193?_$#68!194?_$#69!195?___$#64!198?__$#51!200?_$#64!201?_$#51!202?___$#64!205?___$#69!208?_$#77!209?____$#82!213?_$#96!214?_$#101!215?_$#96!216?_$#104!217?__$#109!219?__$#131!221?_$#184!222?_$#147!223?__$#157!225?_$#169!226?__$#157!228?_$#168!229?__$#169!231?__$#178!233?_$#184!234?_$#188!235?_$#186!236?_$#187!237?_$#175!238?_$#187!239?_$#188!240?_$#168!241?_$#175!242?_$#197!243?_$#187!244?_$#175!245?_$#188!246?_$#189!247?_$#186!248?_$#189!249?_$#191!250?_$#188!251?_$#190!252?__$#186!254?_$#191!255?_$#189!256?_$#203!257?___$#190!260?_$#194!261?__$#203!263?__$#216!265?_$#203!266?_$#206!267?_$-#11@@$#4!2?@$#11!3?@@$#4!5?@@$#5!7?@$#4!8?@$#11!9?@@@@@$#19!14?@@$#11!16?@@@$#18!19?@$#24!20?@$#18!21?@$#19!22?@@$#18!24?@$#27!25?@$#18!26?@$#24!27?@$#27!28?@@$#30!30?@$#27!31?@$#30!32?@$#27!33?@$#30!34?@$#27!35?@$#30!36?@$#31!37?@$#30!38?@@$#27!40?@$#22!41?@$#27!42?@$#18!43?@@$#19!45?@$#11!46?@@$#4!48?@$#19!49?@$#11!50?@@@$#5!53?@$#4!54?@@$#5!56?@@@$#4!59?@$#5!60?@$#4!61?@@@$#11!64?@$#4!65?@@$#11!67?@$#4!68?@$#5!69?@$#4!70?@$#11!71?@$#4!72?@$#19!73?@$#11!74?@$#27!75?@$#36!76?@$#41!77?@$#48!78?@$#62!79?@$#72!80?@$#75!81?@$#83!82?@@@@$#94!86?@$#83!87?@@$#93!89?@$#83!90?@@@$#93!93?@$#83!94?@$#80!95?@$#81!96?@$#78!97?@$#83!98?@@$#80!100?@$#81!101?@$#83!102?@$#81!103?@$#80!104?@@@$#78!107?@@@$#74!110?@$#76!111?@@$#73!113?@$#76!114?@$#73!115?@$#74!116?@$#73!117?@@$#74!119?@@@$#73!122?@$#72!123?@$#75!124?@@@$#73!127?@@$#76!129?@$#73!130?@@@@$#71!134?@@@@$#62!138?@$#71!139?@@$#62!141?@@$#52!143?@$#48!144?@$#46!145?@$#39!146?@$#30!147?@$#14!148?@$#12!149?@@@$#14!152?@@$#21!154?@$#27!155?@$#36!156?@$#37!157?@$#43!158?@$#42!159?@$#40!160?@$#45!161?@$#44!162?@$#46!163?@$#50!164?@$#51!165?@$#49!166?@$#51!167?@$#50!168?@@$#47!170?@$#53!171?@$#50!172?@$#52!173?@@$#57!175?@$#56!176?@@$#57!178?@$#56!179?@$#57!180?@$#53!181?@$#48!182?@$#42!183?@$#39!184?@@@$#43!187?@@$#39!189?@$#43!190?@$#44!191?@$#49!192?@$#51!193?@$#64!194?@$#69!195?@@@$#64!198?@$#51!199?@$#64!200?@@$#51!202?@@@$#64!205?@$#68!206?@$#51!207?@$#57!208?@$#69!209?@$#77!210?@@@$#94!213?@$#95!214?@$#101!215?@@@$#104!218?@$#109!219?@@$#131!221?@$#178!222?@$#157!223?@@@$#169!226?@$#157!227?@@$#168!229?@@$#174!231?@$#175!232?@@$#185!234?@$#186!235?@$#188!236?@$#187!237?@$#175!238?@$#187!239?@$#184!240?@$#175!241?@$#184!242?@$#188!243?@$#193!244?@$#174!245?@$#189!246?@@$#186!248?@$#189!249?@$#188!250?@$#189!251?@$#190!252?@$#189!253?@$#190!254?@@$#201!256?@@$#191!258?@$#203!259?@$#197!260?@$#203!261?@$#201!262?@$#190!263?@$#203!264?@$#201!265?@$#203!266?@$#206!267?@$#11A$#4!1?A$#11!2?A$#4!3?AAA$#5!6?A$#4!7?A$#11!8?A$#4!9?AA$#11!11?A$#4!12?A$#11!13?A$#4!14?A$#19!15?AAA$#24!18?A$#11!19?A$#18!20?AAA$#19!23?A$#24!24?A$#27!25?A$#18!26?A$#27!27?AA$#22!29?A$#27!30?AA$#30!32?AA$#36!34?A$#30!35?AAA$#31!38?A$#30!39?AA$#22!41?AA$#24!43?A$#18!44?A$#19!45?A$#4!46?A$#11!47?A$#19!48?AA$#11!50?AA$#4!52?A$#5!53?A$#11!54?A$#1!55?AA$#5!57?AA$#1!59?A$#7!60?AA$#11!62?A$#5!63?A$#4!64?A$#11!65?AA$#4!67?AAA$#7!70?A$#4!71?A$#11!72?AAA$#18!75?A$#37!76?A$#42!77?A$#47!78?A$#56!79?A$#78!80?A$#80!81?A$#94!82?AAAA$#95!86?A$#93!87?AA$#83!89?A$#93!90?A$#94!91?A$#95!92?A$#93!93?A$#83!94?A$#93!95?A$#94!96?A$#83!97?A$#93!98?A$#83!99?A$#94!100?A$#93!101?A$#81!102?A$#83!103?AAA$#81!106?A$#80!107?A$#81!108?AA$#80!110?AA$#82!112?AA$#78!114?A$#76!115?A$#75!116?A$#72!117?A$#75!118?A$#73!119?A$#76!120?A$#78!121?A$#76!122?A$#72!123?A$#76!124?A$#78!125?AA$#76!127?A$#75!128?A$#78!129?A$#76!130?A$#73!131?A$#72!132?A$#73!133?A$#76!134?A$#73!135?AAA$#62!138?A$#73!139?AA$#71!141?A$#62!142?A$#57!143?A$#52!144?A$#45!145?A$#37!146?AA$#21!148?A$#12!149?AA$#14!151?AAA$#27!154?A$#30!155?A$#37!156?AA$#43!158?A$#40!159?A$#43!160?A$#44!161?A$#46!162?A$#49!163?A$#50!164?AA$#53!166?A$#50!167?A$#57!168?A$#52!169?AAAA$#53!173?A$#50!174?A$#55!175?A$#56!176?AAA$#57!179?A$#53!180?AA$#50!182?A$#44!183?A$#39!184?A$#37!185?A$#42!186?A$#39!187?A$#43!188?A$#39!189?AA$#44!191?A$#51!192?AA$#68!194?A$#69!195?A$#70!196?A$#68!197?A$#51!198?A$#64!199?A$#51!200?AAAAA$#64!205?AAA$#68!208?A$#70!209?A$#77!210?AAA$#82!213?AA$#96!215?AA$#101!217?A$#104!218?A$#109!219?AA$#131!221?A$#169!222?AA$#157!224?AA$#169!226?A$#157!227?A$#169!228?A$#168!229?A$#157!230?A$#171!231?AA$#175!233?A$#186!234?A$#188!235?A$#186!236?A$#189!237?A$#184!238?A$#175!239?A$#184!240?A$#174!241?A$#184!242?A$#186!243?A$#184!244?A$#187!245?A$#186!246?A$#188!247?A$#186!248?A$#189!249?A$#188!250?AA$#190!252?A$#203!253?A$#189!254?A$#201!255?A$#203!256?A$#201!257?A$#203!258?A$#191!259?A$#197!260?A$#191!261?A$#197!262?A$#203!263?AAAAA$#24C$#11!1?CC$#19!3?C$#4!4?CCCC$#11!8?C$#4!9?CC$#11!11?CCCCCCC$#18!18?CC$#24!20?C$#11!21?CC$#21!23?C$#24!24?C$#27!25?CC$#24!27?CCC$#27!30?CC$#30!32?C$#22!33?C$#31!34?C$#36!35?C$#32!36?CCC$#34!39?C$#27!40?C$#18!41?C$#22!42?C$#24!43?C$#18!44?C$#21!45?C$#11!46?CC$#19!48?C$#4!49?C$#11!50?C$#4!51?C$#5!52?CC$#1!54?C$#7!55?C$#1!56?C$#5!57?C$#7!58?C$#5!59?C$#1!60?C$#7!61?C$#4!62?CCCCC$#11!67?C$#4!68?C$#11!69?C$#4!70?C$#11!71?CCC$#4!74?C$#19!75?C$#36!76?C$#43!77?C$#47!78?C$#62!79?C$#72!80?C$#80!81?C$#93!82?C$#83!83?C$#94!84?C$#83!85?C$#94!86?CCCCC$#95!91?C$#94!92?CC$#93!94?C$#83!95?C$#81!96?C$#83!97?CCCCC$#81!102?C$#83!103?CC$#80!105?C$#93!106?C$#83!107?C$#80!108?C$#83!109?CC$#76!111?C$#83!112?C$#78!113?C$#82!114?C$#76!115?C$#82!116?C$#76!117?C$#78!118?CC$#80!120?CCC$#83!123?C$#82!124?C$#80!125?CC$#82!127?C$#81!128?C$#78!129?C$#76!130?C$#82!131?C$#72!132?C$#74!133?C$#78!134?C$#73!135?C$#72!136?CC$#74!138?C$#73!139?C$#71!140?C$#62!141?CC$#56!143?C$#53!144?C$#46!145?C$#40!146?C$#37!147?C$#27!148?C$#14!149?C$#5!150?C$#12!151?C$#14!152?CCC$#30!155?C$#37!156?CC$#45!158?C$#39!159?C$#42!160?C$#45!161?CC$#49!163?C$#51!164?C$#52!165?C$#64!166?C$#57!167?C$#53!168?C$#52!169?CC$#50!171?C$#53!172?C$#57!173?CC$#63!175?C$#82!176?C$#62!177?C$#57!178?CCC$#48!181?C$#49!182?C$#44!183?C$#39!184?CCCC$#42!188?C$#43!189?C$#42!190?C$#45!191?C$#49!192?C$#51!193?C$#68!194?C$#69!195?CC$#68!197?C$#64!198?CCCC$#51!202?CC$#64!204?CCCCC$#70!209?CC$#77!211?C$#82!212?CC$#94!214?C$#95!215?C$#101!216?CC$#104!218?C$#109!219?CC$#131!221?C$#157!222?C$#169!223?C$#157!224?C$#147!225?C$#157!226?C$#169!227?C$#157!228?CC$#169!230?C$#171!231?C$#169!232?CC$#178!234?CCC$#185!237?C$#174!238?C$#175!239?CCC$#185!242?C$#188!243?C$#187!244?C$#175!245?C$#189!246?C$#191!247?C$#189!248?CC$#201!250?C$#190!251?C$#201!252?CC$#191!254?CC$#201!256?C$#203!257?C$#201!258?C$#203!259?C$#197!260?C$#191!261?C$#203!262?CC$#201!264?CCC$#206!267?C$#18G$#19!1?G$#5!2?G$#11!3?GG$#19!5?G$#11!6?G$#4!7?GG$#11!9?GGGGG$#4!14?G$#19!15?G$#4!16?G$#11!17?G$#18!18?G$#19!19?G$#11!20?GGGG$#27!24?G$#18!25?G$#27!26?G$#18!27?G$#24!28?G$#27!29?GG$#22!31?G$#23!32?G$#30!33?GG$#32!35?GGG$#34!38?G$#22!39?G$#30!40?G$#27!41?G$#24!42?G$#11!43?G$#18!44?G$#11!45?GGGGG$#4!50?G$#11!51?G$#4!52?G$#7!53?G$#1!54?GG$#5!56?GGGG$#1!60?G$#7!61?GG$#4!63?G$#11!64?G$#4!65?GG$#11!67?G$#4!68?GG$#11!70?GG$#4!72?G$#11!73?GG$#30!75?G$#37!76?G$#42!77?G$#47!78?G$#56!79?G$#73!80?G$#81!81?G$#83!82?G$#93!83?GG$#94!85?G$#93!86?GG$#95!88?G$#93!89?G$#94!90?G$#93!91?GG$#83!93?GGGGG$#81!98?G$#83!99?GGG$#80!102?G$#83!103?G$#81!104?G$#83!105?G$#78!106?G$#83!107?GG$#93!109?G$#83!110?G$#80!111?G$#81!112?G$#82!113?G$#78!114?GG$#82!116?G$#78!117?GG$#73!119?G$#78!120?GGGG$#80!124?GGG$#78!127?G$#75!128?G$#76!129?G$#75!130?G$#73!131?G$#78!132?G$#72!133?G$#75!134?GGG$#72!137?GGG$#74!140?G$#71!141?G$#62!142?G$#56!143?G$#63!144?G$#46!145?G$#43!146?G$#37!147?G$#21!148?G$#12!149?GGG$#14!152?G$#21!153?G$#27!154?G$#30!155?G$#36!156?G$#39!157?G$#77!158?G$#43!159?G$#45!160?G$#43!161?G$#45!162?G$#49!163?G$#50!164?G$#48!165?G$#101!166?G$#53!167?G$#49!168?G$#50!169?GGG$#52!172?GG$#53!174?G$#70!175?G$#48!176?G$#56!177?G$#57!178?G$#56!179?G$#52!180?GG$#49!182?G$#44!183?G$#42!184?G$#39!185?GG$#42!187?G$#39!188?G$#43!189?G$#44!190?G$#46!191?G$#51!192?G$#64!193?G$#68!194?G$#69!195?GG$#68!197?G$#64!198?GGGG$#51!202?G$#49!203?G$#51!204?G$#64!205?GGG$#51!208?G$#70!209?G$#77!210?GGG$#82!213?G$#94!214?G$#95!215?G$#96!216?G$#101!217?G$#104!218?G$#109!219?GG$#131!221?G$#147!222?G$#157!223?GG$#147!225?G$#157!226?GGG$#147!229?G$#157!230?G$#171!231?G$#157!232?GG$#175!234?G$#174!235?G$#178!236?G$#175!237?G$#171!238?G$#184!239?G$#187!240?G$#174!241?G$#185!242?G$#188!243?G$#187!244?G$#175!245?G$#186!246?G$#188!247?G$#186!248?G$#188!249?G$#189!250?GG$#201!252?G$#203!253?GG$#191!255?G$#203!256?G$#201!257?G$#203!258?G$#201!259?G$#190!260?G$#203!261?GG$#206!263?G$#201!264?G$#203!265?GG$#194!267?G$#24O$#11!1?OOO$#4!4?O$#11!5?O$#4!6?O$#19!7?O$#4!8?O$#11!9?O$#4!10?O$#19!11?OO$#11!13?O$#19!14?O$#21!15?O$#11!16?O$#18!17?O$#11!18?OO$#18!20?O$#11!21?O$#18!22?O$#24!23?O$#18!24?O$#24!25?OOO$#27!28?OO$#31!30?O$#27!31?O$#30!32?O$#27!33?OO$#22!35?O$#30!36?O$#27!37?O$#34!38?O$#30!39?OO$#27!41?O$#18!42?O$#24!43?O$#18!44?O$#19!45?O$#11!46?OO$#19!48?O$#11!49?OOO$#5!52?OO$#1!54?O$#5!55?OOO$#12!58?O$#5!59?O$#1!60?OO$#7!62?OO$#11!64?O$#7!65?O$#4!66?OOO$#11!69?OO$#4!71?OO$#11!73?OO$#18!75?O$#36!76?O$#42!77?O$#46!78?O$#57!79?O$#62!80?O$#73!81?O$#83!82?OOOO$#81!86?O$#83!87?OO$#81!89?O$#94!90?O$#79!91?O$#93!92?O$#80!93?O$#83!94?O$#81!95?O$#83!96?O$#78!97?OO$#76!99?O$#82!100?O$#78!101?O$#75!102?O$#78!103?O$#81!104?O$#78!105?OO$#80!107?O$#78!108?OOOO$#75!112?O$#76!113?OOO$#75!116?OOO$#73!119?OO$#78!121?O$#73!122?OO$#78!124?OO$#76!126?O$#75!127?O$#73!128?OO$#74!130?O$#76!131?O$#75!132?O$#71!133?O$#73!134?O$#76!135?O$#73!136?O$#74!137?O$#73!138?O$#62!139?O$#71!140?O$#62!141?OO$#57!143?O$#49!144?O$#44!145?O$#39!146?OO$#21!148?O$#14!149?O$#12!150?OO$#14!152?OOO$#30!155?O$#36!156?O$#37!157?O$#69!158?O$#42!159?O$#43!160?O$#44!161?O$#45!162?O$#49!163?O$#46!164?O$#48!165?O$#101!166?O$#51!167?O$#48!168?O$#51!169?O$#50!170?O$#48!171?O$#50!172?O$#48!173?O$#52!174?O$#57!175?O$#52!176?OO$#57!178?O$#50!179?O$#52!180?OO$#46!182?O$#45!183?O$#42!184?O$#39!185?OO$#42!187?O$#43!188?O$#42!189?O$#45!190?OO$#50!192?OO$#64!194?O$#69!195?O$#68!196?OOOO$#64!200?OO$#51!202?OOOO$#64!206?O$#51!207?OO$#69!209?O$#77!210?O$#70!211?O$#77!212?O$#82!213?O$#94!214?O$#96!215?O$#101!216?O$#104!217?OO$#109!219?OO$#131!221?O$#147!222?O$#169!223?O$#157!224?OO$#169!226?OO$#157!228?OO$#147!230?O$#169!231?O$#171!232?O$#157!233?O$#178!234?OO$#186!236?O$#169!237?O$#171!238?O$#178!239?O$#175!240?O$#174!241?O$#186!242?O$#188!243?O$#184!244?OO$#188!246?O$#178!247?O$#185!248?O$#191!249?O$#190!250?O$#191!251?O$#203!252?O$#201!253?O$#191!254?OO$#201!256?O$#191!257?O$#203!258?O$#191!259?O$#203!260?O$#201!261?OOOOOO$#206!267?O$#19_$#4!1?_$#11!2?_$#4!3?_$#11!4?___$#5!7?_$#11!8?__$#4!10?_$#19!11?_$#11!12?_$#19!13?_$#11!14?_$#18!15?_$#11!16?_$#19!17?_$#24!18?_$#18!19?_$#24!20?__$#18!22?_$#11!23?_$#18!24?__$#4!26?_$#27!27?_$#18!28?_$#27!29?__$#30!31?___$#31!34?_$#30!35?_$#23!36?_$#30!37?_$#32!38?_$#34!39?_$#22!40?_$#18!41?_$#24!42?_$#18!43?__$#19!45?_$#4!46?_$#11!47?_____$#7!52?_$#1!53?_$#5!54?_______$#1!61?__$#5!63?_$#7!64?__$#11!66?_$#4!67?_$#5!68?_$#11!69?_$#4!70?__$#5!72?_$#7!73?_$#1!74?_$#18!75?_$#30!76?_$#40!77?_$#45!78?_$#52!79?_$#56!80?_$#71!81?_$#74!82?_$#76!83?_$#75!84?_$#74!85?_$#75!86?__$#76!88?__$#74!90?_$#76!91?__$#73!93?_$#76!94?__$#71!96?_$#72!97?_$#73!98?_$#74!99?__$#73!101?_$#72!102?_$#73!103?__$#71!105?__$#72!107?_$#71!108?_$#74!109?_$#62!110?_$#73!111?_$#75!112?_$#74!113?_$#71!114?_______$#72!121?_$#67!122?_$#74!123?_$#67!124?_$#73!125?_$#72!126?_$#71!127?_$#72!128?_$#71!129?__$#62!131?___________$#55!142?_$#52!143?_$#46!144?_$#44!145?_$#39!146?_$#37!147?_$#27!148?_$#14!149?_$#5!150?_$#12!151?_$#14!152?_$#21!153?__$#19!155?_$#30!156?_$#37!157?_$#43!158?_$#39!159?_$#42!160?__$#45!162?__$#46!164?_$#49!165?_$#64!166?_$#46!167?_$#49!168?_$#46!169?_$#48!170?_$#46!171?__$#48!173?_$#57!174?_$#48!175?_$#50!176?__$#48!178?_$#50!179?_$#49!180?_$#50!181?_$#45!182?_$#44!183?_$#42!184?_$#39!185?__$#42!187?__$#43!189?_$#45!190?_$#46!191?_$#49!192?_$#51!193?_$#68!194?_$#69!195?____$#64!199?____$#51!203?_$#64!204?_$#51!205?_$#64!206?_$#51!207?_$#53!208?_$#68!209?_$#70!210?__$#82!212?__$#94!214?_$#95!215?__$#101!217?_$#104!218?_$#109!219?__$#131!221?_$#147!222?_$#157!223?___$#169!226?_$#157!227?___$#147!230?_$#171!231?_$#157!232?__$#174!234?_$#178!235?_$#185!236?_$#171!237?_$#175!238?_$#185!239?_$#169!240?_$#171!241?_$#184!242?_$#188!243?_$#184!244?_$#175!245?_$#188!246?_$#178!247?_$#188!248?_$#190!249?_$#189!250?_$#191!251?__$#201!253?_$#189!254?_$#201!255?_$#203!256?__$#201!258?_$#191!259?_$#203!260?_$#206!261?_$#203!262?_____$#206!267?_$-#11@@@$#4!3?@$#11!4?@@@@@$#19!9?@$#11!10?@@$#19!12?@$#11!13?@$#19!14?@$#11!15?@$#18!16?@$#24!17?@@$#18!19?@@$#11!21?@@$#18!23?@@@@$#27!27?@$#24!28?@$#11!29?@$#27!30?@$#30!31?@$#27!32?@@$#30!34?@@$#34!36?@$#23!37?@$#32!38?@@$#27!40?@$#24!41?@@$#19!43?@@$#11!45?@@@$#19!48?@$#4!49?@@$#7!51?@$#5!52?@$#1!53?@$#12!54?@$#5!55?@@@@$#12!59?@$#5!60?@$#1!61?@@@$#7!64?@@$#11!66?@$#7!67?@$#4!68?@$#7!69?@$#5!70?@$#4!71?@@$#7!73?@$#11!74?@@$#27!76?@$#37!77?@$#43!78?@$#48!79?@$#56!80?@@$#62!82?@$#71!83?@$#62!84?@$#74!85?@$#71!86?@$#62!87?@$#71!88?@$#70!89?@$#71!90?@@@$#62!93?@@$#72!95?@$#71!96?@$#56!97?@$#62!98?@$#56!99?@$#62!100?@@$#56!102?@$#63!103?@$#62!104?@$#63!105?@@$#56!107?@$#62!108?@$#63!109?@@$#71!111?@$#63!112?@@$#56!114?@$#63!115?@$#62!116?@@@$#56!119?@$#70!120?@$#63!121?@@$#62!123?@@@@@$#56!128?@$#63!129?@@$#56!131?@@$#57!133?@$#56!134?@@@@$#57!138?@@@@$#52!142?@$#46!143?@$#44!144?@$#42!145?@$#39!146?@$#36!147?@$#27!148?@$#12!149?@@@$#14!152?@@$#21!154?@$#27!155?@$#30!156?@$#39!157?@$#37!158?@$#39!159?@$#42!160?@$#44!161?@@@$#49!164?@@$#44!166?@$#45!167?@$#46!168?@$#45!169?@$#44!170?@$#46!171?@$#45!172?@$#82!173?@$#45!174?@$#46!175?@$#50!176?@$#48!177?@$#46!178?@@@$#45!181?@$#46!182?@$#43!183?@$#39!184?@@@$#42!187?@$#44!188?@$#43!189?@$#45!190?@$#46!191?@$#50!192?@$#53!193?@$#64!194?@$#70!195?@$#77!196?@$#70!197?@$#69!198?@@@$#64!201?@$#51!202?@@@$#64!205?@$#51!206?@@@$#70!209?@@$#69!211?@$#77!212?@$#82!213?@$#94!214?@@@$#101!217?@$#104!218?@@$#109!220?@$#131!221?@$#147!222?@$#169!223?@@$#147!225?@$#169!226?@$#157!227?@@$#148!229?@@$#171!231?@$#178!232?@$#157!233?@$#178!234?@$#185!235?@@$#174!237?@$#178!238?@@$#169!240?@$#184!241?@$#188!242?@$#187!243?@$#169!244?@$#175!245?@$#189!246?@@$#186!248?@$#190!249?@$#201!250?@$#189!251?@$#191!252?@@@@$#201!256?@$#203!257?@$#201!258?@$#190!259?@$#203!260?@$#201!261?@$#206!262?@$#203!263?@$#201!264?@$#197!265?@$#206!266?@$#197!267?@$#19A$#11!1?A$#19!2?A$#11!3?A$#4!4?A$#11!5?A$#4!6?AAAA$#19!10?AAAA$#11!14?A$#21!15?A$#18!16?A$#27!17?A$#11!18?A$#24!19?A$#18!20?A$#24!21?A$#4!22?A$#24!23?A$#18!24?A$#11!25?A$#27!26?A$#18!27?A$#27!28?A$#18!29?A$#27!30?A$#24!31?AA$#30!33?A$#31!34?A$#27!35?A$#34!36?A$#23!37?AA$#32!39?A$#22!40?A$#18!41?A$#11!42?A$#4!43?A$#19!44?A$#5!45?A$#19!46?AA$#11!48?AAAA$#12!52?A$#5!53?AAAAAAAA$#7!61?A$#11!62?AA$#7!64?AAAA$#4!68?AAA$#19!71?A$#4!72?A$#11!73?AAA$#27!76?A$#37!77?A$#39!78?A$#42!79?A$#47!80?A$#53!81?A$#57!82?A$#63!83?AA$#57!85?A$#56!86?AAA$#57!89?AA$#63!91?A$#57!92?AAAAAAA$#53!99?AA$#57!101?A$#52!102?AA$#57!104?A$#53!105?A$#52!106?A$#57!107?A$#53!108?A$#52!109?A$#57!110?A$#53!111?AAAA$#52!115?AAA$#53!118?A$#57!119?AAAAAA$#53!125?A$#57!126?A$#52!127?A$#57!128?A$#52!129?A$#53!130?AAA$#50!133?AAA$#49!136?A$#50!137?A$#48!138?A$#47!139?A$#49!140?A$#51!141?A$#46!142?AA$#42!144?A$#39!145?A$#37!146?A$#30!147?A$#14!148?A$#12!149?AA$#5!151?A$#14!152?A$#21!153?A$#14!154?A$#30!155?AA$#37!157?A$#39!158?A$#37!159?A$#42!160?AA$#44!162?A$#45!163?A$#46!164?AAAAA$#45!169?A$#44!170?A$#46!171?A$#77!172?A$#42!173?A$#45!174?AAA$#44!177?A$#45!178?A$#46!179?A$#45!180?A$#44!181?A$#45!182?A$#43!183?A$#39!184?A$#37!185?A$#39!186?A$#43!187?AA$#44!189?A$#45!190?A$#49!191?A$#51!192?AA$#64!194?A$#70!195?A$#77!196?AA$#64!198?AAAAA$#51!203?A$#64!204?A$#51!205?AA$#50!207?A$#51!208?A$#63!209?A$#70!210?AA$#77!212?A$#82!213?AA$#95!215?A$#94!216?A$#101!217?AA$#104!219?A$#109!220?A$#131!221?A$#147!222?AA$#157!224?A$#147!225?A$#169!226?A$#157!227?AA$#142!229?A$#171!230?AA$#169!232?AA$#174!234?A$#186!235?A$#171!236?A$#169!237?A$#178!238?A$#171!239?AA$#174!241?A$#186!242?A$#187!243?A$#175!244?A$#187!245?A$#189!246?A$#185!247?A$#188!248?A$#189!249?A$#190!250?A$#191!251?AAAAAA$#201!257?A$#189!258?A$#201!259?A$#203!260?A$#201!261?AA$#194!263?A$#206!264?A$#197!265?A$#203!266?A$#216!267?A$#11CC$#5!2?C$#4!3?C$#11!4?CC$#4!6?C$#19!7?C$#11!8?CC$#4!10?C$#11!11?C$#18!12?C$#11!13?C$#24!14?C$#18!15?CC$#24!17?C$#18!18?C$#24!19?CC$#11!21?C$#30!22?C$#4!23?CC$#24!25?CCC$#23!28?C$#27!29?C$#11!30?C$#22!31?C$#27!32?C$#30!33?C$#32!34?C$#22!35?C$#27!36?C$#30!37?C$#32!38?CC$#30!40?C$#11!41?C$#18!42?C$#19!43?CC$#11!45?C$#19!46?C$#4!47?C$#11!48?C$#19!49?C$#11!50?C$#7!51?CC$#5!53?CCCCCCC$#12!60?C$#14!61?C$#5!62?C$#4!63?C$#5!64?C$#4!65?C$#7!66?CC$#4!68?CC$#11!70?C$#5!71?C$#4!72?C$#5!73?C$#4!74?C$#11!75?C$#21!76?C$#27!77?C$#39!78?C$#43!79?C$#46!80?C$#50!81?CC$#49!83?C$#57!84?C$#50!85?C$#52!86?CC$#53!88?C$#47!89?C$#50!90?CC$#52!92?C$#49!93?CC$#50!95?C$#51!96?C$#49!97?C$#51!98?C$#47!99?C$#49!100?C$#46!101?C$#45!102?C$#48!103?C$#46!104?CC$#50!106?C$#48!107?CCC$#46!110?CC$#49!112?C$#46!113?CC$#48!115?C$#46!116?CC$#48!118?C$#46!119?CC$#50!121?C$#48!122?CC$#49!124?C$#50!125?C$#51!126?C$#49!127?CC$#46!129?C$#49!130?C$#46!131?C$#45!132?C$#46!133?C$#45!134?CC$#46!136?CC$#45!138?CCCCCC$#42!144?C$#37!145?C$#36!146?C$#27!147?C$#14!148?C$#12!149?C$#5!150?C$#12!151?C$#14!152?CC$#27!154?CC$#36!156?C$#37!157?CC$#39!159?C$#42!160?CC$#43!162?C$#45!163?CC$#46!165?C$#44!166?CCCC$#43!170?C$#47!171?C$#44!172?C$#45!173?C$#43!174?CCC$#44!177?C$#43!178?C$#44!179?C$#45!180?C$#44!181?CCC$#39!184?C$#37!185?C$#39!186?C$#43!187?C$#45!188?C$#44!189?C$#45!190?C$#49!191?CC$#57!193?C$#68!194?C$#69!195?C$#77!196?C$#74!197?C$#69!198?C$#50!199?C$#45!200?C$#49!201?C$#51!202?CC$#64!204?CC$#51!206?C$#49!207?C$#51!208?C$#63!209?C$#70!210?CC$#77!212?C$#94!213?CCC$#95!216?C$#96!217?CC$#104!219?C$#109!220?C$#131!221?C$#147!222?CC$#157!224?C$#171!225?C$#157!226?CC$#169!228?C$#148!229?C$#171!230?C$#169!231?C$#171!232?CC$#178!234?C$#185!235?C$#175!236?C$#171!237?C$#185!238?C$#175!239?C$#187!240?C$#188!241?CC$#187!243?C$#169!244?C$#188!245?C$#189!246?C$#178!247?C$#189!248?C$#191!249?CC$#189!251?C$#191!252?CC$#188!254?C$#190!255?C$#191!256?C$#203!257?C$#197!258?CCC$#206!261?C$#197!262?C$#201!263?C$#197!264?C$#201!265?C$#193!266?C$#206!267?C$#11GGG$#4!3?G$#11!4?G$#4!5?G$#11!6?G$#18!7?G$#19!8?G$#21!9?G$#11!10?G$#19!11?GG$#27!13?G$#24!14?G$#27!15?G$#24!16?G$#18!17?G$#27!18?G$#24!19?G$#11!20?G$#24!21?G$#21!22?G$#18!23?G$#24!24?GG$#27!26?G$#24!27?G$#27!28?G$#24!29?G$#30!30?G$#27!31?G$#22!32?G$#27!33?G$#31!34?GG$#22!36?G$#30!37?G$#27!38?GG$#30!40?G$#24!41?GG$#11!43?GGGGGGGG$#7!51?G$#12!52?G$#5!53?GG$#12!55?G$#5!56?GGG$#12!59?GG$#14!61?GG$#11!63?G$#7!64?G$#4!65?GG$#11!67?G$#4!68?GGG$#11!71?G$#4!72?GG$#7!74?G$#19!75?GG$#36!77?G$#37!78?G$#42!79?G$#45!80?G$#46!81?GG$#49!83?GG$#50!85?G$#49!86?G$#48!87?GG$#46!89?GGGGG$#48!94?G$#46!95?GG$#45!97?GGG$#46!100?GGG$#45!103?G$#46!104?G$#44!105?G$#46!106?GG$#45!108?G$#44!109?G$#43!110?G$#45!111?G$#46!112?G$#45!113?G$#44!114?G$#45!115?G$#43!116?GG$#45!118?GG$#44!120?G$#46!121?G$#45!122?G$#44!123?GG$#45!125?G$#44!126?GG$#45!128?G$#44!129?G$#45!130?G$#44!131?G$#45!132?GGGG$#43!136?G$#44!137?GG$#43!139?G$#39!140?GG$#42!142?G$#39!143?G$#36!144?G$#37!145?G$#19!146?G$#21!147?G$#14!148?G$#12!149?G$#5!150?G$#12!151?G$#14!152?GG$#21!154?G$#30!155?G$#27!156?G$#68!157?G$#37!158?G$#39!159?G$#42!160?GG$#44!162?G$#43!163?G$#45!164?G$#44!165?G$#45!166?GG$#44!168?G$#45!169?G$#43!170?G$#44!171?G$#43!172?GGGG$#44!176?G$#43!177?GG$#44!179?G$#43!180?G$#45!181?G$#43!182?G$#42!183?G$#39!184?GGG$#43!187?G$#44!188?G$#46!189?GGG$#51!192?G$#53!193?G$#69!194?G$#70!195?G$#77!196?GG$#69!198?G$#64!199?G$#49!200?G$#44!201?G$#45!202?G$#64!203?GG$#51!205?GGGG$#63!209?GG$#69!211?G$#70!212?G$#77!213?G$#94!214?G$#82!215?GG$#96!217?G$#101!218?G$#104!219?G$#109!220?G$#131!221?G$#147!222?GG$#169!224?GG$#157!226?G$#169!227?G$#148!228?G$#169!229?G$#157!230?G$#169!231?GG$#171!233?G$#189!234?G$#178!235?G$#171!236?G$#169!237?G$#178!238?G$#174!239?G$#193!240?G$#187!241?G$#188!242?G$#197!243?G$#175!244?G$#187!245?G$#191!246?G$#185!247?G$#189!248?G$#191!249?GG$#201!251?G$#203!252?G$#201!253?G$#188!254?G$#189!255?G$#191!256?GG$#193!258?G$#197!259?G$#206!260?G$#194!261?G$#190!262?G$#197!263?GG$#194!265?G$#190!266?G$#206!267?G$#11OOO$#4!3?O$#11!4?OOO$#19!7?O$#21!8?O$#19!9?O$#11!10?O$#19!11?OO$#27!13?O$#24!14?OO$#27!16?OO$#24!18?OOO$#18!21?O$#4!22?O$#24!23?O$#18!24?O$#11!25?O$#27!26?OOOO$#22!30?O$#30!31?O$#27!32?O$#30!33?O$#31!34?O$#27!35?OO$#30!37?OO$#27!39?O$#22!40?O$#24!41?O$#11!42?OOO$#18!45?O$#11!46?OO$#4!48?O$#11!49?OO$#1!51?O$#12!52?OO$#5!54?OOOO$#12!58?O$#5!59?O$#12!60?O$#7!61?O$#5!62?O$#11!63?O$#4!64?O$#19!65?O$#4!66?OO$#19!68?O$#11!69?O$#4!70?OOO$#11!73?O$#7!74?OO$#19!76?O$#27!77?O$#37!78?O$#42!79?O$#44!80?OO$#46!82?OOOOO$#49!87?OO$#48!89?O$#46!90?O$#45!91?O$#46!92?O$#45!93?O$#46!94?O$#45!95?O$#46!96?OO$#45!98?OO$#46!100?O$#45!101?O$#44!102?O$#45!103?OOOO$#44!107?O$#43!108?O$#45!109?O$#42!110?O$#45!111?O$#43!112?OO$#42!114?O$#45!115?O$#43!116?O$#45!117?O$#43!118?OOOO$#40!122?O$#43!123?OO$#45!125?O$#43!126?OOO$#45!129?O$#44!130?O$#43!131?OOOO$#42!135?OO$#43!137?O$#39!138?O$#42!139?O$#39!140?OOO$#37!143?O$#30!144?O$#27!145?OO$#14!147?OO$#12!149?OO$#14!151?OO$#21!153?OO$#30!155?O$#36!156?O$#37!157?O$#39!158?OO$#42!160?OO$#43!162?O$#44!163?O$#45!164?O$#51!165?O$#45!166?O$#43!167?O$#44!168?O$#45!169?O$#44!170?O$#42!171?O$#43!172?O$#42!173?O$#39!174?O$#40!175?O$#43!176?O$#42!177?O$#45!178?O$#44!179?O$#45!180?O$#44!181?O$#43!182?O$#44!183?O$#39!184?O$#37!185?O$#42!186?O$#43!187?O$#45!188?OO$#49!190?OO$#51!192?O$#53!193?O$#69!194?O$#77!195?O$#82!196?O$#77!197?O$#82!198?OO$#52!200?O$#57!201?O$#70!202?O$#71!203?O$#70!204?O$#51!205?OOO$#50!208?O$#68!209?O$#69!210?O$#64!211?O$#69!212?O$#82!213?OO$#77!215?O$#82!216?O$#95!217?O$#101!218?O$#104!219?O$#109!220?O$#131!221?O$#147!222?OO$#157!224?O$#184!225?O$#147!226?O$#171!227?O$#147!228?O$#174!229?O$#157!230?OO$#178!232?O$#184!233?O$#175!234?O$#174!235?O$#175!236?OO$#189!238?O$#187!239?O$#175!240?O$#188!241?O$#190!242?O$#193!243?O$#187!244?O$#188!245?OO$#184!247?O$#189!248?O$#201!249?OO$#189!251?O$#191!252?OO$#189!254?OO$#197!256?O$#201!257?O$#190!258?O$#197!259?O$#189!260?OO$#193!262?O$#188!263?O$#193!264?OO$#201!266?O$#206!267?O$#11__$#4!2?_$#11!3?_$#18!4?__$#21!6?__$#11!8?_$#18!9?__$#11!11?_$#21!12?_$#24!13?_$#18!14?_$#30!15?_$#27!16?_$#18!17?_$#27!18?_$#18!19?___$#11!22?_$#24!23?___$#27!26?______$#30!32?_$#22!33?_$#30!34?___$#36!37?_$#30!38?_$#27!39?_$#22!40?_$#27!41?_$#19!42?_$#11!43?__$#4!45?_$#11!46?_$#19!47?__$#11!49?_$#4!50?_$#11!51?_$#7!52?_$#5!53?___$#12!56?___$#5!59?_$#12!60?_$#7!61?__$#5!63?_$#4!64?_$#5!65?_$#11!66?_$#19!67?_$#4!68?_$#11!69?_$#4!70?___$#7!73?__$#11!75?_$#18!76?_$#36!77?_$#37!78?_$#40!79?_$#43!80?_$#46!81?_$#48!82?_$#50!83?_$#46!84?__$#49!86?_$#46!87?_$#48!88?_$#46!89?______$#45!95?_$#46!96?_$#45!97?__$#46!99?_$#45!100?_$#44!101?____$#41!105?_$#43!106?_$#44!107?_$#45!108?_$#44!109?_$#43!110?__$#40!112?_$#44!113?_$#43!114?__$#44!116?_$#43!117?____$#40!121?_$#43!122?_$#42!123?_$#40!124?_$#43!125?_$#45!126?__$#43!128?__$#42!130?__$#44!132?__$#43!134?_$#42!135?____$#39!139?____$#37!143?_$#30!144?_$#27!145?_$#14!146?____$#5!150?_$#12!151?_$#14!152?_$#21!153?_$#27!154?_$#36!155?_$#37!156?__$#36!158?_$#39!159?__$#42!161?_$#43!162?_$#42!163?_$#45!164?_$#104!165?_$#45!166?_$#43!167?_$#40!168?_$#69!169?_$#45!170?__$#42!172?__$#44!174?_$#42!175?_$#45!176?_$#44!177?__$#45!179?_$#44!180?_$#45!181?_$#43!182?_$#40!183?_$#39!184?__$#43!186?_$#44!187?_$#43!188?_$#45!189?_$#46!190?__$#51!192?_$#64!193?_$#68!194?_$#74!195?_$#94!196?_$#104!197?_$#111!198?_$#101!199?_$#104!200?_$#95!201?__$#94!203?__$#82!205?__$#74!207?_$#70!208?_$#63!209?_$#69!210?_$#64!211?__$#70!213?_$#77!214?_$#82!215?_$#96!216?__$#101!218?_$#104!219?_$#109!220?_$#131!221?_$#142!222?_$#169!223?_$#157!224?_$#169!225?_$#157!226?_$#169!227?_$#147!228?_$#171!229?_$#157!230?_$#171!231?__$#189!233?_$#175!234?_$#188!235?_$#184!236?_$#194!237?_$#193!238?__$#187!240?__$#188!242?_$#201!243?_$#187!244?_$#193!245?_$#189!246?___$#201!249?_$#191!250?__$#203!252?_$#201!253?_$#203!254?_$#191!255?_$#190!256?_$#201!257?_$#193!258?_$#194!259?_$#193!260?_$#189!261?_$#193!262?_____$#203!267?_$-#4@$#11!1?@$#4!2?@$#11!3?@@$#18!5?@$#19!6?@$#11!7?@$#18!8?@@@$#11!11?@$#24!12?@@@$#30!15?@$#24!16?@@$#18!18?@$#24!19?@$#11!20?@$#18!21?@$#21!22?@$#27!23?@@$#11!25?@$#24!26?@$#27!27?@@$#30!29?@@$#27!31?@$#18!32?@$#27!33?@$#30!34?@$#31!35?@$#30!36?@$#27!37?@$#31!38?@$#27!39?@$#18!40?@$#11!41?@$#19!42?@$#18!43?@$#24!44?@$#19!45?@$#4!46?@$#11!47?@@@$#4!50?@@$#7!52?@$#12!53?@@$#5!55?@@@$#12!58?@$#5!59?@@$#1!61?@$#7!62?@$#11!63?@$#5!64?@$#4!65?@$#11!66?@$#4!67?@@$#11!69?@$#5!70?@$#4!71?@@$#5!73?@$#7!74?@$#5!75?@$#24!76?@$#30!77?@$#39!78?@$#42!79?@$#45!80?@$#48!81?@$#52!82?@$#57!83?@@$#53!85?@@$#49!87?@$#50!88?@@$#52!90?@$#48!91?@$#50!92?@$#49!93?@$#50!94?@$#46!95?@$#50!96?@$#46!97?@@@@@$#45!102?@$#50!103?@$#45!104?@$#44!105?@$#45!106?@$#46!107?@$#45!108?@$#44!109?@$#42!110?@$#44!111?@$#45!112?@@$#44!114?@@$#43!116?@$#45!117?@@@$#44!120?@$#43!121?@$#44!122?@$#45!123?@$#42!124?@$#44!125?@$#45!126?@@$#44!128?@$#45!129?@$#46!130?@$#44!131?@@$#42!133?@$#44!134?@$#43!135?@$#44!136?@@$#42!138?@@$#40!140?@$#42!141?@$#39!142?@@$#36!144?@$#30!145?@$#14!146?@$#12!147?@@$#14!149?@$#12!150?@$#14!151?@$#21!152?@$#14!153?@$#30!154?@$#39!155?@$#104!156?@$#37!157?@$#39!158?@@$#43!160?@@$#44!162?@$#45!163?@@$#44!165?@@$#45!167?@$#104!168?@$#43!169?@$#45!170?@@$#44!172?@$#43!173?@@$#44!175?@$#45!176?@$#44!177?@@$#46!179?@@@@$#45!183?@$#42!184?@$#39!185?@$#43!186?@$#45!187?@@@$#46!190?@$#49!191?@@$#53!193?@$#69!194?@$#70!195?@$#101!196?@$#131!197?@@$#111!199?@@$#104!201?@$#106!202?@$#111!203?@$#123!204?@$#111!205?@$#109!206?@@$#104!208?@$#77!209?@$#70!210?@$#64!211?@$#69!212?@$#77!213?@@@$#82!216?@$#94!217?@$#101!218?@@$#109!220?@$#131!221?@$#147!222?@$#169!223?@$#157!224?@$#169!225?@$#157!226?@$#168!227?@$#157!228?@@@$#184!231?@$#174!232?@$#186!233?@@$#190!235?@$#194!236?@@$#201!238?@$#204!239?@$#188!240?@$#184!241?@$#189!242?@$#188!243?@$#187!244?@$#206!245?@$#190!246?@$#191!247?@$#201!248?@$#203!249?@@@@@@$#191!255?@@$#197!257?@$#188!258?@$#193!259?@$#194!260?@$#187!261?@$#193!262?@$#188!263?@$#187!264?@$#193!265?@$#201!266?@$#197!267?@$#4A$#11!1?AAA$#18!4?A$#4!5?A$#18!6?A$#19!7?AA$#11!9?AA$#24!11?AA$#27!13?AAAA$#24!17?A$#27!18?A$#18!19?A$#11!20?A$#24!21?AA$#18!23?AA$#24!25?AA$#27!27?AA$#31!29?A$#30!30?A$#27!31?AA$#30!33?A$#27!34?AA$#30!36?A$#31!37?A$#27!38?AA$#18!40?A$#24!41?A$#21!42?A$#11!43?AAA$#19!46?A$#4!47?A$#11!48?AA$#4!50?AAA$#1!53?AA$#7!55?A$#5!56?A$#12!57?AAA$#5!60?A$#7!61?A$#11!62?AA$#4!64?A$#11!65?A$#5!66?A$#11!67?A$#5!68?AA$#4!70?A$#5!71?A$#4!72?A$#5!73?A$#7!74?A$#11!75?A$#24!76?A$#30!77?A$#39!78?A$#43!79?A$#46!80?A$#52!81?A$#57!82?A$#56!83?AAAA$#63!87?AA$#56!89?A$#57!90?AAAA$#53!94?A$#57!95?A$#52!96?AAA$#50!99?A$#49!100?A$#50!101?A$#52!102?A$#49!103?AA$#50!105?A$#48!106?AAA$#46!109?AAAAAA$#45!115?AA$#49!117?A$#45!118?A$#44!119?AA$#46!121?AAAA$#48!125?A$#46!126?AA$#48!128?A$#46!129?AA$#48!131?A$#45!132?A$#46!133?AA$#44!135?A$#45!136?A$#46!137?A$#45!138?AAA$#42!141?A$#39!142?A$#42!143?A$#37!144?AA$#27!146?A$#14!147?AAAAA$#21!152?A$#9!153?A$#39!154?A$#30!155?AA$#39!157?A$#37!158?A$#39!159?A$#42!160?A$#43!161?AA$#45!163?A$#43!164?A$#46!165?A$#49!166?A$#109!167?A$#45!168?A$#46!169?A$#45!170?AAA$#46!173?A$#44!174?A$#46!175?A$#51!176?A$#46!177?A$#45!178?A$#46!179?A$#50!180?AA$#46!182?A$#44!183?A$#42!184?A$#43!185?A$#45!186?AA$#49!188?A$#50!189?A$#49!190?A$#53!191?A$#57!192?A$#63!193?A$#82!194?A$#94!195?A$#132!196?A$#131!197?A$#130!198?A$#123!199?A$#96!200?A$#111!201?AA$#131!203?A$#111!204?A$#134!205?A$#142!206?A$#131!207?A$#123!208?A$#106!209?A$#82!210?AA$#77!212?A$#70!213?AA$#77!215?A$#82!216?A$#94!217?A$#101!218?AA$#109!220?A$#131!221?A$#142!222?A$#169!223?A$#147!224?A$#157!225?A$#169!226?A$#157!227?AAA$#169!230?A$#188!231?A$#169!232?A$#185!233?A$#187!234?A$#188!235?A$#194!236?A$#204!237?A$#189!238?A$#206!239?A$#193!240?AA$#203!242?A$#187!243?A$#175!244?A$#193!245?A$#201!246?A$#203!247?A$#216!248?A$#206!249?AA$#216!251?A$#203!252?AAAA$#197!256?A$#188!257?A$#193!258?A$#194!259?AA$#188!261?A$#193!262?AAAA$#201!266?A$#206!267?A$#4C$#11!1?CC$#18!3?CC$#11!5?C$#18!6?C$#11!7?C$#19!8?C$#11!9?C$#4!10?C$#24!11?C$#18!12?C$#24!13?CC$#27!15?C$#11!16?C$#18!17?CCC$#11!20?CC$#24!22?C$#27!23?C$#18!24?C$#22!25?CC$#27!27?C$#32!28?C$#30!29?C$#27!30?C$#30!31?C$#24!32?C$#27!33?C$#22!34?C$#30!35?CC$#27!37?CCC$#22!40?C$#18!41?C$#19!42?CC$#11!44?CC$#4!46?CC$#11!48?C$#4!49?C$#5!50?C$#4!51?C$#7!52?C$#1!53?C$#12!54?CCCC$#14!58?C$#12!59?C$#5!60?C$#11!61?CCC$#5!64?CC$#4!66?C$#5!67?C$#4!68?CCCC$#11!72?C$#7!73?C$#11!74?C$#4!75?C$#19!76?C$#31!77?C$#39!78?C$#42!79?C$#49!80?C$#57!81?C$#63!82?C$#62!83?C$#71!84?CCC$#70!87?C$#62!88?CCCC$#63!92?CC$#56!94?C$#63!95?C$#53!96?C$#57!97?CC$#50!99?C$#57!100?CCCC$#53!104?CC$#52!106?CC$#50!108?CC$#52!110?C$#50!111?C$#47!112?C$#49!113?C$#50!114?CCCC$#49!118?C$#46!119?C$#50!120?C$#47!121?C$#52!122?CC$#50!124?C$#52!125?C$#48!126?C$#53!127?C$#52!128?CC$#50!130?C$#52!131?C$#50!132?C$#49!133?C$#50!134?C$#47!135?C$#50!136?C$#51!137?C$#46!138?C$#48!139?C$#46!140?CCC$#43!143?C$#39!144?C$#30!145?C$#27!146?CC$#14!148?CCCCC$#36!153?C$#27!154?C$#104!155?C$#37!156?CC$#39!158?CC$#45!160?C$#42!161?C$#45!162?C$#46!163?C$#131!164?C$#46!165?C$#95!166?C$#49!167?CC$#45!169?C$#49!170?C$#46!171?C$#45!172?C$#48!173?CC$#63!175?C$#48!176?CC$#47!178?C$#63!179?C$#48!180?C$#50!181?C$#48!182?C$#46!183?C$#44!184?C$#46!185?C$#45!186?C$#50!187?C$#56!188?C$#76!189?C$#93!190?CC$#82!192?C$#71!193?C$#111!194?C$#117!195?C$#131!196?C$#117!197?C$#111!198?CC$#101!200?C$#111!201?C$#131!202?C$#142!203?C$#123!204?C$#147!205?C$#142!206?CC$#130!208?C$#132!209?C$#111!210?C$#94!211?C$#71!212?C$#77!213?C$#70!214?C$#69!215?C$#77!216?C$#82!217?C$#96!218?C$#101!219?C$#104!220?C$#131!221?C$#147!222?CCC$#157!225?C$#169!226?C$#157!227?C$#168!228?C$#157!229?C$#175!230?C$#184!231?C$#169!232?C$#174!233?C$#204!234?C$#190!235?C$#206!236?C$#204!237?C$#206!238?C$#193!239?CCC$#194!242?C$#193!243?C$#175!244?C$#197!245?C$#191!246?C$#203!247?C$#216!248?C$#217!249?C$#216!250?C$#217!251?C$#216!252?C$#206!253?C$#216!254?C$#203!255?C$#206!256?CC$#189!258?C$#194!259?C$#193!260?CCC$#188!263?CC$#201!265?C$#194!266?C$#216!267?C$#4G$#11!1?G$#5!2?G$#19!3?G$#21!4?GG$#18!6?GG$#27!8?G$#24!9?GG$#27!11?G$#24!12?GG$#30!14?G$#24!15?GGG$#18!18?G$#27!19?G$#18!20?G$#24!21?GG$#11!23?GG$#22!25?GG$#31!27?G$#30!28?GGG$#27!31?G$#22!32?G$#24!33?G$#22!34?G$#27!35?G$#30!36?GG$#27!38?G$#22!39?G$#24!40?G$#27!41?G$#19!42?G$#21!43?G$#4!44?G$#11!45?G$#4!46?G$#11!47?GG$#4!49?G$#11!50?G$#4!51?G$#7!52?G$#14!53?G$#12!54?G$#14!55?GG$#12!57?G$#4!58?GG$#1!60?G$#11!61?GGG$#4!64?G$#7!65?G$#5!66?G$#11!67?G$#4!68?G$#5!69?G$#7!70?G$#11!71?GG$#7!73?G$#4!74?GG$#21!76?G$#31!77?G$#40!78?G$#46!79?G$#48!80?G$#62!81?GG$#73!83?G$#72!84?G$#78!85?G$#73!86?G$#71!87?G$#73!88?G$#72!89?G$#73!90?G$#71!91?G$#72!92?G$#73!93?G$#62!94?G$#63!95?G$#56!96?G$#62!97?GGG$#63!100?GG$#62!102?G$#63!103?GGGG$#57!107?GGGG$#55!111?G$#56!112?GG$#57!114?G$#53!115?G$#57!116?GG$#52!118?G$#63!119?G$#52!120?G$#57!121?GG$#56!123?GGG$#63!126?GG$#57!128?GGG$#63!131?G$#57!132?GGG$#53!135?G$#52!136?G$#53!137?G$#52!138?GG$#50!140?GG$#48!142?G$#44!143?G$#43!144?G$#37!145?GG$#21!147?G$#14!148?GGGG$#27!152?G$#19!153?G$#30!154?G$#37!155?G$#36!156?G$#37!157?G$#39!158?G$#46!159?G$#42!160?G$#43!161?G$#45!162?GG$#44!164?G$#70!165?G$#49!166?G$#48!167?GG$#49!169?G$#48!170?G$#49!171?G$#48!172?G$#50!173?G$#48!174?G$#50!175?G$#52!176?G$#63!177?G$#57!178?G$#52!179?G$#48!180?G$#52!181?G$#48!182?G$#49!183?G$#48!184?G$#73!185?G$#103!186?G$#84!187?G$#93!188?GGG$#83!191?G$#78!192?G$#81!193?G$#131!194?GG$#132!196?G$#111!197?G$#117!198?G$#107!199?G$#106!200?G$#109!201?G$#132!202?G$#148!203?G$#132!204?G$#130!205?G$#148!206?G$#147!207?G$#157!208?G$#132!209?GG$#101!211?G$#94!212?G$#74!213?G$#70!214?G$#69!215?G$#74!216?G$#82!217?GG$#94!219?G$#109!220?G$#131!221?GG$#147!223?G$#142!224?G$#157!225?GG$#171!227?G$#169!228?GG$#175!230?G$#185!231?G$#171!232?G$#178!233?G$#187!234?G$#203!235?G$#193!236?G$#204!237?G$#194!238?G$#193!239?G$#199!240?G$#194!241?G$#216!242?G$#193!243?G$#187!244?G$#206!245?G$#203!246?G$#197!247?G$#216!248?G$#217!249?G$#216!250?GGG$#203!253?GGG$#216!256?G$#206!257?G$#216!258?G$#203!259?G$#204!260?GG$#187!262?G$#193!263?GG$#194!265?GG$#206!267?G$#19O$#4!1?O$#11!2?O$#19!3?O$#21!4?OO$#24!6?OOOO$#18!10?O$#24!11?OOOOOOO$#18!18?O$#11!19?O$#24!20?O$#18!21?O$#24!22?O$#18!23?O$#24!24?OO$#27!26?O$#30!27?O$#31!28?O$#30!29?OOO$#18!32?OO$#30!34?OO$#23!36?O$#32!37?O$#27!38?O$#22!39?O$#24!40?O$#11!41?O$#4!42?O$#11!43?OO$#19!45?O$#11!46?O$#4!47?O$#11!48?O$#4!49?OO$#11!51?O$#7!52?O$#5!53?O$#1!54?O$#12!55?OOO$#4!58?O$#11!59?O$#5!60?O$#11!61?O$#4!62?O$#11!63?O$#4!64?O$#11!65?O$#4!66?O$#11!67?OO$#4!69?O$#5!70?OO$#4!72?O$#7!73?O$#4!74?OO$#21!76?O$#37!77?O$#42!78?O$#47!79?O$#57!80?O$#62!81?O$#72!82?O$#82!83?OO$#75!85?O$#78!86?O$#76!87?O$#78!88?O$#76!89?O$#72!90?O$#75!91?O$#74!92?O$#78!93?O$#72!94?O$#73!95?O$#71!96?O$#62!97?O$#71!98?O$#72!99?O$#71!100?O$#72!101?O$#73!102?O$#62!103?O$#73!104?O$#71!105?O$#62!106?OOOOOO$#71!112?O$#62!113?O$#56!114?OO$#62!116?O$#63!117?O$#56!118?O$#62!119?OOOOOO$#70!125?O$#63!126?OOOO$#62!130?O$#70!131?O$#56!132?O$#63!133?OOOO$#53!137?O$#63!138?O$#56!139?O$#57!140?O$#52!141?OO$#46!143?O$#44!144?O$#39!145?O$#37!146?O$#27!147?O$#14!148?O$#5!149?OO$#21!151?O$#27!152?O$#36!153?O$#82!154?O$#36!155?O$#37!156?OO$#45!158?O$#40!159?O$#42!160?O$#43!161?O$#45!162?OO$#53!164?O$#49!165?O$#50!166?O$#51!167?O$#52!168?OO$#50!170?OOO$#52!173?O$#48!174?O$#53!175?O$#76!176?O$#53!177?O$#57!178?O$#52!179?O$#57!180?OO$#62!182?O$#75!183?O$#93!184?O$#103!185?O$#110!186?O$#107!187?O$#94!188?O$#95!189?O$#80!190?O$#82!191?O$#73!192?O$#109!193?O$#147!194?O$#131!195?O$#130!196?O$#117!197?O$#123!198?O$#107!199?O$#111!200?O$#123!201?O$#142!202?OOO$#138!205?OO$#130!207?O$#142!208?O$#130!209?O$#138!210?O$#117!211?O$#111!212?O$#94!213?O$#82!214?O$#95!215?O$#77!216?OOO$#82!219?O$#109!220?O$#131!221?OOO$#147!224?O$#157!225?OO$#148!227?O$#169!228?O$#174!229?O$#168!230?O$#174!231?O$#188!232?OO$#184!234?O$#190!235?O$#188!236?OO$#193!238?O$#199!239?O$#205!240?O$#206!241?O$#216!242?O$#204!243?O$#205!244?O$#201!245?O$#206!246?O$#203!247?O$#217!248?OO$#216!250?OOOO$#203!254?O$#206!255?OO$#204!257?O$#202!258?O$#216!259?O$#204!260?O$#205!261?O$#202!262?O$#187!263?O$#193!264?OO$#205!266?O$#206!267?O$#19___$#18!3?__$#24!5?___$#18!8?_$#24!9?_$#18!10?_$#27!11?__$#22!13?_$#18!14?_$#22!15?_$#24!16?_$#21!17?_$#19!18?_$#4!19?_$#18!20?__$#24!22?__$#11!24?_$#18!25?_$#27!26?_$#22!27?_$#31!28?_$#30!29?_$#31!30?_$#36!31?_$#22!32?___$#30!35?_$#27!36?_$#30!37?_$#18!38?_$#22!39?_$#18!40?_$#11!41?_$#5!42?_$#19!43?_$#11!44?__$#4!46?_$#11!47?_$#19!48?_$#11!49?_$#1!50?_$#7!51?__$#12!53?_$#1!54?_$#5!55?_$#12!56?_$#1!57?_$#4!58?_$#11!59?_$#4!60?_$#11!61?____$#19!65?_$#11!66?___$#4!69?_$#11!70?_$#4!71?__$#5!73?__$#11!75?__$#37!77?_$#42!78?_$#48!79?_$#63!80?_$#71!81?_$#82!82?_$#80!83?_$#83!84?_$#80!85?_$#83!86?_$#81!87?_$#78!88?__$#82!90?_$#76!91?_$#75!92?_$#76!93?_$#82!94?_$#76!95?_$#75!96?_$#82!97?_$#75!98?__$#77!100?_$#74!101?_$#76!102?_$#74!103?_$#73!104?_$#74!105?__$#62!107?_$#73!108?_$#72!109?_$#73!110?__$#62!112?_$#71!113?_$#73!114?_$#72!115?_$#62!116?_$#71!117?_$#72!118?_$#62!119?_$#71!120?__$#73!122?_$#71!123?__$#72!125?_$#62!126?__$#71!128?_$#62!129?_$#72!130?_$#73!131?_$#72!132?__$#71!134?_$#72!135?_$#71!136?_____$#63!141?_$#57!142?_$#48!143?_$#45!144?_$#42!145?_$#37!146?_$#36!147?_$#27!148?_$#21!149?_$#5!150?_$#14!151?_$#21!152?_$#43!153?_$#30!154?__$#37!156?_$#51!157?_$#39!158?__$#42!160?_$#44!161?_$#45!162?_$#104!163?_$#49!164?__$#53!166?__$#52!168?_$#50!169?_$#52!170?_$#53!171?_$#57!172?_$#96!173?_$#71!174?_$#56!175?_$#57!176?_$#63!177?__$#57!179?_$#62!180?_$#84!181?_$#99!182?_$#84!183?_$#92!184?_$#107!185?__$#103!187?_$#93!188?_$#95!189?_$#96!190?_$#107!191?_$#77!192?_$#131!193?_$#142!194?_$#123!195?__$#103!197?_$#104!198?_$#111!199?_$#123!200?_$#149!201?__$#130!203?_$#138!204?_$#137!205?__$#123!207?_$#117!208?_$#103!209?_$#111!210?____$#96!214?_$#77!215?_$#70!216?__$#69!218?_$#77!219?_$#109!220?_$#131!221?___$#147!224?_$#168!225?_$#157!226?__$#169!228?_$#168!229?__$#169!231?_$#175!232?_$#188!233?_$#187!234?_$#189!235?_$#194!236?_$#187!237?_$#193!238?_$#195!239?_$#205!240?_$#215!241?_$#216!242?_$#215!243?_$#199!244?_$#216!245?_$#206!246?_$#190!247?_$#203!248?_$#217!249?__$#216!251?___$#217!254?_$#216!255?_$#206!256?_$#194!257?_$#204!258?_$#216!259?_$#215!260?_$#205!261?_____$#193!266?_$#216!267?_$-#11@@$#19!2?@$#21!3?@$#18!4?@$#24!5?@$#27!6?@@$#24!8?@@@@@$#27!13?@@@$#24!16?@$#18!17?@$#24!18?@$#18!19?@@@$#24!22?@$#27!23?@$#18!24?@$#27!25?@$#30!26?@$#23!27?@@$#30!29?@$#27!30?@@@$#22!33?@$#27!34?@@@@@$#11!39?@$#24!40?@$#11!41?@@$#19!43?@$#11!44?@@$#21!46?@$#4!47?@$#11!48?@@$#4!50?@$#7!51?@$#4!52?@$#12!53?@$#14!54?@$#12!55?@$#14!56?@$#1!57?@$#11!58?@$#4!59?@@@$#19!62?@@@@$#11!66?@@$#4!68?@$#7!69?@$#11!70?@$#5!71?@$#4!72?@$#5!73?@$#11!74?@@$#24!76?@$#37!77?@$#40!78?@$#47!79?@$#62!80?@$#71!81?@$#78!82?@$#83!83?@@$#94!85?@$#93!86?@$#94!87?@$#83!88?@$#93!89?@$#83!90?@@$#80!92?@@$#82!94?@$#81!95?@$#80!96?@@$#76!98?@$#83!99?@$#82!100?@$#78!101?@@$#82!103?@@$#76!105?@$#82!106?@$#77!107?@$#75!108?@$#78!109?@@$#73!111?@$#78!112?@$#72!113?@$#74!114?@$#73!115?@@$#71!117?@$#73!118?@@@$#76!121?@$#75!122?@$#74!123?@$#73!124?@$#76!125?@$#77!126?@$#72!127?@$#76!128?@$#75!129?@$#73!130?@$#75!131?@@$#74!133?@$#73!134?@@$#71!136?@$#72!137?@$#71!138?@$#73!139?@@$#62!141?@$#56!142?@$#52!143?@$#45!144?@$#43!145?@$#39!146?@$#37!147?@$#21!148?@$#5!149?@@$#14!151?@$#21!152?@$#22!153?@$#21!154?@$#30!155?@$#49!156?@$#39!157?@@@$#42!160?@$#45!161?@@@$#49!164?@$#48!165?@$#52!166?@$#53!167?@$#52!168?@$#57!169?@@@$#62!172?@$#101!173?@$#56!174?@@@$#62!177?@$#73!178?@$#75!179?@$#92!180?@@$#75!182?@$#93!183?@$#89!184?@$#103!185?@@$#83!187?@$#104!188?@$#103!189?@$#107!190?@$#117!191?@$#111!192?@$#109!193?@$#131!194?@$#111!195?@$#103!196?@$#107!197?@$#95!198?@$#131!199?@$#130!200?@$#166!201?@$#148!202?@@$#123!204?@@@$#152!207?@$#149!208?@$#148!209?@$#142!210?@$#111!211?@$#117!212?@$#95!213?@$#93!214?@$#95!215?@$#94!216?@$#70!217?@$#63!218?@$#69!219?@$#101!220?@$#109!221?@$#131!222?@@$#147!224?@$#157!225?@$#169!226?@$#171!227?@$#187!228?@$#168!229?@$#166!230?@$#157!231?@@$#171!233?@$#184!234?@$#193!235?@$#187!236?@$#194!237?@$#193!238?@$#195!239?@$#205!240?@$#187!241?@$#222!242?@$#218!243?@$#214!244?@$#216!245?@@$#201!247?@$#206!248?@$#216!249?@@@@$#217!253?@@$#216!255?@@$#206!257?@$#204!258?@$#206!259?@$#204!260?@$#214!261?@$#199!262?@$#205!263?@@@$#193!266?@$#215!267?@$#21A$#19!1?A$#11!2?A$#21!3?A$#18!4?A$#21!5?A$#11!6?A$#18!7?A$#24!8?A$#18!9?A$#24!10?A$#27!11?A$#24!12?A$#18!13?A$#27!14?AA$#24!16?AA$#18!18?A$#24!19?A$#21!20?A$#24!21?A$#11!22?A$#24!23?A$#27!24?A$#24!25?A$#22!26?A$#23!27?A$#32!28?AA$#31!30?AA$#24!32?A$#27!33?A$#30!34?A$#22!35?A$#30!36?A$#22!37?A$#27!38?AA$#18!40?A$#24!41?A$#11!42?AA$#4!44?A$#19!45?AA$#11!47?A$#4!48?A$#11!49?AAAA$#7!53?A$#5!54?A$#7!55?AA$#1!57?A$#12!58?A$#11!59?AA$#5!61?A$#4!62?A$#19!63?A$#11!64?AA$#7!66?A$#4!67?AAAAA$#7!72?A$#5!73?A$#4!74?A$#21!75?A$#4!76?A$#31!77?A$#41!78?A$#48!79?A$#62!80?A$#73!81?A$#94!82?A$#83!83?A$#93!84?AA$#94!86?A$#83!87?A$#94!88?AA$#93!90?A$#80!91?A$#83!92?AA$#81!94?A$#83!95?AAAA$#81!99?A$#83!100?A$#81!101?AA$#94!103?A$#81!104?A$#76!105?A$#81!106?A$#83!107?AA$#82!109?A$#83!110?A$#80!111?A$#82!112?A$#78!113?A$#80!114?A$#75!115?A$#76!116?AA$#78!118?AAA$#77!121?A$#78!122?A$#75!123?A$#73!124?A$#75!125?A$#82!126?A$#76!127?A$#75!128?A$#76!129?A$#78!130?A$#80!131?A$#76!132?AA$#78!134?A$#76!135?A$#75!136?A$#76!137?AAA$#73!140?A$#62!141?AA$#57!143?AA$#43!145?A$#39!146?A$#30!147?A$#9!148?A$#27!149?A$#12!150?A$#14!151?A$#82!152?A$#27!153?A$#30!154?A$#51!155?A$#39!156?A$#37!157?A$#39!158?AA$#43!160?AA$#157!162?A$#49!163?A$#50!164?A$#52!165?A$#53!166?A$#63!167?A$#57!168?A$#53!169?A$#63!170?A$#62!171?AAA$#56!174?A$#67!175?A$#89!176?A$#79!177?A$#99!178?A$#92!179?AA$#83!181?AA$#93!183?A$#101!184?A$#95!185?A$#96!186?A$#94!187?A$#117!188?AA$#123!190?AA$#111!192?A$#83!193?A$#131!194?AA$#96!196?A$#84!197?A$#101!198?A$#138!199?A$#157!200?A$#165!201?A$#150!202?A$#137!203?A$#153!204?A$#168!205?A$#166!206?A$#157!207?A$#165!208?AA$#157!210?A$#138!211?A$#130!212?A$#103!213?A$#104!214?A$#101!215?A$#94!216?A$#71!217?A$#51!218?AA$#82!220?A$#109!221?A$#131!222?AA$#142!224?A$#157!225?A$#169!226?A$#157!227?AAA$#168!230?A$#169!231?A$#174!232?A$#187!233?A$#193!234?AAA$#205!237?A$#204!238?AA$#214!240?A$#195!241?A$#219!242?A$#215!243?A$#218!244?A$#220!245?A$#216!246?AA$#217!248?A$#203!249?A$#217!250?A$#216!251?AAA$#217!254?AAA$#214!257?A$#205!258?A$#216!259?A$#204!260?A$#205!261?AAAAAA$#214!267?A$#19CC$#11!2?C$#24!3?CC$#21!5?C$#19!6?C$#18!7?CC$#24!9?CC$#18!11?C$#24!12?C$#27!13?C$#22!14?CC$#24!16?C$#11!17?C$#18!18?C$#19!19?C$#21!20?C$#27!21?CC$#24!23?C$#18!24?C$#22!25?C$#27!26?C$#30!27?C$#36!28?CC$#32!30?C$#27!31?CCCC$#30!35?C$#27!36?CC$#22!38?C$#24!39?C$#18!40?CC$#11!42?C$#4!43?CC$#11!45?C$#19!46?C$#4!47?C$#11!48?CC$#4!50?CC$#7!52?C$#1!53?C$#7!54?CCC$#4!57?C$#11!58?C$#19!59?C$#11!60?CCCC$#19!64?C$#4!65?C$#11!66?C$#4!67?CCC$#5!70?C$#4!71?CC$#5!73?C$#11!74?CC$#19!76?C$#36!77?C$#40!78?C$#47!79?C$#56!80?C$#71!81?C$#81!82?C$#93!83?C$#95!84?C$#93!85?C$#94!86?C$#93!87?C$#83!88?C$#94!89?C$#83!90?C$#93!91?C$#62!92?C$#78!93?C$#94!94?C$#93!95?CC$#94!97?C$#95!98?C$#93!99?CCC$#83!102?CCC$#94!105?CC$#93!107?C$#83!108?CC$#94!110?C$#93!111?C$#81!112?C$#80!113?C$#76!114?CC$#80!116?C$#83!117?C$#80!118?C$#75!119?C$#82!120?C$#76!121?C$#78!122?C$#80!123?C$#76!124?C$#80!125?C$#78!126?CC$#80!128?C$#78!129?C$#94!130?C$#81!131?C$#78!132?C$#82!133?C$#76!134?C$#80!135?C$#76!136?C$#78!137?C$#73!138?C$#78!139?C$#76!140?C$#73!141?C$#71!142?C$#76!143?C$#49!144?C$#42!145?C$#39!146?C$#37!147?C$#45!148?C$#14!149?C$#12!150?C$#64!151?C$#30!152?C$#27!153?C$#64!154?C$#30!155?C$#37!156?C$#39!157?C$#37!158?C$#42!159?C$#44!160?C$#131!161?C$#43!162?C$#45!163?C$#48!164?C$#52!165?C$#57!166?CCC$#56!169?C$#76!170?C$#67!171?CC$#73!173?C$#66!174?C$#85!175?C$#84!176?C$#83!177?C$#84!178?C$#89!179?C$#93!180?C$#83!181?C$#94!182?C$#95!183?C$#94!184?C$#103!185?C$#95!186?C$#107!187?C$#111!188?C$#132!189?C$#138!190?CC$#107!192?C$#95!193?C$#111!194?C$#131!195?C$#95!196?C$#67!197?C$#131!198?C$#157!199?C$#165!200?C$#150!201?C$#153!202?C$#173!203?CC$#165!205?C$#180!206?C$#166!207?C$#176!208?C$#166!209?C$#180!210?C$#157!211?C$#138!212?C$#123!213?C$#117!214?C$#109!215?C$#94!216?C$#76!217?C$#64!218?C$#46!219?C$#70!220?C$#104!221?C$#131!222?CC$#147!224?C$#157!225?CCCC$#169!229?CC$#187!231?C$#175!232?C$#189!233?C$#187!234?C$#193!235?CCC$#204!238?C$#202!239?C$#205!240?CC$#221!242?C$#214!243?CC$#219!245?C$#218!246?C$#220!247?C$#219!248?C$#216!249?CC$#217!251?C$#216!252?CC$#217!254?CCC$#215!257?C$#218!258?C$#215!259?CC$#205!261?CC$#214!263?C$#205!264?C$#215!265?C$#218!266?CC$#21G$#19!1?G$#11!2?G$#21!3?G$#24!4?G$#18!5?G$#11!6?G$#18!7?GG$#24!9?GGG$#27!12?G$#36!13?G$#27!14?G$#24!15?GGGGG$#30!20?GG$#22!22?G$#18!23?G$#24!24?G$#27!25?G$#18!26?G$#30!27?G$#34!28?G$#32!29?G$#27!30?GGGG$#30!34?G$#27!35?G$#22!36?G$#11!37?G$#27!38?G$#24!39?G$#19!40?G$#4!41?G$#11!42?GG$#4!44?G$#11!45?G$#4!46?G$#19!47?G$#11!48?G$#4!49?G$#19!50?GGG$#1!53?G$#7!54?G$#5!55?G$#12!56?GG$#7!58?G$#11!59?G$#19!60?G$#11!61?GGGGGG$#5!67?G$#4!68?G$#5!69?G$#4!70?GG$#11!72?GGG$#4!75?G$#11!76?G$#31!77?G$#41!78?G$#48!79?G$#62!80?G$#73!81?G$#81!82?G$#93!83?G$#95!84?GGGG$#83!88?G$#47!89?GG$#92!91?G$#65!92?G$#95!93?G$#83!94?G$#94!95?G$#83!96?G$#93!97?G$#94!98?G$#93!99?GGGGG$#94!104?G$#93!105?G$#94!106?G$#93!107?G$#83!108?G$#94!109?G$#83!110?GGGGGGGGG$#80!119?G$#83!120?GGG$#94!123?G$#81!124?GG$#80!126?G$#76!127?G$#83!128?G$#76!129?G$#83!130?G$#78!131?G$#82!132?G$#80!133?G$#78!134?G$#82!135?G$#78!136?G$#82!137?G$#78!138?GG$#72!140?G$#76!141?G$#78!142?G$#56!143?G$#51!144?G$#43!145?G$#39!146?G$#68!147?G$#21!148?G$#14!149?G$#11!150?G$#30!151?G$#14!152?G$#64!153?G$#30!154?G$#36!155?GG$#37!157?G$#39!158?G$#42!159?G$#109!160?G$#131!161?G$#46!162?GG$#45!164?G$#52!165?G$#67!166?G$#72!167?G$#67!168?G$#111!169?GG$#79!171?G$#75!172?G$#67!173?G$#75!174?GG$#93!176?G$#103!177?G$#93!178?G$#92!179?G$#94!180?G$#104!181?G$#83!182?G$#81!183?G$#93!184?G$#103!185?G$#94!186?G$#107!187?G$#123!188?G$#150!189?G$#130!190?G$#117!191?G$#107!192?G$#95!193?G$#96!194?G$#111!195?G$#93!196?GG$#130!198?G$#152!199?G$#153!200?G$#167!201?G$#173!202?G$#180!203?G$#176!204?G$#173!205?G$#166!206?G$#167!207?G$#146!208?G$#182!209?G$#148!210?GG$#130!212?G$#107!213?G$#95!214?GG$#109!216?G$#95!217?G$#74!218?G$#57!219?G$#64!220?G$#95!221?G$#123!222?GG$#131!224?G$#147!225?G$#157!226?G$#169!227?G$#157!228?G$#184!229?GG$#193!231?G$#175!232?G$#188!233?G$#187!234?G$#190!235?G$#193!236?G$#187!237?G$#193!238?G$#195!239?G$#199!240?G$#205!241?G$#219!242?G$#214!243?GG$#220!245?GGGG$#219!249?G$#216!250?G$#217!251?G$#216!252?G$#217!253?GGG$#218!256?G$#214!257?G$#219!258?G$#215!259?G$#214!260?G$#215!261?G$#205!262?G$#214!263?G$#215!264?GG$#218!266?G$#219!267?G$#19O$#21!1?OOO$#18!4?OO$#21!6?O$#18!7?OO$#24!9?O$#30!10?O$#24!11?OOO$#11!14?O$#18!15?OO$#24!17?O$#18!18?OO$#24!20?O$#27!21?O$#24!22?OOO$#18!25?O$#31!26?O$#30!27?O$#23!28?O$#31!29?O$#30!30?OO$#27!32?O$#30!33?OOOO$#27!37?O$#24!38?OO$#18!40?O$#19!41?O$#11!42?O$#4!43?O$#19!44?O$#11!45?OO$#4!47?OO$#11!49?O$#4!50?O$#11!51?OO$#12!53?O$#7!54?O$#11!55?O$#14!56?O$#12!57?O$#5!58?O$#11!59?O$#19!60?O$#11!61?OOO$#4!64?O$#11!65?O$#4!66?OOOOOOO$#11!73?OO$#5!75?O$#11!76?O$#36!77?O$#40!78?O$#48!79?O$#56!80?O$#76!81?O$#83!82?O$#94!83?OO$#95!85?O$#93!86?O$#95!87?O$#53!88?O$#47!89?O$#103!90?O$#117!91?O$#137!92?O$#117!93?O$#123!94?O$#95!95?O$#93!96?O$#95!97?OO$#93!99?O$#95!100?O$#93!101?OO$#95!103?O$#93!104?OO$#94!106?O$#83!107?O$#93!108?OOOOO$#94!113?O$#93!114?OO$#83!116?OOOOOOO$#79!123?O$#80!124?O$#83!125?OOOOOO$#81!131?O$#83!132?O$#80!133?O$#83!134?O$#80!135?O$#81!136?O$#78!137?O$#80!138?OO$#73!140?O$#94!141?O$#62!142?O$#63!143?O$#49!144?O$#42!145?O$#43!146?O$#37!147?O$#27!148?O$#14!149?O$#64!150?O$#14!151?O$#68!152?O$#30!153?O$#21!154?O$#37!155?O$#39!156?OOO$#50!159?O$#45!160?O$#46!161?O$#45!162?OO$#48!164?O$#73!165?O$#89!166?O$#85!167?O$#132!168?O$#149!169?O$#103!170?O$#85!171?O$#76!172?O$#78!173?O$#103!174?O$#92!175?O$#117!176?OO$#103!178?O$#107!179?O$#117!180?O$#111!181?OOO$#117!184?O$#103!185?O$#107!186?O$#126!187?O$#137!188?OO$#123!190?O$#130!191?O$#107!192?O$#111!193?O$#94!194?O$#101!195?O$#94!196?O$#111!197?O$#149!198?O$#150!199?O$#167!200?O$#180!201?O$#176!202?O$#192!203?O$#182!204?O$#173!205?O$#180!206?O$#167!207?OO$#165!209?O$#153!210?O$#148!211?O$#137!212?O$#130!213?O$#95!214?O$#96!215?O$#104!216?O$#106!217?O$#95!218?O$#63!219?O$#50!220?O$#82!221?O$#106!222?O$#131!223?OO$#147!225?O$#169!226?O$#157!227?O$#165!228?O$#175!229?O$#169!230?O$#174!231?O$#188!232?O$#175!233?O$#184!234?O$#194!235?O$#204!236?OO$#202!238?O$#195!239?O$#205!240?O$#202!241?O$#218!242?O$#212!243?O$#215!244?O$#222!245?OOO$#220!248?O$#221!249?O$#216!250?OOO$#217!253?OO$#216!255?O$#215!256?O$#214!257?O$#218!258?O$#219!259?O$#216!260?O$#214!261?OOO$#218!264?O$#219!265?O$#218!266?O$#219!267?O$#19_$#21!1?___$#24!4?_$#18!5?_$#27!6?_$#24!7?_$#18!8?_$#22!9?_$#27!10?_$#24!11?_$#30!12?_$#24!13?_$#27!14?_$#24!15?____$#27!19?__$#22!21?_$#24!22?_$#18!23?_$#24!24?_$#27!25?__$#32!27?_$#30!28?__$#31!30?_$#27!31?_$#30!32?_$#18!33?_$#36!34?_$#22!35?_$#27!36?_$#18!37?_$#24!38?_$#18!39?__$#19!41?_$#4!42?_$#11!43?_$#4!44?_$#11!45?_$#19!46?_$#11!47?_$#4!48?_$#11!49?_$#4!50?_$#11!51?__$#12!53?_$#5!54?_$#7!55?_$#14!56?__$#12!58?_$#11!59?__$#21!61?_$#11!62?_$#19!63?_$#11!64?_$#4!65?__$#11!67?_$#5!68?_$#4!69?__$#5!71?_$#7!72?_$#11!73?_$#4!74?__$#19!76?_$#30!77?_$#42!78?_$#48!79?_$#62!80?_$#73!81?_$#83!82?_$#93!83?_$#96!84?_$#93!85?_$#95!86?_$#73!87?_$#23!88?_$#47!89?_$#99!90?_$#110!91?_$#137!92?_$#148!93?_$#117!94?_$#94!95?__$#95!97?_$#93!98?_$#95!99?_$#94!100?__$#93!102?____$#94!106?_$#93!107?_$#94!108?__$#93!110?___$#94!113?_$#93!114?_$#83!115?_$#93!116?_$#83!117?_$#93!118?__$#83!120?____$#81!124?__$#93!126?_$#94!127?_$#83!128?_$#95!129?_$#81!130?_$#94!131?_$#83!132?__$#81!134?_$#83!135?_$#80!136?_$#82!137?_$#81!138?_$#80!139?_$#104!140?_$#76!141?_$#62!142?_$#57!143?_$#50!144?_$#46!145?_$#38!146?_$#37!147?_$#36!148?_$#69!149?_$#30!150?_$#69!151?_$#19!152?_$#39!153?_$#37!154?__$#39!156?__$#40!158?_$#38!159?_$#131!160?_$#49!161?_$#57!162?_$#62!163?_$#89!164?_$#92!165?_$#103!166?__$#147!168?_$#92!169?_$#99!170?_$#84!171?_$#107!172?___$#117!175?_$#126!176?_$#138!177?_$#103!178?_$#126!179?_$#117!180?_$#107!181?_$#123!182?_$#126!183?_$#138!184?_$#117!185?_$#123!186?_$#117!187?_$#107!188?_$#137!189?_$#110!190?_$#123!191?_$#117!192?_$#123!193?_$#111!194?_$#106!195?_$#107!196?_$#123!197?_$#152!198?_$#153!199?_$#180!200?_$#173!201?_$#192!202?_$#196!203?_$#182!204?_$#183!205?_$#182!206?_$#167!207?_$#153!208?_$#150!209?__$#165!211?_$#138!212?___$#93!215?_$#83!216?_$#94!217?_$#96!218?_$#77!219?_$#64!220?_$#70!221?_$#104!222?_$#131!223?__$#157!225?____$#168!229?_$#169!230?_$#175!231?_$#174!232?_$#188!233?_$#193!234?_$#204!235?_$#216!236?_$#194!237?_$#199!238?_$#202!239?__$#199!241?_$#215!242?_$#199!243?_$#218!244?_$#219!245?_$#220!246?_$#222!247?__$#221!249?_$#219!250?_$#216!251?__$#217!253?__$#219!255?_$#218!256?__$#219!258?_$#221!259?_$#219!260?_$#215!261?_$#218!262?_$#205!263?_$#214!264?_$#218!265?__$#219!267?_$-#24@$#11!1?@$#19!2?@$#24!3?@@@@$#27!7?@@@$#22!10?@$#27!11?@$#22!12?@$#18!13?@$#27!14?@@$#18!16?@@$#27!18?@@$#22!20?@$#24!21?@$#22!22?@$#24!23?@$#18!24?@$#22!25?@@$#32!27?@$#36!28?@@$#23!30?@$#30!31?@$#11!32?@$#30!33?@$#27!34?@@@@@$#18!39?@@$#19!41?@$#11!42?@@@$#4!45?@@$#11!47?@$#19!48?@$#11!49?@@@@$#12!53?@$#5!54?@$#7!55?@$#11!56?@@$#1!58?@@$#19!60?@$#11!61?@@@$#19!64?@$#11!65?@$#4!66?@$#11!67?@$#5!68?@$#4!69?@$#7!70?@$#4!71?@@$#5!73?@@$#19!75?@@$#31!77?@$#39!78?@$#48!79?@$#53!80?@$#73!81?@$#81!82?@$#84!83?@$#93!84?@@$#47!86?@$#40!87?@$#15!88?@$#47!89?@$#103!90?@$#110!91?@$#154!92?@$#130!93?@$#107!94?@$#81!95?@$#94!96?@$#93!97?@@$#95!99?@$#93!100?@$#94!101?@@@$#93!104?@@$#94!106?@$#93!107?@@@@@@@$#94!114?@@@$#93!117?@$#83!118?@@$#93!120?@$#81!121?@$#93!122?@@$#83!124?@@$#79!126?@$#83!127?@$#79!128?@$#93!129?@$#83!130?@@$#81!132?@$#83!133?@$#80!134?@$#83!135?@$#80!136?@$#76!137?@@$#73!139?@$#72!140?@$#62!141?@$#63!142?@$#53!143?@$#48!144?@$#95!145?@$#41!146?@$#45!147?@$#41!148?@@$#77!150?@$#41!151?@$#47!152?@@@@$#50!156?@$#47!157?@$#52!158?@$#46!159?@$#41!160?@$#71!161?@$#58!162?@$#85!163?@$#99!164?@$#66!165?@$#79!166?@$#157!167?@$#84!168?@$#103!169?@$#111!170?@$#93!171?@$#103!172?@@$#123!174?@$#107!175?@$#117!176?@$#138!177?@$#126!178?@$#117!179?@@$#138!181?@$#117!182?@$#150!183?@$#138!184?@$#107!185?@$#123!186?@@$#126!188?@$#123!189?@$#126!190?@$#138!191?@$#148!192?@$#117!193?@$#107!194?@$#96!195?@$#111!196?@$#138!197?@$#153!198?@$#150!199?@$#195!200?@$#173!201?@$#196!202?@$#182!203?@$#183!204?@$#154!205?@@$#167!207?@$#135!208?@$#154!209?@$#137!210?@$#126!211?@$#157!212?@$#148!213?@@$#130!215?@$#95!216?@$#94!217?@@$#83!219?@$#77!220?@$#63!221?@$#96!222?@$#131!223?@$#142!224?@$#147!225?@$#148!226?@$#157!227?@$#168!228?@$#175!229?@$#169!230?@@@$#188!233?@$#193!234?@$#206!235?@$#194!236?@$#204!237?@$#187!238?@@$#205!240?@$#214!241?@$#205!242?@$#195!243?@$#219!244?@$#217!245?@$#222!246?@$#220!247?@@$#221!249?@@$#216!251?@@@$#217!254?@$#219!255?@@$#218!257?@$#219!258?@$#220!259?@$#214!260?@@@@$#215!264?@$#218!265?@$#219!266?@$#218!267?@$#27A$#21!1?A$#19!2?A$#21!3?A$#24!4?A$#18!5?AA$#30!7?A$#27!8?A$#18!9?A$#30!10?AA$#31!12?A$#22!13?A$#18!14?A$#24!15?AAA$#18!18?A$#22!19?AA$#27!21?A$#22!22?A$#27!23?AAA$#30!26?A$#34!27?A$#32!28?A$#34!29?A$#27!30?A$#30!31?A$#18!32?A$#22!33?AAA$#27!36?A$#18!37?A$#22!38?A$#24!39?A$#19!40?A$#4!41?A$#11!42?A$#5!43?A$#4!44?A$#11!45?AA$#4!47?A$#11!48?A$#4!49?A$#11!50?AA$#7!52?A$#12!53?A$#5!54?A$#14!55?A$#11!56?AA$#1!58?A$#11!59?A$#19!60?AA$#11!62?AA$#19!64?A$#11!65?AA$#4!67?AA$#5!69?A$#4!70?A$#5!71?A$#11!72?A$#4!73?AAA$#11!76?A$#30!77?A$#40!78?A$#46!79?A$#55!80?A$#71!81?A$#82!82?A$#94!83?A$#83!84?A$#47!85?AA$#38!87?A$#46!88?A$#65!89?A$#135!90?A$#137!91?A$#148!92?A$#103!93?A$#81!94?A$#75!95?A$#94!96?A$#93!97?A$#95!98?A$#94!99?A$#93!100?A$#94!101?A$#93!102?A$#94!103?A$#93!104?AA$#84!106?AA$#93!108?A$#83!109?A$#94!110?A$#93!111?AA$#83!113?A$#94!114?AA$#93!116?A$#83!117?AAAA$#81!121?A$#83!122?AA$#93!124?A$#83!125?AAA$#81!128?A$#83!129?AAA$#94!132?A$#83!133?A$#94!134?A$#83!135?A$#78!136?A$#71!137?AA$#101!139?A$#53!140?A$#56!141?A$#57!142?A$#53!143?A$#54!144?A$#75!145?A$#58!146?A$#79!147?A$#130!148?A$#104!149?A$#79!150?A$#89!151?AA$#103!153?A$#110!154?A$#92!155?A$#99!156?A$#166!157?A$#79!158?A$#111!159?A$#84!160?A$#130!161?A$#89!162?A$#103!163?AAA$#157!166?A$#110!167?A$#117!168?A$#110!169?A$#117!170?A$#107!171?A$#117!172?A$#111!173?A$#123!174?A$#117!175?A$#110!176?AA$#137!178?A$#117!179?A$#138!180?A$#126!181?A$#138!182?A$#137!183?A$#126!184?A$#137!185?A$#150!186?A$#138!187?A$#130!188?A$#138!189?AAA$#152!192?A$#138!193?A$#107!194?A$#96!195?A$#131!196?A$#138!197?A$#165!198?AA$#182!200?AA$#172!202?A$#179!203?A$#154!204?A$#146!205?A$#179!206?A$#167!207?A$#150!208?AAAA$#136!212?A$#117!213?A$#126!214?A$#137!215?A$#138!216?A$#123!217?A$#111!218?A$#106!219?A$#101!220?A$#77!221?A$#82!222?A$#131!223?AA$#147!225?A$#168!226?A$#157!227?A$#165!228?A$#175!229?A$#169!230?AA$#174!232?A$#187!233?A$#193!234?A$#206!235?A$#193!236?A$#202!237?A$#187!238?A$#195!239?A$#205!240?A$#214!241?A$#219!242?A$#212!243?A$#219!244?A$#217!245?A$#220!246?A$#222!247?A$#219!248?A$#221!249?A$#222!250?A$#219!251?A$#216!252?AA$#220!254?A$#217!255?A$#215!256?A$#219!257?A$#221!258?AA$#219!260?A$#215!261?A$#214!262?A$#218!263?AA$#215!265?A$#221!266?A$#220!267?A$#24C$#27!1?C$#24!2?C$#27!3?C$#11!4?C$#24!5?C$#18!6?CC$#27!8?C$#30!9?CC$#24!11?C$#30!12?C$#22!13?C$#11!14?C$#24!15?CC$#18!17?C$#27!18?C$#22!19?C$#24!20?C$#27!21?C$#24!22?CCC$#30!25?CC$#34!27?C$#32!28?C$#34!29?C$#31!30?C$#27!31?CC$#24!33?C$#18!34?C$#30!35?C$#27!36?CC$#18!38?CC$#11!40?C$#4!41?C$#5!42?C$#11!43?CCCCCCC$#4!50?C$#11!51?CC$#12!53?CC$#14!55?C$#1!56?C$#11!57?CCCCC$#19!62?C$#11!63?C$#19!64?C$#11!65?C$#4!66?C$#11!67?C$#4!68?CC$#5!70?C$#4!71?CC$#5!73?C$#11!74?CCC$#27!77?C$#38!78?C$#44!79?C$#57!80?C$#62!81?CC$#76!83?C$#47!84?C$#41!85?CC$#47!87?C$#79!88?C$#112!89?C$#116!90?C$#126!91?C$#117!92?C$#79!93?C$#84!94?C$#103!95?C$#56!96?C$#82!97?C$#94!98?C$#93!99?C$#83!100?C$#82!101?C$#83!102?C$#78!103?C$#82!104?C$#76!105?C$#83!106?CC$#93!108?C$#83!109?C$#80!110?C$#83!111?CCCCC$#81!116?CC$#83!118?CC$#80!120?C$#83!121?CCC$#81!124?C$#83!125?C$#80!126?C$#83!127?C$#96!128?C$#83!129?CC$#80!131?C$#78!132?C$#80!133?C$#78!134?C$#74!135?C$#62!136?C$#56!137?CC$#73!139?C$#62!140?C$#73!141?C$#67!142?CC$#79!144?C$#103!145?C$#91!146?CC$#110!148?CCC$#103!151?C$#117!152?C$#110!153?C$#116!154?C$#126!155?C$#103!156?C$#110!157?C$#117!158?C$#107!159?CC$#123!161?C$#110!162?C$#103!163?C$#92!164?C$#157!165?C$#103!166?C$#110!167?C$#103!168?C$#117!169?C$#110!170?C$#117!171?C$#103!172?C$#123!173?C$#138!174?C$#126!175?CCC$#138!178?C$#117!179?C$#138!180?CC$#107!182?C$#137!183?C$#126!184?C$#137!185?C$#152!186?C$#130!187?CC$#153!189?C$#130!190?C$#138!191?C$#149!192?C$#157!193?C$#111!194?C$#131!195?C$#117!196?C$#126!197?C$#153!198?C$#180!199?C$#165!200?C$#179!201?C$#143!202?C$#179!203?C$#198!204?C$#167!205?CCC$#183!208?C$#173!209?C$#182!210?C$#153!211?C$#150!212?C$#153!213?C$#154!214?C$#150!215?C$#137!216?C$#111!217?C$#106!218?C$#101!219?C$#104!220?CC$#82!222?C$#131!223?C$#147!224?C$#157!225?C$#168!226?C$#157!227?C$#168!228?CC$#175!230?C$#157!231?C$#168!232?C$#193!233?C$#187!234?C$#193!235?C$#188!236?C$#195!237?C$#214!238?C$#195!239?C$#204!240?C$#214!241?C$#215!242?C$#202!243?C$#220!244?CC$#219!246?C$#222!247?C$#219!248?C$#222!249?CC$#221!251?C$#217!252?C$#219!253?C$#220!254?C$#219!255?C$#218!256?C$#219!257?CCC$#223!260?C$#218!261?C$#214!262?C$#212!263?C$#218!264?C$#219!265?C$#232!266?C$#222!267?C$#27G$#24!1?G$#27!2?G$#18!3?GGG$#24!6?G$#27!7?GG$#36!9?G$#11!10?G$#30!11?G$#27!12?GG$#24!14?G$#27!15?G$#11!16?G$#24!17?G$#11!18?G$#24!19?GGGGG$#27!24?G$#23!25?G$#32!26?G$#34!27?G$#36!28?G$#34!29?G$#30!30?GG$#22!32?G$#27!33?G$#30!34?GGG$#27!37?G$#18!38?GG$#11!40?GG$#4!42?G$#21!43?G$#11!44?GGGGGG$#7!50?GG$#5!52?G$#12!53?G$#7!54?G$#12!55?G$#7!56?GG$#5!58?G$#19!59?G$#11!60?G$#19!61?GG$#11!63?G$#4!64?G$#11!65?GG$#4!67?G$#5!68?GG$#4!70?GGGGG$#11!75?G$#18!76?GG$#40!78?G$#42!79?G$#48!80?G$#41!81?G$#37!82?G$#47!83?G$#41!84?G$#47!85?GG$#90!87?G$#99!88?G$#117!89?G$#136!90?G$#111!91?G$#89!92?G$#95!93?G$#67!94?G$#92!95?G$#76!96?G$#48!97?G$#74!98?G$#73!99?G$#74!100?G$#56!101?GG$#62!103?G$#56!104?G$#53!105?G$#74!106?G$#82!107?GG$#78!109?G$#83!110?G$#80!111?GG$#83!113?G$#80!114?G$#83!115?G$#81!116?G$#82!117?G$#78!118?G$#83!119?G$#80!120?G$#78!121?G$#80!122?G$#81!123?G$#78!124?G$#81!125?G$#83!126?G$#76!127?G$#93!128?G$#83!129?G$#78!130?G$#76!131?G$#73!132?G$#76!133?G$#63!134?G$#56!135?GG$#72!137?G$#131!138?G$#78!139?G$#93!140?G$#66!141?G$#79!142?G$#111!143?G$#92!144?G$#99!145?GG$#110!147?G$#116!148?G$#99!149?G$#116!150?G$#107!151?G$#110!152?GG$#138!154?G$#126!155?G$#110!156?G$#135!157?G$#137!158?G$#103!159?G$#117!160?G$#138!161?G$#111!162?GG$#132!164?G$#107!165?G$#103!166?G$#92!167?G$#117!168?G$#110!169?G$#123!170?G$#126!171?GG$#123!173?G$#137!174?G$#126!175?GG$#138!177?G$#137!178?G$#117!179?G$#137!180?G$#149!181?G$#138!182?G$#137!183?G$#123!184?G$#150!185?G$#138!186?GG$#149!188?G$#180!189?G$#165!190?GG$#149!192?G$#103!193?G$#148!194?G$#111!195?G$#123!196?G$#137!197?G$#173!198?G$#167!199?GG$#180!201?G$#183!202?G$#182!203?G$#165!204?G$#167!205?G$#151!206?G$#182!207?G$#183!208?G$#154!209?G$#165!210?GG$#150!212?G$#165!213?G$#138!214?GG$#130!216?G$#111!217?G$#107!218?G$#104!219?G$#96!220?G$#95!221?G$#94!222?G$#101!223?G$#142!224?G$#157!225?G$#169!226?G$#157!227?GGG$#187!230?G$#171!231?G$#184!232?G$#169!233?G$#188!234?G$#193!235?G$#204!236?G$#205!237?GG$#199!239?G$#218!240?G$#214!241?GG$#202!243?G$#219!244?G$#216!245?G$#219!246?GG$#232!248?G$#222!249?G$#232!250?G$#222!251?G$#220!252?GG$#217!254?G$#219!255?G$#215!256?G$#219!257?G$#221!258?G$#219!259?G$#218!260?GGG$#214!263?G$#219!264?GG$#222!266?G$#220!267?G$#18O$#24!1?OO$#27!3?O$#18!4?OOO$#30!7?O$#27!8?O$#30!9?OO$#23!11?O$#22!12?O$#24!13?O$#27!14?OO$#18!16?O$#11!17?O$#18!18?OO$#27!20?O$#11!21?O$#22!22?OO$#27!24?O$#23!25?O$#32!26?OO$#36!28?O$#34!29?O$#30!30?OO$#22!32?O$#27!33?O$#30!34?O$#24!35?O$#30!36?O$#24!37?O$#18!38?OO$#11!40?OOOO$#19!44?O$#18!45?O$#11!46?O$#5!47?O$#4!48?O$#7!49?O$#11!50?O$#7!51?OOOOO$#11!56?OOO$#19!59?O$#11!60?O$#19!61?O$#11!62?OOOO$#4!66?O$#7!67?O$#11!68?O$#4!69?OO$#5!71?O$#4!72?OO$#11!74?O$#5!75?O$#4!76?O$#22!77?O$#34!78?O$#42!79?O$#37!80?OO$#41!82?O$#38!83?O$#47!84?O$#58!85?O$#88!86?O$#115!87?O$#125!88?O$#135!89?O$#98!90?O$#99!91?O$#79!92?OO$#93!94?O$#92!95?O$#79!96?O$#76!97?O$#40!98?O$#46!99?O$#45!100?O$#43!101?O$#48!102?O$#56!103?O$#54!104?O$#56!105?O$#58!106?O$#56!107?OO$#62!109?O$#73!110?O$#76!111?O$#78!112?OO$#73!114?O$#82!115?O$#76!116?O$#73!117?O$#76!118?O$#73!119?O$#75!120?OO$#76!122?O$#78!123?O$#75!124?O$#73!125?O$#75!126?O$#73!127?O$#75!128?O$#78!129?O$#62!130?OO$#56!132?O$#71!133?O$#56!134?O$#54!135?O$#67!136?OO$#73!138?O$#75!139?O$#79!140?OOO$#92!143?O$#91!144?O$#87!145?O$#99!146?O$#110!147?O$#116!148?O$#110!149?OO$#116!151?OO$#110!153?O$#135!154?O$#202!155?O$#137!156?O$#166!157?O$#126!158?O$#123!159?O$#137!160?O$#138!161?O$#123!162?O$#157!163?O$#123!164?O$#107!165?O$#117!166?O$#103!167?OO$#117!169?O$#107!170?O$#126!171?O$#110!172?O$#117!173?O$#150!174?OO$#137!176?OO$#126!178?O$#138!179?O$#137!180?O$#138!181?O$#148!182?O$#137!183?O$#153!184?O$#148!185?O$#138!186?OOO$#153!189?OO$#165!191?O$#148!192?O$#126!193?O$#148!194?O$#111!195?O$#130!196?O$#137!197?O$#180!198?O$#167!199?O$#182!200?O$#179!201?O$#183!202?O$#192!203?O$#179!204?O$#172!205?OO$#183!207?O$#167!208?O$#172!209?O$#167!210?O$#173!211?OO$#165!213?O$#150!214?O$#138!215?OO$#117!217?O$#104!218?O$#94!219?O$#101!220?O$#111!221?O$#101!222?O$#95!223?O$#131!224?O$#148!225?O$#157!226?O$#169!227?O$#168!228?O$#157!229?O$#189!230?O$#175!231?O$#171!232?OO$#189!234?O$#187!235?O$#206!236?O$#193!237?O$#205!238?O$#176!239?O$#193!240?O$#204!241?O$#205!242?OO$#204!244?O$#217!245?O$#219!246?OO$#222!248?O$#231!249?O$#222!250?OOO$#220!253?O$#217!254?O$#218!255?O$#221!256?O$#219!257?O$#221!258?O$#224!259?O$#219!260?O$#214!261?O$#212!262?O$#218!263?OO$#223!265?O$#222!266?OO$#21_$#24!1?_$#18!2?_$#27!3?_$#24!4?__$#27!6?__$#31!8?_$#30!9?__$#27!11?____$#24!15?_$#18!16?__$#27!18?_$#24!19?_$#18!20?__$#24!22?_$#27!23?___$#30!26?_$#34!27?_$#23!28?_$#32!29?_$#27!30?____$#24!34?_$#27!35?_$#22!36?_$#27!37?_$#24!38?_$#11!39?__$#19!41?_$#4!42?_$#11!43?_$#4!44?_$#11!45?_____$#5!50?__$#7!52?___$#5!55?_$#12!56?_$#5!57?_$#11!58?__$#19!60?__$#21!62?_$#19!63?__$#4!65?____$#11!69?_$#5!70?_$#4!71?_$#11!72?_$#18!73?_$#4!74?_$#11!75?_$#18!76?_$#23!77?_$#37!78?_$#40!79?_$#41!80?__$#34!82?_$#47!83?_$#61!84?_$#88!85?_$#114!86?_$#155!87?_$#110!88?__$#117!90?_$#111!91?_$#130!92?_$#95!93?_$#107!94?_$#79!95?_$#95!96?_$#83!97?_$#54!98?_$#38!99?_$#34!100?_$#44!101?_$#46!102?__$#53!104?_$#56!105?_$#79!106?_$#76!107?_$#79!108?_$#66!109?_$#75!110?_$#73!111?_$#67!112?__$#71!114?__$#72!116?_$#71!117?__$#62!119?_$#71!120?_$#62!121?__$#73!123?_$#62!124?___$#95!127?_$#56!128?_$#62!129?__$#63!131?_$#48!132?_$#62!133?_$#67!134?_$#79!135?_$#58!136?_$#73!137?_$#93!138?_$#66!139?_$#58!140?_$#79!141?_$#111!142?_$#89!143?__$#99!145?_$#107!146?_$#99!147?_$#100!148?_$#90!149?_$#100!150?_$#116!151?__$#125!153?_$#123!154?_$#140!155?_$#137!156?__$#140!158?_$#123!159?_$#126!160?_$#148!161?_$#126!162?_$#137!163?_$#150!164?__$#138!166?__$#103!168?_$#138!169?_$#137!170?_$#123!171?_$#110!172?_$#117!173?_$#138!174?_$#137!175?___$#148!178?_$#150!179?_$#136!180?_$#140!181?_$#165!182?_$#138!183?_$#148!184?_$#153!185?_$#150!186?_$#123!187?_$#150!188?_$#153!189?_$#192!190?_$#150!191?_$#165!192?_$#157!193?_$#111!194?_$#107!195?_$#130!196?_$#153!197?_$#182!198?_$#183!199?_$#192!200?__$#183!202?__$#159!204?_$#164!205?_$#183!206?_$#164!207?_$#179!208?_$#151!209?_$#146!210?__$#154!212?_$#140!213?_$#150!214?__$#148!216?_$#111!217?___$#96!220?_$#117!221?_$#107!222?_$#104!223?_$#111!224?_$#157!225?_$#169!226?_$#171!227?_$#165!228?_$#175!229?_$#171!230?_$#168!231?_$#169!232?_$#175!233?_$#203!234?_$#194!235?_$#193!236?__$#205!238?_$#176!239?_$#195!240?_$#202!241?_$#205!242?__$#220!244?_$#219!245?_$#218!246?_$#222!247?_$#232!248?_$#225!249?_$#231!250?_$#224!251?_$#221!252?_$#220!253?_$#219!254?_$#218!255?__$#221!257?_$#222!258?_$#219!259?_$#226!260?___$#219!263?_$#221!264?_$#222!265?___$-#27@$#24!1?@$#11!2?@$#24!3?@@$#18!5?@$#27!6?@@@@$#30!10?@$#31!11?@$#27!12?@$#24!13?@@$#27!15?@$#24!16?@$#18!17?@@$#24!19?@@$#11!21?@$#24!22?@$#22!23?@$#30!24?@@$#31!26?@$#34!27?@@$#31!29?@$#27!30?@@$#22!32?@$#27!33?@@$#24!35?@$#27!36?@$#30!37?@$#18!38?@$#11!39?@@@$#4!42?@@$#11!44?@@@@$#4!48?@$#11!49?@@$#5!51?@$#1!52?@$#11!53?@$#7!54?@$#14!55?@@$#4!57?@$#11!58?@@$#19!60?@$#11!61?@$#19!62?@@$#11!64?@@$#4!66?@@$#11!68?@$#4!69?@$#11!70?@$#4!71?@$#11!72?@@@$#18!75?@$#4!76?@$#23!77?@$#40!78?@$#48!79?@$#41!80?@@$#34!82?@$#47!83?@$#59!84?@$#113!85?@$#125!86?@$#99!87?@$#117!88?@$#110!89?@$#99!90?@$#92!91?@$#107!92?@$#111!93?@$#123!94?@$#92!95?@$#79!96?@$#56!97?@$#48!98?@$#44!99?@$#39!100?@$#43!101?@@@$#54!104?@$#67!105?@$#84!106?@$#73!107?@$#60!108?@$#85!109?@$#89!110?@$#79!111?@@@@$#71!115?@$#67!116?@$#56!117?@$#62!118?@$#53!119?@$#57!120?@@@$#63!123?@$#52!124?@$#48!125?@$#57!126?@$#52!127?@$#51!128?@$#50!129?@$#57!130?@$#62!131?@@$#67!133?@$#58!134?@$#66!135?@$#67!136?@$#169!137?@$#84!138?@$#79!139?@$#66!140?@$#84!141?@$#65!142?@$#79!143?@$#92!144?@$#89!145?@$#79!146?@$#89!147?@$#99!148?@$#91!149?@$#100!150?@$#99!151?@@$#125!153?@$#154!154?@$#115!155?@$#180!156?@$#140!157?@@$#138!159?@$#153!160?@$#165!161?@$#135!162?@@$#151!164?@$#150!165?@$#165!166?@$#138!167?@$#157!168?@$#148!169?@$#117!170?@$#110!171?@$#103!172?@@$#138!174?@@$#103!176?@$#137!177?@@$#138!179?@$#165!180?@$#137!181?@$#167!182?@$#165!183?@$#150!184?@$#165!185?@$#153!186?@$#150!187?@$#182!188?@$#165!189?@$#140!190?@$#153!191?@$#150!192?@$#165!193?@$#123!194?@$#111!195?@$#157!196?@$#165!197?@$#182!198?@$#198!199?@$#200!200?@$#198!201?@@$#200!203?@$#179!204?@$#183!205?@$#213!206?@$#179!207?@$#159!208?@$#151!209?@$#172!210?@$#135!211?@$#146!212?@$#140!213?@$#137!214?@@@$#111!217?@$#130!218?@$#111!219?@$#117!220?@$#107!221?@$#106!222?@@$#109!224?@$#147!225?@$#169!226?@$#171!227?@$#168!228?@$#187!229?@$#169!230?@$#168!231?@$#184!232?@$#168!233?@$#204!234?@$#189!235?@$#175!236?@$#193!237?@$#195!238?@$#176!239?@$#199!240?@@$#202!242?@$#215!243?@$#220!244?@@$#219!246?@$#224!247?@$#232!248?@$#231!249?@$#224!250?@$#223!251?@$#232!252?@$#220!253?@$#217!254?@$#219!255?@@@@$#224!259?@$#218!260?@$#219!261?@$#225!262?@$#224!263?@$#219!264?@$#231!265?@@$#222!267?@$#27A$#24!1?AAAAA$#27!6?A$#24!7?A$#27!8?A$#22!9?A$#18!10?A$#27!11?AAA$#18!14?A$#24!15?AA$#11!17?A$#24!18?AA$#4!20?A$#18!21?A$#22!22?AA$#27!24?A$#30!25?A$#27!26?A$#32!27?A$#34!28?A$#32!29?AA$#31!31?A$#27!32?AAA$#24!35?AAA$#11!38?AA$#5!40?A$#4!41?A$#11!42?AAA$#4!45?AA$#11!47?A$#19!48?A$#4!49?A$#7!50?AA$#12!52?A$#7!53?AAAA$#11!57?A$#4!58?A$#11!59?AAA$#21!62?A$#11!63?A$#4!64?A$#11!65?AAA$#4!68?A$#11!69?AA$#4!71?A$#11!72?A$#4!73?A$#11!74?A$#24!75?A$#27!76?A$#34!77?A$#47!78?A$#41!79?A$#47!80?A$#41!81?AA$#47!83?A$#108!84?A$#100!85?A$#126!86?A$#117!87?A$#92!88?A$#79!89?A$#107!90?AA$#126!92?A$#130!93?A$#92!94?A$#85!95?A$#56!96?AA$#54!98?A$#41!99?A$#50!100?A$#45!101?A$#52!102?A$#67!103?A$#54!104?A$#58!105?A$#62!106?A$#47!107?A$#58!108?AA$#66!110?A$#79!111?A$#65!112?A$#66!113?AA$#79!115?A$#66!116?A$#79!117?A$#73!118?A$#62!119?A$#55!120?A$#52!121?A$#46!122?A$#57!123?A$#50!124?A$#52!125?A$#56!126?A$#50!127?A$#48!128?A$#46!129?A$#48!130?A$#54!131?AA$#72!133?A$#67!134?AA$#79!136?A$#67!137?A$#84!138?A$#83!139?A$#84!140?A$#79!141?A$#92!142?A$#99!143?A$#85!144?A$#123!145?A$#92!146?AA$#99!148?AAA$#116!151?A$#92!152?A$#167!153?A$#100!154?A$#126!155?A$#116!156?AA$#126!158?A$#137!159?AA$#135!161?A$#116!162?A$#140!163?A$#154!164?A$#150!165?AA$#176!167?A$#157!168?A$#149!169?A$#137!170?AA$#154!172?A$#117!173?A$#126!174?A$#180!175?A$#130!176?A$#150!177?A$#153!178?A$#151!179?A$#165!180?AA$#167!182?A$#154!183?A$#173!184?A$#167!185?A$#173!186?A$#183!187?A$#182!188?A$#165!189?A$#151!190?A$#176!191?A$#165!192?A$#195!193?A$#138!194?A$#148!195?A$#123!196?A$#173!197?A$#196!198?A$#198!199?A$#200!200?A$#183!201?A$#207!202?A$#181!203?A$#200!204?A$#181!205?A$#172!206?A$#179!207?A$#198!208?A$#183!209?A$#192!210?A$#154!211?A$#151!212?A$#154!213?A$#150!214?A$#154!215?A$#117!216?AAA$#111!219?AA$#130!221?A$#142!222?A$#147!223?A$#131!224?A$#123!225?A$#169!226?A$#184!227?A$#168!228?A$#187!229?A$#175!230?AA$#201!232?A$#175!233?A$#188!234?AA$#175!236?A$#193!237?A$#205!238?A$#176!239?A$#215!240?A$#199!241?A$#214!242?A$#218!243?A$#222!244?AA$#218!246?A$#232!247?A$#231!248?A$#223!249?A$#224!250?A$#223!251?A$#222!252?AA$#220!254?A$#219!255?AAA$#221!258?A$#219!259?A$#225!260?A$#219!261?A$#218!262?A$#219!263?A$#221!264?A$#222!265?AA$#231!267?A$#27C$#18!1?CC$#24!3?CC$#18!5?CC$#24!7?C$#18!8?C$#24!9?C$#18!10?C$#24!11?CCCC$#18!15?C$#24!16?C$#18!17?CC$#24!19?CCC$#18!22?C$#27!23?C$#22!24?C$#27!25?C$#22!26?C$#34!27?C$#23!28?C$#30!29?CC$#27!31?C$#22!32?C$#30!33?C$#27!34?C$#18!35?C$#24!36?CC$#19!38?C$#4!39?CC$#11!41?C$#4!42?C$#11!43?CC$#4!45?C$#11!46?CC$#4!48?C$#11!49?C$#4!50?C$#11!51?C$#7!52?CC$#1!54?C$#7!55?C$#1!56?C$#7!57?CC$#4!59?CC$#19!61?CC$#18!63?C$#19!64?C$#11!65?C$#4!66?C$#11!67?C$#4!68?C$#11!69?C$#18!70?C$#11!71?C$#18!72?CCC$#27!75?C$#36!76?C$#37!77?C$#47!78?CCCC$#41!82?C$#65!83?C$#115!84?C$#146!85?C$#79!86?C$#99!87?C$#117!88?CC$#149!90?C$#148!91?C$#103!92?C$#117!93?CC$#93!95?C$#72!96?C$#56!97?C$#67!98?C$#47!99?C$#67!100?C$#47!101?CC$#54!103?CC$#62!105?C$#73!106?C$#79!107?C$#66!108?C$#67!109?C$#84!110?C$#65!111?C$#66!112?C$#67!113?CC$#66!115?C$#84!116?C$#79!117?C$#67!118?C$#58!119?C$#80!120?C$#47!121?C$#56!122?C$#62!123?CC$#54!125?C$#67!126?C$#53!127?C$#62!128?CCC$#54!131?C$#73!132?C$#62!133?C$#56!134?C$#54!135?C$#76!136?C$#71!137?C$#78!138?C$#81!139?C$#84!140?C$#95!141?C$#103!142?CC$#85!144?C$#92!145?C$#111!146?C$#103!147?C$#91!148?C$#89!149?C$#99!150?C$#126!151?C$#137!152?C$#89!153?C$#105!154?C$#103!155?C$#133!156?C$#125!157?C$#165!158?C$#154!159?C$#116!160?C$#146!161?C$#179!162?C$#125!163?C$#146!164?CC$#165!166?C$#176!167?C$#150!168?C$#165!169?C$#137!170?C$#167!171?CC$#150!173?C$#137!174?C$#126!175?CC$#150!177?CC$#146!179?C$#151!180?C$#154!181?CC$#151!183?C$#154!184?C$#182!185?CC$#165!187?C$#182!188?CC$#153!190?C$#167!191?C$#153!192?CC$#149!194?CC$#123!196?C$#166!197?C$#198!198?CC$#181!200?C$#200!201?C$#181!202?CC$#179!204?C$#207!205?C$#198!206?C$#179!207?C$#192!208?C$#228!209?C$#200!210?C$#198!211?C$#192!212?C$#156!213?C$#165!214?CCC$#126!217?C$#123!218?C$#111!219?C$#107!220?C$#95!221?C$#117!222?CC$#130!224?C$#157!225?CC$#175!227?C$#165!228?C$#169!229?C$#171!230?C$#187!231?C$#188!232?C$#175!233?C$#184!234?C$#189!235?C$#204!236?CC$#214!238?C$#195!239?C$#212!240?C$#214!241?C$#212!242?C$#218!243?C$#222!244?C$#219!245?CC$#232!247?C$#231!248?C$#224!249?C$#222!250?C$#224!251?C$#232!252?C$#222!253?C$#224!254?C$#219!255?C$#218!256?CC$#223!258?C$#221!259?C$#225!260?CC$#218!262?C$#219!263?C$#221!264?C$#232!265?C$#221!266?C$#222!267?C$#24G$#18!1?G$#24!2?GGGGG$#18!7?G$#24!8?G$#11!9?G$#24!10?GG$#18!12?G$#24!13?G$#11!14?G$#27!15?G$#24!16?G$#18!17?G$#27!18?G$#24!19?G$#18!20?G$#24!21?G$#18!22?G$#22!23?G$#27!24?G$#30!25?G$#34!26?GGG$#31!29?G$#32!30?G$#30!31?G$#27!32?G$#30!33?GG$#27!35?G$#24!36?G$#27!37?G$#19!38?G$#11!39?GGG$#4!42?G$#11!43?GG$#19!45?G$#11!46?GGG$#4!49?GG$#7!51?GGGGG$#11!56?G$#7!57?GG$#19!59?G$#11!60?GG$#19!62?G$#11!63?G$#4!64?GGGG$#11!68?GGG$#18!71?G$#11!72?GG$#18!74?G$#15!75?G$#41!76?G$#47!77?G$#54!78?GG$#47!80?GG$#41!82?G$#99!83?G$#144!84?G$#103!85?G$#99!86?G$#111!87?GG$#117!89?GG$#130!91?G$#148!92?G$#107!93?G$#106!94?G$#111!95?G$#72!96?G$#71!97?G$#41!98?G$#54!99?G$#67!100?G$#54!101?G$#72!102?G$#58!103?GG$#67!105?G$#75!106?G$#78!107?G$#58!108?G$#54!109?G$#62!110?G$#59!111?G$#58!112?G$#79!113?G$#47!114?G$#58!115?G$#79!116?G$#66!117?G$#54!118?G$#67!119?G$#54!120?GGGG$#56!124?G$#73!125?GG$#56!127?G$#79!128?G$#73!129?G$#79!130?G$#72!131?G$#81!132?G$#54!133?G$#62!134?GG$#67!136?G$#62!137?G$#78!138?G$#76!139?G$#73!140?G$#103!141?GG$#95!143?G$#165!144?G$#111!145?G$#92!146?GGG$#66!149?G$#99!150?G$#165!151?G$#212!152?G$#79!153?G$#165!154?G$#110!155?G$#135!156?G$#183!157?G$#164!158?G$#120!159?G$#115!160?G$#125!161?G$#151!162?G$#125!163?G$#146!164?GG$#154!166?G$#167!167?G$#153!168?G$#150!169?G$#153!170?G$#166!171?G$#153!172?G$#137!173?G$#180!174?G$#137!175?G$#126!176?G$#137!177?G$#146!178?G$#135!179?G$#143!180?G$#151!181?G$#165!182?G$#183!183?G$#192!184?G$#167!185?G$#154!186?G$#165!187?G$#167!188?GG$#183!190?G$#173!191?G$#165!192?G$#152!193?GG$#157!195?GG$#180!197?G$#192!198?G$#198!199?G$#207!200?G$#200!201?GGG$#207!204?G$#200!205?G$#181!206?G$#213!207?G$#200!208?G$#181!209?G$#198!210?G$#196!211?G$#209!212?G$#182!213?G$#192!214?G$#150!215?G$#153!216?G$#167!217?G$#148!218?G$#123!219?GGG$#138!222?G$#166!223?G$#187!224?G$#165!225?G$#130!226?G$#171!227?G$#176!228?G$#206!229?G$#194!230?G$#205!231?G$#189!232?G$#193!233?GG$#204!235?G$#195!236?G$#193!237?G$#214!238?G$#205!239?G$#214!240?GG$#218!242?G$#223!243?G$#232!244?G$#221!245?G$#224!246?G$#232!247?G$#231!248?GG$#232!250?G$#222!251?GG$#232!253?G$#218!254?G$#219!255?GG$#224!257?GG$#215!259?GG$#226!261?GG$#224!263?G$#223!264?G$#219!265?G$#221!266?G$#222!267?G$#27O$#24!1?O$#18!2?OO$#24!4?O$#18!5?O$#24!6?OOO$#18!9?O$#27!10?O$#18!11?OOOOOO$#24!17?O$#18!18?O$#24!19?O$#18!20?O$#24!21?O$#27!22?O$#22!23?OO$#30!25?OO$#36!27?O$#34!28?OOO$#31!31?OO$#22!33?O$#27!34?O$#24!35?O$#27!36?O$#21!37?O$#19!38?O$#11!39?O$#5!40?O$#4!41?O$#11!42?OOOOO$#4!47?O$#11!48?OOO$#12!51?O$#14!52?O$#5!53?O$#14!54?O$#12!55?O$#11!56?OOOO$#19!60?OOO$#4!63?OOO$#11!66?O$#4!67?OO$#11!69?O$#18!70?OOOO$#24!74?O$#15!75?O$#41!76?OO$#47!78?OO$#54!80?O$#47!81?OO$#119!83?O$#99!84?O$#92!85?O$#123!86?O$#117!87?O$#137!88?O$#150!89?O$#103!90?O$#107!91?O$#92!92?O$#111!93?O$#83!94?O$#107!95?O$#79!96?O$#83!97?O$#54!98?O$#58!99?OO$#54!101?O$#75!102?O$#66!103?O$#58!104?O$#65!105?O$#58!106?O$#54!107?O$#66!108?OO$#47!110?O$#54!111?O$#79!112?O$#65!113?O$#58!114?O$#67!115?O$#66!116?O$#79!117?O$#65!118?O$#58!119?O$#47!120?O$#73!121?O$#89!122?O$#73!123?O$#79!124?O$#92!125?O$#65!126?OO$#79!128?OO$#111!130?O$#86!131?O$#89!132?O$#85!133?O$#67!134?O$#81!135?O$#78!136?O$#48!137?O$#73!138?O$#79!139?O$#111!140?O$#93!141?OO$#79!143?OO$#99!145?OO$#89!147?O$#99!148?O$#86!149?O$#123!150?O$#117!151?OO$#61!153?O$#116!154?O$#100!155?O$#116!156?O$#182!157?O$#112!158?O$#114!159?O$#119!160?O$#108!161?O$#125!162?O$#144!163?O$#154!164?O$#140!165?O$#156!166?O$#164!167?O$#154!168?O$#165!169?O$#150!170?O$#180!171?O$#137!172?O$#153!173?O$#182!174?O$#150!175?O$#140!176?O$#154!177?O$#146!178?O$#150!179?OO$#136!181?O$#150!182?O$#136!183?O$#173!184?O$#165!185?OOO$#182!188?OO$#211!190?O$#150!191?O$#165!192?O$#180!193?O$#157!194?O$#165!195?O$#148!196?O$#157!197?O$#196!198?O$#210!199?O$#207!200?O$#200!201?O$#207!202?OO$#181!204?OO$#200!206?O$#207!207?OO$#198!209?O$#179!210?O$#209!211?O$#183!212?O$#167!213?O$#198!214?O$#167!215?OO$#153!217?OO$#152!219?O$#168!220?O$#157!221?O$#142!222?O$#168!223?O$#193!224?O$#157!225?O$#111!226?O$#169!227?O$#165!228?O$#204!229?O$#193!230?OO$#206!232?O$#204!233?O$#217!234?O$#215!235?O$#199!236?OO$#202!238?OO$#219!240?O$#214!241?OO$#218!243?O$#222!244?O$#221!245?O$#218!246?O$#224!247?O$#231!248?O$#235!249?O$#231!250?OO$#232!252?OO$#221!254?O$#219!255?O$#218!256?O$#224!257?OO$#218!259?O$#214!260?OO$#219!262?OO$#223!264?O$#222!265?O$#223!266?O$#221!267?O$#24_$#18!1?____$#24!5?_$#22!6?_$#27!7?_$#18!8?_$#27!9?_$#11!10?_$#18!11?__$#24!13?_$#27!14?__$#24!16?_$#27!17?__$#18!19?_$#24!20?_$#11!21?_$#27!22?_$#24!23?_$#30!24?_$#22!25?_$#30!26?_$#31!27?_$#32!28?__$#30!30?__$#22!32?_$#27!33?_$#30!34?_$#24!35?_$#19!36?____$#11!40?__$#5!42?_$#4!43?_$#11!44?__$#19!46?_$#11!47?__$#21!49?_$#7!50?_$#12!51?_$#5!52?_$#4!53?_$#14!54?_$#12!55?_$#11!56?___$#19!59?_$#4!60?_$#19!61?__$#4!63?_$#11!64?_______$#18!71?___$#22!74?_$#37!75?_$#41!76?__$#47!78?_$#41!79?_$#58!80?__$#65!82?_$#112!83?_$#98!84?_$#117!85?_$#150!86?_$#137!87?_$#103!88?_$#135!89?_$#110!90?_$#138!91?_$#93!92?_$#79!93?_$#58!94?_$#89!95?_$#79!96?_$#54!97?_$#66!98?_$#60!99?_$#79!100?_$#65!101?_$#79!102?_$#65!103?_$#90!104?_$#86!105?_$#79!106?_$#86!107?_$#59!108?_$#61!109?_$#58!110?__$#79!112?_$#103!113?_$#85!114?_$#79!115?___$#66!118?_$#84!119?_$#79!120?_$#91!121?_$#87!122?_$#116!123?_$#117!124?_$#103!125?_$#99!126?__$#86!128?__$#110!130?_$#100!131?_$#110!132?_$#111!133?_$#93!134?_$#66!135?_$#168!136?_$#66!137?_$#56!138?_$#73!139?_$#93!140?_$#83!141?_$#103!142?_$#157!143?_$#79!144?_$#92!145?_$#91!146?_$#89!147?_$#99!148?_$#116!149?_$#126!150?_$#218!151?_$#135!152?_$#153!153?_$#110!154?_$#105!155?_$#209!156?_$#105!157?_$#112!158?_$#115!159?_$#105!160?_$#133!161?_$#112!162?_$#119!163?_$#127!164?_$#133!165?_$#172!166?_$#151!167?_$#146!168?_$#165!169?_$#154!170?_$#137!171?_$#153!172?__$#165!174?_$#173!175?_$#146!176?_$#165!177?_$#140!178?_$#165!179?__$#135!181?_$#137!182?__$#173!184?_$#153!185?_$#165!186?_$#153!187?_$#173!188?_$#180!189?_$#150!190?_$#153!191?_$#211!192?_$#192!193?_$#180!194?__$#168!196?_$#176!197?_$#209!198?_$#210!199?__$#207!201?_$#200!202?_$#181!203?_$#200!204?___$#208!207?_$#170!208?_$#229!209?_$#207!210?__$#198!212?_$#210!213?_$#192!214?__$#182!216?_$#192!217?_$#165!218?_$#157!219?_$#176!220?_$#187!221?_$#175!222?__$#184!224?_$#175!225?_$#117!226?_$#168!227?__$#206!229?_$#193!230?_$#216!231?_$#201!232?_$#215!233?_$#216!234?_$#219!235?_$#204!236?__$#205!238?_$#199!239?_$#214!240?_$#212!241?_$#219!242?__$#222!244?_$#223!245?_$#224!246?_$#231!247?_$#235!248?_$#225!249?_$#231!250?_$#224!251?_$#223!252?_$#232!253?_$#221!254?_$#219!255?__$#221!257?__$#219!259?_$#226!260?_$#212!261?_$#219!262?_$#214!263?_$#219!264?_$#222!265?_$#223!266?_$#221!267?_$-#4@$#24!1?@$#18!2?@@@$#24!5?@@$#18!7?@@@$#24!10?@@$#11!12?@$#18!13?@@$#24!15?@$#18!16?@$#24!17?@$#30!18?@$#24!19?@@@$#27!22?@$#24!23?@$#27!24?@$#32!25?@@$#30!27?@$#32!28?@$#34!29?@$#31!30?@$#27!31?@$#30!32?@$#27!33?@$#22!34?@$#27!35?@$#11!36?@$#19!37?@@$#11!39?@@@$#1!42?@$#11!43?@@$#19!45?@@$#11!47?@@@$#14!50?@$#12!51?@$#11!52?@$#4!53?@$#5!54?@$#11!55?@$#12!56?@$#11!57?@$#4!58?@$#19!59?@$#11!60?@$#19!61?@$#11!62?@@$#18!64?@$#11!65?@$#4!66?@$#11!67?@@@$#18!70?@@@@$#32!74?@$#37!75?@$#41!76?@@@$#38!79?@$#47!80?@@$#99!82?@$#115!83?@$#99!84?@$#138!85?@$#126!86?@@@$#137!89?@$#140!90?@$#85!91?@$#66!92?@$#62!93?@$#54!94?@$#84!95?@$#60!96?@$#66!97?@$#59!98?@$#86!99?@$#61!100?@$#79!101?@$#61!102?@$#91!103?@$#116!104?@$#91!105?@$#90!106?@$#112!107?@$#65!108?@@$#90!110?@$#105!111?@$#90!112?@$#110!113?@$#99!114?@$#110!115?@$#91!116?@$#92!117?@$#67!118?@$#91!119?@$#99!120?@$#91!121?@$#116!122?@$#103!123?@$#123!124?@$#126!125?@$#146!126?@$#117!127?@$#100!128?@$#87!129?@$#99!130?@$#100!131?@$#125!132?@$#105!133?@$#99!134?@@$#103!136?@$#89!137?@$#79!138?@$#67!139?@$#73!140?@$#79!141?@$#103!142?@$#165!143?@$#92!144?@@$#91!146?@$#86!147?@$#91!148?@$#110!149?@$#150!150?@$#111!151?@$#103!152?@$#110!153?@$#135!154?@$#214!155?@$#112!156?@$#108!157?@$#90!158?@$#108!159?@$#125!160?@$#120!161?@$#121!162?@$#179!163?@$#121!164?@$#146!165?@$#144!166?@$#135!167?@$#154!168?@$#146!169?@$#198!170?@$#182!171?@@$#173!173?@$#166!174?@$#150!175?@$#135!176?@$#165!177?@$#192!178?@$#164!179?@$#165!180?@$#173!181?@$#153!182?@$#137!183?@$#150!184?@@$#137!186?@$#196!187?@$#153!188?@$#180!189?@$#150!190?@$#165!191?@$#212!192?@$#173!193?@$#192!194?@$#196!195?@$#153!196?@$#166!197?@$#212!198?@$#227!199?@$#210!200?@$#200!201?@$#181!202?@@$#208!204?@$#207!205?@@$#208!207?@$#207!208?@$#208!209?@$#213!210?@$#172!211?@$#198!212?@$#179!213?@$#227!214?@$#211!215?@$#165!216?@$#196!217?@$#195!218?@$#165!219?@$#176!220?@$#157!221?@$#165!222?@$#157!223?@$#168!224?@@$#157!226?@@$#187!228?@$#204!229?@$#194!230?@$#187!231?@@$#204!233?@$#216!234?@$#215!235?@$#202!236?@$#217!237?@$#202!238?@$#214!239?@$#221!240?@$#219!241?@$#215!242?@$#222!243?@@$#219!245?@$#224!246?@$#235!247?@@@$#234!250?@$#231!251?@$#232!252?@$#231!253?@@$#225!255?@@$#223!257?@$#221!258?@$#219!259?@@$#218!261?@@@$#221!264?@$#218!265?@$#223!266?@$#221!267?@$#19AA$#18!2?A$#24!3?A$#18!4?A$#11!5?A$#24!6?A$#18!7?AAA$#24!10?A$#18!11?A$#4!12?A$#18!13?A$#24!14?AA$#30!16?A$#24!17?AAAAAA$#27!23?AA$#32!25?AAA$#36!28?A$#32!29?A$#34!30?A$#31!31?A$#22!32?AA$#27!34?A$#24!35?AA$#19!37?A$#4!38?AAAA$#11!42?A$#4!43?A$#19!44?A$#4!45?A$#5!46?A$#11!47?A$#5!48?A$#1!49?A$#12!50?AAA$#14!53?A$#4!54?A$#7!55?AA$#11!57?A$#21!58?A$#11!59?AAA$#19!62?A$#18!63?A$#11!64?AAA$#18!67?A$#11!68?AA$#18!70?AA$#11!72?AA$#30!74?A$#34!75?A$#38!76?AA$#37!78?A$#34!79?A$#41!80?A$#65!81?A$#87!82?A$#126!83?A$#116!84?A$#110!85?A$#151!86?A$#92!87?A$#110!88?A$#116!89?A$#91!90?A$#79!91?A$#47!92?A$#71!93?A$#47!94?A$#79!95?A$#65!96?A$#86!97?A$#79!98?A$#65!99?A$#107!100?A$#60!101?A$#86!102?A$#100!103?A$#91!104?A$#90!105?A$#97!106?A$#112!107?A$#90!108?A$#112!109?A$#135!110?A$#90!111?A$#100!112?A$#119!113?A$#112!114?A$#99!115?A$#119!116?A$#90!117?A$#110!118?AA$#103!120?A$#105!121?A$#110!122?AA$#126!124?AA$#135!126?A$#125!127?A$#146!128?A$#125!129?A$#105!130?A$#90!131?A$#108!132?A$#115!133?A$#116!134?A$#136!135?A$#107!136?A$#103!137?A$#85!138?A$#73!139?A$#67!140?A$#73!141?A$#93!142?AA$#79!144?A$#168!145?A$#107!146?A$#92!147?A$#165!148?A$#90!149?A$#212!150?A$#91!151?A$#107!152?A$#116!153?A$#195!154?A$#112!155?AA$#99!157?A$#87!158?A$#112!159?A$#97!160?A$#113!161?A$#209!162?A$#133!163?AA$#146!165?A$#163!166?A$#115!167?A$#179!168?A$#172!169?A$#151!170?A$#172!171?A$#209!172?A$#202!173?A$#165!174?A$#150!175?A$#180!176?A$#135!177?A$#192!178?A$#164!179?AA$#167!181?AA$#140!183?A$#137!184?A$#150!185?AA$#167!187?A$#173!188?A$#165!189?A$#150!190?A$#165!191?AA$#180!193?A$#212!194?A$#195!195?A$#149!196?A$#195!197?A$#225!198?A$#210!199?A$#208!200?A$#207!201?A$#208!202?A$#207!203?A$#208!204?A$#207!205?A$#181!206?A$#208!207?A$#213!208?A$#208!209?A$#213!210?A$#181!211?A$#213!212?A$#210!213?A$#209!214?A$#211!215?A$#182!216?AAA$#219!219?A$#173!220?A$#195!221?A$#173!222?A$#157!223?A$#187!224?A$#193!225?A$#176!226?A$#111!227?A$#184!228?A$#194!229?A$#205!230?A$#206!231?A$#217!232?A$#193!233?A$#222!234?A$#214!235?A$#202!236?A$#205!237?A$#215!238?A$#219!239?A$#218!240?AA$#224!242?A$#222!243?AA$#223!245?A$#231!246?A$#235!247?A$#236!248?A$#231!249?A$#235!250?A$#239!251?A$#234!252?A$#232!253?A$#223!254?A$#219!255?AA$#223!257?A$#232!258?A$#223!259?A$#218!260?AAA$#225!263?A$#224!264?A$#219!265?A$#223!266?AA$#4C$#19!1?C$#21!2?C$#19!3?C$#18!4?C$#24!5?CC$#18!7?C$#24!8?CC$#18!10?C$#24!11?CCCC$#27!15?CC$#22!17?C$#30!18?C$#27!19?C$#18!20?C$#11!21?C$#18!22?C$#27!23?CC$#30!25?CC$#22!27?C$#32!28?C$#36!29?C$#34!30?C$#30!31?CCC$#22!34?C$#27!35?C$#24!36?C$#19!37?C$#11!38?CC$#4!40?CC$#11!42?C$#18!43?C$#11!44?CCCC$#4!48?C$#1!49?C$#11!50?C$#12!51?C$#14!52?C$#5!53?C$#11!54?CCCC$#7!58?C$#11!59?CC$#4!61?C$#18!62?CC$#4!64?C$#11!65?CCCCC$#18!70?C$#24!71?C$#18!72?CC$#36!74?C$#37!75?C$#38!76?C$#34!77?CC$#40!79?C$#66!80?C$#97!81?C$#125!82?C$#88!83?C$#123!84?C$#116!85?C$#154!86?C$#103!87?C$#126!88?C$#110!89?C$#92!90?C$#107!91?C$#47!92?C$#43!93?C$#54!94?C$#86!95?C$#91!96?C$#65!97?C$#86!98?C$#61!99?C$#86!100?C$#89!101?C$#65!102?C$#99!103?CC$#100!105?C$#90!106?C$#100!107?C$#90!108?C$#100!109?C$#112!110?C$#105!111?C$#143!112?C$#125!113?C$#87!114?C$#90!115?C$#135!116?C$#87!117?C$#90!118?C$#100!119?C$#115!120?C$#103!121?C$#110!122?C$#117!123?C$#125!124?CC$#135!126?C$#115!127?C$#135!128?C$#136!129?C$#125!130?C$#110!131?C$#100!132?C$#115!133?C$#110!134?C$#136!135?C$#117!136?C$#110!137?C$#92!138?C$#165!139?C$#85!140?C$#66!141?C$#111!142?C$#93!143?C$#92!144?C$#93!145?C$#99!146?C$#111!147?C$#117!148?C$#110!149?C$#91!150?C$#137!151?C$#126!152?C$#117!153?C$#116!154?C$#143!155?C$#105!156?C$#115!157?C$#112!158?C$#125!159?C$#108!160?C$#151!161?C$#144!162?C$#121!163?C$#129!164?C$#121!165?C$#145!166?C$#158!167?C$#146!168?C$#198!169?C$#164!170?C$#198!171?C$#182!172?C$#211!173?C$#212!174?C$#182!175?C$#146!176?C$#165!177?C$#154!178?C$#172!179?C$#154!180?CC$#173!182?C$#196!183?C$#154!184?CC$#165!186?C$#153!187?C$#165!188?C$#167!189?C$#153!190?C$#176!191?C$#173!192?C$#195!193?C$#196!194?C$#180!195?C$#173!196?C$#205!197?C$#225!198?C$#209!199?C$#200!200?C$#213!201?CCCC$#229!205?C$#207!206?C$#229!207?CCC$#207!210?C$#208!211?C$#229!212?C$#213!213?C$#227!214?C$#209!215?C$#225!216?C$#226!217?C$#180!218?C$#195!219?C$#214!220?C$#176!221?C$#187!222?C$#193!223?C$#205!224?C$#214!225?C$#215!226?C$#157!227?C$#175!228?C$#205!229?C$#214!230?C$#220!231?C$#222!232?C$#219!233?C$#222!234?C$#217!235?C$#199!236?C$#215!237?C$#214!238?C$#220!239?C$#221!240?C$#219!241?C$#221!242?CC$#223!244?C$#224!245?CC$#235!247?CC$#236!249?C$#235!250?C$#242!251?C$#239!252?C$#234!253?C$#231!254?C$#225!255?C$#219!256?C$#221!257?C$#222!258?C$#219!259?C$#224!260?C$#219!261?C$#223!262?C$#224!263?C$#219!264?C$#224!265?C$#221!266?CC$#18G$#19!1?GG$#4!3?G$#24!4?G$#27!5?G$#18!6?G$#27!7?G$#18!8?GGGG$#27!12?G$#18!13?G$#22!14?G$#30!15?G$#27!16?GG$#18!18?G$#27!19?G$#24!20?GG$#30!22?G$#24!23?G$#27!24?G$#30!25?G$#27!26?GG$#23!28?G$#34!29?G$#32!30?G$#30!31?GG$#27!33?GG$#18!35?G$#24!36?G$#21!37?G$#11!38?G$#19!39?GG$#11!41?GG$#19!43?G$#11!44?GGGGG$#7!49?G$#4!50?G$#5!51?G$#7!52?G$#11!53?G$#7!54?GG$#11!56?GGG$#19!59?G$#11!60?G$#18!61?G$#11!62?G$#18!63?G$#11!64?GG$#4!66?G$#11!67?GG$#4!69?G$#18!70?GG$#11!72?G$#24!73?G$#40!74?G$#38!75?GG$#37!77?G$#41!78?G$#46!79?G$#79!80?G$#65!81?G$#91!82?G$#92!83?G$#110!84?G$#126!85?G$#154!86?G$#116!87?G$#92!88?G$#110!89?G$#86!90?G$#85!91?G$#60!92?G$#66!93?G$#89!94?G$#65!95?G$#79!96?G$#86!97?G$#59!98?G$#61!99?G$#65!100?G$#79!101?G$#86!102?G$#99!103?G$#88!104?G$#99!105?G$#90!106?GG$#97!108?G$#125!109?G$#179!110?G$#135!111?G$#126!112?G$#154!113?G$#179!114?G$#125!115?G$#87!116?G$#110!117?G$#105!118?G$#108!119?G$#125!120?G$#135!121?G$#151!122?G$#87!123?G$#103!124?G$#135!125?G$#125!126?GG$#133!128?GG$#119!130?G$#105!131?G$#133!132?G$#105!133?G$#146!134?G$#151!135?G$#140!136?G$#116!137?G$#126!138?G$#116!139?G$#91!140?G$#89!141?G$#93!142?GGG$#65!145?G$#89!146?G$#196!147?G$#103!148?G$#126!149?G$#117!150?G$#103!151?G$#110!152?G$#142!153?G$#105!154?G$#146!155?G$#125!156?GG$#146!158?G$#115!159?G$#140!160?G$#108!161?G$#120!162?G$#115!163?G$#133!164?GG$#129!166?G$#162!167?G$#159!168?G$#172!169?G$#163!170?G$#172!171?G$#192!172?G$#196!173?G$#211!174?G$#192!175?G$#140!176?G$#180!177?G$#176!178?G$#150!179?G$#182!180?G$#183!181?GG$#192!183?G$#165!184?G$#180!185?G$#176!186?G$#153!187?G$#154!188?G$#137!189?G$#152!190?G$#196!191?G$#165!192?G$#199!193?G$#176!194?G$#173!195?G$#153!196?G$#195!197?G$#225!198?G$#227!199?G$#213!200?G$#230!201?G$#229!202?GGGG$#213!206?G$#229!207?GG$#208!209?G$#207!210?G$#177!211?G$#207!212?G$#228!213?GG$#227!215?G$#211!216?G$#225!217?G$#187!218?GG$#195!220?G$#202!221?G$#218!222?G$#217!223?G$#220!224?G$#219!225?G$#239!226?G$#205!227?G$#168!228?G$#215!229?G$#232!230?G$#220!231?G$#234!232?G$#222!233?GG$#215!235?G$#214!236?G$#215!237?G$#205!238?G$#219!239?GG$#218!241?GG$#222!243?G$#232!244?G$#224!245?G$#231!246?G$#235!247?G$#236!248?G$#235!249?GG$#232!251?G$#242!252?G$#234!253?GG$#225!255?G$#224!256?GG$#219!258?G$#221!259?G$#218!260?G$#225!261?GG$#224!263?G$#223!264?G$#219!265?G$#222!266?GG$#24O$#4!1?O$#18!2?O$#24!3?OO$#27!5?O$#18!6?O$#27!7?OOO$#24!10?O$#27!11?O$#24!12?OO$#27!14?O$#31!15?O$#30!16?OO$#27!18?OOOOOO$#30!24?O$#27!25?O$#30!26?O$#22!27?O$#23!28?O$#36!29?O$#23!30?O$#30!31?OOO$#22!34?O$#18!35?OO$#19!37?O$#21!38?O$#4!39?OO$#11!41?OOO$#19!44?O$#11!45?O$#19!46?O$#21!47?O$#11!48?O$#7!49?O$#11!50?OOO$#4!53?O$#7!54?O$#11!55?O$#7!56?O$#11!57?O$#4!58?O$#11!59?O$#4!60?O$#24!61?OO$#18!63?O$#11!64?O$#4!65?O$#11!66?OO$#18!68?O$#4!69?O$#18!70?O$#11!71?O$#18!72?O$#27!73?O$#36!74?O$#32!75?O$#34!76?O$#41!77?OO$#47!79?O$#105!80?O$#91!81?O$#65!82?O$#89!83?O$#126!84?O$#110!85?O$#108!86?O$#115!87?O$#92!88?O$#103!89?O$#86!90?O$#79!91?OO$#58!93?O$#85!94?O$#79!95?O$#86!96?O$#65!97?O$#61!98?O$#60!99?O$#79!100?O$#99!101?OO$#117!103?O$#137!104?O$#95!105?O$#65!106?O$#91!107?O$#125!108?O$#116!109?O$#112!110?O$#151!111?O$#125!112?OO$#183!114?O$#126!115?O$#99!116?OO$#115!118?O$#105!119?O$#159!120?O$#144!121?O$#135!122?O$#154!123?O$#151!124?O$#108!125?O$#126!126?O$#146!127?OOO$#119!130?O$#114!131?O$#135!132?O$#115!133?O$#135!134?O$#116!135?O$#146!136?O$#117!137?O$#135!138?O$#126!139?O$#99!140?O$#103!141?O$#214!142?O$#92!143?O$#85!144?O$#92!145?OO$#103!147?OO$#111!149?O$#192!150?O$#117!151?O$#187!152?O$#143!153?O$#99!154?O$#151!155?O$#154!156?O$#108!157?O$#151!158?O$#140!159?O$#144!160?O$#120!161?O$#145!162?O$#114!163?O$#158!164?O$#118!165?O$#141!166?OO$#177!168?O$#162!169?OO$#164!171?OO$#198!173?O$#192!174?O$#183!175?O$#225!176?O$#227!177?O$#180!178?O$#167!179?O$#146!180?O$#228!181?O$#156!182?O$#154!183?O$#165!184?O$#196!185?O$#153!186?O$#173!187?O$#167!188?O$#196!189?O$#173!190?O$#212!191?O$#202!192?O$#180!193?O$#211!194?O$#196!195?O$#176!196?OO$#218!198?O$#226!199?O$#227!200?O$#230!201?O$#233!202?OO$#229!204?OO$#233!206?O$#200!207?O$#229!208?O$#238!209?O$#213!210?O$#181!211?O$#233!212?O$#213!213?O$#228!214?O$#209!215?O$#182!216?O$#196!217?O$#214!218?O$#218!219?O$#202!220?O$#218!221?O$#205!222?O$#218!223?OOO$#231!226?O$#223!227?O$#187!228?O$#218!229?O$#222!230?O$#217!231?O$#218!232?O$#219!233?O$#220!234?O$#221!235?O$#205!236?O$#215!237?O$#202!238?O$#222!239?O$#218!240?OO$#215!242?O$#222!243?O$#219!244?O$#221!245?O$#231!246?O$#245!247?O$#236!248?O$#244!249?O$#236!250?O$#242!251?O$#243!252?O$#234!253?O$#222!254?O$#224!255?O$#221!256?O$#225!257?O$#219!258?O$#224!259?O$#219!260?OO$#224!262?OO$#223!264?O$#231!265?O$#219!266?O$#234!267?O$#21_$#24!1?__$#18!3?__$#24!5?__$#18!7?___$#24!10?_$#11!11?_$#24!12?__$#30!14?_$#23!15?_$#27!16?__$#22!18?__$#27!20?_$#22!21?_$#30!22?_$#22!23?_$#30!24?___$#27!27?_$#34!28?_$#32!29?_$#27!30?__$#31!32?_$#22!33?_$#30!34?_$#27!35?__$#11!37?__$#19!39?_$#4!40?_$#11!41?_$#24!42?__$#18!44?_$#11!45?__$#4!47?_$#11!48?_$#12!49?_$#14!50?_$#9!51?_$#11!52?____$#1!56?_$#19!57?_$#11!58?__$#19!60?_$#4!61?_$#11!62?__________$#18!72?__$#36!74?_$#37!75?_$#34!76?_$#38!77?_$#41!78?__$#100!80?_$#86!81?_$#60!82?_$#79!83?_$#60!84?_$#126!85?_$#108!86?_$#135!87?_$#92!88?_$#89!89?_$#85!90?_$#79!91?_$#117!92?_$#65!93?_$#79!94?_$#86!95?_$#88!96?_$#86!97?_$#100!98?_$#61!99?_$#86!100?_$#116!101?_$#103!102?_$#116!103?_$#150!104?_$#84!105?_$#54!106?_$#83!107?_$#92!108?_$#110!109?_$#117!110?_$#127!111?_$#159!112?_$#146!113?_$#198!114?_$#140!115?_$#105!116?_$#90!117?_$#88!118?_$#125!119?_$#114!120?_$#116!121?_$#154!122?_$#136!123?_$#115!124?_$#146!125?_$#116!126?_$#127!127?_$#135!128?_$#146!129?_$#119!130?_$#121!131?_$#133!132?_$#127!133?_$#126!134?_$#125!135?__$#87!137?_$#135!138?_$#146!139?_$#116!140?_$#136!141?_$#110!142?__$#95!144?_$#92!145?_$#165!146?_$#86!147?_$#103!148?_$#99!149?_$#116!150?_$#226!151?_$#107!152?_$#126!153?_$#100!154?_$#146!155?_$#151!156?_$#135!157?_$#151!158?__$#133!160?_$#158!161?_$#145!162?_$#139!163?__$#133!165?_$#122!166?_$#161!167?_$#162!168?_$#158!169?_$#162!170?_$#163!171?_$#181!172?_$#210!173?_$#181!174?_$#209!175?_$#165!176?_$#154!177?_$#196!178?_$#154!179?_$#165!180?_$#182!181?_$#213!182?_$#211!183?_$#183!184?_$#211!185?_$#180!186?_$#173!187?_$#165!188?_$#195!189?_$#176!190?__$#166!192?_$#154!193?_$#196!194?_$#195!195?___$#205!198?_$#225!199?_$#241!200?_$#230!201?_$#241!202?__$#240!204?_$#238!205?_$#208!206?_$#229!207?_$#238!208?___$#233!211?_$#210!212?_$#200!213?_$#198!214?_$#228!215?_$#167!216?_$#225!217?_$#202!218?_$#226!219?_$#167!220?_$#195!221?_$#205!222?_$#231!223?_$#202!224?_$#187!225?_$#214!226?_$#205!227?_$#157!228?_$#202!229?_$#216!230?__$#215!232?_$#220!233?__$#219!235?_$#199!236?_$#214!237?__$#222!239?_$#218!240?_$#224!241?_$#221!242?_$#242!243?_$#232!244?_$#224!245?_$#231!246?_$#235!247?_$#244!248?_$#243!249?_$#235!250?_$#244!251?_$#243!252?_$#239!253?_$#232!254?_$#224!255?_$#225!256?_$#219!257?_$#218!258?_$#224!259?__$#225!261?_$#219!262?_$#224!263?___$#234!266?_$#223!267?_$-#27@@$#24!2?@$#18!3?@$#24!4?@@$#11!6?@$#27!7?@$#22!8?@$#18!9?@$#24!10?@@$#18!12?@$#27!13?@@@$#30!16?@@$#27!18?@@$#31!20?@$#18!21?@@$#24!23?@$#27!24?@@$#31!26?@$#32!27?@$#23!28?@$#34!29?@$#30!30?@$#31!31?@$#30!32?@$#18!33?@$#27!34?@$#24!35?@$#11!36?@@$#19!38?@$#11!39?@@$#19!41?@$#18!42?@$#11!43?@@@@@$#19!48?@$#11!49?@$#7!50?@$#11!51?@$#1!52?@$#21!53?@$#11!54?@$#12!55?@$#11!56?@@$#4!58?@$#11!59?@@$#19!61?@$#11!62?@$#4!63?@$#11!64?@$#4!65?@$#11!66?@@$#4!68?@@$#18!70?@@@$#30!73?@$#36!74?@$#27!75?@$#36!76?@$#34!77?@$#37!78?@$#38!79?@$#86!80?@$#61!81?@$#66!82?@$#111!83?@$#89!84?@$#90!85?@$#126!86?@$#90!87?@$#87!88?@$#58!89?@$#65!90?@$#92!91?@$#65!92?@$#88!93?@$#87!94?@$#79!95?@$#87!96?@$#86!97?@@$#92!99?@$#86!100?@$#99!101?@$#116!102?@$#127!103?@$#126!104?@$#66!105?@$#64!106?@$#27!107?@$#36!108?@$#37!109?@$#47!110?@$#92!111?@$#116!112?@$#135!113?@$#151!114?@$#172!115?@$#167!116?@$#100!117?@$#65!118?@$#115!119?@$#112!120?@$#105!121?@$#116!122?@$#156!123?@$#144!124?@$#135!125?@$#110!126?@$#146!127?@$#143!128?@$#127!129?@$#146!130?@$#133!131?@$#145!132?@$#155!133?@$#154!134?@$#126!135?@$#105!136?@$#87!137?@$#126!138?@$#146!139?@@$#192!141?@$#135!142?@$#100!143?@$#180!144?@$#103!145?@$#107!146?@$#89!147?@$#247!148?@$#224!149?@$#87!150?@$#236!151?@$#116!152?@$#125!153?@@$#135!155?@$#163!156?@$#125!157?@$#140!158?@$#108!159?@$#125!160?@$#141!161?@$#139!162?@$#141!163?@$#145!164?@$#133!165?@$#141!166?@$#128!167?@@$#161!169?@$#162!170?@$#200!171?@$#177!172?@$#170!173?@$#172!174?@$#213!175?@$#192!176?@$#173!177?@$#183!178?@$#182!179?@$#165!180?@$#183!181?@$#227!182?@$#213!183?@$#227!184?@$#209!185?@$#198!186?@$#195!187?@$#180!188?@$#196!189?@@$#182!191?@$#195!192?@$#137!193?@$#167!194?@$#202!195?@$#195!196?@$#199!197?@$#202!198?@$#235!199?@$#236!200?@@$#247!202?@$#241!203?@$#237!204?@$#238!205?@@$#248!207?@$#238!208?@$#208!209?@$#233!210?@$#213!211?@$#229!212?@@$#209!214?@$#230!215?@$#209!216?@$#226!217?@$#221!218?@$#214!219?@$#195!220?@$#166!221?@$#165!222?@$#212!223?@$#199!224?@$#195!225?@$#176!226?@$#214!227?@$#147!228?@$#202!229?@$#193!230?@$#214!231?@$#195!232?@$#218!233?@$#219!234?@$#204!235?@$#202!236?@$#205!237?@$#215!238?@$#222!239?@$#214!240?@$#218!241?@$#222!242?@@$#232!244?@$#224!245?@$#235!246?@$#236!247?@@$#244!249?@@@$#243!252?@$#242!253?@$#234!254?@$#223!255?@$#221!256?@$#224!257?@$#219!258?@$#218!259?@@$#224!261?@@$#231!263?@$#225!264?@$#231!265?@@@$#27AA$#24!2?AAA$#18!5?AAA$#27!8?AA$#22!10?A$#18!11?AA$#27!13?A$#22!14?AA$#27!16?AAA$#22!19?A$#27!20?AAAAA$#31!25?A$#18!26?A$#32!27?AAA$#23!30?A$#30!31?A$#27!32?A$#22!33?A$#30!34?A$#24!35?A$#27!36?A$#19!37?AAA$#11!40?AAA$#18!43?A$#21!44?A$#19!45?AA$#11!47?A$#5!48?A$#11!49?AA$#12!51?A$#11!52?A$#7!53?A$#11!54?A$#7!55?A$#11!56?AA$#4!58?A$#11!59?AAAA$#18!63?A$#11!64?AA$#4!66?A$#11!67?AA$#4!69?A$#11!70?AA$#18!72?A$#37!73?AA$#31!75?A$#27!76?A$#30!77?A$#41!78?A$#54!79?AAA$#41!82?A$#65!83?A$#117!84?A$#164!85?A$#126!86?A$#99!87?AA$#89!89?A$#65!90?A$#59!91?A$#92!92?A$#65!93?A$#90!94?A$#79!95?A$#86!96?AA$#100!98?A$#87!99?A$#86!100?A$#100!101?A$#116!102?A$#167!103?A$#138!104?A$#47!105?A$#30!106?A$#39!107?AA$#36!109?AA$#39!111?A$#54!112?A$#79!113?A$#126!114?A$#154!115?A$#192!116?A$#112!117?A$#91!118?A$#164!119?A$#112!120?A$#125!121?A$#115!122?A$#135!123?A$#108!124?A$#135!125?A$#117!126?A$#167!127?A$#136!128?A$#151!129?A$#135!130?A$#144!131?A$#133!132?A$#121!133?A$#154!134?A$#140!135?A$#115!136?A$#116!137?A$#154!138?AAA$#142!141?A$#140!142?A$#150!143?A$#103!144?A$#225!145?A$#107!146?AA$#111!148?A$#107!149?A$#92!150?A$#110!151?A$#108!152?A$#125!153?AA$#146!155?A$#125!156?A$#179!157?A$#146!158?A$#121!159?A$#144!160?A$#129!161?A$#121!162?A$#133!163?A$#129!164?A$#162!165?A$#170!166?A$#141!167?A$#158!168?A$#133!169?A$#161!170?AA$#200!172?A$#181!173?A$#200!174?A$#213!175?A$#198!176?A$#209!177?A$#227!178?AAA$#164!181?A$#210!182?A$#227!183?A$#192!184?A$#179!185?A$#183!186?A$#225!187?A$#211!188?A$#167!189?A$#196!190?A$#182!191?A$#176!192?A$#153!193?A$#154!194?A$#176!195?A$#212!196?A$#187!197?A$#199!198?A$#224!199?A$#225!200?A$#244!201?A$#249!202?A$#248!203?A$#240!204?A$#238!205?A$#229!206?A$#237!207?A$#233!208?A$#238!209?AA$#229!211?A$#210!212?A$#228!213?A$#181!214?A$#230!215?A$#209!216?A$#211!217?A$#196!218?A$#173!219?A$#180!220?A$#166!221?A$#168!222?A$#218!223?A$#199!224?A$#218!225?A$#215!226?A$#175!227?A$#123!228?A$#187!229?AA$#219!231?A$#212!232?A$#216!233?A$#232!234?A$#222!235?A$#187!236?A$#221!237?A$#214!238?A$#221!239?A$#214!240?A$#218!241?A$#232!242?A$#220!243?A$#232!244?A$#223!245?A$#234!246?A$#242!247?A$#244!248?AAAA$#243!252?A$#242!253?A$#234!254?A$#225!255?A$#219!256?AAA$#218!259?A$#224!260?AAAAA$#231!265?A$#225!266?A$#224!267?A$#24CCC$#18!3?C$#24!4?C$#18!5?C$#24!6?C$#18!7?C$#24!8?CC$#18!10?C$#27!11?CC$#30!13?C$#22!14?C$#27!15?C$#30!16?C$#27!17?CC$#22!19?CCC$#30!22?C$#27!23?CCC$#23!26?C$#32!27?C$#30!28?C$#23!29?C$#32!30?C$#30!31?C$#27!32?C$#22!33?C$#18!34?C$#19!35?CCCCC$#11!40?C$#21!41?C$#11!42?C$#19!43?C$#11!44?C$#19!45?C$#11!46?CCC$#4!49?C$#11!50?C$#14!51?C$#11!52?C$#1!53?C$#7!54?CC$#11!56?C$#4!57?C$#11!58?CCCCC$#4!63?C$#5!64?C$#4!65?C$#11!66?CC$#4!68?CCC$#24!71?C$#30!72?C$#40!73?CC$#37!75?C$#24!76?C$#23!77?C$#61!78?C$#47!79?CCCC$#58!83?C$#103!84?C$#110!85?C$#87!86?C$#99!87?C$#65!88?C$#61!89?C$#65!90?CC$#87!92?C$#140!93?C$#65!94?C$#88!95?C$#59!96?C$#61!97?C$#90!98?C$#65!99?C$#100!100?C$#105!101?C$#116!102?C$#196!103?C$#117!104?C$#103!105?C$#71!106?C$#103!107?C$#110!108?C$#107!109?C$#92!110?C$#47!111?C$#40!112?C$#41!113?C$#78!114?C$#87!115?C$#140!116?C$#183!117?C$#86!118?C$#90!119?C$#87!120?C$#100!121?C$#90!122?C$#115!123?C$#163!124?C$#110!125?C$#116!126?C$#154!127?C$#135!128?C$#183!129?C$#173!130?C$#135!131?C$#113!132?C$#133!133?C$#154!134?C$#165!135?C$#140!136?CC$#153!138?C$#173!139?C$#154!140?C$#236!141?C$#167!142?C$#165!143?C$#146!144?C$#117!145?CC$#218!147?C$#180!148?C$#243!149?C$#244!150?C$#126!151?C$#110!152?C$#135!153?C$#119!154?C$#155!155?C$#210!156?C$#146!157?C$#155!158?CC$#133!160?C$#129!161?C$#161!162?C$#145!163?C$#158!164?C$#141!165?C$#161!166?C$#141!167?C$#122!168?C$#158!169?C$#141!170?C$#170!171?CC$#181!173?C$#164!174?C$#200!175?C$#207!176?C$#213!177?C$#227!178?C$#209!179?C$#192!180?C$#209!181?C$#182!182?C$#183!183?C$#164!184?C$#227!185?C$#196!186?C$#227!187?C$#211!188?C$#182!189?C$#214!190?C$#212!191?C$#176!192?C$#165!193?C$#180!194?C$#176!195?C$#211!196?C$#214!197?C$#195!198?C$#215!199?C$#218!200?C$#249!201?C$#248!202?CC$#238!204?C$#237!205?C$#248!206?CC$#240!208?C$#229!209?C$#233!210?CCC$#213!213?CC$#210!215?C$#226!216?CC$#218!218?CC$#236!220?C$#195!221?C$#180!222?C$#214!223?C$#221!224?CC$#176!226?C$#168!227?C$#149!228?C$#199!229?CC$#221!231?C$#218!232?C$#220!233?C$#239!234?C$#218!235?C$#199!236?C$#214!237?CC$#222!239?C$#202!240?C$#214!241?C$#222!242?C$#221!243?C$#232!244?C$#224!245?C$#242!246?CCC$#236!249?C$#244!250?C$#242!251?C$#243!252?C$#242!253?C$#224!254?C$#214!255?C$#224!256?C$#221!257?C$#219!258?CC$#218!260?C$#219!261?C$#225!262?C$#224!263?CC$#231!265?CC$#224!267?C$#11GG$#18!2?G$#11!3?G$#18!4?G$#24!5?GGGG$#18!9?G$#22!10?G$#27!11?GG$#22!13?G$#30!14?G$#27!15?GG$#30!17?G$#11!18?G$#27!19?GG$#30!21?G$#27!22?G$#30!23?G$#27!24?G$#30!25?GG$#32!27?GGG$#34!30?G$#30!31?G$#31!32?G$#27!33?GG$#21!35?GG$#11!37?G$#19!38?G$#4!39?G$#19!40?GG$#11!42?G$#19!43?GGG$#11!46?G$#7!47?G$#21!48?G$#11!49?G$#1!50?G$#12!51?G$#14!52?G$#11!53?G$#12!54?G$#14!55?G$#11!56?GGGGGG$#4!62?G$#18!63?G$#11!64?G$#4!65?G$#11!66?G$#4!67?G$#11!68?GG$#18!70?G$#25!71?G$#40!72?G$#41!73?GG$#34!75?G$#15!76?G$#36!77?G$#79!78?G$#65!79?G$#61!80?G$#58!81?GG$#54!83?G$#92!84?G$#90!85?G$#126!86?G$#65!87?G$#66!88?G$#79!89?G$#86!90?G$#91!91?G$#99!92?G$#110!93?G$#86!94?G$#61!95?G$#65!96?GG$#86!98?G$#116!99?G$#100!100?G$#140!101?G$#154!102?G$#167!103?G$#92!104?G$#96!105?G$#123!106?G$#135!107?G$#163!108?G$#150!109?G$#140!110?G$#127!111?G$#91!112?G$#41!113?G$#38!114?G$#81!115?G$#116!116?G$#135!117?G$#105!118?G$#86!119?GG$#110!121?G$#116!122?G$#110!123?G$#143!124?G$#135!125?G$#156!126?G$#164!127?G$#135!128?G$#150!129?G$#182!130?G$#154!131?G$#143!132?G$#120!133?G$#163!134?G$#212!135?G$#165!136?G$#180!137?G$#192!138?G$#154!139?G$#165!140?GG$#167!142?G$#165!143?G$#166!144?G$#140!145?G$#125!146?G$#111!147?GG$#130!149?G$#149!150?G$#126!151?G$#116!152?GG$#114!154?G$#164!155?G$#158!156?G$#155!157?G$#121!158?G$#133!159?G$#163!160?G$#120!161?G$#145!162?G$#162!163?G$#158!164?G$#141!165?G$#161!166?G$#141!167?G$#128!168?G$#141!169?G$#113!170?G$#170!171?GG$#161!173?G$#170!174?G$#200!175?G$#177!176?GG$#200!178?G$#183!179?G$#198!180?G$#227!181?G$#182!182?G$#156!183?G$#192!184?G$#227!185?G$#209!186?GG$#192!188?G$#195!189?G$#199!190?G$#173!191?G$#192!192?G$#176!193?G$#195!194?G$#165!195?GG$#212!197?G$#214!198?G$#195!199?G$#232!200?G$#243!201?G$#245!202?G$#240!203?G$#248!204?G$#240!205?G$#248!206?G$#238!207?G$#229!208?G$#213!209?G$#229!210?G$#213!211?G$#228!212?G$#209!213?G$#228!214?G$#209!215?G$#236!216?G$#226!217?G$#195!218?G$#234!219?G$#221!220?G$#195!221?G$#221!222?G$#211!223?G$#199!224?G$#224!225?G$#205!226?G$#176!227?G$#107!228?G$#168!229?G$#205!230?G$#221!231?G$#214!232?G$#217!233?G$#219!234?G$#204!235?G$#214!236?G$#217!237?G$#204!238?G$#218!239?G$#202!240?G$#212!241?G$#222!242?G$#232!243?G$#221!244?G$#231!245?GG$#242!247?GG$#244!249?G$#242!250?G$#243!251?GG$#242!253?G$#231!254?G$#225!255?G$#218!256?G$#221!257?G$#224!258?G$#218!259?G$#225!260?G$#224!261?GGG$#231!264?GG$#224!266?G$#231!267?G$#19OO$#21!2?O$#19!3?O$#18!4?O$#11!5?O$#18!6?O$#24!7?O$#18!8?O$#11!9?O$#18!10?O$#27!11?O$#23!12?O$#22!13?O$#30!14?O$#27!15?OOO$#22!18?O$#27!19?OO$#32!21?O$#27!22?O$#22!23?O$#27!24?OO$#31!26?O$#32!27?O$#34!28?OO$#32!30?O$#31!31?O$#27!32?O$#18!33?OO$#27!35?O$#21!36?O$#19!37?OO$#11!39?OOOOOO$#4!45?O$#11!46?O$#7!47?O$#11!48?O$#1!49?O$#11!50?OO$#7!52?OO$#14!54?O$#11!55?OO$#21!57?O$#11!58?OO$#4!60?O$#11!61?OOO$#4!64?O$#11!65?O$#4!66?O$#24!67?O$#18!68?O$#4!69?O$#27!70?O$#41!71?O$#48!72?O$#41!73?OO$#37!75?O$#34!76?O$#30!77?O$#86!78?O$#90!79?O$#86!80?O$#58!81?O$#54!82?O$#66!83?O$#107!84?O$#126!85?O$#86!86?O$#87!87?O$#86!88?OO$#87!90?O$#90!91?OOO$#137!94?O$#79!95?O$#65!96?O$#90!97?O$#112!98?O$#100!99?O$#146!100?O$#135!101?O$#173!102?O$#135!103?O$#150!104?O$#89!105?O$#107!106?O$#135!107?O$#138!108?O$#148!109?O$#165!110?O$#138!111?O$#127!112?O$#103!113?O$#40!114?O$#41!115?O$#67!116?O$#164!117?O$#146!118?O$#87!119?O$#99!120?O$#61!121?O$#100!122?O$#116!123?O$#144!124?O$#143!125?O$#198!126?O$#125!127?O$#179!128?O$#137!129?O$#196!130?O$#192!131?O$#126!132?O$#135!133?O$#163!134?O$#173!135?O$#180!136?OO$#211!138?O$#165!139?O$#166!140?O$#168!141?O$#182!142?O$#211!143?O$#180!144?O$#150!145?O$#138!146?O$#157!147?O$#231!148?O$#199!149?O$#148!150?O$#149!151?O$#165!152?O$#127!153?O$#125!154?O$#120!155?O$#121!156?O$#163!157?O$#144!158?O$#145!159?O$#159!160?O$#133!161?O$#163!162?O$#158!163?O$#162!164?O$#161!165?O$#181!166?O$#170!167?O$#122!168?O$#161!169?O$#128!170?OO$#161!172?O$#170!173?O$#208!174?O$#158!175?O$#170!176?O$#164!177?O$#207!178?O$#210!179?O$#213!180?O$#165!181?O$#227!182?O$#209!183?O$#230!184?O$#211!185?OO$#209!187?O$#167!188?O$#227!189?O$#196!190?O$#166!191?O$#180!192?O$#196!193?O$#166!194?O$#167!195?O$#165!196?O$#195!197?O$#205!198?O$#195!199?O$#222!200?O$#242!201?O$#244!202?O$#241!203?O$#248!204?O$#241!205?OO$#240!207?O$#238!208?O$#237!209?O$#241!210?O$#233!211?O$#183!212?O$#227!213?O$#192!214?O$#227!215?O$#209!216?O$#196!217?O$#182!218?O$#180!219?O$#195!220?O$#199!221?O$#214!222?O$#195!223?OO$#214!225?O$#195!226?O$#176!227?O$#130!228?O$#169!229?O$#214!230?O$#217!231?O$#218!232?O$#216!233?O$#222!234?O$#221!235?O$#215!236?O$#217!237?O$#222!238?O$#232!239?O$#218!240?OO$#232!242?O$#222!243?O$#232!244?O$#221!245?O$#242!246?O$#239!247?O$#242!248?O$#235!249?O$#243!250?OOO$#242!253?O$#221!254?O$#218!255?OO$#221!257?O$#219!258?O$#225!259?OO$#224!261?O$#221!262?O$#231!263?OOOO$#224!267?O$#11__$#19!2?_$#11!3?_$#18!4?_$#24!5?_$#18!6?_____$#22!11?_$#23!12?_$#22!13?__$#24!15?__$#27!17?_$#22!18?_$#27!19?___$#30!22?_$#22!23?_$#27!24?___$#34!27?_$#23!28?_$#30!29?_$#31!30?___$#18!33?__$#24!35?_$#19!36?__$#11!38?___$#19!41?_$#11!42?_$#19!43?_$#11!44?___$#7!47?_$#21!48?_$#7!49?_$#14!50?_$#12!51?_$#11!52?_$#5!53?_$#7!54?__$#11!56?__$#4!58?_$#11!59?____$#4!63?__$#11!65?____$#18!69?_$#40!70?_$#41!71?__$#40!73?_$#41!74?_$#34!75?_$#30!76?_$#19!77?_$#91!78?__$#65!80?_$#66!81?_$#61!82?_$#65!83?_$#90!84?__$#87!86?_$#100!87?_$#79!88?_$#91!89?_$#65!90?_$#110!91?_$#105!92?_$#90!93?_$#92!94?_$#90!95?_$#86!96?_$#100!97?__$#90!99?_$#151!100?_$#116!101?_$#165!102?_$#153!103?_$#173!104?_$#85!105?_$#103!106?_$#123!107?_$#138!108?___$#123!111?_$#107!112?_$#103!113?_$#111!114?_$#40!115?_$#48!116?_$#103!117?_$#163!118?_$#116!119?_$#60!120?_$#110!121?_$#125!122?_$#146!123?_$#125!124?_$#173!125?_$#151!126?__$#154!128?_$#136!129?_$#209!130?_$#176!131?_$#140!132?_$#135!133?_$#146!134?_$#150!135?_$#176!136?_$#187!137?_$#225!138?_$#167!139?_$#180!140?___$#176!143?_$#180!144?__$#251!146?_$#148!147?_$#111!148?_$#117!149?_$#116!150?_$#153!151?_$#176!152?_$#116!153?__$#114!155?_$#128!156?_$#145!157?_$#162!158?_$#145!159?_$#162!160?_$#163!161?__$#158!163?_$#181!164?_$#163!165?_$#161!166?_$#158!167?___$#181!170?_$#170!171?_$#158!172?_$#170!173?_$#162!174?__$#200!176?_$#210!177?_$#229!178?_$#207!179?_$#209!180?_$#227!181?_$#192!182?_$#227!183?_$#236!184?_$#226!185?_$#230!186?_$#182!187?_$#227!188?_$#192!189?_$#196!190?_$#219!191?_$#196!192?_$#199!193?_$#195!194?_$#199!195?_$#165!196?_$#195!197?_$#219!198?_$#215!199?_$#220!200?_$#232!201?_$#249!202?_$#244!203?_$#247!204?_$#241!205?_$#247!206?__$#238!208?_$#237!209?_$#240!210?_$#229!211?_$#228!212?__$#227!214?__$#196!216?_$#180!217?_$#225!218?_$#211!219?_$#219!220?_$#205!221?_$#212!222?_$#218!223?_$#212!224?_$#202!225?_$#214!226?_$#205!227?_$#103!228?_$#168!229?_$#205!230?_$#219!231?_$#218!232?_$#219!233?__$#215!235?_$#214!236?_$#220!237?_$#219!238?_$#234!239?_$#219!240?_$#214!241?_$#222!242?__$#221!244?_$#223!245?__$#232!247?_$#234!248?_$#244!249?_$#242!250?__$#243!252?_$#242!253?_$#223!254?_$#224!255?__$#219!257?__$#226!259?_$#225!260?_$#231!261?___$#225!264?_$#224!265?_$#231!266?__$-#4@$#7!1?@$#4!2?@$#11!3?@@@$#18!6?@@@$#24!9?@$#18!10?@$#27!11?@$#18!12?@$#22!13?@@$#27!15?@$#24!16?@@$#22!18?@$#27!19?@$#22!20?@@$#18!22?@$#27!23?@@@$#31!26?@$#32!27?@$#23!28?@$#31!29?@$#30!30?@@@@@$#19!35?@@$#24!37?@$#19!38?@$#11!39?@$#4!40?@$#11!41?@@@$#4!44?@$#11!45?@$#19!46?@$#4!47?@$#11!48?@$#12!49?@$#7!50?@@$#9!52?@$#5!53?@$#14!54?@@$#11!56?@@@$#4!59?@$#11!60?@@$#19!62?@$#11!63?@$#5!64?@$#4!65?@$#11!66?@$#4!67?@$#11!68?@$#18!69?@$#46!70?@@$#41!72?@@@$#36!75?@$#30!76?@$#4!77?@$#85!78?@$#86!79?@@$#59!81?@$#60!82?@$#90!83?@$#60!84?@$#105!85?@$#79!86?@$#91!87?@$#61!88?@$#103!89?@$#87!90?@$#125!91?@$#90!92?@$#89!93?@$#58!94?@$#79!95?@@$#91!97?@$#116!98?@$#133!99?@$#125!100?@$#179!101?@$#180!102?@$#182!103?@$#149!104?@$#66!105?@$#96!106?@$#103!107?@$#123!108?@@$#138!110?@@$#111!112?@$#123!113?@$#103!114?@$#40!115?@$#39!116?@$#103!117?@$#146!118?@$#116!119?@$#58!120?@$#126!121?@$#87!122?@$#125!123?@$#151!124?@$#154!125?@$#116!126?@@@@$#179!130?@$#117!131?@$#150!132?@$#137!133?@$#135!134?@$#167!135?@$#123!136?@$#168!137?@$#225!138?@$#180!139?@@@$#176!142?@$#195!143?@$#202!144?@$#195!145?@$#205!146?@$#204!147?@$#236!148?@$#110!149?@$#154!150?@$#150!151?@$#154!152?@$#167!153?@$#105!154?@$#119!155?@$#105!156?@$#128!157?@$#170!158?@$#163!159?@$#158!160?@$#145!161?@@$#181!163?@$#159!164?@$#129!165?@$#141!166?@$#162!167?@$#122!168?@$#124!169?@@$#141!171?@@@$#161!174?@$#181!175?@$#207!176?@$#213!177?@$#228!178?@$#230!179?@$#240!180?@$#213!181?@$#230!182?@@@$#211!185?@$#198!186?@$#183!187?@$#196!188?@$#209!189?@$#226!190?@$#214!191?@$#212!192?@$#195!193?@$#212!194?@$#180!195?@@$#175!197?@$#195!198?@$#217!199?@$#220!200?@$#232!201?@$#243!202?@$#247!203?@$#244!204?@$#241!205?@@$#247!207?@$#240!208?@@$#227!210?@$#207!211?@$#179!212?@$#213!213?@$#183!214?@$#230!215?@$#192!216?@$#196!217?@$#195!218?@$#226!219?@$#214!220?@@$#212!222?@$#214!223?@$#212!224?@$#180!225?@$#176!226?@@$#149!228?@$#187!229?@$#204!230?@$#193!231?@$#205!232?@$#218!233?@$#214!234?@$#219!235?@$#214!236?@$#216!237?@$#214!238?@@$#218!240?@$#214!241?@$#222!242?@@$#219!244?@$#224!245?@$#223!246?@$#234!247?@$#242!248?@$#244!249?@@$#242!251?@$#243!252?@$#239!253?@$#224!254?@$#219!255?@$#223!256?@$#224!257?@@@$#225!260?@$#224!261?@$#231!262?@@$#225!264?@$#224!265?@@$#231!267?@$#11A$#7!1?AA$#11!3?A$#18!4?A$#11!5?A$#4!6?A$#18!7?AAAA$#24!11?A$#23!12?A$#27!13?A$#30!14?A$#27!15?A$#24!16?A$#27!17?AAA$#18!20?A$#22!21?A$#30!22?AA$#22!24?A$#27!25?A$#22!26?A$#30!27?A$#27!28?A$#23!29?A$#27!30?AAAAAA$#18!36?A$#4!37?A$#11!38?A$#19!39?A$#4!40?AA$#19!42?AA$#4!44?AA$#11!46?AA$#5!48?A$#12!49?A$#11!50?AAA$#7!53?A$#12!54?A$#9!55?AA$#4!57?A$#11!58?AA$#19!60?AA$#11!62?AA$#4!64?A$#11!65?A$#4!66?A$#5!67?A$#4!68?A$#18!69?A$#41!70?AA$#40!72?A$#41!73?A$#40!74?A$#31!75?A$#21!76?A$#19!77?A$#58!78?A$#90!79?A$#99!80?A$#91!81?A$#86!82?A$#79!83?A$#110!84?A$#86!85?A$#65!86?A$#59!87?A$#79!88?A$#58!89?A$#65!90?A$#87!91?A$#86!92?A$#65!93?AA$#90!95?A$#65!96?A$#108!97?A$#125!98?A$#110!99?A$#116!100?A$#165!101?A$#173!102?A$#182!103?A$#137!104?A$#47!105?A$#80!106?A$#101!107?A$#96!108?A$#123!109?AA$#106!111?A$#123!112?A$#111!113?A$#106!114?A$#94!115?A$#37!116?A$#60!117?A$#125!118?A$#164!119?A$#99!120?A$#117!121?A$#156!122?A$#155!123?A$#154!124?A$#198!125?A$#99!126?A$#116!127?A$#126!128?A$#179!129?A$#146!130?A$#135!131?A$#146!132?A$#103!133?A$#123!134?A$#173!135?A$#89!136?A$#193!137?A$#212!138?A$#180!139?A$#199!140?A$#176!141?A$#218!142?A$#231!143?A$#180!144?A$#204!145?A$#168!146?A$#235!147?A$#154!148?A$#115!149?A$#146!150?A$#156!151?A$#236!152?A$#165!153?A$#108!154?A$#164!155?A$#119!156?A$#129!157?A$#145!158?A$#141!159?A$#170!160?A$#161!161?A$#170!162?AA$#177!164?A$#145!165?A$#200!166?A$#207!167?A$#141!168?A$#161!169?AA$#118!171?A$#161!172?AAA$#158!175?A$#177!176?A$#181!177?AA$#207!179?A$#181!180?A$#229!181?A$#230!182?A$#198!183?A$#172!184?A$#209!185?AA$#196!187?AA$#227!189?A$#209!190?A$#226!191?A$#218!192?A$#212!193?AAA$#187!196?A$#199!197?A$#215!198?A$#232!199?A$#220!200?AA$#243!202?A$#245!203?A$#246!204?A$#248!205?A$#246!206?A$#241!207?A$#248!208?A$#237!209?A$#213!210?A$#210!211?A$#183!212?A$#209!213?A$#240!214?A$#154!215?A$#209!216?AA$#218!218?A$#236!219?A$#195!220?A$#214!221?A$#195!222?A$#214!223?A$#202!224?A$#204!225?A$#219!226?A$#195!227?A$#130!228?A$#169!229?A$#193!230?A$#205!231?A$#199!232?A$#222!233?A$#214!234?A$#218!235?A$#214!236?A$#220!237?A$#204!238?A$#219!239?A$#205!240?A$#225!241?A$#222!242?AA$#219!244?A$#221!245?A$#232!246?A$#242!247?A$#234!248?A$#235!249?A$#239!250?A$#243!251?AA$#242!253?A$#219!254?A$#223!255?AA$#219!257?AA$#225!259?AAA$#221!262?A$#224!263?AA$#225!265?AAA$#5C$#11!1?C$#7!2?C$#11!3?C$#18!4?CC$#19!6?C$#11!7?C$#18!8?C$#27!9?C$#18!10?C$#27!11?C$#15!12?C$#30!13?C$#22!14?C$#11!15?C$#24!16?CCC$#22!19?CC$#30!21?C$#31!22?C$#27!23?C$#30!24?CC$#24!26?C$#22!27?C$#27!28?C$#32!29?CC$#30!31?CC$#23!33?C$#27!34?CC$#18!36?C$#19!37?C$#4!38?C$#19!39?C$#11!40?CC$#4!42?CC$#11!44?C$#19!45?C$#11!46?CCC$#14!49?C$#12!50?C$#11!51?CCC$#14!54?C$#12!55?C$#7!56?C$#11!57?C$#19!58?C$#11!59?CCCCCCCCCCC$#41!70?CC$#38!72?C$#37!73?C$#38!74?C$#27!75?CCC$#61!78?C$#88!79?C$#99!80?C$#90!81?C$#60!82?C$#99!83?C$#87!84?C$#65!85?C$#66!86?C$#65!87?C$#79!88?C$#61!89?C$#87!90?C$#65!91?C$#110!92?C$#60!93?C$#99!94?C$#97!95?C$#87!96?C$#90!97?C$#135!98?C$#183!99?C$#179!100?C$#192!101?C$#211!102?C$#195!103?CC$#47!105?C$#63!106?C$#96!107?C$#106!108?CCCC$#111!112?C$#106!113?C$#96!114?C$#82!115?C$#37!116?C$#54!117?C$#125!118?C$#146!119?C$#125!120?C$#91!121?C$#151!122?C$#159!123?C$#116!124?C$#87!125?C$#100!126?C$#143!127?C$#117!128?C$#126!129?C$#110!130?C$#103!131?C$#151!132?C$#192!133?CC$#195!135?C$#107!136?C$#185!137?C$#205!138?C$#187!139?C$#231!140?C$#218!141?CC$#176!143?C$#195!144?C$#214!145?C$#249!146?C$#247!147?C$#154!148?CC$#140!150?C$#154!151?C$#165!152?C$#180!153?C$#125!154?C$#144!155?C$#135!156?C$#151!157?C$#158!158?C$#141!159?C$#161!160?C$#162!161?C$#170!162?C$#139!163?C$#164!164?C$#181!165?CCC$#161!168?C$#170!169?C$#124!170?C$#161!171?C$#133!172?C$#141!173?CC$#158!175?C$#161!176?C$#177!177?C$#181!178?C$#213!179?C$#229!180?C$#210!181?CC$#179!183?C$#183!184?C$#233!185?C$#209!186?C$#196!187?C$#209!188?CCCC$#211!192?CC$#231!194?C$#218!195?C$#173!196?C$#205!197?C$#218!198?C$#222!199?C$#220!200?CC$#239!202?C$#243!203?C$#245!204?C$#244!205?C$#246!206?C$#241!207?C$#233!208?CC$#198!210?C$#228!211?C$#248!212?C$#227!213?C$#198!214?C$#211!215?C$#192!216?C$#211!217?CC$#153!219?C$#231!220?C$#180!221?CC$#173!223?C$#212!224?C$#180!225?CC$#165!227?C$#107!228?C$#184!229?C$#187!230?C$#214!231?C$#195!232?C$#217!233?C$#204!234?C$#214!235?C$#212!236?C$#204!237?C$#222!238?C$#221!239?C$#219!240?C$#221!241?C$#242!242?C$#221!243?C$#219!244?CC$#222!246?C$#242!247?C$#234!248?C$#235!249?C$#239!250?C$#242!251?C$#243!252?C$#239!253?C$#232!254?C$#222!255?C$#232!256?C$#234!257?C$#232!258?C$#226!259?C$#224!260?C$#225!261?C$#224!262?C$#225!263?CC$#231!265?CCC$#4G$#11!1?G$#4!2?G$#11!3?G$#21!4?G$#19!5?GG$#18!7?GG$#24!9?GG$#31!11?G$#23!12?G$#30!13?G$#24!14?G$#27!15?G$#18!16?G$#24!17?G$#27!18?G$#22!19?GG$#32!21?G$#34!22?G$#30!23?GGG$#27!26?G$#30!27?G$#22!28?G$#30!29?GGG$#27!32?G$#30!33?G$#18!34?G$#24!35?G$#11!36?G$#21!37?G$#11!38?G$#19!39?G$#4!40?GGG$#11!43?G$#4!44?GG$#11!46?GGG$#14!49?GG$#11!51?GG$#21!53?G$#11!54?GGG$#19!57?G$#11!58?G$#4!59?GGGGGGG$#18!66?G$#4!67?GG$#18!69?G$#41!70?G$#38!71?G$#37!72?G$#31!73?G$#30!74?G$#37!75?G$#31!76?G$#4!77?G$#47!78?G$#79!79?G$#99!80?G$#65!81?G$#58!82?G$#110!83?G$#88!84?G$#65!85?G$#103!86?G$#85!87?G$#59!88?G$#65!89?G$#60!90?G$#92!91?G$#87!92?G$#99!93?G$#65!94?G$#116!95?G$#125!96?G$#151!97?G$#198!98?G$#165!99?G$#140!100?G$#182!101?G$#225!102?G$#182!103?G$#173!104?G$#92!105?G$#51!106?G$#178!107?G$#64!108?G$#49!109?G$#69!110?G$#131!111?GG$#96!113?G$#94!114?GG$#38!116?G$#53!117?G$#110!118?G$#154!119?G$#200!120?G$#125!121?G$#90!122?G$#112!123?G$#125!124?G$#112!125?G$#115!126?G$#146!127?G$#116!128?G$#151!129?GG$#135!131?G$#151!132?G$#183!133?G$#192!134?G$#180!135?G$#205!136?G$#157!137?G$#194!138?G$#217!139?G$#176!140?G$#219!141?G$#218!142?G$#199!143?GG$#205!145?G$#187!146?G$#195!147?G$#180!148?G$#167!149?G$#153!150?G$#143!151?G$#165!152?G$#196!153?G$#127!154?G$#135!155?G$#146!156?G$#164!157?G$#162!158?G$#158!159?G$#133!160?G$#170!161?G$#145!162?G$#161!163?G$#181!164?G$#160!165?G$#181!166?G$#158!167?G$#181!168?G$#200!169?G$#141!170?GGG$#118!173?G$#122!174?G$#141!175?G$#161!176?G$#162!177?G$#200!178?G$#207!179?G$#208!180?G$#207!181?G$#210!182?G$#227!183?G$#246!184?G$#227!185?G$#213!186?GG$#210!188?G$#179!189?G$#183!190?G$#227!191?G$#196!192?G$#199!193?G$#212!194?G$#195!195?G$#219!196?G$#218!197?G$#232!198?GG$#220!200?G$#234!201?G$#239!202?G$#243!203?G$#244!204?G$#241!205?GG$#240!207?G$#230!208?G$#227!209?G$#213!210?G$#233!211?G$#228!212?G$#209!213?G$#227!214?GG$#192!216?G$#227!217?G$#209!218?G$#180!219?G$#231!220?G$#205!221?G$#195!222?G$#173!223?GG$#176!225?G$#180!226?G$#137!227?G$#117!228?G$#171!229?G$#176!230?G$#204!231?G$#195!232?G$#216!233?G$#214!234?GG$#199!236?G$#218!237?GG$#219!239?G$#218!240?G$#222!241?G$#232!242?G$#234!243?G$#223!244?G$#219!245?G$#242!246?G$#234!247?GG$#232!249?G$#234!250?G$#242!251?G$#243!252?G$#234!253?G$#231!254?G$#232!255?GGG$#231!258?G$#224!259?GG$#231!261?G$#224!262?G$#231!263?GGG$#235!266?G$#225!267?G$#19O$#11!1?O$#4!2?O$#11!3?OO$#18!5?O$#24!6?OO$#18!8?O$#27!9?O$#24!10?O$#27!11?OOO$#22!14?O$#36!15?O$#24!16?OO$#22!18?OO$#27!20?O$#23!21?O$#30!22?O$#36!23?O$#27!24?OO$#22!26?OO$#31!28?OO$#27!30?OO$#30!32?O$#27!33?O$#24!34?OOO$#19!37?OO$#11!39?OOOOO$#4!44?O$#11!45?OOOO$#9!49?O$#11!50?OOOOOOO$#19!57?O$#11!58?O$#19!59?O$#11!60?O$#4!61?OOOOOO$#11!67?O$#4!68?OO$#38!70?OO$#36!72?O$#27!73?O$#22!74?O$#36!75?OO$#27!77?O$#56!78?O$#58!79?O$#61!80?O$#79!81?O$#87!82?O$#99!83?O$#89!84?O$#85!85?O$#58!86?O$#65!87?O$#58!88?O$#99!89?O$#100!90?O$#61!91?O$#41!92?O$#137!93?O$#107!94?O$#90!95?O$#151!96?O$#183!97?O$#116!98?O$#211!99?O$#227!100?O$#209!101?O$#230!102?O$#227!103?O$#196!104?O$#148!105?O$#63!106?O$#69!107?O$#64!108?O$#21!109?O$#45!110?O$#51!111?O$#82!112?O$#104!113?O$#82!114?O$#62!115?O$#40!116?O$#42!117?O$#126!118?O$#183!119?O$#182!120?O$#135!121?O$#108!122?O$#90!123?O$#125!124?OO$#91!126?O$#110!127?O$#90!128?O$#146!129?O$#172!130?O$#179!131?O$#135!132?O$#164!133?O$#151!134?O$#180!135?O$#195!136?O$#117!137?O$#216!138?OO$#199!140?O$#193!141?O$#220!142?O$#218!143?O$#171!144?O$#251!145?O$#222!146?O$#214!147?O$#202!148?O$#195!149?O$#165!150?O$#135!151?O$#156!152?O$#183!153?O$#176!154?O$#167!155?O$#163!156?O$#155!157?O$#172!158?O$#144!159?O$#177!160?O$#158!161?O$#161!162?O$#141!163?O$#170!164?O$#161!165?O$#170!166?O$#177!167?O$#161!168?O$#181!169?O$#170!170?O$#164!171?O$#145!172?O$#128!173?O$#118!174?O$#141!175?O$#158!176?O$#161!177?OO$#207!179?O$#208!180?O$#207!181?O$#229!182?O$#227!183?O$#240!184?O$#228!185?O$#198!186?O$#200!187?O$#213!188?OO$#227!190?O$#211!191?O$#202!192?O$#196!193?O$#180!194?O$#222!195?OO$#219!197?O$#224!198?O$#218!199?O$#220!200?O$#222!201?O$#220!202?O$#243!203?O$#249!204?O$#247!205?O$#246!206?O$#241!207?OO$#240!209?O$#230!210?O$#237!211?O$#228!212?OO$#230!214?O$#247!215?O$#226!216?O$#165!217?O$#196!218?O$#167!219?O$#173!220?O$#214!221?O$#195!222?OO$#176!224?OO$#173!226?O$#130!227?O$#111!228?O$#147!229?O$#168!230?O$#205!231?O$#195!232?O$#194!233?O$#217!234?O$#205!235?O$#218!236?O$#214!237?O$#219!238?O$#215!239?O$#214!240?O$#221!241?O$#232!242?O$#239!243?O$#234!244?OO$#242!246?O$#232!247?O$#242!248?OOO$#243!251?OO$#234!253?O$#224!254?O$#222!255?O$#232!256?OO$#231!258?O$#221!259?O$#224!260?O$#231!261?O$#244!262?O$#235!263?O$#231!264?OO$#244!266?O$#225!267?O$#11__$#4!2?_$#19!3?_$#5!4?_$#18!5?__$#11!7?_$#24!8?___$#27!11?_$#24!12?_$#22!13?__$#27!15?_$#18!16?_$#24!17?_$#22!18?_$#23!19?__$#32!21?_$#27!22?__$#22!24?__$#30!26?_$#32!27?_$#18!28?_$#22!29?_$#30!30?_$#27!31?_$#22!32?_$#27!33?___$#21!36?_$#19!37?_$#11!38?_____$#1!43?_$#11!44?_$#4!45?__$#11!47?__$#7!49?_$#11!50?___$#19!53?_$#21!54?_$#11!55?_$#21!56?_$#4!57?_$#11!58?_$#4!59?_______$#11!66?__$#4!68?_$#18!69?_$#31!70?_$#38!71?__$#30!73?_$#37!74?_$#23!75?_$#40!76?_$#38!77?_$#41!78?_$#47!79?_$#59!80?_$#65!81?____$#67!85?_$#54!86?_$#79!87?_$#65!88?_$#99!89?_$#89!90?_$#99!91?_$#58!92?__$#154!94?_$#99!95?_$#112!96?_$#135!97?_$#167!98?_$#182!99?_$#192!100?_$#154!101?_$#230!102?_$#192!103?_$#153!104?_$#165!105?_$#73!106?_$#63!107?_$#104!108?_$#96!109?_$#111!110?_$#106!111?_$#123!112?_$#106!113?_$#96!114?_$#76!115?_$#39!116?_$#48!117?_$#126!118?_$#167!119?_$#166!120?_$#146!121?_$#108!122?_$#100!123?_$#105!124?_$#135!125?_$#99!126?_$#91!127?_$#108!128?_$#135!129?_$#110!130?_$#116!131?_$#155!132?_$#146!133?_$#154!134?_$#165!135?_$#157!136?_$#204!137?_$#239!138?_$#221!139?_$#168!140?_$#219!141?_$#232!142?_$#217!143?_$#169!144?_$#222!145?_$#204!146?_$#214!147?_$#202!148?_$#247!149?_$#180!150?_$#154!151?_$#146!152?_$#173!153?_$#167!154?_$#209!155?_$#172!156?_$#139!157?_$#158!158?_$#164!159?_$#200!160?_$#158!161?_$#141!162?_$#158!163?_$#170!164?_$#163!165?_$#170!166?_$#158!167?_$#177!168?_$#170!169?_$#177!170?_$#145!171?_$#133!172?_$#128!173?_$#129!174?__$#141!176?_$#161!177?__$#181!179?_$#170!180?_$#207!181?_$#229!182?_$#213!183?_$#207!184?_$#172!185?_$#210!186?_$#213!187?_$#210!188?_$#209!189?_$#240!190?_$#236!191?_$#199!192?_$#224!193?__$#219!195?_$#218!196?_$#214!197?_$#219!198?_$#222!199?__$#239!201?_$#222!202?_$#239!203?_$#251!204?_$#249!205?__$#246!207?_$#226!208?__$#227!210?_$#211!211?_$#241!212?_$#236!213?__$#235!215?_$#231!216?_$#211!217?__$#195!219?_$#180!220?_$#176!221?_$#202!222?_$#214!223?_$#193!224?_$#195!225?_$#165!226?_$#138!227?_$#95!228?_$#147!229?_$#165!230?_$#187!231?_$#168!232?_$#187!233?_$#221!234?_$#205!235?_$#218!236?_$#215!237?_$#216!238?_$#217!239?_$#232!240?___$#239!243?__$#242!245?__$#234!247?_$#243!248?_$#242!249?_$#243!250?___$#232!253?_$#234!254?_$#222!255?_$#232!256?__$#224!258?_$#234!259?_$#242!260?_$#231!261?_$#235!262?_$#231!263?_$#235!264?_$#236!265?_$#225!266?_$#235!267?_$-#11@@@@$#19!4?@$#11!5?@$#18!6?@$#11!7?@$#18!8?@$#24!9?@@$#27!11?@$#22!12?@$#27!13?@@$#30!15?@$#18!16?@$#24!17?@$#27!18?@$#22!19?@$#23!20?@$#32!21?@$#30!22?@$#27!23?@@@$#30!26?@$#34!27?@$#27!28?@$#22!29?@$#30!30?@$#31!31?@$#27!32?@$#22!33?@$#11!34?@$#24!35?@$#21!36?@$#19!37?@@$#4!39?@$#11!40?@@$#4!42?@@$#11!44?@@@$#4!47?@$#1!48?@$#11!49?@$#19!50?@$#7!51?@$#11!52?@$#19!53?@$#11!54?@@@@$#19!58?@$#11!59?@$#4!60?@@$#11!62?@$#4!63?@@@$#11!66?@@$#4!68?@$#27!69?@$#34!70?@$#41!71?@$#38!72?@$#27!73?@$#36!74?@$#22!75?@$#37!76?@$#46!77?@$#47!78?@$#58!79?@@@$#66!82?@$#86!83?@$#60!84?@$#54!85?@@$#75!87?@$#66!88?@$#58!89?@$#54!90?@$#73!91?@$#99!92?@$#127!93?@$#90!94?@$#135!95?@$#126!96?@$#116!97?@$#144!98?@$#164!99?@$#163!100?@$#164!101?@$#210!102?@$#183!103?@$#213!104?@$#209!105?@$#153!106?@$#67!107?@$#80!108?@$#103!109?@$#107!110?@$#123!111?@$#111!112?@@$#94!114?@$#56!115?@$#43!116?@$#62!117?@$#117!118?@$#165!119?@@$#143!121?@$#125!122?@$#97!123?@$#90!124?@$#146!125?@$#116!126?@@$#99!128?@$#116!129?@$#125!130?@$#105!131?@$#143!132?@$#125!133?@$#90!134?@$#153!135?@$#205!136?@$#201!137?@$#222!138?@$#232!139?@$#234!140?@$#243!141?@$#242!142?@$#232!143?@$#168!144?@$#242!145?@$#234!146?@$#205!147?@$#214!148?@$#202!149?@$#195!150?@$#154!151?@$#173!152?@@$#167!154?@@$#209!156?@$#156!157?@$#158!158?@$#163!159?@$#158!160?@$#141!161?@$#170!162?@$#158!163?@$#141!164?@$#170!165?@$#161!166?@$#181!167?@$#170!168?@@@@$#120!172?@$#113!173?@@$#118!175?@$#128!176?@$#158!177?@$#161!178?@$#170!179?@$#207!180?@@$#181!182?@@$#213!184?@$#230!185?@$#229!186?@$#233!187?@$#210!188?@$#229!189?@$#241!190?@$#227!191?@$#247!192?@$#244!193?@$#212!194?@$#234!195?@$#218!196?@$#215!197?@$#222!198?@$#232!199?@$#214!200?@$#232!201?@$#234!202?@$#220!203?@$#251!204?@@$#250!206?@$#243!207?@$#219!208?@$#245!209?@$#236!210?@$#231!211?@$#212!212?@$#245!213?@$#249!214?@$#243!215?@$#247!216?@$#235!217?@$#225!218?@$#195!219?@$#214!220?@$#199!221?@$#214!222?@$#166!223?@$#205!224?@@$#168!226?@$#132!227?@$#117!228?@$#131!229?@$#168!230?@$#187!231?@$#176!232?@$#193!233?@$#215!234?@$#205!235?@$#204!236?@$#215!237?@$#217!238?@$#218!239?@@$#220!241?@$#234!242?@$#242!243?@$#220!244?@$#243!245?@@$#239!247?@$#243!248?@$#242!249?@$#243!250?@@$#242!252?@$#231!253?@$#232!254?@$#231!255?@$#222!256?@@$#224!258?@$#231!259?@$#242!260?@$#235!261?@$#225!262?@$#235!263?@@$#236!265?@$#235!266?@$#225!267?@$#11A$#4!1?A$#11!2?AAA$#18!5?A$#4!6?A$#18!7?A$#24!8?A$#27!9?AAA$#30!12?A$#36!13?A$#24!14?AAA$#27!17?A$#24!18?A$#27!19?AAAAA$#30!24?A$#24!25?A$#30!26?A$#22!27?AA$#30!29?A$#27!30?AAA$#24!33?AA$#11!35?A$#19!36?AA$#11!38?A$#19!39?A$#11!40?A$#4!41?A$#5!42?A$#11!43?A$#4!44?A$#11!45?A$#4!46?A$#11!47?AAAA$#4!51?AA$#11!53?A$#19!54?A$#4!55?A$#11!56?A$#19!57?A$#4!58?AA$#11!60?AAA$#4!63?AAA$#11!66?AAA$#18!69?A$#42!70?A$#40!71?A$#42!72?A$#36!73?A$#22!74?A$#38!75?A$#41!76?A$#50!77?A$#40!78?AA$#54!80?A$#58!81?A$#60!82?A$#79!83?A$#58!84?A$#101!85?A$#54!86?AAA$#67!89?AA$#47!91?A$#66!92?A$#92!93?A$#86!94?A$#99!95?A$#125!96?A$#97!97?A$#114!98?A$#105!99?A$#113!100?A$#120!101?A$#129!102?A$#200!103?A$#156!104?A$#167!105?A$#180!106?A$#103!107?A$#73!108?A$#184!109?A$#148!110?A$#123!111?A$#106!112?A$#101!113?A$#63!114?A$#57!115?A$#22!116?A$#67!117?A$#117!118?A$#153!119?A$#196!120?A$#182!121?A$#144!122?A$#118!123?A$#144!124?A$#110!125?A$#137!126?A$#110!127?A$#126!128?A$#143!129?A$#135!130?A$#125!131?A$#146!132?A$#87!133?A$#135!134?A$#165!135?A$#167!136?A$#130!137?A$#232!138?A$#222!139?A$#214!140?A$#176!141?A$#234!142?A$#222!143?A$#194!144?A$#239!145?A$#243!146?A$#194!147?A$#176!148?A$#205!149?A$#202!150?A$#205!151?A$#154!152?A$#209!153?A$#182!154?A$#198!155?AA$#125!157?A$#170!158?A$#159!159?A$#158!160?A$#162!161?A$#161!162?A$#158!163?A$#170!164?A$#162!165?A$#170!166?AA$#161!168?A$#181!169?A$#170!170?A$#158!171?A$#163!172?A$#122!173?A$#141!174?A$#124!175?A$#113!176?A$#118!177?A$#124!178?A$#161!179?A$#170!180?A$#200!181?A$#228!182?A$#213!183?A$#240!184?A$#241!185?AA$#230!187?A$#209!188?A$#227!189?A$#213!190?A$#230!191?A$#211!192?A$#236!193?A$#235!194?A$#224!195?A$#219!196?A$#225!197?A$#224!198?A$#231!199?A$#219!200?A$#239!201?A$#234!202?A$#220!203?A$#243!204?A$#252!205?A$#250!206?AA$#239!208?A$#222!209?A$#247!210?A$#231!211?A$#224!212?A$#196!213?A$#212!214?A$#243!215?A$#218!216?A$#222!217?A$#176!218?A$#166!219?A$#195!220?A$#165!221?A$#212!222?A$#187!223?A$#165!224?A$#157!225?A$#149!226?A$#148!227?A$#107!228?A$#131!229?A$#168!230?AAA$#187!233?A$#205!234?A$#194!235?AA$#204!237?A$#222!238?A$#216!239?A$#215!240?A$#222!241?AA$#232!243?A$#234!244?A$#239!245?A$#242!246?AA$#243!248?AA$#242!250?AAA$#222!253?A$#231!254?A$#232!255?A$#239!256?A$#234!257?A$#224!258?A$#231!259?A$#235!260?A$#231!261?A$#235!262?AA$#225!264?AA$#235!266?AA$#4C$#7!1?C$#11!2?CC$#18!4?C$#11!5?C$#18!6?C$#24!7?CC$#27!9?C$#30!10?C$#24!11?C$#27!12?C$#24!13?C$#27!14?C$#4!15?C$#24!16?CC$#22!18?C$#30!19?CC$#22!21?CCCC$#27!25?CC$#22!27?C$#27!28?CC$#30!30?C$#22!31?C$#30!32?C$#18!33?CC$#27!35?C$#19!36?C$#11!37?CCC$#5!40?C$#11!41?CCCC$#19!45?C$#5!46?C$#14!47?CC$#19!49?CC$#11!51?C$#9!52?C$#11!53?CC$#19!55?C$#4!56?CC$#11!58?C$#4!59?C$#11!60?CC$#5!62?C$#11!63?CCC$#4!66?C$#11!67?CC$#18!69?C$#37!70?C$#40!71?CC$#34!73?C$#27!74?C$#34!75?C$#47!76?C$#54!77?CC$#41!79?CC$#58!81?C$#54!82?C$#47!83?C$#73!84?C$#54!85?C$#41!86?C$#67!87?C$#89!88?C$#84!89?C$#60!90?C$#89!91?C$#92!92?C$#91!93?C$#87!94?C$#116!95?C$#100!96?C$#105!97?C$#113!98?C$#97!99?C$#118!100?C$#113!101?C$#118!102?CC$#160!104?C$#207!105?C$#196!106?CC$#84!108?C$#96!109?C$#107!110?C$#103!111?C$#96!112?C$#94!113?C$#54!114?C$#30!115?CC$#67!117?C$#117!118?C$#153!119?C$#151!120?C$#154!121?C$#151!122?C$#114!123?C$#105!124?C$#91!125?C$#79!126?C$#100!127?C$#99!128?C$#143!129?C$#110!130?C$#119!131?C$#105!132?C$#126!133?C$#150!134?C$#165!135?C$#153!136?C$#235!137?C$#220!138?C$#232!139?C$#222!140?C$#220!141?C$#239!142?C$#251!143?C$#206!144?C$#239!145?C$#242!146?C$#222!147?C$#202!148?C$#195!149?C$#221!150?C$#212!151?C$#196!152?C$#167!153?C$#179!154?C$#200!155?C$#198!156?CC$#207!158?CC$#200!160?C$#177!161?C$#161!162?C$#141!163?C$#177!164?C$#170!165?C$#181!166?C$#170!167?CC$#177!169?C$#200!170?C$#177!171?C$#141!172?C$#177!173?C$#128!174?C$#141!175?CC$#122!177?C$#141!178?CC$#170!180?C$#200!181?C$#229!182?C$#213!183?C$#240!184?C$#237!185?C$#213!186?C$#227!187?C$#198!188?C$#210!189?C$#240!190?CC$#227!192?C$#226!193?C$#244!194?CC$#218!196?C$#223!197?C$#222!198?C$#219!199?CC$#239!201?C$#220!202?CC$#219!204?C$#251!205?CCC$#243!208?C$#250!209?C$#251!210?C$#244!211?CC$#225!213?C$#218!214?C$#212!215?C$#225!216?C$#219!217?C$#214!218?C$#195!219?C$#223!220?C$#180!221?C$#202!222?C$#157!223?C$#168!224?C$#176!225?C$#150!226?C$#130!227?C$#104!228?C$#131!229?C$#171!230?C$#165!231?C$#168!232?C$#216!233?C$#204!234?C$#195!235?C$#214!236?C$#205!237?C$#220!238?CC$#216!240?C$#222!241?CCC$#234!244?C$#243!245?C$#239!246?C$#243!247?C$#242!248?C$#243!249?CC$#239!251?C$#242!252?C$#223!253?C$#224!254?C$#231!255?C$#239!256?C$#232!257?CC$#235!259?C$#231!260?CCC$#235!263?C$#236!264?C$#225!265?CC$#231!267?C$#4G$#11!1?G$#19!2?G$#11!3?G$#18!4?GGG$#24!7?G$#22!8?GG$#27!10?GG$#22!12?G$#27!13?G$#30!14?G$#27!15?GG$#22!17?G$#27!18?GG$#30!20?GG$#31!22?GG$#27!24?GGG$#30!27?G$#27!28?GGGG$#30!32?G$#24!33?GG$#19!35?G$#11!36?G$#4!37?G$#11!38?G$#4!39?GGGG$#11!43?G$#4!44?G$#11!45?GGG$#7!48?G$#11!49?GGG$#19!52?G$#7!53?GG$#11!55?GG$#19!57?G$#4!58?G$#11!59?GG$#4!61?GGGGGGGG$#18!69?G$#40!70?G$#37!71?G$#38!72?G$#40!73?G$#31!74?G$#37!75?G$#34!76?G$#47!77?G$#58!78?G$#41!79?GG$#67!81?G$#34!82?G$#67!83?G$#58!84?G$#40!85?G$#43!86?G$#41!87?GG$#54!89?GG$#83!91?G$#66!92?G$#58!93?G$#103!94?G$#59!95?G$#90!96?G$#112!97?G$#87!98?G$#97!99?G$#113!100?GG$#90!102?G$#113!103?G$#141!104?G$#144!105?G$#167!106?G$#209!107?G$#167!108?G$#94!109?G$#96!110?GG$#94!112?G$#71!113?G$#44!114?G$#14!115?G$#37!116?G$#85!117?G$#117!118?G$#146!119?G$#105!120?G$#151!121?G$#146!122?G$#108!123?G$#99!124?G$#65!125?G$#86!126?G$#99!127?G$#110!128?G$#99!129?G$#116!130?G$#146!131?G$#140!132?G$#176!133?G$#173!134?G$#154!135?G$#220!136?G$#216!137?G$#242!138?G$#176!139?G$#180!140?G$#232!141?G$#242!142?G$#239!143?G$#194!144?G$#239!145?G$#242!146?G$#217!147?G$#215!148?G$#234!149?G$#202!150?G$#195!151?G$#199!152?G$#182!153?G$#209!154?G$#198!155?G$#183!156?G$#181!157?G$#213!158?G$#181!159?GG$#200!161?G$#172!162?G$#207!163?G$#177!164?G$#161!165?G$#181!166?G$#161!167?G$#200!168?G$#177!169?G$#161!170?GG$#200!172?G$#161!173?GG$#118!175?G$#128!176?G$#118!177?G$#124!178?G$#122!179?G$#161!180?G$#200!181?G$#208!182?GG$#207!184?G$#237!185?G$#227!186?G$#213!187?G$#181!188?G$#228!189?G$#229!190?G$#227!191?GG$#241!193?G$#236!194?G$#224!195?G$#231!196?G$#234!197?G$#224!198?G$#199!199?G$#218!200?G$#239!201?GG$#242!203?G$#197!204?G$#189!205?G$#250!206?G$#252!207?GG$#250!209?G$#236!210?G$#246!211?G$#236!212?G$#225!213?G$#235!214?G$#226!215?G$#218!216?GG$#222!218?G$#223!219?G$#205!220?G$#195!221?G$#149!222?G$#157!223?G$#205!224?G$#204!225?G$#180!226?G$#130!227?G$#83!228?G$#131!229?G$#187!230?G$#184!231?G$#171!232?G$#217!233?G$#193!234?G$#204!235?G$#193!236?G$#205!237?G$#220!238?G$#221!239?G$#231!240?G$#239!241?G$#232!242?G$#217!243?G$#234!244?G$#239!245?G$#242!246?GGG$#243!249?GG$#234!251?G$#232!252?G$#224!253?GGG$#232!256?G$#231!257?G$#234!258?G$#242!259?GG$#235!261?G$#225!262?GG$#226!264?G$#230!265?G$#235!266?G$#224!267?G$#7O$#5!1?O$#4!2?OO$#18!4?O$#11!5?O$#27!6?O$#24!7?O$#22!8?O$#18!9?O$#24!10?O$#23!11?O$#22!12?O$#24!13?O$#27!14?O$#24!15?O$#27!16?OOO$#30!19?O$#27!20?OO$#32!22?O$#34!23?O$#30!24?O$#24!25?OOO$#22!28?O$#30!29?O$#27!30?OO$#30!32?O$#24!33?O$#19!34?OOOO$#11!38?OOOOOOO$#21!45?O$#11!46?O$#14!47?O$#12!48?O$#11!49?O$#21!50?O$#11!51?OO$#21!53?O$#7!54?O$#11!55?O$#4!56?O$#11!57?O$#4!58?OO$#11!60?O$#4!61?O$#5!62?O$#4!63?OOOO$#11!67?O$#4!68?O$#36!69?O$#30!70?O$#32!71?O$#38!72?O$#34!73?O$#37!74?O$#41!75?O$#46!76?O$#54!77?OOO$#67!80?O$#53!81?O$#34!82?O$#56!83?O$#34!84?O$#53!85?O$#34!86?O$#41!87?O$#67!88?O$#58!89?O$#47!90?O$#58!91?O$#66!92?O$#58!93?O$#47!94?O$#60!95?O$#85!96?O$#90!97?OO$#97!99?O$#105!100?O$#87!101?O$#129!102?O$#121!103?O$#200!104?O$#146!105?O$#151!106?O$#182!107?O$#195!108?O$#103!109?O$#80!110?O$#63!111?O$#31!112?O$#37!113?O$#21!114?O$#27!115?O$#38!116?O$#67!117?O$#99!118?O$#90!119?O$#97!120?O$#116!121?O$#90!122?OO$#86!124?O$#99!125?O$#91!126?OO$#79!128?O$#100!129?O$#110!130?O$#135!131?O$#165!132?O$#173!133?O$#180!134?O$#196!135?O$#212!136?O$#215!137?O$#243!138?O$#224!139?O$#195!140?O$#242!141?O$#239!142?O$#242!143?OO$#239!145?OO$#220!147?O$#239!148?O$#218!149?O$#222!150?O$#214!151?O$#195!152?O$#211!153?O$#196!154?O$#198!155?OO$#172!157?O$#209!158?O$#164!159?O$#181!160?O$#198!161?O$#228!162?O$#200!163?O$#181!164?OO$#200!166?O$#177!167?O$#200!168?O$#162!169?O$#181!170?O$#200!171?O$#170!172?O$#162!173?O$#122!174?O$#141!175?O$#129!176?O$#122!177?O$#124!178?O$#141!179?O$#161!180?O$#170!181?O$#200!182?O$#213!183?O$#240!184?O$#230!185?O$#213!186?O$#200!187?O$#228!188?OO$#213!190?O$#229!191?O$#228!192?O$#198!193?O$#192!194?O$#244!195?O$#234!196?O$#218!197?O$#196!198?O$#212!199?O$#221!200?O$#222!201?O$#234!202?O$#222!203?O$#220!204?O$#239!205?O$#251!206?O$#254!207?O$#252!208?O$#243!209?O$#231!210?O$#248!211?O$#236!212?O$#235!213?O$#244!214?O$#224!215?O$#199!216?O$#231!217?O$#187!218?O$#205!219?O$#195!220?O$#166!221?O$#187!222?O$#165!223?O$#138!224?O$#165!225?O$#148!226?O$#157!227?O$#96!228?O$#131!229?O$#175!230?O$#193!231?O$#187!232?O$#205!233?O$#193!234?O$#194!235?O$#204!236?O$#205!237?O$#206!238?O$#219!239?O$#221!240?O$#232!241?O$#222!242?O$#232!243?O$#242!244?OO$#239!246?O$#242!247?OO$#250!249?O$#239!250?O$#220!251?O$#219!252?O$#222!253?O$#224!254?O$#234!255?OO$#231!257?OO$#234!259?O$#235!260?OO$#231!262?O$#236!263?OO$#226!265?OO$#235!267?O$#7_$#4!1?_$#11!2?_$#18!3?___$#24!6?_$#18!7?___$#24!10?_$#30!11?_$#22!12?_$#24!13?_$#27!14?__$#18!16?__$#27!18?_$#22!19?_$#30!20?_$#18!21?_$#32!22?_$#15!23?_$#22!24?_$#27!25?___$#30!28?_$#18!29?_$#22!30?_$#27!31?__$#21!33?__$#19!35?_$#21!36?_$#4!37?_$#19!38?_$#4!39?_$#19!40?_$#11!41?______$#12!47?_$#11!48?_$#14!49?__$#11!51?__$#21!53?_$#1!54?_$#19!55?_$#4!56?_$#11!57?___$#4!60?___$#11!63?_$#4!64?__$#11!66?_$#4!67?___$#22!70?_$#36!71?_$#37!72?_$#40!73?_$#39!74?_$#27!75?_$#41!76?_$#37!77?_$#41!78?_$#47!79?__$#67!81?_$#76!82?_$#47!83?_$#41!84?_$#37!85?_$#38!86?_$#22!87?_$#48!88?_$#62!89?_$#66!90?_$#73!91?_$#65!92?____$#61!96?_$#90!97?_$#105!98?_$#119!99?_$#97!100?_$#162!101?_$#120!102?_$#159!103?_$#114!104?_$#133!105?_$#172!106?_$#154!107?_$#183!108?_$#148!109?_$#117!110?_$#47!111?_$#21!112?_$#27!113?_$#21!114?__$#37!116?_$#44!117?_$#54!118?_$#60!119?_$#65!120?_$#60!121?_$#61!122?_$#65!123?_$#58!124?_$#79!125?__$#86!127?_$#91!128?_$#117!129?_$#157!130?_$#180!131?_$#167!132?_$#150!133?_$#199!134?_$#218!135?_$#166!136?_$#193!137?_$#239!138?_$#234!139?_$#239!140?_$#243!141?___$#220!144?_$#239!145?_$#232!146?_$#204!147?_$#234!148?_$#222!149?_$#218!150?_$#202!151?_$#212!152?_$#196!153?_$#192!154?_$#200!155?__$#181!157?_$#209!158?_$#198!159?_$#209!160?_$#228!161?_$#213!162?_$#233!163?_$#213!164?_$#208!165?_$#170!166?_$#177!167?_$#181!168?_$#200!169?_$#207!170?_$#200!171?_$#177!172?_$#207!173?_$#161!174?_$#158!175?_$#122!176?__$#118!178?_$#128!179?_$#158!180?_$#170!181?_$#177!182?_$#207!183?_$#238!184?_$#229!185?_$#233!186?_$#241!187?_$#236!188?_$#230!189?_$#229!190?_$#200!191?_$#210!192?_$#227!193?_$#241!194?_$#242!195?_$#231!196?_$#202!197?_$#218!198?_$#231!199?_$#214!200?_$#205!201?_$#214!202?_$#217!203?_$#184!204?_$#169!205?_$#239!206?_$#251!207?_$#254!208?_$#252!209?_$#246!210?__$#249!212?_$#231!213?_$#236!214?_$#234!215?_$#221!216?__$#231!218?_$#184!219?_$#205!220?_$#195!221?_$#176!222?_$#202!223?_$#180!224?_$#168!225?_$#157!226?_$#165!227?_$#101!228?_$#131!229?_$#175!230?_$#204!231?_$#195!232?_$#193!233?_$#205!234?_$#214!235?_$#223!236?_$#221!237?_$#219!238?_$#218!239?__$#239!241?_$#232!242?___$#243!245?_$#242!246?_$#243!247?___$#232!250?_$#222!251?_$#223!252?_$#224!253?_$#234!254?_$#232!255?_$#234!256?__$#235!258?__$#242!260?_$#235!261?_$#236!262?_$#231!263?_$#235!264?_$#226!265?_$#225!266?_$#236!267?_$-#4@$#11!1?@@@$#18!4?@$#24!5?@$#18!6?@$#22!7?@$#24!8?@$#11!9?@$#27!10?@@$#24!12?@$#27!13?@$#11!14?@$#24!15?@$#22!16?@$#27!17?@@@$#30!20?@$#36!21?@$#30!22?@$#27!23?@$#22!24?@$#27!25?@$#22!26?@$#24!27?@$#27!28?@$#30!29?@$#27!30?@$#22!31?@$#24!32?@@$#21!34?@$#11!35?@$#21!36?@$#5!37?@$#11!38?@@@@$#7!42?@$#11!43?@@$#7!45?@$#11!46?@$#14!47?@$#11!48?@@@@@@$#14!54?@$#11!55?@@@$#4!58?@$#11!59?@@$#4!61?@$#5!62?@$#4!63?@$#5!64?@$#4!65?@$#11!66?@$#4!67?@@$#21!69?@@$#27!71?@$#36!72?@$#37!73?@$#40!74?@$#32!75?@$#37!76?@$#41!77?@$#45!78?@$#41!79?@$#52!80?@$#41!81?@$#22!82?@$#37!83?@$#40!84?@$#31!85?@$#21!86?@$#22!87?@$#43!88?@$#30!89?@$#41!90?@$#67!91?@$#58!92?@$#54!93?@$#65!94?@$#79!95?@$#100!96?@$#119!97?@$#112!98?@$#129!99?@$#164!100?@$#159!101?@$#163!102?@$#181!103?@$#172!104?@$#181!105?@$#172!106?@$#136!107?@$#165!108?@$#195!109?@$#173!110?@$#152!111?@$#107!112?@$#41!113?@$#30!114?@@$#43!116?@$#41!117?@$#54!118?@$#58!119?@$#47!120?@$#48!121?@$#54!122?@$#47!123?@$#66!124?@$#86!125?@$#99!126?@$#105!127?@$#135!128?@@$#195!130?@$#187!131?@$#176!132?@$#169!133?@$#193!134?@$#189!135?@$#218!136?@$#239!137?@$#243!138?@$#242!139?@$#217!140?@$#239!141?@$#251!142?@$#242!143?@$#251!144?@$#250!145?@$#232!146?@@$#222!148?@$#218!149?@$#215!150?@$#205!151?@$#202!152?@$#209!153?@$#196!154?@$#198!155?@$#179!156?@$#183!157?@$#192!158?@$#228!159?@$#240!160?@@$#213!162?@$#229!163?@$#213!164?@$#208!165?@$#200!166?@$#177!167?@$#207!168?@$#200!169?@$#181!170?@@$#200!172?@$#170!173?@$#164!174?@@$#158!176?@$#128!177?@$#124!178?@@$#141!180?@$#177!181?@$#207!182?@@$#208!184?@$#233!185?@$#241!186?@$#240!187?@$#228!188?@$#247!189?@$#229!190?@$#237!191?@$#241!192?@$#236!193?@$#244!194?@$#245!195?@$#247!196?@$#244!197?@$#235!198?@$#223!199?@$#242!200?@$#214!201?@$#195!202?@$#187!203?@$#204!204?@$#206!205?@$#239!206?@$#251!207?@$#254!208?@@$#250!210?@$#246!211?@$#253!212?@$#245!213?@$#249!214?@$#218!215?@$#223!216?@$#244!217?@$#220!218?@$#175!219?@$#216!220?@$#199!221?@$#173!222?@$#214!223?@@$#168!225?@$#173!226?@$#130!227?@$#111!228?@$#109!229?@$#169!230?@$#174!231?@$#199!232?@$#202!233?@$#214!234?@$#220!235?@$#223!236?@$#205!237?@$#220!238?@$#239!239?@$#214!240?@$#222!241?@$#239!242?@$#222!243?@$#243!244?@@$#242!246?@$#243!247?@@$#242!249?@$#239!250?@$#234!251?@$#239!252?@$#224!253?@$#231!254?@$#234!255?@$#222!256?@$#242!257?@$#231!258?@$#236!259?@$#244!260?@$#235!261?@$#231!262?@$#235!263?@@$#231!265?@$#236!266?@@$#5A$#18!1?A$#4!2?A$#18!3?A$#24!4?A$#11!5?A$#24!6?A$#18!7?A$#24!8?AA$#18!10?A$#24!11?AAA$#27!14?A$#24!15?A$#18!16?AA$#27!18?AA$#31!20?A$#30!21?A$#31!22?A$#30!23?A$#22!24?A$#27!25?A$#30!26?A$#18!27?A$#27!28?A$#18!29?A$#22!30?A$#18!31?A$#27!32?A$#11!33?A$#27!34?A$#19!35?A$#4!36?A$#11!37?AA$#4!39?A$#5!40?A$#4!41?A$#11!42?AA$#7!44?AA$#11!46?A$#21!47?A$#11!48?AA$#19!50?A$#5!51?A$#7!52?A$#11!53?AA$#14!55?A$#11!56?AAAAA$#5!61?A$#4!62?AAA$#11!65?A$#4!66?A$#5!67?A$#4!68?AA$#19!70?A$#21!71?A$#11!72?A$#22!73?A$#41!74?A$#34!75?A$#43!76?A$#37!77?A$#27!78?A$#38!79?A$#30!80?A$#22!81?AA$#27!83?A$#37!84?A$#21!85?A$#5!86?A$#30!87?A$#37!88?A$#19!89?A$#27!90?A$#34!91?A$#47!92?A$#79!93?AA$#90!95?A$#100!96?A$#114!97?A$#135!98?A$#179!99?A$#156!100?A$#164!101?A$#181!102?A$#163!103?A$#200!104?A$#135!105?A$#146!106?A$#125!107?A$#143!108?A$#176!109?A$#180!110?A$#150!111?A$#117!112?A$#110!113?A$#85!114?A$#67!115?A$#54!116?A$#48!117?A$#62!118?A$#47!119?AAA$#66!122?A$#99!123?A$#86!124?A$#88!125?A$#105!126?A$#110!127?AAA$#150!130?A$#157!131?A$#169!132?A$#165!133?A$#204!134?A$#216!135?AA$#232!137?A$#220!138?A$#242!139?AA$#251!141?AA$#242!143?AA$#239!145?A$#232!146?A$#220!147?A$#222!148?AA$#212!150?A$#187!151?A$#202!152?A$#212!153?A$#209!154?A$#167!155?A$#172!156?A$#210!157?A$#227!158?A$#208!159?A$#229!160?A$#198!161?A$#229!162?A$#207!163?A$#213!164?A$#208!165?A$#200!166?A$#208!167?AA$#200!169?AAAA$#208!173?A$#200!174?A$#161!175?A$#120!176?A$#113!177?AA$#122!179?A$#118!180?A$#128!181?A$#170!182?A$#200!183?A$#228!184?A$#233!185?A$#240!186?AA$#230!188?A$#248!189?A$#228!190?A$#213!191?A$#230!192?A$#240!193?A$#230!194?A$#236!195?A$#235!196?A$#247!197?A$#244!198?AA$#242!200?AA$#222!202?A$#205!203?A$#187!204?A$#220!205?A$#243!206?A$#251!207?A$#254!208?A$#251!209?A$#249!210?AA$#248!212?A$#236!213?A$#243!214?A$#202!215?A$#218!216?AA$#219!218?AA$#202!220?A$#214!221?A$#176!222?A$#175!223?A$#176!224?A$#204!225?A$#165!226?A$#123!227?A$#104!228?A$#131!229?A$#168!230?A$#157!231?A$#205!232?A$#193!233?A$#205!234?A$#204!235?AA$#219!237?A$#220!238?A$#221!239?A$#222!240?A$#239!241?A$#232!242?A$#222!243?A$#243!244?AA$#242!246?A$#250!247?A$#243!248?AA$#239!250?A$#232!251?A$#222!252?A$#231!253?AA$#242!255?AAA$#235!258?AA$#231!260?A$#235!261?A$#225!262?A$#231!263?AA$#236!265?AAA$#4C$#18!1?CCC$#24!4?C$#18!5?C$#24!6?CCC$#18!9?CC$#27!11?CC$#24!13?CCCC$#27!17?CCC$#31!20?C$#30!21?CC$#27!23?C$#30!24?C$#27!25?C$#18!26?C$#27!27?C$#18!28?C$#27!29?C$#22!30?CCC$#27!33?C$#18!34?CC$#19!36?C$#11!37?C$#4!38?C$#11!39?CCCC$#7!43?C$#11!44?C$#21!45?C$#11!46?C$#14!47?C$#11!48?C$#7!49?C$#14!50?C$#9!51?C$#14!52?C$#11!53?C$#5!54?C$#14!55?C$#11!56?CCCC$#4!60?C$#11!61?C$#4!62?C$#11!63?C$#4!64?CC$#11!66?C$#4!67?C$#19!68?C$#11!69?CCC$#21!72?C$#36!73?C$#18!74?C$#19!75?C$#22!76?C$#41!77?C$#93!78?C$#67!79?C$#41!80?C$#36!81?C$#53!82?C$#71!83?C$#50!84?C$#43!85?C$#47!86?C$#54!87?C$#30!88?C$#36!89?C$#40!90?C$#58!91?C$#89!92?CC$#85!94?C$#143!95?C$#125!96?C$#151!97?C$#135!98?C$#125!99?C$#159!100?C$#177!101?C$#162!102?C$#207!103?C$#164!104?C$#172!105?C$#179!106?C$#154!107?C$#165!108?C$#180!109?CC$#137!111?C$#154!112?C$#150!113?C$#103!114?C$#130!115?C$#110!116?C$#91!117?C$#98!118?C$#79!119?C$#47!120?C$#65!121?CCC$#85!124?C$#91!125?C$#99!126?C$#86!127?CC$#91!129?CC$#137!131?C$#117!132?CC$#148!134?CC$#219!136?C$#217!137?C$#243!138?C$#239!139?C$#251!140?CCC$#243!143?C$#239!144?C$#222!145?C$#220!146?C$#219!147?C$#224!148?C$#214!149?C$#157!150?C$#165!151?C$#195!152?C$#225!153?C$#212!154?C$#198!155?C$#179!156?C$#213!157?CC$#208!159?C$#229!160?C$#213!161?C$#228!162?C$#229!163?C$#213!164?CC$#229!166?C$#208!167?C$#229!168?C$#213!169?C$#200!170?C$#229!171?C$#170!172?C$#200!173?CC$#177!175?C$#158!176?C$#114!177?C$#141!178?C$#113!179?C$#128!180?CC$#170!182?C$#177!183?C$#208!184?C$#237!185?C$#247!186?C$#241!187?CCCC$#230!191?C$#228!192?C$#227!193?C$#240!194?C$#227!195?C$#225!196?C$#244!197?CC$#236!199?C$#231!200?CC$#218!202?C$#220!203?CC$#239!205?C$#250!206?C$#251!207?C$#254!208?C$#252!209?C$#251!210?C$#250!211?C$#231!212?C$#248!213?C$#246!214?CC$#214!216?C$#243!217?C$#223!218?C$#214!219?C$#195!220?C$#199!221?C$#168!222?C$#187!223?C$#176!224?C$#168!225?CC$#130!227?C$#70!228?C$#131!229?C$#147!230?C$#171!231?C$#216!232?C$#193!233?C$#199!234?C$#204!235?C$#218!236?C$#219!237?C$#220!238?C$#222!239?C$#223!240?C$#239!241?C$#243!242?C$#242!243?CCCC$#250!247?C$#243!248?CC$#239!250?C$#234!251?C$#232!252?C$#242!253?C$#234!254?CC$#242!256?CC$#243!258?C$#244!259?C$#236!260?C$#235!261?C$#231!262?C$#236!263?CCCCC$#11GG$#18!2?GG$#24!4?G$#27!5?G$#24!6?GG$#27!8?G$#24!9?GGGG$#18!13?GG$#24!15?GG$#27!17?G$#31!18?GG$#30!20?GG$#31!22?G$#30!23?GG$#22!25?GG$#27!27?GG$#22!29?G$#30!30?G$#27!31?G$#30!32?G$#24!33?G$#18!34?GG$#11!36?GG$#4!38?GG$#11!40?GG$#19!42?G$#7!43?G$#11!44?G$#4!45?G$#7!46?G$#12!47?G$#14!48?G$#12!49?G$#14!50?G$#12!51?G$#14!52?G$#5!53?G$#9!54?G$#11!55?GGGG$#19!59?G$#11!60?G$#5!61?G$#4!62?GG$#11!64?GG$#4!66?GG$#11!68?G$#19!69?G$#4!70?GG$#39!72?G$#43!73?G$#32!74?G$#39!75?G$#34!76?G$#41!77?G$#85!78?G$#67!79?G$#62!80?G$#40!81?G$#54!82?G$#74!83?G$#38!84?G$#67!85?G$#54!86?G$#62!87?G$#47!88?G$#54!89?G$#41!90?G$#59!91?G$#92!92?G$#61!93?G$#110!94?G$#100!95?G$#116!96?G$#115!97?G$#105!98?G$#163!99?G$#172!100?G$#144!101?G$#164!102?G$#163!103?G$#198!104?G$#192!105?G$#177!106?G$#183!107?G$#146!108?G$#154!109?GG$#153!111?G$#126!112?G$#165!113?G$#138!114?G$#137!115?G$#135!116?G$#126!117?G$#91!118?G$#86!119?G$#79!120?G$#91!121?G$#88!122?G$#99!123?G$#91!124?G$#65!125?G$#99!126?G$#65!127?GG$#99!129?G$#110!130?G$#130!131?G$#117!132?G$#54!133?G$#70!134?G$#111!135?G$#142!136?G$#220!137?G$#242!138?G$#252!139?G$#243!140?G$#242!141?G$#251!142?G$#243!143?G$#216!144?G$#220!145?G$#234!146?G$#221!147?G$#214!148?GG$#117!150?G$#157!151?G$#195!152?G$#219!153?G$#212!154?G$#227!155?G$#209!156?GG$#207!158?G$#210!159?G$#230!160?G$#208!161?G$#230!162?G$#233!163?G$#229!164?G$#213!165?G$#233!166?GG$#229!168?G$#208!169?G$#200!170?G$#207!171?G$#229!172?G$#207!173?G$#177!174?G$#208!175?G$#200!176?G$#155!177?G$#163!178?G$#158!179?G$#122!180?G$#141!181?G$#161!182?G$#177!183?G$#207!184?G$#229!185?GG$#233!187?G$#248!188?G$#240!189?G$#241!190?G$#213!191?G$#228!192?G$#213!193?G$#240!194?G$#241!195?G$#236!196?G$#247!197?GG$#224!199?G$#232!200?G$#243!201?GG$#222!203?GGG$#251!206?GG$#252!208?GGGG$#231!212?G$#249!213?G$#253!214?G$#232!215?G$#212!216?G$#219!217?G$#214!218?G$#202!219?G$#232!220?G$#195!221?G$#168!222?G$#205!223?G$#187!224?G$#157!225?GG$#130!227?G$#82!228?G$#131!229?G$#148!230?G$#187!231?G$#193!232?G$#205!233?G$#214!234?G$#215!235?G$#219!236?G$#215!237?G$#220!238?G$#219!239?G$#221!240?G$#220!241?G$#232!242?G$#250!243?G$#243!244?GG$#242!246?G$#251!247?G$#243!248?GG$#232!250?GGG$#231!253?G$#234!254?G$#239!255?G$#242!256?GG$#231!258?G$#235!259?GG$#244!261?G$#235!262?G$#244!263?G$#236!264?G$#235!265?G$#244!266?GG$#11OO$#18!2?O$#24!3?O$#18!4?O$#27!5?O$#24!6?O$#11!7?O$#27!8?O$#18!9?OOO$#27!12?O$#24!13?O$#27!14?OO$#22!16?O$#30!17?O$#27!18?O$#30!19?OO$#31!21?O$#27!22?O$#31!23?O$#27!24?O$#24!25?OO$#27!27?O$#22!28?O$#18!29?O$#22!30?OO$#24!32?O$#18!33?O$#11!34?O$#19!35?OO$#11!37?OOO$#4!40?O$#19!41?O$#11!42?OO$#1!44?O$#11!45?O$#1!46?O$#14!47?O$#12!48?OOO$#21!51?O$#11!52?OOOOO$#4!57?OO$#11!59?OOOO$#4!63?O$#11!64?OOOO$#19!68?OO$#21!70?O$#11!71?O$#38!72?O$#41!73?O$#37!74?O$#43!75?O$#46!76?O$#44!77?O$#47!78?O$#46!79?O$#41!80?OO$#47!82?O$#46!83?O$#41!84?O$#40!85?O$#54!86?O$#67!87?O$#56!88?O$#73!89?O$#54!90?O$#46!91?O$#41!92?O$#47!93?O$#65!94?O$#86!95?O$#105!96?O$#112!97?O$#119!98?O$#113!99?O$#129!100?O$#164!101?O$#163!102?O$#144!103?O$#172!104?OO$#177!106?O$#164!107?O$#139!108?O$#146!109?O$#143!110?O$#135!111?O$#125!112?O$#151!113?O$#143!114?O$#125!115?O$#110!116?O$#100!117?OO$#99!119?OO$#79!121?O$#86!122?OO$#88!124?O$#97!125?O$#90!126?O$#98!127?O$#102!128?O$#99!129?O$#58!130?O$#54!131?OO$#79!133?O$#41!134?O$#45!135?O$#104!136?O$#153!137?O$#204!138?O$#242!139?O$#251!140?OOO$#242!143?O$#239!144?OO$#224!146?O$#231!147?O$#212!148?O$#202!149?O$#157!150?O$#168!151?O$#166!152?O$#218!153?O$#212!154?OO$#209!156?O$#213!157?O$#200!158?O$#213!159?OO$#208!161?O$#240!162?O$#229!163?OO$#237!165?O$#241!166?O$#240!167?O$#230!168?O$#229!169?O$#238!170?O$#229!171?OO$#237!173?O$#207!174?OO$#181!176?O$#177!177?O$#162!178?O$#133!179?O$#128!180?OO$#161!182?OO$#207!184?O$#229!185?O$#233!186?O$#229!187?OO$#233!189?O$#240!190?O$#230!191?O$#229!192?O$#230!193?O$#246!194?O$#249!195?O$#250!196?OO$#244!198?O$#224!199?O$#235!200?O$#232!201?O$#231!202?O$#214!203?O$#215!204?O$#219!205?O$#239!206?O$#242!207?O$#244!208?O$#249!209?OO$#251!211?O$#232!212?O$#243!213?O$#247!214?O$#231!215?O$#224!216?O$#195!217?O$#176!218?O$#195!219?O$#215!220?O$#205!221?O$#168!222?O$#205!223?O$#194!224?O$#169!225?O$#168!226?O$#123!227?O$#77!228?O$#131!229?O$#157!230?O$#204!231?O$#175!232?O$#205!233?O$#199!234?O$#216!235?O$#219!236?O$#215!237?O$#219!238?O$#204!239?O$#218!240?O$#239!241?OO$#243!243?OOOO$#250!247?O$#242!248?O$#239!249?O$#232!250?O$#239!251?O$#232!252?O$#231!253?OO$#239!255?O$#242!256?OO$#235!258?O$#244!259?O$#235!260?O$#244!261?OO$#235!263?O$#236!264?O$#244!265?O$#231!266?O$#245!267?O$#19_$#4!1?_$#18!2?_$#24!3?_$#18!4?_$#24!5?___$#18!8?__$#24!10?___$#27!13?_$#18!14?_$#27!15?_$#22!16?_$#30!17?_$#31!18?_$#30!19?_$#27!20?_$#32!21?_$#27!22?__$#24!24?_$#27!25?_$#24!26?___$#11!29?_$#30!30?_$#24!31?__$#11!33?_$#19!34?___$#11!37?______$#7!43?_$#5!44?_$#7!45?_$#5!46?_$#12!47?_$#14!48?__$#5!50?_$#12!51?_$#11!52?_$#1!53?_$#11!54?__$#4!56?_$#11!57?____$#4!61?_$#5!62?_$#11!63?_$#4!64?_$#11!65?_____$#30!70?_$#36!71?_$#42!72?_$#38!73?_$#43!74?_$#41!75?____$#58!79?_$#54!80?_$#38!81?_$#56!82?_$#19!83?__$#38!85?_$#47!86?_$#41!87?_$#48!88?_$#54!89?_$#73!90?_$#54!91?_$#47!92?_$#40!93?_$#41!94?_$#58!95?_$#65!96?_$#59!97?_$#97!98?_$#114!99?_$#133!100?_$#108!101?_$#133!102?_$#163!103?_$#164!104?_$#183!105?_$#200!106?_$#162!107?_$#170!108?_$#141!109?_$#145!110?_$#139!111?_$#120!112?__$#119!114?_$#114!115?_$#110!116?_$#102!117?_$#100!118?_$#90!119?_$#99!120?_$#86!121?_$#88!122?_$#98!123?_$#90!124?_$#86!125?__$#61!127?_$#99!128?_$#66!129?_$#48!130?_$#47!131?_$#86!132?_$#90!133?_$#116!134?_$#42!135?_$#68!136?_$#79!137?_$#202!138?_$#239!139?_$#243!140?_$#251!141?_$#242!142?_$#239!143?_$#218!144?_$#222!145?_$#231!146?_$#212!147?__$#157!149?_$#180!150?_$#212!151?_$#224!152?_$#234!153?_$#218!154?__$#213!156?__$#210!158?_$#229!159?_$#213!160?_$#229!161?_$#238!162?_$#233!163?_$#230!164?_$#240!165?_$#238!166?_$#240!167?_$#241!168?_$#248!169?_$#240!170?_$#241!171?_$#229!172?_$#208!173?_$#228!174?_$#207!175?_$#162!176?_$#160!177?_$#161!178?_$#158!179?_$#118!180?_$#141!181?__$#161!183?_$#208!184?_$#200!185?_$#238!186?_$#237!187?_$#241!188?_$#246!189?_$#248!190?_$#230!191?_$#248!192?_$#241!193?____$#244!197?_$#235!198?_$#244!199?_$#231!200?_$#234!201?_$#242!202?_$#222!203?__$#232!205?_$#231!206?_$#235!207?_$#226!208?_$#235!209?_$#250!210?_$#243!211?_$#249!212?_$#243!213?_$#235!214?_$#231!215?_$#239!216?_$#205!217?_$#222!218?_$#202!219?_$#221!220?_$#199!221?_$#187!222?_$#168!223?__$#175!225?_$#202!226?_$#142!227?_$#71!228?_$#131!229?_$#185!230?_$#216!231?_$#205!232?_$#176!233?_$#202!234?_$#217!235?_$#216!236?_$#217!237?_$#220!238?_$#232!239?_$#221!240?_$#239!241?__$#242!243?_$#239!244?_$#242!245?___$#239!248?_$#234!249?_$#232!250?_$#239!251?_$#242!252?_$#234!253?_$#232!254?_$#242!255?_$#239!256?_$#236!257?_$#235!258?_$#236!259?_$#244!260?___$#236!263?_$#235!264?_$#244!265?___$-#11@$#18!1?@@$#24!3?@$#22!4?@$#18!5?@@$#24!7?@$#18!8?@@$#24!10?@@$#27!12?@$#24!13?@@$#22!15?@@$#36!17?@$#27!18?@$#31!19?@$#34!20?@@$#27!22?@$#30!23?@$#27!24?@@$#24!26?@$#18!27?@$#27!28?@$#24!29?@@@$#18!32?@@$#11!34?@@@$#19!37?@@$#11!39?@@@$#7!42?@$#11!43?@@$#14!45?@$#12!46?@$#7!47?@@$#11!49?@$#5!50?@$#12!51?@$#14!52?@$#7!53?@$#11!54?@@$#19!56?@$#4!57?@$#11!58?@$#4!59?@@$#5!61?@$#4!62?@$#11!63?@@@$#18!66?@$#11!67?@$#19!68?@$#7!69?@$#21!70?@$#36!71?@$#47!72?@$#18!73?@$#36!74?@$#11!75?@$#47!76?@$#72!77?@$#79!78?@$#62!79?@$#30!80?@$#36!81?@$#30!82?@$#37!83?@$#30!84?@$#22!85?@$#42!86?@$#54!87?@$#41!88?@$#40!89?@$#56!90?@$#84!91?@$#58!92?@$#73!93?@$#79!94?@$#54!95?@$#58!96?@$#90!97?@$#65!98?@$#97!99?@$#90!100?@$#113!101?@$#139!102?@$#170!103?@$#200!104?@$#155!105?@$#177!106?@$#181!107?@$#161!108?@$#158!109?@$#128!110?@$#114!111?@$#121!112?@$#133!113?@@$#119!115?@$#97!116?@$#102!117?@@$#90!119?@@$#88!121?@$#65!122?@@@$#60!125?@$#79!126?@$#92!127?@$#85!128?@$#54!129?@@$#47!131?@$#90!132?@$#97!133?@$#112!134?@$#37!135?@$#62!136?@$#83!137?@$#137!138?@$#205!139?@$#223!140?@$#239!141?@$#252!142?@$#243!143?@$#224!144?@$#215!145?@$#211!146?@$#212!147?@@$#157!149?@$#180!150?@$#195!151?@$#225!152?@$#244!153?@$#214!154?@$#226!155?@$#227!156?@$#210!157?@$#230!158?@$#228!159?@@$#238!161?@$#229!162?@$#240!163?@@@$#238!166?@$#241!167?@@@@$#233!171?@$#237!172?@$#229!173?@$#210!174?@$#208!175?@$#198!176?@$#210!177?@$#179!178?@$#113!179?@$#120!180?@$#124!181?@$#141!182?@$#170!183?@$#200!184?@$#213!185?@$#229!186?@$#233!187?@$#248!188?@$#247!189?@$#241!190?@@@@$#237!194?@$#241!195?@$#250!196?@$#249!197?@$#244!198?@$#231!199?@$#235!200?@@$#239!202?@$#243!203?@$#221!204?@$#218!205?@$#226!206?@@$#227!208?@$#230!209?@$#236!210?@$#231!211?@$#244!212?@$#242!213?@$#223!214?@$#215!215?@$#249!216?@$#195!217?@$#216!218?@$#212!219?@$#221!220?@$#219!221?@$#231!222?@$#202!223?@$#199!224?@$#193!225?@$#168!226?@$#142!227?@$#94!228?@$#131!229?@$#171!230?@$#205!231?@$#193!232?@$#187!233?@$#204!234?@$#205!235?@$#214!236?@$#232!237?@$#220!238?@@$#221!240?@$#220!241?@$#222!242?@$#239!243?@@$#234!245?@$#239!246?@$#232!247?@$#234!248?@$#232!249?@$#239!250?@$#242!251?@$#231!252?@@$#232!254?@$#239!255?@$#242!256?@$#244!257?@$#236!258?@@$#244!260?@@$#236!262?@$#244!263?@@@@$#246!267?@$#11AA$#18!2?A$#22!3?A$#11!4?A$#24!5?A$#18!6?AA$#27!8?A$#18!9?AA$#24!11?A$#18!12?AA$#27!14?AA$#30!16?A$#27!17?A$#31!18?A$#32!19?AA$#23!21?A$#31!22?A$#22!23?A$#27!24?A$#18!25?A$#24!26?AA$#27!28?A$#24!29?AAAA$#18!33?A$#19!34?A$#5!35?AA$#4!37?AA$#7!39?AA$#4!41?A$#11!42?AA$#4!44?A$#11!45?A$#7!46?AA$#21!48?A$#11!49?A$#19!50?A$#12!51?A$#21!52?A$#11!53?AAAA$#4!57?A$#11!58?A$#19!59?A$#4!60?A$#11!61?A$#4!62?AAA$#11!65?A$#18!66?A$#4!67?A$#19!68?AA$#11!70?A$#4!71?A$#21!72?A$#40!73?A$#41!74?A$#45!75?A$#47!76?A$#37!77?A$#48!78?A$#46!79?A$#21!80?A$#27!81?A$#30!82?A$#36!83?A$#37!84?A$#46!85?A$#38!86?A$#34!87?A$#56!88?A$#71!89?A$#84!90?A$#103!91?A$#92!92?A$#130!93?A$#92!94?A$#59!95?A$#99!96?A$#59!97?A$#105!98?A$#97!99?A$#121!100?AA$#145!102?AA$#181!104?A$#177!105?A$#170!106?AA$#164!108?AA$#158!110?A$#145!111?A$#129!112?A$#145!113?A$#119!114?A$#129!115?A$#115!116?A$#112!117?A$#97!118?A$#110!119?A$#99!120?AA$#60!122?A$#61!123?A$#58!124?A$#59!125?A$#60!126?A$#61!127?A$#60!128?A$#79!129?A$#54!130?AA$#97!132?AA$#113!134?A$#60!135?A$#74!136?A$#65!137?A$#117!138?A$#153!139?A$#212!140?A$#222!141?A$#249!142?A$#236!143?A$#212!144?A$#225!145?A$#167!146?A$#211!147?A$#205!148?A$#176!149?A$#212!150?AA$#218!152?A$#231!153?A$#243!154?A$#219!155?A$#227!156?AA$#213!158?A$#229!159?A$#233!160?AA$#238!162?A$#229!163?A$#238!164?A$#233!165?A$#240!166?A$#248!167?A$#247!168?A$#241!169?AAAA$#229!173?AA$#228!175?A$#227!176?A$#179!177?A$#182!178?A$#164!179?A$#121!180?A$#118!181?A$#128!182?A$#161!183?A$#181!184?A$#208!185?A$#238!186?A$#241!187?A$#233!188?A$#238!189?A$#240!190?A$#247!191?A$#241!192?A$#249!193?A$#248!194?A$#247!195?A$#248!196?A$#241!197?A$#247!198?A$#231!199?A$#236!200?A$#231!201?A$#234!202?A$#239!203?A$#232!204?A$#202!205?A$#225!206?A$#209!207?AA$#192!209?A$#213!210?A$#209!211?A$#236!212?A$#225!213?A$#231!214?A$#214!215?A$#231!216?A$#180!217?A$#221!218?A$#195!219?A$#205!220?A$#219!221?A$#212!222?A$#165!223?A$#187!224?A$#176!225?A$#169!226?A$#142!227?A$#109!228?A$#131!229?A$#157!230?A$#171!231?A$#204!232?A$#187!233?A$#188!234?A$#219!235?AA$#222!237?A$#232!238?AA$#220!240?AA$#239!242?AAA$#232!245?AAA$#222!248?A$#232!249?A$#239!250?A$#232!251?A$#222!252?A$#231!253?A$#239!254?A$#242!255?A$#244!256?A$#226!257?A$#235!258?A$#242!259?A$#235!260?AA$#244!262?A$#236!263?AA$#246!265?A$#247!266?AA$#11CC$#22!2?C$#27!3?C$#22!4?C$#24!5?CC$#18!7?CC$#24!9?C$#27!10?C$#18!11?C$#27!12?CC$#11!14?C$#32!15?C$#27!16?C$#31!17?CCC$#36!20?C$#30!21?CC$#27!23?C$#24!24?C$#27!25?CC$#24!27?CC$#18!29?C$#24!30?CC$#19!32?C$#21!33?C$#11!34?CCC$#7!37?CCC$#5!40?C$#7!41?C$#4!42?CC$#11!44?CC$#7!46?CC$#21!48?C$#11!49?CC$#7!51?CCCC$#4!55?C$#11!56?CCCC$#5!60?C$#4!61?CCCC$#11!65?C$#4!66?CC$#11!68?C$#19!69?CC$#39!71?C$#22!72?C$#41!73?C$#40!74?C$#47!75?C$#54!76?C$#58!77?C$#41!78?C$#37!79?C$#22!80?C$#38!81?C$#41!82?C$#22!83?C$#41!84?C$#37!85?C$#43!86?C$#22!87?C$#41!88?C$#95!89?C$#58!90?C$#47!91?C$#81!92?C$#117!93?C$#86!94?C$#99!95?C$#112!96?C$#87!97?C$#97!98?C$#129!99?C$#141!100?C$#90!101?C$#164!102?C$#170!103?C$#200!104?CC$#170!106?C$#145!107?C$#164!108?C$#155!109?C$#160!110?C$#139!111?C$#118!112?C$#145!113?C$#139!114?C$#120!115?C$#105!116?C$#112!117?C$#97!118?C$#65!119?CC$#60!121?C$#61!122?C$#59!123?C$#60!124?C$#65!125?C$#61!126?C$#60!127?C$#79!128?C$#92!129?C$#67!130?C$#56!131?C$#97!132?C$#114!133?C$#118!134?CC$#88!136?C$#58!137?C$#86!138?C$#65!139?C$#165!140?C$#212!141?C$#236!142?C$#218!143?C$#195!144?C$#196!145?C$#192!146?C$#180!147?C$#166!148?C$#199!149?C$#218!150?C$#224!151?CC$#225!153?C$#224!154?C$#231!155?C$#225!156?C$#226!157?C$#230!158?C$#229!159?C$#233!160?C$#229!161?C$#238!162?C$#240!163?C$#233!164?C$#240!165?CC$#241!167?C$#248!168?C$#246!169?CC$#240!171?CC$#248!173?C$#247!174?C$#241!175?C$#227!176?C$#209!177?C$#181!178?CC$#158!180?C$#113!181?C$#128!182?C$#161!183?C$#177!184?C$#207!185?C$#233!186?C$#240!187?CC$#247!189?C$#237!190?C$#241!191?C$#248!192?C$#240!193?C$#237!194?C$#246!195?C$#241!196?C$#227!197?CC$#209!199?C$#225!200?C$#236!201?C$#231!202?C$#215!203?C$#221!204?C$#222!205?C$#214!206?C$#196!207?C$#182!208?C$#196!209?C$#182!210?CC$#196!212?C$#227!213?C$#211!214?C$#205!215?C$#199!216?C$#205!217?C$#215!218?C$#199!219?C$#231!220?C$#224!221?C$#214!222?C$#202!223?C$#195!224?C$#174!225?C$#188!226?C$#187!227?C$#142!228?CC$#169!230?C$#187!231?C$#194!232?C$#187!233?CC$#218!235?C$#221!236?CC$#222!238?C$#221!239?C$#222!240?C$#220!241?C$#232!242?C$#222!243?C$#234!244?C$#232!245?CC$#224!247?C$#222!248?C$#232!249?C$#239!250?C$#234!251?CC$#239!253?C$#242!254?CC$#244!256?C$#234!257?C$#244!258?CCCC$#246!262?C$#244!263?CCC$#247!266?CC$#18G$#11!1?GG$#18!3?GG$#27!5?GG$#24!7?GGGGG$#11!12?G$#18!13?G$#24!14?G$#32!15?G$#22!16?G$#30!17?G$#27!18?G$#30!19?G$#31!20?G$#30!21?GG$#36!23?G$#27!24?G$#19!25?G$#21!26?G$#27!27?G$#24!28?GGG$#4!31?G$#24!32?G$#19!33?G$#11!34?GG$#4!36?G$#11!37?G$#7!38?GG$#4!40?G$#7!41?GGGGG$#11!46?G$#12!47?G$#14!48?G$#11!49?G$#7!50?GG$#21!52?G$#5!53?G$#11!54?G$#19!55?G$#4!56?G$#11!57?G$#4!58?GGG$#5!61?G$#4!62?GGG$#5!65?G$#11!66?GGG$#37!69?G$#39!70?G$#32!71?G$#20!72?G$#43!73?G$#30!74?G$#27!75?G$#30!76?G$#4!77?G$#37!78?G$#39!79?G$#37!80?G$#47!81?G$#41!82?G$#40!83?G$#38!84?G$#40!85?G$#41!86?G$#47!87?G$#43!88?G$#31!89?G$#50!90?G$#74!91?G$#94!92?G$#67!93?G$#54!94?G$#58!95?G$#108!96?G$#90!97?G$#133!98?G$#125!99?G$#114!100?G$#115!101?G$#125!102?G$#164!103?G$#162!104?G$#124!105?G$#170!106?G$#161!107?GG$#158!109?G$#121!110?G$#120!111?G$#122!112?G$#120!113?G$#97!114?G$#105!115?G$#112!116?GG$#88!118?G$#86!119?GG$#65!121?G$#61!122?G$#65!123?G$#60!124?G$#65!125?GG$#86!127?G$#90!128?G$#88!129?G$#92!130?G$#58!131?G$#102!132?G$#118!133?G$#124!134?GGGGG$#115!139?G$#86!140?G$#182!141?G$#192!142?G$#209!143?GG$#192!145?G$#212!146?G$#130!147?G$#187!148?G$#205!149?G$#224!150?G$#218!151?G$#224!152?G$#231!153?G$#244!154?G$#231!155?G$#224!156?G$#226!157?G$#230!158?GG$#238!160?GG$#229!162?G$#233!163?G$#237!164?G$#240!165?G$#248!166?GGG$#249!169?GG$#246!171?G$#241!172?G$#247!173?GG$#230!175?G$#233!176?G$#227!177?G$#179!178?G$#146!179?G$#145!180?G$#133!181?G$#122!182?G$#158!183?G$#170!184?G$#208!185?G$#238!186?G$#229!187?G$#240!188?G$#248!189?GGG$#238!192?G$#233!193?G$#247!194?G$#241!195?GG$#244!197?G$#246!198?G$#231!199?G$#235!200?G$#234!201?G$#243!202?G$#232!203?G$#234!204?G$#220!205?G$#204!206?G$#202!207?G$#180!208?G$#209!209?G$#182!210?G$#211!211?G$#231!212?G$#196!213?G$#211!214?GG$#199!216?G$#212!217?G$#205!218?G$#202!219?GG$#195!221?G$#205!222?GG$#220!224?GG$#217!226?G$#220!227?G$#174!228?G$#157!229?G$#171!230?G$#175!231?G$#204!232?GGG$#218!235?G$#219!236?GG$#222!238?G$#219!239?G$#220!240?GGG$#232!243?G$#222!244?G$#232!245?GGGG$#239!249?GG$#234!251?GG$#242!253?G$#234!254?G$#242!255?G$#243!256?G$#236!257?G$#235!258?G$#246!259?G$#247!260?GG$#244!262?GG$#246!264?GG$#247!266?GG$#11O$#18!1?O$#11!2?O$#18!3?O$#24!4?O$#11!5?O$#18!6?O$#11!7?O$#18!8?OO$#11!10?O$#27!11?O$#24!12?O$#18!13?O$#27!14?OO$#30!16?O$#31!17?O$#32!18?O$#23!19?O$#31!20?O$#36!21?O$#27!22?OO$#24!24?O$#22!25?O$#30!26?O$#24!27?OO$#18!29?OOOOO$#11!34?OOO$#7!37?OOOOOO$#11!43?O$#7!44?O$#1!45?OO$#12!47?O$#11!48?O$#7!49?O$#19!50?O$#21!51?O$#11!52?O$#7!53?O$#21!54?O$#7!55?O$#11!56?O$#4!57?O$#11!58?O$#4!59?OOOOOOO$#11!66?O$#19!67?O$#27!68?O$#31!69?O$#36!70?O$#27!71?O$#4!72?O$#30!73?O$#11!74?O$#27!75?O$#19!76?O$#56!77?O$#36!78?O$#42!79?O$#38!80?O$#47!81?O$#56!82?O$#36!83?O$#30!84?O$#41!85?O$#48!86?O$#54!87?O$#46!88?O$#41!89?O$#45!90?O$#48!91?O$#46!92?O$#47!93?O$#56!94?O$#79!95?O$#59!96?O$#99!97?O$#86!98?O$#65!99?O$#86!100?O$#115!101?O$#90!102?O$#129!103?O$#121!104?OO$#129!106?O$#120!107?O$#108!108?O$#121!109?OO$#90!111?O$#113!112?OO$#90!114?OOOO$#87!118?O$#86!119?OO$#65!121?O$#79!122?OO$#88!124?O$#65!125?O$#87!126?OO$#97!128?O$#90!129?OO$#86!131?O$#102!132?O$#124!133?O$#128!134?OO$#124!136?O$#141!137?O$#128!138?O$#118!139?O$#115!140?O$#111!141?O$#195!142?O$#196!143?O$#167!144?O$#180!145?O$#123!146?O$#142!147?O$#195!148?O$#212!149?O$#221!150?O$#222!151?O$#235!152?OO$#225!154?O$#236!155?O$#231!156?O$#235!157?O$#241!158?O$#240!159?O$#233!160?O$#240!161?OOOO$#241!165?O$#247!166?O$#248!167?OO$#246!169?O$#248!170?O$#247!171?O$#248!172?O$#249!173?O$#248!174?O$#247!175?O$#241!176?O$#227!177?O$#213!178?O$#179!179?O$#177!180?O$#139!181?O$#141!182?O$#161!183?O$#170!184?O$#181!185?O$#229!186?O$#237!187?O$#240!188?O$#248!189?OO$#241!191?OO$#248!193?O$#249!194?O$#253!195?O$#241!196?O$#246!197?O$#248!198?O$#247!199?OO$#243!201?OOO$#242!204?O$#239!205?O$#205!206?O$#195!207?O$#180!208?O$#196!209?O$#182!210?OO$#196!212?O$#165!213?O$#182!214?O$#209!215?O$#202!216?O$#221!217?O$#202!218?O$#212!219?O$#205!220?O$#214!221?O$#205!222?O$#199!223?O$#216!224?O$#188!225?O$#187!226?O$#203!227?O$#189!228?O$#178!229?O$#175!230?O$#184!231?O$#175!232?O$#193!233?O$#201!234?O$#218!235?O$#215!236?O$#197!237?O$#194!238?O$#216!239?O$#220!240?OOO$#222!243?OOOO$#232!247?OO$#234!249?O$#239!250?O$#234!251?O$#224!252?O$#232!253?O$#242!254?OOO$#243!257?O$#244!258?O$#243!259?O$#246!260?O$#244!261?O$#241!262?O$#236!263?O$#246!264?O$#244!265?O$#247!266?OO$#11__$#18!2?__$#24!4?_$#11!5?_$#18!6?_$#11!7?_$#24!8?_$#18!9?_$#24!10?__$#18!12?_$#27!13?___$#23!16?_$#27!17?_$#31!18?____$#22!22?_$#30!23?_$#22!24?_$#27!25?_$#24!26?_$#4!27?_$#24!28?_$#27!29?_$#11!30?_$#18!31?_$#24!32?_$#18!33?_$#11!34?__$#7!36?__$#11!38?_$#7!39?___$#11!42?_$#7!43?__$#11!45?_$#12!46?_$#7!47?_$#11!48?__$#4!50?_$#11!51?___$#1!54?_$#7!55?__$#11!57?___$#4!60?__$#5!62?__$#4!64?___$#27!67?_$#22!68?_$#39!69?_$#30!70?_$#4!71?_$#36!72?_$#51!73?_$#37!74?_$#27!75?_$#30!76?_$#45!77?_$#40!78?_$#56!79?_$#62!80?_$#47!81?_$#41!82?_$#43!83?_$#37!84?__$#39!86?_$#27!87?__$#38!89?_$#41!90?_$#44!91?_$#43!92?_$#46!93?_$#37!94?_$#47!95?__$#41!97?_$#45!98?_$#47!99?_$#58!100?_$#90!101?_$#99!102?_$#100!103?_$#60!104?_$#115!105?_$#114!106?_$#97!107?__$#108!109?_$#115!110?_$#144!111?_$#125!112?_$#115!113?_$#97!114?__$#90!116?_$#86!117?_$#60!118?_$#65!119?_$#86!120?__$#97!122?_$#87!123?_$#88!124?_____$#86!129?_$#99!130?_$#65!131?_$#102!132?_$#128!133?_$#124!134?___$#113!137?__$#119!139?__$#92!141?_$#149!142?_$#166!143?_$#165!144?_$#111!145?_$#82!146?_$#107!147?_$#204!148?_$#195!149?_$#215!150?_$#234!151?_$#247!152?_$#236!153?__$#231!155?__$#235!157?_$#236!158?_$#240!159?_$#241!160?__$#240!162?_$#241!163?_$#248!164?_____$#250!169?_$#247!170?_$#248!171?__$#246!173?_$#247!174?_$#244!175?_$#241!176?__$#227!178?_$#192!179?_$#146!180?_$#139!181?_$#158!182?_$#161!183?_$#170!184?_$#208!185?_$#213!186?__$#229!188?_$#240!189?_$#248!190?____$#250!194?__$#249!196?_$#244!197?_$#245!198?_$#247!199?_$#249!200?_$#244!201?_$#236!202?_$#231!203?_$#232!204?_$#222!205?_$#204!206?_$#195!207?_$#225!208?_$#226!209?_$#227!210?_$#209!211?_$#192!212?_$#196!213?_$#212!214?_$#225!215?_$#202!216?_$#199!217?_$#205!218?_$#221!219?_$#199!220?_$#215!221?_$#195!222?_$#176!223?_$#216!224?_$#220!225?__$#216!227?_$#232!228?_$#186!229?_$#131!230?_$#109!231?_$#169!232?_$#184!233?_$#203!234?_$#191!235?_$#175!236?_$#186!237?_$#188!238?_$#206!239?_$#217!240?_$#239!241?_$#232!242?_$#220!243?_$#232!244?__$#222!246?_$#218!247?_$#222!248?__$#234!250?___$#242!253?_$#239!254?_$#242!255?_$#235!256?_$#236!257?_$#244!258?_$#243!259?_$#246!260?_$#244!261?_$#241!262?__$#244!264?_$#249!265?_$#243!266?_$#249!267?_$-#7@$#24!1?@$#18!2?@$#24!3?@$#18!4?@@@$#24!7?@$#11!8?@$#24!9?@$#18!10?@$#24!11?@$#11!12?@$#18!13?@@$#27!15?@$#32!16?@$#34!17?@@@@$#30!21?@$#27!22?@$#31!23?@$#27!24?@@$#22!26?@$#24!27?@@@$#11!30?@$#18!31?@$#19!32?@$#11!33?@@$#4!35?@$#1!36?@$#7!37?@@$#4!39?@$#11!40?@$#7!41?@$#11!42?@@$#7!44?@@$#12!46?@$#11!47?@$#14!48?@$#7!49?@$#11!50?@$#4!51?@$#11!52?@$#7!53?@$#12!54?@$#11!55?@$#5!56?@$#11!57?@$#7!58?@$#4!59?@$#5!60?@$#4!61?@$#5!62?@@$#4!64?@@$#11!66?@$#22!67?@$#11!68?@$#37!69?@@$#22!71?@$#36!72?@$#31!73?@$#30!74?@$#23!75?@$#11!76?@$#38!77?@$#40!78?@$#27!79?@$#5!80?@$#9!81?@$#31!82?@$#30!83?@$#40!84?@$#42!85?@$#38!86?@$#67!87?@$#47!88?@$#41!89?@$#54!90?@@$#107!92?@$#58!93?@$#66!94?@$#58!95?@$#65!96?@$#73!97?@$#41!98?@$#99!99?@$#60!100?@$#133!101?@$#119!102?@$#163!103?@$#90!104?@$#87!105?@$#144!106?@$#120!107?@$#141!108?@$#144!109?@$#119!110?@$#133!111?@$#120!112?@$#114!113?@$#113!114?@$#87!115?@$#90!116?@$#97!117?@$#90!118?@$#97!119?@$#65!120?@$#88!121?@$#98!122?@$#87!123?@@@@$#65!127?@$#88!128?@$#86!129?@@$#88!131?@$#118!132?@@@$#124!135?@$#128!136?@$#141!137?@$#124!138?@@$#119!140?@$#83!141?@$#104!142?@$#117!143?@$#103!144?@$#83!145?@$#77!146?@$#166!147?@$#204!148?@$#218!149?@$#219!150?@$#239!151?@$#234!152?@$#236!153?@@$#225!155?@$#226!156?@$#231!157?@$#236!158?@$#241!159?@$#246!160?@$#241!161?@$#247!162?@$#241!163?@$#240!164?@$#248!165?@$#247!166?@@@$#248!169?@$#249!170?@@$#247!172?@$#250!173?@$#245!174?@$#246!175?@$#236!176?@$#227!177?@$#192!178?@$#183!179?@$#156!180?@$#158!181?@$#141!182?@$#170!183?@@$#181!185?@$#229!186?@@$#238!188?@$#240!189?@$#248!190?@@@@$#247!194?@$#248!195?@$#251!196?@$#249!197?@$#247!198?@$#236!199?@$#225!200?@$#231!201?@$#245!202?@$#235!203?@$#239!204?@@$#202!206?@$#176!207?@$#180!208?@$#211!209?@$#196!210?@@$#182!212?@$#226!213?@$#195!214?@$#225!215?@$#215!216?@$#214!217?@$#218!218?@$#214!219?@$#176!220?@$#173!221?@$#195!222?@$#202!223?@$#217!224?@$#203!225?@$#169!226?@$#203!227?@$#220!228?@$#131!229?@$#109!230?@$#131!231?@$#109!232?@$#131!233?@$#169!234?@@$#175!236?@$#174!237?@$#188!238?@$#216!239?@$#203!240?@$#216!241?@$#232!242?@@$#220!244?@@$#222!246?@$#218!247?@$#219!248?@$#222!249?@$#219!250?@$#232!251?@@$#239!253?@$#242!254?@@$#244!256?@$#235!257?@$#242!258?@$#243!259?@$#246!260?@$#244!261?@@@$#246!264?@$#247!265?@$#244!266?@$#235!267?@$#11A$#18!1?A$#11!2?AA$#18!4?AAAA$#27!8?A$#24!9?A$#18!10?A$#24!11?A$#11!12?A$#24!13?A$#27!14?AA$#30!16?A$#31!17?A$#34!18?A$#31!19?A$#30!20?A$#27!21?A$#30!22?A$#36!23?A$#30!24?A$#36!25?A$#27!26?A$#24!27?A$#27!28?A$#11!29?A$#27!30?A$#11!31?A$#21!32?A$#19!33?A$#11!34?A$#4!35?A$#1!36?A$#7!37?AA$#5!39?A$#7!40?AAAA$#11!44?A$#7!45?A$#11!46?A$#14!47?AA$#11!49?AA$#4!51?A$#7!52?A$#5!53?A$#11!54?A$#19!55?A$#21!56?A$#4!57?AAA$#1!60?A$#4!61?A$#5!62?A$#4!63?A$#11!64?A$#5!65?A$#19!66?A$#27!67?A$#30!68?A$#37!69?AA$#27!71?A$#11!72?A$#30!73?A$#27!74?A$#36!75?A$#22!76?AA$#14!78?A$#39!79?AA$#37!81?AA$#53!83?A$#41!84?A$#44!85?A$#47!86?A$#66!87?A$#56!88?A$#41!89?A$#47!90?A$#65!91?A$#103!92?AA$#92!94?A$#116!95?A$#125!96?A$#99!97?A$#65!98?A$#54!99?A$#99!100?A$#208!101?A$#108!102?AA$#133!104?A$#163!105?A$#144!106?AA$#159!108?A$#108!109?A$#146!110?A$#113!111?A$#139!112?A$#113!113?A$#97!114?A$#120!115?A$#112!116?A$#97!117?AA$#87!119?A$#88!120?A$#90!121?A$#79!122?A$#86!123?A$#87!124?A$#86!125?A$#65!126?AA$#86!128?AA$#67!130?A$#86!131?A$#118!132?A$#124!133?A$#128!134?A$#124!135?AA$#141!137?AA$#118!139?A$#119!140?A$#92!141?A$#176!142?A$#180!143?A$#165!144?A$#148!145?A$#83!146?A$#165!147?A$#216!148?A$#219!149?A$#239!150?A$#224!151?A$#235!152?A$#226!153?A$#230!154?A$#226!155?A$#225!156?A$#224!157?A$#235!158?A$#244!159?A$#241!160?A$#247!161?AA$#240!163?A$#237!164?A$#241!165?A$#245!166?A$#248!167?A$#250!168?AAA$#249!171?A$#250!172?AA$#247!174?AA$#248!176?A$#225!177?A$#227!178?A$#198!179?A$#163!180?A$#145!181?A$#124!182?A$#158!183?A$#161!184?A$#207!185?A$#238!186?AA$#237!188?A$#248!189?A$#250!190?AA$#248!192?AA$#253!194?A$#248!195?A$#250!196?A$#249!197?A$#248!198?A$#241!199?A$#236!200?AA$#249!202?A$#243!203?A$#224!204?A$#180!205?A$#153!206?A$#165!207?A$#195!208?A$#211!209?A$#212!210?A$#225!211?A$#212!212?A$#196!213?A$#211!214?A$#231!215?A$#224!216?A$#212!217?A$#195!218?A$#173!219?A$#176!220?A$#166!221?A$#165!222?A$#184!223?A$#189!224?A$#109!225?A$#220!226?AA$#186!228?A$#191!229?A$#203!230?A$#171!231?A$#147!232?A$#95!233?A$#131!234?A$#171!235?A$#184!236?A$#191!237?A$#216!238?A$#217!239?A$#220!240?AAA$#217!243?A$#220!244?A$#232!245?A$#220!246?AAA$#222!249?A$#220!250?A$#219!251?A$#221!252?A$#231!253?A$#234!254?A$#242!255?A$#244!256?A$#236!257?A$#243!258?AA$#247!260?A$#236!261?AA$#244!263?AAA$#243!266?A$#247!267?A$#11C$#18!1?C$#11!2?CC$#18!4?CCCC$#22!8?C$#27!9?C$#18!10?CC$#22!12?C$#24!13?C$#27!14?CC$#22!16?C$#30!17?CC$#31!19?CC$#30!21?CC$#27!23?C$#31!24?C$#27!25?C$#24!26?CCC$#30!29?C$#11!30?C$#21!31?C$#11!32?CCC$#4!35?C$#1!36?CC$#7!38?C$#4!39?C$#1!40?C$#11!41?C$#21!42?C$#5!43?CC$#11!45?C$#7!46?C$#14!47?C$#11!48?C$#7!49?CC$#11!51?C$#14!52?CC$#11!54?CC$#19!56?C$#11!57?C$#4!58?CC$#7!60?C$#1!61?C$#7!62?C$#4!63?CC$#11!65?C$#4!66?C$#36!67?C$#27!68?C$#22!69?C$#31!70?C$#27!71?C$#21!72?C$#18!73?C$#27!74?C$#36!75?C$#40!76?C$#38!77?C$#31!78?C$#11!79?C$#30!80?CC$#22!82?C$#30!83?C$#43!84?C$#36!85?C$#39!86?C$#41!87?C$#47!88?CC$#125!90?C$#110!91?C$#99!92?C$#110!93?C$#117!94?C$#65!95?C$#92!96?CC$#135!98?CC$#155!100?C$#99!101?C$#135!102?C$#144!103?C$#163!104?C$#90!105?C$#156!106?C$#125!107?C$#156!108?C$#133!109?C$#145!110?C$#162!111?C$#121!112?C$#105!113?C$#120!114?C$#113!115?C$#114!116?CC$#88!118?C$#87!119?CC$#88!121?C$#86!122?CC$#60!124?C$#65!125?C$#86!126?C$#88!127?C$#61!128?C$#89!129?C$#73!130?C$#88!131?C$#113!132?C$#124!133?C$#118!134?C$#121!135?C$#59!136?C$#102!137?C$#119!138?C$#102!139?C$#107!140?C$#199!141?C$#212!142?C$#195!143?C$#199!144?C$#180!145?C$#134!146?C$#171!147?C$#204!148?C$#221!149?C$#231!150?C$#239!151?C$#235!152?C$#236!153?CC$#225!155?C$#235!156?CC$#244!158?C$#246!159?C$#248!160?CC$#241!162?C$#246!163?C$#248!164?CC$#249!166?CCC$#252!169?C$#250!170?C$#249!171?C$#243!172?C$#250!173?CC$#249!175?C$#244!176?C$#226!177?C$#209!178?C$#210!179?C$#179!180?C$#164!181?C$#144!182?C$#161!183?C$#200!184?C$#207!185?C$#229!186?C$#237!187?C$#248!188?C$#237!189?C$#240!190?C$#248!191?CCC$#253!194?C$#247!195?C$#248!196?CC$#247!198?C$#236!199?C$#244!200?C$#241!201?C$#228!202?C$#227!203?C$#150!204?C$#154!205?C$#148!206?C$#150!207?C$#168!208?C$#196!209?C$#180!210?C$#242!211?C$#225!212?C$#212!213?C$#225!214?CC$#192!216?C$#167!217?C$#153!218?C$#173!219?CC$#165!221?C$#168!222?C$#169!223?C$#147!224?C$#217!225?C$#201!226?C$#171!227?C$#188!228?C$#220!229?C$#203!230?C$#186!231?C$#169!232?C$#77!233?C$#109!234?C$#169!235?C$#171!236?C$#191!237?C$#206!238?C$#216!239?C$#220!240?C$#239!241?CC$#232!243?C$#220!244?CC$#232!246?C$#222!247?C$#232!248?C$#222!249?C$#220!250?C$#224!251?C$#223!252?CC$#234!254?CC$#244!256?C$#243!257?C$#242!258?C$#243!259?C$#247!260?CC$#244!262?C$#247!263?CC$#244!265?C$#249!266?CC$#24G$#18!1?GGG$#11!4?G$#24!5?G$#18!6?GG$#11!8?G$#24!9?G$#18!10?GG$#24!12?G$#27!13?G$#23!14?GG$#22!16?G$#30!17?GGG$#36!20?G$#32!21?G$#23!22?G$#27!23?G$#30!24?G$#27!25?G$#18!26?G$#27!27?GG$#24!29?G$#11!30?GGGGG$#4!35?G$#7!36?G$#11!37?G$#7!38?GGG$#12!41?G$#7!42?G$#11!43?G$#4!44?GG$#5!46?G$#14!47?GG$#11!49?G$#7!50?GGG$#12!53?G$#11!54?GGGGG$#7!59?G$#1!60?GGG$#5!63?G$#4!64?G$#19!65?G$#11!66?G$#19!67?G$#27!68?G$#38!69?G$#39!70?G$#36!71?G$#30!72?GG$#21!74?G$#27!75?G$#30!76?G$#9!77?G$#30!78?G$#9!79?G$#27!80?G$#38!81?G$#37!82?G$#42!83?G$#36!84?G$#38!85?G$#41!86?G$#67!87?G$#54!88?G$#92!89?G$#79!90?GG$#107!92?G$#84!93?G$#73!94?G$#47!95?G$#41!96?G$#38!97?G$#90!98?G$#159!99?G$#143!100?G$#108!101?G$#114!102?G$#172!103?G$#179!104?GG$#172!106?G$#179!107?G$#125!108?G$#133!109?G$#161!110?G$#133!111?G$#120!112?G$#158!113?G$#120!114?GG$#113!116?G$#112!117?GG$#97!119?G$#90!120?G$#88!121?G$#86!122?G$#88!123?G$#86!124?G$#65!125?G$#79!126?G$#86!127?G$#79!128?G$#66!129?GG$#91!131?G$#118!132?G$#128!133?G$#118!134?G$#47!135?G$#54!136?G$#67!137?G$#98!138?G$#154!139?G$#212!140?G$#226!141?G$#225!142?G$#212!143?GG$#180!145?G$#195!146?G$#176!147?G$#204!148?G$#224!149?G$#231!150?GGG$#240!153?G$#236!154?G$#241!155?G$#231!156?G$#244!157?GG$#247!159?GG$#244!161?G$#247!162?G$#249!163?G$#247!164?G$#252!165?G$#250!166?G$#253!167?G$#252!168?G$#250!169?G$#251!170?G$#249!171?GGGGG$#234!176?G$#230!177?G$#207!178?G$#200!179?G$#179!180?GG$#158!182?G$#170!183?G$#207!184?G$#208!185?G$#238!186?G$#240!187?GG$#248!189?GGGGG$#253!194?G$#254!195?GG$#253!197?G$#250!198?G$#249!199?G$#247!200?G$#240!201?G$#198!202?G$#192!203?G$#180!204?G$#195!205?G$#138!206?G$#157!207?G$#176!208?G$#195!209?GG$#214!211?G$#219!212?G$#212!213?G$#227!214?GG$#154!216?G$#167!217?G$#151!218?G$#165!219?G$#199!220?G$#187!221?G$#194!222?G$#217!223?GG$#193!225?G$#201!226?G$#220!227?GG$#242!229?G$#251!230?G$#242!231?G$#220!232?G$#147!233?G$#104!234?G$#169!235?G$#186!236?G$#216!237?G$#203!238?G$#220!239?G$#242!240?GG$#239!242?G$#222!243?G$#232!244?G$#222!245?G$#220!246?GG$#232!248?G$#234!249?G$#222!250?G$#218!251?G$#224!252?G$#232!253?GG$#239!255?G$#236!256?G$#235!257?G$#244!258?G$#243!259?G$#249!260?G$#246!261?G$#247!262?GG$#246!264?G$#244!265?G$#248!266?G$#244!267?G$#18OO$#19!2?O$#18!3?O$#11!4?O$#24!5?O$#18!6?OOOO$#24!10?O$#18!11?OO$#24!13?O$#30!14?OO$#22!16?O$#30!17?O$#36!18?O$#31!19?O$#30!20?O$#34!21?O$#36!22?O$#30!23?OO$#27!25?O$#18!26?O$#27!27?O$#18!28?OOO$#19!31?OO$#11!33?OO$#5!35?O$#7!36?O$#11!37?O$#7!38?OOOOO$#4!43?O$#1!44?O$#7!45?O$#14!46?O$#12!47?OO$#11!49?O$#5!50?O$#21!51?O$#11!52?OO$#21!54?O$#11!55?O$#19!56?O$#7!57?OO$#1!59?OOOOO$#7!64?OOO$#21!67?O$#30!68?O$#36!69?O$#38!70?O$#23!71?O$#37!72?O$#36!73?O$#37!74?O$#27!75?O$#19!76?O$#47!77?OO$#41!79?O$#47!80?O$#52!81?O$#43!82?O$#40!83?O$#41!84?O$#56!85?O$#73!86?O$#85!87?O$#103!88?O$#85!89?OO$#79!91?O$#54!92?O$#46!93?O$#40!94?O$#58!95?O$#116!96?O$#91!97?O$#90!98?O$#145!99?O$#172!100?O$#155!101?O$#125!102?O$#133!103?O$#164!104?O$#127!105?O$#144!106?O$#181!107?O$#158!108?OO$#163!110?O$#145!111?O$#120!112?O$#162!113?O$#158!114?O$#113!115?O$#105!116?O$#112!117?O$#97!118?OO$#90!120?OOOO$#86!124?O$#65!125?OOO$#66!128?O$#58!129?O$#67!130?O$#86!131?O$#118!132?O$#124!133?O$#88!134?O$#39!135?O$#92!136?O$#102!137?O$#151!138?O$#182!139?O$#231!140?O$#249!141?O$#231!142?O$#212!143?O$#226!144?O$#218!145?O$#211!146?O$#195!147?O$#180!148?O$#212!149?O$#231!150?O$#244!151?O$#225!152?O$#230!153?O$#236!154?OOO$#244!157?O$#236!158?O$#246!159?O$#248!160?O$#249!161?O$#250!162?OO$#252!164?OO$#253!166?O$#251!167?O$#252!168?O$#253!169?O$#251!170?O$#249!171?OOO$#251!174?OO$#244!176?O$#236!177?O$#213!178?OOO$#209!181?O$#200!182?O$#170!183?O$#207!184?O$#229!185?O$#238!186?OO$#237!188?O$#248!189?O$#253!190?O$#247!191?O$#248!192?O$#253!193?OO$#254!195?O$#253!196?O$#249!197?O$#248!198?O$#247!199?O$#241!200?O$#209!201?O$#228!202?O$#209!203?O$#231!204?O$#221!205?O$#218!206?O$#165!207?O$#157!208?O$#168!209?O$#165!210?O$#202!211?O$#215!212?O$#209!213?O$#213!214?O$#179!215?O$#151!216?O$#165!217?O$#173!218?O$#205!219?O$#220!220?O$#193!221?O$#201!222?O$#204!223?O$#148!224?O$#193!225?O$#242!226?O$#196!227?O$#205!228?O$#219!229?O$#239!230?O$#251!231?OO$#220!233?O$#131!234?OO$#189!236?O$#216!237?O$#217!238?O$#232!239?O$#242!240?O$#243!241?O$#234!242?O$#222!243?O$#232!244?OO$#239!246?O$#217!247?O$#222!248?O$#239!249?O$#234!250?O$#214!251?O$#221!252?O$#231!253?OO$#234!255?O$#236!256?O$#244!257?O$#243!258?O$#249!259?OO$#246!261?O$#247!262?OO$#246!264?OO$#249!266?O$#246!267?O$#4_$#18!1?_$#11!2?_$#5!3?_$#4!4?_$#24!5?_$#11!6?_$#24!7?_$#18!8?_$#27!9?_$#24!10?_$#27!11?_$#24!12?_$#18!13?_$#27!14?_$#30!15?_$#27!16?_$#30!17?_$#34!18?_$#27!19?_$#31!20?_$#30!21?__$#27!23?_$#22!24?_$#30!25?_$#27!26?__$#24!28?_$#18!29?_$#21!30?_$#11!31?_$#19!32?_$#11!33?__$#5!35?_$#7!36?__$#11!38?_$#1!39?_$#11!40?_$#1!41?_$#7!42?__$#11!44?_$#7!45?_$#11!46?_$#14!47?_$#12!48?_$#11!49?___$#14!52?_$#11!53?_$#7!54?_$#11!55?__$#7!57?__$#5!59?_$#7!60?_$#1!61?_$#5!62?_$#1!63?_$#7!64?_$#1!65?_$#7!66?_$#4!67?_$#19!68?_$#37!69?_$#30!70?_$#39!71?_$#31!72?_$#22!73?_$#37!74?_$#41!75?_$#58!76?_$#54!77?_$#58!78?_$#94!79?_$#58!80?_$#85!81?_$#58!82?__$#54!84?_$#67!85?_$#54!86?_$#56!87?_$#79!88?_$#86!89?_$#61!90?_$#41!91?_$#40!92?_$#41!93?_$#107!94?_$#90!95?_$#100!96?_$#112!97?_$#151!98?_$#135!99?_$#116!100?_$#105!101?_$#144!102?_$#177!103?_$#172!104?_$#135!105?_$#144!106?_$#156!107?_$#144!108?_$#163!109?_$#125!110?_$#129!111?_$#144!112?_$#164!113?_$#144!114?_$#133!115?__$#114!117?_$#97!118?__$#113!120?_$#97!121?__$#88!123?__$#86!125?_$#87!126?_$#79!127?_$#58!128?_$#66!129?_$#72!130?_$#54!131?_$#102!132?_$#118!133?_$#86!134?_$#53!135?_$#102!136?_$#151!137?_$#192!138?_$#236!139?_$#249!140?_$#250!141?_$#245!142?_$#225!143?_$#224!144?_$#195!145?_$#212!146?_$#218!147?_$#176!148?_$#212!149?__$#225!151?__$#227!153?_$#244!154?_$#245!155?_$#244!156?____$#245!160?_$#247!161?_$#249!162?_$#250!163?__$#251!165?_$#252!166?_$#251!167?_$#252!168?__$#251!170?__$#250!172?__$#251!174?__$#247!176?_$#244!177?_$#235!178?_$#213!179?_$#200!180?_$#177!181?_$#181!182?_$#200!183?_$#207!184?_$#208!185?__$#237!187?_$#240!188?_$#238!189?_$#240!190?_$#248!191?_$#253!192?_$#254!193?_$#253!194?__$#248!196?_$#246!197?_$#240!198?_$#241!199?_$#230!200?_$#207!201?_$#181!202?_$#228!203?_$#244!204?_$#242!205?_$#214!206?_$#166!207?_$#126!208?_$#147!209?_$#176!210?__$#218!212?_$#207!213?_$#183!214?_$#154!215?___$#167!218?_$#205!219?_$#216!220?__$#187!222?_$#111!223?_$#219!224?_$#231!225?_$#196!226?__$#212!228?_$#239!229?_$#242!230?__$#220!232?_$#201!233?_$#131!234?_$#109!235?_$#201!236?_$#206!237?_$#194!238?_$#217!239?_$#232!240?_$#239!241?___$#222!244?__$#232!246?_$#242!247?_$#217!248?_$#232!249?_$#234!250?_$#224!251?_$#219!252?_$#232!253?_$#231!254?_$#221!255?_$#231!256?_$#244!257?_$#247!258?__$#249!260?_$#247!261?__$#244!263?_$#247!264?__$#249!266?_$#246!267?_$-#11@$#24!1?@$#11!2?@$#4!3?@@$#24!5?@$#18!6?@$#27!7?@$#4!8?@$#18!9?@@@$#24!12?@@$#30!14?@@$#36!16?@$#31!17?@$#34!18?@$#27!19?@$#30!20?@@$#27!22?@@@@$#24!26?@@@$#19!29?@$#11!30?@$#19!31?@@$#11!33?@@$#7!35?@@$#11!37?@@@$#1!40?@$#7!41?@$#11!42?@@@$#14!45?@$#7!46?@$#14!47?@$#12!48?@$#21!49?@$#11!50?@$#19!51?@$#11!52?@$#4!53?@$#11!54?@$#4!55?@$#21!56?@$#11!57?@$#7!58?@$#1!59?@@@@@$#7!64?@$#5!65?@$#4!66?@$#21!67?@$#11!68?@$#36!69?@$#30!70?@$#31!71?@$#23!72?@$#36!73?@$#30!74?@$#38!75?@$#37!76?@$#47!77?@$#48!78?@$#67!79?@$#66!80?@$#106!81?@$#41!82?@$#54!83?@$#48!84?@$#62!85?@$#93!86?@$#90!87?@$#135!88?@$#116!89?@$#103!90?@@$#79!92?@$#91!93?@$#103!94?@$#110!95?@@$#115!97?@$#146!98?@$#172!99?@$#125!100?@$#179!101?@$#151!102?@$#200!103?@$#100!104?@$#156!105?@$#181!106?@$#125!107?@$#164!108?@$#159!109?@$#151!110?@$#146!111?@$#159!112?@$#141!113?@$#170!114?@$#145!115?@@$#120!117?@$#113!118?@$#97!119?@$#105!120?@$#102!121?@$#97!122?@$#88!123?@$#90!124?@$#88!125?@$#61!126?@$#65!127?@$#61!128?@$#67!129?@$#54!130?@@$#86!132?@$#120!133?@$#41!134?@$#54!135?@$#130!136?@$#182!137?@$#224!138?@$#245!139?@$#251!140?@@$#243!142?@$#231!143?@$#195!144?@$#225!145?@$#212!146?@$#211!147?@$#166!148?@$#180!149?@$#209!150?@$#211!151?@$#230!152?@@$#244!154?@@@@@@$#235!160?@$#244!161?@$#248!162?@$#249!163?@@$#250!165?@@@$#252!168?@$#251!169?@$#252!170?@@@@@$#251!175?@$#249!176?@$#247!177?@$#241!178?@$#240!179?@$#233!180?@$#213!181?@$#208!182?@@$#207!184?@$#208!185?@@$#237!187?@$#240!188?@$#248!189?@@@@@$#249!194?@$#250!195?@$#253!196?@$#249!197?@$#248!198?@$#241!199?@$#229!200?@$#200!201?@$#207!202?@$#213!203?@$#245!204?@$#224!205?@$#173!206?@$#157!207?@$#148!208?@$#157!209?@$#169!210?@$#166!211?@$#199!212?@$#209!213?@$#192!214?@$#154!215?@$#151!216?@$#167!217?@$#211!218?@$#205!219?@$#215!220?@$#180!221?@$#157!222?@$#224!223?@$#249!224?@$#209!225?@$#154!226?@$#180!227?@$#214!228?@$#242!229?@@$#220!231?@$#169!232?@$#142!233?@$#178!234?@$#109!235?@$#201!236?@$#217!237?@$#216!238?@$#203!239?@$#201!240?@$#239!241?@$#232!242?@$#239!243?@@$#221!245?@$#220!246?@$#242!247?@$#243!248?@$#239!249?@$#222!250?@$#221!251?@$#224!252?@$#232!253?@$#234!254?@$#224!255?@$#231!256?@$#243!257?@@@@$#246!261?@@@$#247!264?@$#244!265?@$#247!266?@@$#18AAA$#11!3?AA$#24!5?A$#18!6?A$#27!7?AA$#18!9?A$#27!10?A$#18!11?A$#22!12?A$#23!13?AA$#34!15?A$#30!16?A$#36!17?A$#23!18?A$#31!19?AA$#30!21?A$#27!22?AAAAA$#24!27?AA$#21!29?A$#19!30?A$#11!31?AAAAA$#4!36?A$#5!37?A$#1!38?AA$#7!40?A$#11!41?A$#7!42?AAAA$#11!46?A$#19!47?A$#7!48?A$#11!49?A$#21!50?A$#11!51?AAA$#7!54?A$#21!55?A$#7!56?AAA$#1!59?AAA$#7!62?AAA$#5!65?A$#19!66?AAA$#30!69?A$#5!70?A$#27!71?A$#36!72?A$#30!73?A$#27!74?A$#21!75?A$#37!76?A$#32!77?A$#30!78?A$#38!79?A$#40!80?A$#67!81?A$#39!82?A$#38!83?A$#44!84?A$#46!85?A$#52!86?A$#54!87?A$#47!88?A$#65!89?A$#58!90?A$#116!91?A$#100!92?A$#143!93?A$#146!94?AA$#87!96?A$#112!97?A$#135!98?A$#146!99?A$#164!100?A$#179!101?A$#181!102?A$#146!103?A$#181!104?A$#162!105?A$#200!106?A$#125!107?A$#172!108?A$#135!109?A$#164!110?AA$#155!112?A$#125!113?A$#155!114?A$#125!115?A$#159!116?A$#139!117?A$#90!118?A$#113!119?A$#97!120?AA$#88!122?A$#90!123?AA$#88!125?A$#60!126?A$#79!127?A$#65!128?A$#59!129?A$#54!130?A$#67!131?A$#56!132?A$#41!133?A$#83!134?A$#137!135?A$#154!136?A$#236!137?A$#250!138?A$#251!139?A$#254!140?A$#253!141?A$#249!142?A$#224!143?A$#244!144?A$#225!145?A$#212!146?A$#225!147?A$#212!148?A$#167!149?A$#209!150?A$#212!151?A$#226!152?A$#244!153?A$#236!154?A$#235!155?A$#244!156?AA$#246!158?A$#247!159?AA$#249!161?AAAA$#250!165?A$#252!166?A$#251!167?AAAA$#250!171?AA$#251!173?A$#250!174?A$#251!175?A$#249!176?A$#225!177?A$#227!178?A$#230!179?A$#229!180?A$#213!181?A$#207!182?A$#208!183?A$#213!184?A$#229!185?A$#237!186?A$#240!187?A$#248!188?AAA$#253!191?AAAA$#254!195?A$#253!196?A$#248!197?A$#244!198?A$#247!199?A$#245!200?A$#208!201?AA$#233!203?A$#246!204?A$#225!205?A$#173!206?A$#152!207?A$#138!208?A$#165!209?A$#168!210?A$#187!211?A$#211!212?A$#198!213?A$#183!214?AA$#151!216?A$#154!217?A$#173!218?A$#165!219?AA$#235!221?A$#245!222?A$#236!223?AA$#196!225?A$#182!226?A$#202!227?A$#215!228?A$#219!229?A$#203!230?A$#186!231?A$#171!232?A$#254!233?A$#243!234?A$#203!235?A$#220!236?A$#232!237?AA$#242!239?AA$#239!241?A$#232!242?A$#217!243?A$#232!244?A$#234!245?A$#222!246?A$#234!247?A$#239!248?A$#243!249?A$#234!250?A$#224!251?A$#221!252?A$#232!253?A$#242!254?A$#231!255?AA$#243!257?AAA$#247!260?A$#244!261?A$#245!262?A$#244!263?AA$#246!265?A$#244!266?A$#247!267?A$#18C$#24!1?C$#18!2?CCCC$#11!6?C$#24!7?C$#18!8?C$#4!9?C$#24!10?C$#18!11?C$#22!12?C$#23!13?CC$#31!15?C$#30!16?C$#32!17?C$#36!18?C$#30!19?C$#27!20?C$#30!21?C$#27!22?C$#30!23?C$#22!24?CC$#27!26?C$#24!27?C$#18!28?C$#19!29?C$#11!30?CCCCC$#4!35?CC$#5!37?C$#7!38?C$#11!39?C$#4!40?C$#11!41?CC$#12!43?C$#11!44?CCC$#4!47?C$#12!48?C$#7!49?CC$#12!51?CC$#7!53?CC$#11!55?C$#7!56?CCC$#1!59?CCCC$#5!63?C$#1!64?CC$#11!66?CC$#30!68?C$#4!69?C$#27!70?C$#31!71?C$#27!72?C$#30!73?CC$#39!75?C$#37!76?CC$#48!78?C$#44!79?C$#41!80?C$#47!81?C$#48!82?C$#36!83?C$#37!84?C$#43!85?C$#37!86?C$#40!87?C$#67!88?C$#84!89?C$#86!90?C$#126!91?C$#108!92?C$#110!93?C$#125!94?C$#108!95?C$#125!96?C$#164!97?C$#179!98?C$#114!99?C$#179!100?C$#159!101?C$#163!102?C$#144!103?C$#113!104?C$#207!105?C$#200!106?C$#164!107?C$#209!108?C$#198!109?C$#209!110?C$#135!111?C$#154!112?C$#179!113?C$#207!114?C$#163!115?C$#177!116?C$#133!117?C$#112!118?C$#114!119?C$#90!120?CC$#102!122?C$#90!123?CC$#87!125?C$#86!126?C$#88!127?C$#91!128?C$#65!129?C$#79!130?C$#58!131?C$#79!132?C$#99!133?C$#137!134?C$#176!135?C$#225!136?C$#247!137?C$#250!138?C$#254!139?CC$#252!141?C$#250!142?C$#244!143?C$#231!144?C$#235!145?C$#224!146?C$#231!147?C$#214!148?C$#176!149?C$#192!150?C$#209!151?C$#236!152?C$#244!153?C$#236!154?C$#247!155?CC$#246!157?C$#244!158?C$#246!159?C$#247!160?CC$#248!162?CC$#249!164?C$#252!165?CCC$#253!168?C$#252!169?CC$#251!171?C$#252!172?C$#251!173?C$#250!174?CC$#247!176?C$#249!177?CC$#248!179?C$#241!180?C$#228!181?C$#229!182?C$#207!183?C$#208!184?C$#233!185?C$#229!186?CC$#238!188?C$#248!189?CCCC$#250!193?C$#249!194?C$#247!195?C$#248!196?C$#246!197?C$#241!198?C$#248!199?C$#230!200?C$#207!201?CC$#229!203?C$#227!204?C$#241!205?C$#182!206?C$#166!207?C$#138!208?C$#107!209?C$#166!210?C$#212!211?C$#209!212?C$#192!213?C$#198!214?C$#179!215?C$#146!216?C$#154!217?CC$#165!219?C$#227!220?C$#235!221?C$#246!222?C$#244!223?C$#209!224?C$#196!225?C$#195!226?C$#232!227?C$#175!228?C$#169!229?C$#201!230?C$#203!231?C$#254!232?C$#251!233?CC$#232!235?C$#194!236?C$#234!237?C$#222!238?C$#242!239?C$#251!240?CC$#242!242?C$#232!243?C$#220!244?CC$#222!246?C$#232!247?C$#242!248?C$#243!249?C$#234!250?C$#224!251?C$#242!252?C$#222!253?C$#231!254?C$#225!255?C$#224!256?C$#239!257?C$#249!258?CCC$#246!261?C$#241!262?C$#244!263?CC$#246!265?C$#244!266?C$#245!267?C$#11G$#18!1?G$#11!2?G$#18!3?G$#11!4?G$#18!5?G$#22!6?G$#24!7?G$#11!8?G$#24!9?GG$#18!11?G$#23!12?G$#32!13?G$#23!14?G$#31!15?G$#34!16?GG$#31!18?G$#27!19?G$#22!20?G$#30!21?GG$#22!23?G$#31!24?G$#27!25?G$#30!26?G$#27!27?G$#18!28?G$#21!29?G$#4!30?GGG$#11!33?G$#19!34?G$#11!35?G$#7!36?G$#4!37?GG$#11!39?G$#5!40?G$#7!41?GGG$#11!44?GGG$#9!47?G$#14!48?G$#7!49?GG$#5!51?G$#14!52?G$#21!53?G$#11!54?G$#7!55?G$#11!56?GG$#5!58?G$#1!59?GGGGG$#5!64?G$#4!65?GG$#11!67?G$#19!68?GG$#30!70?G$#36!71?G$#23!72?G$#42!73?G$#30!74?GGG$#46!77?G$#54!78?G$#75!79?G$#54!80?G$#47!81?GG$#48!83?G$#36!84?G$#31!85?G$#41!86?GG$#45!88?G$#47!89?G$#86!90?G$#90!91?G$#87!92?G$#90!93?G$#108!94?G$#116!95?G$#164!96?G$#146!97?G$#125!98?G$#164!99?GG$#155!101?G$#146!102?G$#179!103?G$#164!104?G$#200!105?G$#210!106?G$#209!107?GG$#183!109?G$#167!110?G$#183!111?G$#164!112?G$#143!113?G$#172!114?G$#181!115?G$#200!116?G$#162!117?G$#119!118?G$#112!119?G$#87!120?G$#90!121?GG$#97!123?G$#120!124?G$#110!125?G$#97!126?G$#102!127?G$#90!128?G$#88!129?G$#90!130?G$#97!131?G$#119!132?G$#151!133?G$#192!134?G$#226!135?G$#250!136?G$#253!137?G$#252!138?G$#251!139?G$#250!140?G$#251!141?G$#254!142?G$#252!143?G$#246!144?G$#250!145?G$#234!146?G$#236!147?G$#225!148?G$#173!149?G$#180!150?G$#192!151?G$#226!152?G$#244!153?GGG$#235!156?G$#244!157?G$#236!158?G$#244!159?G$#236!160?G$#241!161?G$#246!162?GG$#248!164?G$#250!165?G$#251!166?G$#250!167?G$#253!168?G$#252!169?G$#253!170?G$#252!171?G$#251!172?G$#250!173?G$#251!174?GG$#249!176?GG$#244!178?G$#236!179?G$#241!180?G$#237!181?G$#213!182?GG$#208!184?GG$#229!186?G$#238!187?G$#240!188?G$#248!189?GGGGG$#250!194?G$#253!195?G$#250!196?G$#249!197?G$#248!198?G$#241!199?G$#213!200?G$#200!201?G$#207!202?G$#208!203?G$#230!204?G$#213!205?G$#167!206?G$#165!207?G$#150!208?G$#142!209?G$#211!210?GG$#209!212?G$#183!213?G$#192!214?G$#183!215?G$#154!216?G$#151!217?G$#198!218?G$#209!219?G$#230!220?G$#241!221?GG$#235!223?G$#196!224?G$#212!225?G$#221!226?G$#216!227?G$#184!228?G$#171!229?G$#239!230?G$#254!231?GGG$#243!234?G$#232!235?G$#187!236?G$#239!237?G$#232!238?G$#242!239?G$#251!240?GG$#252!242?G$#239!243?GG$#222!245?G$#232!246?G$#242!247?G$#234!248?G$#239!249?G$#234!250?G$#244!251?G$#242!252?G$#234!253?G$#231!254?G$#225!255?G$#224!256?G$#234!257?G$#243!258?GG$#249!260?G$#247!261?G$#246!262?GG$#244!264?G$#236!265?G$#244!266?G$#246!267?G$#11O$#18!1?O$#11!2?O$#18!3?O$#24!4?O$#18!5?O$#23!6?O$#24!7?O$#11!8?O$#24!9?O$#18!10?O$#24!11?O$#27!12?O$#23!13?O$#34!14?O$#32!15?O$#36!16?O$#31!17?O$#27!18?O$#30!19?OO$#27!21?O$#31!22?O$#30!23?OO$#27!25?OOOO$#21!29?O$#4!30?O$#11!31?O$#4!32?OO$#11!34?O$#7!35?O$#1!36?O$#7!37?O$#11!38?OO$#4!40?O$#21!41?O$#11!42?OOO$#7!45?O$#21!46?O$#7!47?O$#12!48?O$#7!49?O$#4!50?O$#12!51?O$#14!52?O$#11!53?OO$#7!55?OOO$#4!58?O$#7!59?O$#1!60?OOOO$#4!64?O$#5!65?O$#4!66?O$#11!67?OO$#30!69?O$#31!70?O$#22!71?O$#39!72?O$#31!73?O$#30!74?O$#36!75?O$#38!76?O$#40!77?O$#92!78?OO$#54!80?O$#67!81?O$#54!82?O$#47!83?O$#41!84?O$#54!85?O$#58!86?O$#47!87?OO$#58!89?O$#65!90?O$#105!91?O$#90!92?OO$#87!94?O$#112!95?O$#135!96?O$#115!97?O$#129!98?O$#158!99?O$#144!100?O$#162!101?O$#144!102?OOO$#183!105?O$#209!106?O$#192!107?O$#196!108?O$#230!109?O$#179!110?O$#172!111?O$#125!112?O$#88!113?O$#116!114?O$#135!115?O$#144!116?O$#114!117?O$#65!118?O$#87!119?O$#65!120?O$#88!121?O$#87!122?O$#102!123?O$#105!124?OO$#119!126?O$#112!127?OO$#97!129?OO$#128!131?O$#208!132?O$#230!133?O$#236!134?O$#247!135?O$#253!136?O$#254!137?O$#252!138?O$#243!139?O$#251!140?O$#254!141?OO$#251!143?OO$#249!145?OO$#239!147?O$#244!148?O$#180!149?O$#202!150?O$#212!151?O$#236!152?O$#247!153?O$#244!154?OO$#243!156?O$#244!157?OO$#236!159?OO$#241!161?O$#246!162?O$#248!163?OOO$#250!166?O$#252!167?O$#251!168?O$#252!169?OO$#251!171?OOO$#249!174?OOOOO$#250!179?O$#248!180?O$#213!181?O$#228!182?O$#207!183?O$#200!184?O$#207!185?O$#229!186?O$#233!187?O$#237!188?OO$#238!190?O$#248!191?OOO$#253!194?OOOO$#241!198?O$#229!199?O$#200!200?O$#207!201?O$#177!202?O$#208!203?O$#227!204?O$#192!205?O$#182!206?O$#165!207?O$#195!208?O$#212!209?O$#227!210?O$#213!211?O$#198!212?O$#192!213?O$#183!214?O$#179!215?O$#151!216?O$#154!217?O$#210!218?O$#230!219?O$#240!220?O$#236!221?O$#231!222?O$#225!223?O$#219!224?O$#243!225?O$#239!226?O$#194!227?O$#232!228?O$#239!229?O$#251!230?O$#254!231?OOO$#251!234?O$#243!235?O$#157!236?O$#222!237?O$#239!238?O$#242!239?O$#251!240?OO$#243!242?OO$#242!244?O$#239!245?OO$#242!247?O$#251!248?O$#243!249?O$#239!250?O$#243!251?O$#242!252?O$#239!253?O$#231!254?OO$#235!256?O$#242!257?O$#243!258?OO$#246!260?O$#247!261?O$#246!262?OO$#245!264?O$#247!265?O$#244!266?OO$#18__$#11!2?_$#18!3?_____$#27!8?_$#24!9?_$#18!10?_$#27!11?__$#30!13?_$#23!14?_$#34!15?_$#30!16?_$#31!17?_$#22!18?_$#30!19?_$#22!20?___$#30!23?___$#27!26?_$#22!27?_$#18!28?_$#19!29?_$#11!30?___$#4!33?_$#5!34?_$#7!35?___$#4!38?_$#11!39?_$#7!40?_$#5!41?_$#1!42?_$#7!43?__$#1!45?_$#7!46?__$#12!48?_$#7!49?_$#4!50?_$#14!51?___$#11!54?___$#4!57?__$#7!59?_$#1!60?__$#5!62?_$#7!63?__$#11!65?__$#21!67?_$#24!68?_$#19!69?_$#27!70?_$#36!71?_$#40!72?_$#37!73?_$#46!74?_$#54!75?_$#79!76?_$#58!77?_$#62!78?_$#54!79?_$#86!80?_$#58!81?_$#47!82?_$#54!83?_$#66!84?_$#80!85?_$#66!86?_$#65!87?_$#117!88?_$#91!89?_$#99!90?_$#90!91?_$#79!92?_$#88!93?_$#86!94?__$#65!96?_$#108!97?_$#97!98?_$#141!99?_$#121!100?_$#170!101?_$#105!102?_$#145!103?_$#200!104?_$#183!105?_$#209!106?__$#173!108?_$#209!109?_$#146!110?_$#112!111?_$#110!112?_$#67!113?_$#47!114?_$#54!115?_$#66!116?_$#92!117?_$#79!118?_$#85!119?__$#79!121?_$#65!122?_$#100!123?_$#97!124?__$#105!126?_$#90!127?_$#119!128?_$#105!129?_$#113!130?_$#145!131?_$#179!132?_$#192!133?_$#230!134?_$#244!135?_$#252!136?_$#254!137?_$#251!138?_$#224!139?_$#250!140?_$#252!141?_$#254!142?_$#250!143?____$#249!147?_$#247!148?_$#214!149?_$#199!150?_$#226!151?_$#235!152?_$#244!153?____$#235!157?_$#244!158?___$#236!161?_$#246!162?__$#241!164?_$#244!165?_$#249!166?__$#251!168?___$#252!171?_$#251!172?_$#249!173?_$#250!174?__$#251!176?_$#249!177?___$#236!180?_$#230!181?_$#228!182?__$#181!184?_$#207!185?__$#229!187?_$#240!188?_$#248!189?_____$#241!194?_$#248!195?_$#250!196?_$#252!197?_$#241!198?_$#230!199?_$#228!200?_$#208!201?_$#213!202?___$#209!205?_$#196!206?_$#180!207?_$#218!208?_$#228!209?_$#213!210?_$#210!211?_$#179!212?_$#182!213?_$#213!214?_$#172!215?_$#165!216?_$#196!217?_$#228!218?_$#227!219?_$#241!220?_$#249!221?_$#247!222?_$#249!223?_$#251!224?__$#239!226?__$#243!228?_$#251!229?_$#254!230?____$#251!234?_$#234!235?_$#157!236?_$#222!237?_$#239!238?__$#243!240?_$#251!241?__$#243!243?_$#242!244?_$#243!245?_$#239!246?__$#243!248?___$#250!251?_$#242!252?_$#243!253?_$#242!254?_$#235!255?__$#234!257?_$#244!258?_$#243!259?_$#241!260?_$#245!261?_$#247!262?_$#246!263?_$#244!264?_$#246!265?_$#247!266?_$#245!267?_$-#18@@@@$#11!4?@$#18!5?@$#24!6?@$#22!7?@$#24!8?@$#18!9?@$#27!10?@@$#22!12?@$#27!13?@$#34!14?@@@$#30!17?@$#36!18?@$#30!19?@$#22!20?@$#31!21?@$#27!22?@$#30!23?@$#27!24?@$#18!25?@$#22!26?@$#24!27?@@$#11!29?@$#19!30?@$#4!31?@$#11!32?@@$#4!34?@$#11!35?@$#4!36?@@$#11!38?@$#1!39?@$#11!40?@$#7!41?@@$#11!43?@$#7!44?@$#5!45?@$#7!46?@$#1!47?@$#12!48?@@$#7!50?@$#5!51?@$#12!52?@$#14!53?@$#7!54?@$#1!55?@$#11!56?@$#4!57?@@$#1!59?@@$#4!61?@$#1!62?@@$#5!64?@$#7!65?@$#4!66?@$#30!67?@$#27!68?@$#19!69?@$#11!70?@$#32!71?@$#37!72?@$#36!73?@$#67!74?@$#47!75?@@$#58!77?@$#66!78?@$#67!79?@@$#61!81?@$#85!82?@$#66!83?@$#86!84?@$#67!85?@$#56!86?@$#65!87?@$#92!88?@$#66!89?@$#105!90?@$#99!91?@@$#65!93?@$#88!94?@$#86!95?@$#65!96?@$#86!97?@$#65!98?@$#88!99?@$#100!100?@$#97!101?@$#100!102?@$#145!103?@$#172!104?@$#192!105?@$#183!106?@$#167!107?@$#192!108?@$#112!109?@$#65!110?@$#47!111?@$#37!112?@$#30!113?@$#39!114?@@$#44!116?@$#79!117?@$#91!118?@$#90!119?@$#61!120?@$#65!121?@$#90!122?@$#87!123?@$#88!124?@$#87!125?@$#105!126?@$#97!127?@$#119!128?@$#113!129?@$#141!130?@@$#200!132?@$#229!133?@@$#233!135?@$#240!136?@$#249!137?@$#253!138?@$#251!139?@$#249!140?@$#254!141?@@$#250!143?@@$#251!145?@$#252!146?@$#249!147?@$#242!148?@$#224!149?@$#196!150?@$#226!151?@$#235!152?@$#247!153?@$#242!154?@$#247!155?@$#244!156?@$#235!157?@$#244!158?@@@$#241!161?@$#246!162?@$#247!163?@@$#248!165?@$#247!166?@$#249!167?@$#250!168?@$#251!169?@@$#250!171?@$#249!172?@$#244!173?@$#247!174?@$#242!175?@$#244!176?@$#247!177?@$#249!178?@$#246!179?@$#236!180?@$#230!181?@@$#209!183?@$#213!184?@@$#229!186?@@$#238!188?@$#237!189?@$#248!190?@@@@$#253!194?@$#248!195?@$#247!196?@$#241!197?@$#228!198?@$#241!199?@$#240!200?@$#228!201?@@$#209!203?@@$#212!205?@$#211!206?@$#225!207?@$#230!208?@$#213!209?@$#209!210?@$#213!211?@$#198!212?@$#183!213?@$#198!214?@$#165!215?@$#182!216?@$#192!217?@$#230!218?@$#228!219?@$#247!220?@$#254!221?@$#249!222?@$#250!223?@$#251!224?@$#243!225?@$#239!226?@$#243!227?@$#251!228?@@$#254!230?@@@$#252!233?@$#251!234?@$#218!235?@$#123!236?@$#215!237?@$#222!238?@$#239!239?@$#243!240?@@@@$#242!244?@@$#239!246?@@$#242!248?@$#243!249?@@$#250!251?@$#243!252?@@$#234!254?@$#224!255?@$#231!256?@$#242!257?@$#243!258?@$#244!259?@@$#236!261?@@$#244!263?@$#246!264?@$#247!265?@@@$#18A$#4!1?A$#11!2?AA$#18!4?A$#24!5?AA$#18!7?AA$#24!9?A$#18!10?A$#22!11?A$#32!12?A$#23!13?A$#32!14?AA$#23!16?A$#34!17?AA$#30!19?AA$#27!21?AA$#30!23?A$#22!24?AA$#27!26?A$#18!27?A$#24!28?A$#19!29?AAA$#11!32?AA$#4!34?AA$#5!36?AA$#4!38?A$#7!39?AAAA$#11!43?AAA$#1!46?A$#7!47?A$#11!48?A$#7!49?A$#11!50?A$#7!51?A$#12!52?A$#14!53?A$#7!54?A$#1!55?A$#11!56?AA$#4!58?A$#7!59?A$#4!60?A$#5!61?A$#1!62?AA$#4!64?A$#5!65?A$#4!66?A$#24!67?A$#5!68?A$#4!69?A$#19!70?A$#36!71?A$#22!72?A$#36!73?A$#41!74?AA$#47!76?A$#73!77?A$#59!78?A$#79!79?A$#47!80?A$#58!81?A$#92!82?A$#65!83?A$#87!84?A$#92!85?A$#99!86?A$#58!87?A$#89!88?A$#92!89?A$#125!90?A$#146!91?A$#135!92?A$#99!93?A$#100!94?A$#86!95?A$#65!96?AA$#90!98?A$#88!99?A$#65!100?AA$#114!102?A$#121!103?A$#179!104?A$#209!105?A$#182!106?A$#143!107?A$#116!108?A$#53!109?A$#44!110?A$#19!111?A$#30!112?A$#19!113?A$#30!114?AA$#27!116?A$#47!117?A$#86!118?A$#102!119?A$#97!120?A$#65!121?A$#59!122?A$#87!123?AA$#65!125?A$#100!126?A$#119!127?A$#114!128?A$#112!129?A$#113!130?A$#161!131?A$#170!132?A$#177!133?A$#208!134?A$#177!135?A$#208!136?A$#240!137?A$#246!138?A$#227!139?A$#245!140?A$#254!141?AAA$#251!144?A$#254!145?A$#243!146?A$#239!147?AA$#235!149?A$#214!150?A$#235!151?A$#244!152?A$#246!153?AA$#247!155?AA$#249!157?A$#244!158?AA$#247!160?A$#246!161?AA$#247!163?AA$#249!165?AA$#248!167?A$#249!168?AA$#247!170?A$#250!171?A$#249!172?AAAA$#247!176?AA$#226!178?A$#209!179?A$#198!180?AA$#209!182?A$#198!183?A$#181!184?A$#207!185?A$#208!186?A$#238!187?A$#240!188?A$#248!189?AAA$#253!192?AAA$#248!195?A$#241!196?AA$#240!198?A$#228!199?A$#230!200?A$#228!201?AA$#210!203?A$#192!204?A$#211!205?A$#226!206?A$#230!207?A$#228!208?A$#200!209?A$#198!210?AAA$#192!213?AA$#179!215?A$#198!216?A$#213!217?AA$#230!219?A$#252!220?A$#254!221?A$#243!222?AA$#251!224?A$#243!225?AAA$#251!228?AAA$#254!231?A$#251!232?AA$#194!234?A$#132!235?A$#123!236?A$#202!237?A$#205!238?A$#217!239?A$#239!240?A$#243!241?A$#242!242?A$#234!243?A$#239!244?A$#243!245?A$#239!246?A$#242!247?AA$#243!249?AA$#251!251?A$#249!252?A$#243!253?A$#231!254?A$#224!255?A$#235!256?A$#243!257?AA$#244!259?A$#236!260?AAA$#246!263?AA$#243!265?A$#247!266?A$#244!267?A$#18CC$#4!2?C$#18!3?C$#11!4?CC$#24!6?C$#18!7?C$#27!8?C$#24!9?C$#27!10?CC$#23!12?C$#32!13?CCC$#36!16?C$#32!17?C$#36!18?C$#30!19?C$#22!20?C$#30!21?C$#27!22?C$#22!23?CCC$#27!26?CCC$#19!29?C$#11!30?C$#19!31?C$#4!32?C$#11!33?C$#19!34?C$#5!35?C$#7!36?CCC$#11!39?CC$#7!41?CC$#11!43?C$#7!44?C$#1!45?C$#7!46?CC$#11!48?C$#12!49?C$#7!50?C$#12!51?C$#11!52?CC$#7!54?C$#11!55?CC$#1!57?C$#5!58?CCCC$#1!62?C$#5!63?CC$#4!65?C$#11!66?C$#24!67?C$#11!68?CC$#18!70?C$#30!71?C$#24!72?C$#18!73?C$#31!74?C$#47!75?C$#61!76?C$#65!77?C$#60!78?C$#65!79?C$#79!80?C$#87!81?CC$#110!83?CC$#65!85?C$#86!86?C$#125!87?C$#126!88?C$#154!89?C$#100!90?C$#125!91?C$#114!92?C$#97!93?C$#87!94?C$#100!95?C$#87!96?C$#90!97?CC$#58!99?C$#87!100?C$#112!101?C$#145!102?C$#155!103?C$#179!104?C$#183!105?C$#146!106?C$#110!107?C$#92!108?C$#103!109?C$#41!110?C$#37!111?C$#21!112?C$#27!113?C$#30!114?C$#45!115?C$#38!116?C$#47!117?C$#114!118?C$#146!119?C$#113!120?C$#128!121?C$#105!122?C$#90!123?C$#105!124?C$#100!125?C$#90!126?C$#115!127?C$#121!128?CCC$#129!131?C$#177!132?C$#208!133?C$#177!134?C$#139!135?CC$#228!137?C$#248!138?C$#213!139?C$#177!140?C$#253!141?C$#254!142?CC$#250!144?C$#252!145?C$#250!146?C$#239!147?C$#244!148?C$#224!149?C$#231!150?C$#244!151?C$#245!152?C$#246!153?C$#249!154?C$#247!155?CCC$#244!158?C$#246!159?CC$#241!161?CC$#246!163?C$#248!164?CC$#249!166?CCC$#248!169?C$#246!170?C$#244!171?CC$#247!173?C$#246!174?CC$#244!176?CCC$#236!179?C$#230!180?C$#227!181?C$#210!182?C$#172!183?C$#200!184?C$#181!185?C$#229!186?C$#238!187?C$#248!188?CC$#247!190?C$#248!191?CC$#250!193?C$#249!194?C$#248!195?C$#241!196?C$#245!197?C$#241!198?CC$#230!200?C$#229!201?C$#228!202?C$#227!203?C$#209!204?C$#211!205?C$#240!206?C$#228!207?CC$#183!209?CCC$#179!212?C$#192!213?C$#179!214?C$#183!215?CC$#213!217?CC$#241!219?C$#250!220?C$#254!221?C$#252!222?C$#251!223?CCCCCCC$#252!230?C$#251!231?CC$#204!233?C$#187!234?C$#147!235?C$#131!236?C$#193!237?C$#204!238?C$#219!239?C$#206!240?C$#232!241?C$#242!242?CCC$#243!245?C$#242!246?C$#243!247?CCC$#250!250?C$#251!251?C$#250!252?C$#243!253?C$#239!254?C$#231!255?C$#235!256?C$#243!257?CCC$#244!260?CCC$#246!263?C$#247!264?C$#243!265?C$#247!266?C$#245!267?C$#4GG$#11!2?GG$#18!4?GGGGG$#22!9?G$#18!10?G$#27!11?G$#23!12?GG$#32!14?G$#23!15?G$#34!16?G$#32!17?G$#36!18?G$#31!19?G$#27!20?G$#30!21?GG$#27!23?GGGG$#18!27?G$#24!28?G$#19!29?GGGG$#11!33?G$#4!34?G$#5!35?G$#4!36?G$#7!37?G$#4!38?GGG$#11!41?GG$#21!43?G$#7!44?G$#14!45?G$#7!46?GG$#14!48?G$#12!49?G$#21!50?G$#12!51?G$#7!52?G$#11!53?G$#21!54?G$#11!55?G$#7!56?GG$#1!58?GG$#7!60?G$#1!61?G$#7!62?G$#1!63?G$#4!64?GGG$#18!67?G$#4!68?G$#19!69?G$#27!70?GGG$#22!73?G$#41!74?G$#54!75?G$#65!76?G$#100!77?G$#97!78?G$#90!79?G$#97!80?G$#125!81?G$#143!82?G$#108!83?G$#86!84?G$#116!85?G$#126!86?G$#79!87?G$#59!88?G$#92!89?G$#99!90?G$#159!91?G$#146!92?G$#133!93?G$#125!94?G$#113!95?G$#119!96?G$#97!97?GG$#158!99?G$#159!100?G$#144!101?G$#156!102?G$#192!103?GG$#151!105?G$#100!106?G$#135!107?G$#146!108?G$#135!109?G$#127!110?G$#103!111?G$#41!112?G$#14!113?G$#30!114?G$#47!115?G$#92!116?G$#99!117?G$#155!118?G$#181!119?G$#155!120?G$#170!121?G$#128!122?G$#121!123?G$#113!124?GG$#97!126?G$#113!127?GG$#133!129?G$#120!130?G$#158!131?GG$#170!133?G$#133!134?G$#120!135?G$#158!136?G$#213!137?G$#237!138?G$#228!139?G$#241!140?G$#253!141?G$#254!142?G$#251!143?G$#249!144?G$#252!145?G$#249!146?G$#222!147?G$#242!148?G$#244!149?G$#235!150?G$#242!151?G$#246!152?G$#243!153?G$#247!154?GG$#249!156?G$#244!157?G$#246!158?G$#244!159?G$#247!160?GGG$#246!163?G$#247!164?GGG$#248!167?GGG$#241!170?G$#244!171?G$#246!172?G$#241!173?G$#235!174?G$#236!175?GG$#227!177?GG$#200!179?G$#177!180?GG$#155!182?G$#158!183?G$#181!184?G$#200!185?GG$#229!187?G$#238!188?G$#240!189?G$#248!190?GGGGGGG$#246!197?G$#248!198?G$#241!199?GG$#227!201?G$#209!202?GGG$#230!205?G$#228!206?GG$#210!208?G$#183!209?G$#156!210?G$#183!211?G$#173!212?G$#167!213?G$#192!214?GG$#209!216?G$#213!217?G$#229!218?G$#241!219?G$#249!220?G$#254!221?G$#253!222?G$#251!223?GG$#254!225?G$#251!226?GGGGGG$#205!232?G$#219!233?G$#232!234?G$#215!235?G$#148!236?G$#219!237?G$#232!238?GGG$#220!241?G$#219!242?G$#239!243?G$#243!244?G$#242!245?G$#243!246?GGG$#251!249?GG$#249!251?G$#247!252?G$#243!253?G$#234!254?G$#224!255?G$#235!256?G$#243!257?G$#242!258?G$#244!259?GG$#236!261?GG$#244!263?G$#249!264?G$#243!265?G$#246!266?G$#236!267?G$#11O$#4!1?O$#11!2?O$#18!3?O$#11!4?O$#18!5?O$#24!6?O$#18!7?O$#11!8?O$#24!9?O$#27!10?O$#24!11?O$#30!12?O$#22!13?O$#30!14?O$#34!15?OO$#32!17?O$#31!18?OO$#27!20?O$#22!21?O$#30!22?O$#27!23?OO$#22!25?O$#27!26?O$#22!27?O$#18!28?O$#19!29?O$#21!30?O$#11!31?O$#19!32?O$#4!33?OOO$#7!36?O$#4!37?O$#11!38?O$#5!39?O$#7!40?O$#11!41?OO$#12!43?O$#14!44?O$#12!45?O$#14!46?O$#7!47?O$#14!48?O$#7!49?O$#21!50?O$#12!51?OO$#7!53?OO$#21!55?O$#11!56?O$#7!57?OO$#1!59?OO$#7!61?O$#1!62?O$#5!63?O$#7!64?O$#4!65?OO$#5!67?O$#30!68?O$#27!69?OO$#30!71?O$#32!72?O$#38!73?O$#54!74?O$#65!75?O$#90!76?O$#99!77?O$#61!78?O$#90!79?O$#139!80?O$#90!81?OO$#135!83?O$#103!84?O$#58!85?O$#99!86?O$#58!87?O$#116!88?O$#110!89?O$#107!90?O$#116!91?O$#112!92?O$#146!93?O$#144!94?O$#156!95?O$#151!96?O$#183!97?O$#165!98?O$#183!99?O$#172!100?O$#164!101?O$#183!102?O$#167!103?O$#183!104?O$#151!105?O$#127!106?OO$#135!108?O$#138!109?OO$#159!111?O$#103!112?O$#48!113?O$#19!114?O$#41!115?O$#91!116?O$#146!117?O$#154!118?O$#146!119?O$#164!120?O$#158!121?OO$#128!123?O$#145!124?O$#158!125?OO$#113!127?O$#129!128?O$#114!129?O$#144!130?O$#170!131?O$#129!132?O$#161!133?O$#170!134?O$#145!135?O$#158!136?O$#229!137?O$#240!138?O$#229!139?O$#213!140?O$#248!141?O$#250!142?O$#249!143?O$#232!144?O$#252!145?O$#251!146?O$#234!147?O$#242!148?O$#234!149?O$#239!150?O$#247!151?O$#249!152?OO$#243!154?O$#247!155?O$#244!156?O$#246!157?O$#247!158?O$#244!159?O$#241!160?OO$#246!162?O$#248!163?OOO$#247!166?O$#246!167?O$#241!168?OOOOOOOO$#235!176?O$#228!177?O$#213!178?O$#209!179?O$#192!180?OO$#172!182?O$#144!183?O$#170!184?O$#200!185?O$#229!186?O$#233!187?O$#240!188?O$#248!189?OO$#253!191?O$#248!192?OOOOOO$#247!198?O$#241!199?O$#240!200?O$#228!201?O$#209!202?OO$#227!204?O$#230!205?O$#228!206?O$#227!207?O$#210!208?O$#198!209?O$#179!210?OOO$#183!213?O$#192!214?O$#183!215?O$#209!216?O$#228!217?O$#213!218?O$#247!219?O$#248!220?O$#253!221?O$#254!222?OOO$#252!225?O$#251!226?OOO$#250!229?O$#232!230?O$#214!231?O$#243!232?O$#251!233?OO$#239!235?O$#147!236?O$#219!237?O$#239!238?O$#242!239?OOO$#234!242?O$#220!243?O$#222!244?O$#239!245?O$#242!246?O$#243!247?O$#251!248?O$#243!249?O$#249!250?OO$#247!252?O$#243!253?O$#235!254?OOO$#239!257?O$#243!258?O$#244!259?O$#236!260?O$#244!261?OO$#247!263?O$#246!264?O$#243!265?O$#244!266?O$#247!267?O$#4_$#11!1?___$#18!4?____$#24!8?_$#27!9?_$#24!10?_$#27!11?_$#18!12?_$#30!13?__$#34!15?_$#32!16?_$#34!17?_$#31!18?___$#22!21?__$#27!23?___$#24!26?___$#19!29?__$#18!31?_$#11!32?__$#5!34?_$#4!35?_$#7!36?__$#5!38?_$#19!39?_$#7!40?___$#12!43?_$#14!44?_$#12!45?___$#5!48?_$#21!49?_$#12!50?__$#14!52?__$#11!54?__$#7!56?_$#1!57?_$#7!58?_$#11!59?_$#7!60?_$#1!61?__$#7!63?__$#4!65?__$#21!67?_$#24!68?_$#18!69?_$#36!70?_$#32!71?_$#34!72?_$#47!73?_$#79!74?_$#102!75?_$#112!76?_$#90!77?_$#87!78?_$#105!79?_$#119!80?_$#125!81?_$#133!82?_$#155!83?_$#100!84?_$#125!85?_$#112!86?_$#117!87?_$#65!88?_$#88!89?_$#110!90?__$#105!92?_$#112!93?_$#125!94?_$#179!95?__$#164!97?_$#179!98?_$#183!99?_$#164!100?_$#213!101?_$#198!102?_$#164!103?_$#151!104?_$#127!105?___$#135!108?__$#140!110?_$#135!111?_$#123!112?_$#92!113?_$#36!114?_$#44!115?_$#99!116?_$#151!117?_$#183!118?_$#192!119?_$#198!120?_$#177!121?_$#161!122?_$#141!123?_$#161!124?_$#113!125?_$#161!126?__$#158!128?__$#200!130?__$#133!132?_$#158!133?_$#133!134?_$#120!135?__$#229!137?_$#241!138?_$#238!139?_$#121!140?_$#241!141?_$#252!142?_$#251!143?_$#250!144?_$#251!145?_$#243!146?_$#242!147?_$#235!148?_$#243!149?_$#247!150?_$#249!151?_$#243!152?_$#249!153?___$#247!156?_$#244!157?_$#246!158?__$#247!160?_$#246!161?_$#247!162?_$#240!163?_$#241!164?__$#247!166?_$#246!167?_$#241!168?__$#230!170?_$#233!171?_$#241!172?__$#240!174?_$#241!175?__$#213!177?_$#209!178?_$#198!179?_$#183!180?_$#172!181?_$#151!182?_$#172!183?_$#181!184?_$#200!185?_$#213!186?_$#240!187?_$#241!188?_$#237!189?_$#248!190?____$#247!194?__$#248!196?_$#247!197?_$#244!198?_$#240!199?_$#230!200?_$#228!201?_$#209!202?__$#228!204?_$#229!205?_$#210!206?_$#227!207?_$#210!208?_$#183!209?_$#198!210?_$#183!211?_$#165!212?_$#192!213?_$#196!214?_$#179!215?_$#209!216?_$#240!217?_$#230!218?_$#240!219?_$#248!220?__$#253!222?_$#250!223?_$#249!224?_$#251!225?_$#249!226?_$#244!227?_$#234!228?_$#153!229?_$#232!230?_$#252!231?_$#254!232?___$#239!235?_$#142!236?_$#221!237?_$#239!238?_$#243!239?___$#251!242?_$#243!243?_$#219!244?_$#222!245?_$#242!246?_$#239!247?_$#243!248?_$#242!249?_$#246!250?_$#247!251?_$#246!252?_$#243!253?_$#231!254?_$#224!255?_$#235!256?_$#243!257?__$#244!259?____$#247!263?_$#249!264?_$#247!265?_$#244!266?__$-#11@$#4!1?@$#11!2?@$#18!3?@$#11!4?@$#18!5?@$#24!6?@@@$#30!9?@$#18!10?@$#30!11?@$#27!12?@$#11!13?@$#27!14?@$#23!15?@$#34!16?@$#36!17?@$#31!18?@$#30!19?@$#31!20?@@$#27!22?@$#31!23?@$#30!24?@$#27!25?@$#30!26?@$#24!27?@$#18!28?@$#21!29?@$#11!30?@@$#4!32?@$#5!33?@$#11!34?@@@$#4!37?@$#11!38?@@$#4!40?@$#11!41?@$#7!42?@$#5!43?@$#12!44?@$#5!45?@$#14!46?@$#12!47?@$#11!48?@$#7!49?@$#5!50?@@$#4!52?@$#14!53?@$#9!54?@$#7!55?@$#11!56?@@$#1!58?@$#7!59?@@$#5!61?@@$#7!63?@@$#11!65?@$#4!66?@$#21!67?@$#31!68?@$#11!69?@$#24!70?@$#22!71?@$#47!72?@$#88!73?@@$#112!75?@$#90!76?@$#105!77?@$#119!78?@$#129!79?@$#120!80?@@$#100!82?@$#105!83?@$#133!84?@$#119!85?@$#99!86?@$#87!87?@$#135!88?@$#100!89?@$#86!90?@$#125!91?@@$#144!93?@$#139!94?@$#164!95?@$#135!96?@$#163!97?@$#167!98?@$#213!99?@$#210!100?@$#179!101?@$#172!102?@$#179!103?@$#103!104?@@@@$#107!108?@$#138!109?@$#123!110?@$#135!111?@$#138!112?@$#123!113?@$#67!114?@$#41!115?@$#92!116?@$#172!117?@$#192!118?@$#209!119?@$#183!120?@$#181!121?@$#128!122?@$#113!123?@@$#161!125?@$#120!126?@$#141!127?@$#121!128?@$#133!129?@$#181!130?@$#200!131?@$#141!132?@$#113!133?@$#133!134?@$#97!135?@$#135!136?@$#198!137?@$#248!138?@$#229!139?@$#183!140?@$#244!141?@$#252!142?@$#251!143?@$#231!144?@$#249!145?@$#234!146?@$#249!147?@$#244!148?@@$#243!150?@$#247!151?@$#243!152?@$#249!153?@$#246!154?@$#249!155?@@$#247!157?@$#244!158?@@$#247!160?@@$#246!162?@$#247!163?@@$#240!165?@@$#233!167?@@$#228!169?@$#229!170?@$#213!171?@$#228!172?@$#229!173?@$#233!174?@$#229!175?@$#228!176?@$#230!177?@$#213!178?@$#183!179?@$#179!180?@$#182!181?@$#155!182?@$#145!183?@$#161!184?@$#200!185?@$#229!186?@$#240!187?@$#248!188?@@@$#241!191?@$#248!192?@@@$#250!195?@$#249!196?@@$#246!198?@$#247!199?@$#230!200?@$#209!201?@$#192!202?@$#210!203?@$#229!204?@$#228!205?@$#213!206?@$#228!207?@$#198!208?@$#209!209?@$#213!210?@$#183!211?@$#167!212?@$#183!213?@$#198!214?@$#209!215?@$#192!216?@$#228!217?@$#233!218?@$#238!219?@$#240!220?@$#248!221?@$#241!222?@@$#213!224?@$#226!225?@$#250!226?@$#252!227?@$#224!228?@$#232!229?@$#254!230?@@@@@$#239!235?@$#157!236?@$#223!237?@$#239!238?@$#243!239?@@$#251!241?@@@$#242!244?@$#239!245?@$#243!246?@@@$#234!249?@@$#245!251?@$#244!252?@$#242!253?@$#231!254?@$#225!255?@$#235!256?@$#234!257?@@$#244!259?@$#235!260?@$#236!261?@$#244!262?@$#243!263?@@$#249!265?@$#246!266?@$#244!267?@$#11AA$#18!2?A$#11!3?AA$#18!5?A$#27!6?A$#18!7?AA$#27!9?AAA$#32!12?AA$#30!14?A$#32!15?AA$#22!17?A$#30!18?A$#36!19?A$#27!20?A$#30!21?AA$#27!23?A$#22!24?A$#30!25?AA$#24!27?AA$#19!29?A$#11!30?A$#19!31?A$#11!32?A$#19!33?A$#11!34?A$#4!35?A$#11!36?A$#5!37?A$#11!38?A$#1!39?A$#4!40?AA$#11!42?A$#12!43?A$#14!44?A$#7!45?A$#9!46?A$#11!47?AA$#12!49?A$#14!50?A$#11!51?A$#4!52?A$#19!53?A$#11!54?AA$#7!56?AAAAA$#5!61?A$#1!62?AA$#7!64?AA$#4!66?A$#24!67?A$#31!68?A$#27!69?A$#34!70?A$#66!71?A$#105!72?A$#90!73?A$#105!74?A$#115!75?A$#119!76?A$#114!77?A$#121!78?A$#133!79?A$#139!80?A$#133!81?A$#162!82?A$#115!83?A$#112!84?A$#139!85?A$#144!86?A$#133!87?A$#90!88?A$#87!89?A$#146!90?A$#115!91?AAA$#113!94?A$#145!95?A$#144!96?A$#143!97?A$#210!98?A$#192!99?A$#198!100?A$#209!101?A$#183!102?A$#164!103?A$#75!104?A$#94!105?A$#107!106?A$#123!107?AAAA$#111!111?A$#138!112?A$#103!113?A$#71!114?A$#43!115?A$#88!116?A$#139!117?A$#198!118?A$#209!119?A$#164!120?A$#158!121?A$#129!122?A$#133!123?A$#120!124?A$#129!125?A$#146!126?A$#145!127?A$#125!128?A$#162!129?A$#170!130?A$#181!131?A$#161!132?A$#90!133?A$#146!134?A$#115!135?A$#144!136?A$#230!137?A$#250!138?A$#245!139?A$#231!140?A$#245!141?A$#251!142?A$#250!143?A$#236!144?A$#243!145?A$#244!146?A$#235!147?A$#243!148?A$#242!149?A$#250!150?A$#249!151?A$#252!152?A$#251!153?A$#246!154?A$#247!155?A$#249!156?A$#247!157?A$#246!158?A$#244!159?AA$#246!161?A$#244!162?AA$#246!164?A$#247!165?A$#240!166?A$#238!167?AA$#229!169?A$#210!170?A$#229!171?AA$#213!173?A$#228!174?A$#240!175?A$#228!176?A$#210!177?A$#209!178?A$#198!179?A$#200!180?A$#159!181?A$#146!182?A$#158!183?A$#161!184?A$#200!185?A$#229!186?A$#233!187?A$#240!188?A$#248!189?AAAAAA$#246!195?A$#247!196?A$#241!197?A$#236!198?A$#225!199?A$#209!200?A$#183!201?A$#192!202?A$#229!203?AA$#213!205?AAAA$#209!209?A$#198!210?A$#179!211?A$#192!212?A$#167!213?A$#192!214?A$#211!215?A$#209!216?A$#213!217?AA$#233!219?AAA$#208!222?A$#207!223?A$#250!224?A$#252!225?A$#254!226?AAAAAAAA$#251!234?A$#239!235?A$#168!236?A$#232!237?A$#239!238?A$#243!239?AA$#251!241?AAAAAAAA$#250!249?A$#243!250?A$#235!251?A$#231!252?A$#234!253?A$#231!254?A$#225!255?A$#231!256?A$#232!257?A$#242!258?A$#231!259?A$#235!260?A$#244!261?AAA$#243!264?A$#244!265?A$#236!266?A$#244!267?A$#11CC$#18!2?C$#4!3?C$#11!4?C$#24!5?C$#22!6?CC$#24!8?C$#22!9?CC$#27!11?C$#23!12?C$#32!13?C$#31!14?C$#34!15?C$#32!16?C$#36!17?C$#30!18?C$#31!19?CCC$#27!22?C$#30!23?C$#27!24?C$#22!25?C$#27!26?C$#18!27?CCC$#21!30?C$#19!31?C$#4!32?C$#11!33?C$#7!34?C$#11!35?C$#5!36?C$#4!37?C$#11!38?C$#7!39?C$#11!40?CC$#7!42?C$#11!43?CC$#4!45?C$#5!46?CC$#11!48?C$#12!49?C$#11!50?C$#4!51?C$#11!52?C$#19!53?C$#21!54?C$#11!55?C$#1!56?C$#7!57?CC$#11!59?C$#7!60?C$#5!61?CC$#7!63?C$#1!64?C$#21!65?C$#5!66?C$#11!67?C$#30!68?C$#36!69?C$#99!70?C$#112!71?C$#113!72?C$#108!73?C$#119!74?C$#129!75?C$#113!76?C$#121!77?C$#112!78?C$#145!79?C$#120!80?C$#146!81?C$#155!82?C$#133!83?C$#114!84?C$#120!85?CC$#112!87?CC$#100!89?C$#115!90?CC$#90!92?C$#112!93?C$#90!94?C$#146!95?C$#115!96?C$#162!97?C$#144!98?C$#192!99?C$#167!100?C$#227!101?C$#207!102?C$#126!103?C$#94!104?C$#109!105?CC$#104!107?C$#106!108?C$#131!109?C$#178!110?C$#96!111?C$#123!112?C$#103!113?C$#71!114?C$#41!115?C$#86!116?C$#155!117?C$#183!118?C$#172!119?C$#158!120?C$#141!121?C$#90!122?C$#114!123?C$#120!124?C$#105!125?C$#164!126?C$#158!127?C$#155!128?C$#144!129?C$#207!130?CC$#170!132?C$#113!133?C$#133!134?C$#151!135?C$#170!136?C$#230!137?C$#247!138?CC$#155!140?C$#231!141?C$#249!142?C$#246!143?CC$#243!145?C$#231!146?C$#246!147?C$#243!148?C$#247!149?C$#249!150?CCCCC$#243!155?C$#244!156?C$#247!157?CC$#244!159?C$#236!160?C$#247!161?C$#248!162?C$#246!163?C$#240!164?CC$#238!166?C$#233!167?C$#237!168?C$#229!169?C$#208!170?CC$#213!172?C$#228!173?C$#210!174?C$#229!175?C$#213!176?C$#227!177?C$#210!178?C$#179!179?C$#151!180?C$#156!181?C$#164!182?C$#139!183?C$#181!184?C$#207!185?C$#208!186?C$#229!187?C$#238!188?C$#248!189?CCCCCCC$#244!196?C$#241!197?C$#236!198?C$#209!199?C$#196!200?C$#182!201?C$#209!202?C$#229!203?C$#238!204?C$#229!205?C$#213!206?C$#210!207?C$#213!208?C$#183!209?C$#227!210?C$#198!211?C$#192!212?C$#167!213?C$#182!214?C$#211!215?C$#209!216?C$#213!217?C$#200!218?C$#208!219?CC$#233!221?C$#247!222?C$#252!223?C$#254!224?CCCCCCCCCC$#251!234?C$#222!235?C$#147!236?C$#232!237?CC$#242!239?C$#243!240?C$#251!241?CCCCCC$#243!247?C$#251!248?CCC$#249!251?C$#243!252?C$#234!253?C$#235!254?C$#224!255?CC$#222!257?C$#223!258?C$#224!259?C$#236!260?C$#225!261?C$#244!262?CC$#247!264?C$#244!265?CC$#241!267?C$#11GGG$#18!3?GG$#11!5?G$#18!6?GG$#22!8?G$#18!9?G$#30!10?GGG$#23!13?G$#27!14?G$#30!15?G$#23!16?G$#36!17?G$#23!18?G$#34!19?G$#30!20?GGG$#18!23?G$#22!24?G$#30!25?G$#11!26?G$#22!27?G$#24!28?G$#11!29?G$#21!30?G$#11!31?GG$#7!33?G$#5!34?G$#4!35?G$#7!36?G$#4!37?G$#11!38?GG$#7!40?G$#11!41?G$#12!42?G$#7!43?G$#5!44?G$#11!45?G$#14!46?G$#11!47?G$#19!48?G$#11!49?G$#21!50?G$#4!51?G$#11!52?G$#4!53?G$#21!54?GGG$#1!57?G$#7!58?G$#1!59?GGGG$#7!63?G$#1!64?G$#7!65?G$#4!66?G$#11!67?G$#36!68?G$#99!69?G$#119!70?G$#121!71?G$#113!72?G$#119!73?G$#105!74?G$#90!75?G$#121!76?G$#141!77?G$#121!78?G$#129!79?G$#155!80?G$#159!81?G$#115!82?G$#155!83?G$#133!84?G$#120!85?G$#145!86?G$#121!87?G$#120!88?G$#125!89?G$#87!90?G$#90!91?G$#116!92?G$#90!93?G$#97!94?G$#113!95?G$#146!96?G$#121!97?G$#115!98?G$#198!99?G$#179!100?GG$#126!102?G$#59!103?G$#106!104?G$#69!105?G$#64!106?G$#39!107?GG$#51!109?G$#77!110?G$#109!111?G$#123!112?G$#96!113?G$#71!114?G$#42!115?G$#99!116?G$#163!117?G$#198!118?G$#164!119?G$#158!120?G$#133!121?G$#115!122?G$#177!123?G$#139!124?G$#162!125?G$#121!126?G$#144!127?G$#163!128?G$#145!129?G$#163!130?G$#181!131?G$#208!132?G$#170!133?G$#161!134?G$#100!135?G$#110!136?G$#233!137?G$#253!138?G$#248!139?G$#198!140?G$#236!141?G$#248!142?G$#247!143?G$#236!144?G$#254!145?G$#235!146?G$#253!147?G$#249!148?GGGGGGG$#247!155?G$#246!156?GG$#247!158?G$#246!159?GG$#241!161?G$#244!162?G$#241!163?GG$#237!165?G$#233!166?GG$#229!168?G$#213!169?G$#208!170?G$#207!171?G$#213!172?GG$#229!174?G$#200!175?G$#207!176?G$#213!177?G$#198!178?G$#179!179?G$#172!180?G$#163!181?G$#120!182?G$#145!183?G$#161!184?G$#207!185?G$#238!186?G$#229!187?G$#237!188?G$#241!189?G$#237!190?G$#241!191?G$#240!192?GG$#247!194?G$#244!195?GG$#227!197?G$#196!198?GG$#179!200?G$#165!201?G$#227!202?G$#229!203?GGG$#213!206?GG$#198!208?GG$#213!210?G$#192!211?GG$#153!213?G$#211!214?G$#192!215?G$#212!216?G$#227!217?G$#240!218?GG$#241!220?G$#249!221?G$#254!222?GGGGGGGGGGG$#252!233?G$#242!234?G$#218!235?G$#157!236?G$#234!237?G$#239!238?G$#234!239?G$#243!240?G$#250!241?G$#251!242?GGGGGGGGG$#250!251?G$#243!252?G$#242!253?G$#239!254?G$#231!255?GG$#223!257?GG$#236!259?G$#231!260?G$#236!261?GG$#244!263?G$#243!264?G$#246!265?G$#241!266?G$#244!267?G$#11OO$#4!2?O$#18!3?O$#11!4?O$#23!5?OO$#22!7?O$#18!8?O$#27!9?OOO$#30!12?OOO$#23!15?O$#34!16?O$#30!17?OO$#32!19?O$#36!20?O$#30!21?O$#22!22?O$#30!23?O$#27!24?OOO$#22!27?O$#27!28?O$#19!29?OO$#4!31?O$#5!32?O$#11!33?O$#19!34?O$#11!35?OO$#5!37?O$#11!38?OO$#7!40?O$#11!41?O$#14!42?O$#7!43?O$#11!44?O$#12!45?OO$#11!47?OOOOO$#7!52?O$#11!53?OOO$#21!56?O$#7!57?OOOO$#1!61?O$#7!62?OO$#1!64?O$#7!65?O$#4!66?O$#39!67?O$#105!68?O$#129!69?O$#121!70?O$#155!71?O$#119!72?O$#114!73?O$#120!74?O$#121!75?O$#122!76?O$#133!77?O$#141!78?O$#158!79?O$#170!80?O$#144!81?OOO$#121!84?O$#114!85?O$#121!86?O$#119!87?O$#129!88?O$#112!89?O$#135!90?O$#112!91?O$#97!92?O$#105!93?O$#112!94?O$#115!95?O$#113!96?O$#145!97?O$#181!98?O$#172!99?O$#210!100?O$#172!101?O$#146!102?O$#58!103?O$#138!104?OO$#131!106?O$#123!107?O$#111!108?O$#131!109?OO$#138!111?OO$#94!113?O$#48!114?O$#44!115?O$#126!116?O$#141!117?O$#200!118?O$#113!119?O$#112!120?O$#105!121?O$#121!122?O$#144!123?O$#181!124?O$#177!125?O$#119!126?O$#144!127?O$#135!128?O$#181!129?O$#163!130?O$#155!131?O$#229!132?OO$#200!134?O$#146!135?O$#88!136?O$#209!137?O$#249!138?O$#246!139?O$#235!140?O$#242!141?O$#247!142?O$#231!143?O$#244!144?O$#249!145?OO$#243!147?O$#249!148?OO$#251!150?O$#250!151?O$#249!152?O$#247!153?OOO$#246!156?O$#247!157?OO$#244!159?OOO$#241!162?O$#233!163?O$#229!164?O$#237!165?O$#228!166?O$#229!167?OO$#213!169?O$#207!170?OO$#208!172?O$#213!173?O$#208!174?O$#213!175?O$#210!176?O$#181!177?O$#172!178?O$#198!179?O$#164!180?O$#158!181?OO$#161!183?O$#200!184?OO$#208!186?O$#237!187?OO$#238!189?O$#240!190?O$#248!191?OO$#247!193?O$#240!194?O$#241!195?O$#227!196?O$#192!197?O$#183!198?OO$#192!200?OO$#229!202?OOOOO$#213!207?O$#210!208?O$#198!209?O$#183!210?O$#198!211?O$#183!212?O$#167!213?O$#182!214?O$#211!215?O$#226!216?O$#230!217?O$#240!218?O$#248!219?OO$#254!221?OOOOOOOOOOOO$#251!233?O$#243!234?O$#222!235?O$#165!236?O$#232!237?O$#239!238?O$#242!239?OO$#243!241?O$#250!242?O$#251!243?OOOOOO$#250!249?O$#251!250?O$#250!251?O$#247!252?O$#243!253?O$#242!254?O$#231!255?O$#224!256?O$#223!257?O$#234!258?O$#236!259?O$#235!260?O$#236!261?O$#244!262?O$#243!263?OO$#244!265?OOO$#11_$#4!1?_$#11!2?_$#24!3?_$#22!4?__$#18!6?_$#22!7?__$#23!9?__$#27!11?_$#31!12?_$#30!13?__$#34!15?_$#15!16?_$#30!17?_$#34!18?__$#30!20?_$#27!21?___$#22!24?_$#27!25?_$#30!26?__$#24!28?_$#18!29?_$#11!30?__$#19!32?_$#5!33?_$#19!34?_$#11!35?_$#7!36?__$#11!38?_$#7!39?_$#11!40?_$#7!41?_$#11!42?_$#7!43?_$#14!44?__$#11!46?__$#7!48?_$#21!49?_$#19!50?_$#11!51?______$#7!57?__$#1!59?_$#7!60?_$#1!61?_$#7!62?__$#1!64?_$#19!65?_$#7!66?_$#99!67?_$#115!68?_$#119!69?_$#133!70?_$#139!71?__$#155!73?_$#159!74?_$#129!75?_$#113!76?_$#128!77?_$#158!78?_$#163!79?_$#144!80?_$#158!81?_$#146!82?_$#129!83?__$#145!85?_$#141!86?__$#139!88?_$#121!89?_$#87!90?_$#135!91?_$#97!92?_$#105!93?__$#146!95?_$#105!96?_$#139!97?_$#177!98?_$#200!99?_$#154!100?_$#192!101?_$#126!102?_$#138!103?_$#150!104?__$#152!106?_$#157!107?_$#138!108?_$#149!109?_$#157!110?_$#147!111?_$#123!112?_$#73!113?_$#44!114?_$#47!115?_$#125!116?_$#162!117?_$#200!118?_$#119!119?_$#88!120?_$#113!121?_$#145!122?_$#181!123?_$#158!124?_$#208!125?_$#125!126?_$#112!127?_$#207!128?_$#155!129?_$#213!130?__$#210!132?_$#228!133?_$#210!134?_$#213!135?_$#209!136?_$#252!137?__$#244!139?_$#209!140?_$#243!141?_$#244!142?_$#235!143?_$#247!144?__$#254!146?_$#249!147?_$#253!148?_$#250!149?_$#246!150?_$#249!151?___$#247!154?_$#246!155?_$#247!156?_$#244!157?_$#246!158?_$#247!159?_$#246!160?_$#244!161?_$#240!162?__$#233!164?_$#229!165?___$#213!168?__$#208!170?_$#207!171?_$#208!172?_$#229!173?_$#213!174?___$#198!177?_$#164!178?_$#172!179?_$#164!180?_$#179!181?_$#129!182?_$#161!183?_$#200!184?_$#208!185?_$#233!186?__$#248!188?_$#247!189?_$#233!190?_$#240!191?_$#248!192?_$#241!193?_$#238!194?_$#240!195?_$#241!196?_$#236!197?_$#209!198?_$#183!199?_$#182!200?_$#192!201?_$#233!202?__$#208!204?__$#229!206?_$#208!207?_$#213!208?__$#210!210?_$#192!211?_$#210!212?_$#167!213?_$#182!214?_$#211!215?_$#227!216?_$#226!217?_$#245!218?_$#248!219?_$#249!220?_$#254!221?___________$#252!232?_$#244!233?_$#224!234?_$#219!235?_$#165!236?_$#232!237?__$#222!239?_$#232!240?_$#239!241?_$#243!242?__$#251!244?_____$#250!249?__$#249!251?_$#243!252?_$#242!253?_$#235!254?__$#231!256?_$#232!257?_$#242!258?_$#244!259?_$#236!260?__$#244!262?_$#243!263?__$#244!265?_$#236!266?_$#235!267?_$-#18@@$#4!2?@$#24!3?@$#22!4?@$#24!5?@@$#27!7?@$#22!8?@$#27!9?@$#23!10?@@$#34!12?@$#36!13?@$#34!14?@$#32!15?@@$#30!17?@$#36!18?@$#27!19?@$#30!20?@@@$#27!23?@$#31!24?@$#27!25?@@$#22!27?@$#24!28?@$#27!29?@$#21!30?@$#11!31?@$#19!32?@$#11!33?@$#4!34?@$#7!35?@@@@$#11!39?@$#5!40?@$#7!41?@$#11!42?@$#21!43?@$#14!44?@$#11!45?@$#7!46?@$#11!47?@@@@$#7!51?@$#19!52?@$#11!53?@$#19!54?@$#11!55?@@$#7!57?@$#11!58?@$#7!59?@@@@@$#11!64?@$#20!65?@$#110!66?@$#133!67?@$#115!68?@$#119!69?@$#146!70?@@$#133!72?@$#121!73?@$#119!74?@$#115!75?@$#119!76?@$#145!77?@$#161!78?@$#155!79?@$#158!80?@$#155!81?@$#115!82?@$#146!83?@$#129!84?@$#113!85?@$#121!86?@$#161!87?@$#141!88?@$#122!89?@$#145!90?@$#97!91?@$#114!92?@$#112!93?@$#129!94?@$#113!95?@@$#161!97?@$#170!98?@$#229!99?@$#183!100?@$#173!101?@$#117!102?@$#150!103?@$#172!104?@@$#157!106?@$#220!107?@$#242!108?@$#168!109?@$#148!110?@$#150!111?@$#103!112?@$#48!113?@$#37!114?@$#58!115?@$#139!116?@$#156!117?@$#119!118?@$#115!119?@$#100!120?@$#120!121?@$#164!122?@$#181!123?@$#164!124?@@$#181!126?@$#210!127?@$#172!128?@$#200!129?@$#179!130?@$#198!131?@$#229!132?@$#227!133?@$#230!134?@$#226!135?@$#236!136?@$#246!137?@$#244!138?@$#226!139?@$#247!140?@$#244!141?@$#231!142?@$#236!143?@$#249!144?@@@$#250!147?@@@@$#247!151?@$#249!152?@@@$#246!155?@@$#247!157?@$#244!158?@$#246!159?@@$#241!161?@$#228!162?@$#233!163?@$#230!164?@$#228!165?@$#208!166?@@@$#200!169?@@$#208!171?@$#207!172?@$#200!173?@$#228!174?@$#213!175?@$#198!176?@$#210!177?@$#151!178?@$#146!179?@$#156!180?@$#144!181?@$#141!182?@$#170!183?@$#177!184?@$#229!185?@@$#241!187?@$#237!188?@$#240!189?@$#248!190?@$#240!191?@@$#247!193?@$#240!194?@@$#246!196?@$#241!197?@$#227!198?@$#209!199?@$#196!200?@$#209!201?@$#229!202?@$#233!203?@$#229!204?@$#207!205?@$#229!206?@$#213!207?@$#207!208?@$#210!209?@$#209!210?@@$#192!212?@$#196!213?@$#179!214?@$#176!215?@$#211!216?@$#227!217?@$#241!218?@$#247!219?@$#250!220?@$#253!221?@$#254!222?@@@@@@@@$#252!230?@$#247!231?@$#235!232?@$#226!233?@$#219!234?@$#205!235?@$#168!236?@$#222!237?@$#220!238?@@$#221!240?@$#231!241?@$#234!242?@$#243!243?@$#250!244?@@@$#251!247?@@$#249!249?@@$#250!251?@$#243!252?@$#242!253?@$#235!254?@@@@@$#244!259?@@@@@$#236!264?@@@@$#24A$#22!1?A$#18!2?A$#22!3?A$#27!4?A$#24!5?AA$#22!7?AA$#27!9?A$#23!10?AA$#27!12?A$#34!13?A$#32!14?A$#30!15?A$#22!16?A$#27!17?A$#30!18?AAA$#31!21?A$#18!22?A$#27!23?A$#24!24?A$#27!25?A$#30!26?A$#27!27?A$#11!28?A$#18!29?A$#19!30?A$#11!31?AAAA$#21!35?A$#1!36?A$#7!37?A$#11!38?A$#12!39?A$#1!40?A$#11!41?AA$#7!43?A$#11!44?A$#4!45?A$#11!46?AAA$#5!49?A$#11!50?AAA$#19!53?AA$#11!55?A$#7!56?A$#11!57?A$#7!58?A$#1!59?A$#7!60?A$#1!61?A$#7!62?A$#11!63?A$#44!64?A$#115!65?A$#119!66?A$#135!67?A$#119!68?A$#143!69?A$#146!70?A$#129!71?A$#139!72?A$#122!73?A$#129!74?A$#121!75?A$#129!76?A$#163!77?A$#164!78?AA$#172!80?A$#155!81?A$#161!82?A$#162!83?A$#120!84?A$#119!85?A$#141!86?A$#145!87?A$#141!88?A$#158!89?A$#133!90?A$#97!91?A$#119!92?A$#112!93?A$#139!94?A$#120!95?A$#113!96?AA$#159!98?A$#144!99?A$#213!100?A$#165!101?A$#110!102?A$#156!103?A$#163!104?A$#172!105?A$#173!106?A$#165!107?A$#223!108?A$#166!109?A$#157!110?A$#123!111?A$#73!112?A$#43!113?A$#40!114?A$#86!115?A$#155!116?A$#172!117?A$#87!118?A$#108!119?A$#163!120?A$#177!121?A$#207!122?A$#170!123?A$#208!124?A$#213!125?A$#230!126?A$#209!127?A$#213!128?A$#163!129?A$#229!130?A$#198!131?A$#238!132?A$#240!133?A$#227!134?AA$#225!136?A$#244!137?A$#226!138?A$#235!139?A$#244!140?AA$#250!142?A$#249!143?AA$#254!145?A$#250!146?A$#254!147?A$#251!148?A$#250!149?A$#249!150?AAA$#247!153?AA$#246!155?A$#244!156?A$#246!157?A$#236!158?A$#241!159?AAA$#240!162?A$#228!163?A$#207!164?A$#213!165?A$#200!166?A$#208!167?A$#213!168?A$#207!169?A$#200!170?A$#207!171?A$#208!172?A$#213!173?A$#207!174?A$#210!175?AA$#172!177?A$#179!178?A$#143!179?A$#119!180?A$#121!181?A$#161!182?A$#177!183?A$#181!184?A$#208!185?A$#229!186?A$#228!187?A$#240!188?A$#237!189?A$#240!190?A$#238!191?AA$#247!193?A$#241!194?A$#248!195?AAA$#244!198?A$#227!199?A$#192!200?A$#209!201?A$#229!202?AAA$#208!205?AAAA$#200!209?A$#208!210?A$#209!211?A$#198!212?A$#192!213?A$#183!214?A$#173!215?A$#211!216?A$#196!217?A$#244!218?A$#247!219?A$#250!220?A$#253!221?AA$#254!223?AAAAA$#253!228?A$#254!229?A$#250!230?A$#235!231?A$#218!232?A$#211!233?A$#195!234?A$#165!235?A$#168!236?A$#215!237?A$#216!238?AA$#215!240?A$#218!241?A$#221!242?A$#242!243?A$#243!244?AAA$#251!247?AA$#247!249?AA$#243!251?AA$#235!253?AA$#224!255?A$#232!256?A$#234!257?A$#239!258?A$#244!259?AA$#235!261?A$#244!262?A$#246!263?A$#236!264?A$#235!265?A$#244!266?AA$#24C$#18!1?C$#24!2?C$#18!3?CC$#27!5?C$#24!6?C$#27!7?C$#11!8?C$#22!9?C$#27!10?C$#23!11?C$#31!12?C$#32!13?C$#22!14?C$#27!15?C$#32!16?C$#30!17?CC$#22!19?C$#30!20?C$#27!21?CC$#30!23?CCC$#27!26?C$#24!27?CC$#18!29?C$#11!30?CC$#4!32?C$#5!33?C$#19!34?C$#11!35?C$#7!36?C$#4!37?C$#7!38?CC$#11!40?CCCCC$#19!45?C$#11!46?CC$#21!48?CC$#11!50?CCC$#19!53?CC$#4!55?C$#7!56?CC$#1!58?C$#11!59?C$#1!60?CC$#4!62?C$#41!63?C$#105!64?C$#119!65?C$#116!66?C$#119!67?C$#143!68?C$#119!69?CC$#135!71?C$#144!72?C$#155!73?CC$#144!75?C$#146!76?C$#155!77?C$#200!78?C$#177!79?CC$#164!81?C$#170!82?CC$#155!84?C$#125!85?C$#114!86?C$#129!87?C$#162!88?C$#145!89?C$#139!90?C$#158!91?C$#120!92?C$#145!93?C$#129!94?C$#112!95?C$#120!96?C$#129!97?C$#146!98?C$#200!99?C$#167!100?C$#150!101?C$#99!102?C$#154!103?C$#163!104?C$#152!105?C$#183!106?C$#165!107?C$#211!108?C$#165!109?C$#138!110?C$#94!111?C$#48!112?C$#36!113?C$#47!114?C$#99!115?C$#105!116?C$#146!117?C$#90!118?C$#135!119?C$#145!120?C$#163!121?C$#155!122?C$#208!123?C$#229!124?CC$#230!126?C$#209!127?C$#241!128?C$#209!129?CC$#198!131?C$#233!132?C$#227!133?C$#230!134?C$#248!135?C$#236!136?CC$#244!138?C$#246!139?C$#244!140?C$#249!141?C$#250!142?C$#249!143?CCC$#250!146?CC$#249!148?CCC$#246!151?C$#247!152?C$#249!153?C$#247!154?C$#245!155?C$#244!156?C$#241!157?CC$#240!159?C$#241!160?CC$#230!162?C$#229!163?C$#213!164?C$#208!165?C$#207!166?C$#177!167?C$#207!168?C$#200!169?C$#207!170?C$#200!171?C$#213!172?C$#207!173?CC$#200!175?C$#183!176?C$#209!177?C$#164!178?CC$#133!180?C$#129!181?C$#170!182?C$#177!183?C$#208!184?C$#213!185?C$#238!186?C$#229!187?C$#240!188?C$#241!189?C$#240!190?CC$#238!192?CC$#247!194?C$#248!195?CCC$#236!198?CC$#209!200?C$#172!201?C$#213!202?C$#229!203?CC$#208!205?C$#207!206?C$#208!207?CC$#207!209?C$#208!210?C$#198!211?C$#209!212?C$#192!213?C$#182!214?C$#209!215?C$#173!216?C$#211!217?C$#225!218?C$#241!219?C$#248!220?CC$#253!222?CC$#250!224?C$#254!225?CC$#251!227?C$#252!228?C$#250!229?C$#243!230?C$#218!231?C$#180!232?C$#195!233?C$#167!234?C$#123!235?C$#176!236?C$#218!237?C$#219!238?C$#220!239?C$#216!240?C$#202!241?C$#218!242?C$#234!243?C$#242!244?C$#243!245?C$#239!246?C$#249!247?C$#243!248?C$#247!249?C$#243!250?CC$#235!252?C$#225!253?C$#231!254?CC$#224!256?C$#222!257?C$#243!258?C$#235!259?C$#244!260?C$#235!261?C$#243!262?C$#244!263?CCC$#235!266?C$#236!267?C$#18G$#4!1?G$#18!2?GGG$#22!5?G$#18!6?G$#24!7?G$#27!8?G$#18!9?G$#22!10?G$#31!11?G$#27!12?G$#34!13?G$#36!14?G$#31!15?G$#27!16?G$#30!17?G$#32!18?G$#27!19?G$#31!20?G$#30!21?G$#24!22?G$#31!23?G$#30!24?G$#27!25?GG$#18!27?G$#24!28?G$#18!29?GG$#19!31?G$#5!32?G$#4!33?G$#11!34?GGG$#4!37?G$#7!38?GG$#11!40?GG$#7!42?G$#11!43?GG$#7!45?G$#21!46?G$#19!47?G$#11!48?GGG$#4!51?G$#11!52?G$#21!53?G$#11!54?G$#7!55?G$#11!56?GG$#7!58?G$#14!59?G$#11!60?G$#1!61?G$#14!62?G$#99!63?G$#114!64?G$#115!65?G$#119!66?G$#143!67?GG$#119!69?G$#143!70?GGG$#151!73?G$#135!74?G$#164!75?G$#155!76?G$#146!77?GG$#181!79?G$#163!80?G$#164!81?G$#159!82?G$#155!83?G$#158!84?G$#161!85?G$#158!86?G$#141!87?G$#113!88?G$#145!89?G$#158!90?G$#113!91?G$#133!92?G$#114!93?G$#97!94?G$#114!95?G$#145!96?G$#139!97?G$#181!98?G$#179!99?G$#154!100?G$#153!101?G$#90!102?G$#135!103?G$#200!104?G$#172!105?G$#181!106?G$#179!107?G$#165!108?G$#150!109?G$#96!110?G$#54!111?G$#42!112?G$#47!113?G$#92!114?G$#155!115?G$#198!116?G$#90!117?G$#119!118?G$#181!119?G$#144!120?G$#162!121?G$#207!122?GG$#213!124?G$#238!125?G$#240!126?G$#228!127?GG$#209!129?G$#227!130?G$#209!131?G$#182!132?G$#226!133?G$#241!134?G$#244!135?G$#236!136?GG$#246!138?G$#247!139?G$#249!140?GG$#253!142?G$#249!143?GG$#247!145?G$#249!146?G$#252!147?GG$#247!149?G$#244!150?G$#246!151?G$#244!152?GGG$#241!155?G$#236!156?G$#241!157?G$#230!158?G$#228!159?GG$#230!161?G$#233!162?G$#210!163?G$#229!164?G$#207!165?G$#200!166?GG$#177!168?GG$#200!170?G$#207!171?G$#181!172?GGGG$#164!176?G$#154!177?GG$#146!179?G$#121!180?G$#129!181?G$#177!182?G$#200!183?G$#208!184?G$#229!185?G$#240!186?G$#233!187?G$#237!188?G$#241!189?G$#247!190?G$#240!191?G$#229!192?G$#233!193?G$#248!194?G$#246!195?G$#247!196?GG$#241!198?G$#212!199?G$#192!200?G$#200!201?G$#208!202?G$#207!203?G$#213!204?G$#229!205?G$#208!206?GGGG$#207!210?GG$#183!212?G$#209!213?GG$#192!215?G$#209!216?G$#227!217?G$#226!218?G$#236!219?G$#248!220?G$#250!221?G$#249!222?G$#250!223?G$#253!224?G$#250!225?GG$#244!227?G$#246!228?G$#224!229?G$#205!230?G$#199!231?G$#225!232?G$#224!233?G$#180!234?G$#126!235?G$#187!236?G$#222!237?GG$#232!239?G$#222!240?G$#195!241?G$#215!242?G$#219!243?G$#239!244?G$#243!245?GGGG$#245!249?G$#242!250?G$#243!251?G$#234!252?G$#235!253?G$#231!254?G$#224!255?G$#223!256?G$#231!257?G$#235!258?G$#236!259?G$#235!260?G$#236!261?G$#243!262?G$#244!263?GG$#236!265?G$#235!266?G$#236!267?G$#24OO$#18!2?O$#22!3?OOOO$#18!7?O$#24!8?O$#22!9?O$#27!10?O$#32!11?O$#30!12?O$#32!13?O$#23!14?O$#30!15?O$#27!16?OOO$#22!19?O$#27!20?O$#30!21?OO$#27!23?O$#30!24?O$#22!25?OOO$#18!28?O$#11!29?O$#4!30?O$#11!31?OO$#4!33?O$#11!34?OO$#4!36?OO$#11!38?OO$#12!40?O$#11!41?OOO$#14!44?OO$#11!46?O$#4!47?O$#11!48?OO$#21!50?O$#19!51?O$#11!52?OOO$#19!55?O$#11!56?O$#1!57?O$#7!58?O$#11!59?O$#7!60?O$#4!61?O$#47!62?O$#112!63?O$#135!64?OO$#119!66?O$#133!67?O$#155!68?O$#151!69?O$#146!70?O$#154!71?O$#167!72?O$#164!73?O$#151!74?O$#164!75?O$#155!76?O$#198!77?O$#172!78?OO$#164!80?O$#181!81?O$#164!82?O$#144!83?O$#155!84?O$#160!85?O$#133!86?O$#119!87?O$#113!88?O$#121!89?O$#145!90?O$#158!91?O$#141!92?O$#129!93?O$#162!94?O$#133!95?OO$#115!97?O$#172!98?O$#151!99?O$#182!100?O$#148!101?O$#125!102?O$#123!103?O$#135!104?O$#127!105?O$#172!106?O$#163!107?O$#140!108?O$#94!109?O$#54!110?O$#42!111?O$#47!112?O$#85!113?O$#135!114?O$#164!115?O$#179!116?O$#139!117?O$#144!118?O$#200!119?O$#208!120?O$#170!121?O$#208!122?O$#207!123?O$#213!124?O$#241!125?O$#240!126?O$#209!127?O$#230!128?O$#228!129?OO$#182!131?O$#240!132?O$#228!133?O$#213!134?O$#130!135?O$#244!136?O$#245!137?O$#248!138?O$#249!139?O$#247!140?O$#249!141?O$#247!142?O$#250!143?O$#249!144?O$#247!145?O$#254!146?O$#249!147?O$#241!148?O$#244!149?O$#247!150?OO$#244!152?O$#236!153?O$#241!154?OOO$#236!157?O$#213!158?O$#228!159?O$#229!160?O$#213!161?OO$#207!163?O$#181!164?OO$#200!166?O$#177!167?O$#170!168?O$#200!169?OOO$#170!172?O$#172!173?O$#164!174?OO$#146!176?O$#165!177?O$#127!178?O$#119!179?O$#129!180?O$#141!181?O$#170!182?O$#200!183?O$#208!184?O$#229!185?O$#230!186?OO$#241!188?O$#238!189?O$#237!190?OO$#241!192?OOOO$#247!196?O$#248!197?O$#231!198?O$#211!199?O$#192!200?O$#164!201?O$#207!202?O$#213!203?O$#208!204?OO$#207!206?O$#229!207?O$#208!208?O$#213!209?O$#207!210?O$#213!211?O$#209!212?O$#210!213?O$#198!214?O$#209!215?O$#211!216?O$#196!217?O$#214!218?O$#225!219?O$#230!220?O$#247!221?O$#241!222?O$#247!223?OO$#249!225?O$#244!226?O$#231!227?O$#195!228?OO$#215!230?O$#222!231?O$#231!232?O$#219!233?O$#180!234?O$#126!235?O$#199!236?O$#222!237?OOO$#232!240?O$#215!241?O$#216!242?O$#204!243?O$#218!244?OO$#222!246?O$#239!247?OO$#234!249?OO$#231!251?OOO$#224!254?OO$#223!256?O$#234!257?O$#231!258?O$#235!259?OO$#244!261?OO$#242!263?O$#236!264?O$#244!265?O$#236!266?O$#235!267?O$#24_$#27!1?_$#24!2?_$#22!3?_$#27!4?__$#18!6?_$#22!7?_$#24!8?_$#22!9?_$#27!10?_$#32!11?__$#30!13?_$#31!14?_$#30!15?____$#22!19?__$#30!21?_$#31!22?_$#27!23?_$#22!24?_$#27!25?_$#30!26?_$#18!27?_$#24!28?_$#19!29?_$#11!30?___$#5!33?__$#11!35?_$#7!36?_$#11!37?_$#5!38?_$#7!39?_$#14!40?_$#7!41?_$#11!42?_$#4!43?_$#11!44?___$#19!47?_$#4!48?_$#19!49?_$#21!50?__$#19!52?__$#11!54?_$#19!55?__$#11!57?_$#7!58?__$#1!60?_$#34!61?_$#146!62?_$#115!63?__$#108!65?_$#135!66?_$#143!67?_$#146!68?_$#143!69?_$#151!70?___$#135!73?_$#164!74?__$#181!76?_$#151!77?__$#155!79?_$#172!80?__$#177!82?_$#155!83?_$#135!84?_$#163!85?_$#155!86?_$#145!87?_$#158!88?_$#139!89?_$#158!90?_$#129!91?__$#161!93?_$#133!94?_$#146!95?_$#181!96?__$#163!98?_$#125!99?_$#154!100?_$#135!101?_$#105!102?_$#56!103?_$#103!104?_$#135!105?_$#103!106?_$#123!107?_$#54!108?_$#39!109?_$#37!110?_$#67!111?_$#110!112?_$#151!113?_$#198!114?_$#163!115?_$#121!116?_$#114!117?_$#113!118?_$#158!119?_$#141!120?_$#158!121?_$#207!122?_$#238!123?_$#229!124?_$#238!125?_$#241!126?___$#230!129?_$#183!130?_$#228!131?_$#233!132?_$#228!133?_$#165!134?_$#117!135?_$#241!136?_$#246!137?__$#245!139?__$#249!141?__$#252!143?_$#248!144?_$#249!145?_$#247!146?_$#244!147?_$#247!148?_$#236!149?_$#244!150?_$#247!151?_$#248!152?_$#241!153?_$#236!154?_$#241!155?_$#240!156?_$#230!157?_$#228!158?_$#229!159?_$#208!160?_$#228!161?_$#207!162?__$#170!164?_$#177!165?_$#170!166?_$#177!167?_$#170!168?_$#181!169?_$#200!170?___$#177!173?_$#163!174?_$#135!175?_$#164!176?_$#143!177?_$#146!178?_$#133!179?_$#141!180?__$#200!182?__$#213!184?__$#229!186?_$#240!187?_$#233!188?_$#237!189?_$#240!190?__$#237!192?_$#240!193?_$#229!194?_$#240!195?_$#230!196?_$#227!197?_$#230!198?_$#227!199?_$#183!200?_$#179!201?_$#181!202?_$#207!203?_$#200!204?_$#207!205?__$#208!207?___$#207!210?__$#210!212?_$#183!213?_$#209!214?_$#183!215?_$#182!216?_$#211!217?__$#212!219?__$#227!221?___$#213!224?_$#225!225?_$#211!226?_$#202!227?__$#218!229?_$#232!230?_$#231!231?_$#225!232?_$#202!233?_$#165!234?_$#148!235?_$#194!236?_$#222!237?_$#221!238?_$#220!239?_$#232!240?_$#221!241?_$#222!242?_$#219!243?_$#221!244?_$#219!245?__$#232!247?_$#234!248?_$#224!249?_$#231!250?_$#235!251?_$#231!252?_$#225!253?__$#219!255?_$#222!256?__$#225!258?__$#231!260?_$#235!261?______$#244!267?_$-#24@$#27!1?@$#23!2?@$#22!3?@$#18!4?@$#23!5?@@$#11!7?@$#18!8?@$#27!9?@@$#23!11?@$#34!12?@$#30!13?@@$#32!15?@$#30!16?@$#31!17?@$#30!18?@$#27!19?@@@@@$#30!24?@$#27!25?@@$#18!27?@$#27!28?@$#21!29?@$#19!30?@$#11!31?@$#4!32?@$#11!33?@$#5!34?@$#1!35?@$#7!36?@$#11!37?@$#7!38?@$#12!39?@$#5!40?@$#1!41?@$#21!42?@$#11!43?@@$#19!45?@$#7!46?@$#19!47?@$#11!48?@$#19!49?@@@@@@@$#11!56?@@$#12!58?@$#11!59?@$#20!60?@$#112!61?@$#114!62?@$#119!63?@@@$#135!66?@$#146!67?@@@$#164!70?@$#151!71?@$#154!72?@$#164!73?@$#154!74?@@$#146!76?@$#179!77?@$#155!78?@$#164!79?@$#159!80?@$#177!81?@$#164!82?@$#146!83?@$#163!84?@$#155!85?@$#146!86?@$#115!87?@$#129!88?@@$#122!90?@$#141!91?@$#129!92?@@$#145!94?@$#129!95?@$#164!96?@$#158!97?@$#155!98?@$#179!99?@$#164!100?@$#125!101?@$#87!102?@$#68!103?@$#39!104?@$#46!105?@$#40!106?@$#38!107?@$#40!108?@$#41!109?@$#66!110?@$#143!111?@$#160!112?@$#164!113?@$#181!114?@$#145!115?@$#90!116?@$#181!117?@$#200!118?@@$#158!120?@$#125!121?@$#177!122?@$#200!123?@@$#172!125?@$#246!126?@$#192!127?@$#183!128?@$#192!129?@$#198!130?@$#229!131?@$#233!132?@$#213!133?@$#209!134?@$#230!135?@@$#247!137?@$#248!138?@@@$#250!141?@$#247!142?@$#252!143?@$#247!144?@$#248!145?@$#246!146?@@@$#236!149?@$#248!150?@$#236!151?@$#241!152?@$#236!153?@$#240!154?@$#230!155?@@$#213!157?@$#229!158?@$#208!159?@@$#207!161?@$#200!162?@@$#161!164?@@@@$#162!168?@$#181!169?@@$#179!171?@$#181!172?@$#172!173?@$#151!174?@@$#154!176?@$#143!177?@$#105!178?@$#118!179?@$#141!180?@$#177!181?@$#181!182?@$#213!183?@@$#228!185?@@$#229!187?@$#230!188?@$#228!189?@$#240!190?@$#230!191?@$#241!192?@$#240!193?@$#230!194?@$#228!195?@$#241!196?@$#213!197?@@$#196!199?@$#179!200?@$#163!201?@$#177!202?@$#181!203?@@$#200!205?@$#207!206?@$#181!207?@$#200!208?@$#213!209?@$#208!210?@$#200!211?@@@$#198!214?@@$#213!216?@@$#211!218?@$#195!219?@$#226!220?@$#211!221?@$#209!222?@@$#180!224?@$#196!225?@$#212!226?@$#214!227?@$#224!228?@$#223!229?@$#224!230?@$#227!231?@$#196!232?@@$#137!234?@$#153!235?@$#199!236?@$#218!237?@@$#222!239?@$#221!240?@@$#223!242?@$#220!243?@$#222!244?@$#224!245?@$#232!246?@$#222!247?@@$#221!249?@$#231!250?@$#224!251?@$#225!252?@@$#226!254?@$#224!255?@$#232!256?@$#231!257?@$#234!258?@$#231!259?@$#224!260?@$#231!261?@$#235!262?@@@@@@$#27A$#22!1?A$#27!2?A$#22!3?AA$#23!5?AA$#27!7?A$#18!8?AA$#27!10?AA$#30!12?A$#31!13?A$#27!14?A$#30!15?A$#11!16?A$#30!17?AA$#31!19?A$#30!20?AA$#31!22?A$#22!23?A$#30!24?A$#22!25?A$#27!26?A$#24!27?AA$#19!29?A$#11!30?AA$#4!32?A$#11!33?AA$#7!35?AA$#5!37?A$#4!38?A$#11!39?AA$#14!41?A$#11!42?AA$#5!44?A$#11!45?A$#7!46?A$#11!47?AA$#19!49?A$#11!50?A$#19!51?AAAAA$#21!56?A$#14!57?A$#5!58?A$#4!59?A$#90!60?A$#112!61?A$#119!62?A$#116!63?AA$#154!65?A$#151!66?AA$#154!68?AA$#165!70?AAAA$#154!74?A$#167!75?A$#164!76?A$#155!77?A$#164!78?AAAA$#146!82?A$#133!83?A$#146!84?A$#115!85?A$#143!86?A$#144!87?A$#146!88?A$#121!89?A$#158!90?A$#141!91?A$#158!92?A$#141!93?A$#145!94?A$#129!95?A$#141!96?A$#161!97?A$#170!98?A$#183!99?A$#164!100?A$#135!101?A$#60!102?A$#46!103?A$#38!104?A$#37!105?A$#40!106?A$#41!107?A$#92!108?A$#126!109?A$#115!110?A$#144!111?A$#164!112?A$#207!113?A$#162!114?A$#145!115?A$#161!116?A$#158!117?A$#164!118?A$#208!119?A$#181!120?AA$#207!122?A$#179!123?A$#229!124?A$#200!125?A$#245!126?A$#213!127?A$#238!128?A$#200!129?A$#229!130?A$#237!131?A$#238!132?A$#208!133?A$#240!134?A$#248!135?A$#229!136?A$#244!137?A$#248!138?AAA$#252!141?A$#248!142?A$#236!143?A$#247!144?A$#244!145?A$#241!146?A$#253!147?A$#240!148?A$#236!149?AA$#235!151?A$#240!152?A$#230!153?A$#227!154?A$#228!155?A$#213!156?A$#229!157?A$#207!158?AA$#200!160?A$#177!161?AA$#170!163?A$#161!164?A$#128!165?A$#170!166?AAA$#177!169?A$#160!170?A$#198!171?A$#183!172?A$#140!173?A$#164!174?AA$#179!176?A$#125!177?A$#114!178?A$#128!179?A$#129!180?A$#170!181?A$#200!182?A$#208!183?A$#229!184?A$#213!185?A$#233!186?A$#230!187?AA$#228!189?A$#230!190?A$#233!191?A$#227!192?A$#229!193?A$#213!194?A$#228!195?AA$#241!197?A$#210!198?AA$#198!200?A$#164!201?A$#177!202?A$#181!203?A$#177!204?A$#200!205?A$#207!206?A$#200!207?A$#207!208?A$#200!209?A$#181!210?AA$#200!212?A$#183!213?A$#200!214?A$#198!215?AA$#196!217?A$#182!218?A$#211!219?A$#226!220?AA$#213!222?A$#209!223?A$#218!224?A$#219!225?AA$#214!227?A$#226!228?A$#212!229?A$#209!230?A$#198!231?A$#196!232?A$#167!233?A$#126!234?A$#165!235?A$#180!236?A$#219!237?A$#224!238?A$#219!239?A$#218!240?A$#219!241?A$#223!242?A$#221!243?AA$#222!245?A$#232!246?A$#239!247?A$#224!248?AA$#231!250?A$#224!251?A$#225!252?A$#227!253?A$#226!254?A$#224!255?A$#231!256?AAA$#226!259?A$#235!260?A$#231!261?A$#236!262?A$#234!263?A$#231!264?A$#225!265?AA$#235!267?A$#18C$#24!1?C$#27!2?CCC$#23!5?C$#22!6?C$#27!7?C$#24!8?C$#22!9?CC$#30!11?C$#27!12?C$#30!13?C$#22!14?C$#30!15?CC$#32!17?C$#30!18?CCC$#22!21?C$#30!22?C$#22!23?C$#30!24?C$#31!25?C$#27!26?CC$#18!28?C$#4!29?C$#11!30?CC$#4!32?C$#1!33?C$#7!34?C$#1!35?C$#11!36?C$#5!37?C$#7!38?CCC$#11!41?C$#7!42?C$#21!43?CCC$#19!46?C$#11!47?C$#21!48?C$#11!49?C$#19!50?C$#11!51?CC$#19!53?C$#21!54?C$#19!55?CC$#21!57?C$#14!58?C$#91!59?C$#129!60?C$#125!61?C$#136!62?C$#116!63?C$#146!64?C$#151!65?C$#143!66?C$#167!67?CCCC$#173!71?C$#165!72?CCCC$#154!76?C$#167!77?C$#151!78?C$#164!79?CCC$#133!82?C$#144!83?C$#146!84?C$#158!85?C$#144!86?C$#162!87?C$#158!88?CC$#120!90?C$#121!91?C$#128!92?C$#161!93?C$#141!94?C$#124!95?C$#129!96?C$#133!97?C$#129!98?C$#177!99?C$#155!100?C$#125!101?C$#110!102?C$#65!103?C$#116!104?C$#110!105?C$#116!106?C$#137!107?C$#146!108?C$#210!109?C$#200!110?C$#208!111?C$#151!112?C$#172!113?C$#158!114?C$#113!115?C$#177!116?C$#181!117?C$#200!118?C$#177!119?C$#162!120?C$#213!121?C$#237!122?C$#207!123?C$#198!124?C$#233!125?C$#237!126?C$#208!127?C$#181!128?C$#237!129?C$#208!130?C$#229!131?C$#207!132?C$#229!133?C$#241!134?C$#230!135?CC$#241!137?C$#247!138?CCC$#244!141?C$#241!142?C$#244!143?C$#235!144?C$#230!145?C$#240!146?C$#235!147?C$#230!148?C$#236!149?C$#230!150?C$#226!151?C$#230!152?C$#228!153?C$#230!154?C$#213!155?C$#208!156?C$#207!157?C$#208!158?C$#200!159?C$#181!160?C$#162!161?CC$#161!163?C$#158!164?C$#141!165?CC$#158!167?C$#161!168?C$#177!169?C$#181!170?C$#163!171?C$#183!172?C$#164!173?C$#110!174?C$#140!175?C$#146!176?C$#125!177?C$#114!178?C$#141!179?C$#161!180?C$#181!181?C$#177!182?C$#208!183?C$#228!184?C$#233!185?C$#228!186?C$#229!187?C$#240!188?C$#237!189?C$#233!190?C$#230!191?C$#241!192?C$#233!193?C$#213!194?C$#229!195?C$#228!196?C$#227!197?C$#236!198?C$#209!199?C$#192!200?C$#183!201?C$#177!202?C$#162!203?C$#177!204?C$#170!205?C$#177!206?C$#200!207?CCCCCCCC$#183!215?C$#198!216?C$#192!217?CCC$#211!220?C$#231!221?C$#236!222?C$#226!223?C$#209!224?C$#214!225?C$#224!226?CC$#226!228?C$#227!229?C$#209!230?C$#198!231?C$#180!232?C$#140!233?C$#116!234?C$#180!235?CC$#214!237?C$#218!238?CCC$#221!241?CC$#222!243?CC$#232!245?C$#242!246?C$#232!247?C$#221!248?CC$#231!250?C$#225!251?CC$#227!253?C$#226!254?C$#223!255?C$#224!256?C$#231!257?C$#224!258?C$#235!259?CCC$#244!262?CC$#236!264?C$#226!265?C$#231!266?C$#235!267?C$#23G$#11!1?G$#22!2?GG$#15!4?G$#23!5?G$#22!6?G$#24!7?G$#31!8?G$#27!9?G$#30!10?GGG$#27!13?G$#30!14?G$#27!15?GG$#30!17?GG$#22!19?G$#30!20?G$#24!21?G$#30!22?G$#27!23?G$#18!24?G$#30!25?G$#27!26?G$#18!27?G$#11!28?GGGG$#4!32?G$#7!33?GGG$#11!36?GGG$#1!39?G$#11!40?GG$#14!42?G$#11!43?GG$#21!45?GG$#14!47?G$#11!48?GG$#19!50?GGG$#11!53?G$#21!54?G$#19!55?GGG$#91!58?G$#120!59?G$#88!60?G$#116!61?G$#110!62?G$#151!63?GG$#165!65?GG$#154!67?G$#165!68?G$#167!69?G$#165!70?G$#154!71?G$#153!72?G$#137!73?G$#153!74?G$#165!75?G$#176!76?G$#167!77?G$#151!78?G$#133!79?G$#146!80?G$#135!81?G$#164!82?G$#151!83?G$#105!84?G$#120!85?G$#158!86?G$#163!87?G$#144!88?G$#158!89?G$#133!90?G$#141!91?G$#128!92?G$#122!93?G$#141!94?G$#122!95?G$#129!96?G$#114!97?G$#158!98?GG$#155!100?G$#164!101?G$#105!102?G$#102!103?G$#125!104?G$#136!105?G$#154!106?G$#164!107?G$#172!108?G$#200!109?G$#181!110?G$#210!111?G$#208!112?G$#144!113?G$#114!114?G$#177!115?G$#170!116?G$#161!117?G$#170!118?GG$#200!120?G$#248!121?G$#210!122?G$#228!123?G$#229!124?G$#192!125?G$#213!126?G$#229!127?G$#207!128?G$#208!129?G$#207!130?G$#208!131?G$#207!132?G$#240!133?G$#236!134?G$#240!135?GG$#241!137?GG$#247!139?G$#241!140?G$#244!141?GG$#230!143?G$#254!144?G$#229!145?G$#230!146?G$#227!147?G$#230!148?G$#228!149?G$#226!150?G$#227!151?G$#240!152?G$#228!153?G$#208!154?G$#233!155?G$#200!156?G$#177!157?G$#200!158?GG$#162!160?G$#161!161?G$#170!162?GG$#141!164?GG$#161!166?G$#162!167?GG$#156!169?G$#181!170?G$#146!171?G$#143!172?G$#154!173?G$#125!174?G$#108!175?G$#125!176?G$#113!177?G$#141!178?G$#158!179?G$#163!180?G$#200!181?G$#228!182?G$#210!183?G$#240!184?G$#229!185?G$#213!186?G$#228!187?GG$#213!189?G$#207!190?G$#213!191?GG$#228!193?G$#229!194?G$#228!195?GG$#227!197?G$#209!198?GG$#198!200?G$#183!201?G$#163!202?G$#170!203?G$#161!204?G$#162!205?G$#200!206?G$#181!207?G$#207!208?G$#200!209?GGGGG$#181!214?G$#177!215?G$#198!216?G$#183!217?G$#179!218?G$#192!219?GG$#235!221?G$#227!222?G$#247!223?G$#236!224?G$#211!225?GG$#227!227?G$#209!228?G$#196!229?GG$#182!231?G$#173!232?G$#140!233?G$#135!234?G$#176!235?G$#205!236?G$#218!237?G$#220!238?G$#218!239?GG$#222!241?GG$#231!243?G$#234!244?GG$#232!246?G$#222!247?G$#221!248?G$#224!249?G$#223!250?G$#226!251?G$#214!252?G$#218!253?G$#225!254?G$#231!255?G$#234!256?G$#231!257?GG$#235!259?GGG$#242!262?GG$#235!264?G$#226!265?G$#235!266?G$#231!267?G$#23O$#22!1?OO$#18!3?O$#23!4?OO$#27!6?O$#24!7?O$#23!8?O$#27!9?O$#30!10?O$#31!11?O$#36!12?O$#34!13?O$#31!14?O$#22!15?O$#36!16?O$#30!17?O$#27!18?OO$#31!20?O$#27!21?O$#22!22?OO$#27!24?O$#30!25?O$#18!26?O$#19!27?O$#11!28?OOOO$#7!32?OOO$#1!35?O$#7!36?O$#11!37?OO$#21!39?O$#11!40?O$#7!41?O$#21!42?O$#11!43?OO$#7!45?O$#14!46?OO$#11!48?OO$#19!50?OO$#27!52?O$#19!53?O$#27!54?O$#19!55?O$#27!56?O$#79!57?O$#113!58?O$#102!59?O$#90!60?O$#136!61?O$#143!62?O$#165!63?O$#137!64?O$#165!65?O$#154!66?OO$#176!68?O$#165!69?O$#167!70?O$#153!71?OO$#165!73?OO$#167!75?OO$#165!77?O$#179!78?O$#151!79?OO$#179!81?O$#154!82?O$#172!83?O$#125!84?O$#177!85?O$#164!86?O$#146!87?O$#143!88?O$#125!89?O$#115!90?O$#114!91?O$#141!92?O$#118!93?O$#124!94?O$#145!95?O$#113!96?OO$#145!98?O$#121!99?O$#158!100?O$#145!101?O$#133!102?O$#122!103?O$#118!104?O$#145!105?O$#155!106?O$#181!107?O$#156!108?O$#172!109?O$#208!110?O$#162!111?O$#129!112?O$#121!113?O$#113!114?O$#161!115?O$#128!116?O$#158!117?O$#170!118?O$#122!119?O$#207!120?O$#210!121?O$#179!122?O$#210!123?O$#200!124?O$#181!125?O$#238!126?O$#229!127?O$#208!128?OOO$#200!131?O$#213!132?O$#235!133?O$#244!134?O$#230!135?O$#240!136?O$#230!137?O$#247!138?O$#245!139?O$#240!140?OO$#230!142?O$#228!143?O$#226!144?O$#228!145?O$#213!146?OO$#230!148?O$#209!149?OO$#213!151?OO$#240!153?O$#213!154?O$#177!155?O$#229!156?O$#141!157?O$#181!158?O$#161!159?O$#162!160?O$#158!161?O$#141!162?OO$#122!164?O$#141!165?O$#158!166?O$#164!167?O$#163!168?O$#183!169?O$#156!170?O$#146!171?OO$#125!173?O$#146!174?O$#105!175?O$#115!176?O$#97!177?O$#128!178?O$#158!179?O$#181!180?O$#200!181?O$#213!182?O$#200!183?O$#207!184?O$#210!185?O$#227!186?O$#228!187?OO$#209!189?O$#227!190?O$#228!191?O$#213!192?O$#230!193?O$#240!194?O$#230!195?OOO$#227!198?O$#209!199?O$#210!200?O$#183!201?O$#145!202?O$#170!203?O$#162!204?O$#161!205?O$#162!206?O$#181!207?O$#200!208?O$#170!209?O$#207!210?O$#200!211?O$#177!212?O$#200!213?OO$#207!215?O$#198!216?OO$#183!218?O$#167!219?O$#165!220?O$#226!221?O$#218!222?O$#247!223?O$#244!224?O$#230!225?O$#225!226?OO$#212!228?O$#192!229?O$#182!230?O$#167!231?O$#140!232?O$#135!233?O$#137!234?O$#187!235?O$#202!236?O$#214!237?O$#218!238?O$#220!239?O$#215!240?O$#222!241?O$#232!242?O$#222!243?O$#224!244?O$#232!245?O$#221!246?O$#219!247?OO$#221!249?O$#223!250?O$#225!251?O$#226!252?O$#218!253?O$#224!254?O$#231!255?O$#232!256?O$#234!257?O$#235!258?OOOO$#242!262?O$#231!263?OO$#235!265?OO$#244!267?O$#23_$#22!1?__$#18!3?_$#24!4?_$#23!5?_$#22!6?_$#24!7?_$#23!8?__$#34!10?___$#32!13?_$#22!14?_$#30!15?_$#22!16?_$#30!17?_$#36!18?_$#30!19?_$#22!20?_$#30!21?__$#27!23?___$#22!26?_$#21!27?_$#4!28?__$#7!30?__$#1!32?_$#7!33?___$#1!36?_$#7!37?_$#11!38?__$#14!40?_$#7!41?__$#4!43?__$#7!45?_$#14!46?___$#19!49?__$#11!51?_$#4!52?_$#21!53?_$#19!54?_$#21!55?_$#47!56?_$#115!57?_$#125!58?_$#119!59?_$#125!60?_$#143!61?_$#151!62?_$#165!63?__$#180!65?_$#167!66?_$#153!67?_$#176!68?_$#167!69?_$#182!70?_$#149!71?_$#165!72?_$#130!73?_$#137!74?_$#153!75?__$#146!77?_$#143!78?_$#90!79?_$#172!80?_$#146!81?_$#143!82?_$#207!83?_$#119!84?_$#172!85?_$#155!86?_$#164!87?_$#172!88?_$#146!89?_$#155!90?_$#139!91?_$#121!92?_$#128!93?_$#158!94?_$#113!95?__$#141!97?_$#118!98?_$#139!99?_$#141!100?_$#161!101?_$#162!102?_$#118!103?_$#128!104?__$#141!106?_$#170!107?__$#163!109?_$#181!110?_$#162!111?_$#113!112?_$#122!113?_$#158!114?__$#141!116?_$#158!117?_$#177!118?_$#155!119?_$#172!120?__$#183!122?_$#163!123?_$#155!124?_$#200!125?_$#229!126?__$#207!128?_$#200!129?_$#177!130?_$#207!131?_$#213!132?_$#230!133?_$#240!134?_$#227!135?_$#233!136?_$#240!137?_$#241!138?__$#230!140?__$#253!142?_$#208!143?_$#213!144?_$#209!145?_$#210!146?__$#207!148?_$#209!149?_$#210!150?_$#248!151?_$#200!152?_$#207!153?_$#227!154?_$#181!155?_$#170!156?_$#200!157?_$#170!158?_$#158!159?_$#170!160?_$#158!161?_$#141!162?_$#113!163?_$#128!164?_$#158!165?_$#145!166?_$#159!167?_$#181!168?_$#146!169?_$#164!170?_$#151!171?_$#143!172?_$#135!173?_$#125!174?_$#108!175?_$#113!176?_$#129!177?_$#158!178?_$#170!179?_$#200!180?_$#213!181?__$#210!183?_$#200!184?_$#181!185?_$#208!186?_$#213!187?__$#228!189?__$#227!191?_$#229!192?_$#230!193?__$#241!195?_$#236!196?__$#241!198?_$#226!199?_$#211!200?_$#200!201?_$#170!202?___$#158!205?_$#177!206?_$#162!207?_$#170!208?_$#177!209?_$#200!210?___$#181!213?__$#179!215?_$#181!216?_$#163!217?_$#164!218?_$#163!219?_$#172!220?__$#154!222?_$#165!223?_$#212!224?_$#182!225?_$#211!226?_$#180!227?_$#196!228?_$#154!229?_$#150!230?__$#135!232?__$#165!234?_$#180!235?_$#215!236?_$#205!237?_$#214!238?_$#219!239?_$#214!240?_$#219!241?_$#218!242?__$#212!244?_$#224!245?_$#219!246?_$#218!247?_$#214!248?_$#218!249?__$#225!251?_$#227!252?_$#214!253?_$#225!254?_$#223!255?_$#231!256?___$#235!259?_$#242!260?_$#235!261?_$#231!262?__$#236!264?_$#235!265?__$#231!267?_$-#15@$#32!1?@$#23!2?@$#22!3?@@$#15!5?@$#22!6?@@$#23!8?@$#32!9?@$#36!10?@$#32!11?@@$#34!13?@$#31!14?@$#30!15?@@@$#27!18?@$#30!19?@$#27!20?@@$#31!22?@$#30!23?@$#27!24?@$#22!25?@$#24!26?@$#11!27?@@@$#1!30?@@$#7!32?@$#1!33?@@$#7!35?@$#1!36?@$#7!37?@$#4!38?@$#7!39?@$#12!40?@$#14!41?@$#7!42?@$#5!43?@$#14!44?@@$#4!46?@$#9!47?@$#5!48?@$#11!49?@$#19!50?@@@$#21!53?@@$#34!55?@$#113!56?@$#87!57?@$#102!58?@$#135!59?@$#146!60?@$#154!61?@$#150!62?@$#173!63?@$#180!64?@@$#153!66?@$#180!67?@$#176!68?@$#167!69?@$#180!70?@$#148!71?@$#149!72?@$#153!73?@$#117!74?@$#130!75?@$#147!76?@$#154!77?@$#151!78?@$#86!79?@$#136!80?@$#110!81?@$#143!82?@$#125!83?@$#154!84?@$#135!85?@$#115!86?@$#133!87?@$#135!88?@$#125!89?@$#155!90?@$#129!91?@@$#121!93?@$#141!94?@@$#161!96?@$#133!97?@$#113!98?@$#158!99?@$#128!100?@$#145!101?@$#158!102?@$#170!103?@$#158!104?@$#124!105?@$#161!106?@$#177!107?@@$#158!109?@$#177!110?@$#141!111?@$#113!112?@$#170!113?@$#129!114?@$#133!115?@$#159!116?@$#200!117?@$#158!118?@$#156!119?@$#181!120?@@$#213!122?@$#181!123?@$#200!124?@$#229!125?@@$#228!127?@$#200!128?@$#170!129?@@$#210!131?@$#209!132?@$#226!133?@$#233!134?@$#229!135?@$#238!136?@$#230!137?@$#226!138?@$#240!139?@$#230!140?@$#209!141?@$#227!142?@$#200!143?@$#207!144?@$#246!145?@$#209!146?@$#198!147?@$#177!148?@$#248!149?@$#200!150?@@$#179!152?@$#181!153?@$#200!154?@$#181!155?@$#161!156?@$#145!157?@$#208!158?@$#141!159?@@$#121!161?@$#133!162?@$#118!163?@$#113!164?@$#141!165?@$#145!166?@$#146!167?@$#172!168?@$#156!169?@$#143!170?@$#108!171?@$#143!172?@$#125!173?@$#112!174?@$#105!175?@$#124!176?@$#158!177?@$#170!178?@@$#179!180?@$#210!181?@@$#213!183?@$#198!184?@$#207!185?@$#200!186?@$#210!187?@@$#228!189?@$#227!190?@$#230!191?@$#227!192?@$#228!193?@$#230!194?@$#236!195?@$#241!196?@$#230!197?@@$#212!199?@$#209!200?@$#183!201?@$#162!202?@@$#161!204?@$#170!205?@$#164!206?@$#160!207?@$#158!208?@$#170!209?@$#181!210?@@$#200!212?@$#177!213?@$#164!214?@$#170!215?@$#181!216?@$#200!217?@@$#172!219?@$#156!220?@$#164!221?@$#183!222?@$#173!223?@$#167!224?@$#192!225?@$#167!226?@$#165!227?@$#146!228?@@$#140!230?@$#143!231?@$#136!232?@$#151!233?@$#180!234?@$#195!235?@$#219!236?@$#202!237?@$#212!238?@$#219!239?@$#212!240?@$#218!241?@$#221!242?@$#215!243?@$#214!244?@$#219!245?@$#218!246?@$#214!247?@$#215!248?@$#218!249?@@$#214!251?@@$#218!253?@$#225!254?@$#221!255?@$#224!256?@$#231!257?@@$#224!259?@$#231!260?@@$#235!262?@$#231!263?@$#235!264?@@@$#232!267?@$#18A$#23!1?AA$#30!3?A$#22!4?AA$#18!6?A$#11!7?A$#23!8?A$#32!9?AA$#34!11?A$#36!12?A$#31!13?A$#37!14?A$#18!15?A$#27!16?A$#22!17?A$#30!18?A$#22!19?A$#27!20?A$#30!21?A$#27!22?A$#31!23?A$#27!24?AA$#24!26?A$#19!27?A$#11!28?A$#4!29?AA$#7!31?A$#1!32?A$#7!33?A$#11!34?A$#7!35?AA$#11!37?A$#4!38?AA$#7!40?AA$#14!42?A$#5!43?A$#12!44?A$#7!45?A$#11!46?AAA$#19!49?AA$#21!51?A$#19!52?A$#21!53?A$#34!54?A$#129!55?A$#115!56?A$#112!57?A$#135!58?A$#136!59?A$#154!60?AAA$#165!63?AA$#176!65?A$#165!66?A$#173!67?A$#176!68?AA$#167!70?A$#130!71?AA$#165!73?A$#98!74?A$#117!75?A$#86!76?A$#137!77?A$#150!78?A$#92!79?A$#126!80?A$#154!81?A$#146!82?A$#143!83?A$#183!84?A$#146!85?A$#172!86?A$#179!87?A$#135!88?A$#164!89?A$#146!90?A$#129!91?A$#145!92?A$#121!93?A$#113!94?A$#118!95?AA$#141!97?AA$#113!99?A$#141!100?A$#158!101?A$#141!102?A$#177!103?A$#128!104?AAA$#161!107?A$#181!108?A$#208!109?A$#141!110?A$#145!111?A$#141!112?A$#113!113?A$#170!114?A$#200!115?A$#156!116?A$#144!117?A$#200!118?A$#170!119?A$#144!120?A$#207!121?A$#213!122?A$#208!123?A$#213!124?A$#207!125?A$#210!126?A$#200!127?AA$#158!129?A$#207!130?A$#227!131?A$#209!132?A$#228!133?A$#238!134?A$#198!135?A$#229!136?A$#230!137?A$#248!138?A$#229!139?A$#210!140?A$#213!141?A$#198!142?A$#208!143?A$#200!144?A$#229!145?A$#181!146?A$#200!147?A$#162!148?A$#159!149?A$#200!150?A$#177!151?A$#210!152?A$#144!153?A$#181!154?A$#163!155?A$#145!156?A$#141!157?A$#129!158?A$#200!159?A$#129!160?A$#122!161?A$#141!162?A$#124!163?A$#129!164?AA$#145!166?A$#114!167?A$#144!168?A$#156!169?A$#125!170?A$#108!171?A$#100!172?A$#114!173?A$#112!174?A$#113!175?A$#129!176?A$#141!177?A$#170!178?A$#177!179?A$#200!180?A$#210!181?AA$#209!183?AA$#207!185?A$#213!186?AAA$#198!189?A$#228!190?AA$#230!192?A$#227!193?AA$#230!195?A$#235!196?A$#230!197?A$#226!198?A$#209!199?A$#165!200?A$#156!201?A$#163!202?A$#158!203?AA$#145!205?AA$#162!207?A$#158!208?AA$#170!210?A$#177!211?A$#181!212?AA$#177!214?A$#162!215?A$#164!216?A$#200!217?AA$#179!219?A$#181!220?AA$#200!222?A$#183!223?A$#154!224?A$#182!225?A$#173!226?A$#146!227?A$#140!228?A$#165!229?A$#167!230?A$#154!231?A$#151!232?A$#154!233?A$#182!234?A$#192!235?A$#195!236?A$#205!237?A$#219!238?A$#214!239?A$#212!240?A$#218!241?A$#219!242?AA$#214!244?A$#218!245?A$#204!246?A$#215!247?A$#212!248?AA$#214!250?A$#212!251?A$#227!252?A$#212!253?A$#219!254?AA$#224!256?A$#231!257?AAAAA$#234!262?A$#231!263?A$#235!264?A$#231!265?A$#235!266?A$#234!267?A$#27C$#22!1?CC$#18!3?C$#22!4?C$#18!5?C$#22!6?CC$#27!8?C$#32!9?C$#36!10?C$#34!11?C$#36!12?C$#31!13?C$#30!14?C$#27!15?C$#18!16?C$#27!17?CC$#30!19?CC$#31!21?CC$#30!23?C$#27!24?C$#22!25?C$#18!26?C$#19!27?C$#11!28?C$#4!29?C$#5!30?C$#1!31?C$#5!32?C$#1!33?C$#7!34?C$#4!35?C$#7!36?CCC$#4!39?CC$#7!41?C$#14!42?C$#12!43?C$#5!44?C$#12!45?C$#11!46?CC$#12!48?C$#21!49?C$#11!50?C$#21!51?CC$#27!53?C$#100!54?C$#114!55?C$#125!56?C$#135!57?C$#143!58?C$#135!59?C$#167!60?C$#165!61?C$#176!62?C$#180!63?C$#153!64?C$#176!65?CC$#165!67?C$#176!68?C$#166!69?C$#176!70?C$#130!71?C$#111!72?C$#130!73?C$#98!74?C$#99!75?C$#79!76?C$#98!77?C$#117!78?C$#130!79?C$#99!80?C$#137!81?C$#99!82?C$#100!83?C$#140!84?C$#116!85?C$#164!86?CC$#135!88?C$#164!89?C$#155!90?C$#146!91?C$#145!92?C$#128!93?C$#129!94?C$#121!95?C$#122!96?CC$#161!98?C$#129!99?C$#113!100?C$#141!101?CC$#114!103?C$#113!104?CC$#97!106?C$#170!107?C$#177!108?C$#181!109?C$#158!110?C$#141!111?C$#158!112?C$#162!113?C$#177!114?C$#198!115?C$#159!116?C$#163!117?C$#200!118?C$#162!119?C$#207!120?CC$#208!122?CC$#164!124?C$#200!125?CC$#181!127?C$#170!128?C$#181!129?C$#183!130?C$#227!131?C$#196!132?C$#192!133?C$#233!134?C$#208!135?C$#213!136?C$#228!137?C$#213!138?CC$#200!140?C$#210!141?C$#207!142?C$#179!143?C$#164!144?C$#163!145?C$#164!146?C$#177!147?C$#164!148?C$#170!149?C$#183!150?C$#159!151?C$#145!152?C$#207!153?C$#158!154?CC$#133!156?C$#145!157?C$#141!158?C$#158!159?CC$#139!161?C$#122!162?C$#120!163?CC$#121!165?C$#145!166?C$#144!167?C$#156!168?C$#108!169?C$#146!170?C$#114!171?C$#105!172?C$#129!173?C$#113!174?C$#141!175?C$#170!176?C$#181!177?C$#200!178?C$#198!179?CCC$#210!182?C$#198!183?C$#210!184?C$#209!185?C$#213!186?C$#210!187?C$#198!188?C$#213!189?CC$#230!191?C$#235!192?C$#230!193?C$#227!194?C$#230!195?C$#225!196?C$#227!197?CC$#182!199?C$#135!200?C$#146!201?C$#163!202?C$#161!203?C$#145!204?C$#158!205?C$#145!206?C$#139!207?C$#158!208?C$#164!209?C$#163!210?C$#172!211?CC$#181!213?CC$#170!215?CC$#159!217?CC$#155!219?C$#158!220?C$#170!221?C$#177!222?CC$#183!224?C$#179!225?C$#165!226?C$#151!227?CC$#167!229?C$#165!230?CC$#164!232?CC$#182!234?C$#173!235?C$#187!236?C$#205!237?C$#214!238?CC$#212!240?C$#218!241?C$#215!242?CC$#214!244?C$#205!245?C$#215!246?C$#219!247?C$#214!248?CC$#212!250?C$#218!251?C$#214!252?CCC$#219!255?C$#224!256?C$#231!257?CCCC$#234!261?C$#232!262?C$#231!263?C$#235!264?C$#225!265?C$#223!266?C$#232!267?C$#24GG$#22!2?G$#27!3?GG$#22!5?G$#27!6?G$#18!7?G$#22!8?G$#32!9?G$#34!10?GG$#32!12?G$#34!13?G$#30!14?G$#36!15?G$#31!16?G$#27!17?G$#30!18?G$#31!19?G$#22!20?GGGG$#27!24?GG$#18!26?G$#11!27?GGG$#4!30?G$#7!31?G$#1!32?G$#7!33?G$#1!34?G$#4!35?G$#11!36?G$#7!37?GG$#12!39?G$#5!40?G$#12!41?G$#7!42?GG$#12!44?G$#14!45?G$#12!46?GG$#14!48?GG$#21!50?G$#19!51?G$#21!52?G$#79!53?G$#129!54?G$#116!55?G$#119!56?G$#125!57?G$#151!58?G$#154!59?G$#167!60?GG$#176!62?G$#165!63?G$#157!64?G$#176!65?GGG$#166!68?G$#165!69?G$#166!70?G$#130!71?G$#148!72?G$#102!73?G$#92!74?G$#99!75?G$#65!76?G$#92!77?G$#99!78?G$#65!79?G$#47!80?G$#79!81?G$#167!82?G$#105!83?G$#130!84?G$#156!85?G$#163!86?G$#151!87?G$#164!88?GG$#172!90?G$#135!91?G$#113!92?G$#97!93?G$#105!94?G$#113!95?GGG$#105!98?G$#122!99?G$#161!100?G$#158!101?G$#133!102?G$#113!103?G$#90!104?G$#118!105?G$#122!106?G$#113!107?G$#158!108?G$#133!109?G$#170!110?G$#158!111?G$#155!112?G$#200!113?G$#164!114?G$#156!115?G$#179!116?GG$#172!118?G$#200!119?G$#163!120?G$#200!121?G$#207!122?G$#181!123?G$#200!124?G$#170!125?G$#208!126?G$#210!127?G$#181!128?G$#172!129?G$#181!130?G$#209!131?G$#228!132?G$#183!133?G$#210!134?G$#213!135?G$#200!136?GG$#210!138?G$#198!139?G$#200!140?G$#179!141?G$#163!142?G$#248!143?G$#181!144?G$#144!145?G$#240!146?G$#164!147?G$#146!148?G$#158!149?G$#146!150?G$#156!151?G$#121!152?G$#114!153?G$#145!154?G$#141!155?GG$#158!157?G$#124!158?G$#158!159?G$#122!160?G$#145!161?G$#146!162?G$#114!163?G$#133!164?G$#145!165?G$#133!166?G$#120!167?G$#119!168?G$#125!169?GG$#114!171?G$#121!172?G$#97!173?G$#121!174?G$#161!175?GG$#181!177?G$#210!178?G$#179!179?G$#213!180?G$#198!181?GG$#159!183?G$#208!184?G$#179!185?G$#200!186?G$#210!187?GG$#227!189?G$#213!190?GG$#227!192?G$#226!193?G$#225!194?G$#211!195?G$#227!196?G$#226!197?G$#196!198?G$#183!199?G$#125!200?G$#144!201?G$#163!202?G$#158!203?G$#160!204?G$#145!205?G$#158!206?G$#133!207?G$#139!208?G$#159!209?G$#163!210?G$#164!211?G$#163!212?G$#181!213?G$#177!214?GGGG$#159!218?GG$#155!220?G$#163!221?G$#181!222?G$#183!223?GGG$#146!226?G$#151!227?G$#154!228?G$#167!229?G$#165!230?G$#173!231?G$#151!232?G$#167!233?G$#180!234?GG$#202!236?G$#214!237?GGG$#212!240?G$#215!241?G$#204!242?G$#205!243?G$#202!244?G$#215!245?GG$#204!247?G$#214!248?G$#218!249?G$#214!250?G$#215!251?G$#224!252?G$#218!253?GG$#219!255?G$#223!256?G$#231!257?GGGG$#235!261?G$#231!262?G$#234!263?G$#231!264?GG$#232!266?G$#239!267?G$#18O$#24!1?O$#11!2?O$#4!3?O$#18!4?OOOO$#22!8?O$#30!9?O$#36!10?O$#37!11?O$#32!12?O$#36!13?O$#31!14?O$#30!15?O$#27!16?O$#30!17?O$#22!18?O$#30!19?OO$#27!21?OO$#30!23?O$#24!24?OO$#18!26?O$#11!27?OOOO$#4!31?O$#7!32?O$#1!33?O$#7!34?OOOO$#12!38?O$#7!39?O$#12!40?O$#14!41?O$#5!42?OO$#12!44?OOO$#11!47?O$#14!48?O$#12!49?O$#11!50?O$#19!51?O$#48!52?O$#114!53?O$#115!54?O$#133!55?O$#164!56?O$#151!57?O$#154!58?OO$#150!60?O$#167!61?OOO$#180!64?O$#176!65?O$#214!66?O$#165!67?O$#171!68?O$#165!69?O$#149!70?O$#117!71?O$#153!72?O$#130!73?O$#98!74?OO$#65!76?OO$#130!78?O$#90!79?O$#65!80?O$#126!81?O$#137!82?O$#117!83?O$#135!84?OO$#146!86?O$#179!87?O$#164!88?O$#179!89?O$#135!90?O$#100!91?O$#119!92?O$#116!93?O$#133!94?O$#105!95?O$#129!96?O$#97!97?O$#122!98?O$#129!99?O$#113!100?O$#114!101?O$#120!102?O$#112!103?O$#129!104?O$#133!105?O$#113!106?OO$#124!108?O$#122!109?O$#141!110?O$#144!111?O$#146!112?O$#164!113?OO$#127!115?O$#198!116?O$#164!117?O$#198!118?O$#159!119?O$#200!120?O$#181!121?O$#207!122?O$#177!123?OO$#181!125?O$#229!126?O$#172!127?O$#170!128?O$#177!129?O$#179!130?O$#213!131?O$#210!132?OO$#151!134?O$#200!135?OO$#181!137?O$#179!138?O$#183!139?O$#181!140?O$#156!141?O$#155!142?O$#146!143?OOO$#125!146?O$#163!147?O$#120!148?O$#113!149?O$#146!150?O$#115!151?O$#114!152?O$#122!153?O$#164!154?O$#145!155?O$#141!156?OO$#170!158?O$#133!159?O$#141!160?OO$#121!162?O$#200!163?O$#155!164?O$#159!165?O$#108!166?O$#135!167?O$#108!168?O$#112!169?O$#119!170?O$#90!171?O$#113!172?O$#129!173?O$#133!174?O$#145!175?O$#172!176?O$#164!177?O$#181!178?O$#227!179?O$#198!180?O$#179!181?O$#210!182?O$#179!183?O$#198!184?O$#179!185?O$#200!186?O$#210!187?O$#209!188?O$#192!189?O$#183!190?O$#227!191?OO$#225!193?O$#227!194?OOOO$#192!198?O$#183!199?O$#146!200?O$#158!201?OO$#160!203?O$#164!204?O$#158!205?OO$#145!207?O$#162!208?O$#158!209?O$#163!210?O$#164!211?O$#158!212?OO$#162!214?O$#159!215?O$#172!216?OO$#181!218?O$#163!219?O$#155!220?O$#159!221?O$#154!222?O$#179!223?O$#172!224?O$#154!225?O$#135!226?O$#154!227?OOO$#167!230?O$#165!231?O$#150!232?O$#167!233?O$#165!234?O$#180!235?O$#202!236?O$#215!237?O$#214!238?O$#205!239?OO$#216!241?O$#215!242?O$#205!243?O$#214!244?OO$#215!246?OOOO$#218!250?O$#215!251?O$#218!252?O$#215!253?O$#214!254?O$#223!255?O$#222!256?O$#224!257?O$#223!258?O$#231!259?OO$#234!261?O$#235!262?O$#225!263?O$#235!264?O$#231!265?O$#242!266?O$#239!267?O$#18__$#11!2?_$#18!3?_$#11!4?_$#18!5?_$#22!6?__$#23!8?_$#34!9?_$#36!10?_$#37!11?_$#34!12?_$#31!13?_$#30!14?_$#27!15?__$#22!17?_$#27!18?_$#30!19?_$#27!20?_$#30!21?__$#27!23?_$#18!24?_$#27!25?_$#19!26?__$#11!28?__$#4!30?_$#7!31?___$#4!34?_$#11!35?_$#7!36?_$#12!37?_$#7!38?_$#12!39?__$#5!41?_$#12!42?__$#14!44?_$#12!45?__$#21!47?_$#11!48?__$#22!50?_$#27!51?_$#114!52?_$#113!53?_$#100!54?_$#133!55?_$#154!56?__$#167!58?_$#153!59?_$#167!60?__$#176!62?___$#195!65?__$#187!67?_$#204!68?_$#130!69?_$#147!70?_$#116!71?__$#102!73?_$#98!74?_$#116!75?_$#98!76?_$#86!77?_$#149!78?_$#117!79?_$#98!80?_$#99!81?__$#92!83?_$#137!84?_$#154!85?_$#209!86?_$#164!87?_$#146!88?_$#108!89?_$#125!90?_$#151!91?_$#145!92?_$#158!93?_$#113!94?__$#97!96?_$#120!97?_$#133!98?_$#158!99?_$#114!100?_$#159!101?_$#90!102?_$#115!103?_$#145!104?_$#113!105?___$#114!108?_$#158!109?_$#141!110?_$#155!111?_$#163!112?_$#120!113?_$#144!114?_$#155!115?_$#159!116?_$#164!117?_$#213!118?__$#207!120?_$#210!121?_$#229!122?_$#183!123?_$#200!124?_$#207!125?__$#177!127?_$#144!128?_$#170!129?_$#210!130?__$#207!132?_$#181!133?_$#125!134?_$#181!135?_$#177!136?_$#164!137?_$#177!138?_$#198!139?_$#135!140?_$#144!141?_$#135!142?_$#125!143?___$#121!146?_$#196!147?_$#113!148?__$#119!150?_$#200!151?_$#133!152?_$#122!153?_$#129!154?_$#208!155?_$#141!156?_$#129!157?_$#141!158?_$#177!159?_$#145!160?_$#139!161?_$#133!162?_$#145!163?_$#146!164?__$#114!166?_$#119!167?_$#115!168?_$#114!169?__$#120!171?_$#122!172?_$#141!173?_$#162!174?_$#170!175?_$#181!176?_$#198!177?__$#213!179?_$#192!180?__$#155!182?_$#183!183?_$#198!184?_$#183!185?_$#200!186?_$#198!187?_$#209!188?__$#211!190?___$#226!193?__$#227!195?_$#211!196?__$#192!198?_$#172!199?_$#143!200?_$#144!201?_$#145!202?__$#155!204?_$#159!205?__$#144!207?_$#146!208?_$#133!209?_$#163!210?_$#159!211?_$#155!212?_$#164!213?_$#159!214?_$#156!215?_$#172!216?_$#164!217?_$#163!218?_$#164!219?_$#159!220?_$#162!221?_$#155!222?_$#163!223?_$#154!224?_$#135!225?_$#126!226?_$#146!227?_$#154!228?___$#150!231?_$#165!232?_$#150!233?_$#153!234?_$#173!235?_$#180!236?_$#205!237?__$#202!239?_$#205!240?_$#216!241?_$#217!242?_$#215!243?_$#205!244?_$#218!245?_$#215!246?_$#214!247?__$#215!249?_$#214!250?_$#218!251?___$#214!254?_$#219!255?_$#224!256?_$#231!257?_$#224!258?_$#232!259?__$#234!261?_$#231!262?_____$#239!267?_$-#22@$#24!1?@@$#18!3?@@$#24!5?@$#11!6?@$#23!7?@@@$#36!10?@@$#34!12?@$#32!13?@$#30!14?@@$#27!16?@@$#18!18?@$#31!19?@$#27!20?@@@$#30!23?@$#27!24?@$#18!25?@$#19!26?@$#21!27?@$#11!28?@@$#5!30?@$#4!31?@$#7!32?@@$#4!34?@@@$#1!37?@$#7!38?@$#12!39?@@$#5!41?@@$#12!43?@$#5!44?@$#12!45?@@$#7!47?@$#11!48?@$#21!49?@$#14!50?@$#61!51?@$#97!52?@$#100!53?@$#143!54?@$#151!55?@$#140!56?@$#165!57?@$#154!58?@$#165!59?@$#153!60?@$#176!61?@@@$#195!64?@$#199!65?@$#165!66?@$#157!67?@$#153!68?@$#117!69?@$#148!70?@$#137!71?@$#98!72?@@@@$#137!76?@$#102!77?@@$#86!79?@$#116!80?@$#59!81?@$#107!82?@$#86!83?@$#117!84?@$#167!85?@$#86!86?@@$#151!88?@$#181!89?@$#108!90?@$#125!91?@$#120!92?@$#121!93?@$#141!94?@$#114!95?@@$#124!97?@$#129!98?@$#145!99?@$#144!100?@$#108!101?@$#105!102?@$#133!103?@$#115!104?@$#121!105?@$#90!106?@$#113!107?@$#97!108?@$#158!109?@$#145!110?@$#120!111?@$#114!112?@$#144!113?@$#141!114?@$#163!115?@$#159!116?@$#172!117?@$#198!118?@$#213!119?@$#210!120?@$#213!121?@$#228!122?@$#209!123?@$#208!124?@$#207!125?@$#158!126?@@$#177!128?@$#181!129?@$#200!130?@$#208!131?@$#177!132?@$#181!133?@$#115!134?@$#161!135?@$#162!136?@@$#163!138?@$#146!139?@$#143!140?@$#125!141?@$#115!142?@$#133!143?@$#127!144?@$#113!145?@$#112!146?@$#179!147?@$#114!148?@@$#120!150?@@$#121!152?@$#122!153?@$#158!154?@$#141!155?@$#144!156?@$#122!157?@$#145!158?@$#129!159?@$#181!160?@$#133!161?@$#114!162?@$#113!163?@$#121!164?@$#133!165?@$#164!166?@$#105!167?@$#97!168?@$#121!169?@$#118!170?@$#141!171?@@$#170!173?@$#164!174?@@$#172!176?@$#198!177?@$#172!178?@$#209!179?@$#198!180?@$#209!181?@$#179!182?@$#163!183?@$#156!184?@$#183!185?@@$#196!187?@@$#211!189?@$#227!190?@$#211!191?@$#227!192?@$#226!193?@@@$#227!196?@$#209!197?@$#196!198?@$#154!199?@$#135!200?@$#146!201?@$#160!202?@$#144!203?@$#120!204?@$#144!205?@$#145!206?@$#129!207?@$#158!208?@$#162!209?@$#164!210?@$#172!211?@$#146!212?@$#155!213?@$#159!214?@$#163!215?@$#151!216?@$#146!217?@$#143!218?@$#110!219?@$#135!220?@$#143!221?@$#135!222?@$#143!223?@$#146!224?@$#127!225?@$#126!226?@$#150!227?@$#154!228?@$#150!229?@@@$#149!232?@$#153!233?@$#165!234?@$#166!235?@$#176!236?@$#205!237?@$#204!238?@$#205!239?@@$#215!241?@$#216!242?@$#214!243?@$#205!244?@$#214!245?@$#204!246?@$#214!247?@@$#218!249?@@$#219!251?@@$#215!253?@$#219!254?@@$#224!256?@$#231!257?@@@$#232!260?@$#231!261?@$#224!262?@$#235!263?@$#231!264?@$#224!265?@$#232!266?@@$#22A$#18!1?AAAA$#24!5?A$#18!6?A$#15!7?A$#23!8?A$#32!9?A$#34!10?A$#23!11?A$#36!12?A$#34!13?A$#30!14?AA$#27!16?AAA$#31!19?A$#30!20?A$#27!21?A$#22!22?A$#27!23?AA$#21!25?A$#19!26?AAA$#4!29?AAA$#7!32?AA$#4!34?A$#11!35?AA$#7!37?AA$#12!39?A$#5!40?A$#12!41?AAAA$#14!45?A$#7!46?A$#11!47?A$#7!48?A$#19!49?A$#6!50?A$#105!51?A$#143!52?A$#110!53?A$#143!54?A$#151!55?A$#154!56?AA$#167!58?AA$#176!60?A$#195!61?AA$#166!63?A$#195!64?A$#212!65?A$#149!66?A$#147!67?A$#130!68?A$#98!69?A$#130!70?A$#102!71?A$#137!72?A$#102!73?AAAAA$#86!78?A$#92!79?A$#98!80?A$#86!81?A$#117!82?A$#98!83?A$#136!84?A$#86!85?A$#90!86?A$#136!87?A$#90!88?A$#125!89?A$#151!90?A$#135!91?A$#133!92?AA$#113!94?A$#133!95?A$#114!96?A$#128!97?AA$#161!99?A$#141!100?A$#120!101?A$#121!102?A$#133!103?A$#145!104?A$#90!105?A$#114!106?A$#97!107?AA$#114!109?A$#113!110?A$#120!111?A$#97!112?AA$#105!114?A$#161!115?A$#145!116?A$#163!117?A$#200!118?A$#198!119?A$#183!120?A$#198!121?AA$#181!123?A$#158!124?AA$#141!126?A$#120!127?A$#181!128?AAA$#200!131?A$#145!132?A$#177!133?A$#112!134?A$#155!135?A$#172!136?A$#144!137?A$#135!138?A$#110!139?A$#100!140?A$#115!141?A$#112!142?A$#108!143?A$#200!144?A$#114!145?A$#105!146?A$#120!147?A$#179!148?A$#113!149?A$#118!150?A$#133!151?A$#229!152?A$#158!153?A$#141!154?A$#145!155?A$#129!156?A$#133!157?A$#145!158?A$#141!159?A$#133!160?A$#164!161?A$#114!162?A$#113!163?A$#114!164?A$#112!165?A$#97!166?A$#105!167?A$#120!168?A$#114!169?A$#121!170?A$#145!171?A$#161!172?A$#145!173?A$#170!174?A$#164!175?A$#179!176?A$#198!177?A$#179!178?A$#156!179?A$#163!180?A$#177!181?A$#183!182?A$#164!183?A$#162!184?A$#179!185?A$#192!186?A$#209!187?A$#196!188?A$#209!189?AA$#227!191?AA$#209!193?A$#211!194?A$#227!195?A$#209!196?AA$#192!198?A$#179!199?A$#151!200?A$#146!201?A$#156!202?A$#145!203?AA$#155!205?A$#120!206?A$#146!207?A$#139!208?A$#155!209?A$#144!210?A$#162!211?A$#159!212?A$#163!213?A$#146!214?A$#144!215?A$#125!216?A$#135!217?A$#146!218?A$#135!219?A$#105!220?A$#110!221?A$#125!222?AA$#126!224?A$#110!225?A$#116!226?A$#140!227?A$#151!228?A$#137!229?AA$#148!231?A$#150!232?A$#153!233?A$#165!234?AA$#187!236?AA$#193!238?AA$#195!240?A$#205!241?AAAAA$#204!246?A$#215!247?A$#214!248?A$#221!249?A$#218!250?AAA$#214!253?A$#221!254?A$#219!255?AA$#224!257?A$#222!258?A$#234!259?A$#231!260?AA$#234!262?A$#231!263?A$#225!264?A$#231!265?A$#232!266?A$#239!267?A$#22C$#18!1?CCCCC$#24!6?C$#22!7?C$#23!8?C$#30!9?C$#34!10?CC$#36!12?C$#34!13?C$#36!14?C$#27!15?CC$#18!17?C$#27!18?CC$#30!20?CCC$#22!23?C$#27!24?C$#18!25?C$#19!26?CC$#11!28?CC$#5!30?C$#4!31?CC$#11!33?C$#4!34?C$#5!35?CC$#7!37?C$#14!38?C$#12!39?C$#14!40?C$#5!41?C$#12!42?C$#11!43?C$#7!44?C$#12!45?C$#11!46?C$#7!47?C$#11!48?CC$#59!50?C$#120!51?C$#110!52?C$#112!53?C$#140!54?C$#151!55?C$#165!56?C$#153!57?C$#165!58?CC$#196!60?C$#180!61?CC$#176!63?CCC$#130!66?C$#102!67?C$#116!68?C$#165!69?C$#130!70?C$#102!71?C$#136!72?C$#116!73?C$#125!74?C$#130!75?C$#92!76?C$#98!77?CC$#88!79?C$#98!80?C$#137!81?C$#130!82?C$#98!83?C$#86!84?C$#79!85?CC$#143!87?C$#125!88?C$#98!89?C$#165!90?C$#97!91?C$#125!92?C$#116!93?C$#163!94?C$#160!95?C$#129!96?C$#113!97?C$#128!98?C$#141!99?CC$#161!101?C$#141!102?C$#129!103?C$#139!104?C$#121!105?C$#113!106?C$#158!107?CC$#170!109?C$#144!110?C$#145!111?C$#121!112?CC$#113!114?C$#90!115?C$#145!116?C$#181!117?C$#179!118?C$#200!119?C$#179!120?C$#177!121?C$#158!122?C$#141!123?C$#161!124?CC$#158!126?C$#155!127?C$#162!128?C$#164!129?C$#146!130?C$#163!131?C$#144!132?C$#162!133?C$#115!134?C$#146!135?C$#139!136?C$#115!137?C$#97!138?C$#100!139?C$#105!140?C$#144!141?C$#114!142?C$#120!143?CCC$#122!146?C$#120!147?C$#200!148?C$#114!149?C$#120!150?C$#141!151?C$#133!152?C$#120!153?C$#141!154?C$#121!155?C$#118!156?C$#164!157?C$#113!158?C$#133!159?C$#114!160?CC$#115!162?C$#105!163?C$#90!164?CC$#124!166?C$#128!167?C$#141!168?C$#158!169?C$#145!170?C$#162!171?C$#177!172?C$#170!173?C$#172!174?C$#159!175?C$#172!176?C$#192!177?C$#198!178?C$#183!179?C$#156!180?C$#164!181?C$#163!182?C$#172!183?C$#177!184?C$#198!185?C$#192!186?C$#196!187?C$#209!188?C$#196!189?C$#209!190?CC$#211!192?C$#209!193?CC$#227!195?C$#211!196?C$#192!197?C$#209!198?C$#179!199?C$#154!200?C$#146!201?C$#156!202?C$#172!203?C$#146!204?CC$#144!206?CC$#145!208?CCCC$#133!212?C$#125!213?C$#144!214?C$#135!215?CCC$#110!218?C$#117!219?C$#110!220?C$#105!221?C$#110!222?C$#108!223?C$#110!224?C$#103!225?C$#116!226?C$#135!227?C$#126!228?C$#137!229?CC$#152!231?C$#165!232?CC$#168!234?C$#165!235?C$#187!236?C$#193!237?CC$#194!239?CC$#204!241?C$#214!242?C$#205!243?C$#214!244?C$#205!245?C$#214!246?C$#205!247?C$#218!248?CC$#214!250?C$#218!251?CC$#219!253?C$#221!254?C$#223!255?C$#219!256?C$#224!257?C$#231!258?CC$#232!260?C$#224!261?C$#225!262?CCC$#231!265?C$#222!266?C$#232!267?C$#11G$#18!1?GG$#11!3?G$#18!4?G$#27!5?G$#18!6?G$#22!7?G$#30!8?G$#32!9?G$#34!10?G$#32!11?G$#34!12?GG$#31!14?G$#30!15?G$#22!16?G$#18!17?G$#27!18?G$#31!19?G$#27!20?GG$#30!22?G$#18!23?G$#27!24?GG$#18!26?G$#19!27?G$#11!28?GG$#4!30?G$#7!31?G$#1!32?GG$#7!34?GGG$#11!37?G$#7!38?G$#12!39?G$#5!40?G$#12!41?G$#5!42?G$#7!43?G$#12!44?GG$#14!46?G$#11!47?G$#21!48?G$#22!49?G$#108!50?G$#125!51?G$#116!52?G$#135!53?G$#143!54?G$#150!55?G$#154!56?G$#167!57?G$#153!58?G$#165!59?G$#166!60?G$#176!61?G$#165!62?GG$#187!64?G$#153!65?GG$#130!67?G$#102!68?GG$#116!70?GG$#136!72?G$#137!73?G$#116!74?G$#98!75?G$#88!76?G$#92!77?G$#98!78?G$#99!79?G$#88!80?G$#97!81?G$#98!82?G$#65!83?GG$#92!85?G$#99!86?G$#110!87?G$#90!88?G$#98!89?G$#99!90?G$#88!91?G$#65!92?G$#61!93?G$#90!94?G$#135!95?G$#120!96?G$#145!97?G$#141!98?GG$#161!100?G$#141!101?G$#129!102?G$#158!103?G$#121!104?G$#158!105?G$#141!106?G$#133!107?G$#120!108?G$#158!109?G$#105!110?G$#170!111?G$#133!112?G$#120!113?G$#112!114?G$#88!115?G$#90!116?G$#177!117?G$#163!118?G$#155!119?G$#159!120?G$#158!121?G$#114!122?G$#120!123?G$#141!124?G$#158!125?G$#163!126?G$#159!127?GG$#125!129?G$#155!130?G$#158!131?G$#119!132?G$#120!133?G$#125!134?G$#112!135?G$#115!136?G$#100!137?G$#115!138?G$#112!139?G$#177!140?G$#114!141?G$#120!142?G$#129!143?G$#139!144?G$#125!145?G$#120!146?G$#121!147?G$#120!148?G$#143!149?G$#129!150?GGG$#229!153?G$#141!154?G$#120!155?G$#158!156?G$#133!157?G$#179!158?G$#141!159?G$#113!160?GG$#100!162?G$#90!163?G$#114!164?G$#90!165?G$#113!166?G$#133!167?G$#141!168?G$#158!169?GG$#170!171?GG$#183!173?G$#172!174?GG$#179!176?G$#198!177?G$#183!178?G$#154!179?G$#179!180?GG$#164!182?G$#163!183?G$#172!184?G$#192!185?G$#196!186?G$#192!187?GG$#198!189?G$#209!190?GGG$#210!193?G$#198!194?G$#209!195?GG$#196!197?GG$#183!199?G$#165!200?G$#151!201?G$#135!202?G$#146!203?G$#159!204?G$#146!205?G$#144!206?G$#120!207?G$#114!208?G$#146!209?GGGG$#125!213?G$#156!214?G$#125!215?G$#143!216?GG$#135!218?G$#103!219?GG$#110!221?GG$#103!223?G$#79!224?G$#92!225?G$#107!226?G$#117!227?G$#123!228?G$#137!229?G$#148!230?GG$#157!232?G$#165!233?G$#175!234?G$#168!235?G$#175!236?G$#187!237?G$#193!238?GG$#201!240?G$#216!241?G$#193!242?G$#205!243?GG$#204!245?G$#216!246?G$#215!247?GG$#219!249?G$#215!250?G$#218!251?GG$#219!253?G$#221!254?G$#222!255?G$#224!256?G$#231!257?G$#221!258?G$#231!259?GG$#219!261?G$#225!262?G$#224!263?G$#226!264?G$#223!265?GG$#232!267?G$#24OO$#18!2?O$#24!3?O$#18!4?O$#24!5?OO$#27!7?O$#30!8?O$#32!9?O$#34!10?OO$#36!12?O$#34!13?O$#31!14?OO$#27!16?O$#18!17?O$#27!18?OOOO$#22!22?OO$#24!24?O$#19!25?O$#11!26?O$#18!27?O$#11!28?O$#4!29?OO$#7!31?O$#11!32?O$#4!33?O$#11!34?O$#4!35?O$#7!36?OO$#11!38?O$#12!39?OOO$#5!42?O$#12!43?OO$#14!45?OO$#11!47?OO$#66!49?O$#133!50?O$#105!51?O$#136!52?O$#116!53?O$#154!54?O$#165!55?O$#137!56?O$#165!57?O$#153!58?OO$#165!60?O$#142!61?O$#148!62?O$#153!63?O$#176!64?O$#130!65?O$#117!66?O$#102!67?OOO$#116!70?O$#102!71?O$#137!72?OO$#116!74?O$#98!75?O$#90!76?O$#98!77?O$#102!78?O$#98!79?O$#102!80?OO$#98!82?O$#92!83?O$#58!84?O$#92!85?O$#86!86?O$#88!87?O$#90!88?O$#97!89?O$#90!90?O$#86!91?O$#59!92?O$#58!93?O$#79!94?O$#91!95?O$#99!96?O$#141!97?O$#158!98?O$#129!99?O$#141!100?OO$#161!102?O$#122!103?O$#129!104?O$#128!105?OO$#145!107?OO$#141!109?O$#120!110?O$#158!111?O$#113!112?O$#120!113?O$#114!114?O$#90!115?O$#115!116?O$#114!117?O$#162!118?O$#133!119?O$#121!120?O$#114!121?O$#108!122?O$#133!123?O$#160!124?O$#146!125?O$#135!126?O$#125!127?O$#144!128?OOO$#146!131?O$#125!132?O$#114!133?O$#105!134?O$#116!135?O$#120!136?O$#133!137?O$#113!138?O$#119!139?O$#125!140?O$#144!141?O$#162!142?O$#133!143?O$#145!144?O$#208!145?O$#158!146?O$#133!147?O$#121!148?O$#159!149?O$#200!150?O$#114!151?OO$#139!153?O$#133!154?OO$#145!156?O$#129!157?O$#113!158?O$#125!159?O$#120!160?O$#97!161?O$#90!162?O$#112!163?O$#114!164?O$#113!165?O$#128!166?O$#141!167?O$#161!168?OO$#162!170?O$#170!171?O$#181!172?O$#159!173?O$#210!174?O$#179!175?O$#164!176?OO$#151!178?O$#164!179?O$#172!180?O$#179!181?O$#151!182?O$#179!183?O$#167!184?O$#173!185?O$#192!186?OOO$#183!189?O$#192!190?O$#198!191?O$#192!192?O$#198!193?O$#209!194?OOO$#198!197?O$#192!198?OO$#167!200?O$#154!201?O$#127!202?O$#146!203?O$#164!204?O$#156!205?O$#144!206?O$#156!207?O$#146!208?O$#155!209?O$#133!210?O$#144!211?O$#146!212?O$#125!213?O$#135!214?O$#146!215?O$#151!216?OOO$#126!219?O$#103!220?O$#110!221?O$#103!222?O$#84!223?O$#75!224?O$#95!225?O$#107!226?O$#116!227?O$#117!228?O$#126!229?O$#138!230?O$#142!231?O$#165!232?O$#166!233?O$#168!234?OO$#187!236?O$#199!237?O$#193!238?O$#204!239?O$#193!240?O$#216!241?O$#205!242?O$#204!243?O$#215!244?O$#204!245?O$#216!246?OO$#217!248?O$#219!249?O$#214!250?O$#215!251?OO$#218!253?O$#222!254?OO$#223!256?O$#219!257?O$#225!258?O$#231!259?OO$#224!261?O$#219!262?O$#214!263?O$#226!264?O$#224!265?O$#223!266?O$#232!267?O$#22_$#18!1?____$#22!5?_$#18!6?_$#27!7?_$#23!8?_$#34!9?__$#36!11?_$#32!12?_$#34!13?__$#30!15?_$#27!16?_$#22!17?_$#27!18?_$#30!19?__$#22!21?__$#18!23?_$#22!24?_$#27!25?_$#18!26?_$#11!27?_$#4!28?_$#11!29?_$#4!30?_$#7!31?_$#11!32?_$#4!33?_$#5!34?_$#4!35?_$#11!36?_$#4!37?_$#7!38?_$#5!39?_$#12!40?___$#14!43?_$#12!44?_$#14!45?_$#11!46?__$#30!48?_$#133!49?_$#125!50?_$#116!51?__$#140!53?_$#150!54?_$#148!55?_$#153!56?__$#149!58?_$#148!59?_$#130!60?_$#149!61?_$#130!62?___$#102!65?_$#116!66?_$#98!67?_$#102!68?__$#116!70?_$#136!71?_$#154!72?_$#137!73?_$#98!74?__$#102!76?__$#136!78?_$#119!79?_$#98!80?_$#97!81?_$#86!82?_$#65!83?_$#79!84?_$#86!85?_$#102!86?_$#98!87?_$#88!88?_$#99!89?_$#90!90?_$#86!91?_$#79!92?_$#58!93?_$#59!94?_$#65!95?_$#89!96?_$#112!97?_$#158!98?_$#122!99?_$#162!100?_$#129!101?_$#161!102?__$#158!104?_$#128!105?_$#122!106?_$#124!107?_$#141!108?__$#158!110?_$#113!111?__$#120!113?_$#141!114?_$#114!115?_$#121!116?_$#119!117?_$#113!118?_$#114!119?_$#120!120?_$#129!121?_$#146!122?_$#133!123?_$#144!124?_$#135!125?_$#115!126?_$#143!127?_$#133!128?_$#119!129?_$#133!130?_$#100!131?_$#116!132?_$#99!133?_$#115!134?__$#133!136?_$#108!137?_$#125!138?_$#135!139?_$#146!140?___$#125!143?_$#144!144?_$#139!145?_$#144!146?_$#162!147?_$#128!148?_$#145!149?_$#155!150?_$#145!151?__$#121!153?_$#229!154?_$#145!155?_$#120!156?_$#113!157?__$#114!159?__$#97!161?__$#114!163?_$#163!164?_$#122!165?_$#129!166?_$#145!167?_$#158!168?____$#177!172?_$#183!173?__$#179!175?__$#172!177?_$#164!178?_$#172!179?_$#155!180?_$#163!181?_$#179!182?_$#172!183?_$#183!184?__$#179!186?_$#183!187?_$#172!188?_$#156!189?_$#183!190?___$#198!193?_$#209!194?__$#183!196?_$#209!197?_$#182!198?_$#192!199?_$#172!200?_$#167!201?_$#136!202?_$#127!203?_$#146!204?_$#156!205?_$#146!206?_$#155!207?_$#144!208?__$#164!210?_$#163!211?_$#146!212?_$#143!213?_$#135!214?_$#146!215?_$#143!216?_$#135!217?_$#127!218?_$#110!219?_$#99!220?_$#92!221?_$#93!222?_$#56!223?_$#73!224?_$#94!225?_$#107!226?_$#116!227?_$#123!228?_$#126!229?_$#138!230?__$#153!232?_$#165!233?_$#173!234?_$#168!235?__$#187!237?_$#193!238?_$#204!239?_$#193!240?_$#216!241?_$#194!242?_$#202!243?__$#205!245?_$#206!246?_$#216!247?_$#217!248?_$#215!249?___$#218!252?_$#215!253?_$#219!254?_$#223!255?_$#224!256?_$#221!257?__$#219!259?_$#231!260?_$#224!261?_$#225!262?___$#223!265?_$#220!266?_$#232!267?_$-#23@$#18!1?@$#22!2?@$#4!3?@$#24!4?@$#23!5?@@$#32!7?@$#34!8?@$#30!9?@$#36!10?@@$#32!12?@$#36!13?@$#34!14?@$#31!15?@$#30!16?@$#27!17?@$#18!18?@$#27!19?@$#30!20?@$#27!21?@$#22!22?@$#30!23?@$#11!24?@$#19!25?@@$#4!27?@$#11!28?@@$#4!30?@@$#11!32?@$#4!33?@$#19!34?@$#1!35?@$#11!36?@$#7!37?@@$#12!39?@$#5!40?@$#12!41?@@@@$#11!45?@@$#19!47?@$#37!48?@$#133!49?@$#116!50?@$#115!51?@$#125!52?@$#137!53?@$#154!54?@$#136!55?@$#153!56?@@$#149!58?@$#147!59?@$#130!60?@$#117!61?@$#130!62?@$#117!63?@$#102!64?@$#98!65?@@$#102!67?@@$#116!69?@$#119!70?@$#154!71?@$#137!72?@$#116!73?@$#98!74?@@$#116!76?@$#119!77?@@$#102!79?@$#97!80?@$#98!81?@$#88!82?@@@$#99!85?@$#102!86?@$#90!87?@$#97!88?@$#87!89?@$#102!90?@$#88!91?@$#65!92?@$#61!93?@$#54!94?@$#65!95?@$#86!96?@$#112!97?@$#108!98?@$#144!99?@$#145!100?@$#114!101?@$#158!102?@$#141!103?@$#161!104?@$#133!105?@$#122!106?@$#158!107?@$#145!108?@$#121!109?@$#129!110?@$#139!111?@$#97!112?@$#113!113?@@$#112!115?@$#120!116?@$#133!117?@$#114!118?@$#115!119?@$#125!120?@$#135!121?@$#115!122?@$#125!123?@$#110!124?@$#116!125?@$#105!126?@$#115!127?@$#100!128?@$#108!129?@$#112!130?@$#97!131?@$#87!132?@$#116!133?@$#110!134?@$#116!135?@$#119!136?@$#100!137?@$#125!138?@$#146!139?@$#143!140?@$#179!141?@$#114!142?@$#146!143?@$#144!144?@$#133!145?@$#200!146?@$#133!147?@$#158!148?@$#155!149?@$#146!150?@$#172!151?@$#145!152?@$#128!153?@$#145!154?@$#139!155?@$#113!156?@$#122!157?@$#120!158?@$#113!159?@$#112!160?@$#97!161?@$#114!162?@$#120!163?@$#129!164?@$#145!165?@$#141!166?@$#162!167?@$#158!168?@$#161!169?@$#163!170?@$#181!171?@$#162!172?@$#181!173?@$#198!174?@$#172!175?@$#135!176?@$#156!177?@$#172!178?@$#163!179?@$#164!180?@$#172!181?@$#183!182?@$#198!183?@$#179!184?@$#183!185?@$#172!186?@@$#164!188?@$#172!189?@@$#179!191?@$#198!192?@@@$#183!195?@$#198!196?@$#196!197?@$#192!198?@$#164!199?@$#167!200?@$#165!201?@$#140!202?@$#116!203?@$#135!204?@$#146!205?@$#144!206?@$#146!207?@@$#135!209?@$#144!210?@$#133!211?@$#146!212?@$#125!213?@$#146!214?@$#135!215?@$#125!216?@$#143!217?@$#135!218?@$#103!219?@$#89!220?@$#92!221?@$#79!222?@$#53!223?@$#62!224?@$#79!225?@$#107!226?@$#117!227?@@$#130!229?@$#123!230?@$#130!231?@$#142!232?@$#157!233?@$#166!234?@$#176!235?@@$#193!237?@@$#194!239?@@$#215!241?@$#204!242?@$#202!243?@$#205!244?@$#204!245?@$#216!246?@@$#206!248?@$#204!249?@$#214!250?@$#219!251?@$#218!252?@$#219!253?@@$#223!255?@$#224!256?@$#219!257?@$#224!258?@@@@$#226!262?@$#218!263?@@$#219!265?@$#232!266?@$#222!267?@$#23A$#22!1?AA$#24!3?A$#18!4?A$#22!5?A$#32!6?AAA$#23!9?A$#34!10?A$#32!11?A$#34!12?AA$#36!14?A$#31!15?A$#30!16?A$#22!17?A$#27!18?AAAA$#18!22?A$#22!23?A$#24!24?A$#11!25?A$#19!26?A$#11!27?AA$#4!29?AA$#5!31?A$#4!32?A$#11!33?A$#5!34?A$#11!35?AA$#7!37?A$#12!38?AAAA$#7!42?AAA$#11!45?AAA$#54!48?A$#133!49?A$#125!50?A$#110!51?A$#151!52?A$#137!53?A$#153!54?A$#137!55?A$#148!56?A$#137!57?A$#142!58?A$#148!59?A$#117!60?AAA$#116!63?A$#102!64?AA$#97!66?A$#102!67?AA$#116!69?A$#154!70?A$#153!71?A$#130!72?A$#116!73?A$#98!74?A$#90!75?A$#97!76?A$#116!77?A$#112!78?A$#135!79?A$#102!80?A$#98!81?A$#88!82?A$#98!83?A$#88!84?A$#86!85?A$#102!86?A$#65!87?A$#110!88?A$#102!89?AA$#90!91?A$#85!92?A$#65!93?A$#67!94?A$#92!95?A$#86!96?A$#100!97?A$#112!98?A$#105!99?A$#129!100?A$#113!101?AA$#145!103?A$#158!104?A$#139!105?A$#141!106?AA$#145!108?A$#133!109?AA$#121!111?A$#108!112?A$#121!113?A$#113!114?A$#115!115?A$#100!116?A$#105!117?A$#92!118?AA$#99!120?A$#91!121?A$#92!122?A$#99!123?A$#92!124?A$#89!125?A$#99!126?AA$#89!128?A$#99!129?A$#100!130?A$#90!131?A$#99!132?A$#115!133?A$#110!134?A$#125!135?A$#115!136?A$#112!137?A$#143!138?A$#146!139?A$#135!140?A$#112!141?AA$#133!143?AA$#113!145?A$#144!146?A$#120!147?A$#146!148?A$#129!149?A$#145!150?A$#170!151?A$#164!152?A$#121!153?A$#114!154?A$#181!155?A$#113!156?A$#114!157?A$#129!158?A$#118!159?A$#113!160?A$#158!161?A$#129!162?A$#118!163?A$#158!164?A$#145!165?A$#161!166?AA$#158!168?A$#164!169?AA$#181!171?A$#172!172?A$#164!173?A$#183!174?A$#196!175?A$#154!176?A$#144!177?A$#163!178?A$#172!179?A$#181!180?A$#179!181?A$#164!182?A$#183!183?AA$#154!185?A$#164!186?A$#163!187?A$#172!188?A$#163!189?A$#172!190?A$#164!191?A$#179!192?AA$#183!194?A$#198!195?A$#209!196?A$#182!197?A$#192!198?A$#156!199?A$#173!200?AA$#138!202?A$#126!203?A$#112!204?A$#105!205?A$#146!206?AA$#156!208?AA$#146!210?A$#155!211?AA$#144!213?A$#115!214?A$#125!215?A$#146!216?A$#143!217?A$#127!218?A$#103!219?A$#92!220?A$#99!221?A$#67!222?A$#57!223?A$#63!224?A$#93!225?A$#107!226?A$#117!227?AA$#138!229?A$#130!230?A$#147!231?A$#142!232?A$#157!233?A$#165!234?A$#187!235?A$#176!236?A$#194!237?AA$#214!239?A$#193!240?A$#204!241?A$#187!242?AA$#205!244?A$#193!245?A$#203!246?A$#206!247?AA$#204!249?A$#215!250?A$#219!251?A$#221!252?AA$#219!254?A$#221!255?AA$#224!257?A$#225!258?A$#223!259?A$#232!260?A$#231!261?A$#214!262?AA$#219!264?A$#222!265?A$#220!266?A$#219!267?A$#23C$#4!1?C$#24!2?C$#11!3?C$#23!4?CCCC$#34!8?C$#32!9?C$#34!10?C$#32!11?C$#34!12?C$#32!13?C$#34!14?C$#31!15?C$#22!16?CC$#27!18?CC$#18!20?C$#22!21?CCC$#24!24?C$#11!25?CCCC$#4!29?CC$#11!31?CCC$#4!34?C$#19!35?C$#1!36?C$#12!37?C$#7!38?C$#12!39?C$#5!40?C$#14!41?C$#7!42?CC$#11!44?CC$#21!46?C$#19!47?C$#79!48?C$#144!49?C$#110!50?C$#136!51?C$#135!52?C$#137!53?C$#130!54?C$#149!55?C$#148!56?C$#147!57?C$#130!58?C$#117!59?C$#116!60?C$#102!61?CC$#117!63?C$#116!64?C$#102!65?CC$#116!67?CC$#137!69?C$#153!70?C$#130!71?C$#102!72?C$#98!73?CCC$#97!76?C$#98!77?C$#116!78?CCC$#102!81?C$#97!82?C$#88!83?C$#116!84?C$#98!85?CC$#65!87?C$#102!88?C$#105!89?C$#116!90?C$#91!91?C$#65!92?C$#79!93?C$#67!94?C$#92!95?C$#99!96?C$#91!97?C$#112!98?C$#115!99?C$#155!100?C$#108!101?C$#125!102?C$#133!103?C$#115!104?C$#133!105?CC$#125!107?C$#144!108?C$#125!109?C$#108!110?C$#90!111?C$#79!112?C$#65!113?C$#86!114?C$#79!115?C$#61!116?C$#65!117?C$#58!118?C$#66!119?C$#79!120?CCC$#86!123?C$#79!124?C$#99!125?CC$#91!127?C$#99!128?C$#90!129?C$#99!130?C$#110!131?C$#125!132?C$#146!133?C$#99!134?C$#133!135?C$#100!136?C$#115!137?C$#135!138?CCC$#114!141?C$#112!142?C$#113!143?C$#120!144?CC$#133!146?C$#135!147?C$#163!148?C$#113!149?C$#119!150?C$#113!151?C$#144!152?C$#105!153?C$#97!154?C$#113!155?CCC$#122!158?C$#124!159?C$#128!160?C$#121!161?C$#177!162?C$#141!163?C$#158!164?C$#170!165?C$#177!166?C$#170!167?C$#161!168?C$#170!169?C$#164!170?C$#172!171?C$#198!172?C$#163!173?C$#154!174?C$#196!175?C$#154!176?C$#164!177?C$#179!178?C$#177!179?C$#164!180?C$#183!181?C$#165!182?C$#164!183?C$#143!184?C$#127!185?C$#135!186?C$#151!187?C$#146!188?C$#164!189?C$#151!190?C$#156!191?C$#172!192?C$#183!193?C$#167!194?C$#183!195?C$#192!196?C$#173!197?C$#154!198?C$#156!199?C$#182!200?C$#165!201?C$#126!202?CC$#116!204?C$#110!205?CC$#125!207?C$#143!208?C$#115!209?CC$#119!211?C$#144!212?C$#125!213?C$#144!214?C$#125!215?C$#135!216?C$#140!217?C$#127!218?C$#110!219?C$#92!220?CC$#75!222?C$#57!223?C$#62!224?C$#93!225?C$#107!226?C$#117!227?CC$#138!229?CC$#157!231?C$#152!232?C$#153!233?C$#165!234?C$#176!235?CC$#188!237?C$#194!238?C$#188!239?C$#194!240?C$#206!241?C$#187!242?CC$#193!244?C$#194!245?C$#206!246?C$#216!247?C$#206!248?C$#204!249?C$#214!250?C$#215!251?C$#219!252?C$#220!253?C$#219!254?C$#214!255?C$#218!256?C$#219!257?CC$#222!259?CCC$#218!262?CC$#219!264?CC$#220!266?C$#232!267?C$#22G$#24!1?G$#18!2?G$#22!3?G$#15!4?GG$#23!6?GG$#34!8?GGGG$#32!12?G$#34!13?GG$#31!15?G$#27!16?GGGGGG$#22!22?GG$#11!24?G$#24!25?G$#19!26?G$#11!27?GG$#4!29?GG$#11!31?G$#4!32?GG$#11!34?GG$#7!36?G$#5!37?G$#7!38?G$#12!39?G$#5!40?G$#12!41?GG$#11!43?G$#7!44?G$#14!45?G$#11!46?G$#19!47?G$#107!48?G$#125!49?G$#116!50?G$#143!51?G$#125!52?G$#136!53?G$#130!54?GG$#117!56?G$#130!57?G$#117!58?G$#116!59?G$#102!60?GGGGG$#116!65?G$#102!66?G$#130!67?GG$#148!69?G$#137!70?G$#116!71?G$#98!72?GG$#102!74?GGG$#90!77?G$#65!78?G$#86!79?G$#98!80?G$#136!81?G$#102!82?G$#90!83?G$#88!84?G$#98!85?GG$#125!87?G$#119!88?G$#108!89?G$#41!90?GG$#67!92?G$#79!93?G$#67!94?G$#79!95?G$#90!96?G$#99!97?G$#126!98?G$#110!99?G$#146!100?G$#110!101?GG$#99!103?G$#79!104?G$#86!105?G$#110!106?G$#103!107?G$#89!108?G$#67!109?G$#59!110?G$#61!111?G$#65!112?GGG$#88!115?G$#86!116?G$#59!117?G$#60!118?G$#61!119?G$#79!120?G$#92!121?G$#91!122?GG$#99!124?G$#90!125?G$#105!126?G$#103!127?G$#105!128?G$#108!129?G$#115!130?G$#125!131?G$#115!132?G$#110!133?GG$#143!135?G$#99!136?G$#135!137?G$#119!138?G$#144!139?G$#113!140?GG$#135!142?G$#114!143?G$#120!144?G$#114!145?G$#108!146?G$#156!147?G$#120!148?G$#105!149?G$#133!150?G$#158!151?G$#113!152?G$#105!153?G$#97!154?G$#113!155?G$#200!156?G$#122!157?G$#141!158?G$#133!159?G$#141!160?G$#158!161?GGG$#170!164?G$#158!165?G$#170!166?G$#164!167?G$#181!168?G$#163!169?G$#181!170?GG$#198!172?GG$#164!174?G$#146!175?G$#172!176?GG$#151!178?G$#181!179?G$#172!180?G$#154!181?GGG$#143!184?G$#126!185?G$#135!186?GG$#151!188?G$#154!189?G$#151!190?GG$#164!192?G$#183!193?G$#167!194?G$#179!195?GG$#165!197?G$#151!198?G$#165!199?G$#173!200?G$#167!201?G$#140!202?G$#126!203?G$#125!204?GG$#115!206?G$#108!207?G$#125!208?G$#110!209?G$#112!210?G$#115!211?G$#125!212?G$#144!213?G$#125!214?G$#135!215?G$#125!216?G$#135!217?G$#140!218?G$#123!219?G$#92!220?G$#103!221?G$#71!222?G$#55!223?G$#62!224?G$#95!225?G$#111!226?G$#117!227?G$#126!228?G$#137!229?GG$#157!231?G$#166!232?G$#153!233?G$#165!234?G$#187!235?G$#199!236?G$#188!237?G$#194!238?G$#193!239?G$#194!240?G$#201!241?G$#193!242?G$#187!243?G$#193!244?G$#204!245?G$#217!246?G$#206!247?G$#216!248?G$#215!249?G$#214!250?G$#218!251?G$#219!252?G$#217!253?G$#221!254?G$#218!255?GG$#219!257?G$#221!258?G$#219!259?G$#223!260?G$#219!261?G$#214!262?GG$#218!264?G$#217!265?G$#220!266?GG$#22O$#24!1?O$#11!2?O$#22!3?O$#18!4?O$#23!5?O$#36!6?O$#30!7?O$#34!8?OO$#36!10?O$#23!11?O$#34!12?O$#36!13?O$#34!14?O$#31!15?O$#27!16?O$#30!17?O$#27!18?O$#30!19?O$#27!20?OOOO$#24!24?OO$#21!26?O$#11!27?O$#4!28?O$#5!29?O$#4!30?O$#7!31?O$#1!32?O$#4!33?O$#11!34?OO$#7!36?O$#11!37?O$#14!38?OO$#12!40?OOO$#5!43?O$#14!44?OO$#19!46?OO$#110!48?O$#125!49?O$#137!50?O$#116!51?OO$#125!53?O$#137!54?O$#130!55?O$#137!56?O$#117!57?O$#130!58?O$#116!59?OO$#130!61?O$#116!62?OO$#130!64?OOO$#137!67?OO$#130!69?O$#117!70?O$#116!71?O$#98!72?OO$#102!74?O$#97!75?OO$#90!77?O$#60!78?O$#59!79?OO$#65!81?O$#117!82?O$#99!83?OO$#116!85?O$#108!86?O$#135!87?O$#99!88?O$#59!89?O$#32!90?OO$#41!92?O$#47!93?O$#46!94?O$#66!95?O$#92!96?O$#116!97?O$#117!98?OO$#79!100?O$#41!101?O$#44!102?O$#38!103?OO$#41!105?OO$#54!107?O$#58!108?O$#66!109?O$#60!110?OO$#65!112?OOO$#86!115?OO$#65!117?OO$#61!119?O$#58!120?O$#85!121?O$#100!122?O$#110!123?O$#99!124?OO$#100!126?O$#99!127?O$#110!128?O$#125!129?O$#105!130?O$#110!131?O$#105!132?O$#110!133?O$#100!134?O$#90!135?O$#116!136?O$#112!137?O$#115!138?O$#121!139?OO$#114!141?O$#120!142?O$#108!143?O$#112!144?O$#115!145?O$#133!146?O$#115!147?O$#112!148?O$#113!149?O$#129!150?OO$#105!152?O$#113!153?O$#143!154?O$#113!155?OO$#120!157?O$#141!158?O$#133!159?O$#141!160?O$#158!161?O$#162!162?OO$#158!164?O$#133!165?O$#163!166?O$#172!167?O$#146!168?O$#179!169?O$#164!170?O$#179!171?O$#155!172?O$#172!173?O$#156!174?O$#181!175?O$#163!176?O$#164!177?O$#163!178?O$#146!179?O$#151!180?O$#135!181?OOO$#151!184?O$#135!185?OO$#143!187?O$#135!188?O$#146!189?O$#151!190?O$#154!191?OO$#183!193?O$#167!194?O$#179!195?O$#151!196?O$#164!197?O$#151!198?O$#165!199?O$#173!200?O$#167!201?O$#150!202?O$#126!203?O$#110!204?O$#135!205?OO$#125!207?O$#116!208?O$#110!209?O$#125!210?OOOO$#135!214?O$#146!215?OO$#127!217?O$#126!218?O$#107!219?O$#103!220?O$#92!221?O$#62!222?O$#56!223?O$#71!224?O$#95!225?O$#111!226?O$#117!227?O$#130!228?O$#138!229?O$#142!230?O$#157!231?OO$#150!233?O$#152!234?O$#168!235?O$#176!236?O$#193!237?O$#194!238?O$#204!239?O$#193!240?OOO$#187!243?O$#193!244?O$#206!245?O$#216!246?OOO$#217!249?O$#214!250?O$#215!251?O$#219!252?O$#221!253?O$#219!254?O$#218!255?O$#212!256?O$#219!257?O$#215!258?O$#223!259?O$#221!260?OO$#218!262?O$#214!263?O$#218!264?O$#219!265?O$#220!266?OO$#11_$#24!1?___$#18!4?_$#23!5?__$#32!7?__$#37!9?_$#27!10?_$#32!11?__$#36!13?_$#20!14?_$#36!15?_$#30!16?_$#27!17?_$#30!18?_$#18!19?_$#22!20?_$#31!21?_$#27!22?_$#24!23?__$#11!25?____$#4!29?__$#7!31?_$#1!32?_$#4!33?__$#11!35?_$#7!36?__$#12!38?_$#14!39?_$#12!40?_$#14!41?____$#1!45?_$#19!46?_$#27!47?_$#65!48?_$#87!49?_$#105!50?_$#137!51?_$#110!52?_$#117!53?_$#116!54?_$#137!55?_$#102!56?_$#126!57?_$#130!58?_$#102!59?__$#116!61?_$#130!62?_$#117!63?_$#130!64?___$#137!67?_$#130!68?_$#136!69?_$#102!70?_____$#90!75?_$#92!76?_$#65!77?_$#88!78?__$#65!80?_$#88!81?__$#130!83?_$#137!84?_$#135!85?_$#99!86?_$#91!87?_$#92!88?_$#40!89?_$#37!90?_$#36!91?_$#34!92?_$#36!93?_$#38!94?__$#47!96?__$#62!98?_$#41!99?_$#38!100?_$#37!101?_$#40!102?_$#37!103?_$#38!104?_$#37!105?_$#41!106?_$#47!107?_$#54!108?_$#58!109?__$#60!111?_$#66!112?_$#61!113?_$#60!114?_$#65!115?_____$#59!120?_$#65!121?_$#89!122?_$#110!123?_$#99!124?___$#105!127?_$#99!128?_$#116!129?__$#125!131?_$#100!132?_$#110!133?_$#125!134?_$#100!135?_$#108!136?_$#105!137?_$#113!138?_$#120!139?_$#114!140?_$#112!141?__$#125!143?_$#115!144?_$#112!145?_$#119!146?__$#125!148?_$#105!149?_$#113!150?_$#97!151?_$#90!152?_$#113!153?_$#133!154?_$#163!155?_$#124!156?_$#177!157?_$#158!158?_$#141!159?_$#158!160?___$#162!163?_$#158!164?__$#162!166?_$#164!167?_$#172!168?__$#163!170?_$#146!171?_$#164!172?__$#198!174?_$#164!175?__$#163!177?_$#146!178?_$#151!179?_$#126!180?__$#135!182?_$#126!183?_$#135!184?____$#143!188?_$#126!189?_$#140!190?_$#151!191?__$#164!193?_$#167!194?_$#164!195?_$#154!196?_$#146!197?_$#164!198?_$#167!199?_$#182!200?_$#154!201?_$#150!202?_$#137!203?_$#116!204?_$#135!205?__$#127!207?_$#116!208?____$#125!212?__$#115!214?_$#135!215?_$#127!216?_$#126!217?_$#116!218?_$#107!219?_$#103!220?_$#95!221?_$#62!222?_$#54!223?_$#73!224?_$#103!225?_$#107!226?_$#117!227?_$#130!228?___$#152!231?_$#149!232?_$#148!233?_$#165!234?__$#187!236?_$#193!237?_$#189!238?_$#187!239?_$#193!240?_$#197!241?_$#194!242?_$#187!243?__$#206!245?_$#191!246?_$#206!247?_$#216!248?_$#214!249?_$#205!250?_$#215!251?_$#218!252?_$#217!253?_$#218!254?_$#215!255?_$#214!256?_$#212!257?_$#218!258?_$#219!259?_$#222!260?_$#221!261?_$#212!262?_$#215!263?_$#218!264?_$#217!265?_$#220!266?_$#222!267?_$-#27@@$#24!2?@$#22!3?@$#30!4?@$#23!5?@$#34!6?@$#25!7?@$#34!8?@$#30!9?@$#34!10?@@$#32!12?@$#36!13?@@$#30!15?@@$#22!17?@$#27!18?@$#31!19?@$#24!20?@$#27!21?@$#22!22?@$#24!23?@$#4!24?@$#24!25?@$#11!26?@@$#4!28?@$#11!29?@$#4!30?@@@@@$#7!35?@@@$#14!38?@$#12!39?@$#5!40?@@$#12!42?@$#11!43?@$#7!44?@$#11!45?@$#19!46?@@@$#110!49?@$#146!50?@$#150!51?@$#117!52?@$#116!53?@@$#110!55?@$#117!56?@$#98!57?@$#102!58?@$#116!59?@$#102!60?@$#116!61?@@@$#130!64?@@$#137!66?@$#130!67?@$#116!68?@@$#102!70?@@$#97!72?@$#110!73?@$#116!74?@$#102!75?@$#97!76?@$#116!77?@$#125!78?@$#102!79?@@$#99!81?@$#110!82?@$#116!83?@$#110!84?@$#86!85?@$#89!86?@$#54!87?@$#32!88?@$#34!89?@@@@@$#37!94?@@$#38!96?@@$#40!98?@$#37!99?@$#40!100?@$#37!101?@$#34!102?@$#37!103?@$#38!104?@@$#41!106?@@$#47!108?@$#54!109?@@$#58!111?@$#60!112?@@@$#59!115?@$#61!116?@$#65!117?@$#86!118?@$#65!119?@$#61!120?@$#58!121?@$#65!122?@$#79!123?@$#99!124?@$#90!125?@$#108!126?@@$#105!128?@$#112!129?@$#90!130?@$#108!131?@$#99!132?@$#115!133?@$#110!134?@$#105!135?@$#90!136?@$#112!137?@$#114!138?@$#133!139?@$#108!140?@$#99!141?@$#125!142?@$#119!143?@$#125!144?@$#115!145?@$#112!146?@$#115!147?@$#129!148?@$#163!149?@$#120!150?@$#97!151?@$#90!152?@$#113!153?@$#122!154?@$#129!155?@$#145!156?@$#122!157?@$#145!158?@$#141!159?@$#158!160?@$#161!161?@$#162!162?@$#158!163?@$#161!164?@$#158!165?@$#179!166?@$#198!167?@$#179!168?@$#164!169?@@$#154!171?@$#143!172?@$#146!173?@$#172!174?@$#183!175?@$#172!176?@$#146!177?@$#126!178?@@$#116!180?@$#135!181?@$#127!182?@$#135!183?@$#116!184?@$#135!185?@$#146!186?@$#135!187?@$#117!188?@$#140!189?@$#126!190?@$#140!191?@$#164!192?@$#146!193?@$#154!194?@@$#151!196?@@$#146!198?@$#165!199?@@$#151!201?@$#154!202?@$#150!203?@$#117!204?@$#110!205?@@$#126!207?@@$#116!209?@$#126!210?@$#116!211?@$#126!212?@$#116!213?@$#115!214?@$#126!215?@@$#117!217?@$#107!218?@$#92!219?@$#79!220?@$#83!221?@$#56!222?@$#62!223?@$#72!224?@$#106!225?@$#107!226?@@$#123!228?@$#117!229?@@$#138!231?@$#150!232?@$#157!233?@$#165!234?@$#157!235?@$#175!236?@$#193!237?@$#189!238?@$#187!239?@$#188!240?@$#197!241?@$#194!242?@$#193!243?@$#201!244?@$#197!245?@$#203!246?@$#216!247?@$#217!248?@$#205!249?@@$#214!251?@$#218!252?@$#221!253?@$#218!254?@$#215!255?@@$#214!257?@@$#219!259?@$#223!260?@$#219!261?@$#212!262?@$#214!263?@$#215!264?@$#219!265?@$#220!266?@@$#24AAAA$#23!4?A$#32!5?AAAA$#31!9?A$#36!10?A$#32!11?A$#36!12?A$#32!13?A$#34!14?A$#31!15?AA$#22!17?AA$#27!19?AAAAA$#18!24?A$#11!25?AA$#4!27?AAAAA$#11!32?A$#4!33?AAAA$#1!37?A$#12!38?A$#5!39?A$#12!40?AA$#14!42?A$#11!43?AA$#7!45?A$#11!46?AA$#19!48?A$#90!49?A$#125!50?A$#135!51?A$#116!52?A$#137!53?A$#110!54?A$#99!55?A$#98!56?AA$#110!58?A$#98!59?A$#137!60?A$#102!61?A$#116!62?A$#102!63?A$#116!64?A$#130!65?A$#117!66?A$#97!67?A$#102!68?AA$#90!70?A$#88!71?A$#116!72?AA$#110!74?AA$#116!76?A$#92!77?A$#58!78?A$#41!79?A$#34!80?AA$#18!82?A$#11!83?A$#19!84?AA$#27!86?A$#30!87?A$#23!88?A$#34!89?A$#36!90?AA$#37!92?A$#34!93?A$#37!94?AA$#34!96?A$#37!97?A$#38!98?AAA$#37!101?A$#41!102?A$#38!103?A$#37!104?A$#38!105?AAA$#41!108?A$#47!109?AA$#54!111?A$#66!112?A$#60!113?A$#58!114?AAA$#59!117?A$#61!118?AA$#59!120?A$#58!121?AAA$#79!124?AA$#105!126?AA$#90!128?A$#110!129?A$#116!130?A$#110!131?A$#100!132?A$#115!133?AA$#135!135?A$#100!136?AA$#114!138?A$#112!139?AA$#125!141?A$#100!142?A$#135!143?A$#112!144?A$#114!145?A$#90!146?A$#97!147?A$#108!148?AAA$#90!151?A$#97!152?A$#121!153?AA$#120!155?A$#158!156?A$#120!157?A$#145!158?A$#158!159?AA$#162!161?A$#161!162?AA$#155!164?A$#158!165?A$#183!166?A$#156!167?AA$#167!169?A$#172!170?A$#151!171?A$#164!172?A$#159!173?A$#164!174?A$#135!175?A$#140!176?A$#135!177?A$#108!178?A$#126!179?AAAA$#135!183?A$#116!184?A$#126!185?A$#140!186?A$#135!187?A$#126!188?A$#140!189?A$#143!190?A$#135!191?A$#151!192?A$#143!193?A$#135!194?A$#143!195?A$#146!196?A$#154!197?A$#151!198?A$#165!199?A$#154!200?A$#135!201?A$#140!202?A$#150!203?A$#117!204?A$#110!205?A$#103!206?A$#116!207?AA$#117!209?A$#110!210?A$#116!211?A$#127!212?A$#140!213?A$#135!214?AA$#126!216?A$#117!217?A$#110!218?A$#92!219?AA$#84!221?A$#62!222?AA$#74!224?A$#96!225?A$#107!226?A$#111!227?A$#117!228?AA$#130!230?A$#138!231?A$#137!232?A$#165!233?A$#168!234?A$#165!235?A$#175!236?A$#194!237?AA$#187!239?AA$#190!241?A$#187!242?AA$#193!244?A$#194!245?A$#201!246?A$#203!247?A$#216!248?A$#199!249?A$#205!250?AA$#215!252?A$#218!253?A$#216!254?A$#218!255?A$#215!256?AA$#214!258?A$#218!259?A$#219!260?A$#218!261?A$#215!262?AA$#219!264?A$#220!265?AAA$#18CC$#24!2?CC$#23!4?C$#32!5?C$#23!6?CC$#34!8?C$#31!9?C$#30!10?C$#27!11?C$#30!12?C$#34!13?C$#32!14?C$#31!15?CC$#27!17?C$#22!18?C$#27!19?CCC$#24!22?CC$#18!24?C$#11!25?C$#19!26?C$#4!27?CCCCCCC$#5!34?C$#4!35?C$#7!36?C$#1!37?C$#12!38?C$#11!39?C$#12!40?C$#5!41?C$#12!42?C$#11!43?C$#7!44?C$#11!45?CC$#14!47?C$#18!48?C$#22!49?C$#89!50?C$#144!51?C$#155!52?C$#116!53?C$#117!54?C$#65!55?C$#99!56?C$#107!57?C$#79!58?C$#102!59?C$#100!60?C$#90!61?C$#110!62?C$#99!63?C$#126!64?C$#99!65?C$#98!66?CC$#117!68?C$#110!69?C$#130!70?C$#92!71?C$#66!72?C$#47!73?CC$#22!75?C$#4!76?CCC$#11!79?C$#7!80?C$#11!81?C$#4!82?C$#7!83?C$#21!84?C$#19!85?C$#24!86?C$#27!87?C$#23!88?CC$#34!90?CC$#36!92?C$#34!93?CC$#23!95?C$#34!96?C$#37!97?CC$#36!99?C$#34!100?C$#37!101?C$#34!102?C$#37!103?C$#38!104?C$#34!105?C$#37!106?CCCC$#41!110?CC$#47!112?C$#58!113?CC$#54!115?C$#58!116?C$#54!117?C$#58!118?C$#54!119?CCC$#58!122?C$#54!123?CC$#47!125?C$#58!126?C$#89!127?C$#105!128?C$#110!129?C$#90!130?C$#99!131?C$#112!132?C$#115!133?C$#112!134?C$#116!135?C$#105!136?C$#115!137?CC$#125!139?C$#115!140?C$#125!141?C$#115!142?CC$#100!144?C$#112!145?C$#90!146?C$#97!147?CC$#90!149?C$#151!150?C$#97!151?CC$#129!153?C$#133!154?C$#139!155?C$#121!156?C$#144!157?C$#158!158?C$#170!159?C$#158!160?C$#161!161?C$#145!162?C$#162!163?C$#172!164?C$#144!165?C$#181!166?C$#164!167?CC$#172!169?C$#164!170?C$#172!171?C$#159!172?C$#156!173?C$#146!174?C$#156!175?C$#116!176?CCC$#140!179?C$#127!180?C$#135!181?C$#127!182?C$#135!183?C$#143!184?C$#116!185?C$#140!186?C$#135!187?C$#123!188?C$#126!189?C$#140!190?C$#135!191?C$#116!192?CC$#135!194?CC$#140!196?C$#153!197?CC$#154!199?C$#151!200?C$#126!201?C$#135!202?C$#126!203?C$#123!204?C$#116!205?C$#110!206?C$#105!207?C$#123!208?C$#110!209?CC$#126!211?C$#116!212?CC$#127!214?C$#135!215?C$#117!216?C$#123!217?C$#110!218?C$#93!219?C$#84!220?C$#75!221?C$#71!222?C$#62!223?C$#75!224?C$#96!225?C$#103!226?CC$#117!228?C$#130!229?C$#138!230?C$#148!231?CC$#157!233?CCC$#184!236?C$#188!237?CC$#187!239?CCC$#193!242?C$#184!243?C$#175!244?C$#187!245?C$#206!246?CC$#205!248?C$#195!249?C$#202!250?CC$#214!252?C$#215!253?C$#218!254?CC$#215!256?C$#218!257?C$#215!258?CC$#224!260?C$#215!261?C$#214!262?C$#215!263?C$#219!264?C$#217!265?C$#220!266?CC$#24G$#18!1?GGG$#32!4?G$#23!5?G$#32!6?G$#34!7?GG$#31!9?GG$#27!11?GG$#34!13?GG$#31!15?G$#36!16?G$#27!17?GG$#24!19?GGGG$#11!23?GG$#19!25?G$#11!26?GG$#5!28?G$#4!29?G$#7!30?GG$#5!32?G$#4!33?G$#11!34?GG$#7!36?G$#12!37?GG$#5!39?GG$#12!41?GG$#1!43?G$#11!44?GGG$#14!47?G$#4!48?G$#21!49?G$#14!50?G$#40!51?G$#89!52?G$#135!53?G$#125!54?G$#116!55?G$#110!56?G$#117!57?G$#126!58?GG$#117!60?G$#116!61?G$#110!62?G$#116!63?G$#110!64?G$#116!65?G$#126!66?G$#92!67?G$#54!68?G$#38!69?G$#27!70?G$#22!71?G$#18!72?G$#21!73?G$#11!74?G$#19!75?G$#4!76?G$#7!77?GG$#5!79?G$#7!80?GGGG$#11!84?GGG$#27!87?G$#30!88?G$#23!89?GG$#34!91?GGGGG$#36!96?G$#37!97?G$#34!98?GG$#37!100?G$#36!101?G$#37!102?G$#36!103?G$#37!104?G$#36!105?G$#37!106?GG$#34!108?G$#36!109?G$#37!110?G$#38!111?G$#41!112?G$#47!113?GG$#54!115?G$#47!116?GGGG$#54!120?GGGGGGG$#58!127?G$#66!128?G$#105!129?G$#99!130?GG$#100!132?G$#99!133?G$#116!134?GG$#115!136?G$#110!137?G$#108!138?G$#125!139?G$#115!140?G$#105!141?G$#119!142?G$#87!143?G$#112!144?G$#90!145?G$#108!146?G$#97!147?G$#105!148?G$#97!149?G$#90!150?G$#162!151?G$#113!152?G$#158!153?G$#120!154?G$#145!155?G$#113!156?G$#120!157?G$#163!158?G$#159!159?G$#158!160?G$#170!161?G$#129!162?G$#155!163?G$#163!164?G$#181!165?G$#179!166?G$#146!167?G$#156!168?G$#172!169?G$#183!170?G$#164!171?G$#172!172?G$#156!173?G$#127!174?G$#116!175?GGG$#126!178?G$#127!179?G$#135!180?G$#127!181?G$#135!182?G$#143!183?G$#127!184?G$#117!185?G$#143!186?G$#127!187?G$#135!188?G$#116!189?GG$#110!191?G$#140!192?G$#110!193?G$#126!194?G$#117!195?G$#135!196?G$#150!197?G$#165!198?G$#135!199?GG$#140!201?G$#126!202?G$#116!203?GG$#103!205?G$#116!206?G$#110!207?GGG$#116!210?G$#110!211?G$#116!212?GG$#126!214?GG$#123!216?G$#110!217?G$#117!218?G$#95!219?G$#79!220?G$#56!221?G$#62!222?G$#72!223?G$#76!224?G$#101!225?G$#107!226?G$#111!227?G$#123!228?G$#138!229?G$#137!230?G$#148!231?G$#152!232?G$#157!233?G$#171!234?G$#157!235?G$#194!236?G$#187!237?G$#201!238?G$#188!239?G$#187!240?G$#184!241?G$#175!242?G$#187!243?GG$#188!245?G$#206!246?GG$#193!248?G$#199!249?G$#202!250?GG$#205!252?G$#215!253?G$#216!254?G$#215!255?G$#219!256?G$#215!257?G$#218!258?G$#219!259?GG$#218!261?G$#214!262?G$#215!263?G$#219!264?G$#220!265?G$#222!266?G$#220!267?G$#11O$#24!1?O$#27!2?O$#18!3?O$#23!4?O$#32!5?O$#23!6?O$#37!7?O$#32!8?OO$#34!10?OO$#36!12?O$#34!13?OOO$#30!16?OOO$#27!19?O$#24!20?O$#18!21?O$#24!22?O$#11!23?O$#18!24?O$#4!25?O$#11!26?O$#4!27?OOO$#5!30?O$#7!31?O$#11!32?OO$#7!34?OOO$#12!37?O$#14!38?OO$#5!40?O$#12!41?OOOO$#14!45?O$#7!46?O$#9!47?O$#11!48?OO$#19!50?OOO$#18!53?O$#22!54?O$#34!55?O$#54!56?O$#34!57?O$#18!58?O$#11!59?O$#5!60?O$#21!61?O$#19!62?O$#18!63?O$#27!64?O$#18!65?O$#21!66?OO$#27!68?O$#21!69?OO$#27!71?OO$#21!73?O$#19!74?O$#11!75?OO$#7!77?OO$#11!79?O$#4!80?O$#7!81?OOOO$#1!85?O$#11!86?O$#30!87?O$#18!88?O$#23!89?OOO$#34!92?OOOOOO$#36!98?O$#34!99?OO$#36!101?OO$#35!103?O$#34!104?O$#36!105?O$#34!106?OO$#23!108?O$#32!109?O$#23!110?O$#30!111?O$#37!112?O$#40!113?O$#41!114?OO$#47!116?OOO$#48!119?O$#47!120?OO$#54!122?O$#47!123?O$#54!124?OOOO$#58!128?O$#61!129?O$#85!130?O$#89!131?O$#105!132?O$#99!133?O$#115!134?O$#108!135?O$#110!136?O$#115!137?O$#105!138?OO$#108!140?O$#99!141?O$#105!142?OO$#97!144?O$#100!145?O$#105!146?O$#114!147?O$#113!148?OO$#129!150?O$#119!151?O$#115!152?O$#121!153?O$#133!154?O$#145!155?O$#133!156?O$#121!157?O$#144!158?O$#172!159?O$#181!160?O$#164!161?O$#115!162?O$#133!163?O$#159!164?O$#172!165?O$#164!166?O$#163!167?O$#172!168?O$#163!169?O$#164!170?O$#151!171?O$#125!172?O$#127!173?O$#117!174?O$#110!175?O$#117!176?O$#126!177?O$#110!178?O$#135!179?O$#143!180?O$#140!181?O$#143!182?O$#135!183?O$#127!184?O$#117!185?O$#127!186?O$#126!187?O$#116!188?O$#126!189?O$#116!190?O$#110!191?O$#126!192?O$#136!193?O$#117!194?O$#137!195?O$#126!196?O$#135!197?O$#150!198?O$#140!199?O$#126!200?O$#140!201?O$#117!202?O$#126!203?OO$#92!205?O$#107!206?O$#116!207?OO$#117!209?O$#99!210?O$#116!211?O$#110!212?O$#117!213?O$#135!214?O$#140!215?O$#126!216?O$#111!217?O$#107!218?O$#93!219?O$#92!220?O$#72!221?O$#56!222?O$#62!223?O$#76!224?O$#104!225?O$#107!226?O$#117!227?O$#123!228?O$#138!229?OO$#148!231?O$#165!232?O$#157!233?O$#168!234?O$#165!235?O$#206!236?O$#189!237?O$#191!238?O$#187!239?OO$#188!241?O$#175!242?OO$#187!244?OO$#206!246?O$#203!247?O$#193!248?O$#195!249?O$#205!250?OOO$#204!253?O$#217!254?O$#215!255?O$#218!256?O$#215!257?O$#219!258?OO$#218!260?OO$#215!262?O$#218!263?O$#219!264?O$#217!265?O$#220!266?OO$#18___$#22!3?__$#32!5?_$#34!6?_$#32!7?_$#34!8?_$#36!9?_$#34!10?__$#23!12?_$#36!13?_$#32!14?_$#36!15?_$#30!16?_$#27!17?_$#30!18?__$#27!20?__$#24!22?__$#11!24?___$#4!27?_$#11!28?_$#4!29?__$#7!31?_$#11!32?_$#7!33?__$#12!35?_$#7!36?_$#12!37?_$#14!38?_$#12!39?_$#5!40?__$#12!42?_$#5!43?_$#14!44?_$#7!45?__$#14!47?_$#7!48?_$#11!49?_$#19!50?_$#11!51?_$#5!52?_$#11!53?____$#21!57?_$#7!58?_$#14!59?_$#12!60?_$#11!61?_$#19!62?___$#21!65?___$#27!68?_$#24!69?____$#19!73?_$#11!74?_$#7!75?___$#5!78?_$#1!79?__$#7!81?_$#11!82?__$#7!84?__$#19!86?_$#36!87?_$#24!88?__$#22!90?_$#23!91?___$#32!94?__$#23!96?__$#32!98?____$#23!102?_$#32!103?_$#36!104?_$#23!105?__$#32!107?_$#23!108?__$#30!110?_$#27!111?_$#30!112?_$#36!113?_$#39!114?_$#40!115?_$#41!116?__$#43!118?_$#47!119?_$#41!120?___$#47!123?_$#54!124?___$#58!127?__$#54!129?__$#58!131?_$#79!132?_$#92!133?_$#116!134?_$#105!135?_$#112!136?_$#110!137?_$#113!138?_$#114!139?____$#115!143?_$#105!144?_$#120!145?_$#113!146?_$#121!147?_$#114!148?__$#141!150?_$#129!151?_$#146!152?_$#114!153?_$#115!154?_$#158!155?_$#145!156?_$#114!157?_$#163!158?_$#158!159?_$#144!160?_$#143!161?_$#155!162?_$#144!163?_$#163!164?_$#164!165?_$#172!166?_$#177!167?_$#164!168?__$#146!170?__$#127!172?_$#115!173?_$#103!174?_$#117!175?_$#126!176?_$#117!177?_$#110!178?_$#135!179?__$#125!181?_$#143!182?_$#116!183?_$#126!184?_$#117!185?__$#110!187?_$#116!188?_$#126!189?_$#116!190?_$#123!191?_$#116!192?_$#137!193?__$#135!195?_$#126!196?_$#135!197?_$#126!198?_$#150!199?_$#126!200?_$#135!201?_$#126!202?__$#103!204?__$#92!206?_$#110!207?_$#117!208?_$#137!209?_$#117!210?_$#116!211?_$#126!212?_$#117!213?_$#137!214?_$#135!215?_$#123!216?_$#117!217?_$#93!218?_$#78!219?_$#67!220?__$#73!222?_$#80!223?__$#94!225?_$#107!226?_$#117!227?_$#130!228?___$#148!231?_$#157!232?_$#142!233?_$#165!234?__$#214!236?_$#187!237?_$#188!238?__$#184!240?_$#175!241?___$#184!244?_$#187!245?_$#197!246?_$#201!247?_$#194!248?_$#195!249?_$#199!250?_$#202!251?_$#214!252?_$#204!253?_$#215!254?_$#217!255?_$#215!256?_$#216!257?_$#218!258?_$#214!259?_$#215!260?_$#214!261?_$#205!262?_$#214!263?_$#216!264?_$#220!265?___$-#18@$#24!1?@$#11!2?@$#22!3?@$#30!4?@@$#32!6?@$#34!7?@@$#23!9?@$#32!10?@$#34!11?@@@@$#31!15?@@$#30!17?@@$#22!19?@$#27!20?@$#18!21?@$#21!22?@$#27!23?@$#11!24?@$#4!25?@$#11!26?@$#5!27?@$#11!28?@$#1!29?@@$#7!31?@@$#4!33?@@$#12!35?@@$#5!37?@@$#12!39?@@@$#5!42?@$#12!43?@@@$#14!46?@$#12!47?@@$#11!49?@$#21!50?@$#11!51?@@$#12!53?@$#14!54?@$#7!55?@$#12!56?@$#14!57?@@$#12!59?@@@@$#11!63?@$#19!64?@$#21!65?@$#27!66?@$#21!67?@@$#18!69?@@$#19!71?@$#21!72?@$#19!73?@$#11!74?@@$#4!76?@$#1!77?@$#5!78?@$#1!79?@$#7!80?@$#1!81?@$#7!82?@@@$#1!85?@$#5!86?@$#18!87?@$#27!88?@$#18!89?@@$#22!91?@$#15!92?@$#23!93?@$#22!94?@$#30!95?@@$#23!97?@@$#32!99?@$#27!100?@@@$#15!103?@$#23!104?@$#30!105?@$#23!106?@$#27!107?@$#30!108?@$#27!109?@$#24!110?@$#19!111?@$#27!112?@$#31!113?@$#37!114?@@$#40!116?@$#41!117?@$#40!118?@$#38!119?@$#41!120?@$#47!121?@@$#54!123?@$#58!124?@$#59!125?@$#60!126?@@$#54!128?@@$#58!130?@@$#54!132?@$#86!133?@$#91!134?@$#99!135?@@$#112!137?@@@$#120!140?@@$#114!142?@$#115!143?@$#125!144?@$#133!145?@$#119!146?@@$#144!148?@$#115!149?@@$#125!151?@$#146!152?@$#140!153?@$#125!154?@$#145!155?@$#146!156?@$#144!157?@$#164!158?@$#163!159?@$#146!160?@$#156!161?@$#159!162?@$#164!163?@$#181!164?@$#172!165?@$#164!166?@$#156!167?@$#155!168?@$#135!169?@$#116!170?@$#125!171?@$#146!172?@$#126!173?@$#116!174?@@$#125!176?@$#135!177?@$#116!178?@$#135!179?@@$#125!181?@$#126!182?@$#135!183?@@$#110!185?@$#103!186?@$#116!187?@$#126!188?@$#123!189?@$#126!190?@@$#117!192?@@$#138!194?@$#110!195?@$#126!196?@@$#140!198?@@$#136!200?@$#123!201?@$#126!202?@$#117!203?@$#110!204?@$#92!205?@@$#89!207?@$#107!208?@$#126!209?@$#135!210?@$#126!211?@@@$#123!214?@@$#117!216?@$#103!217?@$#107!218?@$#79!219?@$#67!220?@$#73!221?@@@$#83!224?@$#95!225?@$#107!226?@$#117!227?@$#138!228?@@$#126!230?@$#138!231?@$#149!232?@$#157!233?@$#148!234?@$#165!235?@$#189!236?@$#175!237?@$#193!238?@$#188!239?@$#175!240?@$#174!241?@$#169!242?@@$#184!244?@$#194!245?@$#203!246?@@$#187!248?@@$#199!250?@$#205!251?@@$#214!253?@$#215!254?@@$#204!256?@$#216!257?@$#214!258?@$#204!259?@$#214!260?@@$#205!262?@@$#206!264?@$#217!265?@@@$#24A$#11!1?A$#18!2?A$#27!3?A$#23!4?A$#34!5?AA$#36!7?A$#34!8?A$#32!9?A$#30!10?A$#32!11?AA$#34!13?A$#27!14?A$#32!15?A$#30!16?A$#31!17?A$#18!18?A$#24!19?AA$#22!21?A$#11!22?AAAAAA$#4!28?A$#5!29?A$#11!30?A$#7!31?AAA$#1!34?A$#5!35?A$#12!36?AA$#5!38?AAA$#12!41?A$#5!42?AA$#12!44?AAAAA$#14!49?A$#11!50?AA$#19!52?A$#1!53?A$#12!54?A$#14!55?A$#5!56?A$#12!57?AAA$#5!60?A$#12!61?A$#11!62?A$#4!63?A$#11!64?A$#19!65?A$#21!66?A$#18!67?A$#19!68?A$#21!69?A$#11!70?A$#24!71?A$#11!72?AAA$#7!75?A$#5!76?A$#7!77?AA$#5!79?A$#1!80?A$#7!81?A$#1!82?AA$#7!84?AA$#5!86?A$#19!87?AA$#11!89?A$#19!90?A$#18!91?AA$#22!93?A$#18!94?AA$#27!96?AA$#24!98?A$#27!99?A$#24!100?A$#30!101?A$#27!102?AA$#22!104?A$#30!105?A$#27!106?A$#30!107?A$#22!108?A$#24!109?A$#19!110?AA$#11!112?A$#30!113?A$#31!114?AA$#37!116?A$#40!117?A$#37!118?A$#38!119?A$#41!120?A$#47!121?AA$#58!123?A$#60!124?A$#61!125?AA$#60!127?A$#58!128?AA$#66!130?AA$#58!132?AAA$#66!135?A$#65!136?A$#89!137?A$#105!138?A$#100!139?A$#115!140?A$#125!141?A$#115!142?A$#112!143?A$#115!144?AA$#144!146?AA$#156!148?A$#125!149?A$#133!150?A$#125!151?A$#133!152?A$#144!153?AA$#146!155?AA$#162!157?A$#163!158?A$#162!159?A$#159!160?A$#172!161?A$#200!162?A$#172!163?A$#164!164?A$#177!165?A$#162!166?A$#146!167?A$#127!168?A$#110!169?A$#135!170?A$#127!171?A$#135!172?A$#127!173?A$#110!174?A$#127!175?A$#105!176?A$#110!177?AA$#126!179?A$#110!180?A$#116!181?A$#110!182?A$#103!183?A$#116!184?A$#99!185?A$#89!186?A$#103!187?AA$#116!189?A$#103!190?AA$#110!192?A$#117!193?A$#103!194?AA$#117!196?A$#137!197?A$#135!198?A$#136!199?A$#123!200?A$#126!201?A$#117!202?AA$#105!204?A$#92!205?A$#85!206?A$#84!207?A$#95!208?A$#117!209?A$#126!210?A$#116!211?A$#117!212?A$#137!213?A$#126!214?A$#117!215?A$#110!216?A$#92!217?A$#93!218?A$#84!219?A$#81!220?A$#66!221?A$#79!222?AA$#95!224?A$#106!225?A$#107!226?A$#117!227?A$#123!228?AAA$#130!231?A$#157!232?AAA$#169!235?A$#174!236?A$#187!237?A$#201!238?A$#171!239?AAA$#169!242?A$#171!243?A$#187!244?A$#188!245?A$#206!246?AA$#193!248?A$#195!249?AA$#202!251?A$#193!252?A$#205!253?AAA$#204!256?A$#206!257?A$#215!258?A$#193!259?A$#205!260?A$#199!261?A$#202!262?A$#204!263?A$#216!264?A$#220!265?AA$#217!267?A$#24CC$#22!2?C$#27!3?C$#36!4?C$#23!5?CC$#36!7?C$#34!8?C$#31!9?C$#30!10?CC$#32!12?CC$#34!14?C$#32!15?C$#34!16?C$#36!17?C$#27!18?C$#22!19?C$#27!20?C$#36!21?C$#24!22?C$#18!23?C$#11!24?CC$#1!26?C$#11!27?C$#7!28?CCCCCCC$#12!35?C$#5!36?CC$#12!38?C$#5!39?CCC$#14!42?C$#12!43?C$#5!44?CC$#12!46?C$#5!47?C$#12!48?CC$#4!50?C$#11!51?CCC$#12!54?CCCC$#5!58?C$#12!59?CC$#7!61?C$#11!62?C$#19!63?CCCCC$#24!68?CCC$#11!71?C$#19!72?C$#11!73?C$#19!74?C$#7!75?C$#1!76?CC$#5!78?C$#7!79?C$#1!80?CC$#5!82?C$#7!83?C$#1!84?C$#7!85?CC$#4!87?CC$#11!89?C$#4!90?C$#19!91?C$#24!92?C$#11!93?C$#24!94?C$#19!95?C$#27!96?CC$#18!98?C$#27!99?C$#30!100?C$#24!101?C$#30!102?C$#27!103?C$#30!104?C$#36!105?C$#27!106?C$#24!107?C$#27!108?C$#19!109?CCC$#21!112?CC$#30!114?CC$#36!116?C$#37!117?C$#38!118?C$#40!119?C$#41!120?CC$#47!122?C$#54!123?C$#58!124?C$#60!125?CCC$#58!128?CC$#60!130?C$#66!131?CC$#58!133?CC$#66!135?C$#67!136?C$#58!137?C$#66!138?C$#85!139?C$#91!140?C$#110!141?C$#125!142?C$#115!143?C$#114!144?C$#115!145?C$#125!146?C$#133!147?C$#144!148?C$#146!149?C$#133!150?CC$#155!152?C$#144!153?CC$#172!155?C$#146!156?C$#155!157?C$#146!158?C$#159!159?C$#156!160?C$#172!161?C$#156!162?C$#140!163?C$#156!164?C$#144!165?C$#125!166?C$#135!167?C$#110!168?CC$#135!170?C$#125!171?C$#116!172?C$#127!173?C$#116!174?CC$#99!176?C$#110!177?C$#92!178?C$#103!179?CC$#92!181?C$#99!182?C$#92!183?CCC$#107!186?C$#93!187?C$#92!188?C$#89!189?C$#107!190?C$#103!191?C$#116!192?C$#107!193?CC$#110!195?C$#116!196?C$#138!197?C$#117!198?CC$#110!200?C$#107!201?C$#123!202?C$#117!203?C$#110!204?C$#92!205?C$#79!206?C$#92!207?C$#89!208?C$#92!209?C$#111!210?C$#117!211?CC$#135!213?C$#126!214?CC$#107!216?C$#93!217?C$#73!218?CC$#79!220?C$#75!221?C$#84!222?CC$#95!224?C$#92!225?C$#111!226?C$#117!227?CC$#123!229?CC$#148!231?CCCC$#169!235?CC$#185!237?C$#189!238?C$#171!239?C$#175!240?C$#169!241?CC$#187!243?CC$#184!245?C$#203!246?C$#190!247?C$#187!248?CCCC$#202!252?CC$#214!254?C$#193!255?C$#204!256?C$#206!257?CC$#193!259?C$#199!260?C$#195!261?C$#199!262?C$#205!263?C$#216!264?C$#217!265?CCC$#23GG$#22!2?G$#30!3?G$#27!4?G$#23!5?G$#36!6?G$#34!7?GG$#31!9?G$#36!10?G$#31!11?G$#34!12?G$#36!13?G$#34!14?GG$#36!16?G$#30!17?G$#22!18?G$#27!19?G$#18!20?GGG$#4!23?GG$#7!25?GG$#5!27?G$#1!28?G$#11!29?G$#1!30?G$#7!31?G$#1!32?G$#7!33?GG$#5!35?G$#1!36?G$#5!37?G$#12!38?G$#5!39?GGG$#12!42?G$#5!43?GG$#12!45?GGGG$#7!49?G$#11!50?G$#7!51?G$#11!52?G$#5!53?G$#12!54?GG$#5!56?G$#12!57?G$#5!58?GG$#12!60?G$#1!61?G$#11!62?G$#19!63?G$#11!64?G$#19!65?G$#11!66?G$#21!67?G$#19!68?GG$#21!70?G$#18!71?G$#19!72?GG$#11!74?G$#1!75?G$#7!76?G$#1!77?GGGG$#5!81?G$#7!82?G$#1!83?G$#7!84?G$#11!85?G$#7!86?G$#1!87?G$#7!88?G$#4!89?GG$#11!91?GG$#21!93?G$#19!94?G$#21!95?G$#30!96?GG$#27!98?G$#30!99?GGGG$#27!103?G$#36!104?GG$#30!106?G$#27!107?GG$#24!109?G$#11!110?G$#18!111?G$#21!112?G$#22!113?G$#31!114?G$#37!115?GG$#38!117?GGG$#41!120?G$#44!121?G$#47!122?GG$#54!124?GG$#58!126?G$#54!127?G$#58!128?G$#54!129?GG$#58!131?G$#67!132?G$#58!133?G$#66!134?G$#65!135?GG$#61!137?G$#66!138?GG$#67!140?G$#91!141?G$#90!142?G$#110!143?G$#105!144?G$#112!145?G$#115!146?G$#125!147?G$#113!148?G$#144!149?G$#139!150?G$#144!151?G$#159!152?G$#144!153?G$#146!154?G$#133!155?G$#159!156?G$#146!157?GG$#125!159?G$#135!160?GG$#125!162?G$#127!163?G$#116!164?G$#115!165?G$#100!166?G$#125!167?G$#116!168?GGG$#110!171?GG$#91!173?G$#92!174?G$#103!175?G$#92!176?GG$#93!178?G$#66!179?G$#84!180?G$#89!181?G$#92!182?GG$#89!184?G$#85!185?G$#92!186?G$#67!187?G$#73!188?G$#67!189?G$#93!190?G$#89!191?G$#103!192?G$#92!193?G$#103!194?GG$#117!196?G$#103!197?G$#110!198?G$#103!199?G$#107!200?G$#103!201?G$#126!202?G$#116!203?GG$#103!205?GG$#93!207?G$#99!208?G$#79!209?G$#103!210?GG$#107!212?G$#103!213?G$#92!214?GG$#79!216?G$#93!217?G$#83!218?G$#67!219?G$#75!220?G$#73!221?G$#75!222?G$#84!223?G$#95!224?G$#103!225?GG$#111!227?G$#107!228?G$#117!229?G$#123!230?G$#142!231?G$#130!232?G$#148!233?G$#149!234?G$#169!235?G$#171!236?G$#188!237?G$#185!238?G$#178!239?G$#188!240?G$#171!241?G$#169!242?G$#171!243?G$#175!244?G$#178!245?G$#201!246?G$#178!247?G$#171!248?G$#176!249?G$#187!250?G$#176!251?G$#199!252?G$#193!253?G$#187!254?G$#194!255?G$#201!256?G$#203!257?G$#205!258?G$#204!259?G$#202!260?G$#195!261?G$#199!262?G$#206!263?G$#216!264?G$#203!265?G$#217!266?GG$#18O$#15!1?O$#23!2?O$#22!3?O$#23!4?O$#34!5?O$#36!6?O$#31!7?O$#27!8?OO$#30!10?O$#31!11?O$#27!12?O$#32!13?O$#34!14?O$#32!15?O$#30!16?O$#27!17?O$#30!18?O$#27!19?O$#24!20?O$#19!21?O$#21!22?O$#11!23?O$#7!24?O$#1!25?OOO$#7!28?OO$#1!30?O$#7!31?O$#1!32?O$#7!33?OO$#5!35?OOO$#12!38?OO$#5!40?OOOOOOOO$#12!48?O$#5!49?O$#11!50?O$#4!51?O$#11!52?O$#12!53?O$#5!54?OO$#12!56?OOO$#5!59?O$#12!60?O$#5!61?O$#4!62?O$#19!63?O$#4!64?O$#19!65?OOO$#18!68?O$#11!69?O$#21!70?O$#19!71?O$#11!72?O$#19!73?O$#4!74?O$#11!75?O$#1!76?O$#5!77?OO$#1!79?OO$#5!81?OO$#1!83?O$#7!84?OO$#1!86?O$#7!87?O$#12!88?O$#5!89?O$#4!90?O$#11!91?O$#19!92?O$#21!93?O$#27!94?O$#21!95?O$#30!96?O$#36!97?O$#30!98?O$#36!99?O$#30!100?O$#36!101?OOOO$#37!105?O$#30!106?O$#27!107?OO$#24!109?OO$#30!111?O$#36!112?OO$#37!114?O$#38!115?OO$#40!117?OO$#42!119?O$#41!120?OO$#47!122?OOO$#54!125?O$#47!126?OOOOOO$#58!132?O$#66!133?O$#79!134?OOO$#86!137?O$#65!138?O$#61!139?O$#66!140?O$#61!141?O$#79!142?O$#65!143?O$#87!144?O$#90!145?OO$#99!147?O$#125!148?O$#116!149?O$#133!150?O$#125!151?O$#116!152?O$#135!153?O$#125!154?O$#115!155?O$#125!156?O$#115!157?O$#103!158?O$#105!159?OO$#91!161?O$#99!162?O$#116!163?O$#138!164?O$#110!165?O$#99!166?O$#103!167?O$#99!168?O$#92!169?O$#99!170?O$#79!171?O$#89!172?OO$#66!174?OO$#79!176?O$#67!177?O$#73!178?OO$#85!180?O$#79!181?O$#84!182?O$#92!183?O$#89!184?O$#85!185?OO$#66!187?OO$#73!189?O$#67!190?O$#76!191?O$#83!192?O$#75!193?OO$#93!195?O$#107!196?O$#103!197?O$#92!198?O$#79!199?O$#83!200?O$#93!201?O$#117!202?O$#89!203?O$#103!204?OOOO$#116!208?O$#92!209?O$#99!210?O$#103!211?O$#107!212?OO$#93!214?O$#84!215?OOO$#79!218?O$#73!219?OO$#79!221?OO$#85!223?O$#92!224?O$#103!225?OO$#107!227?O$#117!228?OO$#130!230?O$#132!231?OO$#142!233?O$#147!234?O$#169!235?O$#157!236?O$#171!237?O$#186!238?O$#184!239?O$#174!240?O$#169!241?O$#168!242?O$#175!243?O$#171!244?O$#178!245?O$#188!246?O$#185!247?O$#171!248?O$#176!249?O$#175!250?O$#184!251?OO$#193!253?OO$#197!255?O$#206!256?O$#193!257?O$#204!258?O$#193!259?O$#195!260?OO$#199!262?O$#205!263?O$#217!264?OOOO$#18_$#23!1?___$#32!4?_$#34!5?_$#31!6?_$#36!7?_$#30!8?__$#27!10?_$#30!11?__$#34!13?_$#32!14?_$#30!15?_$#31!16?_$#30!17?_$#27!18?__$#30!20?_$#21!21?_$#11!22?_$#1!23?_$#7!24?_$#1!25?___$#7!28?_$#1!29?_$#7!30?__$#1!32?__$#5!34?__$#12!36?_$#5!37?____$#12!41?___$#5!44?_$#12!45?__$#5!47?__$#14!49?_$#1!50?_$#7!51?_$#12!52?_$#5!53?_$#12!54?_$#5!55?_$#12!56?_$#5!57?____$#14!61?_$#4!62?_$#11!63?__$#19!65?_$#21!66?_$#19!67?_$#11!68?_$#24!69?_$#21!70?_$#19!71?___$#11!74?_$#1!75?_$#7!76?_$#1!77?_$#5!78?_$#1!79?_$#5!80?____$#7!84?____$#5!88?_$#11!89?_$#7!90?_$#21!91?__$#27!93?__$#30!95?_$#37!96?____$#36!100?__$#39!102?_$#37!103?__$#31!105?_$#30!106?_$#31!107?_$#27!108?_$#30!109?_$#34!110?_$#37!111?__$#38!113?__$#40!115?_$#46!116?_$#41!117?__$#44!119?_$#41!120?__$#46!122?_$#47!123?____$#41!127?_$#40!128?_$#43!129?_$#41!130?__$#47!132?_$#58!133?_$#65!134?_$#61!135?_$#65!136?_$#79!137?_$#65!138?_____$#79!143?_$#85!144?_$#79!145?_$#65!146?__$#85!148?_$#79!149?_$#100!150?_$#79!151?_$#92!152?_$#99!153?_$#92!154?_$#89!155?_$#92!156?_$#79!157?__$#103!159?_$#85!160?_$#79!161?_$#85!162?_$#79!163?__$#117!165?_$#85!166?_$#79!167?__$#66!169?_$#79!170?____$#73!174?_$#79!175?__$#66!177?_$#79!178?__$#66!180?_$#80!181?_$#67!182?_$#79!183?_$#92!184?_$#89!185?_$#79!186?__$#84!188?_$#75!189?_$#73!190?__$#75!192?_$#67!193?_$#56!194?_$#72!195?_$#84!196?_$#80!197?_$#67!198?_$#71!199?_$#75!200?_$#81!201?_$#84!202?_$#83!203?_$#95!204?_$#83!205?_$#95!206?_$#79!207?_$#99!208?_$#92!209?___$#89!212?_$#93!213?_$#80!214?_$#67!215?_$#79!216?_$#92!217?_$#84!218?_$#79!219?_$#73!220?_$#79!221?__$#84!223?_$#92!224?_$#103!225?__$#111!227?_$#117!228?_$#123!229?__$#132!231?_$#142!232?_$#130!233?_$#147!234?_$#169!235?_$#157!236?_$#171!237?_$#178!238?_$#171!239?__$#169!241?_$#168!242?_$#171!243?__$#187!245?_$#190!246?_$#187!247?_$#174!248?_$#176!249?_$#187!250?___$#193!253?__$#206!255?____$#205!259?_$#195!260?__$#202!262?_$#214!263?_$#216!264?_$#220!265?_$#217!266?_$#216!267?_$-\
\ No newline at end of file diff --git a/tdata/text.imgbuf b/tdata/text.imgbuf Binary files differdeleted file mode 100644 index fc5f8eb..0000000 --- a/tdata/text.imgbuf +++ /dev/null diff --git a/test_data/4_180x180.imgbuf b/test_data/4_180x180.imgbuf Binary files differnew file mode 100644 index 0000000..58aabd0 --- /dev/null +++ b/test_data/4_180x180.imgbuf |