From 1d86019140c8773ce1ff44daab60513c77dfd882 Mon Sep 17 00:00:00 2001 From: Kent Fredric Date: Sat, 28 Sep 2013 05:48:29 +1200 Subject: [PATCH] Build results of b83a1f1 (on master) --- Build.PL | 2 +- Changes | 23 +++ MANIFEST | 2 + META.json | 72 +++---- META.yml | 60 +++--- README | 188 ++++++++++++++++- layout/self_structure.dot | 64 +++--- layout/self_structure.png | Bin 49176 -> 69617 bytes lib/Path/IsDev.pm | 194 +++++++++++++++++- lib/Path/IsDev/Heuristic.pm | 7 +- lib/Path/IsDev/Heuristic/Changelog.pm | 4 +- lib/Path/IsDev/Heuristic/DevDirMarker.pm | 4 +- lib/Path/IsDev/Heuristic/META.pm | 4 +- lib/Path/IsDev/Heuristic/MYMETA.pm | 4 +- lib/Path/IsDev/Heuristic/Makefile.pm | 4 +- lib/Path/IsDev/Heuristic/TestDir.pm | 4 +- lib/Path/IsDev/Heuristic/Tool/Dzil.pm | 4 +- lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm | 4 +- lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm | 4 +- lib/Path/IsDev/Heuristic/VCS/Git.pm | 6 +- lib/Path/IsDev/HeuristicSet.pm | 48 ++++- lib/Path/IsDev/HeuristicSet/Basic.pm | 19 +- lib/Path/IsDev/NegativeHeuristic.pm | 144 +++++++++++++ .../NegativeHeuristic/IsDev/IgnoreFile.pm | 90 ++++++++ lib/Path/IsDev/Object.pm | 30 +-- t/00-compile.t | 4 +- t/000-report-versions-tiny.t | 2 +- 27 files changed, 851 insertions(+), 140 deletions(-) create mode 100644 lib/Path/IsDev/NegativeHeuristic.pm create mode 100644 lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm diff --git a/Build.PL b/Build.PL index 035f38e..f5ad790 100644 --- a/Build.PL +++ b/Build.PL @@ -17,7 +17,7 @@ my %module_build_args = ( "Kent Fredric " ], "dist_name" => "Path-IsDev", - "dist_version" => "0.3.3", + "dist_version" => "0.4.0", "license" => "perl", "module_name" => "Path::IsDev", "recommends" => {}, diff --git a/Changes b/Changes index b7edb29..63b9826 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,28 @@ Release history for Path-IsDev +0.4.0 2013-09-27T17:48:00Z + [00 Major Changes - Negative Heuristics] + - Now has a system to indicate negative heuristics, to mark given + directories as "not dev", which cause other postive heuristics to be + ignored. + - One basic negative heuristic added, 'IsDev::IgnoreFile' + - Basic Negative heuristic comes standard with the basic set. + + [Dependencies::Added / develop requires] + - Dist::Zilla::PluginBundle::Author::KENTNL v1.9.0 + + [Dependencies::Added / develop suggests] + - Dist::Zilla::PluginBundle::Author::KENTNL::Lite v1.3.0 + + [Dependencies::Removed / develop recommends] + - Dist::Zilla::PluginBundle::Author::KENTNL::Lite v1.3.0 + + [Dependencies::Removed / develop requires] + - Dist::Zilla::PluginBundle::Author::KENTNL::Lite + + [Dependencies::Removed / develop suggests] + - Dist::Zilla::PluginBundle::Author::KENTNL v1.8.3 + 0.3.3 2013-09-26T07:09:14Z [Bugfix] - Use a Non-Win32-failing compile test diff --git a/MANIFEST b/MANIFEST index 5e020b9..c30992b 100644 --- a/MANIFEST +++ b/MANIFEST @@ -33,6 +33,8 @@ lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm lib/Path/IsDev/Heuristic/VCS/Git.pm lib/Path/IsDev/HeuristicSet.pm lib/Path/IsDev/HeuristicSet/Basic.pm +lib/Path/IsDev/NegativeHeuristic.pm +lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm lib/Path/IsDev/Object.pm maint-travis-ci/README.mkdn maint-travis-ci/merge_travis_yml.pl diff --git a/META.json b/META.json index 4c71300..419fbaf 100644 --- a/META.json +++ b/META.json @@ -25,11 +25,8 @@ } }, "develop" : { - "recommends" : { - "Dist::Zilla::PluginBundle::Author::KENTNL::Lite" : "v1.3.0" - }, "requires" : { - "Dist::Zilla::PluginBundle::Author::KENTNL::Lite" : "0", + "Dist::Zilla::PluginBundle::Author::KENTNL" : "v1.9.0", "Pod::Coverage::TrustPod" : "0", "Test::CPAN::Changes" : "0.19", "Test::CPAN::Meta" : "0", @@ -39,7 +36,7 @@ "version" : "0.9901" }, "suggests" : { - "Dist::Zilla::PluginBundle::Author::KENTNL" : "v1.8.3" + "Dist::Zilla::PluginBundle::Author::KENTNL::Lite" : "v1.3.0" } }, "runtime" : { @@ -71,63 +68,71 @@ "provides" : { "Path::IsDev" : { "file" : "lib/Path/IsDev.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic" : { "file" : "lib/Path/IsDev/Heuristic.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic::Changelog" : { "file" : "lib/Path/IsDev/Heuristic/Changelog.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic::DevDirMarker" : { "file" : "lib/Path/IsDev/Heuristic/DevDirMarker.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic::META" : { "file" : "lib/Path/IsDev/Heuristic/META.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic::MYMETA" : { "file" : "lib/Path/IsDev/Heuristic/MYMETA.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic::Makefile" : { "file" : "lib/Path/IsDev/Heuristic/Makefile.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic::TestDir" : { "file" : "lib/Path/IsDev/Heuristic/TestDir.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic::Tool::Dzil" : { "file" : "lib/Path/IsDev/Heuristic/Tool/Dzil.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic::Tool::MakeMaker" : { "file" : "lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic::Tool::ModuleBuild" : { "file" : "lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::Heuristic::VCS::Git" : { "file" : "lib/Path/IsDev/Heuristic/VCS/Git.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::HeuristicSet" : { "file" : "lib/Path/IsDev/HeuristicSet.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" }, "Path::IsDev::HeuristicSet::Basic" : { "file" : "lib/Path/IsDev/HeuristicSet/Basic.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" + }, + "Path::IsDev::NegativeHeuristic" : { + "file" : "lib/Path/IsDev/NegativeHeuristic.pm", + "version" : "v0.4.0" + }, + "Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile" : { + "file" : "lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm", + "version" : "v0.4.0" }, "Path::IsDev::Object" : { "file" : "lib/Path/IsDev/Object.pm", - "version" : "v0.3.3" + "version" : "v0.4.0" } }, "release_status" : "stable", @@ -142,15 +147,15 @@ "web" : "https://github.com/kentfredric/Path-IsDev" } }, - "version" : "0.3.3", + "version" : "0.4.0", "x_BuiltWith" : { "modules" : { "Carp" : "1.32", "Class::Tiny" : "0.011", - "Dist::Zilla::PluginBundle::Author::KENTNL" : "1.8.3", + "Dist::Zilla::PluginBundle::Author::KENTNL" : "1.9.0", "Dist::Zilla::PluginBundle::Author::KENTNL::Lite" : "1.7.2", "File::Spec" : "3.44", - "File::Temp" : "0.2301", + "File::Temp" : "0.2302", "FindBin" : "1.51", "IO::Handle" : "1.35", "IPC::Open3" : "1.15", @@ -372,21 +377,10 @@ "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", - "type" : "requires" - } - }, - "name" : "@Author::KENTNL/Prereqs/BundleDevelNeeds", - "version" : "4.300039" - }, - { - "class" : "Dist::Zilla::Plugin::Prereqs", - "config" : { - "Dist::Zilla::Plugin::Prereqs" : { - "phase" : "develop", - "type" : "recommends" + "type" : "suggests" } }, - "name" : "@Author::KENTNL/Prereqs/BundleDevelRecommends", + "name" : "@Author::KENTNL/Prereqs/BundleDevelSuggests", "version" : "4.300039" }, { @@ -394,16 +388,16 @@ "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", - "type" : "suggests" + "type" : "requires" } }, - "name" : "@Author::KENTNL/Prereqs/BundleDevelSuggests", + "name" : "@Author::KENTNL/Prereqs/BundleDevelRequires", "version" : "4.300039" }, { "class" : "Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl", "name" : "@Author::KENTNL/Author::KENTNL::MinimumPerl", - "version" : "1.8.3" + "version" : "1.9.0" }, { "class" : "Dist::Zilla::Plugin::Authority", diff --git a/META.yml b/META.yml index 9362e5d..d9b73ec 100644 --- a/META.yml +++ b/META.yml @@ -23,49 +23,55 @@ name: Path-IsDev provides: Path::IsDev: file: lib/Path/IsDev.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic: file: lib/Path/IsDev/Heuristic.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic::Changelog: file: lib/Path/IsDev/Heuristic/Changelog.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic::DevDirMarker: file: lib/Path/IsDev/Heuristic/DevDirMarker.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic::META: file: lib/Path/IsDev/Heuristic/META.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic::MYMETA: file: lib/Path/IsDev/Heuristic/MYMETA.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic::Makefile: file: lib/Path/IsDev/Heuristic/Makefile.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic::TestDir: file: lib/Path/IsDev/Heuristic/TestDir.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic::Tool::Dzil: file: lib/Path/IsDev/Heuristic/Tool/Dzil.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic::Tool::MakeMaker: file: lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic::Tool::ModuleBuild: file: lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::Heuristic::VCS::Git: file: lib/Path/IsDev/Heuristic/VCS/Git.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::HeuristicSet: file: lib/Path/IsDev/HeuristicSet.pm - version: v0.3.3 + version: v0.4.0 Path::IsDev::HeuristicSet::Basic: file: lib/Path/IsDev/HeuristicSet/Basic.pm - version: v0.3.3 + version: v0.4.0 + Path::IsDev::NegativeHeuristic: + file: lib/Path/IsDev/NegativeHeuristic.pm + version: v0.4.0 + Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile: + file: lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm + version: v0.4.0 Path::IsDev::Object: file: lib/Path/IsDev/Object.pm - version: v0.3.3 + version: v0.4.0 requires: Carp: 0 Class::Tiny: 0.010 @@ -81,15 +87,15 @@ resources: bugtracker: https://github.com/kentfredric/Path-IsDev/issues homepage: https://github.com/kentfredric/Path-IsDev repository: https://github.com/kentfredric/Path-IsDev.git -version: 0.3.3 +version: 0.4.0 x_BuiltWith: modules: Carp: 1.32 Class::Tiny: 0.011 - Dist::Zilla::PluginBundle::Author::KENTNL: 1.8.3 + Dist::Zilla::PluginBundle::Author::KENTNL: 1.9.0 Dist::Zilla::PluginBundle::Author::KENTNL::Lite: 1.7.2 File::Spec: 3.44 - File::Temp: 0.2301 + File::Temp: 0.2302 FindBin: 1.51 IO::Handle: 1.35 IPC::Open3: 1.15 @@ -266,29 +272,21 @@ x_Dist_Zilla: config: Dist::Zilla::Plugin::Prereqs: phase: develop - type: requires - name: '@Author::KENTNL/Prereqs/BundleDevelNeeds' - version: 4.300039 - - - class: Dist::Zilla::Plugin::Prereqs - config: - Dist::Zilla::Plugin::Prereqs: - phase: develop - type: recommends - name: '@Author::KENTNL/Prereqs/BundleDevelRecommends' + type: suggests + name: '@Author::KENTNL/Prereqs/BundleDevelSuggests' version: 4.300039 - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop - type: suggests - name: '@Author::KENTNL/Prereqs/BundleDevelSuggests' + type: requires + name: '@Author::KENTNL/Prereqs/BundleDevelRequires' version: 4.300039 - class: Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl name: '@Author::KENTNL/Author::KENTNL::MinimumPerl' - version: 1.8.3 + version: 1.9.0 - class: Dist::Zilla::Plugin::Authority name: '@Author::KENTNL/Authority' diff --git a/README b/README index e70dcc5..db0a647 100644 --- a/README +++ b/README @@ -3,7 +3,7 @@ NAME tree VERSION - version 0.3.3 + version 0.4.0 SYNOPSIS use Path::IsDev qw(is_dev); @@ -52,6 +52,192 @@ FUNCTIONS That is, no "set" specification is applicable, so you'll only get the "default". +UNDERSTANDING AND DEBUGGING THIS MODULE + Understanding how this module works, is critical to understand where you + can use it, and the consequences of using it. + + This module operates on a very simplistic level, and its easy for + false-positives to occur. + + There are two types of Heuristics, Postive/Confirming Heuristics, and + Negative/Disconfirming Heuristics. + + Positive Heuristics and Negative Heuristics are based solely on the + presence of specific marker files in a directory, or special marker + directories. + + For instance, the files "META.yml", "Makefile.PL", and "Build.PL" are + all Positive Heuristic markers, because their presence often indicates a + "root" of a development tree. + + And for instance, the directories "t/", "xt/" and ".git/" are also + Positive Heuristic markers, because these structures are common in + "perl" development trees, and uncommon in install trees. + + However, these markers sometimes go wrong, for instance, consider you + have a "local::lib" or "perlbrew" install in $HOME + + $HOME/ + $HOME/lib/ + $HOME/perl5/perls/perl-5.19.3/lib/site_perl/ + + Etc. + + Under normal circumstances, neither $HOME nor those 3 paths are + considered "dev". + + However, all it takes to cause a false positive, is for somebody to + install a "t" or "xt" directory, or a marker file in one of the above + directories for "path_isdev($dir)" to return true. + + This may not be a problem, at least, until you use "Path::FindDev" which + combines "Path::IsDev" with recursive up-level traversal. + + $HOME/ + $HOME/lib/ + $HOME/perl5/perls/perl-5.19.3/lib/site_perl/ + + find_dev('$HOME/perl5/perls/perl-5.19.3/lib/site_perl/') # returns false, because it is not inside a dev directory + + mkdir $HOME/t + + find_dev('$HOME/perl5/perls/perl-5.19.3/lib/site_perl/') # returns $HOME, because $HOME/t exists. + + And it is this kind of problem that usually catches people off guard. + + PATH_ISDEV_DEBUG=1 perl -Ilib -MPath::FindDev=find_dev -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" + + [Path::IsDev=0] { + [Path::IsDev=0] set => Basic + [Path::IsDev=0] set_prefix => Path::IsDev::HeuristicSet + [Path::IsDev=0] set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] loaded_set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] } + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent + [Path::IsDev=0] /home/kent/META.yml exists for Path::IsDev::Heuristic::META + [Path::IsDev=0] ::META matched path /home/kent + /home/kent + + Whoops!. + + [Path::IsDev=0] /home/kent/META.yml exists for Path::IsDev::Heuristic::META + + No wonder! + + rm /home/kent/META.yml + + PATH_ISDEV_DEBUG=1 perl -Ilib -MPath::FindDev=find_dev -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" + [Path::IsDev=0] { + [Path::IsDev=0] set => Basic + [Path::IsDev=0] set_prefix => Path::IsDev::HeuristicSet + [Path::IsDev=0] set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] loaded_set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] } + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent + [Path::IsDev=0] /home/kent/t exists for::TestDir + [Path::IsDev=0] ::TestDir matched path /home/kent + + Double whoops! + + [Path::IsDev=0] /home/kent/t exists for::TestDir + + And you could keep doing that until you rule out all the bad heuristics + in your tree. + + Or, you could use a negative heuristic. + + touch /home/kent/.path_isdev_ignore + + PATH_ISDEV_DEBUG=1 perl -Ilib -MPath::FindDev=find_dev -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" + [Path::IsDev=0] { + [Path::IsDev=0] set => Basic + [Path::IsDev=0] set_prefix => Path::IsDev::HeuristicSet + [Path::IsDev=0] set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] loaded_set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] } + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent + [Path::IsDev=0] /home/kent/.path_isdev_ignore exists for Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile + [Path::IsDev=0] Negative ::IsDev::IgnoreFile excludes path /home/kent + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home + [Path::IsDev=0] no match found + + Success! + + [Path::IsDev=0] Matching /home/kent + [Path::IsDev=0] /home/kent/.path_isdev_ignore exists for Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile + [Path::IsDev=0] Negative ::IsDev::IgnoreFile excludes path /home/kent + +HEURISTICS + Negative Heuristics bundled with this distribution + Just remember, a Negative Heuristic excludes the path it is associated + with + + * "IsDev::IgnoreFile" - ".path_isdev_ignore" + + Positive Heuristics bundled with this distribution + * "Changelog" - Files matching "Changes", "Changelog", and similar, + case insensitive, extensions optional. + + * "DevDirMarker" - explicit ".devdir" file to indicate a project root. + + * "META" - "META.yml"/"META.json" + + * "MYMETA" - "MYMETA.yml"/"MYMETA.json" + + * "Makefile" - Any "Makefile" format documented supported by GNU Make + + * "TestDir" - A directory called either "t/" or "xt/" + + * "Tool::DZil" - A "dist.ini" file + + * "Tool::MakeMaker" - A "Makefile.PL" file + + * "Tool::ModuleBuild" - A "Build.PL" file + + * "VCS::Git" - A ".git" directory + +HEURISTIC SETS + Heuristic Sets Bundled with this distribution + * "Basic" - The basic heuristic set that contains most, if not all + heuristics. + ADVANCED USAGE Custom Sets "Path::IsDev" has a system of "sets" of Heuristics, in order to allow diff --git a/layout/self_structure.dot b/layout/self_structure.dot index 8a619ff..000becc 100644 --- a/layout/self_structure.dot +++ b/layout/self_structure.dot @@ -2,30 +2,46 @@ strict digraph Perl { graph [compound=1, concentrate=1, overlap=false, rankdir=LR, ranksep=1, smoothing=triangle, splines=spline]; node [label="\N", shape=record, style=dotted]; edge [minlen=1]; + subgraph cluster_1 { + graph [label="Path::IsDev::", + rank=max]; + subgraph cluster_2 { + graph [label="Path::IsDev::Heuristic::"]; + "Path::IsDev::Heuristic::Changelog" [label="{{ single_class}| Path::IsDev::Heuristic::Changelog}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::Heuristic::META" [label="{{ single_class}| Path::IsDev::Heuristic::META}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::Heuristic::MYMETA" [label="{{ single_class}| Path::IsDev::Heuristic::MYMETA}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::Heuristic::Makefile" [label="{{ single_class}| Path::IsDev::Heuristic::Makefile}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::Heuristic::TestDir" [label="{{ single_class}| Path::IsDev::Heuristic::TestDir}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::Heuristic::Tool::Dzil" [label="{{ single_class}| Path::IsDev::Heuristic::Tool::Dzil}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::Heuristic::Tool::MakeMaker" [label="{{ single_class}| Path::IsDev::Heuristic::Tool::MakeMaker}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::Heuristic::Tool::ModuleBuild" [label="{{ single_class}| Path::IsDev::Heuristic::Tool::ModuleBuild}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::Heuristic::VCS::Git" [label="{{ single_class}| Path::IsDev::Heuristic::VCS::Git}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + } + subgraph cluster_3 { + graph [label="Path::IsDev::HeuristicSet::"]; + "Path::IsDev::HeuristicSet::Basic" [label="{{ single_class}| Path::IsDev::HeuristicSet::Basic}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + } + subgraph cluster_4 { + graph [label="Path::IsDev::NegativeHeuristic::"]; + "Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile" [label="{{ single_class}| Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + } + "Path::IsDev" [label="{{ exporter}| Path::IsDev}"]; + "Path::IsDev::Heuristic" [label="{{ single_class}| Path::IsDev::Heuristic}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::HeuristicSet" [label="{{ single_class}| Path::IsDev::HeuristicSet}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::NegativeHeuristic" [label="{{ single_class}| Path::IsDev::NegativeHeuristic}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; + "Path::IsDev::Object" [label="{{ class}| Path::IsDev::Object}", shape=Mrecord, style=solid, color="#7e1e9c", fontsize=7, height="0.1"]; + "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::Changelog" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::TestDir" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::META" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::MYMETA" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::Makefile" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + "Path::IsDev::HeuristicSet" -> "Path::IsDev::HeuristicSet::Basic" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::Tool::Dzil" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::Tool::MakeMaker" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::Tool::ModuleBuild" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::VCS::Git" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + "Path::IsDev::NegativeHeuristic" -> "Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; + } "Class::Tiny::Object" [label=" Class::Tiny::Object"]; - "Path::IsDev" [label="{{ exporter}| Path::IsDev}"]; - "Path::IsDev::Heuristic" [label="{{ single_class}| Path::IsDev::Heuristic}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::Heuristic::Changelog" [label="{{ single_class}| Path::IsDev::Heuristic::Changelog}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::Heuristic::META" [label="{{ single_class}| Path::IsDev::Heuristic::META}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::Heuristic::MYMETA" [label="{{ single_class}| Path::IsDev::Heuristic::MYMETA}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::Heuristic::Makefile" [label="{{ single_class}| Path::IsDev::Heuristic::Makefile}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::Heuristic::TestDir" [label="{{ single_class}| Path::IsDev::Heuristic::TestDir}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::Heuristic::Tool::Dzil" [label="{{ single_class}| Path::IsDev::Heuristic::Tool::Dzil}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::Heuristic::Tool::MakeMaker" [label="{{ single_class}| Path::IsDev::Heuristic::Tool::MakeMaker}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::Heuristic::Tool::ModuleBuild" [label="{{ single_class}| Path::IsDev::Heuristic::Tool::ModuleBuild}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::Heuristic::VCS::Git" [label="{{ single_class}| Path::IsDev::Heuristic::VCS::Git}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::HeuristicSet" [label="{{ single_class}| Path::IsDev::HeuristicSet}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::HeuristicSet::Basic" [label="{{ single_class}| Path::IsDev::HeuristicSet::Basic}", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; - "Path::IsDev::Object" [label="{{ class}| Path::IsDev::Object}", shape=Mrecord, style=solid, color="#7e1e9c", fontsize=7, height="0.1"]; "Class::Tiny::Object" -> "Path::IsDev::Object" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; - "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::Changelog" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; - "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::TestDir" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; - "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::META" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; - "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::MYMETA" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; - "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::Makefile" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; - "Path::IsDev::HeuristicSet" -> "Path::IsDev::HeuristicSet::Basic" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; - "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::Tool::Dzil" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; - "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::Tool::MakeMaker" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; - "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::Tool::ModuleBuild" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; - "Path::IsDev::Heuristic" -> "Path::IsDev::Heuristic::VCS::Git" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; } diff --git a/layout/self_structure.png b/layout/self_structure.png index 6f8de5829df9bfb77f886dc9585af282f2028df8..3e30fcc675fffb4e2d507de07b7b5444dd021ab6 100644 GIT binary patch literal 69617 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 rmFKk|x1RH}tS!HV`a4pWgL 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 S3Sus0AZ4DeelF{r5}E)KG2p2H literal 49176 zcmaI7V{|3Y7cLx5Y;$6JV%xTD+nP);(aDLOOl;f9#GaTF+cxf*-+!(5%X`=TaO$kC zuHJZR@2+Qebw?^IN+H4H!-Ii=A<0OKtAc?+7=wObun?f0@^`7fU|>C)GU6iY-m7QX zaO!GW_`~UJB|m;FB1MyDl0?>*o&9Qp9Xa9j5GjX-*Da}1izcAc{gS#W>!1V@kDUA(5`qBQQqKpmFEl}ME&_`G5LXQ59-4)w{|Z&0UH^dfr}BHz!js{7eh^+sEIx z&g_Z2`bm{B^3(xx7T4Nc_!M*EriKfpGH887sw-F+f)3R!3D#UdfyIQD=ZXbM2JAbO zA$mOQHqW!n_(-e+1UuW7P^5bxb37oaZv^@CX=l#LZcrY@bt3{Ay`NFwi12F78cq7r zK%GC(=>nAt4wm8<8>>{C@D4K|6orNX01JiwRN(F=&g~fZW|ws9eYb?NuWUO^1<&4NLuSPMfYPMWZT;?+Wc+?w%J_@1i&*uhgS|4=OJ zeHyPi)k3{PJpqMOG{TE+4l!RwA zN!Wt06fE2)rT%B4PgSwoG(eQ*cKdO9v>LWoEY$II9PCdZN-c&Pb_G(IGb zgikr8czE-f$Zn`~N*w*F$7I(*9Jru?c$|?Fr|ba7*)WCFl+{)yW_w1@)1&FS&&oR_USP8-$)smy zYt)Tnq2(>6Fz0KfX*cMClFcY#m&$!yp! zoBVcVM~#q-nBwIGU9i>Jp@Ur{^A}~`rh9l;a=Kt2Gl1^G5lw)8Vr^r{awFqN)}>=c z?VYIQpms(&oLM|lqckfVGaIVM>Z@0ao`z_sJPD~dqR&s|%7S91@5Y4%r?vY%lMqD` zFSllZRXYM1xYHorMv7`T)MKMHu8}G3xD`J5<*Zre$>K_R6B4}j@}o(q!A*2r+RL@` z5x@9NR>vCBmqIom#NDakK-`7LuI`K*GLJm_rq*wXpqMFdrRei#`^ek3GkdpRG0|V5 zD|sP*S8(qg-6JT3UP8>`sBkZUQPaV6pn6iUmv1N5oJBEg|B7b<3JHq8vi-TXPnrw% z7JdHENJb@%_CqBzH24Wzh<|1o7+`O-hIK+pS3*Yk&hYBkmN+a*MoN=N`>W`(ad?;8 z^Zt>E_k~lFDqQVebATNIt>z%+)8FkkJ5rMjLjSGy@9;T+jfv_`%yyTm)T;9r?<`qx z#rtQH2p!4xp$g`u+rs0pD%xDWvfNzrY|R%DhBqV47nZP$X0qs-;AdfmR>++(Y@?^ju; z0iTgW^h~ej79wGiWD;A2E7G)QYGZ1=YiH;qQ?y0tI->R;3FRu(QmZ|5=w#+DD53+( zVX&T`=wl}|`Bop}%e?tfw^;y;KVQb&Dd5caM-@m98=~gW>vf?5cDW^^YR(_{Ilqzr z`Dn0DDdn)NJI5KU9BQa$Dj^6hU3$eU>xMd|tkCk&&8X>GVG?z9r+j5vHX7Sk&szC( z!_v#h(Q_l^e+d+%HGU}9t8#s=-y3I9hdAbx2s)V1aa;dkHX`5V-_h>)ynM;DN8)nq z(7achZu8OH3OK?u-(WW4m$>Y~_+=GvCKKV$_lM@N>o5#!jy~{ZI+^#Q*Fuloa2!Zu z8Qxq>`w%#oQrS^A!PFT#-r6-4sK-R`IEY^{{k7h_z&`9ox`O;wJ#T+dkl9poIKp@0 zQRuT(K@i6^;ZD3LMn_#Pc4GKDmc98}7#XHs_!O40N75>|efqWtG`Di8>`&mJ04!P! zllT^|Zwx_+6bZhqjrHfPJ<_2M5j8H$Ts#HPOS)xrl1JquaAtvDA8(0riI>6+0l5Q# z`>z)l?;C*<^leVowNdA))%C1H!iuHIJFN?w{vpR==A~yO)I6f9FNRUyYocaaVA?wA z4p*U}tP{m!;UT7!KW@eidr(cm^d!DcH`e`)1#Uj=qBlQOqM!h9TI=k+;@lIhUqd_On`;K6?4H~UrEAv@*5iPkh@VvM6HZpmw*g++3nK@%E z9tmZv-39W=)$JJ{`wezx7FH3)w4+4Z)Ir(Fm=y=JxP{XM`lA|hN55JX@ zf)a4Nh)%^fUzL5`mR1NeFHN;J-a$)FSroecrZiXhA{DlO?`+zlpQbx%Ky=i^WGk^At^TJ5bPRNT#p38bcZT(d`uK%05d$(|T465MDj`4mIP zv-Xaef#u&x)(5RO!jgJkABOZuNT;t|+Fz(R z4rJ!M_QKNajx+g~TmHC2x8Ioj|1Fi z)&1m*REI~$Wz;pVyCqH?w?vpq4udxzp*{%9YD$sf{Bq7ucc`!0d8y=nC*TjZ*!6gB zrAT?d3^o5m4WGNL@60(|+jSUJ+9DUYpQlvX!qQDJxSs5!T@4S#YhRU&R$Axn6joCh ze_fwrvbp59O?6_@Y%b)DOd>okA#6)=Dlp8dVa1NS{YmuzerVfz)5hYb7)raSBEf}{ zJ&|0#8_$qr5XTK+^I0zazc3WTB3p(`RmRAbWXa-P@g9tveK>R{{N@!bzZOv>j7+S# zk*8pldo@U&9}(g8u}Tu0>r;w&l`!=c+;G-s1r=QA7A*WzjyLkL!=RZHF7&fT7@O#U zl&rnow z2soNZo*Ik1U|u=~OfbX*YK1PLRcLk0PUT)SRccUIsriIT_q_g{hqf&;E(P_DUupmZ z==A)0{<#7PFt~h(a6dY^p{-V%hb1lShgD@F10muaM0D~GVTc;igI-T95@3J8Dc)y| zwKsxVXEGCndO!y~VRGqt?O!YweN$xnG(-qE0xHOUyZ*h5FUu@=xQql;&;L#1kbr6s)PMB{>_1cgZ+-ud zOShJ48l+s#;DxrWz4l7hx4I0pYdeQ5UaxbM6njeTlSoOxw>);DlRDV^M`mxHn_Rs($~m`f?WA=f<^ZiWA*U8tl&op2|Fr~rJ5#b z;1#cvOH9XHn~Vg!*SY!Y;be@x!~WQ)2NXq&k}OsoRk~SEodTH}$i`mO5uM%3klb8) z)Pz%5Y23r5lccK@r)mTcFvhUd-G|dpX5+#7VZou-PIkJFvwyQeV6lWgcJGCqoswyR z^nF+u-~cxd{~PZj)jk^LZ8KI~v4(!@rx9uxb)om#i4!!bidt~AxhV{uPGn+ce^J(>x?O)I1~qpxm-Q&5_GLI-6r+W#ZU!R+E}5 z7nv&h8p;(TFOWFqeLpP5u*u@hjHj={AXdr%wiuetB~{Slrn@?e0F-q9jURwZ!8D^Ra2jhM(`c|KA~ zYNnvwx?$xM)@_W6Jwb_aOH>Jv)Nf`EI^%YgZ1Lo~IQA9xgNZ^WON+K~gzf z?hy2q%5BYbzq(ugJ76A+p3AqI2 z$kIB0(H`+m;dR7f1p_@j_vbgKoHySfm6S2ZopTSxbBy;isuO^kCDqHoaW$kGAUNJB zt{y|-V{C5AmeaU8#`QHk2$D9tPTqzqZ z`SboXsJ*CTP5?mhHpI)o@wkMY4s}oJ_2N@UwzT7-sY8D@h<+-QU&J(NJGk&6mKf;8 zspm&*cTt3$*KvMU9tKnKd|x8?PA&H_9-t>UIFXXaIlMj}hA8cer{iPiuSz@~I!F-k z$e#p+MBA;q{qF6ZB6%8j;U3;RJI+KdiMm&lj^>;rMnvOFWInHZ-1Wse;GhY`5am>$ zIdOr|n*Zc9af7DdYX}|%n0#Y!XFr4Ec9PYQ!_UiTi=Fi%9F=VBp9RuBCsRQS<-k->8!OVH6SfQ8DsU8 zv8sQRvJefS$Yb|y-!35nSSn^#{}rlRp0}=#J%B2aVCfiG$YtD2lTr*RTE%+)Bgbo% zCiZ^jT^#T}JO;YuSsW7vUQy{09fHuRkVA>>8q=`pPyeWcTwU@n_O39RSo$5Y-l}nxDm{M`5fHIpr_DG^2vEuI`K=&4NY-cLJw-YSDmKUmq^0i_h5r zyH6r0k}Vyqd}p<3Y2IwtzjSs)FsKdR#W+1!shDQWVHyTne>frz83SV5f}kl%qbD3f zkCojsR#cUZE&d=5g)XFEN6|ajH(eeeX=)@^At!iDy3h(STr43V#=>vAsDppFHP7 z@%eVD{zfYpAXJn!WXJR68YaF!?8|ELy-P*F=ut7{W~yvQ z*%{sV``avzlE^T(i}%6=*eJJsPkm) zZyMyDDHV{K|Dh+)WOopmJ?EEM@Bt*n2Z#HmkLz?n*r-!H!UXV}}#yX>wcS>@nwHxkgo78_3eFx(`(Li$Lm{~pFNt+bkRX=rF zT0avIPoqHqX>0OQSN~#fyQ8@u_;vSe!AcGyqP^|>Ds3!O3j(T}6_RD`KcGM!E+&tT zHsSH8S>rh{-A~ZR{JU0uazjI^ZslG+*%90I+zxwA~E-G*q9aThOjBOq}c0YrIg z@AwEjYuMk4nRU(xODv#3;&1Y4kD27v?6O}-voJx_*w|*yrHiX+EH5sMAT5Rck_`gX zXW^s9%(M#cr?%#FwCe=o$iYQLh+TiY_bx@qe(*-Yv!pWLO-u)632JII+XpSU!kyg3)$ zPf?0f>kFs))5)q?v5YW;9UX_Ov0p47qu2gncg6ZmmIGbO*w;3#)w!FSZ?BH#cQx=H zUAK2r711|Ap(*fdYWMLwy!f}pNk5!kQ;0VX{JQAa2}Wg})xdo=rn=IC8oUln6o~Y| z4sCh_^_H6HG*O}89JfM(O*No!)NB1cL@Kdbv|i^Iix&Ut_Ckv=Viy%LSvT3D;h?Ih zMA?&(y%NV$o_&X<_|9O?bE()mB+j5aE=FKgYG0h!`{jx$Ex*$H-+fL;c##lpyST{&AtNo|0+Rdu z5eCZWK83Bnob)J$TF;Tz*W#WkWuP>HGr8f_<#8DC;i)nZcGfm2E7z*+!!o!*(d+Lv z6=ZCx)I8>k_8l?%*u3*mYJ5{=wBC~A=GF0&MPKrnvDIJV)fe(lj1-A33x_{09T%5K zZagO)>4JH(RAblKP8Ncztu>=ey1*5`i7$vm4*5=d{-h6A1BPOrMT?ex3Yo`{jB0(< zZk+36+urCbJXg&&mOHDip!$AB1t`5Ha$oP6t)s3@Dk4HAeM<7v$f<#qNe+!;QHr6# zMahB=@Vp&e`6m?FQ>qrcp{h zGtlc+Dsyv2Lp55KC8+H??z4QNDA5vHVs3q%|LUY(52n*^&QSBmYeIJ*5}4a^>c`bR z*;2;;$|7j7Thw;Dy+(M$M8kRnL@%_Ug#DUI1msEL(^Xtmh%H==jnFaI=(|;DA~TXz z0haAe-reFclR8(Q9VkW;0lwKy8%r}wA0yT|MgY`|xwOyQq>uh)3WU%4v3+pGFWF7J z1l-U`^c9S>>i#!=ypluV?@dS!JxC0gee?xyp^CZ&!}gK8dmrW{b26v>*VSdegFdX2 zYMTA;G1T8TS%u!TMY+T-0_PO7?}!BW3GeyrJP3MOI4zGJiJE!Rjl2iSbBWD>4}95v z1Z;>ecudjx1o}w_mOX;a#Dub+i&RW2=0f)9Y*g-r-O2o4QW31-(68e_Yj6 z%%q)s{p z=6Vwz4$Jl`C1uw!Iux_7azA_0p*N(Om&0=TvkH*Ywxawa5b^-3-r~>GQ{gx@Rm_J$ zqhQuq1_dxV+ZsIw=;Qc0Hf^P=T?y;^L9dqN<@?-98s08>JDtiodpOSBvJ^|e>w45H zW60y5d>W+z&=Ui$Z{djpcL-7Dx^EqEXqhw8gM1HQE+04yT(kQ-cJ1wXU12?bxG`&u z3MX9%p5Gb+^nHY(j`^2)vT6*u97ihq#DSqNG&p}%U~Va<@kzI;BNqI!BQB-4*}ABY z`Jif{Ck0cg30yL=0u~qjy#U%xc%QIqCX03xXqG9Dg(!%e6gR{~&BsE$6XH^v$NIH9 zGtwF-{fs`od}rky3N_^%eqs$3aylj5t953gxz|0IGU9lCL|VSwc+<%H;8&vOe)scc zxZe=JOkQbO{+J8#KiK8}H0U|R%J#r*5s(NC5eFgz#J|)HZehti*vZprm8%p$jlOwI z9?ZEMqxHFHs9KZ`_ng~b8zj^Ux~?oc?LfOK{^}ZhJPvXFq-~}iGrv*?zVS`Pup-|c zPU1S;_*lp4?q2`SqHec}lxU;=8{|h(IE^DDxO?Iy#A7`A)2D@-ZV9V&F;4@Erz&n^ zt4~Z)(dg?)xmFuZoY%O`S+hDCusqYro2D|(x$c)EYDNKOq3z#!XuK}--n4$`rt(;2 z16SY0Cxhel^<5!-nuN|)M>W3(P8KS}*$dtnSk)@LXi>o?_esp#ew^69X*7kz0}u@! za3NMIt-1k6YbxF48)uWIYGfk|-DRw&i0&zd2+s!%kSP7BD8zvYC1_;0t=o2>}bsLq|W8o2vyDTbH`HT8Wku3d}CS*nO&-@ zozV+H$(Q8dr^}&^0+NoM!!>b+W6rSqf*2HG+@DcG?~AMSp5&ZDu~-DRN|hU#h1PV2 z1FGTYqv*8%;3Cn{*vb?RC+NQwApyr%z}kcV5vM?{8>@#sP_48s*go!;;+NO}P`r4l z$$3E}pDp8k_2*%>+*c-_Ga2fyI=BG%&jLH=D& zZ!_{M1c0o*E0Z@AFK?@blT=;z^7e!Z9>qigE$Ti7-LgdHRY`?&{ib$=Uui<=aPF-( z^!QpIfrDDR0hJxL_kYyZx1<2z$sz77WznLxdnC5JK$=8%MQEB+os`X_j{-T$tOT?o}=~)#!Nt283*8z=4xIf&R zkj?{~d=$^h7yK5>Oo`vE*=*I;VBCzacAMW4eVQNZ~3SUd(kL^Mc% z<;yc?Ug%~cVnb^ckf0Sps*FZ7*qAQ{886DUJPlK1m%t`GR9!OzfvvQCZsSF4w2HUF z&WND7LFQ+LI!t&bC{g{D1e4Jh1-YR9d>A5s+h}%#r+Pj3^Vuqj@(-cT!UD4-o{&Xr zwpI!(blJ5&z!A5#78g2_6EY|O zR;g!8WXdCUFx3b|=C0a)zmLRIri}cfKD#?A4h?w_|KzY?93DYl{ZyeSlNBMS-IXp= zz*5}YDIke&{%l#A`+h&pLHtkDO8C&>+_8KXKB+aQ(dWRkx1)_L>W+RO;ideh@%vBAtC|uxM#ENJ3^x$8{?ksc~(T5hgAlS*u~ga-W(|V zxepg2xClu@*?h(L+?5-3E_e)>ZHp>ZR;A2?D&y;U+C%CVrijqmbLEWuEnv3o|7D&2 zizbn@Ifymwe}*MtQdd-!1L?%y( zF3X0}_r$}G-kk2T`h7M(wZTh1HcCeo@x&-Hw^)X!?T_yBxDhy~YUL2ZXA3-!;39)$ z3BPhg>=b3C2-&PD8dOLy5C|JI9%Q~9pSO7CC3J-nbUD%}MmwtC$W#3^5;>rB8SK`_ z{r}$VtS4Z37Dlf#o)q#W`eGrZ9FDD$XI;MAC48N+6&E2JAvm9up@CL9Q*#i&$NxS` zI)3?F5-f$ty0c-;%U%NbOFn9!PDZ#QVF>Y`%0c~?Xuka5%5Q*9V%Ol4FVbbfr}9^F zP+qf{vJ6jBR0Fjm`S4_L6iKt&yBt(M>t6By(b?BawXO_Eel(Jr_+X<6$`8I&XwP8tv%si+jr)R4f=6G#z% zQ3Sam;w{L+V_u0S0vdR;NDl06(nr60%L&h$7$3$Q_bGh6Yf*T6;-AaL~=Jns>RK@@4y)JbmA>g`*B-;g` zPpAdBpwLAk2kac*J3=&&RG}CB`~^xzF{`A|!~P2z?sUZD)_m;-ij7cJ?o7$YUmqFL ztL4A23!exe{$Vv-T#F6h4}NC_sw4kQ81qf|;mZ(@jLmG7ICbbd(e%&!d^mPl(lgf4 z7XDoDri^YWEFzh2Jm&3(-~HU%70gLT`}znCp+K@Su()3a`bp)7RJ>VR@Izc}m_M?> zg0O}0P*DG!#&7wsGR9^VfyEG4{iD6-I#NTL_$XjDnkDgR-l`QdUPBHGk3OR;-RaE& zK;*4IVfWnTYX7>RR(G>iu z6%ig?30?Y9hx2?7S~|vuXD|tR-6q%+I@5}#D0Ogfl|o@KG!@ur1~k;)_$uqk+qp3j`Lf^o^f=R%M!stbDWL-*=Gz$tUV!thWr)QG4 zEl1C=cZ#CIq@+NDp;G+X#bnsT&M^rK#5CG~#e?o%xve5r{aEo?E zinCzJiIx<9dR^5aDD5S_%Al2Oeo^BG2ZMqG8|%HUAmlg5`~JfnDiTpi`>hW5lWI9P z_K@{PeTBPYCgh@A)V*m7O@uQ_|;vE+aNddqw_SQq;wbfKN0-# z9SYt-yH{@_Ipt%<1>(HjE$wkprsG%UK|JfGQ2z}<%aM*R&xlm5fH@}`W@1IdPSh!* zzU)(``)A=Vp|bL*-n#hcFO(kk?nQ)Q=G$|fvP;WPt=$Rt{~{fuLh42Of?pg%0+Ow;VHc9GGQe~p2X1TOl;2}gl(YxBNQfIs++`Fbv2au zMZe#0r5s;!p~VeVoT3cY4x;mb&=ojh$jWlvx|U9>bQGcEBF3J&I|lpp+pb%C zrnYL8Vl0{Bo+=eX$*+5NXA7VG-&MnF5zN(Y>+9>YOwb|_?Tv9}WJJRnT67;Fug(b( zCR5{y+(#{2`_O^z)rPB&h9*N_4oSjD;!Evw8!nkUKb*dWczC}dw}o?O7d@|VeI+tM z+Y~ub1s8$H5Y;H~9%~;O?T%#tAVR?%f!*78#+g}937_vSU(LzBI?%FigfrtSG-Vjq zk#-euPB`8T;4NAv3XPnZ>%aKR^*&g*EmE`SVRXhCvazIpe8jTtFzW3nwRLgZM=5y^ zFx87@%4?(5jm>x#587$^NsFXhHsA^Q6emZvJ%(kOxk)Lks?F;Vw;Q`GtBDRVbdsCt z#x|evc)Z|W=HA-XZ2X>+69xubiiXA&J8>}}8HbR37m1Yz?AN761=97|R6s%rIb}8& zIi{1@p2-?r66%X<@gEjdd8{T9HalNX8-=~pr1fw_7!Yte=|Jc`r@TsKrwpfx3s(P0 zdRpx4*D&2+?pFLRE3yNts$Vx9Xd;hs9=)`*VLXfcYGivP&3LXdl2{)x2_&if+#b z*@F??Ddz0+ra&wGM9e17JUb0#EDIZ-KC za7XP15(yQt-mqTTlZmnfh8)MIxFiudvRM<^POwsgnX@scC#AaUulRIdm@?~zG@bnY zyPBBBECxmft#Hx71Ea-`vMHR%$2zQP&PeDR<<`*si{%@e({1H-2!;oCfNrjj4CxMb zd{!P5L}Pmd-b4Ql+{fCQ?LAhDa$uAXb?1l5oXH+!t}7{xb7W#^^llfKw-!JUDpBK1k3^eEW; zS8kD<2lmA!zrH^MTN<~?@mLV^I4+ZLOD<|}2+&Fnu5K}@W!)fVp(Wo?zmlLkNR9H1 zy@iFq%J|?$$G!^no?xFEafU!}TqsrJIW}_}wM**&3LEa@tw^Q&<*Yyo?L27eLAxpR zEPSk{G6IqH8g}{Sg+`z&zB;c+bYOCY^Z3~WbCY7Vj9T-7-??{A+{kIbJ1Pu%aIcBB z1Ky`;m}nSZjS8Q?L})d}ly}iyAi0zG_YTRU1CK#z&%nMrpOX_P$A0`gLGFy-uH#o< zifl~%f~?rPl9|S0_BJn3vIe`40@GqjM=>aVQKB8c$GDaX%Lu{e(8K5!jXagY4HaD@q9cv5 zXPH4FWTzmPm>!M4f{l8m-&D+#E5*{m-`&^DU~I*`IO*u__(MWe<~H^ylTr0-H+=cr z(2Y@mxoJ%KlZ1)h#YF_zYdkvKrt@Q%be9gOTwYb8JRvSnP*#F~1;_0wo=+dbAhdJ5 z$2lER|9zD*AZc4D6ZRfTW7q&O*1>@)6F}5M)~pdeuuu|U*peSZQ2sd9*$dHKNn0-E z4e|0E9DB*o+~CKYQ(6>Wd-95eoH!9Pq4hpbLv=c?U8YAwrIgFRJ^2SdXUs){ZW=}u zm=!9a4a|>%T&$^*uTmqv3!Hq6HVXXUu-l}-ek^VYyT6kefa~^XQwR^G>_ga)F&<4; zswL@S?3(jFaoD9`sv8Iya90V4u_UZc;J*k>i-836-<4bxyBtYvvS0tS*?)Z2u6GbU z%UX0}YWAZSFaPU(J>;0F(g2tn2XsHzA3yl5!whE)$F|h5v0wA%{%U1cO@463_f;xs zVk|h+XmY%~aC4{Korvi0>S48xe#!~H0d~@|> zqE0kmFTYEj;mMLoHQy|xFsQ|5>9LLS7_QCX-vbW0`{p$jlA|$wq1QS7?kucR$H!ds zK)1#UIrT)ud-w#exlFckvxPBxUpx1LHaHga9DvL3 zrhzV71${+e`3%VQI5R1+rRKMN3LMQ6pv)Rm`|MJt_HkW1h$D2c{hn^k;t!8qsLQoT z$<%<-$-Glkm45D}B&`2)fm84HIj+FD=>b?$;IGlOwqT|<>ys;vY2n1dq3^|UJ+~im zQS4AVFr`M~)YHE1yb&kA(m-z}!qhZ?Rv7ByvbjG5Did=rFWHAj1Dh*$x%-=J2tnMy z?wNareE{3GXmyv)`BluxM2hY(|EQd#!E_e4%Bw$MQBpH9@=`}Djy^jIO*(?v`uD|I zEOMsPZT!==&DTc_!wb3h>L%IirE3`pj*HlZhGuiOeN{_KdC6#T1t2Ybab?F0Z7Ta; z{@j^~qcUa&IM91Dx<*e$1zN86yStj4<;^A};o7^AG_jq1rM}7xBN`96bD>d2VBSBQ zqTBld=gz4SZi-U}K{T~Oca1x8549poitp~_NGH$zx`y|A>V4g0h(h3YQAi2$XSoD$ zpX}bTaM*A4f(aYFxF3RA_qur(rorqK4BR7vW&+_&XhQ9y)tfe^sE*DA~3Yyh;M z?|9u_zo^2W;CH@|-IcSGGw@tBCM$ye)3#bXarn4%htomJsgkBT@`a+%YUm4B0MX#S z`wvVgIK)6GbpIMAZj1_v(;F9J&tK6+t=A@A%7#B&wY8U^pL33Tst$R1E90Eb+i_Uj zj#yrSzw57j`afA`LrnoN8mS-i6O$Xa^+*hRcXmk?ry z6@N`=-+ogIpFd(k_TXSk6HadvENTm`+|;QZw{5ITZYXKm4!OELO&Z=WYZT!Wmf>Yy z3CI~2gMvu@Avx#dP)8_Ws9)n2jcP3*q#QUj1{gX}<$H&Mq@o_}w-E2_6Mv(m6IYDtb|N140f~d(6 zQ=K^D+fZ*3+ssJsguu>AUt9mZBr}iNG$pfwO@yt{^(|&e;=FUJzeefoIZ=q9RNM^< zq2Ltb8#w(t#v?Ex#ZEBk@IE}Pl3VIXZX>20dw9<55{U&KFCoe)v{?8JDt+nDn zujOY>?TfCJ(z(SzWNaRIqb2fLBa(x@?Zq>6(*!c;b;~~x zSuOplZow(R3kj-4%QfYMa7C-E1*|v3j#pu-owr}WqLU$4#VpYbE8kK@!9jf8oA>Dm z)6kPpPpW@g?&^J}#?OkK%?DPQloz_W1ESHaqr##?&!mH1c-N=*w;r+No?W~BG6dl+ z@rWdh+X!B4?;MvrVD#xz23qRM1>@vE+C7XfQTOYJm}P{xA8gTiO)c zyKY^rW9zS2Fn|?ALUD*`!oUr@6-950c%g4h9Ua;9VnH1Dg#I=mY%Vy2>S> zdW;4wYX5(PKhnqvkeL}tf=&t*0>z%J2+mp=1zA6(HDlFcO-dR&TN?55$q zEas>?iL|g=gT^)UyVE6^X3IfwiR9df!#kcm)Eg=ODg~|AlU9AZ={J~e{i&@YDuJ<{ z5pPtDK16!V2=hb{itQ2Oa&se1Lwf-gBzVkxip>kAYV1+JN!XCLuYOj<3-jsF&T&&b zbG*&Go-T9%KvY(lTorcHDlaU}Jd+Ht z1dsEKf5l&+IklPfsXKMmf*_OT@A?RB@PyYJIVgn0hQ-`Wg?rmhOd}?YxgL8hVcb^o zs6F9OGEZ(8!2%Mf)3?L+8Wjx^>yo6IIl6LliXSuI^R&Y@OCOS(C)lbxf`u$)SjK9& zLg;C@Rr}uPUysRP(J5wffOd5=^7W|H4{z|~nvPozTsaXwrA`D=$GoiG)zBV)*k&T9#RSEQBjKbr-o7%s_;u+BE)J z1ATl39KerPA^#Xj&S$u{^m6OI!Q>WIM5U0<|7+Z6%8nY*rSVR$%0q6s;B5$@P$=m% zv&T-R^aaL|GryO|HcGM(LM;SJ#vM`p%W~3>2C3OELQ(ii8ln&=pLE{|Zv|nM9*N8U z7zYR5^6xC_XB}Z_n&Br!GJ%7P;>G`Mo3*f}cg8H1nqk>VJM1#EGDwFHxIHUlQt6A7 zW$=jI%|~0hsWYa!#n)d9-uTZIUdO}hU9GET?|k&HuUYL>T3teAGhz;3uLg1|2X#GUGW}s6@hqS7U*L8rEJdWA+9nv6qXBuXQbs0+7l6-4EUjjf-Hp8uFMN7Kp zn8(bxVYTX}$4+s8?E0D6ril`{Oa`+i`HCHuqe8yX+F}$6k5pFYAS+>^yET3_KxJs$ zKk!v9n0oNkF(11L3NC@c-_jt|`Z0z*|bNJl=am_5BS$2BGEPw=Gk65pa zw&i^!pb)qYew=f_srwsQ*!QTiTMePR`I%SP3T}tt0{Q%4vkP{BKmLMuztGC zqQQLgpfZXDug5E=^>HpkhJ7rXfiwbOM4d9#($f}4Itw@DWSpac4EH{gks{O-I4khr zvDH1mr?s^&!o-k?`Y&p*qmhtPcF)uUW2d9ISj3X&rBx|Fwrq24#d3tDyJH5cpVD*G z4-(|`X=6SvJ(*&FMR#3{Ol;LUux08gwGkzHAKIB|rDR+e%@1P(GE!|wXwg9`VY#ap z#mK(S;d@YRy7#XPmCrE| zg&7n!DAP0rv;kt3hGIW#?<~2p%D-;ncOC70PZx>1$78!wB1K?3r5r8DA$)qP1)uIt zT_BNrXLz_(Dvrs_tu9x{T{*lqd=KyO(;eWae7FJ}4HFabd)=m3oFUtG9M7h-42J_? zeSDALHG%tC@j?Ec1AhYhzCB)Z#avz=Vo4zFMC z&8kQV{F~Vg+Zx|S2sKwIS0~S^{+wz;rbXhtCGT^XKbWNd8uZNCUX_nuA49ovTxlZW2$qLA(d}*{0FU5)o`b zxbkkTX?^3VyS3#%3Z+5u_*;wP=@fd|rm`EaGx$0jzv23q{rr)GxZN;62c75f_+R4V z&$pi<0=|;|9};P|F3yiRDr@lHQe)r5HuIQ+yvsG)zvb&aj&6=rO8SpQNAe6?KH#zY zT~6oL^Xa#g%^e~WbKCC$yMG)Is^&ov@%BY&4TpvUGUHXh56x$1^Le`Dpk075kJ) zePGve`dsj4M+I0U`J7Jw65|aDrgv1fQ^e}0fZ$K7hHtXHr0X31TV81zA4C~*J2x=5*dGb?152GiIS?cmwj{>i5?p%Ja0&(LK_C4%mt?$XKwBbH7_ zU7R zwoq)z0WlNk%uUiU@RS;t9M?l7Kxa)Rf{wE3pA|Ps;)~&p+=krEC@N4G`DYkB4nQO_ z=ypoC&1_kOTgr}m){m`;5~P*)XSo*+F5wD}lg~e`@c1PvDV`E^3u-;sEwdn&Pf+Lj z9e9QnK|e!}1TGj^@n_fewF4ooVXS$W&kLz=6FjT4U(@pKe zfPlYZ%-R!35()G1R7=Za#h;Sk)`d4K?)|e%!Wtkf5#2}j;3wyN@QaGaO_`oO&1XK| zIDcqUQsyCx6ATPwPU5ur4c2@hjH=1?`Cd_^Hu zh1sHe`)x~gpQO;TlHpenm7B6<^<>;d<(m%w&xKE*tN66P6S)Zb1*wB`@t(f@YZ4)S z3a2UOm{xT-_jj=F8h8achoKC6UDjQ|#CttprPtxCJa^-BxavL-$#7ZI&KA1h!&SF(L==^Ka)0LHy<;1>LgymYz$j!ljGIt4>CZ?A7y};}p>l zL8`yZr|)ljkFUPh>8l`@-&uV}R=TChS!<8Qsrs9H_t@$S{kXp10a*e`pG>vb6-jYD*n0o>`Pw5m(jVB)1P&gDsc|L{ z5N7+uKYw+9T3yQj%4nbEzQ~$7UhcC!wQj=l5>Y9ICo^q|dcCmGFmDWztI#O1wL29= zhM+Sxkj?XuXw;CKfsl~EOa>!^CS@3cZ50j%Llfn!r*_)FA>NiCBNLa|d(HOZXWpZ_ z?0$8<*nIu#gtu+I)Z#a-L{7&Zdea9t9e3s+XuVl|>wSq>R($7u-bgdf*Wj@Ke`tHh z_RN|tTC`)^zGEjH+qTV)ZQJPBwr#s(+qP|=Jnuf&{s;T>T34;AF=vgMHMR0jr>3a$ zM^wQ_VE!e?U@uI2^aeDLN|tvO-<`cFxCmXodEt(r&sSIEW@QKhf@kOX0caOp@Yj<) znx#D_o1uT^x4rLqAZj9#@-6Y3;e{aL*x0Xu<%C8Yy~ybQRxg~%@dJ3kJq9A+-pL}< z7!W~`V}Em3g?j7dmJ*6l65Jj;hse$du&T)lB_!}T5?_N9%wcm6}?MUGR`S6|)d%@5dX#B|c@ob~q^ z*RZMGd>qm3nX`Jp&?E-H#DwZ#-dMF$OoV92jIZ#J5-&RA@YX*SVwDb#kGlk#Sq+KIyo<+5f*gW`K%$HI-7aFpm2 zi--CAm-Nu6`AV?+61WyUr|=q5v#>qxp|@JpyLWOg*~9VDr@s&-T?pG#u+MLHUrCZ{ z&P5Nrslotq*Gm?=o!mSnR$){LGYquw>eddc$#|5RM}(Z7Z7SX)W*MZP>`5--QP z8AXf;C$NEGQmT5vhzfR7lxPnH+#t;k@>>F8Ro^+)qgX6ZCPA2euq8wZRyM5FCK@(1(qj6NKuQ~OICv^Xx ziHLMA1J7n{)DjfCdW>(EP3Xxou>#f;1ZS={SGdqF?ai41>~>BPJxwPk>Ck8)wk>2S znO3=TtLl5c zux|1TQ^hpr@Nc~88k`-b71w}swymIw%n|(X(`A+mqcID|d&$Gu*09OS-u)r=Kfm;g z-teW(w-s1D^zq5uH8oSK`s=yzE$eEbn9)AdVcm9|kL8UU2lJ_Fi3r0N{iubk(g#^i^8Uw98gKRUFGCs5Q}yTC zj3%aJ7>BO~0L6;`JU87>9v+Z@-;<;%lApoZyFQF z%R^96Unq)LaYuJ$IGBP2X?3);@-Ohj;(C5^m1@W{3xUHwniB>r?Rn{W3DL}k(`z$g zRO)O+U{<_(VU7cJ?l8-ZEJ#K}O4)K~7ALNF87j`C9kS+M zhUj|uID+LPxfjVWMlQX|8M>b%)(r?4nMb9O8pG~!IdBbCh9e97$+%$1?%<~Tq_P#Q z6tR#|h57Bc4#F@%_xrcf>TZJv0>C!+$56D~LV9w4LmfAyhPf)&TqGFCp!p~MPKv!4 z0ehp05A^;)+hEj!?4e6IE2H_Xkj`{w>b4<1yMMG8Hm>Gw()f?3>~FtOnPur3pb1poZrr zn7#7{X*gW{wuMja@s@&&77OSYl+#(*-)g)t1(_EXku|D0jU{UObnG*fVY0N?zGw=C zB@wFSXt=jlBtocqA>KG-sB%C4(4q>%PCU)rtug0g#l)nq(EUP2ca?WMtrIU6Rac2T zLGwC@u;Fgh#BFExq2FGmEK6;)+0YAKPUIIwtTj3<5ZSN}R4(Zxzo7e`pE-5S9F0wh z_)Q`?m6LQC8KRUJ2{{2BCJ1J*@PoI*I;QktccdmQXoU}?RgMz9H|BwqSqy;o7Z`G{ zUG&k#aZ%F0p%`CeVd-+_Bg82=YvJI+KUZupVE9;i;97%N+HPS;G{3_k{H!xMKN5E6 zk!al50%2%h8PAT@2=grD-^mj=|B^X@f+3sJNwOsVSxZ=mOd^<&feXSuY!CgQ53|~`gH_{j?f%sTrTR8PTA0RO`~o}1o^{{ zAArIAwAw8yq%J$>@_CKla3Zyu;}!VT8UG0XS+HTCNDLFL2%+s|nsvuDd-A^k^6eU{Cy=J*FH+XApCXnBCU3<4d#V*y$5Yt zgJa-0tz}6ObW{7Vq>uv&LO4NJQdxlA7(_%78|MBi2?NAd07|s%46GSPNlL$X{do-J z8|^Fv2|GCfMdguVbaL+wVsjKHBcwSzNlr5#>at?|lPye;eT?Zp$e2GPFZiJOE zlWl`c*|3%}AeTR#Ay&XThHgcn%*Q__sMm$q3QR(!rgF!ie^TT=W`=^7%l9B;#V!Wl zRtur-+OXpT{M$a(G3Bct_ifcXPG0BXJ=uA^JDbTv!^vHwG1Ph3rYqD3f0&4`p6+aA zp=BHU0t>f3+@g1WWR(y`TMV|vd)kMbH1_!e*K-Z7<(j8=U;8ev?izM2O~squ?(QLX z=^hZKjooLoH7g~cI8tYyp!M}9;XeT^CU9sv9Q}mP;d!T3F5dxu znT;YUjqU3lxag&QnccRF{~xsC=o1bHX=h^FV*#oC;lwrDx2~0>Z`y@JzqOzy=%Adr zXfqTNsDQs0UhANL+SOV=+0k{#V}8w)CsECviU^&i*BjfZ-nR5gszZ$`07bR+(qIXi zUI2r^(IAtP#6()q&W%t*OE~gsfCh+dP`DQNlKUWQuA$Q@2&XgdL&*Cfvf-<)i{Z*{MFlr6!BE+G zIrK84n>Yo3U!8~A=GTh{f^9{(@`X;b>Ap`q+|Y-54P*^?qEfWti_Bd{gMpLa(0hJ{ z;AL)|9*Go|S-m6etNA5`E<`f!Vr!KA9@rmkYA&j^Oa=AE{0+s65uLl#2}OWJscWFQ z;Mk_j?@EC}jFAysezK9A+u>McDx8RGB8%k3Q>4zZPhj>1|N{#|MJO zoasQ1f5!)=%NTH^gY8ls;;TSSm8tT#3Fd+gCq*7o1b#9R=U@@XEXT3^qnPfL|M|%YzRj z!O}N<1sgMo1iYiZKw8$T=`6CfLWr>X&;HXZE7GySS|=`tV+}OcUZo>`9mr78bs`40 z5eV9aq-_wMV#eMkT3;+lNTIY4V+yk`#xhbfJdvNt)i>=z{^@dvhjO$hW?d9_xffzz z&e6*8PU=uU!*MTXcMgOzN$D$~67y$Iv7~kY; zZj`kvlO>t%7i@Z50iy5_C2tWvEA%l9MN2>|Sc&bp{?rey8bf>%rzxBigOK9XWK=aF{fWd>>O+yzU6$So7rr(etOf@SbG z7Mvuh#Y9QQqDCf(n8aD3yC3ycu}2-869*Vdmp<^n*9_Je9Nz9p;~N_#b8~fneI*EW zzato5Uot}rSb){{y^#WxEY#^nOkAKv;*cna2Os?u!3?B&FS#kUcbdERR>e+)kBzYi1O9IXu;4Omk;z zekCkrBf@tmr1EjYZzS6EaDOv(?8(N{yUkzf{JmjC#WW5w*wa?thjksAK|AD(ez?-< zel>i)-Ds?WMOpsqjd3=n5kEy5YZYyE%S$G`S81&hDuiQ0dSf$SS)TD_3+_a~@;Af2 zDl781`Ti~pbLw(sXiC-QrkLQfz-N5QAnP^w`=hSC8EO2F8aabhZcp--slaKwP^D4} zI~z-zmS5KTR72CvuMXLBI1J)OJ07tDl{{Mz>z;oXua;TzQ!aTx%auF@tliZ{@+>(qr4=!Xh^WZ_H&b6 za@DXyEoJs0n87LKyNeJkJM>qUlCyxPSq8+l5P@&Ue6srLF7XH5^L9a)W`*3KL z;0v%nasy0oK1>+B;tA#V)euVl1+nh#9tX1Slet~}5OW`2n~qpF+lK)|Cd$Wew12ID zfg&m52hG{*;gWcgR|hcUr1B}fe4FYy99RUVgWVm-$kx0TF}Gvl8~P7Wj8LQW0}Y(o z!OtL`sHy#I9li;3bpkxYgt!nK!*fYsTJY#>GtRM-^_RE$bI*BM4wx<6uBHotoy z@bi;&#*m#7tCm~w;xVzPPIWb$9_jRtRGfybwRhdz&xz~kH&5D(4%)Ij61%7P5%59M zHlQUvF(ZhcpDMv7ucupJhG%*VOM+nje56A5?;X_lTFJ4k)ANF~#C_f6Q+^zYNen>_ zcUhrkQ<_*zmNm^??ddHTXA6{(Oar7!wp9_LpQ$WeSpB4sNDZbF#!kDed5|2lz!-IA zM9~MMikCXR7XVvbPNhf{O$6bDCk5Z#ACMOEn`9}tiH~$Kn%2{+1OeZUB2mE@^+Dkb zd*W)SoES)nEpP57DdtAKXjij2l=(sY$m$HN+Kk1yLOz3^SNyOaO58u}*QL-bq<_HE>$elIyM39>vrP^h4#Nw~CtBYt@C@=#gposN*xeZNYg?J= zAMRtj>v{Dt=8$}$wjvQi+wpJjegz?jnEFlk0%6FtD59Vq=W~`->a@?j#QxeIXPn=Y zA@4GO&AI!v@Q3%XHXAI*4=vN)44_A3?_VEJWK+W$@TH`T~?{KwzV&RX> zIQf>0hU0-}bBOC(pGV)SWJtME#czBa=Y@u~S7Vntg`t|1)N}3|W=c$kI)RV7(oT+0 zvh~lvQjYiL6#<9)R8z#J6{m)kH2zszOe% zBk@0;uRz4GPT;T(({GXuyrh!1OJLg3#{+9H%VYpG<7#|?(W0vMf3EUxLZa`tZ;3}j z>_TrlD1iwdV{da05!!ZG@>BY*fXp^}y<0uTt{z%cgls0LgoeembAgYiy!vf(nESNt z=iuc&HwM_$K)0eo!rY5H4yxpbJ~oFw__HB9`HWm{99_kTC_9?Tf2%<@`YGMf6N$|7 z%P2*l7s_k`Yb4m`+)Q}~1o?bR(kMYonFgp8%l`}Oekhe(6CEMQG*$^dTL4ab9#^ys zT@3-pL2;W)XQ!8XktU~Lx8{;w-k1=#9l0@PD>vrXcAIr?5AU17-vpm{k~kix5=ysh z_Cs&Colk#7N4G(mNrCeIIOr;KQ8BY*s!?|V33Uk6K^m7u*J zcHlf_31+p$9lHX|P;R>a4k`P&G`B9mT?hV;y;!A(3)`3fzdW!B>^h3d^lc(_M(fgK zq($GAbb=8K%9I1&eBa;ae6P$=*uT#myYQxQ^s*bVI5#GYRv?FG#9ue#sER^`e3P;) zRJHGGs7PbL?y?A1;-bNars8TP%|IT35nm!dIEBT*bL-G(#XH);>dE$b^Co%o%8V}{ z6#+oPhwyWbT2N^+jq%326(0HGTW4m`M=&Ip8>-XeqpNjsqcmlEY0>X9qXug2ei+vl zuh*!&ecg34d&5?|`*XPKv65JBi^#1%t0$w^Y%|y*Nnm+CgUl5+Y@ClKJ7wYNMPj_WK9t_T@PLkA=Ti@^jd4xqO zfOy7+zzMXFNEW3{+e@I{8>(!2aHI2kHb`1+R{lCCw@G@4T~+uf*SyQ6?Y5)v@TmeV zWU8H)P5Fu375%*)XR{sf-e`er23($@i~A3F3ubr+KsE}i095kf<)Cax50>g_6c$hz z-Pafbq+uf{D`a6DbP2QpAsm?vCoWwZ3%{M|MOGf%<`=GW?)+O{^6&p8MZ;iterV8& z9Qxq92Of4?)W7eG3XVl0L@4Q0uDkiJw!+Om1{K~ZnBf*wuJ-(1_wDZvJ;Zvi!o5c8 zj(!#icEIKw8Nde085tP`J#~Lw<&`eu9!VKQ9hh zhu`Pf6+t{KtqIXVu>KF3$}rhD?n^{*wyqj!Q%xD?sL~^zZMHJ8Y06N>Qh^4~Pq`i> z@V60<`WLE#+gmbX?|J)>A=Pn&fn`?X3%2uF!+JK6nMCh@x~?PQf#H_6jK=)I#Wdd> zoPlE4(hgnI;^d#pC7$W93oLaS7Mv4w6i$Iey48xSRy?T?E|$F~thf24hyuQ!?$oIw#;3B*xR?s|eL<25xFxEE_cOiP?YuxRhP zr}<@`qZ|+q-=`hh2Z??OzlhfE9lc)qpqmNu+HKujO`_b55kl&Ia9hvl^90WROpBKL zerIJucN3iMrK&TolZ(T7Y;aI6&h(g$C+b6`RQb+%W#BIm$KsCPT=wEAECwH$mB88} zZ7d7c|8NXoGax^xun|n|MSW;qNm&C`M$yCFW;_TxCaf|_lOrSJIR{PS4i|+ndfzP} z*zzb-56DJWjB($rOx#=MzS(n&B=f7R>~?rRt1&lgV5Q766TsW1-ARv}trX#GLCFxU zF7|bk8sR+B&*g$%8y>FdoI5l0k3{RX$={`p#QP`{q=`-M9a%iAjsF$djGXwF^^Qid zj&* zbFluxR9e^&;rIf1EE>yP&opgY%D-XYaP!eDa+zuv`I|EPU>_h$a0#C(`T>Qr}NTyloZ`{-X`>hix*^FvaX!i<)0Yf6%^;o-|U$1w~ zT&@JzXNpT=VGj9e9bGVSJ*#b|BRWz_C?aGRuM+;?)5ij84f$>!)kJD@nZ!pp}@Z)!Hbz{AZOkJul=b^dvu@ z&CDr{*^=WR~XE0qZtMX%QPj5-{HBs)D(6-qxQ}eSRgx%a_(!rHTH1m`; zhYFd04;tHj9~|}KcJ zzx`!RcF6u}nd4(EqDL9X$8o;%=lGi_--DFLC_R-7wauF%!D-;_fs$@4@=s{C7X~gN z-5nV|xB7BA0Ne|o!YitVIA^N>7=y?T2MFpCFe`xuKPN%J1c)WPF;pM55sPc)L)CPW z#JYDl)xZ4MVAaW=wvg(sn>5-6ZMjm4D%3pg2_V~%8z*`V<>PGb7rfbye3M_diaJA5 zNG~r=AgOXfl3;I3_t$BFh;UW}&UDcDG53oPL>o5TI$)7XwO`bMUsHekV{Qmj7L!GO=J}{ zR3j$4NB${Af$jeJc=fgYc8lRC^Rl>!b76w)b{{dB7m7@9N~@T*-O0RTrsE8j+#HA$ z*#uw1+?ZGVZVK5}A^#B`GmZ`Os8LY&d{bcp(|gS0ROR%2O9lbtZ%kNpacLapZ~-$` zWk?d(CK)?3u$bAO<`|7A;o6i1W(VLfrb=;3OUyt~`~V=DEu4Q)q&;xE7xJ42|L?5- zUqAO)|AEeowj^pn3yf4?+EVf3!hsIj11ig3&oI5=Mv9b%e`l~{gaHD@YE&?A5oj)& zgI9qNC_6njh5uw>8p4C_yLR~2&Cla9muX^eZCJZe6#;oumod<_O6V3L=I;f?hGg1$r! zR)#E1R8GbYQL<>6pIf2&=boyK6_hP2OVUD=`Et*XIpMp?g;7gZO%vT=*^*OjT~(#3 zh6DztCy#b$Y>9@3l(ViH$2(v_px4o^dS1~~9Z_19uYxhVw{EaVRK-8L7f1vMDD~q8 zCb|njG=PMHayPx2g4$1oqy+^bar4>s@(Fh|J(|k0`*xh-dEO|&M-_K;XaOhjTNP6X z5~Uz6ab~DKc93DZRVe&b#GM8eUrURG+m^NrJLSEcktw?5eVn{6~%`_@7LwAAcs%<&h07YP}9Ct^V(G zdsjxt45+v=tfGzd7Ydme(5OOmVenwb+_v<;u=&q|OpI{??7%XdyZ`)<2Ar69UmS6+@rrtr3Lm!07G&(aiMVn|3w}!<%;|}l0^7kqZL3B zhKf)9yFK;F`w}JLTz0Lou@(k?k>dvZc+pAbfL*D3Nw!zvl>~Betd(9APbyc#iFR>y zUZ|heiiIk0c4*MB(6EBW|2Gpsewdc}D^;GeM5h?2O|ug`_14xZq|rVsH!>WmhF~2} z7^cD0$$W}e;7C|OL{xF77VIm|WLawTFypTBtdAgE-pCy5o}p?AU>&A8|2Tnd10%#A zEO{rdmY6C#lDNSsmbOrlQ$ba;k}Z0&+vOnzC^`~WxleESG%q5!eEd*+Xc4gzSJ)qc zK7ufJ2b9l#mb$vSS>-3WUJK7;m0?8#G1f6b@B#0vUBUM{W! zZAK5R(C`9exBsFB2vJAyx${9SQ^nlHjG&lz*yhLv#1Sb+?yO{T)hsZYBkr$tRJ(iB_%yE-*vtS>MJ%x>yQ{q95~F zktD>fm!J71O$cK*Cz*;1x2VI3m(KoWXz7}xse2u{lu``p!R2(>N`h_+j|Sc^!lnyR zumPov{f3@t9&Fltgg&^IC2NJ{bEa$RCe$Al`cY3yo9tinaG*`9vJ;?5=o?kDuaSpH zL5?C5Su4zG>x?$bWrGhUO}VhVjaKI@1!hYD+I^y;WN2TA64aZC`fL?`TM;-mRqLX@ z$`ap}UA0!Gsp3V&KbumuO>0%T`dzW_6kE$o7i*tFu+>=~f{p{l)+zJ(_rD^47*oM_U9ClrTQRr0GxK|G3;`HYsJK2{lsQl{XH( zKeYkcglJM!W=1XDe{LCBG;m9s2LVH7fC57+k0VfyRM#d%v{V4Z73V@$Dm0M-35!(Q zkkK(TBTA3zllcte#!=veP~~L<-2&2XN#*9c#;&d0UA2k>KC8WNDz0ZFAf#Amc?S?h zcH=azzE&mK(Y`-Iry}-A3KJY2*haUD(Y`&pvQvS7w1hTyQY^!D?AU52kDq9g1jP>u z-#FhS&^YxatKhUyT6zNA1&nS82LcNWwYQ&jS$q9}@_M2= zGm=xUm8gS~Y#R4p~kr7`~}c_~*| z*o9o^D;=8Qj~Shh>9O<8AHk34WOYz0=zxT@8^PRhp!I_RNsTiMB~|icR!F0dQ2Y!g zY*1t;8^ece%IwfFW^7$SH-kg(&2OgA-@s{YIkd5{D4fn4Ceg^UdpT7z7$X7K++K8H zO)4cvt#33MI0|Ki$%(m4aQp%`0=w$ zH=D+{Az;tm?`B>J-5usIRd)T$KEdahPnJ6@YwvlU)5>3FWM ztv)p9!~v{+Q6g)Bf|bWZyNJ`q6{EO27ZYka~Xi7OtK zO!X|lnS)FFoxMi={mpUHYACYF^R|c*hgEjY8-MM-=oEtKXF-n*E^eO<5sRc^#oWvD z?`~z9@S&|>#o5nI^`3kW8`#DCQ6U6}Yz|=s^AwgHB1qgX1w{j+87A$~1blz~i1U8L zMbx~s`Pxg#a)Q8sygZ0XM>X%=G_E2M8IHGPfKmRv@o=^d(e7JiEuUUbAw57E^CYBx z>WzpyxZ|R;od3F@lrq3rd)JOb1R3b@SoehmlGD7cvfc3Du$odp-bWOfvePb5GNHYO zh`H5rNGe>cZJB3WIAqAP=Z4$lELh%FC~ZrL)+w9Ayxobkg5J;J{Zu~<{mFvC6jH=G zsN_f)uO8Kx{)i4!$3-2Ktz4M4TGo|{D3zM_!b&Uv$VKrVU1hV4TGn@M&ViO4^({VD zKa6*G>Tf3kE$wHCt~}tpsJb;JmtGM(dQSFL`?k>0%RI>?m{Z3vJGtL|DBiDhEQUAbE)^DnLh%3GFQBvB1>;ryP|0 zzjHr+Pg7hS#VbKsN&fl0weH5rMh(P6L$ zf(&2MmM_`{K^&5s$gU)kc6+|`m`X0lEL&?%Z?Qi0#&+|F2JmAu8%jKAV|?Qlkv#D% zFSZ;$1gf7ryvnQ+b4}#(PF&V{!e!`4VE>_roq@e(r!BeGbG9w1klNwN+f`f4G1uBJ zrYM#EE54^H>doqD?M3@oEBT)l1W<{ak;W{NI>u&bxsyf1g9H)Np(J5!5-F($gRnBf z7k;pc4$b&GMc(E$v3!33oQ8?6rRhz*VyhtT|MzO4c#2o8;-0_VJ1MWU=P7*s4i!rQ z4ev3dsn>KVbFoLoGM9@NbnxWLZMPL|`HTXNp7+8cX^kIXxP|@NSEMPa<9@iHVq-4k zE~2^vfkT&4Wb5?YX7@eoe64!2+=oiHB)%qT2#)zk4-MSbdpHgod~INq`y;lAR*;T}?jIof$ju?RQK66^oTib_lb`B}a|g@+<_<9?ZSf7ZznMMW2Rk z%daVr{+h8+gm$QO3uwXc1lEbymlP^@cdLQNNJRGJ&!(UIhIK?T@US62x0}3*CULan zegM$hBnz2LRuOSxg9ao&4Z=pyI~D34r*;+U2!i$3F8l1JwS-aA!&6AzW_yQ~)G?^s z)on_4;6+G)lJk_g&1RFFD6BKCIp5glCG9QC<0(#7yE9G;rI2pU z6m01VHv6uB4XXw@vJpMf{gd2Fyn_pM8a1FdB3fO7q&WCY5X!qzN zod?bL+uuK3q4a-Sk(kTGQZOo=*_l?i_!Kez%Uh)kBoWuPq9;)c9LEq}L zag?ecq7z%F{a_rvl}L&1{!CuJyGn3-R&JUqLRM08rjT<`=?t|MbmGIgSck5zvM2M) zLpEV5dg~hR^jE1X1ya{(!{cYEVhOYhw$!U|o0pmNJ%bl2CoCQEUn`50I!=>uZBB66 zj$3vOy33sI?XP0}Ir_4sV<3lqna4N`k z|6_z~FQA}u{7&l)q9H1{NMjp0gSmyWrh$Kd)G9%pnQ^Ov6x0V21vu*)ZIkh+6$9(+ z9Eaa>s9D%2K^V{*0dX#ZmAN2x03j3j?GuYW zNZua)=J*xxkU81_CRevrjrF;HlNvfmTBU>`vsa|+m^$APiW>fC;2*0qe#G)oNo}7Q zVSwanX+=;z;KZvyCxQqJ7cG__ej~uYOEzTbcN-p8OT3<3HYY&AZ=F#Z)lVIqYf3-= z*FeyQH@^#sKQiQDRazdw6c7|gGW_2;$~fLkEv!;g)p|-#PQF-+D~)M`Y(%9=LUg}j zDruI`RP?w^TnUgK1G=2XfBST_Vc$rm@_3u@#=Tfq3uE^`m&-u%T zz0=jliKg@NP0gk%*>kINnzgm{GOn!t_N;O-`{PP3S)HmT$0aPuv?dD4MRR)Tx-68e z=X2KIL?QZkK~ns5Oo+g3v3`W0$nl*$U2=EH`3vPFK*-tCuXwTsTb*VT?m5rTUEJFf z2Hcmspi&JE&?H#=3!JG*$EePV014q+2z|~1#eGx$v+=?z#fp`};EeNIi;2}R+coY~ z#Wpp9`inlyvwfBkRgX_1{88>cdo>c)A)U#WgrxmyaVLtw6<65jlZ1U(BSl*!>FF3{ z0kVC3iGPK)^Wau}33XKiB_-8?pYr^Fd;CW|Wm}X0qdT~%+m^k{Bzi;T%SeH<&Os%o+mY@=9b!W z9C5WxKxawAgWQz|NF-{3AgDnlVJ~|~oHc0n;`6{Y2>dfkkG!12w<=&Wz{ap)4-m>W z7?g2qSYhO)$yw`Dm9xul`rgpX5_8T%_=*uZ=lV zyiDyD-A^!xL690>+cUPdGasJS#rqxGsv9L3@BM!5xxB3v+yRf;E@i=^!*-uCwveE% zZMUyE573DooxKIT_PY~ouN)rTeC>b7Aar{W9?%3CKMD_|)AV8N}vIW27)>)($jV|13@`>2T=|H3{`%2$W=V zarHTbWJG9^aHMo?BB6-*1n?3_f(96e3PrU;;iY(>S05bFu@E`V4s^u zhgeh!V&Kk9h2lCw{GwUzws9p=R3$t^>PH47L})}}74~r|ACm=vt7!EYz0REj4#a9V zvYT2xJ{6% zM0?^TVM86^ajv|bSWjppLz58hDp;VEna)zLA`R-}WkSO%8+0_FF}f#cFmD${24Tc- z4nEqMFMqhC)U`x6=jg`fLPHncoGBq69kvQ<&mEzuxWM9%3Lh~Rrnq_KgXg$gmH>WK zVr25qHGe1FWoGLFRsLT%#&A?k@FN*rDKea|uW_;D>=mYW&lWfWmN$rJ+7W98Bk7l+ zE`*rZ-OnC{mL=1kI=4dt6K>A$*g+4or|F(>l&T3qJ z7&odG5?O4%r*7LQ-6}{Uk+Ih6Z9bQWO=6Slscm-ml^C^iP3k3{M=McW&VeNzbnJqW zrBIWY5twYrck19~pjq1*J;WcB4~B*$&Iom0MUkv4FJE*>s%@6mD z8r1Zl+xnAy-T!2x$0>`9{faQS&E3ATxwj+o(H;fXD*6tb17oyXp_F1yB?w$5D=Ci_ z3X06xawh(^P_o7L_L)w=v&<>f;19Oy9tp=Ii3E5lC%|(P)T|JfI5=?2-OhH z0dgd#o62tabq5k9B!!=-U%BQ-Rn8n$-=kgAr_=;Q-=={p^`ov2bUZpW0yI-=TYOt! ztwcQu^tP6TRim0x9;YhgT+h{2wokQzLpa~aDCSE+7LFlOg2h8M5j3P{UIe~ zC(n+_q6xlFq}I!GQ>T2VvmVY$ggCj#!E99}t1xGq3NX#b^~s^~uOO&{mp~E7Vy@pl zYq*?Vrv8(qeRtOgjVkO<&-UI57J*bH!i3M0`lE{NPf<~h3Z9yUaT5)C+C3wA`sE`b zdLewbRga0V>SkhnPqb+G+Z67RGY(=cng6(h1qf;|wmfz>n&d5%ZiIwNQgNpu+FC|A z?jqDA3YSHV?hxr1AM;l!#Ogl?9HUw=!QNZZt+JwDrAh z9#6e})qZ^5xnH+5r?b_(k8@pWG|;$+OwU5$&{e9SkW(q8a_Ie zuDW7r+;;uyRVDBPF0FY&+htVh=g7dPtV}d|0TibcDcxxmB@?nw<@X(V{w}k3%fBty zuZExAc{|>pf{IGAFrtuKG&uL|Dpz~GOQ|v$rEWWVJhC!Bo=#4+_3ge28^WvRCnF>C zAsu0nLlWkd_Ci`+UCjeIfZ+Dc%;AImeanDWgk?5_2`NwIo)7+7I=wTlGFQgPFcbrBaQ!p8S|>Z01IRn6#-dySV&07 z4A31&Hs91V0U0{RT^tT{&?qH1q%!Ow&MZoNd}zC5hSmUA1nX)K*SuNd>%dM3umq8A z-Lvo06litvL)3ogZ^D1#sI%qD$>>Q^HjSyE;u%sDLku4M@ z6_9DEL^7TfTRhKgj=2PmmJT=eMsRv$6aUtt?D9c^cngW?6U9-Gqf0d9U=$SgF zXObZ*{=})G62Ls~FI7#{C}RI+X&Mgp_Xh%MRdkHYzv|J_z^LEohiACstDS$E?|BRA zgR+z0Ej6>D`f#f2_s~J${e&l(WjAb-b6tgLV$}iXIIC8WEIuz1cxjNJ^!Pbykr>l~ zi6Og#Os=lHZ!l;7`XJ>8~agMHeP#Qhm2V@m6-^JpT8=lsybbxs4h=cUr$S0!6e zZf0Unp)s;x_78u)Sf)enm1$qdxr>)qa2}JY?eA#CKoel9C1LIcm!#MS+=k~97C43! zb;cPamDD?x>S+%u|JxnvOZX9Mbnkb2J5m=9i@`_K9(`B$5Y5OQ&QsU2sJ**=N91Dh zR!WxNVUL5}6|`qV?e+9U4{Lq?RLUh^e{Wxm%y?fr$I#BOSW&5XW!QGrdItOO-6?&+ zie=+zx~XvKr(QIk3PX{N8Y_<-~~d+C?Bdr@-HwKuEc_ z?E4_xO!wg_Zrc+>ehvgtd^kJ$%j&hW&L-*-3K+^R;K=2&gHPfm51AYPqS?I6sFUMw z(g|nbyIaf#WAHkoJBUny!#A!;9dS0jR+R7dy4BLuhqyuJdF;~~bxv|8r%}o5mTDzdRd$7!d>w;3wjkV&R$3o;yT+er+UVP)1`isDqsJTeI;`t>Lr9U z7n|Fo$-o70TsgEm0~Z<1#`Qk^0J(50l>621sX7geI3H`lV>;FhB1z+KO;8nyD=dfD zvgEX9^`A`#hbNzVX%HbpQSP|k+k#A3dXbH&E~+tL?FO9YW^mempEnD%mFHf#V4%P4 z+Ng~(dI(BatNGL#Np*v3`r30+U)j(fnl<$?V_W};`#3o)m&4kgGy2SXP0`lp?-?D~ zGJNX}W!kLgHfUUZOs=QsC#Yh3S*S5MV1k2fix0lp~>Tk{e;!@k12}yekMM? z16~y;j-7vrR#nuF1IUq90mxjW5STK9&E4ONy(Z%|k4>aLDK^L6=fbaQwlYYmM@IrJ zIj04w9IpxPm(Jr-7eC;zoZ)e4;A`FB)#_VAwIavi=SKm*-&r~@0vX6t2#VR~Y!54R z`dC#^#hbUK8}#H~!D^l~9$noZWxtdGXyRb}fRt7qgfA5>$FE7PakA@(8`raN)M$FG z^$}3!I_K15FM2J=>G+D$1u9ax9`b5*D**#+7>VH8hW#{CXZyPtVqKn7Y%(46xmeJ< zyii|Fn}OLj$BhKg(i}YAFON7k&^Zr7)EZ{DxJUXwrTt!xCReSe@cU$y-3d~Hu3pG= zLYud+_lJF?sA(uCw*V~)^4M-AkI5c2VJN0gI-U{91nubvm$aT!pSK2DR(Re~g6xbN zRaS&WhJmx-N@kNg$)`L(?EJfJ*k1VdFa5A2l!FCdbM;r?(_{VL{XOhzbhedR6NuD< z(Q9nA1#MFKI|Y*Zd>^Y;2Xl*JhOIe?99bHsX zTpZ#>);WtYE19A9kHhb^2NoHZeCrNh(ZPY_?cF=_cY|IT+C>Kv-Fp^&KiOr%sEM;S zyND8ihQeq%?&xu$K0l)&9T7MI0EUGt1D=&(S1)zSy^|8(Ve+RdPsC4qul8^YS8pCn z}~$JQ*)$?$gmB zjyBx9+>I==s#4m$w&d;yi6UGvsm?H1ecYq|@@IvPQ$p#}6U)fYIn^T)B^AZ9FIC+d zfMWuc|F5ujjIQMQ+CWb-aVFNpwmmT>w#|uc+nCt4ZQIVoJV_?D&3k_T_kOz{?pocw zx_edCuHIF<_tVuI-~wAFO?v_!Ng`PXcC>MAFJ)SRi8KG^fJtO>+zoC!6z8~kB{kKx z8>+fySsTFaAZ;}K(Hv<;!wibUY-`CfT7#d*m4W``d#<8p+v%0tfr5G*rCsX1 zwHNtTshZ77^B@1F;!&zIU2xA*ROsjrw`1ki$X^cfd}NwoKo)d3>h?})FB=cY9Obo* z#>q^R!bN*E2%D0nbhl5%X4^3Rws6~>pIQ_VsU8NF-_MJJ%435gU#On{pzRw3HNT2#6&0p9g1div7PvY8J#zV(}}u8LdHYd#2DM%GuTql4fP z<==E3kJ1=t20*7k3GSud@ozA(W;(iVga?VvA{3EY(2gr z4RGks%3UPhF!K-PW%RbRiVBJ14m$0cBF617BD;N8hY=A8WCpbo}M?R7Sw$kz$5 zeS-goc~GduPbz(fr}z=hdbXAMVc@ar+Ph5rSA`+@yGW9o%^2E@7#;nfkG8_R6>+kf?npt*lwmn0PGz zgV^U~_zOcq@BXS$R|wk@hvw@v{176a`{cK?r`WCX6>!^v7$D z#BHTiuP7FuDlWK*H%`U%$Z85izO~!WdlxyBN+#BS@uidCcN`GHR);Uf1VDrEnScXA zg8F%(Nl!Bc;m;=l@T*OnTvgGxio)?U4kKl=i;1^A!eveU$MFsFhx;H1$D4j{XMcg` zySbw%Mz86c0fHE8^F`yUx?VI1=^@NxO}{W3Y^6y%rsLuv%wMM*Ux;`86oMVzMsA;~_zIUrS| zCQ7uO(r+uq<0CtwZtmYP%X@(zFd%CkQ) z=g+Mj_bCEjyx6>;i6r{JZhpQQQ|<4Bw#jZ@`3GG9S9Xzo$ua1FO%#YvakoUGU0SH1 za^ebxIP{}~c1>LvW=l1Joalo%O|xp4P>vRc`tzhlG#=Exyxu$N3_4$r4VUrjOI?a> zNk2#X4iua{s}e5fX7vt1F+mpZ*4UR66 z3oI>aM8gcCc`ZY#89!-UM0u;4W|MI5+p=e}9Ru}+=bo!}^XG{19c#^ig$Fn_4crE+ zQnG=8v$`Ttaa_6WA;iGBIn7H1N3wBTe(RYPu~f3}W*2pqYhZYyi|e;I+}vKU@at*A z&hb{wWZJ7e8-b7XnzF(yXgSvzQ~_GwO}S2wFSXpX8-vi>U*{ct=pAX&MoeiP^l^d4 zt%g8xf(Y7Tb49~GINinknMZ2mIpeJh!VZ++gl6qXWS5;Iu@m|3BrqUb`rFQa{Gh-| z!IiVk>v}DZ$HQ%ZNO$J1)=ttC@o&a6(Q7ytq3x76WG&10F(PP*2!`b7^b$9ljV|Q} zoDx>wqet!5nOB;A#d`FtF}mFwSJlg#jGvW@bHTz_$`WBmBi9$i$O@GPKhFD;NX^S< zuqmcr%ky*pg@GhT_?FU%ejxMg(M&tmm#ctp(O?^OTLv_6|e3`glTHA{6vuy z3e)V=c&_MD5P~4M;ct20B$mC~rcYXLK0NjfXLgPg!yWW%hJ!j2abQmgx0nDFX0a}? z&U;}Z;v1&>(Y_~-t4-xr_bk%Wu0q0rUg`Np(>eQ7*#`GvATJ8zmQ6>rs6db$g^cc< z{w3R)>EdirXU<-7+^?VwY+E0_`+1Z7v_WT#amJ8{@sC)A2%`C|KX~D{k^Kgz1%eIl zW>!ChbBPwFIq{u|wIS3bp2bK56|kKs_J@YRXn#pjtzFQYHIZlB3*2f6ek(Yq-BW=n z7~B-(=n4y?Um{{lk>sQzW@TI@0b>UyQsouT&%cZcmguKoWWqI)CDyHnX+)F+Ly*&- zQPawYV#GzsqWtXS%WqU@k1UM@ zrxu3tc5*583L%k{@Aiw4whjS@ZC{IU{Kbar@kdoL6D|Sqo*brH6(yl0KhoP2VNI#V zNFiIB<-P)$z5oCpMf%J{`Q{!1JpKE#erXI=!=UxUqu@F1Lcr`;EqAaGig9hP!FM8D z|5qd^KBU||LkdNN3qJQ6?fSRe!gl+|*tkL$^? z;IXzhLs6Ic(O`3xRSxw4qe-ATZNz}-3wsEQ@zS(Ihg_9BFuz@_mEjZ!bs6=K*#X<_ z@z+E?%W3!nn-q``!M4L8nY%HvIbLY|MWQ$kK|{C;I{Ej zWsyhT5+L-Mp<%rsH1clU2wHAs%sF~*xg?%VO*p}OJp0P)WJS5u&yyou5#6>FueF>` zIu)T&AyvbRlneJAj|B)8!UzWg(i$i$L#q*es8PoHLR>+%8vzj68;+AMt7C~LWa()8 zFHEeO?_LzJq;ZU!MOYBSdU&>%c%xyN)_?wu!x_(m@jw$|R#d>MA;K?jjgeLQ=lr4o$w|>9R>1Tq+)*bSus_@<4B1^h zwn*KymqE40660!_i<$uX+{WS}Cu>pFUzXJ=w0@6J=DEaB-khff`W7B;8CDhtA`j=pg;^@XtDu+64iIEFH^NfF!r5ykVs^ zd(;_Ej)J2I`R`yCGk8PbB>r~?%aQDf~i z?ge<|8$>OTa@{tDN;G@0eU3(iwbF;t!x4PVd$IaA4uJY&vc;n@;5U-jDKHybf|!TV zcPs_5KBrYtiQq;(MPdY*H?+nCdFU4#w$qa{Xf8;isU0EHHX=3@D%*Q#^*`p82sfo4 zj(#dwCYRe&WSW`c8;gR&798P%hZ?+;o{SEk5zYPyD-IbK$8QyJ+|Hb4pon^6nnuvC zDJP0E?%B39GH&2(4Sg&xk_BU#28u-}FtfG1>O(HXKJ?j8hWB8qqnTo=?p);A@nW^# zE}H8QTyM9dejDCI1D8tI@J~h!DmP?Q)7#`f!-ObETuV!bH(kT6NU!l5D4||1M8Hhx z&1Y5=O!M6Apw9Tci9AujF9Dg)ee)ZR5TfpS`=Db&EOUSh-RWh`;n*q&ynowY-e`em5Suq0%y#yBYdy`m?KU(I^2ND4FJyT$`)o$K*C)BIGNG1nqQ@~PG;^Yj+y)5@W zs{X@$ZsV1zmCX&)Yj7eb1?vwx|JkjeuvBI~ZkLkB!O(9=m8REq9xnYDI%Ku=l7_k< z-(%Ln(z2cn(z@d<_U|5-eL_K{;qVN+;)6oeNFj4QlFpbhT>kw47rKO)MM>zdu-}$g zh`Ib&kUjME?aq4uI*D9$Dh4E~gLJd|#8!h}|A8pdI51R7e30LlR#<_-NjIwqsyT0? zv%-9la9ZXj+IJHH3`ywHIS=iETjZYU&j75F7QoA zi@A#g&j(!U1SeDvy{|BA=qvMwOf)=M@>?kaG30LCuAhiZc3vKObu)Cx7+pRtxq(n< zkuU^XQN2xeM$_D?pp{y{z4i=0=DBln!Mze>2udHi{E@Gw<*kGiZ0V~vUg_|R_s@s-;T5k}4aJ9h78^)B7<8=i& zzQG2N#f8xAQ{0&*SV@F8DF~sx_?pEWjd)#Ib8h(onrxy8c4Qf8qfHrNhdd2A8LuHL+3y$eY+?DCXig~}wOGA%2xWkX3ebYA z=)fS_S$eU4R$}49&Jty;8X~RlHAR-sr4;^=2LN)@ zX$}RoHtby0gBLRFocN1cm1BYlV+rN|%_;D<^|of_sZ_S#=krzpYkN*sVW znTQmwVQP=7(w~OfrH+MN0ZK0>0brs`qPg|mCJ-%{r82NEKnpWe<~n{Qb!NkU5sl~H z#1(hNiJ&K*QGlzc2}7bxY&26Me*NzW0f%C89vq$oJYBr~f8xd0LJkOA*oF zX6dDuEs8vGU!E4{-=5LQBN)97BX`IE}%!Wuah<5+IAAN9~%Mr=uo^acu<#}hiNF8k*c$S?$JtOsgUmk>x zBVwlr5s`L%SK|9k{-XGNgUO&@6etLWOa*{wNH<*+cDjMjru#&ro>Irhx~jIm(tI}x zuTv`*V+_gkFs8VD@=lr|_u>(N?pH*8FZl)dEAo5ZSnf{42Q$g>86AcU zj1(7>lJ=nf-#&bcAl}x{Ay8c=vtzdn!^ba*_jKQth5;2YWz`epK^(q z3_$iTTzKgfgqtpL0nhcOdUvRlYqeMaQK!dO?XR*MCn5f99Vs6cqX+orQ-7RB}O_Y=96CKDz+8*8BY*Gw^v zW!2WjNHJTKN)5p~1`n?$97q!AThwm1&NmJF=_TJ#j8q$(xWZD8xYPmZ1DoMG`4a(Y`O1)uF ze)~}2>wZmfcywgF+mMejFiTZEWZLcYufwe@u_p&R^ByDLRf343rz6}KiJ^YzyWJ+YojOIURa$b|kyka_?eQ(upJ zKEIJK-HM&sMx*lfoHTpw8&z{bw}szKFIqvvQ|?1M?#O7Z#p0Hbxq+pAqY5>4H_PC7 zbzpwRcD6FF_3DYi_&eF_3atA=9BM!OVM6s7pEFSqu2z-|ynO6stNm^&{I_m=0!N!)%5m>i9t^h*00>&qhzCa!C7|xN9!XP%@5*^op#UN{E;5l))EXh_Aff_wDoB7AphW z<oO|zRhZ6`bB8v!m-d=Na z#!=fxf-@42idRCH+4VNRvIJIr+pTw@QbX}S$+uDX3#r~$!&$D%Dgw|Z7Gt+auT1GN zSFGM>5artU+LXU$KNH>;0Ny%F%0A`ru|u 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 IVS~W`2kuW#EC2ui diff --git a/lib/Path/IsDev.pm b/lib/Path/IsDev.pm index f948060..d20ebbc 100644 --- a/lib/Path/IsDev.pm +++ b/lib/Path/IsDev.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::VERSION = '0.3.3'; + $Path::IsDev::VERSION = '0.4.0'; } # ABSTRACT: Determine if a given Path resembles a development source tree @@ -14,6 +14,7 @@ BEGIN { + use Sub::Exporter -setup => { exports => [ is_dev => \&_build_is_dev, ], }; our $ENV_KEY_DEBUG = 'PATH_ISDEV_DEBUG'; @@ -57,7 +58,7 @@ Path::IsDev - Determine if a given Path resembles a development source tree =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 SYNOPSIS @@ -108,6 +109,195 @@ it using That is, no C specification is applicable, so you'll only get the "default". +=head1 UNDERSTANDING AND DEBUGGING THIS MODULE + +Understanding how this module works, is critical to understand where you can use it, and the consequences of using it. + +This module operates on a very simplistic level, and its easy for false-positives to occur. + +There are two types of Heuristics, Postive/Confirming Heuristics, and Negative/Disconfirming Heuristics. + +Positive Heuristics and Negative Heuristics are based solely on the presence of specific marker files in a directory, or special marker directories. + +For instance, the files C, C, and C are all B markers, because their presence +often indicates a "root" of a development tree. + +And for instance, the directories C, C and C<.git/> are also B markers, because these structures +are common in C development trees, and uncommon in install trees. + +However, these markers sometimes go wrong, for instance, consider you have a C or C install in C<$HOME> + + $HOME/ + $HOME/lib/ + $HOME/perl5/perls/perl-5.19.3/lib/site_perl/ + +Etc. + +Under normal circumstances, neither C<$HOME> nor those 3 paths are considered C. + +However, all it takes to cause a false positive, is for somebody to install a C or C directory, or a marker file in one of the +above directories for C to return true. + +This may not be a problem, at least, until you use C which combines C with recursive up-level traversal. + + $HOME/ + $HOME/lib/ + $HOME/perl5/perls/perl-5.19.3/lib/site_perl/ + + find_dev('$HOME/perl5/perls/perl-5.19.3/lib/site_perl/') # returns false, because it is not inside a dev directory + + mkdir $HOME/t + + find_dev('$HOME/perl5/perls/perl-5.19.3/lib/site_perl/') # returns $HOME, because $HOME/t exists. + +And it is this kind of problem that usually catches people off guard. + + PATH_ISDEV_DEBUG=1 perl -Ilib -MPath::FindDev=find_dev -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" + + [Path::IsDev=0] { + [Path::IsDev=0] set => Basic + [Path::IsDev=0] set_prefix => Path::IsDev::HeuristicSet + [Path::IsDev=0] set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] loaded_set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] } + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent + [Path::IsDev=0] /home/kent/META.yml exists for Path::IsDev::Heuristic::META + [Path::IsDev=0] ::META matched path /home/kent + /home/kent + +Whoops!. + + [Path::IsDev=0] /home/kent/META.yml exists for Path::IsDev::Heuristic::META + +No wonder! + + rm /home/kent/META.yml + + PATH_ISDEV_DEBUG=1 perl -Ilib -MPath::FindDev=find_dev -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" + [Path::IsDev=0] { + [Path::IsDev=0] set => Basic + [Path::IsDev=0] set_prefix => Path::IsDev::HeuristicSet + [Path::IsDev=0] set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] loaded_set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] } + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent + [Path::IsDev=0] /home/kent/t exists for::TestDir + [Path::IsDev=0] ::TestDir matched path /home/kent + +Double whoops! + + [Path::IsDev=0] /home/kent/t exists for::TestDir + +And you could keep doing that until you rule out all the bad heuristics in your tree. + +Or, you could use a negative heuristic. + + touch /home/kent/.path_isdev_ignore + + PATH_ISDEV_DEBUG=1 perl -Ilib -MPath::FindDev=find_dev -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" + [Path::IsDev=0] { + [Path::IsDev=0] set => Basic + [Path::IsDev=0] set_prefix => Path::IsDev::HeuristicSet + [Path::IsDev=0] set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] loaded_set_module => Path::IsDev::HeuristicSet::Basic + [Path::IsDev=0] } + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3/lib + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls/perl-5.19.3 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew/perls + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5/perlbrew + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent/perl5 + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home/kent + [Path::IsDev=0] /home/kent/.path_isdev_ignore exists for Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile + [Path::IsDev=0] Negative ::IsDev::IgnoreFile excludes path /home/kent + [Path::IsDev=0] no match found + [Path::IsDev=0] Matching /home + [Path::IsDev=0] no match found + +Success! + + [Path::IsDev=0] Matching /home/kent + [Path::IsDev=0] /home/kent/.path_isdev_ignore exists for Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile + [Path::IsDev=0] Negative ::IsDev::IgnoreFile excludes path /home/kent + +=head1 HEURISTICS + +=head2 Negative Heuristics bundled with this distribution + +Just remember, a B Heuristic B + +=over 4 + +=item * L<< C|Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile >> - C<.path_isdev_ignore> + +=back + +=head2 Positive Heuristics bundled with this distribution + +=over 4 + +=item * L<< C|Path::IsDev::Heuristic::Changelog >> - Files matching C, C, and similar, case insensitive, extensions optional. + +=item * L<< C|Path::IsDev::Heuristic::DevDirMarker >> - explicit C<.devdir> file to indicate a project root. + +=item * L<< C|Path::IsDev::Heuristic::META >> - C/C + +=item * L<< C|Path::IsDev::Heuristic::MYMETA >> - C/C + +=item * L<< C|Path::IsDev::Heuristic::Makefile >> - Any C format documented supported by GNU Make + +=item * L<< C|Path::IsDev::Heuristic::TestDir >> - A directory called either C or C + +=item * L<< C|Path::IsDev::Heuristic::Tool::DZil >> - A C file + +=item * L<< C|Path::IsDev::Heuristic::Tool::MakeMaker >> - A C file + +=item * L<< C|Path::IsDev::Heuristic::Tool::ModuleBuild >> - A C file + +=item * L<< C|Path::IsDev::Heuristic::VCS::Git >> - A C<.git> directory + +=back + +=head1 HEURISTIC SETS + +=head2 Heuristic Sets Bundled with this distribution + +=over 4 + +=item * L<< C|Path::IsDev::HeuristicSet::Basic >> - The basic heuristic set that contains most, if not all heuristics. + +=back + =head1 ADVANCED USAGE =head2 Custom Sets diff --git a/lib/Path/IsDev/Heuristic.pm b/lib/Path/IsDev/Heuristic.pm index 36799f7..5a3fafd 100644 --- a/lib/Path/IsDev/Heuristic.pm +++ b/lib/Path/IsDev/Heuristic.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::VERSION = '0.4.0'; } # ABSTRACT: Heuristic Base class @@ -15,6 +15,7 @@ BEGIN { sub _path { require Path::Tiny; goto &Path::Tiny::path } sub _croak { require Carp; goto &Carp::croak } sub _blessed { require Scalar::Util; goto &Scalar::Util::blessed } +sub _debug { require Path::IsDev; goto &Path::IsDev::debug } sub name { @@ -32,6 +33,7 @@ sub _file_matches { my $stat = $root->child($file); next unless -e $stat; next unless -f $stat; + _debug("$stat exists for $self"); return 1; } return; @@ -45,6 +47,7 @@ sub _dir_matches { my $stat = $root->child($file); next unless -e $stat; next unless -d $stat; + _debug( "$stat exists for" . $self->name ); return 1; } return; @@ -79,7 +82,7 @@ Path::IsDev::Heuristic - Heuristic Base class =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 METHODS diff --git a/lib/Path/IsDev/Heuristic/Changelog.pm b/lib/Path/IsDev/Heuristic/Changelog.pm index d54fcac..ee00ac1 100644 --- a/lib/Path/IsDev/Heuristic/Changelog.pm +++ b/lib/Path/IsDev/Heuristic/Changelog.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::Changelog::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::Changelog::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::Changelog::VERSION = '0.4.0'; } # ABSTRACT: Determine if a path contains a C (or similar) @@ -40,7 +40,7 @@ Path::IsDev::Heuristic::Changelog - Determine if a path contains a C =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 DESCRIPTION diff --git a/lib/Path/IsDev/Heuristic/DevDirMarker.pm b/lib/Path/IsDev/Heuristic/DevDirMarker.pm index 34683f2..8f86f96 100644 --- a/lib/Path/IsDev/Heuristic/DevDirMarker.pm +++ b/lib/Path/IsDev/Heuristic/DevDirMarker.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::DevDirMarker::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::DevDirMarker::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::DevDirMarker::VERSION = '0.4.0'; } # ABSTRACT: Determine if a path contains a C<.devdir> file @@ -32,7 +32,7 @@ Path::IsDev::Heuristic::DevDirMarker - Determine if a path contains a C<.devdir> =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 DESCRIPTION diff --git a/lib/Path/IsDev/Heuristic/META.pm b/lib/Path/IsDev/Heuristic/META.pm index a687cfe..1419986 100644 --- a/lib/Path/IsDev/Heuristic/META.pm +++ b/lib/Path/IsDev/Heuristic/META.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::META::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::META::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::META::VERSION = '0.4.0'; } @@ -31,7 +31,7 @@ Path::IsDev::Heuristic::META - Determine if a path contains META.(json|yml) =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 METHODS diff --git a/lib/Path/IsDev/Heuristic/MYMETA.pm b/lib/Path/IsDev/Heuristic/MYMETA.pm index a9236d9..3c2e428 100644 --- a/lib/Path/IsDev/Heuristic/MYMETA.pm +++ b/lib/Path/IsDev/Heuristic/MYMETA.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::MYMETA::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::MYMETA::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::MYMETA::VERSION = '0.4.0'; } # ABSTRACT: Determine if a path contains MYMETA.(json|yml) @@ -32,7 +32,7 @@ Path::IsDev::Heuristic::MYMETA - Determine if a path contains MYMETA.(json|yml) =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 DESCRIPTION diff --git a/lib/Path/IsDev/Heuristic/Makefile.pm b/lib/Path/IsDev/Heuristic/Makefile.pm index 32feed8..6305d50 100644 --- a/lib/Path/IsDev/Heuristic/Makefile.pm +++ b/lib/Path/IsDev/Heuristic/Makefile.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::Makefile::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::Makefile::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::Makefile::VERSION = '0.4.0'; } @@ -31,7 +31,7 @@ Path::IsDev::Heuristic::Makefile - Determine if a path contains a C =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 METHODS diff --git a/lib/Path/IsDev/Heuristic/TestDir.pm b/lib/Path/IsDev/Heuristic/TestDir.pm index c64c2bf..54656a2 100644 --- a/lib/Path/IsDev/Heuristic/TestDir.pm +++ b/lib/Path/IsDev/Heuristic/TestDir.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::TestDir::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::TestDir::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::TestDir::VERSION = '0.4.0'; } # ABSTRACT: Determine if a path contains a t/ or xt/ directory @@ -31,7 +31,7 @@ Path::IsDev::Heuristic::TestDir - Determine if a path contains a t/ or xt/ direc =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 METHODS diff --git a/lib/Path/IsDev/Heuristic/Tool/Dzil.pm b/lib/Path/IsDev/Heuristic/Tool/Dzil.pm index 073b8a9..8ab1378 100644 --- a/lib/Path/IsDev/Heuristic/Tool/Dzil.pm +++ b/lib/Path/IsDev/Heuristic/Tool/Dzil.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::Tool::Dzil::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::Tool::Dzil::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::Tool::Dzil::VERSION = '0.4.0'; } @@ -31,7 +31,7 @@ Path::IsDev::Heuristic::Tool::Dzil - Determine if a path is a Dist::Zilla Source =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 METHODS diff --git a/lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm b/lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm index bff12ba..7ced9c8 100644 --- a/lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm +++ b/lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::Tool::MakeMaker::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::Tool::MakeMaker::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::Tool::MakeMaker::VERSION = '0.4.0'; } @@ -31,7 +31,7 @@ Path::IsDev::Heuristic::Tool::MakeMaker - Determine if a path is an C Tool =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 METHODS diff --git a/lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm b/lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm index c3b5397..07e3487 100644 --- a/lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm +++ b/lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::Tool::ModuleBuild::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::Tool::ModuleBuild::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::Tool::ModuleBuild::VERSION = '0.4.0'; } @@ -31,7 +31,7 @@ Path::IsDev::Heuristic::Tool::ModuleBuild - Determine if a path is a Module::Bui =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 METHODS diff --git a/lib/Path/IsDev/Heuristic/VCS/Git.pm b/lib/Path/IsDev/Heuristic/VCS/Git.pm index f0be8e8..2dcd6e2 100644 --- a/lib/Path/IsDev/Heuristic/VCS/Git.pm +++ b/lib/Path/IsDev/Heuristic/VCS/Git.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Heuristic::VCS::Git::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Heuristic::VCS::Git::VERSION = '0.3.3'; + $Path::IsDev::Heuristic::VCS::Git::VERSION = '0.4.0'; } @@ -15,7 +15,7 @@ BEGIN { use parent 'Path::IsDev::Heuristic'; -sub dirs { return qw( .git ) } +sub dirs { return qw( .git ) } 1; @@ -31,7 +31,7 @@ Path::IsDev::Heuristic::VCS::Git - Determine if a path contains a C<.git> reposi =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 METHODS diff --git a/lib/Path/IsDev/HeuristicSet.pm b/lib/Path/IsDev/HeuristicSet.pm index 05a49e2..99a2b26 100644 --- a/lib/Path/IsDev/HeuristicSet.pm +++ b/lib/Path/IsDev/HeuristicSet.pm @@ -7,12 +7,13 @@ BEGIN { $Path::IsDev::HeuristicSet::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::HeuristicSet::VERSION = '0.3.3'; + $Path::IsDev::HeuristicSet::VERSION = '0.4.0'; } # ABSTRACT: Base class for sets of heuristics + sub _croak { require Carp; goto &Carp::croak } sub _use_module { require Module::Runtime; goto &Module::Runtime::use_module } sub _debug { require Path::IsDev; goto &Path::IsDev::debug } @@ -23,6 +24,11 @@ sub _expand_heuristic { return _com_mn( 'Path::IsDev::Heuristic', $hn ); } +sub _expand_negative_heuristic { + my ( $self, $hn ) = @_; + return _com_mn( 'Path::IsDev::NegativeHeuristic', $hn ); +} + sub _load_module { my ( $self, $module ) = @_; return _use_module($module); @@ -35,6 +41,11 @@ sub modules { return _croak("set $self failed to declare one of: modules, heuristics"); } my @out; + if ( $self->can('negative_heuristics') ) { + for my $heur ( $self->negative_heuristics ) { + push @out, $self->_expand_negative_heuristic($heur); + } + } for my $heur ( $self->heuristics ) { push @out, $self->_expand_heuristic($heur); } @@ -44,8 +55,15 @@ sub modules { sub matches { my ( $self, $path ) = @_; - for my $module ( $self->modules ) { +TESTS: for my $module ( $self->modules ) { $self->_load_module($module); + if ( $module->can('excludes') ) { + if ( $module->excludes($path) ) { + _debug( $module->name . q[ excludes path ] . $path ); + return; + } + next TESTS; + } next unless $module->matches($path); my $name = $module->name; _debug( $name . q[ matched path ] . $path ); @@ -68,7 +86,31 @@ Path::IsDev::HeuristicSet - Base class for sets of heuristics =head1 VERSION -version 0.3.3 +version 0.4.0 + +=head1 SYNOPSIS + + package Path::IsDev::HeuristicSet::Author::KENTNL; + + use parent 'Path::IsDev::HeuristicSet'; + + sub heuristics { + return 'META', 'VSC::Git' + } + + sub negative_heuristics { + return 'IsDev::IgnoreFile' + } + +Or alternatively: + + sub modules { + return ( 'Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile', 'Path::IsDev::Heuristic::META', 'Path::IsDev::Heuristic::VCS::Git', ) + } + +And the real work is done by: + + Path::IsDev::HeuristicSet::Author::KENTNL->matches($path); =head1 METHODS diff --git a/lib/Path/IsDev/HeuristicSet/Basic.pm b/lib/Path/IsDev/HeuristicSet/Basic.pm index da0ef3b..d5277fd 100644 --- a/lib/Path/IsDev/HeuristicSet/Basic.pm +++ b/lib/Path/IsDev/HeuristicSet/Basic.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::HeuristicSet::Basic::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::HeuristicSet::Basic::VERSION = '0.3.3'; + $Path::IsDev::HeuristicSet::Basic::VERSION = '0.4.0'; } # ABSTRACT: Basic C set of Heuristics @@ -15,6 +15,11 @@ BEGIN { use parent 'Path::IsDev::HeuristicSet'; +sub negative_heuristics { + return qw( IsDev::IgnoreFile ); +} + + sub heuristics { return qw( Tool::Dzil Tool::MakeMaker Tool::ModuleBuild @@ -37,10 +42,20 @@ Path::IsDev::HeuristicSet::Basic - Basic C set of Heuristics =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 METHODS +=head2 C + +Excluding heuristics in this set are + +=over 4 + +=item 1. L<< C|Path::IsDev::NegativeHeuristic::IgnoreFile >> + +=back + =head2 C Heuristics included in this set: diff --git a/lib/Path/IsDev/NegativeHeuristic.pm b/lib/Path/IsDev/NegativeHeuristic.pm new file mode 100644 index 0000000..654b100 --- /dev/null +++ b/lib/Path/IsDev/NegativeHeuristic.pm @@ -0,0 +1,144 @@ +use strict; +use warnings; + +package Path::IsDev::NegativeHeuristic; +BEGIN { + $Path::IsDev::NegativeHeuristic::AUTHORITY = 'cpan:KENTNL'; +} +{ + $Path::IsDev::NegativeHeuristic::VERSION = '0.4.0'; +} + +# ABSTRACT: Anti-Heuristic Base class + + +sub _path { require Path::Tiny; goto &Path::Tiny::path } +sub _croak { require Carp; goto &Carp::croak } +sub _blessed { require Scalar::Util; goto &Scalar::Util::blessed } +sub _debug { require Path::IsDev; goto &Path::IsDev::debug } + + +sub name { + my $name = shift; + $name = _blessed($name) if _blessed($name); + $name =~ s/\APath::IsDev::NegativeHeuristic:/Negative :/msx; + return $name; +} + + +sub _file_excludes { + my ( $self, $path ) = @_; + my $root = _path($path); + for my $file ( $self->files ) { + my $stat = $root->child($file); + next unless -e $stat; + next unless -f $stat; + _debug("$stat exists for $self"); + return 1; + } + return; +} + + +sub _dir_excludes { + my ( $self, $path ) = @_; + my $root = _path($path); + for my $file ( $self->dirs ) { + my $stat = $root->child($file); + next unless -e $stat; + next unless -d $stat; + _debug( "$stat exists for" . $self->name ); + return 1; + } + return; +} + + +sub excludes { + my ( $self, $path ) = @_; + if ( not $self->can('files') and not $self->can('dirs') ) { + return _croak("Heuristic $self did not implement one of : matches, files, dirs"); + } + if ( $self->can('files') ) { + return 1 if $self->_file_excludes($path); + } + if ( $self->can('dirs') ) { + return 1 if $self->_dir_excludes($path); + } + return; +} + +1; + +__END__ + +=pod + +=encoding utf-8 + +=head1 NAME + +Path::IsDev::NegativeHeuristic - Anti-Heuristic Base class + +=head1 VERSION + +version 0.4.0 + +=head1 METHODS + +=head2 C + +Returns the name to use in debugging. + +By default, this is derived from the classes name +with the C prefix removed: + + Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile->name() # → Negative ::IsDev::IgnoreFile + +=head2 C + +Determines if the current negative heuristic excludes a given path + + my $result = $heuristic->excludes( $path ); + +The default implementation takes values from C<< ->files >> and C<< ->dirs >> +and returns true as soon as any match satisfies. + +=head1 PRIVATE METHODS + +=head2 C<_file_excludess> + +Glue layer between C<< ->excludes >> and C<< ->files >> + + # iterate $heuristic->files looking for a match + $heurisitic->_file_excludes($path); + +=head2 C<_dir_excludes> + +Glue layer between C<< ->excludes >> and C<< ->dirs >> + + # iterate $heuristic->dirs looking for a match + $heurisitic->_dir_excludes($path); + +=begin MetaPOD::JSON v1.1.0 + +{ + "namespace":"Path::IsDev::NegativeHeuristic", + "interface":"single_class" +} + + +=end MetaPOD::JSON + +=head1 AUTHOR + +Kent Fredric + +=head1 COPYRIGHT AND LICENSE + +This software is copyright (c) 2013 by Kent Fredric . + +This is free software; you can redistribute it and/or modify it under +the same terms as the Perl 5 programming language system itself. + +=cut diff --git a/lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm b/lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm new file mode 100644 index 0000000..404dfdb --- /dev/null +++ b/lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm @@ -0,0 +1,90 @@ + +use strict; +use warnings; + +package Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile; +BEGIN { + $Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile::AUTHORITY = 'cpan:KENTNL'; +} +{ + $Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile::VERSION = '0.4.0'; +} + +# ABSTRACT: An explicit exclusion file heuristic + + +use parent 'Path::IsDev::NegativeHeuristic'; + + +sub files { + return ('.path_isdev_ignore'); +} +1; + +__END__ + +=pod + +=encoding utf-8 + +=head1 NAME + +Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile - An explicit exclusion file heuristic + +=head1 VERSION + +version 0.4.0 + +=head1 SYNOPSIS + +In a C<::HeuristicSet>: + + sub negative_heuristics { return 'IsDev::IgnoreFile' } + +Then on your file system: + + touch .path_isdev_ignore + +Then the given location will no longer be a possible candidate for being deemed a C root directory. + +However: + +=over 4 + +=item * Its parents can still be deemed C directories + +=item * Its children can still be deemed C directories + +=back + +=head1 METHODS + +=head2 C + +Files valid for triggering this heuristic: + + .path_isdev_ignore + +=begin MetaPOD::JSON v1.1.0 + +{ + "namespace":"Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile", + "interface":"single_class", + "inherits":"Path::IsDev::NegativeHeuristic" +} + + +=end MetaPOD::JSON + +=head1 AUTHOR + +Kent Fredric + +=head1 COPYRIGHT AND LICENSE + +This software is copyright (c) 2013 by Kent Fredric . + +This is free software; you can redistribute it and/or modify it under +the same terms as the Perl 5 programming language system itself. + +=cut diff --git a/lib/Path/IsDev/Object.pm b/lib/Path/IsDev/Object.pm index 5ba09f9..75917c9 100644 --- a/lib/Path/IsDev/Object.pm +++ b/lib/Path/IsDev/Object.pm @@ -6,7 +6,7 @@ BEGIN { $Path::IsDev::Object::AUTHORITY = 'cpan:KENTNL'; } { - $Path::IsDev::Object::VERSION = '0.3.3'; + $Path::IsDev::Object::VERSION = '0.4.0'; } # ABSTRACT: Object Oriented guts for C export @@ -57,6 +57,17 @@ sub _debug { return *STDERR->printf( qq{[Path::IsDev=%s] %s\n}, $id, $message ); } +sub _with_debug { + my ( $self, $code ) = @_; + require Path::IsDev; + ## no critic (ProhibitNoWarnings) + no warnings 'redefine'; + local *Path::IsDev::debug = sub { + $self->_debug(@_); + }; + return $code->(); +} + sub BUILD { my ($self) = @_; @@ -74,16 +85,11 @@ sub BUILD { sub matches { my ( $self, $path ) = @_; $self->_debug( 'Matching ' . $path ); - my $result; - { - require Path::IsDev; - ## no critic (ProhibitNoWarnings) - no warnings 'redefine'; - local *Path::IsDev::debug = sub { - $self->_debug(@_); - }; - $result = $self->loaded_set_module->matches($path); - } + my $result = $self->_with_debug( + sub { + $self->loaded_set_module->matches($path); + } + ); if ( not $result ) { $self->_debug('no match found'); } @@ -104,7 +110,7 @@ Path::IsDev::Object - Object Oriented guts for C export =head1 VERSION -version 0.3.3 +version 0.4.0 =head1 SYNOPSIS diff --git a/t/00-compile.t b/t/00-compile.t index 21c19eb..a5840d7 100644 --- a/t/00-compile.t +++ b/t/00-compile.t @@ -3,7 +3,7 @@ use warnings; # this test was generated with Dist::Zilla::Plugin::Test::Compile 2.033 -use Test::More tests => 15 + ($ENV{AUTHOR_TESTING} ? 1 : 0); +use Test::More tests => 17 + ($ENV{AUTHOR_TESTING} ? 1 : 0); @@ -22,6 +22,8 @@ my @module_files = ( 'Path/IsDev/Heuristic/VCS/Git.pm', 'Path/IsDev/HeuristicSet.pm', 'Path/IsDev/HeuristicSet/Basic.pm', + 'Path/IsDev/NegativeHeuristic.pm', + 'Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm', 'Path/IsDev/Object.pm' ); diff --git a/t/000-report-versions-tiny.t b/t/000-report-versions-tiny.t index b53a838..7c2948e 100644 --- a/t/000-report-versions-tiny.t +++ b/t/000-report-versions-tiny.t @@ -50,7 +50,7 @@ sub pmver { eval { $v .= pmver('Carp','any version') }; eval { $v .= pmver('Class::Tiny','0.010') }; -eval { $v .= pmver('Dist::Zilla::PluginBundle::Author::KENTNL','v1.8.3') }; +eval { $v .= pmver('Dist::Zilla::PluginBundle::Author::KENTNL','v1.9.0') }; eval { $v .= pmver('Dist::Zilla::PluginBundle::Author::KENTNL::Lite','v1.3.0') }; eval { $v .= pmver('File::Spec','any version') }; eval { $v .= pmver('File::Temp','any version') };