simp-module-repoclosure 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/.document +3 -0
  3. data/.gitignore +20 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +6 -0
  6. data/.yardopts +1 -0
  7. data/ChangeLog.md +4 -0
  8. data/Gemfile +13 -0
  9. data/Guardfile +78 -0
  10. data/LICENSE +27 -0
  11. data/LICENSE.txt +202 -0
  12. data/NOTICE.txt +5 -0
  13. data/README.md +99 -0
  14. data/Rakefile +32 -0
  15. data/docs/img/simp-module-repoclosure design.png +0 -0
  16. data/docs/img/simp-module-repoclosure design.svg +2430 -0
  17. data/docs/img/simp-module-repoclosure tests.png +0 -0
  18. data/docs/img/simp-module-repoclosure tests.svg +1 -0
  19. data/docs/simp-module-repoclosure design.gliffy +1 -0
  20. data/docs/simp-module-repoclosure tests.gliffy +1 -0
  21. data/lib/simp/module/repoclosure.rb +207 -0
  22. data/lib/simp/module/repoclosure/version.rb +27 -0
  23. data/simp-module-repoclosure.gemspec +40 -0
  24. data/spec/files/modules/dep1/Gemfile +14 -0
  25. data/spec/files/modules/dep1/README.md +83 -0
  26. data/spec/files/modules/dep1/Rakefile +17 -0
  27. data/spec/files/modules/dep1/manifests/init.pp +48 -0
  28. data/spec/files/modules/dep1/metadata.json +15 -0
  29. data/spec/files/modules/dep1/spec/classes/init_spec.rb +7 -0
  30. data/spec/files/modules/dep1/spec/spec_helper.rb +1 -0
  31. data/spec/files/modules/dep1/tests/init.pp +12 -0
  32. data/spec/files/modules/dep2/Gemfile +14 -0
  33. data/spec/files/modules/dep2/README.md +83 -0
  34. data/spec/files/modules/dep2/Rakefile +17 -0
  35. data/spec/files/modules/dep2/manifests/init.pp +48 -0
  36. data/spec/files/modules/dep2/metadata.json +14 -0
  37. data/spec/files/modules/dep2/spec/classes/init_spec.rb +7 -0
  38. data/spec/files/modules/dep2/spec/spec_helper.rb +1 -0
  39. data/spec/files/modules/dep2/tests/init.pp +12 -0
  40. data/spec/files/modules/dep3/Gemfile +14 -0
  41. data/spec/files/modules/dep3/README.md +83 -0
  42. data/spec/files/modules/dep3/Rakefile +17 -0
  43. data/spec/files/modules/dep3/manifests/init.pp +48 -0
  44. data/spec/files/modules/dep3/metadata.json +14 -0
  45. data/spec/files/modules/dep3/spec/classes/init_spec.rb +7 -0
  46. data/spec/files/modules/dep3/spec/spec_helper.rb +1 -0
  47. data/spec/files/modules/dep3/tests/init.pp +12 -0
  48. data/spec/files/modules/dep3a/Gemfile +14 -0
  49. data/spec/files/modules/dep3a/README.md +83 -0
  50. data/spec/files/modules/dep3a/Rakefile +17 -0
  51. data/spec/files/modules/dep3a/manifests/init.pp +48 -0
  52. data/spec/files/modules/dep3a/metadata.json +14 -0
  53. data/spec/files/modules/dep3a/spec/classes/init_spec.rb +7 -0
  54. data/spec/files/modules/dep3a/spec/spec_helper.rb +1 -0
  55. data/spec/files/modules/dep3a/tests/init.pp +12 -0
  56. data/spec/files/modules/dep4/Gemfile +14 -0
  57. data/spec/files/modules/dep4/README.md +83 -0
  58. data/spec/files/modules/dep4/Rakefile +17 -0
  59. data/spec/files/modules/dep4/manifests/init.pp +48 -0
  60. data/spec/files/modules/dep4/metadata.json +15 -0
  61. data/spec/files/modules/dep4/spec/classes/init_spec.rb +7 -0
  62. data/spec/files/modules/dep4/spec/spec_helper.rb +1 -0
  63. data/spec/files/modules/dep4/tests/init.pp +12 -0
  64. data/spec/files/modules/module01/Gemfile +14 -0
  65. data/spec/files/modules/module01/README.md +83 -0
  66. data/spec/files/modules/module01/Rakefile +17 -0
  67. data/spec/files/modules/module01/manifests/init.pp +48 -0
  68. data/spec/files/modules/module01/metadata.json +15 -0
  69. data/spec/files/modules/module01/spec/classes/init_spec.rb +7 -0
  70. data/spec/files/modules/module01/spec/spec_helper.rb +1 -0
  71. data/spec/files/modules/module01/tests/init.pp +12 -0
  72. data/spec/files/modules/module02/.fixtures.yml +8 -0
  73. data/spec/files/modules/module02/Gemfile +14 -0
  74. data/spec/files/modules/module02/README.md +83 -0
  75. data/spec/files/modules/module02/Rakefile +17 -0
  76. data/spec/files/modules/module02/manifests/init.pp +48 -0
  77. data/spec/files/modules/module02/metadata.json +15 -0
  78. data/spec/files/modules/module02/spec/classes/init_spec.rb +7 -0
  79. data/spec/files/modules/module02/spec/spec_helper.rb +1 -0
  80. data/spec/files/modules/module02/tests/init.pp +12 -0
  81. data/spec/files/modules/module03/.fixtures.yml +6 -0
  82. data/spec/files/modules/module03/Gemfile +14 -0
  83. data/spec/files/modules/module03/README.md +83 -0
  84. data/spec/files/modules/module03/Rakefile +17 -0
  85. data/spec/files/modules/module03/manifests/init.pp +48 -0
  86. data/spec/files/modules/module03/metadata.json +15 -0
  87. data/spec/files/modules/module03/spec/classes/init_spec.rb +7 -0
  88. data/spec/files/modules/module03/spec/spec_helper.rb +1 -0
  89. data/spec/files/modules/module03/tests/init.pp +12 -0
  90. data/spec/files/modules/mut1/Gemfile +14 -0
  91. data/spec/files/modules/mut1/README.md +83 -0
  92. data/spec/files/modules/mut1/Rakefile +17 -0
  93. data/spec/files/modules/mut1/manifests/init.pp +48 -0
  94. data/spec/files/modules/mut1/metadata.json +15 -0
  95. data/spec/files/modules/mut1/spec/classes/init_spec.rb +7 -0
  96. data/spec/files/modules/mut1/spec/spec_helper.rb +1 -0
  97. data/spec/files/modules/mut1/tests/init.pp +12 -0
  98. data/spec/files/modules/mut2/Gemfile +14 -0
  99. data/spec/files/modules/mut2/README.md +83 -0
  100. data/spec/files/modules/mut2/Rakefile +17 -0
  101. data/spec/files/modules/mut2/manifests/init.pp +48 -0
  102. data/spec/files/modules/mut2/metadata.json +16 -0
  103. data/spec/files/modules/mut2/spec/classes/init_spec.rb +7 -0
  104. data/spec/files/modules/mut2/spec/spec_helper.rb +1 -0
  105. data/spec/files/modules/mut2/tests/init.pp +12 -0
  106. data/spec/lib/simp/module/repoclosure_spec.rb +119 -0
  107. data/spec/spec_helper.rb +23 -0
  108. metadata +345 -0
@@ -0,0 +1 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="666" height="469.24999999999994"><style xmlns="http://www.w3.org/1999/xhtml"></style><defs/><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="666" height="469.24999999999994"/></g><g transform="matrix(1,0,0,1,12,69)"><g transform="translate(106,48) matrix(1,0,0,1,0,0) translate(-106,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="117" height="44" fill-opacity="0"/></g></g><g transform="translate(106,48) matrix(1,0,0,1,0,0) translate(-106,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="117" height="16" fill-opacity="0"/></g></g><g transform="translate(106,48) matrix(1,0,0,1,0,0) translate(-106,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="27" y="0" width="63" height="16" fill-opacity="0"/></g></g><g transform="translate(106,48) matrix(1,0,0,1,0,0) translate(-106,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="27" y="0" width="63" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="27" y="13">Success</text><rect fill="rgb(8, 35, 63)" stroke="none" x="27" y="14" width="59" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="86" y="14" width="0" height="1"/><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="86" y="13">:</text><rect fill="rgb(8, 35, 63)" stroke="none" x="86" y="14" width="4" height="1"/></g><g transform="translate(106,48) matrix(1,0,0,1,0,0) translate(-106,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="16" width="117" height="28" fill-opacity="0"/></g></g><g transform="translate(106,48) matrix(1,0,0,1,0,0) translate(-106,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="26" y="16" width="101" height="28" fill-opacity="0"/></g></g><g transform="translate(106,48) matrix(1,0,0,1,0,0) translate(-106,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="26" y="16" width="101" height="28" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26" y="27">Module</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69" y="27">with</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="41">dependency</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="79" y="41">chain</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,160,179.24999999999994)"><g><g transform="translate(0,0) scale(1,0.6)"><g><path fill="#DDE6F1" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.6666666666666667)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#0B599F" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,170,201)"><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="24" y="0" width="35" height="16" fill-opacity="0"/></g></g><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="24" y="0" width="35" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="24" y="13">mut1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,350,179.24999999999994)"><g><g transform="translate(0,0) scale(1,0.6)"><g><path fill="#f4cccc" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.6666666666666667)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#ff0000" d="M 0 0 M 0 0 L 8 0 M 8 0 M 10 0 L 18 0 M 18 0 M 20 0 L 28 0 M 28 0 M 30 0 L 38 0 M 38 0 M 40 0 L 48 0 M 48 0 M 50 0 L 58 0 M 58 0 M 60 0 L 68 0 M 68 0 M 70 0 L 78 0 M 78 0 M 80 0 L 88 0 M 88 0 M 90 0 L 98 0 M 98 0 M 100 0 L 100 0 Q 100 0 100 0 L 100 8 M 100 8 M 100 10 L 100 18 M 100 18 M 100 20 L 100 28 M 100 28 M 100 30 L 100 38 M 100 38 M 100 40 L 100 48 M 100 48 M 100 50 L 100 58 M 100 58 M 100 60 L 100 60 Q 100 60 100 60 L 92 60 M 92 60 M 90 60 L 82 60 M 82 60 M 80 60 L 72 60 M 72 60 M 70 60 L 62 60 M 62 60 M 60 60 L 52 60 M 52 60 M 50 60 L 42 60 M 42 60 M 40 60 L 32 60 M 32 60 M 30 60 L 22 60 M 22 60 M 20 60 L 12 60 M 12 60 M 10 60 L 2 60 M 2 60 M 0 60 L 0 60 Q 0 60 0 60 L 0 52 M 0 52 M 0 50 L 0 42 M 0 42 M 0 40 L 0 32 M 0 32 M 0 30 L 0 22 M 0 22 M 0 20 L 0 12 M 0 12 M 0 10 L 0 2 M 0 2 M 0 0 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,360,201)"><g transform="translate(46,0) matrix(1,0,0,1,0,0) translate(-46,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(46,0) matrix(1,0,0,1,0,0) translate(-46,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(46,0) matrix(1,0,0,1,0,0) translate(-46,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="23" y="0" width="35" height="16" fill-opacity="0"/></g></g><g transform="translate(46,0) matrix(1,0,0,1,0,0) translate(-46,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="23" y="0" width="35" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="23" y="13">dep1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,350,389.24999999999994)"><g><g transform="translate(0,0) scale(1,0.6)"><g><path fill="#DDE6F1" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.6666666666666667)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#0B599F" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,360,411)"><g transform="translate(154,0) matrix(1,0,0,1,0,0) translate(-154,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(154,0) matrix(1,0,0,1,0,0) translate(-154,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(154,0) matrix(1,0,0,1,0,0) translate(-154,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="21" y="0" width="35" height="16" fill-opacity="0"/></g></g><g transform="translate(154,0) matrix(1,0,0,1,0,0) translate(-154,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="21" y="0" width="35" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="21" y="13">dep4</text></g><g transform="translate(154,0) matrix(1,0,0,1,0,0) translate(-154,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="56" y="0" width="4" height="16" fill-opacity="0"/></g></g><g transform="translate(154,0) matrix(1,0,0,1,0,0) translate(-154,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="56" y="0" width="4" height="16" fill-opacity="0"/></g></g></g><g transform="matrix(1,0,0,1,255.5,62.74999999999994)"><image width="124" height="60" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHwAAAA8CAYAAACkRt7SAAACJElEQVR4Xu3bzVECAQwF4JerFmUbeFwrwApcO9AGEE5yxA6wArED7IALzF4gDj+ruDgeSJDN5Hny4iN5HwFHRgG/UjUgqbblsiB4sicBwQmerIFk6/LCCZ6sgWTr8sIJnqyBZOvywgmerIFk6/LCCZ6sgWTr8sIJnqyBZOvywgmerIFk6/LCCZ6sgWTr8sIJnqyBZOvywgmerIFk6/LCHcAvOr0RIG+LCo8YFTOHyJNFENyh2svr3hiQKwAzQLvz55uBQ+xJIgjuUOse+CZNFVMRLdsIT/ATgNeRCkxWittqWIwdHsYlguAONe5fuEIhzf/vUIyXwH0b4AnuDa7f9y3SqHcLX1TDYurwsEdFHIBfdJ5KEdwdlZb0h/avWhWondffQw4vXhX91fbi/x2e4A5P0j/B1+bNQ1cdrCBlK8Ad9k8X8eM9/Osl/VfolxWkew7oGoXv4Q5PzyZ486IBfV3q5qLP/ts6wZ3B9+NU9X130WeH5oU7QNcRB394gX6ISjkfFn3Hh3GJ4oU71FiDa4uheeEO0HXE7sOTyaLCAz88cSyWUfYG+JJu7zBUAsFDcdmHJbi9w1AJBA/FZR+W4PYOQyUQPBSXfViC2zsMlUDwUFz2YQlu7zBUAsFDcdmHJbi9w1AJBA/FZR+W4PYOQyUQPBSXfViC2zsMlUDwUFz2YQlu7zBUAsFDcdmHJbi9w1AJBA/FZR+W4PYOQyUQPBSXfdhPCxyPPQ1RrQ0AAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,160,62.74999999999994)"><g><g transform="translate(0,0) scale(1,0.6)"><g><path fill="#DDE6F1" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.6666666666666667)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#0B599F" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,170,85)"><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="24" y="0" width="35" height="16" fill-opacity="0"/></g></g><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="24" y="0" width="35" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="24" y="13">mut1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,350,62.74999999999994)"><g><g transform="translate(0,0) scale(1,0.6)"><g><path fill="#DDE6F1" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.6666666666666667)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#0B599F" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,360,85)"><g transform="translate(46,0) matrix(1,0,0,1,0,0) translate(-46,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(46,0) matrix(1,0,0,1,0,0) translate(-46,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(46,0) matrix(1,0,0,1,0,0) translate(-46,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="23" y="0" width="35" height="16" fill-opacity="0"/></g></g><g transform="translate(46,0) matrix(1,0,0,1,0,0) translate(-46,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="23" y="0" width="35" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="23" y="13">dep1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,540,62.74999999999994)"><g><g transform="translate(0,0) scale(1,0.6)"><g><path fill="#DDE6F1" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.6666666666666667)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#0B599F" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,550,85)"><g transform="translate(128,0) matrix(1,0,0,1,0,0) translate(-128,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(128,0) matrix(1,0,0,1,0,0) translate(-128,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(128,0) matrix(1,0,0,1,0,0) translate(-128,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="23" y="0" width="18" height="16" fill-opacity="0"/></g></g><g transform="translate(128,0) matrix(1,0,0,1,0,0) translate(-128,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="23" y="0" width="18" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="23" y="13">de</text></g><g transform="translate(128,0) matrix(1,0,0,1,0,0) translate(-128,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="41" y="0" width="17" height="16" fill-opacity="0"/></g></g><g transform="translate(128,0) matrix(1,0,0,1,0,0) translate(-128,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="41" y="0" width="17" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="41" y="13">p2</text></g></g><g transform="matrix(1,0,0,1,445.5,62.74999999999994)"><image width="124" height="60" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHwAAAA8CAYAAACkRt7SAAACJElEQVR4Xu3bzVECAQwF4JerFmUbeFwrwApcO9AGEE5yxA6wArED7IALzF4gDj+ruDgeSJDN5Hny4iN5HwFHRgG/UjUgqbblsiB4sicBwQmerIFk6/LCCZ6sgWTr8sIJnqyBZOvywgmerIFk6/LCCZ6sgWTr8sIJnqyBZOvywgmerIFk6/LCCZ6sgWTr8sIJnqyBZOvywgmerIFk6/LCHcAvOr0RIG+LCo8YFTOHyJNFENyh2svr3hiQKwAzQLvz55uBQ+xJIgjuUOse+CZNFVMRLdsIT/ATgNeRCkxWittqWIwdHsYlguAONe5fuEIhzf/vUIyXwH0b4AnuDa7f9y3SqHcLX1TDYurwsEdFHIBfdJ5KEdwdlZb0h/avWhWondffQw4vXhX91fbi/x2e4A5P0j/B1+bNQ1cdrCBlK8Ad9k8X8eM9/Osl/VfolxWkew7oGoXv4Q5PzyZ486IBfV3q5qLP/ts6wZ3B9+NU9X130WeH5oU7QNcRB394gX6ISjkfFn3Hh3GJ4oU71FiDa4uheeEO0HXE7sOTyaLCAz88cSyWUfYG+JJu7zBUAsFDcdmHJbi9w1AJBA/FZR+W4PYOQyUQPBSXfViC2zsMlUDwUFz2YQlu7zBUAsFDcdmHJbi9w1AJBA/FZR+W4PYOQyUQPBSXfViC2zsMlUDwUFz2YQlu7zBUAsFDcdmHJbi9w1AJBA/FZR+W4PYOQyUQPBSXfdhPCxyPPQ1RrQ0AAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,255.5,179.24999999999994)"><image width="124" height="60" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHwAAAA8CAYAAACkRt7SAAAB50lEQVR4Xu3Z7U3DQBCE4bnKqIUOoAJCB9ABdAAdQAVAB9ABHRidYkuWsVDInj9W897vsNmdx+uYpIhjlUCxmpZhBbjZRQA44GYJmI3LhgNuloDZuGw44GYJmI3LhgNuloDZuGw44GYJmI3LhgNuloDZuGw44GYJmI3LhgNuloDZuGw44GYJmI3LhgNuloDZuGx4A/BOepL0Jum+SN8NSi5WAvAG0XbSi6QLHbGvivTYoOwiJQBvEOsIfKj2KemwR3jAlwEfqr5Lui7HO8AuDuANGGY2fFq1gt/uAR7wdcCHd6nwl0Wqt/xNzi/wTjpIuvmjm3ql1tfMHse/P2HDp1k99Bu/OjzgE4pzLtgzwOtTfH2o2x58k/tM8jf9B/hz/2/b6tBDxHyGN7jYTgB/7Td686d1wJcF/+g3enNoNrwB9FBiZsO/+o2uD2e7Omx4A44R+G6h2fAG0KMNrz+e1G/V7vjxpGGwlIonwC09nmGqCoCn4oo3C3g8w1QVAE/FFW8W8HiGqSoAnoor3izg8QxTVQA8FVe8WcDjGaaqAHgqrnizgMczTFUB8FRc8WYBj2eYqgLgqbjizQIezzBVBcBTccWbBTyeYaoKgKfiijcLeDzDVBUAT8UVbxbweIapKgCeiive7A9cAFY9MzwSKwAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,293,196)"><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 0 0 L 22 0 L 22 27 L 0 27 Z"/><g><rect fill="rgb(255, 255, 255)" stroke="none" x="0" y="0" width="22" height="27"/></g></g><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 0 0 L 22 0 L 22 27 L 0 27 Z"/><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="22" height="27" fill-opacity="0"/></g></g><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 3 0 L 19 0 L 19 27 L 3 27 Z"/><g><rect fill="rgb(0,0,0)" stroke="none" x="3" y="0" width="16" height="27" fill-opacity="0"/></g><text fill="rgb(255, 0, 0)" stroke="none" font-family="Arial" font-size="24px" font-style="normal" font-weight="bold" text-decoration="" line-height="27px" x="3" y="22">X</text></g></g><g transform="matrix(1,0,0,1,452,195)"><g transform="translate(168,0) matrix(1,0,0,1,0,0) translate(-168,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="87" height="28" fill-opacity="0"/></g></g><g transform="translate(168,0) matrix(1,0,0,1,0,0) translate(-168,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="87" height="28" fill-opacity="0"/></g></g><g transform="translate(168,0) matrix(1,0,0,1,0,0) translate(-168,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="8" y="0" width="71" height="28" fill-opacity="0"/></g></g><g transform="translate(168,0) matrix(1,0,0,1,0,0) translate(-168,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="8" y="0" width="64" height="14" fill-opacity="0"/></g></g><g transform="translate(168,0) matrix(1,0,0,1,0,0) translate(-168,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="8" y="0" width="64" height="14" fill-opacity="0"/></g><text fill="rgb(152, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="8" y="11">not</text><text fill="rgb(152, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="28" y="11">availabl</text></g><g transform="translate(168,0) matrix(1,0,0,1,0,0) translate(-168,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="72" y="0" width="58" height="28" fill-opacity="0"/></g></g><g transform="translate(168,0) matrix(1,0,0,1,0,0) translate(-168,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="72" y="0" width="58" height="28" fill-opacity="0"/></g><text fill="rgb(152, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="72" y="11">e</text><text fill="rgb(152, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="21" y="25">on</text><text fill="rgb(152, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="38" y="25">forge</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,160,303.24999999999994)"><g><g transform="translate(0,0) scale(1,0.6)"><g><path fill="#DDE6F1" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.6666666666666667)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#0B599F" d="M 0 0 M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,170,325)"><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="24" y="0" width="35" height="16" fill-opacity="0"/></g></g><g transform="translate(48,0) matrix(1,0,0,1,0,0) translate(-48,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="24" y="0" width="35" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="24" y="13">mut2</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,350,303.24999999999994)"><g><g transform="translate(0,0) scale(1,0.6)"><g><path fill="#f4cccc" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.6666666666666667)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#ff0000" d="M 0 0 M 0 0 L 8 0 M 8 0 M 10 0 L 18 0 M 18 0 M 20 0 L 28 0 M 28 0 M 30 0 L 38 0 M 38 0 M 40 0 L 48 0 M 48 0 M 50 0 L 58 0 M 58 0 M 60 0 L 68 0 M 68 0 M 70 0 L 78 0 M 78 0 M 80 0 L 88 0 M 88 0 M 90 0 L 98 0 M 98 0 M 100 0 L 100 0 Q 100 0 100 0 L 100 8 M 100 8 M 100 10 L 100 18 M 100 18 M 100 20 L 100 28 M 100 28 M 100 30 L 100 38 M 100 38 M 100 40 L 100 48 M 100 48 M 100 50 L 100 58 M 100 58 M 100 60 L 100 60 Q 100 60 100 60 L 92 60 M 92 60 M 90 60 L 82 60 M 82 60 M 80 60 L 72 60 M 72 60 M 70 60 L 62 60 M 62 60 M 60 60 L 52 60 M 52 60 M 50 60 L 42 60 M 42 60 M 40 60 L 32 60 M 32 60 M 30 60 L 22 60 M 22 60 M 20 60 L 12 60 M 12 60 M 10 60 L 2 60 M 2 60 M 0 60 L 0 60 Q 0 60 0 60 L 0 52 M 0 52 M 0 50 L 0 42 M 0 42 M 0 40 L 0 32 M 0 32 M 0 30 L 0 22 M 0 22 M 0 20 L 0 12 M 0 12 M 0 10 L 0 2 M 0 2 M 0 0 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,360,318)"><g transform="translate(84,48) matrix(1,0,0,1,0,0) translate(-84,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="30" fill-opacity="0"/></g></g><g transform="translate(84,48) matrix(1,0,0,1,0,0) translate(-84,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(84,48) matrix(1,0,0,1,0,0) translate(-84,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="23" y="0" width="35" height="16" fill-opacity="0"/></g></g><g transform="translate(84,48) matrix(1,0,0,1,0,0) translate(-84,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="23" y="0" width="35" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="23" y="13">dep3</text></g><g transform="translate(84,48) matrix(1,0,0,1,0,0) translate(-84,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="16" width="81" height="14" fill-opacity="0"/></g></g><g transform="translate(84,48) matrix(1,0,0,1,0,0) translate(-84,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="19" y="16" width="45" height="14" fill-opacity="0"/></g></g><g transform="translate(84,48) matrix(1,0,0,1,0,0) translate(-84,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="19" y="16" width="45" height="14" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19" y="27">~&gt;</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="27">0</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43" y="27">.</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46" y="27">2</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="27">.</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56" y="27">0</text></g></g><g transform="matrix(1,0,0,1,255.5,290.8235931288071)"><image width="124" height="60" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHwAAAA8CAYAAACkRt7SAAAB50lEQVR4Xu3Z7U3DQBCE4bnKqIUOoAJCB9ABdAAdQAVAB9ABHRidYkuWsVDInj9W897vsNmdx+uYpIhjlUCxmpZhBbjZRQA44GYJmI3LhgNuloDZuGw44GYJmI3LhgNuloDZuGw44GYJmI3LhgNuloDZuGw44GYJmI3LhgNuloDZuGw44GYJmI3LhgNuloDZuGx4A/BOepL0Jum+SN8NSi5WAvAG0XbSi6QLHbGvivTYoOwiJQBvEOsIfKj2KemwR3jAlwEfqr5Lui7HO8AuDuANGGY2fFq1gt/uAR7wdcCHd6nwl0Wqt/xNzi/wTjpIuvmjm3ql1tfMHse/P2HDp1k99Bu/OjzgE4pzLtgzwOtTfH2o2x58k/tM8jf9B/hz/2/b6tBDxHyGN7jYTgB/7Td686d1wJcF/+g3enNoNrwB9FBiZsO/+o2uD2e7Omx4A44R+G6h2fAG0KMNrz+e1G/V7vjxpGGwlIonwC09nmGqCoCn4oo3C3g8w1QVAE/FFW8W8HiGqSoAnoor3izg8QxTVQA8FVe8WcDjGaaqAHgqrnizgMczTFUB8FRc8WYBj2eYqgLgqbjizQIezzBVBcBTccWbBTyeYaoKgKfiijcLeDzDVBUAT8UVbxbweIapKgCeiive7A9cAFY9MzwSKwAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,293,307)"><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 0 0 L 22 0 L 22 27 L 0 27 Z"/><g><rect fill="rgb(255, 255, 255)" stroke="none" x="0" y="0" width="22" height="27"/></g></g><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 0 0 L 22 0 L 22 27 L 0 27 Z"/><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="22" height="27" fill-opacity="0"/></g></g><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 3 0 L 19 0 L 19 27 L 3 27 Z"/><g><rect fill="rgb(0,0,0)" stroke="none" x="3" y="0" width="16" height="27" fill-opacity="0"/></g><text fill="rgb(255, 0, 0)" stroke="none" font-family="Arial" font-size="24px" font-style="normal" font-weight="bold" text-decoration="" line-height="27px" x="3" y="22">X</text></g></g><g transform="matrix(1,0,0,1,482,309)"><g transform="translate(66,0) matrix(1,0,0,1,0,0) translate(-66,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="87" height="14" fill-opacity="0"/></g></g><g transform="translate(66,0) matrix(1,0,0,1,0,0) translate(-66,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="87" height="14" fill-opacity="0"/></g></g><g transform="translate(66,0) matrix(1,0,0,1,0,0) translate(-66,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="22" y="0" width="45" height="14" fill-opacity="0"/></g></g><g transform="translate(66,0) matrix(1,0,0,1,0,0) translate(-66,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="22" y="0" width="45" height="14" fill-opacity="0"/></g></g><g transform="translate(66,0) matrix(1,0,0,1,0,0) translate(-66,0)"><g><rect fill="rgb(0,0,0)" stroke="none" x="22" y="0" width="45" height="14" fill-opacity="0"/></g><text fill="rgb(152, 0, 0)" stroke="none" font-family="Arial" font-size="12px" font-style="italic" font-weight="normal" text-decoration="" line-height="14px" x="22" y="11">conflicts</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,530,389.24999999999994)"><g><g transform="translate(0,0) scale(1,0.6)"><g><path fill="#f4cccc" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.6666666666666667)"><path fill="none" stroke="none" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 60 Q 100 60 100 60 L 0 60 Q 0 60 0 60 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#ff0000" d="M 0 0 M 0 0 L 8 0 M 8 0 M 10 0 L 18 0 M 18 0 M 20 0 L 28 0 M 28 0 M 30 0 L 38 0 M 38 0 M 40 0 L 48 0 M 48 0 M 50 0 L 58 0 M 58 0 M 60 0 L 68 0 M 68 0 M 70 0 L 78 0 M 78 0 M 80 0 L 88 0 M 88 0 M 90 0 L 98 0 M 98 0 M 100 0 L 100 0 Q 100 0 100 0 L 100 8 M 100 8 M 100 10 L 100 18 M 100 18 M 100 20 L 100 28 M 100 28 M 100 30 L 100 38 M 100 38 M 100 40 L 100 48 M 100 48 M 100 50 L 100 58 M 100 58 M 100 60 L 100 60 Q 100 60 100 60 L 92 60 M 92 60 M 90 60 L 82 60 M 82 60 M 80 60 L 72 60 M 72 60 M 70 60 L 62 60 M 62 60 M 60 60 L 52 60 M 52 60 M 50 60 L 42 60 M 42 60 M 40 60 L 32 60 M 32 60 M 30 60 L 22 60 M 22 60 M 20 60 L 12 60 M 12 60 M 10 60 L 2 60 M 2 60 M 0 60 L 0 60 Q 0 60 0 60 L 0 52 M 0 52 M 0 50 L 0 42 M 0 42 M 0 40 L 0 32 M 0 32 M 0 30 L 0 22 M 0 22 M 0 20 L 0 12 M 0 12 M 0 10 L 0 2 M 0 2 M 0 0 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,540,404)"><g transform="translate(90,48) matrix(1,0,0,1,0,0) translate(-90,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="30" fill-opacity="0"/></g></g><g transform="translate(90,48) matrix(1,0,0,1,0,0) translate(-90,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="16" fill-opacity="0"/></g></g><g transform="translate(90,48) matrix(1,0,0,1,0,0) translate(-90,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="23" y="0" width="35" height="16" fill-opacity="0"/></g></g><g transform="translate(90,48) matrix(1,0,0,1,0,0) translate(-90,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="23" y="0" width="35" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="23" y="13">dep3</text></g><g transform="translate(90,48) matrix(1,0,0,1,0,0) translate(-90,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="16" width="81" height="14" fill-opacity="0"/></g></g><g transform="translate(90,48) matrix(1,0,0,1,0,0) translate(-90,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="22" y="16" width="37" height="14" fill-opacity="0"/></g></g><g transform="translate(90,48) matrix(1,0,0,1,0,0) translate(-90,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="22" y="16" width="37" height="14" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="22" y="27">=</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="32" y="27">0</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="39" y="27">.</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="42" y="27">1</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="27">.</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52" y="27">0</text></g></g><g transform="matrix(1,0,0,1,255.5,341.1764068711928)"><image width="124" height="108" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHwAAABsCAYAAACoyNYlAAADjElEQVR4Xu3XQVbScRTF8fdr1LFJO9IlNKRZtAJbQbgD24DaKIbuINxB7cB2kAM9TOR1wDAFPXHhKVz5chw+Hr97P/7+aAteW9VA26q0hA3At+yXYA78ded471XErlsPo4izYb87cDv3c593Dnync9xrLT4/90FW/bzMOLjqd3ur7nnp73/shu+5BG8t9yLaLuCLidl/h0+fSIADvlgDWzbFDQfcqwEe6ZoXN1zry34acHtCLQDgWl/204DbE2oBANf6sp8G3J5QCwC41pf9NOD2hFoAwLW+7KcBtyfUAgCu9WU/Dbg9oRYAcK0v+2nA7Qm1AIBrfdlPA25PqAUAXOvLfhpwe0ItAOBaX/bTgNsTagEA1/qynwbcnlALALjWl/004PaEWgDAtb7spwG3J9QCAK71ZT8NuD2hFgBwrS/7acDtCbUAgGt92U8Dbk+oBQBc68t+GnB7Qi0A4Fpf9tOA2xNqAQDX+rKfBtyeUAsAuNaX/TTg9oRaAMC1vuynAbcn1AIArvVlPw24PaEWAHCtL/tpwO0JtQCAa33ZTwNuT6gFAFzry34acHtCLQDgWl/204DbE2oBANf6sp8G3J5QCwC41pf9NOD2hFoAwLW+7KcBtyfUAgCu9WU/Dbg9oRYAcK0v+2nACwh3OkcnrcX3y28fvxase9IVgBfU++b90SCi7WbGeWvZ22R4wAvBb1dlDK4jDob97qBgfekKwAvqnN7wuVUbCA94MXhmRmv3a82I01HGp2G/e17wcSutAHyl+m7efPeGZ/5d2DJazMBnnIxuHvVrg38x4AVuS6/I+Ic7Bp9e8In9Qzc+o3c1jC9x2v299Icu+UbAlyzu7tseBR+Lt8nPzCvPrrN9WMdNtwcv8Fp5xYOP9LH1XLsT6N46/3oHfGXume/wm0t975WZP0fR9tcJPT0Q4MXgM4/6Xy1b77LfPSn4mJIVgBfUOPd/eOZFRNvfJGhueAH0dMUteOZFRju8GsbhOv4CXyQSN3yRlv4zs9M5Oo1oPzYZmhteAH274t3x20290bMxueGV8Aa7ADdAqjwi4JVtGuwC3ACp8oiAV7ZpsAtwA6TKIwJe2abBLsANkCqPCHhlmwa7ADdAqjwi4JVtGuwC3ACp8oiAV7ZpsAtwA6TKIwJe2abBLsANkCqPCHhlmwa7ADdAqjwi4JVtGuwC3ACp8oiAV7ZpsAtwA6TKI/4Bs+uXiyYg+O8AAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,445.5,389.24999999999994)"><image width="114" height="60" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAAA8CAYAAAC6j+5hAAAB00lEQVR4Xu3Y0U3DQBCE4bnKqIUOoAJCB9ABdAAdQAVAB9ABHQSdcpYQRI7JSPFo+e/ZuezO5704bmKVSKCV6IImBGSRmwBIIIskUKQNJhLIIgkUaYOJBLJIAkXaYCKBLJJAkTaYSCCLJFCkDSYSyCIJFGmDiQSySAJF2mAigSySQJE2mEggiyRQpA0mEsgiCRRpg4mcgdxKD5JeJN026TPZHMh5yCdJZ9ohXjTpPhUTyGWQ01XvkjaJoED+DXK6+lXSZZP6xEYsII+DnD7VIa8TQIH0IL+DnjepH72rrF+QW2kj6Wqmmn4H9mv2rn/w+TmouzGhJwcF8gfLghtxDrI/1faHofUhVzkXQr90u3uY6X8/Dq3H8ffk5IBTYfxGer+Rz2MCV396BfI4yLcxgasDMpGHDktJe47WjzGB/aEmajGRyyYyFpCJXDBP46V5f4tzw0vzBYFxiZ8AR6ufYcQOQEYw+EUA6WcYsQOQEQx+EUD6GUbsAGQEg18EkH6GETsAGcHgFwGkn2HEDkBGMPhFAOlnGLEDkBEMfhFA+hlG7ABkBINfBJB+hhE7ABnB4BcBpJ9hxA5ARjD4RQDpZxixA5ARDH4RQPoZRuwAZASDX8QXK7JQPRTFSgoAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,478,406)"><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 0 0 L 22 0 L 22 27 L 0 27 Z"/><g><rect fill="rgb(255, 255, 255)" stroke="none" x="0" y="0" width="22" height="27"/></g></g><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 0 0 L 22 0 L 22 27 L 0 27 Z"/><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="22" height="27" fill-opacity="0"/></g></g><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 3 0 L 19 0 L 19 27 L 3 27 Z"/><g><rect fill="rgb(0,0,0)" stroke="none" x="3" y="0" width="16" height="27" fill-opacity="0"/></g><text fill="rgb(255, 0, 0)" stroke="none" font-family="Arial" font-size="24px" font-style="normal" font-weight="bold" text-decoration="" line-height="27px" x="3" y="22">X</text></g></g><g transform="matrix(1,0,0,1,12,180)"><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="117" height="58" fill-opacity="0"/></g></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="117" height="16" fill-opacity="0"/></g></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="22" y="0" width="75" height="16" fill-opacity="0"/></g></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="22" y="0" width="75" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="22" y="13">Fail</text><rect fill="rgb(8, 35, 63)" stroke="none" x="22" y="14" width="26" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="47" y="14" width="1" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="47" y="14" width="5" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="51" y="14" width="1" height="1"/><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="51" y="13">Test</text><rect fill="rgb(8, 35, 63)" stroke="none" x="51" y="14" width="30" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="79" y="14" width="1" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="79" y="14" width="5" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="83" y="14" width="1" height="1"/><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="83" y="13">1</text><rect fill="rgb(8, 35, 63)" stroke="none" x="83" y="14" width="9" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="91" y="14" width="1" height="1"/><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="91" y="13">:</text><rect fill="rgb(8, 35, 63)" stroke="none" x="91" y="14" width="5" height="1"/></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="16" width="117" height="42" fill-opacity="0"/></g></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="26" y="16" width="115" height="42" fill-opacity="0"/></g></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="26" y="16" width="115" height="42" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26" y="27">Module</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69" y="27">with</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="1" y="41">dependency</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="71" y="41">missing</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29" y="55">from</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57" y="55">Forge</text></g></g><g transform="matrix(1,0,0,1,12,307)"><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="117" height="44" fill-opacity="0"/></g></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="117" height="16" fill-opacity="0"/></g></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="22" y="0" width="75" height="16" fill-opacity="0"/></g></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="22" y="0" width="75" height="16" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="22" y="13">Fail</text><rect fill="rgb(8, 35, 63)" stroke="none" x="22" y="14" width="26" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="47" y="14" width="1" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="47" y="14" width="5" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="51" y="14" width="1" height="1"/><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="51" y="13">Test</text><rect fill="rgb(8, 35, 63)" stroke="none" x="51" y="14" width="30" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="79" y="14" width="1" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="79" y="14" width="5" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="83" y="14" width="1" height="1"/><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="83" y="13">2</text><rect fill="rgb(8, 35, 63)" stroke="none" x="83" y="14" width="9" height="1"/><rect fill="rgb(8, 35, 63)" stroke="none" x="91" y="14" width="1" height="1"/><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="14px" font-style="normal" font-weight="bold" text-decoration="" line-height="16.5px" x="91" y="13">:</text><rect fill="rgb(8, 35, 63)" stroke="none" x="91" y="14" width="5" height="1"/></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="16" width="117" height="28" fill-opacity="0"/></g></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="26" y="16" width="115" height="28" fill-opacity="0"/></g></g><g transform="translate(96,48) matrix(1,0,0,1,0,0) translate(-96,-48)"><g><rect fill="rgb(0,0,0)" stroke="none" x="26" y="16" width="115" height="28" fill-opacity="0"/></g><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26" y="27">Module</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69" y="27">with</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="1" y="41">dependency</text><text fill="rgb(8, 35, 63)" stroke="none" font-family="Arial" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="71" y="41">conflicts</text></g></g><g transform="matrix(1,0,0,1,445.5,328.74999999999994)"><g transform="translate(0,0)"><g transform="translate(-422,-313.74999999999994) translate(-23.5,-15) matrix(1,0,0,1,0,0)"><g><path fill="none" stroke="#ff0000" d="M 450 333.24999999999994 M 450 333.24999999999994 Q 454.063378287578 333.24999999999994 457.9997485512487 333.3047111487601 M 457.9997485512487 333.3047111487601 M 465.9978329372105 333.4761573919479 Q 470.06760488460657 333.5951284301314 473.992089736761 333.7766846785729 M 473.992089736761 333.7766846785729 M 481.97963120412373 334.2208217202674 Q 486.05272582155794 334.48686874850887 489.9565688847859 334.8258241385623 M 489.9565688847859 334.8258241385623 M 497.9176095195963 335.6123925680132 Q 501.98742589230244 336.0655490409182 505.85545226826747 336.6056304354963 M 505.85545226826747 336.6056304354963 M 513.7598698476555 337.8363330154004 Q 517.812014541533 338.536141955715 521.6162751116572 339.3427317493387 M 521.6162751116572 339.3427317493387 M 529.4034311667831 341.17284891956007 Q 533.4047912973158 342.2120752263464 537.0897093594745 343.38761503950934 M 537.0897093594745 343.38761503950934 M 544.6268647960334 346.06475651522163 Q 548.4947160560014 347.592711305943 551.9396397670548 349.3028502715814 M 551.9396397670548 349.3028502715814 M 558.9089120489939 353.2230015485133 Q 562.420519978524 355.4658531265732 565.3474548803097 357.9605638550461 M 565.3474548803097 357.9605638550461 M 570.9772938558666 363.6304042226656 Q 573.5899714358021 366.7769678867692 575.446103914118 370.2494279023398 M 575.446103914118 370.2494279023398 M 578.4396805018445 377.6518960221522 Q 579.5166408042464 381.42254428872474 579.850263928384 385.5133993397804 M 579.850263928384 385.5133993397804" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g><g transform="matrix(1,0,0,1,506,320)"><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 0 0 L 38 0 L 38 41 L 0 41 Z"/><g><rect fill="rgb(255, 255, 255)" stroke="none" x="0" y="0" width="38" height="41"/></g></g><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 0 0 L 38 0 L 38 41 L 0 41 Z"/><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="38" height="41" fill-opacity="0"/></g></g><g transform="translate(3,0) matrix(1,0,0,1,0,0) translate(-3,0)"><path fill="none" stroke="none" d="M 3 0 L 35 0 L 35 41 L 3 41 Z"/><g><rect fill="rgb(0,0,0)" stroke="none" x="3" y="0" width="32" height="41" fill-opacity="0"/></g><text fill="rgb(255, 0, 0)" stroke="none" font-family="Arial" font-size="36px" font-style="normal" font-weight="normal" text-decoration="" line-height="41px" x="3" y="33">☠</text></g></g></g></svg>
@@ -0,0 +1 @@
1
+ {"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":698,"height":277,"nodeIndex":290,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":true,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":null,"printShrinkToFit":false,"printPortrait":false,"maxWidth":5000,"maxHeight":5000,"themeData":{"uid":"com.gliffy.theme.blueprint","name":"Blueprint","shape":{"primary":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#08233F"}},"secondary":{"strokeWidth":2,"strokeColor":"#08233F","fillColor":"#424D76","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#FFFFFF"}},"tertiary":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#08233F"}},"highlight":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#0B599F","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#ffffff"}}},"line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","arrowType":2,"interpolationType":"linear","cornerRadius":0,"text":{"color":"#08233F"}},"text":{"color":"#08233F"},"stage":{"color":"#FFFFFF"}},"viewportType":"default","fitBB":{"min":{"x":22,"y":20},"max":{"x":698,"y":261.5}},"printModel":{"pageSize":"a4","portrait":false,"fitToOnePage":false,"displayPageBreaks":false},"objects":[{"x":211.0,"y":342.0479797979797,"rotation":0.0,"id":187,"width":114.0,"height":60.0,"uid":"com.gliffy.shape.uml.uml_v2.class.association","order":0,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":192,"py":0.29289321881345237,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":109,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-51.0,-142.4743866691726],[263.5,-142.4743866691726],[263.5,-246.61111111111103],[359.0,-246.61111111111103]],"lockSegments":{"1":true},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":550.0,"y":44.0,"rotation":0.0,"id":182,"width":130.0,"height":197.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":1,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":3.0,"strokeColor":"#0B599F","fillColor":"#dde6f1","gradient":false,"dashStyle":"4,4","dropShadow":false,"state":0,"opacity":0.52,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":40.0,"y":60.75,"rotation":0.0,"id":86,"width":130.0,"height":70.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":25,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.5999999999999996,"y":0.0,"rotation":0.0,"id":87,"width":124.8,"height":32.0,"uid":null,"order":27,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"color:#08233f;\"><span style=\"font-size:14px;\"><span style=\"font-weight:bold;\">Upstream</span></span></span></p><p style=\"text-align:center;\"><span style=\"color:#08233f;\"><span style=\"font-size:14px;\"><span style=\"font-weight:bold;\">Puppet&nbsp;</span></span></span><span style=\"color:#08233f;\"><span style=\"font-size:14px;\"><span style=\"font-weight:bold;\">Forge</span></span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":190.0,"y":317.0479797979797,"rotation":0.0,"id":92,"width":114.0,"height":60.0,"uid":"com.gliffy.shape.uml.uml_v2.class.association","order":33,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":86,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":101,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":0.0,"controlPath":[[-20.0,-221.29797979797968],[28.333875616030326,-221.29797979797968],[76.66775123206065,-221.29797979797968],[125.00162684809095,-221.29797979797968]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":95,"width":58.0,"height":28.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.3103413456674089,"linePerpValue":0.0,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;color:#08233f;font-style:italic;\">download</span></p><p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;color:#08233f;font-style:italic;\">deps into</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":315.0,"y":51.75,"rotation":0.0,"id":105,"width":90.0,"height":78.99999999999994,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":41,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":99,"width":90.00000000000003,"height":78.20202020202028,"uid":"com.gliffy.shape.iphone.iphone_ios7.icons_glyphs.glyph_folder","order":37,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.iphone.iphone_ios7.icons_glyphs.glyph_folder","strokeWidth":1.0,"strokeColor":"#000000","fillColor":"#0b5394","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":104,"width":86.00000000000003,"height":32.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;text-decoration:none;font-weight:bold;font-size:14px;\"><span style=\"text-decoration:none;\">&nbsp;</span></span></p><p style=\"text-align:center;\"><span style=\"font-family:Arial;text-decoration:none;font-weight:bold;font-size:14px;\"><span style=\"text-decoration:none;\">mods_dir/</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":0.0,"y":10.373737373737356,"rotation":0.0,"id":101,"width":89.95626822157442,"height":68.6262626262626,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":3,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#dde6f1","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":570.0,"y":50.75,"rotation":0.0,"id":106,"width":90.0,"height":78.99999999999994,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":44,"lockAspectRatio":false,"lockShape":false,"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":107,"width":90.00000000000003,"height":78.20202020202028,"uid":"com.gliffy.shape.iphone.iphone_ios7.icons_glyphs.glyph_folder","order":46,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.iphone.iphone_ios7.icons_glyphs.glyph_folder","strokeWidth":1.0,"strokeColor":"#000000","fillColor":"#0b5394","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":108,"width":86.00000000000003,"height":32.0,"uid":null,"order":49,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;text-decoration:none;font-weight:bold;font-size:14px;\"><span style=\"text-decoration:none;\">&nbsp;</span></span></p><p style=\"text-align:center;\"><span style=\"font-family:Arial;text-decoration:none;font-weight:bold;font-size:14px;\"><span style=\"text-decoration:none;\">tars_dir/</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":0.0,"y":10.373737373737356,"rotation":0.0,"id":109,"width":89.95626822157442,"height":68.6262626262626,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":43,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#dde6f1","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":527.0,"y":277.5479797979797,"rotation":0.0,"id":110,"width":1.0,"height":70.0,"uid":"com.gliffy.shape.basic.basic_v1.default.line","order":50,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":101,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":109,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-122.04676125071,-182.11111111111103],[-67.03117416714002,-182.11111111111103],[-12.01558708357004,-182.11111111111103],[43.0,-182.11111111111103]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":157,"width":56.0,"height":42.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.3998328425104944,"linePerpValue":0.0,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-style:italic;\">build</span></p><p style=\"text-align:center;\"><span style=\"font-style:italic;\">&nbsp;modules</span></p><p style=\"text-align:center;\"><span style=\"font-style:italic;\">&nbsp;into</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":280.0,"y":22.0,"rotation":0.0,"id":164,"width":170.0,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":63,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:&#39;Droid Sans Mono&#39;;font-size:14px;color:#980000;\"><span style=\"\">TEST_FORGE_mods_dir&#61;</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":530.0,"y":22.0,"rotation":0.0,"id":167,"width":170.0,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":64,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:&#39;Droid Sans Mono&#39;;font-size:14px;color:#980000;\"><span style=\"\">TEST_FORGE_tars_dir&#61;</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":20.0,"y":20.0,"rotation":0.0,"id":168,"width":180.0,"height":16.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":65,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:&#39;Droid Sans Mono&#39;;font-size:14px;color:#980000;\"><span style=\"\">TEST_FORGE_deps_forge&#61;</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":570.0,"y":152.5,"rotation":0.0,"id":174,"width":90.0,"height":70.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":66,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":0.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":"4,4","dropShadow":false,"state":0,"opacity":0.05,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.7999999999999998,"y":0.0,"rotation":0.0,"id":175,"width":86.4,"height":60.0,"uid":null,"order":68,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-size:18px;color:#08233f;\"><span style=\"font-weight:bold;\">Test</span></span></p><p style=\"text-align:center;\"><span style=\"font-size:18px;color:#08233f;\"><span style=\"font-weight:bold;\"> Puppet </span></span></p><p style=\"text-align:center;\"><span style=\"font-size:18px;color:#08233f;\"><span style=\"font-weight:bold;\">Forge</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":543.0,"y":237.5,"rotation":0.0,"id":176,"width":140.0,"height":32.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":69,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:&#39;Droid Sans Mono&#39;;font-size:14px;color:#980000;\"><span style=\"\">TEST_FORGE_port&#61;</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":40.0,"y":161.99999999999994,"rotation":0.0,"id":194,"width":120.0,"height":80.0,"uid":"com.gliffy.shape.basic.basic_v1.default.group","order":80,"lockAspectRatio":false,"lockShape":false,"children":[{"x":20.0,"y":20.0,"rotation":0.0,"id":192,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":76,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.9999999999999993,"y":0.0,"rotation":0.0,"id":193,"width":95.99999999999999,"height":32.0,"uid":null,"order":79,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"color:#08233f;\"><span style=\"font-size:14px;\"><span style=\"font-weight:bold;\">Modules Under Test</span></span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":10.0,"y":10.0,"rotation":0.0,"id":190,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":71,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.9999999999999993,"y":0.0,"rotation":0.0,"id":191,"width":95.99999999999999,"height":32.0,"uid":null,"order":74,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"color:#08233f;\"><span style=\"font-size:14px;\"><span style=\"font-weight:bold;\">Modules Under Test</span></span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":0.0,"y":0.0,"rotation":0.0,"id":89,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":29,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":1.9999999999999993,"y":0.0,"rotation":0.0,"id":90,"width":95.99999999999999,"height":32.0,"uid":null,"order":32,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"color:#08233f;\"><span style=\"font-size:14px;\"><span style=\"font-weight:bold;\">Modules Under Test</span></span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":221.0,"y":352.0479797979797,"rotation":0.0,"id":223,"width":114.0,"height":60.0,"uid":"com.gliffy.shape.uml.uml_v2.class.association","order":97,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":182,"py":0.9225888324873096,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":2,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":null,"controlPath":[[-61.0018686189278,-129.29797979797974],[69.00260033257291,-129.29797979797974],[199.00706928407362,-129.29797979797974],[329.01153823557433,-129.29797979797974]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":226,"width":160.0,"height":14.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.4666583842671357,"linePerpValue":0.0,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:&#39;Droid Sans Mono&#39;;font-size:12px;color:#08233f;font-style:italic;\">&#96;puppet module install &lt;MUT&gt;&#96;</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":260.0,"y":81.43686868686865,"rotation":0.0,"id":227,"width":30.0,"height":30.0,"uid":"com.gliffy.shape.uml.uml_v2.activity.jump_node","order":100,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2.0,"strokeColor":"#0b5a9f","fillColor":"#0b5a9f","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":228,"width":26.0,"height":16.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;text-decoration:none;font-weight:bold;font-size:14px;color:#dde6f1;\"><span style=\"text-decoration:none;\">1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":510.0,"y":79.43686868686865,"rotation":0.0,"id":233,"width":30.0,"height":30.0,"uid":"com.gliffy.shape.uml.uml_v2.activity.jump_node","order":103,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2.0,"strokeColor":"#0b5a9f","fillColor":"#0b5a9f","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":234,"width":26.0,"height":16.0,"uid":null,"order":105,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;text-decoration:none;font-weight:bold;font-size:14px;color:#dde6f1;\"><span style=\"text-decoration:none;\">2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":491.0,"y":208.99999999999994,"rotation":0.0,"id":235,"width":30.0,"height":30.0,"uid":"com.gliffy.shape.uml.uml_v2.activity.jump_node","order":106,"lockAspectRatio":true,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2.0,"strokeColor":"#0b5a9f","fillColor":"#0b5a9f","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":236,"width":26.0,"height":16.0,"uid":null,"order":108,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;text-decoration:none;font-weight:bold;font-size:14px;color:#dde6f1;\"><span style=\"text-decoration:none;\">3</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"}],"layers":[{"guid":"SvrSpaBCATJT","order":0,"name":"Layer 0","active":true,"locked":false,"visible":true,"nodeIndex":117}],"shapeStyles":{},"lineStyles":{"global":{"fill":"none","stroke":"#ff0000","strokeWidth":2,"dashStyle":"4.0,4.0","startArrow":2,"orthoMode":2}},"textStyles":{"global":{"bold":true,"italic":true,"underline":true,"face":"Droid Sans Mono","size":"14px","color":"#dde6f1"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.uml.uml_v2.activity","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default"],"lastSerialized":1461295719641,"analyticsProduct":"GJC"},"embeddedResources":{"index":0,"resources":[]}}
@@ -0,0 +1 @@
1
+ {"contentType":"application/gliffy+json","version":"1.3","stage":{"background":"#FFFFFF","width":646,"height":450,"nodeIndex":215,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":true,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":null,"printShrinkToFit":false,"printPortrait":false,"maxWidth":5000,"maxHeight":5000,"themeData":{"uid":"com.gliffy.theme.blueprint","name":"Blueprint","shape":{"primary":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#08233F"}},"secondary":{"strokeWidth":2,"strokeColor":"#08233F","fillColor":"#424D76","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#FFFFFF"}},"tertiary":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#08233F"}},"highlight":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"#0B599F","gradient":false,"dropShadow":false,"opacity":1,"text":{"color":"#ffffff"}}},"line":{"strokeWidth":2,"strokeColor":"#0B599F","fillColor":"none","arrowType":2,"interpolationType":"linear","cornerRadius":0,"text":{"color":"#08233F"}},"text":{"color":"#08233F"},"stage":{"color":"#FFFFFF"}},"viewportType":"default","fitBB":{"min":{"x":12,"y":62.74999999999994},"max":{"x":646,"y":449.24999999999994}},"printModel":{"pageSize":"a4","portrait":false,"fitToOnePage":false,"displayPageBreaks":false},"objects":[{"x":10.0,"y":69.25,"rotation":0.0,"id":14,"width":120.0,"height":44.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":0,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:underline;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"\">Success:</span></span></p><p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;color:#08233f;\"><span style=\"\">Module with dependency chain</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":139.0,"y":154.74999999999994,"rotation":0.0,"id":75,"width":114.0,"height":60.0,"uid":"com.gliffy.shape.uml.uml_v2.class.association","order":10,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":71,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":69,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":0.0,"controlPath":[[121.0,-62.0],[151.0,-62.0],[181.0,-62.0],[211.0,-62.0]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":160.0,"y":62.74999999999994,"rotation":0.0,"id":71,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":11,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":72,"width":96.0,"height":16.0,"uid":null,"order":13,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:none;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"text-decoration:none;\">mut1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":350.0,"y":62.74999999999994,"rotation":0.0,"id":69,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":14,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":70,"width":96.0,"height":16.0,"uid":null,"order":16,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:none;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"text-decoration:none;\">dep1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":540.0,"y":62.74999999999994,"rotation":0.0,"id":67,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":17,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":68,"width":96.0,"height":16.0,"uid":null,"order":19,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:none;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"text-decoration:none;\">de</span></span><span style=\"font-weight:bold;font-size:14px;color:#08233f;\"><span style=\"\">p2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":149.0,"y":164.74999999999994,"rotation":0.0,"id":77,"width":114.0,"height":60.0,"uid":"com.gliffy.shape.uml.uml_v2.class.association","order":20,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":69,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":67,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":0.0,"controlPath":[[301.0,-72.0],[331.0,-72.0],[361.0,-72.0],[391.0,-72.0]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":160.0,"y":179.24999999999994,"rotation":0.0,"id":35,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":1,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":37,"width":96.0,"height":16.0,"uid":null,"order":"auto","lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:none;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"text-decoration:none;\">mut1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":350.0,"y":179.24999999999994,"rotation":0.0,"id":38,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":4,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#ff0000","fillColor":"#f4cccc","gradient":false,"dashStyle":"8,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":39,"width":96.0,"height":16.0,"uid":null,"order":6,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:none;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"text-decoration:none;\">dep1</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":350.0,"y":389.24999999999994,"rotation":0.0,"id":40,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":7,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":41,"width":96.0,"height":16.0,"uid":null,"order":9,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:none;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"text-decoration:none;\">dep4</span></span><span style=\"font-weight:bold;text-decoration:none;font-size:14px;color:rgb(8, 35, 63);\"><span style=\"text-decoration:none;\">&nbsp;</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":162.0,"y":188.74999999999994,"rotation":0.0,"id":131,"width":67.0,"height":48.0,"uid":"com.gliffy.shape.uml.uml_v2.class.association","order":21,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":35,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":38,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#ff0000","fillColor":"none","dashStyle":"4.0,4.0","startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":0.0,"controlPath":[[98.0,20.5],[128.0,20.5],[158.0,20.5],[188.0,20.5]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":132,"width":21.0,"height":27.0,"uid":null,"order":23,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.4842105263157895,"linePerpValue":0.0,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;font-family:Arial;font-size:24px;color:rgb(255, 0, 0);\">X</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":450.0,"y":195.24999999999994,"rotation":0.0,"id":130,"width":90.0,"height":28.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":24,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-style:italic;\"><span style=\"font-family:Arial;font-size:12px;color:#980000;\"><span style=\"\">not availabl</span></span><span style=\"color:#980000;\"><span style=\"\">e on forge</span></span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":160.0,"y":303.24999999999994,"rotation":0.0,"id":151,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":25,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"#DDE6F1","gradient":false,"dashStyle":null,"dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":152,"width":96.0,"height":16.0,"uid":null,"order":27,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:none;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"text-decoration:none;\">mut2</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":350.0,"y":303.24999999999994,"rotation":0.0,"id":149,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":28,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#ff0000","fillColor":"#f4cccc","gradient":false,"dashStyle":"8,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":150,"width":96.0,"height":30.0,"uid":null,"order":30,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:none;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"text-decoration:none;\">dep3 </span></span></p><p style=\"text-align:center;\"><span style=\"text-decoration:none;font-family:Arial;font-size:12px;color:#08233f;\"><span style=\"text-decoration:none;\">~&gt; 0.2.0</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":162.0,"y":312.74999999999994,"rotation":0.0,"id":147,"width":67.0,"height":48.0,"uid":"com.gliffy.shape.uml.uml_v2.class.association","order":31,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":151,"py":0.29289321881345237,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":149,"py":0.2928932188134525,"px":1.1102230246251563E-16}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#ff0000","fillColor":"none","dashStyle":"4.0,4.0","startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":0.0,"controlPath":[[98.0,8.073593128807147],[128.0,8.073593128807147],[158.0,8.073593128807147],[188.0,8.073593128807147]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":148,"width":21.0,"height":27.0,"uid":null,"order":33,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.4842105263157895,"linePerpValue":0.0,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;font-family:Arial;font-size:24px;color:rgb(255, 0, 0);\">X</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":480.0,"y":308.75,"rotation":0.0,"id":146,"width":90.0,"height":14.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":34,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"color:#980000;\"><span style=\"font-style:italic;\">conflicts</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":530.0,"y":389.24999999999994,"rotation":0.0,"id":201,"width":100.0,"height":60.0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","order":35,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2.0,"strokeColor":"#ff0000","fillColor":"#f4cccc","gradient":false,"dashStyle":"8,2","dropShadow":false,"state":0,"opacity":1.0,"shadowX":0.0,"shadowY":0.0}},"linkMap":[],"children":[{"x":2.0,"y":0.0,"rotation":0.0,"id":202,"width":96.0,"height":30.0,"uid":null,"order":37,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":8,"paddingRight":8,"paddingBottom":8,"paddingLeft":8,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:none;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"text-decoration:none;\">dep3 </span></span></p><p style=\"text-align:center;\"><span style=\"text-decoration:none;font-family:Arial;font-size:12px;color:#08233f;\"><span style=\"text-decoration:none;\">&#61; 0.1.0</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":149.0,"y":154.74999999999994,"rotation":0.0,"id":203,"width":114.0,"height":60.0,"uid":"com.gliffy.shape.uml.uml_v2.class.association","order":38,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":151,"py":0.7071067811865475,"px":0.9999999999999998}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":40,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#0B599F","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":0.0,"controlPath":[[111.0,190.92640687119285],[156.0,190.92640687119285],[156.0,264.5],[201.0,264.5]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":384.0,"y":354.74999999999994,"rotation":0.0,"id":204,"width":67.0,"height":48.0,"uid":"com.gliffy.shape.uml.uml_v2.class.association","order":39,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":40,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":201,"py":0.5,"px":0.0}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#ff0000","fillColor":"none","dashStyle":"4.0,4.0","startArrow":0,"endArrow":2,"startArrowRotation":"auto","endArrowRotation":"auto","interpolationType":"linear","cornerRadius":0.0,"controlPath":[[66.0,64.5],[92.66666666666669,64.5],[119.33333333333331,64.5],[146.0,64.5]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":205,"width":21.0,"height":27.0,"uid":null,"order":41,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.4842105263157895,"linePerpValue":0.0,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;font-family:Arial;font-size:24px;color:rgb(255, 0, 0);\">X</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":10.0,"y":180.24999999999994,"rotation":0.0,"id":209,"width":120.0,"height":58.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":42,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:underline;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"\">Fail Test 1:</span></span></p><p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;color:#08233f;\"><span style=\"\">Module with dependency missing from Forge</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":10.0,"y":306.75,"rotation":0.0,"id":210,"width":120.0,"height":44.0,"uid":"com.gliffy.shape.basic.basic_v1.default.text","order":43,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"none","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":null,"linePerpValue":null,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-weight:bold;text-decoration:underline;font-family:Arial;font-size:14px;color:#08233f;\"><span style=\"\">Fail Test 2:</span></span></p><p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:12px;color:#08233f;\"><span style=\"\">Module with dependency conflicts</span></span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"linkMap":[],"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"},{"x":422.0,"y":313.74999999999994,"rotation":0.0,"id":212,"width":67.0,"height":48.0,"uid":"com.gliffy.shape.uml.uml_v2.class.association","order":44,"lockAspectRatio":false,"lockShape":false,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":149,"py":0.5,"px":1.0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":201,"py":0.0,"px":0.5}}},"graphic":{"type":"Line","Line":{"strokeWidth":2.0,"strokeColor":"#ff0000","fillColor":"none","dashStyle":"4.0,4.0","startArrow":0,"endArrow":0,"startArrowRotation":0.4937848525479958,"endArrowRotation":83.55342581703539,"interpolationType":"quadratic","cornerRadius":null,"controlPath":[[28.0,19.5],[158.0,19.5],[158.0,75.5]],"lockSegments":{},"ortho":true}},"linkMap":[],"children":[{"x":0.0,"y":0.0,"rotation":0.0,"id":213,"width":28.0,"height":41.0,"uid":null,"order":46,"lockAspectRatio":false,"lockShape":false,"graphic":{"type":"Text","Text":{"overflow":"both","paddingTop":2,"paddingRight":2,"paddingBottom":2,"paddingLeft":2,"outerPaddingTop":6,"outerPaddingRight":6,"outerPaddingBottom":2,"outerPaddingLeft":6,"type":"fixed","lineTValue":0.4842105263157895,"linePerpValue":0.0,"cardinalityType":null,"html":"<p style=\"text-align:center;\"><span style=\"font-family:Arial;font-size:36px;color:#ff0000;\">X</span></p>","tid":null,"valign":"middle","vposition":"none","hposition":"none"}},"children":[],"hidden":false,"layerId":"SvrSpaBCATJT"}],"hidden":false,"layerId":"SvrSpaBCATJT"}],"layers":[{"guid":"SvrSpaBCATJT","order":0,"name":"Layer 0","active":true,"locked":false,"visible":true,"nodeIndex":47}],"shapeStyles":{},"lineStyles":{"global":{"fill":"none","stroke":"#6589a8","strokeWidth":2,"dashStyle":"4.0,4.0","orthoMode":2}},"textStyles":{"global":{"bold":true,"underline":true,"face":"Droid Sans Mono","size":"36px","color":"#980000"}}},"metadata":{"title":"untitled","revision":0,"exportBorder":false,"loadPosition":"default","libraries":["com.gliffy.libraries.uml.uml_v2.activity","com.gliffy.libraries.flowchart.flowchart_v1.default","com.gliffy.libraries.basic.basic_v1.default","com.gliffy.libraries.swimlanes.swimlanes_v1.default"],"lastSerialized":1461296023550,"analyticsProduct":"GJC"},"embeddedResources":{"index":0,"resources":[]}}
@@ -0,0 +1,207 @@
1
+ require 'simp/module/repoclosure/version'
2
+ require 'json'
3
+ require 'yaml'
4
+ require 'pry'
5
+ require 'tmpdir'
6
+ require 'fileutils'
7
+ require 'puppet_forge_server'
8
+ require 'parallel'
9
+ require 'colorize'
10
+
11
+ module Simp
12
+ module Module
13
+ class Repoclosure
14
+ attr_accessor :verbose, :port, :upstream_puppet_forge
15
+ def initialize( tars_dir = nil, mods_dir = nil )
16
+
17
+ # URL of upstream Puppet Forge to provide deps served by the test forge
18
+ #
19
+ # NOTE: The upstream forge will not be used if either of the env vars
20
+ # `TEST_FORGE_mods_dir` or `TEST_FORGE_tars_dir` are present.
21
+ @upstream_puppet_forge= ENV.fetch('TEST_FORGE_deps_forge',
22
+ 'https://forgeapi.puppetlabs.com')
23
+ @verbose = ENV.fetch('VERBOSE', 0).to_i
24
+ @port = ENV['TEST_FORGE_port'] || 8080
25
+
26
+ # directory of tarballs for local forge
27
+ @tars_dir = tars_dir || ENV.fetch('TEST_FORGE_tars_dir', nil)
28
+
29
+ # directory to keep unarchived module dependencies
30
+ @mods_dir = mods_dir || ENV.fetch('TEST_FORGE_mods_dir', nil)
31
+
32
+ @startup_delay = 5 # seconds to wait for forge to start before testing
33
+ @parallel_timeout = 300 # seconds to wait before killing all processes
34
+ end
35
+
36
+ def verbose?( level = 1 )
37
+ @verbose >= level
38
+ end
39
+
40
+ def v1( msg, level = 1 )
41
+ puts msg.colorize( :blue ) if verbose? 1
42
+ end
43
+
44
+
45
+ # mut_dirs = Array of (String) diectory paths to each module-to-test
46
+ def test_modules( mut_dirs )
47
+ Dir.chdir '/tmp' # ensure we start in a real directory
48
+ tmp_dirs = [] # a list of directories we need to ensure are removed
49
+ muts = [] # a list of forge names for MUTs
50
+ success = false
51
+
52
+ begin
53
+ if @tars_dir.nil?
54
+ tmp_dirs << @tars_dir = Dir.mktmpdir('fakeforge_tars_dir_')
55
+ if @mods_dir.nil?
56
+ tmp_dirs << @mods_dir = Dir.mktmpdir('fakeforge_mods_dir_')
57
+ end
58
+ end
59
+
60
+ # prepare a local forge to test against
61
+ # -------------------------------------------------------------------
62
+ # gather each module's forge name
63
+ mut_dirs.each do |module_dir|
64
+ mj_path = File.expand_path('metadata.json', module_dir)
65
+ metadata = JSON.parse(File.read(mj_path))
66
+ muts << metadata.fetch('name')
67
+ end
68
+
69
+ # - download deps for each MUT (unless provided with a mods_dir)
70
+ # - build tars from each MUT/dep (unless provided with a tars_dir)
71
+ if @mods_dir
72
+ if tmp_dirs.include?( @mods_dir )
73
+ mut_dirs.each do |module_dir|
74
+ download_mut_deps( module_dir )
75
+ end
76
+ end
77
+ mod_dirs = Dir[File.join(@mods_dir,'*')].select{|x| File.directory? x}
78
+ package_tarballs( mod_dirs )
79
+ end
80
+
81
+ # test the puppet modules in `mut_dirs` against local forge
82
+ # -------------------------------------------------------------------
83
+ Dir.mktmpdir('fakeforge_pupmod_inst_dir_') do |pupmod_install_dir|
84
+ success = test_with_local_forge( muts, pupmod_install_dir )
85
+ end
86
+
87
+ ensure
88
+ tmp_dirs.each do |dir|
89
+ Dir.chdir '/tmp'
90
+ FileUtils.remove_entry dir, :verbose => verbose?
91
+ end
92
+ end
93
+ success
94
+ end
95
+
96
+
97
+ def test_with_local_forge( muts, pupmod_install_dir )
98
+ pidfile = File.join(pupmod_install_dir,'fakeforge.pidfile')
99
+ success = false
100
+
101
+ Parallel.map([:forge,:mut_installer,:process_timeout], in_processes: 3) do |x|
102
+ Dir.chdir '/tmp'
103
+ if x == :forge
104
+ start_local_forge(pidfile)
105
+ elsif x == :mut_installer
106
+ sleep @startup_delay # safety wait for forge to spin up (never needed yet)
107
+ success = test_install(muts, pupmod_install_dir)
108
+ raise Parallel::Kill # stops both Parallels
109
+ elsif x == :process_timeout
110
+ sleep @parallel_timeout
111
+ raise Parallel::Kill # stops both Parallels
112
+ end
113
+ end
114
+ report_files = Dir[File.join( pupmod_install_dir, "*.result.yaml")]
115
+
116
+ reports = []
117
+ report_files.each do |report_file|
118
+ report = YAML.load_file report_file
119
+ reports << report.fetch(:success)
120
+ end
121
+ reports.uniq!
122
+ if reports.size == 1 && reports.first == true
123
+ success = true
124
+ end
125
+
126
+ if report_files.empty?
127
+ warn "WARNING: no test reports were generated in '#{pupmod_install_dir}'"
128
+ warn "WARNING: (cont'd) marking test as `failed`"
129
+ success = false
130
+ end
131
+
132
+ return success
133
+ end
134
+
135
+ # Starts a local puppet forge on port `@port`.
136
+ def start_local_forge(pidfile)
137
+ puts "Starting fake forge (module-dir: '#{@tars_dir}' pidfile: '#{pidfile}'"
138
+ PuppetForgeServer::Server.new.go([
139
+ '--port', @port,
140
+ '--bind', 'localhost',
141
+ '--module-dir', @tars_dir,
142
+ '--pidfile', pidfile
143
+ ])
144
+ end
145
+
146
+ def test_install( muts, pupmod_install_dir )
147
+ success = false
148
+ muts.each do |mut|
149
+ report_file = File.join( pupmod_install_dir, "#{mut}.result.yaml" )
150
+ cmd = "puppet module install #{mut} " +
151
+ "--module_repository=http://localhost:#{@port} " +
152
+ "--modulepath=#{pupmod_install_dir} " +
153
+ "--target-dir=#{pupmod_install_dir}"
154
+ v1 "RUNNING TEST: `#{cmd}`"
155
+ success = system(cmd)
156
+ puts "$? = '#{$?}'"; puts "xxx success='#{success}'"
157
+ unless success
158
+ puts ("mods_dir: " + @mods_dir.rjust(79)).colorize(:background => :red)
159
+ puts `ls -la "#{@tars_dir}"`
160
+ puts ("tars_dir: " + @tars_dir.rjust(79)).colorize(:background => :red)
161
+ puts `ls -la "#{@tars_dir}"`
162
+ end
163
+ report = {:success => success, :cmd=>cmd, :output=>'tbd'}
164
+ File.open(report_file,'w'){|f| f.puts report.to_yaml }
165
+ end
166
+ success
167
+ end
168
+
169
+ # download all of the MUT's (declared) dependencies from an upstream
170
+ # puppet forge into `@mods_dir/`
171
+ def download_mut_deps( mut_dir )
172
+ FileUtils.chdir mut_dir, :verbose => verbose?
173
+ cmd = "puppet module build --render-as=json"
174
+ puts cmd if verbose?
175
+ tgz = `#{cmd}`.split("\n").last.gsub('"','')
176
+ puts "built module archive: #{tgz}" if verbose?
177
+ cmd = "puppet module install #{tgz} " +
178
+ "--module_repository=#{@upstream_puppet_forge} " +
179
+ "--modulepath=#{@mods_dir} --target-dir=#{@mods_dir}"
180
+ v1 cmd
181
+ out = `#{cmd}`
182
+ v1 out
183
+
184
+ # add the
185
+ FileUtils.cp tgz, @tars_dir, :verbose => verbose?
186
+ end
187
+
188
+
189
+ # build a tarball of each module (in a directory of modules)
190
+ # mods_dirs = Array of paths to directories of modules
191
+ def package_tarballs( mods_dirs )
192
+ pwd = Dir.pwd
193
+ mods_dirs.each do |module_dir|
194
+ next unless File.directory? module_dir
195
+ FileUtils.chdir module_dir, :verbose => (verbose?)
196
+
197
+ cmd = "puppet module build --render-as=json"
198
+ puts cmd if verbose?
199
+ tgz = `#{cmd}`.split("\n").last.gsub('"','')
200
+ puts "--[tgz] built module archive: #{tgz}" if verbose?
201
+ FileUtils.cp tgz, @tars_dir, :verbose => verbose?
202
+ end
203
+ FileUtils.chdir pwd, :verbose => verbose?
204
+ end
205
+ end
206
+ end
207
+ end
@@ -0,0 +1,27 @@
1
+ #
2
+ # Licensed to the Apache Software Foundation (ASF) under one
3
+ # or more contributor license agreements. See the NOTICE file
4
+ # distributed with this work for additional information
5
+ # regarding copyright ownership. The ASF licenses this file
6
+ # to you under the Apache License, Version 2.0 (the
7
+ # "License"); you may not use this file except in compliance
8
+ # with the License. You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing,
13
+ # software distributed under the License is distributed on an
14
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ # KIND, either express or implied. See the License for the
16
+ # specific language governing permissions and limitations
17
+ # under the License.
18
+ #
19
+
20
+ module Simp
21
+ module Module
22
+ class Repoclosure
23
+ # simp-module-repoclosure version
24
+ VERSION = "0.1.0"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,40 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'simp/module/repoclosure/version'
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = "simp-module-repoclosure"
9
+ gem.version = Simp::Module::Repoclosure::VERSION
10
+ gem.summary = %q{Test Puppet modules' dependency declarations with a local Puppet Forge}
11
+ gem.description = %q{~~Stupidly~~ Admirably direct repoclosure for a Puppet module's `metadata.json`}
12
+ gem.license = "Apache-2.0"
13
+ gem.authors = ["Chris Tessmer"]
14
+ gem.email = "simp@simp-project.org"
15
+ gem.homepage = "https://github.com/simp/rubygem-simp-module-repoclosure"
16
+
17
+ gem.files = `git ls-files`.split($/)
18
+
19
+ `git submodule --quiet foreach --recursive pwd`.split($/).each do |submodule|
20
+ submodule.sub!("#{Dir.pwd}/",'')
21
+
22
+ Dir.chdir(submodule) do
23
+ `git ls-files`.split($/).map do |subpath|
24
+ gem.files << File.join(submodule,subpath)
25
+ end
26
+ end
27
+ end
28
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
29
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
30
+ gem.require_paths = ['lib']
31
+
32
+ gem.add_development_dependency 'bundler', '~> 1.7'
33
+ gem.add_development_dependency 'rake', '~> 10.0'
34
+ gem.add_development_dependency 'rspec', '~> 3.0'
35
+ gem.add_development_dependency 'yard', '~> 0.8'
36
+ gem.add_runtime_dependency 'puppet'
37
+ gem.add_runtime_dependency 'parallel', '~> 1.8'
38
+ gem.add_runtime_dependency 'puppet-forge-server', '~> 1.9'
39
+ gem.add_runtime_dependency 'colorize', '~> 0.7'
40
+ end
@@ -0,0 +1,14 @@
1
+ source ENV['GEM_SOURCE'] || 'https://rubygems.org'
2
+
3
+ puppetversion = ENV.key?('PUPPET_VERSION') ? "#{ENV['PUPPET_VERSION']}" : ['>= 3.3']
4
+ gem 'metadata-json-lint'
5
+ gem 'puppet', puppetversion
6
+ gem 'puppetlabs_spec_helper', '>= 1.0.0'
7
+ gem 'puppet-lint', '>= 1.0.0'
8
+ gem 'facter', '>= 1.7.0'
9
+ gem 'rspec-puppet'
10
+
11
+ # rspec must be v2 for ruby 1.8.7
12
+ if RUBY_VERSION >= '1.8.7' and RUBY_VERSION < '1.9'
13
+ gem 'rspec', '~> 2.0'
14
+ end
@@ -0,0 +1,83 @@
1
+ # dep1
2
+
3
+ #### Table of Contents
4
+
5
+ 1. [Description](#description)
6
+ 1. [Setup - The basics of getting started with dep1](#setup)
7
+ * [What dep1 affects](#what-dep1-affects)
8
+ * [Setup requirements](#setup-requirements)
9
+ * [Beginning with dep1](#beginning-with-dep1)
10
+ 1. [Usage - Configuration options and additional functionality](#usage)
11
+ 1. [Reference - An under-the-hood peek at what the module is doing and how](#reference)
12
+ 1. [Limitations - OS compatibility, etc.](#limitations)
13
+ 1. [Development - Guide for contributing to the module](#development)
14
+
15
+ ## Description
16
+
17
+ Start with a one- or two-sentence summary of what the module does and/or what
18
+ problem it solves. This is your 30-second elevator pitch for your module.
19
+ Consider including OS/Puppet version it works with.
20
+
21
+ You can give more descriptive information in a second paragraph. This paragraph
22
+ should answer the questions: "What does this module *do*?" and "Why would I use
23
+ it?" If your module has a range of functionality (installation, configuration,
24
+ management, etc.), this is the time to mention it.
25
+
26
+ ## Setup
27
+
28
+ ### What dep1 affects **OPTIONAL**
29
+
30
+ If it's obvious what your module touches, you can skip this section. For
31
+ example, folks can probably figure out that your mysql_instance module affects
32
+ their MySQL instances.
33
+
34
+ If there's more that they should know about, though, this is the place to mention:
35
+
36
+ * A list of files, packages, services, or operations that the module will alter,
37
+ impact, or execute.
38
+ * Dependencies that your module automatically installs.
39
+ * Warnings or other important notices.
40
+
41
+ ### Setup Requirements **OPTIONAL**
42
+
43
+ If your module requires anything extra before setting up (pluginsync enabled,
44
+ etc.), mention it here.
45
+
46
+ If your most recent release breaks compatibility or requires particular steps
47
+ for upgrading, you might want to include an additional "Upgrading" section
48
+ here.
49
+
50
+ ### Beginning with dep1
51
+
52
+ The very basic steps needed for a user to get the module up and running. This
53
+ can include setup steps, if necessary, or it can be an example of the most
54
+ basic use of the module.
55
+
56
+ ## Usage
57
+
58
+ This section is where you describe how to customize, configure, and do the
59
+ fancy stuff with your module here. It's especially helpful if you include usage
60
+ examples and code samples for doing things with your module.
61
+
62
+ ## Reference
63
+
64
+ Here, include a complete list of your module's classes, types, providers,
65
+ facts, along with the parameters for each. Users refer to this section (thus
66
+ the name "Reference") to find specific details; most users don't read it per
67
+ se.
68
+
69
+ ## Limitations
70
+
71
+ This is where you list OS compatibility, version compatibility, etc. If there
72
+ are Known Issues, you might want to include them under their own heading here.
73
+
74
+ ## Development
75
+
76
+ Since your module is awesome, other users will want to play with it. Let them
77
+ know what the ground rules for contributing are.
78
+
79
+ ## Release Notes/Contributors/Etc. **Optional**
80
+
81
+ If you aren't using changelog, put your release notes here (though you should
82
+ consider using changelog). You can also add any additional sections you feel
83
+ are necessary or important to include here. Please use the `## ` header.
@@ -0,0 +1,17 @@
1
+ require 'puppetlabs_spec_helper/rake_tasks'
2
+ require 'puppet-lint/tasks/puppet-lint'
3
+ PuppetLint.configuration.send('disable_80chars')
4
+ PuppetLint.configuration.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp"]
5
+
6
+ desc "Validate manifests, templates, and ruby files"
7
+ task :validate do
8
+ Dir['manifests/**/*.pp'].each do |manifest|
9
+ sh "puppet parser validate --noop #{manifest}"
10
+ end
11
+ Dir['spec/**/*.rb','lib/**/*.rb'].each do |ruby_file|
12
+ sh "ruby -c #{ruby_file}" unless ruby_file =~ /spec\/fixtures/
13
+ end
14
+ Dir['templates/**/*.erb'].each do |template|
15
+ sh "erb -P -x -T '-' #{template} | ruby -c"
16
+ end
17
+ end
@@ -0,0 +1,48 @@
1
+ # Class: dep1
2
+ # ===========================
3
+ #
4
+ # Full description of class dep1 here.
5
+ #
6
+ # Parameters
7
+ # ----------
8
+ #
9
+ # Document parameters here.
10
+ #
11
+ # * `sample parameter`
12
+ # Explanation of what this parameter affects and what it defaults to.
13
+ # e.g. "Specify one or more upstream ntp servers as an array."
14
+ #
15
+ # Variables
16
+ # ----------
17
+ #
18
+ # Here you should define a list of variables that this module would require.
19
+ #
20
+ # * `sample variable`
21
+ # Explanation of how this variable affects the function of this class and if
22
+ # it has a default. e.g. "The parameter enc_ntp_servers must be set by the
23
+ # External Node Classifier as a comma separated list of hostnames." (Note,
24
+ # global variables should be avoided in favor of class parameters as
25
+ # of Puppet 2.6.)
26
+ #
27
+ # Examples
28
+ # --------
29
+ #
30
+ # @example
31
+ # class { 'dep1':
32
+ # servers => [ 'pool.ntp.org', 'ntp.local.company.com' ],
33
+ # }
34
+ #
35
+ # Authors
36
+ # -------
37
+ #
38
+ # Author Name <author@domain.com>
39
+ #
40
+ # Copyright
41
+ # ---------
42
+ #
43
+ # Copyright 2016 Your name here, unless otherwise noted.
44
+ #
45
+ class dep1 {
46
+
47
+
48
+ }