This is page 432 of 445. Use http://codebase.md/tosin2013/mcp-adr-analysis-server?lines=true&page={x} to view the full context. # Directory Structure ``` ├── .commitlintrc.json ├── .editorconfig ├── .eslintrc.json ├── .github │ ├── AUTO-RELEASE-GUIDE.md │ ├── auto-release.config.json │ ├── dependabot.yml │ ├── release-drafter.yml │ └── workflows │ ├── ai-release-notes.yml │ ├── auto-release-on-merge.yml │ ├── build.yml │ ├── codeql-analysis.yml │ ├── dependabot-auto-release.yml │ ├── dependencies.yml │ ├── deploy-docusaurus.yml │ ├── lint.yml │ ├── publish.yml │ ├── release-drafter.yml │ ├── security-scanning.yml │ ├── test.yml │ ├── update-dashboard.yml │ └── validate-patterns.yml ├── .gitignore ├── .gitleaks.toml ├── .husky │ ├── pre-commit │ └── pre-push ├── .npm-cache │ ├── _cacache │ │ ├── content-v2 │ │ │ └── sha512 │ │ │ ├── 03 │ │ │ │ └── aa │ │ │ │ └── 7fa6effa7f205c0354d1cff1aa5983d58a996b7ed716da0642f6aefd9e0342280791fd7de070475740797828d5d5fb7c20209d423e4250dc81ccea572cc8 │ │ │ ├── 04 │ │ │ │ └── 72 │ │ │ │ └── 7f10aaee348a897ff41a86fc704195caca0390db9ea6c9e37f130f931dc01ae6af8f8f24d330c78d402e03670e40c1fbde96c52b03a07aecd28ca970dbcd │ │ │ ├── 05 │ │ │ │ └── 1e │ │ │ │ └── 43b4d472f80b30589102c80d7baa1503bebac267acd73827e4418e734a66fde815546e9540bf4dd6a5c8dcc2d0b088b6c800dc7781e6c739c5d89f5107a3 │ │ │ ├── 06 │ │ │ │ ├── 36 │ │ │ │ │ └── ac5238b13c5752f8d2a4ca9732c8de4f9a0f373a5b2dd3e73abc6a2fd1d8b04c4a3a9a076a551ea1c5c12016e87842b02ced173ef4ab8627d4d50a3d19ce │ │ │ │ └── ce │ │ │ │ └── 31fb3fed118c646f6e00945cceb9a34fecdd5adcad388f7f5669a78f520f94152c7b9705050d2b75271ad435ef9a02ef0076d755fb4a971560ee12af01aa │ │ │ ├── 07 │ │ │ │ └── 9c │ │ │ │ └── 64367edfde90cc006ec5f3bb7de4729249d8a6109e6623a81d91a3352eae9898510906396501c4ade6c1218f61a2a89bbd181585d158fc7f4821631e91b3 │ │ │ ├── 0a │ │ │ │ └── e5 │ │ │ │ └── 1eac2045db1c8aebb0151acc0ca1816a3be8edf3c55498ca5db667c882c91dcdb2d06b3275d5f2f7b2d3a899ac30a2eda148d0b6de8a8b7bab545b939c25 │ │ │ ├── 0c │ │ │ │ ├── 4b │ │ │ │ │ └── d5d99176af6ffadd5fad2bc850beb4766469f5d2cac76d7be24e572fecaa73c3c8d688d4ea6d58233b7218f11c6bace505f153cc410172b18618bf4619c7 │ │ │ │ └── f7 │ │ │ │ └── b9a5515a02c8a749a57a42343a81d89e7560dc4426d4ba241f41adb099657bfb10bd6c6ba5188f3e4dd466a059003da05793c0ab01b9e56362129e2278ed │ │ │ ├── 0d │ │ │ │ ├── 45 │ │ │ │ │ └── 89af7f942e9e335e6a25fd266415fdc91ac4bdfd222ff98dd1b7ddff5233e90e99250797f57abe0edcf3886d4b9427715782ab5ed90ed2ad4eb302ac24f3 │ │ │ │ ├── 6b │ │ │ │ │ └── 4980e8d959c39aa171daa68623bfec5c3d968e5d78a0d9d2773930f4d67dd7e0916e81dbf5740ca364b6e316d1866355a0a728d2f4ab857acfe89a0fbc3d │ │ │ │ ├── a8 │ │ │ │ │ └── 60c4a2eb1b2e30279d36798085e5e115a314910a1d1d21efb968601a78bfac7b2cca627390009fa368b3d36ef75f0f53bb7ab05a745704f5440c96bb70e2 │ │ │ │ └── c4 │ │ │ │ └── 630c2ba32bf90293f7147bc5f3f194a99bc992de634da6d6be8c6080e944840df92d94dbe6d7e22e67d7937036cd938d411f0a471de5be37594a0b3e333b │ │ │ ├── 0e │ │ │ │ └── 84 │ │ │ │ └── ba988a9e094e474eedc514f9cc47bab77688bad0caf4ecd3b9661705bc3adc6f0a83799741b7753ef2ac98f307f4b80126e8caa67cdd487afd1facf842d5 │ │ │ ├── 11 │ │ │ │ └── 3c │ │ │ │ └── d5f5465209faebee25f63e9010bca5a554329ecb0d2da692e3f85001c26a19be9576bd25986d6d89965521d8cf21826a95862f6846645a97866ddaebc8f7 │ │ │ ├── 13 │ │ │ │ └── fe │ │ │ │ └── 41ffc9210c7229cb80999a03c1c4ea99e9c57b3bad67b57950b352fd0d5e2c8599a3dac95f26e215279550e4c24123b4bf4164476ce6d5eea9277a2ce45e │ │ │ ├── 14 │ │ │ │ └── 98 │ │ │ │ └── 584680da89ab5f12450af072a589c9aeff7486143e75ab78ad2831a8493cac4090677ce7315391b19e113513ab2807be8c6d3d0c06d9ca26e5f2031fbde9 │ │ │ ├── 15 │ │ │ │ ├── d5 │ │ │ │ │ └── 9bc5ffd5b08ba922af15c5bede73eff1e4e91ea1fe37ecfd69c1b77566679c911d4211fb42c58b3967095cd58dcbc24f20436f4130241e1de1468365610d │ │ │ │ ├── e7 │ │ │ │ │ └── 70d1a66f921ca7a0f625039597acc080326fa7496759b7a973250ece93c4ba43e56c1e61e94569dd55127c05ed196e47cf7392d1607fb95ebcd770478b45 │ │ │ │ └── f2 │ │ │ │ └── a8e7b707e5e9518303c730748c6ee0a0140aac2c0c1c360e3a7e09c3973c78a2d38f23929df83daee2fe7aea3568f9a19705d2f5ce53d3a701c0498f3264 │ │ │ ├── 16 │ │ │ │ ├── 1f │ │ │ │ │ └── 6b18dd0ca08e191543727c554d538cbd2d4cfddeef7fd0afb22e00366f04688f133c254d43cafbcc05a6e764f060316444009bd4da38d5ceaf8bac552097 │ │ │ │ ├── 40 │ │ │ │ │ └── 4cc03faa6c641e32ed5c3879ee181eb1e32ccf8e1a3c6a9e56b5b109dbaba6860a955db85e90a5103be85910bd6f53dd9adf01f0769d0701ca80505e620e │ │ │ │ ├── 76 │ │ │ │ │ └── 62b03e9b3ac2ad016d1c2e26de5d25f280e9f820e5333eb411c7320ad87d8fd403b83797bb1f53c0ae988397e083c5a2c30338d5f551502047d079ad6620 │ │ │ │ └── 90 │ │ │ │ └── c3f63e1e16b74a41b3552260bcd4e17f30731bcbc70d5170b5b885b1514c6949190b345113994f940dd20289e16008cca66d9f36df967a08025e6ddc15d7 │ │ │ ├── 17 │ │ │ │ ├── a7 │ │ │ │ │ └── a82deef4e79206e8790cdfaf87f07ccfde91a8387651bafd6d2097ee237b48abea1f9d4c29dbfbf95578912441b579fa6312bc2cf178543fe8a663fecb7e │ │ │ │ └── e3 │ │ │ │ └── 35b4b84efa695068e5aca44f16b2d83ecfa3f0c7045df2843c21771e5b3f7691f0266a54d17f4123ae8b907a8ed0b2c10f7c29f4e41e0886cd4af5643fef │ │ │ ├── 18 │ │ │ │ ├── 17 │ │ │ │ │ └── 2c6f66933d8224db098964aaebb84a14c275ad10bda78ae0d6066b062e3f676c3acc3457d01605912d328043e2b8af2affafa904fb4205724e71d0189edd │ │ │ │ └── cc │ │ │ │ └── 46c566c580d2b56df24eb14f496c62d30cc42ea9879071b0028c9404d1cca53c7f27e7b05b92922605872b322b7e9109391143c39757ff9cee0c5ee96bd4 │ │ │ ├── 1c │ │ │ │ └── fc │ │ │ │ └── 29188ce4976f265b266a1b9da38aa0c9d76c1a3f5d4f6b5946a22c9490812e30b04fd2878afc2f3d7ac6d7af1b24cb9c1eedd7ddf14e7c9e6d128005a957 │ │ │ ├── 1d │ │ │ │ └── 38 │ │ │ │ └── 605604f39c56109b865b34b66e0bfeb2f6b04d676074fbc378d1983d84cf2c58603121897c729da17ba39321fc7831535a0670947ab1bc2b11455a98dbc8 │ │ │ ├── 1e │ │ │ │ └── 93 │ │ │ │ └── 21f3ea1a86621d3ae4b968528a63a3f2a20f8535a655fd7c893aaedbe18170b051dee7261f75b21a948e24def5369d20ea97b62c92652c787b11ac9a883c │ │ │ ├── 1f │ │ │ │ └── 1b │ │ │ │ └── e177266c2b98bff3d459b4e608fa2437800ac9b4dd6e69f1b8cde4c8435319f627ca5417a0c62131c11ab8ddab308c01bbcdded77501b31478037d52a2c4 │ │ │ ├── 20 │ │ │ │ └── de │ │ │ │ └── b0e0f4f8d27d6a4f04764ae0520cf3dd978c855f06065f84e0e7591f6e4fb14688f083a26c0ab279d66799273bce2f96abdf74c0a9d6db9b290a7443aaa6 │ │ │ ├── 21 │ │ │ │ └── c8 │ │ │ │ └── 4d7fa74de2d1e8305227ffb384f0b599d7d63aabfebb0667fabe719112ff1149b0556fd2cf27111c9f0adcc17ea2c52bda886a2898052fbb8612c57ad583 │ │ │ ├── 22 │ │ │ │ ├── 5d │ │ │ │ │ └── 3e6e813bc3f5de6d41f2063ae813e0db072391191f4a2a6213cdb47b3324386a4a4e4583ff6666e102bd031bb466981aa83a765dcb6425bda8c9d90039f6 │ │ │ │ └── df │ │ │ │ └── bd43e119bfcdc65fadc88ec5d0e51220fc5160d3683f632fbe344309e1ee65344c0125a61caa86902199070998d5fa2046a296ce310a76bda954f2ab7ecc │ │ │ ├── 23 │ │ │ │ └── 7d │ │ │ │ └── 11c9d3be6e79f63d0cedbe8db9b6cc0f1fec050637a1546b666a0914efcc8c7704f055fd76c2700e17e01e3fc4b637cc43fb950f6c686451f3f2bd3fa6c1 │ │ │ ├── 24 │ │ │ │ ├── 6e │ │ │ │ │ └── 701d2dbef953d94fc775ac26e8374d60c74e5e221e452dab052146a41e5b65eaa638e4bba6b2be1ff23951e04fd0d7e3481dc3290517fc4f227d48d0063f │ │ │ │ └── 91 │ │ │ │ └── 3565ad4d45f0f351efc14f7d18e388db111fd7528201d413f939472e5a090b71720982f2cd78636067b5fdb154787e13b0198bd5a97b086d7db432edb8c0 │ │ │ ├── 25 │ │ │ │ └── 31 │ │ │ │ └── 7df54ffa5c88c2068d30aa4539b0ad7482561edbb31146c7f0a22ab9cf338464b1d4dc0dca08c6b95ff6b37a4611089d0797023472b0174bfe5d1074f30e │ │ │ ├── 27 │ │ │ │ ├── ba │ │ │ │ │ └── 7ade1462023c35343130c355bb8b7efe07222b3963b95d0400cd9dd539c2f43cdc9bc297e657f374e73140cf043d512c84717eaddd43be2b96aa0503881f │ │ │ │ └── cc │ │ │ │ └── 7ff9f02546d7f9b76029a3c43c960234a1c7afcecf2b1219560c52a7796787359a0657587250b34bf3167b668259f47ba5b7bc63a8c09f7e808103fc5901 │ │ │ ├── 28 │ │ │ │ ├── 5a │ │ │ │ │ └── 94f127c3ab2e4cf2543dcf54148bba1a2436a0fdb2befabecbbdd43c121d33494a8b14a0f401b1362d03d6063c01f93a0b7c5039ddfe45671cbbd31e006c │ │ │ │ └── 86 │ │ │ │ └── 0b08226085f1d9c6a8d8044eeb132d0e06e4dde710874bbb47560bc22e4c7b4ad2286b1c0d5b784200b80452315f79193e306fd0c66a7fbed113105ded44 │ │ │ ├── 29 │ │ │ │ ├── af │ │ │ │ │ └── bd4ebbadbfb1bc33a593e927a2456cfbf762b9a84a881841b35ca84013ac4e58063aa4f1fc53ef48637a0232fea4a9398bb2fed787fdb0d918a091e3ccb2 │ │ │ │ └── b9 │ │ │ │ └── b63de994402dfb4aa2bebf8c8c4e7f85ef10a2d1432f36a3fcc355a9b86f1d6c7a1d23df0f9cf31de30cf4450d8a753e0592af3c5c5d2740953da44fad5d │ │ │ ├── 2b │ │ │ │ └── c4 │ │ │ │ └── 318a283459760f3737be2a0420bf3bd97864683ea1b7d5e3552be33ccd92d13186a76151c06c0426cd1a9b440c2310ccbe2812d7bdd5a1189a3054915f04 │ │ │ ├── 2f │ │ │ │ └── 43 │ │ │ │ └── aba62f2a1a9446fff35df87f74bc507ede21e7b9ed734921a634e38287518b27bad4295c15d87be28e9846412d949a15197b04bd560bf1608760afe7c6d4 │ │ │ ├── 32 │ │ │ │ ├── 42 │ │ │ │ │ └── 82c319574e0cfa085a09c77a42c27d3b18aa77ebe699caefeed8b9f656b0390dc7720999004840c14ddf31e708534102f90a261fe29ad728b72041dbf6f6 │ │ │ │ ├── 50 │ │ │ │ │ └── a0bf72bb8f50802b1bc27dcdcbb2b57cdcfc7bbb7a08fd31f5b0c86082afbed10fa778ad4970f5dd0917df0c0680c1f9ddcf6af8948357afa9178ccbe6c4 │ │ │ │ ├── 95 │ │ │ │ │ └── 043763a876d533c6f29097bd9c505ed14391221ec1af4ac546d226bd73945b5862f6088e02ec4a4f4bc513048a659e5cd988db95e7ac3e16e371cb7b72d9 │ │ │ │ └── fe │ │ │ │ └── d03dc4f0f2db74f9cdcce912a7b1e396ece6a35e14ecbb79361548bf368e5efa879c26b1794557b4796dc917d1ce9eead2d58df006ed72fa7db186976806 │ │ │ ├── 35 │ │ │ │ └── 64 │ │ │ │ └── 36ff779dce8c7028d4aa782f582b6ea57d5f3314ae9c284778255b682c3024b33a7516328f5df85e55ab35fa0239880111b0ea824e974922956f42a65f18 │ │ │ ├── 36 │ │ │ │ └── a7 │ │ │ │ └── 29fade5c4c1f018a71646605e23099e2407d0fb14b76939d455216dd7de2af738002706dae427898ffcfa1d58bfa2b36b843b943ecf415d33d2889c13432 │ │ │ ├── 37 │ │ │ │ └── e3 │ │ │ │ └── 1e5d8a2aaf7a4e827f317f244f44437b8076a42d88e1b07856193ddf58088be08900b74883c35e108a2126d9b137d1ce575f9ab416d000dc22b97fdfc152 │ │ │ ├── 38 │ │ │ │ └── e7 │ │ │ │ └── 210e087817609c84e5fde1c455aa1bf2edbdc015bfbfad05f2b309b39866a445f90c8285958df9cb5a4462adf2c47ee0f8cac556d7a797cf0b778c723328 │ │ │ ├── 39 │ │ │ │ └── b9 │ │ │ │ └── a7205e215cd83506a8671e681b0c44c5f1d2cf0a08195818e441f859a5bb3366762eaf90d49634dc0878a2e4b0b7279134c9e3bfd4b20cc87f94bc7420cb │ │ │ ├── 3a │ │ │ │ └── a9 │ │ │ │ └── 4b2189b9033e8e0452f291bf1628d8a260a95c48549720363efa716f86c7a0b0ce583f321496abdf76a10a5ae3c37b4b158a6ae3b60487d43a3f2dc91979 │ │ │ ├── 3c │ │ │ │ └── 42 │ │ │ │ └── 06098e6d4a552de7472ac8c5df0b35fea0e3ea374bee1aa5b36dc276c6f9e4ce4ab8ea83a9cfb7506930c175f2026f8375e3e1804540f0d97576378b6fce │ │ │ ├── 3d │ │ │ │ ├── 70 │ │ │ │ │ └── 9e407e6f3f59d8bf9189580edf77bce75b0d73d1eaae1ea7f0c20e364f8f0fa94d555a9a24e394123b4417de5981f73d033b4512e2756c93bb197a62d026 │ │ │ │ └── f1 │ │ │ │ └── 792d00bfabe4a782198843daef29cf196e00d6be6021d201339cc4dff8375656be6fd60ee482860da519ccbdda237852e681b925604272bb81d8d6f4257c │ │ │ ├── 3f │ │ │ │ └── e5 │ │ │ │ └── 6ed6a5dfcde7628ab987382df1286018799b4f715f60efa5fec60d850f8b58811ef57b0300df9637b02cf7ce188dfddc1e7d1a495f4c81720c22d5f5cd40 │ │ │ ├── 40 │ │ │ │ └── 6c │ │ │ │ └── 5d5813cf17bfca0a5e9bc1958f2a9dcb625db6c63d171adcb4846a4f33b0a08a831263cdf57fbfa19f97a06866a6aedab04b56eee9f213f453da1fe24f3c │ │ │ ├── 41 │ │ │ │ └── 36 │ │ │ │ └── 2e0deb12d15b6e1cd36f321f828e5289e0b26272408c500aa3944dfe8fcc3e465469c325f76a91102861736d919da3b5cd1b5b576be6d0a8813b1c85d3db │ │ │ ├── 42 │ │ │ │ └── 9f │ │ │ │ └── 166d93817be6e5829b944fe970db185e2cff2ad286ad73d5299a27a61080b11af14b6261e6f50a30559187b499466d2e80eb227789589a77fd9c5639ce88 │ │ │ ├── 43 │ │ │ │ └── 46 │ │ │ │ └── b3719a32898bc593e5539cc01a560fbb1f2e869f334b88933568e90365a6817382299f68b60d5533d4631c22fb0bb778f3473fea6ca5e4a0fa752e1a66ba │ │ │ ├── 45 │ │ │ │ └── b2 │ │ │ │ └── 514b85164059331d34f057298c4d4bfc12a6213a9f1d38ebe22e3dae82d4e25d1691412ec62c6c594cb2f58d684c7a84827f9ce671992a4e5f488987d771 │ │ │ ├── 47 │ │ │ │ └── 96 │ │ │ │ └── 71f6670946a78202c3ff887c52b9e731adf421cb47d1a5282140115de89f3a26448a89769a3059920fa60903de08c132f78ce0990db0b1eb376340ad1d6d │ │ │ ├── 4b │ │ │ │ └── b3 │ │ │ │ └── 88f6f6507f3628937e2977e64b60c8827c40969944b9fc4872e672a4c1f1af2c8c5088ebc1c912b8d3b98ae381869d5b789210d4c5ce3976fc52e02c6f36 │ │ │ ├── 4c │ │ │ │ └── 28 │ │ │ │ └── 25551b7395f7d137144c132477e831812c9a5ebac15c80c543f4f644cc02a752cd65282817e6ef41982d9883e2cbf4c8190ee80516cd5597e269e2dfcf1b │ │ │ ├── 50 │ │ │ │ └── e4 │ │ │ │ └── a1b0fc33ecdacc52a851eadd215a315dbaf3b36edbfbb680c7d7f848adf44d2030679c159dd02c094c6bd3a67815966c0609d3fdfd997fb55ac3a9cb98cd │ │ │ ├── 51 │ │ │ │ └── c5 │ │ │ │ └── 5f55f68ae127389bb5f77544a81e8a3340604415e0c2fb3568d3ab7df317bc0b31d265905e90d5c7fadbb435a947a25709fd0006a92e3a1de7fb41704833 │ │ │ ├── 52 │ │ │ │ └── a9 │ │ │ │ └── 3e82c7f2c883d4ae09b0914cd26570a6eb14a5630f94eaff12e10cd6a445b42447a99e88451a3ec2585462a33a0df5de21124cecadbcace20fc819ef6f24 │ │ │ ├── 53 │ │ │ │ ├── 1e │ │ │ │ │ └── 328065acbb673b8ac1567bc62ed5896e266a95871a8ad9c2d735003901c0b741f6c636933b7eed18f1bff3d7aa572e7171658bd685dddf84163d0cb982e9 │ │ │ │ └── 67 │ │ │ │ └── 3524cf804eb4a5a184fd2a5cb1c74ff43800a3b0b150bff1e03d9b5c17b20da7ccc388c7b4370b9f56d1a4fb68322457012d332d0f98728b420a950195db │ │ │ ├── 54 │ │ │ │ └── 76 │ │ │ │ └── f38d9361ee93db65ec9e436476815c59fa45ad7ba18f8d2784b84e42a140d509f482d9bd8985073bcb5e2dd7695ae91e0d118e2b5d51c1f9a50dfa4209c5 │ │ │ ├── 56 │ │ │ │ └── cb │ │ │ │ └── fb9056979bea6d1c3319ee2cda46c3fbd0682b5bd341346b30b7d39969504b944d123690eaf1ebbf5465f217dafb3346b32b75b2ece9585ecbb260b1731e │ │ │ ├── 58 │ │ │ │ └── 42 │ │ │ │ └── e747c96d01e41476955b36960cdedd5179094ccd826e3c32a65468132a18f093f6db9655401ad49693f38cdbc20d31d5f978e8a69476ddea6b767c28d38e │ │ │ ├── 59 │ │ │ │ ├── 01 │ │ │ │ │ └── 3c1d8e5428225103af34c913eae58ea0145d6932ee45bbf5014bef3d76912a96fcfe1006fa88d749cc57d159304cb378a7d177c01699fdac050cb048ff74 │ │ │ │ └── 8f │ │ │ │ └── f74d4304d31dca3d875147110926f5d11d5e0fc8fa14b31b596bbf25c08b7045044785dd94f713ac71a4ff6137fcb825c8023789385055121ffb16d0fc5e │ │ │ ├── 5f │ │ │ │ └── 11 │ │ │ │ └── 407da4bcd54592ed39c7394f97f3b2fb205152456ead1fd34f89b2645e365d41703af669ef2540da0d08c99e450563440dac5d917f71eae214069883e9b1 │ │ │ ├── 61 │ │ │ │ └── 3d │ │ │ │ └── 46a8f48bf24267db47637a5317eff713469fd8f70e48647bdfc504d51eb3aa6b6c8c97b8bf51f32a29153957b984c8a4eb5158095e13503d5086f0f04ba1 │ │ │ ├── 62 │ │ │ │ ├── 00 │ │ │ │ │ └── 697491cfc90d94139c7e8654977277a3cc0bc3d1bdb65363ae00ffbc3a79494fe3e358fc6d8261aa28a73e4604cceb753d80dd18ceb61cef5476593fe14c │ │ │ │ └── 5c │ │ │ │ └── 559b200fce09df6b6d7d026e684db52cfed15974235f7ee9b98206b82334f452e29f9e014f64e554b3aa61020003ec3bc31df28911e4b58c3e60efce4577 │ │ │ ├── 64 │ │ │ │ └── 19 │ │ │ │ └── a11350bd2dc3e81fd5d949dc223ed6cf1d944ec009cccbe90815056b9cc0b16380ae765cf78013a9ce29607348ce8116a24f7b0859fa4ca265b66abda8ad │ │ │ ├── 68 │ │ │ │ ├── 64 │ │ │ │ │ └── f16e96e0f3f6f925f5351d74ab6c7df05d9b8b3c970d11c65014cc4bb37a12ce0b55bba9c53e46db18652f05c523295d98c81f56c7169ba3e1c41fdb5c45 │ │ │ │ └── c5 │ │ │ │ └── 933533de497fc54cbd70cd6feb0b322bac19a5400a287def6dcf6da202936e4d5adebd8d659df4e6ff66c732eb11074d53cd8357ae000135570a67d2f1b7 │ │ │ ├── 69 │ │ │ │ └── e3 │ │ │ │ └── 661e70716e2d92b746aee950550bb25716584b94e9ef20895e3cd9e2c943400a5ce6b4050463cfe90622b78878ee7ce97003e736d3ff239e0a3bc5cae0f0 │ │ │ ├── 6a │ │ │ │ ├── 61 │ │ │ │ │ └── 84cabafdddcaf7f155acaf643b8e274cf2b3b0f6d4e3f2b3966012d50d977b74abcf00e70cd30d7e604cffd62539a3825d5075b7190dda35e960c0c092ff │ │ │ │ └── 6a │ │ │ │ └── 5357458344d33ab7d8a6c73b040d35996b0669cdf7100c5a0f6f2b6eb79633dccea6546372802233aecff1d2f8fb786751c173855c3e057ddcc36f9471da │ │ │ ├── 6c │ │ │ │ └── 1c │ │ │ │ └── b3af5f9ea75ce4e15b9b784555895e7ddafbb69471360596393a7cde859a8e3a0a2037cd3e98db42a8f9219f6824949a8ea715a03e86134a78410aaa4e5d │ │ │ ├── 6e │ │ │ │ ├── 92 │ │ │ │ │ └── 31bead3789fe943705d9f874caef524b87800fbe75e7b4373a5ce5fc515ab85d039597b970a24d00bc897e6fcce00b0ddf49a55364ca403cf6a05db2a61d │ │ │ │ └── e7 │ │ │ │ └── b01f332f60bdbd8dd7904d520b79c49a64a9edfd12568e8642179396eb467aeff1a648b06438533baa1d4f237cc536d25b6992f9790bb5bcb7daccec23e2 │ │ │ ├── 6f │ │ │ │ └── a8 │ │ │ │ └── d2bf1bd59f2a6d0222e36e458b13f94e9d1e257d3b43025f9e502ed1672f9041673ac11cc8576084eb106e3260f1736a888a1b430990f934f38597b7d105 │ │ │ ├── 70 │ │ │ │ └── f1 │ │ │ │ └── 8d93b90989f0ea548b6fee279cc7109402a57c6d1c0466f79c2f19c2e8f4579e1a83507bf35f7ef365bc35cbc4d80a80ec4f9c3b0613e85884fcee89f2fe │ │ │ ├── 72 │ │ │ │ └── a7 │ │ │ │ └── 9fb91b21d76a56c86b08a0128903d96e16ede6471080f8e459bc0e24b4b4b322e094b56571188b978a01303b9ff2c1614c67640418a5af9191b5cc33136a │ │ │ ├── 74 │ │ │ │ └── d0 │ │ │ │ └── 2fb0045ff1cb4285d2d1716050b44ab3155593ae35372fabc4d5ad65d2240e88fa417fbf25e754d5f01cce0b1b10b94de1db3ae6db536dec534b31fe7771 │ │ │ ├── 75 │ │ │ │ ├── 10 │ │ │ │ │ └── 7bf2cacdfe5ea0a96ba56a1f52af17989f179d7481b7d3e18ea8affd3a52d5c8b8371cf9ebe92a8e59358e5ca4700b6786602919e7d34db9282f4aba6038 │ │ │ │ ├── a3 │ │ │ │ │ └── a3f7440c563aba907ae0516c81759a218da2b906da1989ec63393ec9b20606733d03c27756cf1662a0525a68327d5efde0804d2937381f608cfcc872f800 │ │ │ │ └── c2 │ │ │ │ └── 855f78e7d0ca486978e2b2846f7b12095442b36aaef3dab64ac5ff8c4abf5391d9879ac5389b695c2e88eb8ff14797c9a4e55c4c99803e7ed4643ffde829 │ │ │ ├── 76 │ │ │ │ └── 12 │ │ │ │ └── 9ff74dd4fcf41963a6e834db4019d59b1bce5601b8d3ff5c58a19202ec5018d3259aa4e05056c56b0e5e7c5bcebffded55a4c341b5157831a5df74cc9214 │ │ │ ├── 77 │ │ │ │ ├── 62 │ │ │ │ │ └── 562c28af999613488a207bd32c805099aede7bd418a47161989230b59219656d3783946a99d83f2f0fc13f9496bc58659b6fb3e59bcfd725857b2091d967 │ │ │ │ └── 97 │ │ │ │ └── 4b4ed1a5c47e3b8cfe73cd5529ab55029854420395ff865b9735647a32741aa3ff3502cd830ba2df80b1bdee0aa454c8bb96de2db8f016f005b47b479357 │ │ │ ├── 78 │ │ │ │ └── c0 │ │ │ │ └── 6b11b047b69af1116cdc8c7416a1601f7402d3acda0d1bbbde0aa3dec9b8a3e7e9e626c78a8e7787d83316de4dc12ccd9b73053f7beb7a485de0d521975b │ │ │ ├── 79 │ │ │ │ ├── 7d │ │ │ │ │ └── b6e1fca9606766d0dde9da715c03323e25af187d1cfbcf8495257703bdb476d278f0aae4bbc55483ad6db2767f1381b31619e334c12071e1d137366b7b2e │ │ │ │ └── 89 │ │ │ │ └── b441606d52b0566561b4777f3a386030d7a67df793e2395a3607b6e35926c779d1a5e5ed1959aabae6438681448d7ac1080e407d2126d383f24af5d84264 │ │ │ ├── 7a │ │ │ │ └── 58 │ │ │ │ └── dc8040e5127b3fec05c5a2c0792bfda708ce0fec540f90673f0d62f2e6b985116bd96b21ab8a4d5df7f4086399c9e1ff58b15bc1900ea42691e7f6b21275 │ │ │ ├── 7b │ │ │ │ ├── 0a │ │ │ │ │ └── d74434c0a805e5925eadfdf91758d021157f48f8290a970eb38c4c24f3a4523cac19af7c69051b28eb9e5aa9869fc2d9dba472e3eada05ce677ac5d569b5 │ │ │ │ └── 82 │ │ │ │ └── 092aa37cb3662a311779faa568fb5378b34db475209553248505bbac1d4bffff9f78e6a241a159fde805f205a1d1a978290d0783e32a55f8cf71a357e93f │ │ │ ├── 7c │ │ │ │ └── 95 │ │ │ │ └── e3148786596741652419f62b7050f594580fe637e4bd092b38980d4dd6846c59e026e8229584e8b17770b35ad310916bed3729e9d0fc0db589153a3e0b29 │ │ │ ├── 7d │ │ │ │ ├── 3a │ │ │ │ │ └── fed3ed3b4eb6ed9e6214fac0edb28d53c3f3a08072b0fbb5f07feb16409c5e200137afaff9f0ab664666d2288c52c18936c0f3f1be80ece3d7bab2b1ae1e │ │ │ │ └── ea │ │ │ │ └── bdbede422630fa52908016aa17d4f671f25457aa01d2536ea80bfb35a8e4181420bdef7176655b118af4cf701de6cabce22e2129e1876139552b6a053339 │ │ │ ├── 7e │ │ │ │ └── c7 │ │ │ │ └── eb3b433157ae199e8cbcfe5d6f5488e31dadbd499cb2a8f8100708620dc696f3025cd96dd7595386c78337a09067bffcdd519208a75803792f7c1b33fc36 │ │ │ ├── 7f │ │ │ │ ├── 24 │ │ │ │ │ └── 088460e1cdf73da4ada41fa3e5f5ce010c919f3243ea932220603b61c8d628360df0561a0930c875f564b8529ff528c3c556936c4f6ab75a65e7d8dd66ea │ │ │ │ ├── 41 │ │ │ │ │ └── 45a4875c1e09fccdc3d26dfd5d45ebf0b74e3b60c9da889337bb6c3645ec2b07e7e86ffcde3d972b3b24282cc30eeda04875d2dc40810ae5d62390b9c6ad │ │ │ │ └── 72 │ │ │ │ └── 9d5113edc958d59fe45617ba62bafb6c0cfc8e074e5fd0fd94df0768ab589726b5d3dcbf315addd14f7e6f4fd37eb139796bf15d7b27a9d3fb25c6f152bb │ │ │ ├── 80 │ │ │ │ ├── 13 │ │ │ │ │ └── b20a2571ad76a461bb0810cfc3ee5ab35d5d27837b68b7ebba141ab227d0aebc3009ab0f979b11f9f2919bfa1980466cecf60f5319d18e8c6672ee5ce16e │ │ │ │ └── e2 │ │ │ │ └── 879241f4307f0e5a82afac4d57ac9a294e7152edd7234c37cce8e9991e85f545996c735b8d146092668b171ca3639638f4b661454f0a895195085cf04fde │ │ │ ├── 81 │ │ │ │ └── 34 │ │ │ │ └── 2159872524c81acd6fe2bfecfa09ae0309057356f3cd16746072e23309de6079f18391e5b666a924ddbd1848ec65924e38b515318909593644389af6a8f2 │ │ │ ├── 82 │ │ │ │ └── 06 │ │ │ │ └── 35fc6a4769192719292c0abf2b072d271c2aff9c6977daed1b00ca945ca4350ec4f88cd6d5c213ac83647a105b42f59605fcd1826144b5ee690a06d17cc6 │ │ │ ├── 84 │ │ │ │ ├── 79 │ │ │ │ │ └── 4d3a41a02d827d4087dcd49a2f9328190acc7549f0033f7d81c2886e36003dbaa4254da63c5adca84d9b69b4fdcc27aaa8ed08d91be06ec61f2855ed6a8b │ │ │ │ └── b1 │ │ │ │ └── c971ecc90c5fac945891d7d8677fa7178bf6fccc23b853378d0d5209bb8150d0c7e968a5095df5ad6049e82a07d6bdc52cd310f81f211930b9c3e66c742a │ │ │ ├── 87 │ │ │ │ ├── 51 │ │ │ │ │ └── c8274b42245cfba0f50963b50f4e0c1822647ef67eac0b1f19aef5f2be17651e402f82b24cde8aeddfb34c58b02a07ba6605fbc37f987cd1a4c706c553ed │ │ │ │ └── 71 │ │ │ │ └── 5b8ac6b69ca18fc42a66f3d1e4df79412ec9da181bdcb50a2968148e5bfb88b3a1537b5013c809ca149af356cf6fa4676c4deef7585dd5e2522c93819a73 │ │ │ ├── 89 │ │ │ │ └── 83 │ │ │ │ └── 4ecc75316bff72be6a6ff571991467ee0999b790cdc344e13b9b699401301382e6f36f484e96b62191c8600c9ef62a15d3f2f7c2800e1b6ffef0db64cf8e │ │ │ ├── 8a │ │ │ │ ├── 4d │ │ │ │ │ └── d9802f5d63f95855533ef8e212b1a6037a0d6d6f456d3f9b8bde8ba1d64a0639a50c0cfa5b1487a2e099058a659414f9fdd2c6cc34c5d000854e96760a24 │ │ │ │ └── 97 │ │ │ │ └── 1f9c6fe9e382d2b35525df2f2f42927626596f77609512fff85ab306c45b554a1645809137769b0f9d225c5dd00ecbfb1208bb9417a6fe6eed3f8ee575d8 │ │ │ ├── 8b │ │ │ │ └── 24 │ │ │ │ └── 57649cc4cc2d8bfaf6bf56dd7d3ee5000820cbdc9b7a9a8699063ff5b0cc59d283f106057e573a80b237c49f1f7316aad99a7fa500c3467d74720661b904 │ │ │ ├── 8c │ │ │ │ └── 28 │ │ │ │ └── bf40a50cdabd49bb96b727ae131f60394a9280821d0ba649f2a9d4389ba0c2574c49d871b5c40451c0d18f41f8b548b74b599d4e273e85e0e30104d88624 │ │ │ ├── 8d │ │ │ │ └── 02 │ │ │ │ └── f79519e871a16dbb7574d094e8633ff8424356b30c628c368254d6518914cedc74032ec76ed59b66214bd5e323e9fabbd69b98f4cb44c6fd2eb572e8a34e │ │ │ ├── 8f │ │ │ │ ├── 45 │ │ │ │ │ └── bda0c24c37e625fa1587c9283016b66e926b7cd38cd4f86790f318b07d951687a9f63eb43e5f07d589e09df82b387ee6d19016db83ecd7126329377eef45 │ │ │ │ └── 77 │ │ │ │ └── d52e0bd3a39dbb6a7c98c893864d825b1bebe79d062f1349b99a691cd532be9f1029a6408b3082f4699e1d6e55423681928619be933138654ca4068320e2 │ │ │ ├── 90 │ │ │ │ ├── 0e │ │ │ │ │ └── 56428355a38b7d94dc769103450b129e065e486db48d065d4cfed2e4c3d5829fe871341016e5087c81d86ceb70899e18c9db3416168a8f24fdac2b5015e4 │ │ │ │ └── 69 │ │ │ │ └── 067a0608750b0e6f85e3b1f33deeb5ec887681c1ca3e84523aea83b8b3d2d4f8f2c00b9a09ee485d395171921b2695ba54a8302f5f0d750a5b973fe8e41e │ │ │ ├── 91 │ │ │ │ └── 11 │ │ │ │ └── 91670ddb2e5148483060c13480d5330114de89e865837ae6e60c4dc017edfec972fc8535aff2be6b90b6ea6176384633e4fc4cc79c2948df341fd5c1661c │ │ │ ├── 92 │ │ │ │ └── bd │ │ │ │ └── 17dbee98cbfbc9ccb60950f09911cf127d071ffb508e16802a6ae266ef8ba6421b5af4cee53491cfed0412def92f7062d051b5a9333c2b5d8c2b633b4728 │ │ │ ├── 94 │ │ │ │ └── 6e │ │ │ │ └── ccd41785b69a3cbe6733bab9c3cb8311092f5d44d32d9d86157b712c156f3dc877209bed0d1511c6d366687506a1b17ccd1f1fb86fac924ce266825906fe │ │ │ ├── 95 │ │ │ │ ├── 88 │ │ │ │ │ └── 86f66880d649a434abc280f67605abbb47711d06bfdea32cea11a9429704d0564033bbe4f9d5c883412b9525389f7f29fc9865f553762c9f263680b74248 │ │ │ │ └── cf │ │ │ │ └── da6a19feb78fd2595fea726ba6623ca62ec59f37710b869995b9416382c391aeeb993d54b0010af2abe1c71af3bf488d8a557dba6f1f849fece133c83c85 │ │ │ ├── 97 │ │ │ │ ├── 2b │ │ │ │ │ └── b13c6aff59f86b95e9b608bfd472751cd7372a280226043cee918ed8e45ff242235d928ebe7d12debe5c351e03324b0edfeb5d54218e34f04b71452a0add │ │ │ │ └── 9b │ │ │ │ └── 930ca6e7be7018e79ca9e2f88256e0094e45700f6042e4f4b7be887dc897ddb413ed3d5f1c7cab977e75d565d9d5a36a2335aab01309f3246a780e66ba06 │ │ │ ├── 98 │ │ │ │ ├── 9a │ │ │ │ │ └── 68e84545cf186953b6927c75871a5e5f661d07ef805b585fa7c3a0c5be109626fd58145345d8bb858e94e1b66b59937dc1c3d4eb628c1c660dea5c352de7 │ │ │ │ └── ac │ │ │ │ └── 864ad4b45e218c1f4de4d9f3b6c472c17387abd03684f2342e86b2ad5e72f68852c8c6e8ecce321554dbbecfb4675963f590d69a590ed55a1a6caef56aed │ │ │ ├── 99 │ │ │ │ └── 98 │ │ │ │ └── 448f12378f9292ce130fc418d98bbf63a156f6d27e8eed850861153c0edcb5e811bad603432cc61b4f94549f2d43e8c48367de701b7ae30eca763af6018a │ │ │ ├── 9b │ │ │ │ ├── 3e │ │ │ │ │ └── f67c86d00bc662f0c2cbed99d6642875488172be12158566b611303af794512f2efbf85a10234e59382d58b563f336d50407396c650a1f409d4af467e88e │ │ │ │ ├── d6 │ │ │ │ │ └── 15ca4945a64c3bf495423b7131b87e3a97bee25d335e002733b2994ad038333639a7227df838fbdbb1c2c77dc3c1de199a53731445c081b4fd0c6973eade │ │ │ │ └── d8 │ │ │ │ └── 13c11921cb696f08f7ba409a787771b54d81141e7fc5cc952dabd3231f8e9a9f5c0953e19da060b954ba1ff115fc16dfc3969b21029921b300cb6731c871 │ │ │ ├── a0 │ │ │ │ └── a9 │ │ │ │ └── db845c91217a54b9ecfc881326c846b89db8f820e432ba173fc32f6463bfd654f73020ef5503aebc3eef1190eefed06efa48b44e7b2c3d0a9434eb58b898 │ │ │ ├── a1 │ │ │ │ └── 16 │ │ │ │ └── 42c6790ed2f6bb0d8a2fa3d42ec39ae52b1f8c51fd99266c3eb50ad3f93da11c955666ddd334a871eb7e5d32df2d95fe4b411dc952edc2ec440075d2e4c7 │ │ │ ├── a2 │ │ │ │ └── 81 │ │ │ │ └── e7e49fbe8656a387fddebf50395ed76f90be5bde0d8da3e071dbaffa84d3fe80032b33ce9dc72a6feccd310b2b6c0ff2cb4e3b96afa5f64be198029a2977 │ │ │ ├── a3 │ │ │ │ └── 07 │ │ │ │ └── a03949db85191d4909f468f63cea33e3f1165e5851039ea92a6fdfe71c1a212684a0e979a2c59001a5d077f9627e64ac9808c3c23101d3e903dd678b2360 │ │ │ ├── a4 │ │ │ │ ├── c8 │ │ │ │ │ └── 4e7c50cf8aff6de638c85e41e8b169a44b241bbec80454d933d044476ee2e1d93ffb8f832aaa9cf9db715ef0c558f3d282e9287f41f4b6b0cf928e014373 │ │ │ │ └── d8 │ │ │ │ └── d31dae18a09757cdcfbf9ddfbba4eb2ced665dbc390b2319d6d3458cfe3931794c1bd7d09c8fd0990c0a836ac2b52e4c7a32da40824f2c2e9ad2828e9633 │ │ │ ├── a5 │ │ │ │ └── d9 │ │ │ │ └── d16d0e1c40b653ae71d75bbe980854d13737e87032bb5a41cab0335e2c19e80fdd1b630c2916090388deafd50c7901422926898f1dc9ee2272e2f790c246 │ │ │ ├── a6 │ │ │ │ ├── 45 │ │ │ │ │ └── 2e8a52ed9bc6f424126dd4d7da19cb119632aed03ca6dd744311f5edcc3b07a99242b1ac823c861dbc4ccb33ef1cc3f1b4a158438644851d2e6cc467b931 │ │ │ │ └── 5b │ │ │ │ └── f44a23e04004f4fcb8c2d0c986b28a3fb1da52e95e13a4e500c4ee09dc39ef9cb2da2279cd87d8625354a51a00a3b11bf49cdf53bd7f69591a959d91fd93 │ │ │ ├── a7 │ │ │ │ ├── 32 │ │ │ │ │ └── 6ad76b4469a221aa36f3a42baffceca9258fc13dabcea1f9be75b69bf8c1cb6a3cb6efbfb594b9ba245706805e5eb2427a9aab868ab857636183ffcbbc52 │ │ │ │ ├── 7f │ │ │ │ │ └── 3b7e7150102a863fe3f0c7edf01b5ebed441e1c485f1b97a3ac58ab37da80e535b9cde6231a3b7f09c4b2f1b566035d0610bfe0557ac9ae62216f1c01a50 │ │ │ │ └── d8 │ │ │ │ └── ff298663e8ee2d918a19a0a00435a7537ce757a337e6dd8597e213c9e56d4ce61b5be30c4b719c5054fed981c51f78a88f5389a1922dab4dcf5248e83c4c │ │ │ ├── aa │ │ │ │ └── 90 │ │ │ │ └── 80bd197db2db8e1ef78ab27ec79dc251befe74d6a21a70acd094effe2f0c5cf7ed2adb02f2bf80dfbedf34fc33e7da9a8e06c25d0e2a205c647df8ebf047 │ │ │ ├── ab │ │ │ │ ├── 20 │ │ │ │ │ └── 87e36d5840f4b65850f10e37ed7dcd5947958a433573aaca789fd3369108553a8fc1c9a845a143497e5e7c90e70419f43fffbc1e1530e19beb2cf0473183 │ │ │ │ └── 90 │ │ │ │ └── a0dc68efd52e822d9d3b85754d0fdfcbf354308c8deba163bd0d9a25aa2ff3ffa91a4f516c78729887b3f82207b16c569db31b0fcfda64172e02808adf01 │ │ │ ├── ac │ │ │ │ ├── 1c │ │ │ │ │ └── 7865a5ac22a0bb027fcfbce2f71d4397d8847e951d782302ffd6e7dc65b329403a8408bddfe2410655ebc3a9e60ba4322b2930e6d32a039078654b548e94 │ │ │ │ ├── 51 │ │ │ │ │ └── e187fe9d41cda368bfed295f36e4ae7ad00117f4fd4cabc1ae41877ea3efc3cb5e620033fcab4d2b81c9906697165c165c9eb06d09c3f255e6bb627c3839 │ │ │ │ └── d5 │ │ │ │ └── 1ada8215399d75d02c07b0f09d6312f36af582cf44d1c5602926e26a7c8ec08371d2d44f9d457f4118c891f13f54ee29cc1f09f193c8a7148fddf9901d61 │ │ │ ├── ad │ │ │ │ └── 48 │ │ │ │ └── d0a32ede8194fd5d855704ad637bd724067369eeacd164e84b431e51704a767421a55e8fa6bfabdfec09b82e29847050492086734867e04ea73d402acf4b │ │ │ ├── af │ │ │ │ └── 39 │ │ │ │ └── 5d2143741ba08238f96ddff36759c58c63b72cb2ace9b9d61da859fad9b26bb3996e4ff4755f8d512979dae21b107a1b67fbf120fa53187890dd08590d35 │ │ │ ├── b0 │ │ │ │ ├── 69 │ │ │ │ │ └── ef6f9766ac968a119f8b0c8a60baf757ddb0e5125966bf8fc2950f5ac1c98266b971e63432c8c58533990123e13234e0830e22a4f22974cdeb97dd9960ff │ │ │ │ ├── c0 │ │ │ │ │ └── 6287fba94763d8f3bc9319dc82b1dcedef258efaf60c010e7ed197574d26380855104a640b6e1789895d846c1f52d4eb20267e7c0f1fc6687bdb0502bf99 │ │ │ │ ├── c4 │ │ │ │ │ └── 86eae8813cc26b7dfb5c095299e8d9b392c4d3b26e95a0736a0e93e14e5a532b33da47ecb9f8c6756f22a21ea62399d17e15f3c3819ecaa7043faa2e8914 │ │ │ │ └── da │ │ │ │ └── 8dedbdab711791e11403743c443259923b3cfd3c763ac2b6dac038489319c7af46f4e0247e6e42be79aea56dc8e06bb9181ea26bdf8bfe4ff5e3ceb61c32 │ │ │ ├── b3 │ │ │ │ ├── 1a │ │ │ │ │ └── 7f56449634bc6e62aad466db2af6562e57fda7258e005182788e3cd7642e657eb8cc865a4aaa3e607779c9076547a315a3328ee124b9c3d889af9f2a814b │ │ │ │ ├── dc │ │ │ │ │ └── 2c7145ba3c560a768d1533825be8d86c4f0afbf5ab6f4e664f0cd18f995a035188194d8495b01f2313f3cfdabbe528a40ef97c4127901e9e647b28e19f5a │ │ │ │ └── eb │ │ │ │ └── 39f998983a92db61bac89488a0adce33ed82cc1956815b337a97ee86515ad142f4d3d45ad1e332c7c5713591623b4b4017b0fd21eaaabe2843c2c69fbeb9 │ │ │ ├── b4 │ │ │ │ └── fb │ │ │ │ └── 863930d065d0bb76f5651b3768e84387f4152d72303c3bd9761825cfa8c81d4e2c9c938025b8679f319c4b8d611f9626ba4d029f8475dc6ff586fe5979fd │ │ │ ├── b5 │ │ │ │ ├── 37 │ │ │ │ │ └── cf317838766ab773d9617270de8511dd367bf7467f2b2288457a4bda388fdd00f3b1dc6a77e57848299423f08c9195f61ce16ae9d89f77798b9bc8cc57dd │ │ │ │ └── 8e │ │ │ │ └── ec56dd722fda33231be66ed379aad987da4ad770109f8c488280a18baae9c91ef82f646d8f725da843791b7190116f50461077642f371818ef329d59627a │ │ │ ├── b6 │ │ │ │ ├── 3c │ │ │ │ │ └── 0ce5ec4c83a046448fa43664e7b4db2f7594b55fc045612ead9c9da1747d2457133afde559db1cbe16a4ad496bd89ad7c53032c8c6eae8ac7c0329f0f3e5 │ │ │ │ └── 47 │ │ │ │ └── c51185189afee296af509cd342d0b1db64f8e4429ebd9b6a73eb6e59d67b5aa459b73c785beab5152061562876c7b4f09cfd2d913c0d1fa4e78814d23d63 │ │ │ ├── b7 │ │ │ │ ├── 63 │ │ │ │ │ └── 839645c14329fb8e497a4cd6b0fccb55115bc819e9490c21b8d4e92afcac14b090704385d566c1c055490ae2606fddec22012dcf1ae516b98d81a0ae1953 │ │ │ │ └── 85 │ │ │ │ └── 3df3088c6764797e7a179e32a80030fa7cbf022fef63c8c7f3ec5a65aa06d7ca593d705bde0d7b806cf0f7f944fdb66541229b42fe8d10525f7d39c896ce │ │ │ ├── b8 │ │ │ │ └── 24 │ │ │ │ └── 3c28a65d120aeac2fb2d4de11c5f6593118bb868cbc14a7c4c3c8c10a707a0d9b55ff09e592f29a2f3f2075cf6d3db5a2a9d1edbf4e9dce27ae4e5b903a1 │ │ │ ├── b9 │ │ │ │ └── e1 │ │ │ │ └── 1ea67ba3a6a79eda8e5a2189ef1d4e82d00e3630d76c2037aacb907276b92e0b947566e5059e6dbb11e1491a8107250827dee95e46f9935da2607d76ede2 │ │ │ ├── bb │ │ │ │ └── cc │ │ │ │ └── 7c0db6fc0e8b37e0cecdf29e1ee0017ef818b50fe96af9d9110af2e2e50b9bfdd23be59ed84c85c17b30382db2084a5cbe11c9f4e5f7687f3670ab23afa6 │ │ │ ├── bc │ │ │ │ └── 5b │ │ │ │ └── f1455b099cabb9d8a6727135517bc28c43a223700d02c2cea588290de796c471d64d7cc6c97b7b6483d75b3fc88fedce342dbef7bafbcd492b7596a3134a │ │ │ ├── be │ │ │ │ └── 60 │ │ │ │ └── c3d7e8b035532cd971773988d125be5d9f3a7a698705b0a413fd08f7a91ae9efbbfab450561406f519cbe50fd85e2505f8be0a06dad1cc9e82b0c5a61a1e │ │ │ ├── bf │ │ │ │ └── 18 │ │ │ │ └── 54cb827c9727b28a71fb033975a5d778dc6261647fed3f6c1e37c4e7b506e5398f80d176d3f03264d7fa023ee38eca0fc96bbe7bac6d028077160bc39f30 │ │ │ ├── c0 │ │ │ │ ├── 0c │ │ │ │ │ └── 6be3097ad962bee4229c4963415041ba3e48c57906c8c41a44937e26387be6882937d0d4ecc066ddbb4d152f7b2470c4b1448494dbb0a965e9876f6159f1 │ │ │ │ ├── 16 │ │ │ │ │ └── e9bfe3507ed1c3746f3a41cd292325e4e48477b4cf157749d62ca0dc5fc9cd9f89d714e170b0abaac36a2403fd43fe6a5a0249aeca776b3c94d80cd66d17 │ │ │ │ └── 1f │ │ │ │ └── 0e75de3b862a4efcce4709d870b00fe43a864938289e23df5d43fe767ff3b8e2581e0eaa4feccf7d226fea861e9fa9f59a0e0470e42d2929412aaca5ae8a │ │ │ ├── c1 │ │ │ │ ├── 2f │ │ │ │ │ └── a1020252851d0a844bcf240adfb8f54dd7e1f3d6dd18ea7e632eb1906e46f8bab80f13fd11bdefb590c075bffa16807826e1621c57e8bb176a53563fb689 │ │ │ │ └── ae │ │ │ │ └── d88f25067cd667808fefb4ad141c037e9600c2c413c2ca55571a9d33bb9f45cf96a21ad3576aadc3848a2fd3adcca2b07e55fb9f2e1dc9945d8a7532b7c6 │ │ │ ├── c5 │ │ │ │ ├── 23 │ │ │ │ │ └── 32519743bdedde63440ebffface305fc949686914dfcc2075cb850df6d2d7e4880f9d2c802eb2a8dc6d157eb74cb4442d5b2280cc8b486369e7e83e7d1bc │ │ │ │ └── b6 │ │ │ │ └── c21f9742614e53f0b704861ba1ec727cf075ee5b7aac237634cce64529f6441dca5688753f271ce4eb6f41aec69bfe63221d0b62f7030ffbce3944f7b756 │ │ │ ├── c6 │ │ │ │ └── 4a │ │ │ │ └── 67867eda208dceb36587eb399998dfd962207f9a25345a6c58e4d905c66c7330b2808b28d74afa4d79e91cf4d17769eb04d23d57f905b347b51db9143e02 │ │ │ ├── c7 │ │ │ │ ├── 94 │ │ │ │ │ └── 4bf58da9e7e4a1dc3dfc161f62fe243964af9ee31b9745dfe919b3380f5ded828fcc1b06edb5493c7a6cad72bd58633058b3e6a99d49e00431587e98cfb9 │ │ │ │ └── 9c │ │ │ │ └── 4fab30e96ea730f3dd6b17884ae570f6a995a64029b6f853539b45c9fb64aa09540c15d496b4035a767b9b922f6c61c05ad88cba5a2e82f1cfa0a26c605a │ │ │ ├── c9 │ │ │ │ ├── 0f │ │ │ │ │ └── 42a371464ab760d591f588236bbdb498921141ee5849b2f5dfe4ce0e73fcdf4490c75edbfc83d0ca321b2b502c8ec705d8e66dc9414c5792531d550ebe2d │ │ │ │ └── b0 │ │ │ │ └── 7244d7a1418095d97556fee24a89d1a3715b1b33d5845c4d53389f9dbcc6f9de8e2f983971f95732a5a2b90f1bd0d170d34359cf7dd294eb7a72f30a3002 │ │ │ ├── ca │ │ │ │ ├── 87 │ │ │ │ │ └── 4a20524d4b42f751277b655d217ceeb1056a3c4319403050c7c8ff0667257b3a951e95ddd1ce7934cf7d1593e4af44057aa38fdfc44c54b3b33453189c66 │ │ │ │ ├── 97 │ │ │ │ │ └── 66254fd36c16f2d83c626eebfb64b5b706cd5012633b9c78c400d7e88492ef1345d5ba38ac9f5a8f25c67183ea83b9cb2bf9b3fa7cb0f5acf4b702127b11 │ │ │ │ ├── c4 │ │ │ │ │ └── fc9a1762c562ba1f0de2d55d80791a99e567d78351b8de6aa86253369dceb7f3c16ae63717cabe6646ca9588bc7f18961da0bd1b7d70fc9e617e667fc8a3 │ │ │ │ ├── d4 │ │ │ │ │ └── 080544005e733d3410ee04a580ae76e113c7c96cf6c46ef911e81db70436e4c5e31aeee0c4390aa643707d5df971f8f640d2b3cbbe2d6ba72d998a391b9d │ │ │ │ └── ee │ │ │ │ └── 294450a70a4b84bf3b89e152404c8f083f74a4ba786211b0155a743137bbf8eae432a8c53c73d6901f31714e573a3eade2972c4440e3a31bf1c8e3cbd1eb │ │ │ ├── cb │ │ │ │ └── 86 │ │ │ │ └── 2d309376a857f6fcfc38277e510b28f343876db7c89627103f93c9e61d4b32837103654fad9dfc59b28e3c41256aa36b70d43f5ca9e1d686c000cb8d04f3 │ │ │ ├── cd │ │ │ │ └── b0 │ │ │ │ └── 7dac22404f5adb8e25436f686a2851cd60bc60b64f0d511c59dc86700f717a36dc5b5d94029e74a2d4b931f880e885d3e5169db6db05402c885e64941212 │ │ │ ├── cf │ │ │ │ └── 87 │ │ │ │ └── aa26f7e236714c1c822f5cfdc2639ef2d9626ce60dafdd7d339bd984264ae436fe2b0f1bbeb20f4987c1245f27aa06407b48e71ba28f5d315aa1cab00222 │ │ │ ├── d0 │ │ │ │ └── d2 │ │ │ │ └── 50e0b14552e5a413b3b17f486d04a4baccb9248c11fe84cd6e93b360ef4e51791f26fee7a576ecb50c1a343f20573ca567040e9806553de0c0465eb4810b │ │ │ ├── d1 │ │ │ │ └── 1f │ │ │ │ └── 629116faebc1c1ed00f14f5be4a6e501b6a739dd8c80c0cc0679414a4688d8fcd58abdd67ef5462d45f1a686a35b4644d256931b9b28578a9145bf671bfc │ │ │ ├── d2 │ │ │ │ └── b1 │ │ │ │ └── 60fd18f643ad8d0a6eb68d9c34417edadeccfa402414d0ba5974dac95fc6f2446686553a9bad6f630282001f2310aac369799f356204a2cceb79597ab43f │ │ │ ├── d3 │ │ │ │ └── 40 │ │ │ │ └── 2ad23a9449077c89d8b4bbd6bf341d1ea1cf3711c191c9e4bb1f529d607c1f16c85709b8afcbcf0beb01181c36cd694b424413bfb590016508a7b4c3b0d2 │ │ │ ├── d5 │ │ │ │ └── 41 │ │ │ │ └── 16457ea39ce036cb81f959ccd9e3880e3a34c49a5aafd6e356e0600910ee7e6dab82061bfcb2763ae48c39fd5392fe084a37d82bd8a8e72cac6bb2fa0c57 │ │ │ ├── d9 │ │ │ │ └── d1 │ │ │ │ └── df4e80a3fe9cdc6b60a4ef6e0e6792f4115aebdde1d136c1bf6f7c5024b036859a55092f7d6cb017fa19b52075c3127cd4e9bcb9cffe4c218efde3f6bc35 │ │ │ ├── dc │ │ │ │ ├── 17 │ │ │ │ │ └── a5b7ab5d73c6cf800b5b72676d349962ad5a139846f97b6802f783e7930116f6323a0801d47a81bce6d8d63f95aabaa7dabe832d330886e0ff76e9928ab9 │ │ │ │ ├── d6 │ │ │ │ │ └── 84b678e2efff1539dd12f7425ef76630d3778113ad0ec39e45589e122824507d3a7094f30c0542a0834a23f485fdd982d6bb91213f5ace9f249af4b49c6c │ │ │ │ └── e4 │ │ │ │ └── b3dd369c516cb85ad397577f03820c31a2a24ae3e78390d325e59fcc2596a850f68fe3ff657fcd715cc7b523645e4c0a6dbdead95296cf638c16c16c8be6 │ │ │ ├── df │ │ │ │ └── b6 │ │ │ │ └── 709849a279c02c19b1b4bdb6a81743d23ca14c40b8bdadcd835424e4c0b6afdfccc3f9421aa8be1837a5e111d4d5533ded5d7cf3f22830beb9a31bd60bfd │ │ │ ├── e0 │ │ │ │ ├── 95 │ │ │ │ │ └── faac46ad404be59a053cd30672abd453f7a1d925af3cabc869d2905df8badccde0c8e28eae03633ebafc678151e8e0886bf2e89b5f11fafbbd3384016b57 │ │ │ │ └── a5 │ │ │ │ └── adbacd54192a2fe66c7b8f4ab78998b920ad0f70a69c47dd0de48302d7e4d32f017f420d92a8080765b0e0ed11759d04da6c85f6e30d6f992c8e0ff3a427 │ │ │ ├── e1 │ │ │ │ └── 71 │ │ │ │ └── f77479e68534ec1a2b93d8fc47c7a1399a534f50e98fda4e5c47d2d7210a51a869c271f2732f74df3aba4c3cbc0a5e2d47cc03390b056afb8d95767b0a3c │ │ │ ├── e2 │ │ │ │ └── c4 │ │ │ │ └── e4fe3527435943bfd91bc759cde394aca00a43c56f218ca2ca7079c787d9df45510df525beca552336f5420cfef8c523690fcbf9a7a349c955ad6587cf58 │ │ │ ├── e6 │ │ │ │ ├── 31 │ │ │ │ │ └── c208522e3a132e9adde8101848478efcfdbd9d9dedef1a3498f8528e2e3bd63e9b03c11b1b689f80ef79cc3007e9d8113692b75d99b6cc8fd4fc524f3f15 │ │ │ │ └── 6e │ │ │ │ └── 2740aa7ead945bd3d2cd1f9f463380714e1f76e75ff295b2886e97bb4e91b17c9fbd92fe812e42c15c88e3b296e06e720136a948db7b519d3593d2c9d423 │ │ │ ├── e7 │ │ │ │ ├── c4 │ │ │ │ │ └── bd403a86d17c76ed8c0f4adf5f2718af8d8978df6602c1f0cc7d9fbbd5102a52b65e7fb2eb2906772c72cec024b814b341a653f9df7671f3de5278e087bc │ │ │ │ └── c9 │ │ │ │ └── 66c4a480e013722f3f871cc53394e129834f4557e7afe9931edef262860771ce073067c5681043e600b0991bd2e6a9f56834c30aa6db48613546eae0d8ec │ │ │ ├── ea │ │ │ │ └── 6a │ │ │ │ └── e08b4fd9ee6e6504f13f3cdc682341d990770d134d9cb9eea062db05dbdeedec59beac621234d04aec080e7ecc761a0cb5ba6fb176d12a4c594e1affe34d │ │ │ ├── eb │ │ │ │ └── fb │ │ │ │ └── f002c3c2e7371e2c96b7c632a51ed57545731aaaf1d2a2f7e4e81436dbbe703688886d65cad4a0e67a70677a5dd18e30f11710b5405773110be17ec09295 │ │ │ ├── ec │ │ │ │ └── 0e │ │ │ │ └── 92f634a09bf4beecc76d34349bf8853ce7dbd0a89fd002d71841c7c50ba5bc452e08c4864395d2d1d31a82159e830b2ad02e32cfb31b5335c8798d503894 │ │ │ ├── ee │ │ │ │ └── 49 │ │ │ │ └── 3ab8e198f724a0085b11b91a655b3be3884c2e946f3bea97e78d0c6a681240714969dcdd72aceb7b61030166cc6fa29f911b0e7421e8623ee1acfbba21fb │ │ │ ├── ef │ │ │ │ ├── 17 │ │ │ │ │ └── 5c6ad83bfd4fbbf94772a23db3a1db48f47fc8228a6aa3e60e21c64eab59c9c1758167da7cc62bb99655e57a40db66471aefd6bf7e8cc46105c8038b16e8 │ │ │ │ └── 20 │ │ │ │ └── 10a43d94309ccb8b50eabfba856273db68fc7b65f14ae8f888c50e0f7e418fc8dca5d94831f9afee994a2798aaa384ce039df6ccbdd5faa2d5eaf37b2841 │ │ │ ├── f0 │ │ │ │ └── e4 │ │ │ │ └── a5493e3c7cf613ac0c16fb8ab8e0f240eec72decd3f67282dbb7528a041e4f509299294bd218553aa13f8255c4410e359acc0da417ab748ddb7f9e84870c │ │ │ ├── f3 │ │ │ │ └── 3f │ │ │ │ └── 5f545883735913820f7b9388c4bb8f5506d3a5342991621e9eb2d29c70ead7e24ed11fd239488463723f922bd375fd8cb1aeaf5d0118c7475cb516a11090 │ │ │ ├── f5 │ │ │ │ └── 3f │ │ │ │ └── 548d6debd145b973543b193c25969b57c21bd8984cc587331f67d1fb1505adfae65e3e364f8c13ff5b5644c99d6dc065a89b9ff9e9317894f72a8e70c772 │ │ │ ├── f6 │ │ │ │ └── bf │ │ │ │ └── b28bdfa6814df700a723e886d3f684423bbf16ae24a3eadfdc17c0d605927d68e18f393103bdd503cf51702a29bb4175b0987aad7479d125f840c441b8e9 │ │ │ ├── f8 │ │ │ │ └── 6d │ │ │ │ └── ad94b9e6993772c5d9a05196731ca28aab1cec43bc63c70e16720eeb8905183896317bf54f03b08ead598d1c8574e8fd07f97f2344e801d4d99bb9997ac1 │ │ │ ├── fb │ │ │ │ └── 07 │ │ │ │ └── 5b4f51db21cf13bb2531a41b5bb56490f2bdef064219525582fbc6edb0ace29922fb8613e7bf811cccabea9bf8bf817f3504b3cad598254fc5d28abfb7e4 │ │ │ ├── fc │ │ │ │ └── cc │ │ │ │ └── 2b4a058cdaf75b3dad8ffb7f2072d0d69160ad6b6cdddabfd348d4defb96799baa61adc2ad9c254944e9c3286516534e61c34ffd2bc242537aa40b056d5a │ │ │ ├── fe │ │ │ │ ├── 32 │ │ │ │ │ └── 99a0ca70d05f06470978fde2d138f03771f717b4b0293f44332e6513fc7b8f0995b207b218f59acc78ac363bf9c522a3d00773d533d6989b4177d760170d │ │ │ │ ├── 37 │ │ │ │ │ └── c4c0d0dd41504236f8e41a2b7887aa4c3b3abc6c7928a6ae39f1d3edda5323c7e781414a2164d1bd03b0ed3bf3b9ba449bc6e68d1973231e2720c32eab41 │ │ │ │ └── b1 │ │ │ │ └── 5e0a934941b852663195c0ef51155df13ea6e71114bc326210cc2b43ff397a82926e57f6cc2ee37dda81b717b77ca031071d1aee8d25cd52bf1fa639ed2b │ │ │ └── ff │ │ │ └── 2e │ │ │ └── ed24a00b559d653f3799641f636279adacbeddd0ddb3928ae28b96bbafb7611e4588b8b4f36696733092cad5d9984605ff34273889aad33b717b052d9cfc │ │ └── index-v5 │ │ ├── 00 │ │ │ ├── b0 │ │ │ │ └── a5285b1dd41927c25a437d6e06e180ad401616f52c278cd64474969fb3e1 │ │ │ └── df │ │ │ └── 216782e75230fb7e8d7057093e134da919f2d56aa9db5f6f7258b3b537d3 │ │ ├── 01 │ │ │ ├── 3c │ │ │ │ └── 9305c09d5789a41fefc7aa0cd3a8a3813243d247f506487c2f66e9ff5971 │ │ │ ├── 85 │ │ │ │ └── ac002ce9e68821cd39a876c92f3e1be8caeddcf6419d6bc324f70d32b4e9 │ │ │ └── a9 │ │ │ └── b0d0d67beda769e84926f207549943c0bc17abbf66bc20099aaa1bb51736 │ │ ├── 02 │ │ │ └── 3d │ │ │ └── 7ff49953c213d0e9070efaadaaf3c5ec6740893a6f3704b4f14e805bcfa2 │ │ ├── 03 │ │ │ └── 48 │ │ │ └── 75977735688016c583178c5e6055c5d811bf783ee09da9fe4b1137891c98 │ │ ├── 04 │ │ │ └── bb │ │ │ └── e70e70e0cbc9b00841927b0c23c58d97f21063208f3e872c3e04db58c13b │ │ ├── 06 │ │ │ ├── 5a │ │ │ │ └── 98f8c4232b39b6ac68023a0bc186c128dffdec812a144648c26dac71f91a │ │ │ └── 5e │ │ │ └── 2009163f0b101c063269056e566eec4bbc4ec9c8e69f769867337a8ed57b │ │ ├── 07 │ │ │ └── 2f │ │ │ └── c26409f0f3f5f0a9723c9865acfaf682ce8a5f593e491d912d58f53f9ae7 │ │ ├── 08 │ │ │ └── b9 │ │ │ └── 8c0c17709bc08fb63e5f0c39c65b93c80c9663f548e949eb55cb434a357a │ │ ├── 09 │ │ │ └── 8b │ │ │ └── 0ac0d0ead7b0eee61d826bc69cca1c7d40e187e8282c876253d740b9e9f0 │ │ ├── 0a │ │ │ ├── 08 │ │ │ │ └── 7555feef8088d2832129af7ce022f6637283712a9ecd731e4a9ef4932c14 │ │ │ ├── 2c │ │ │ │ └── 10ae97cc0ddca9e23bc5e1c1a10c38f60b99fa734eb5749276bb78987586 │ │ │ └── a2 │ │ │ └── 6a45098c63203072b3c3abfd9346c85ac9bc463e9506bc2bdf17478905a3 │ │ ├── 0d │ │ │ └── b3 │ │ │ └── 097d1aa2272aa0a4559d84bc3e8aa1b5438104f60d0a303dd8cf4a4919e2 │ │ ├── 0f │ │ │ └── f7 │ │ │ └── ef3ad5111001a610f814d854d1ce9853e9d6d710a41430d086d07a0986cb │ │ ├── 10 │ │ │ └── 17 │ │ │ └── fba3d249f38fffb6e9b99fc904d81622ca3edbd864d546795aece3329bb4 │ │ ├── 11 │ │ │ ├── 42 │ │ │ │ └── 63f22fbcf0c21b1e268e7098ba936a48f7ddd6c06761a6c5b4a5fe434ebf │ │ │ └── d4 │ │ │ └── 2f9f9df8a204a306e5baed8f658a43e437792315d561c5eb0315c7a97d50 │ │ ├── 16 │ │ │ └── cb │ │ │ └── 5a69d7ce799d5fc7d26a2056473c94a7bb373b72395bb56a9b740dffd152 │ │ ├── 1c │ │ │ └── 65 │ │ │ └── 74c26755259935f238329c24af2f3305f57b1107f720cc0082e513d83ebb │ │ ├── 1d │ │ │ └── 59 │ │ │ └── c56cdb49f40694dc6b984bd43ff53d96f6ea1dbb06ee467a00e4a697e664 │ │ ├── 1f │ │ │ └── 85 │ │ │ └── 3e0b21cc5deb10a0dc51ed6dace9f5ae0f08f66b5c064b262517165cfa2f │ │ ├── 27 │ │ │ └── ef │ │ │ └── 452a94b385f28d524a6fd9178863fe32cc70bc3d94033a3dda9c91b2e128 │ │ ├── 2b │ │ │ ├── 0f │ │ │ │ └── b8787add1f0675f7298f5d4e498f1c0091c7438fd73df02d649bbcc9c1ce │ │ │ └── 2e │ │ │ └── aa61c0bc2734278e23d60eeeab1fd752744ea5536b3ba08b35b3a667d229 │ │ ├── 2d │ │ │ ├── 80 │ │ │ │ └── b5e9ca2e40744e7fa089861626d2a29c62363c01729964f4cf0c3e8ee632 │ │ │ └── f4 │ │ │ └── 9196d70f82f15d107105ed433fd462721c91b1594984d87b54d57730cb20 │ │ ├── 2e │ │ │ └── 5e │ │ │ └── 52bb770674006416c55571d38721a1575036bc260e9debd40db850bc0b20 │ │ ├── 2f │ │ │ └── 2c │ │ │ └── 2a12420aab34889ed2c64b80f9b722e2e90e139a130f13e34a1c7a0e1e29 │ │ ├── 31 │ │ │ ├── 7a │ │ │ │ └── 9c96d52885c2170f2365ba2c1bb1035008b9daa92b20f4c5e52f16b85113 │ │ │ └── ca │ │ │ └── a8c3ab0670811a3887ede187dcd3856d14272349a18f6844f7c8007cc05e │ │ ├── 33 │ │ │ ├── 19 │ │ │ │ └── a311e591a2b51610ed276fe9968065a74c2f19efd7f917616967040ce127 │ │ │ └── f9 │ │ │ └── 071d7d949ade71febc395082397753f9a225031462df3ac9c8ff4104bbad │ │ ├── 34 │ │ │ ├── 05 │ │ │ │ └── 127f37b0ff3cd9c76b1497b5838d265a8a2b7ef495b7f9841f5d4665ba67 │ │ │ └── 9e │ │ │ └── 35f5913aa7a542b3357025e12a2a126c13ab15a9bfbb40721b56f89ecb48 │ │ ├── 35 │ │ │ ├── 45 │ │ │ │ └── acc6960018d880bf033f23b050a6c442be8b02eb6cd96e01c7ef7b61b640 │ │ │ └── fd │ │ │ └── 45154839db33174def1653b1ca377b1d2a65a4c4e56564fe11d85b67a96e │ │ ├── 38 │ │ │ ├── 04 │ │ │ │ └── a49ce7d19c6d98ec2d5f259e71f17a5727961200c4cf22a88e33ff7bbe5c │ │ │ └── 36 │ │ │ └── 08fcd3ee98bd9b00bb28cc7d417209f374feb4bb23f9093fdab5ff57857b │ │ ├── 3a │ │ │ ├── 10 │ │ │ │ └── 33ebb16ca229c4cbdad65ac0947fbeb3765befe98674faa960578851637f │ │ │ ├── 21 │ │ │ │ └── 946df9356ae372c19a7700e322d8d0276a406143c7375ce22124fad7dfcd │ │ │ └── 46 │ │ │ └── 4a802da9ee2134f8f76df15df8ddd2d0f2b05e7de9b1d7e01669c4278824 │ │ ├── 3c │ │ │ └── f6 │ │ │ └── 26a7f7dccb969c764b8bdecb3667023c64bc1159e674fbeeca633c54964c │ │ ├── 3d │ │ │ └── 2f │ │ │ └── f8441bbef005e18fb70c8e8654894abf17ac44b2140cfd60f172246d894f │ │ ├── 3e │ │ │ └── 49 │ │ │ └── fc9a5a5b33508297834c9a4acf4d4de5b46348df8093fa7d0a6f82aba3d5 │ │ ├── 3f │ │ │ ├── 3a │ │ │ │ └── 2f0714110028b8f228c7c95100ea873c5a00ea03a97ed1d1f555cd404e1f │ │ │ └── 55 │ │ │ └── a551d4620944369d858a04648adf3994a33934840d738144392e51784ac1 │ │ ├── 40 │ │ │ ├── 17 │ │ │ │ └── 8828f1bc3c004a75e5f93ab594b7418ca18ac8660a28916cc6e51643994d │ │ │ └── 1e │ │ │ └── 89f0b89d2ca92cd54ff481086fdd599c67170ea69eb9b22d37e34638d25e │ │ ├── 42 │ │ │ └── 8b │ │ │ └── c02d827ace565a38508b184eec46432a592ba2550cdb1930cd90b866d766 │ │ ├── 43 │ │ │ ├── 5f │ │ │ │ └── 110819c5903563df1824b2214749ef7781289e80d4a600347e3901aac1c4 │ │ │ └── b0 │ │ │ └── 1da35d6e384e0146648258aa5ea61333fd10d6d00300adf4aac974f6d1e2 │ │ ├── 44 │ │ │ └── 10 │ │ │ └── 7cf4f1b3974687000c3e81a7b9d017adb6b8416e32f27309b764b12b8be5 │ │ ├── 45 │ │ │ └── 2e │ │ │ └── 93eac58d3d5aa3f5721ac09fa7c3b814ccb98bc5000550243f4497f78a67 │ │ ├── 46 │ │ │ └── 98 │ │ │ └── 3144eac06844196da14c933cccc766b529c8917a7efc1c6c79bba5651a6e │ │ ├── 47 │ │ │ └── 12 │ │ │ └── 2b0123c780f4536fbd0b803d54bb573a256230046b95fd342da9df92dc8d │ │ ├── 48 │ │ │ ├── 7f │ │ │ │ └── 4f4a841cc66ee33998620da1f4f341e422d9ebb37bb00178f3707927db1b │ │ │ ├── ae │ │ │ │ ├── 1499701156e55c38f37c319e42d8ee632f62ee16e676fb96bf268dc03e39 │ │ │ │ └── f6dae96ac72c3518cd54e6a1cf5ac3bc59c80cfdc62d65a101a0cb67304a │ │ │ └── dd │ │ │ └── 8c8b3dd9e0048fc9974197e48fdfa5ceb084560780473574323b9bfdebd4 │ │ ├── 4e │ │ │ ├── 45 │ │ │ │ └── 17bdb2bc7c0f1b72ba954a40424fb4a9ef5929f88e922704c80b3d264ccc │ │ │ └── be │ │ │ └── da18b216664b1e58df4ffd6782d77f3c28a3f61355544535ff7704cc1b2d │ │ ├── 50 │ │ │ ├── 85 │ │ │ │ └── a29f2ec233233dedaf6d110ada83bf22af3e52848fda04a91b64f889f53a │ │ │ └── bb │ │ │ └── 1a5b513e51544ef3ffcb8dade26b2fd155f2f50104e8ac073030a9d119ee │ │ ├── 51 │ │ │ └── 89 │ │ │ └── 3d02d342de41905761accac02260bce79c49652be9e6066da254d77ba04d │ │ ├── 52 │ │ │ ├── 20 │ │ │ │ └── 702ec5d12a1e111e2534ce89eb0f33f79fe3ffee0e80a428299cdaa0d007 │ │ │ ├── a2 │ │ │ │ └── ba77c6a126c66982a48c1fb49ac1ca7f841619a89a1f0fc5de3512a4b7f0 │ │ │ └── bd │ │ │ └── 1b45d5168ed8296f6d5d5167fe2f8076e2cd5e5d67d2766935784d3e798d │ │ ├── 53 │ │ │ └── e1 │ │ │ └── 0dc9829fd62522b01d70c6eff1025e862877619ba63ab3f1445df0451b8c │ │ ├── 56 │ │ │ ├── 4b │ │ │ │ └── 859813b09e1e5020654bf65fb2f19970c51f08f788d3c4f2ea5137051e1e │ │ │ ├── 71 │ │ │ │ └── fa4fe23b6bc134c60d26da3033c87003fb50204af907f8ec32c9a7c9e48c │ │ │ └── 9b │ │ │ └── 5bc545281ee1f49775ff8b0f2921a08251d503d559ff3f999be9886f1712 │ │ ├── 57 │ │ │ └── b7 │ │ │ └── 2772f8c4daa4b31074e03545f8e473b547e88ef3141501fe2a54e1abdfc4 │ │ ├── 58 │ │ │ ├── 92 │ │ │ │ └── 5799a11997482f78a71307f2134a84b508b74d7faa3535d40d26c6261638 │ │ │ └── f0 │ │ │ └── 4fe556f104b09be642895a82afa463fe560d9a0dc8f507efeef825a6905e │ │ ├── 5b │ │ │ └── 42 │ │ │ └── b4487d788874a06f49235360174f1ba8832e8f6a83cb8533883b8fa09f4b │ │ ├── 5d │ │ │ ├── 58 │ │ │ │ └── 39fdc57612a04067ef7ec1c141646752e6563b84430cd56ba1df2434de91 │ │ │ └── ad │ │ │ └── 1cb61ae613816d5f049cd87dd24009e364126f73726b1f8eab2350fec505 │ │ ├── 60 │ │ │ └── df │ │ │ └── 89f1345cb5849d888a2cce2e6d6ddc0014eb3d6722956a06241f6e7f3d58 │ │ ├── 63 │ │ │ └── d3 │ │ │ └── bb861348e4b5fc53b62454cd498b01af8a51c93c0ebb3f9ca712ca253566 │ │ ├── 69 │ │ │ ├── 33 │ │ │ │ └── b968e19e42cda755b43c4bd1e354056b2be0e8ff44896e82e4bc9fdb6322 │ │ │ ├── 7f │ │ │ │ └── ee4d73554ca4b3320cb01b422b9a9d45f388513d8fd2ccf4df9187578ce1 │ │ │ └── 97 │ │ │ └── dc07bc0d29ed2880b0e39905e8bc8a24a0344155c90a7ca65c8093d51295 │ │ ├── 6a │ │ │ ├── 86 │ │ │ │ └── 14653864a77b7c8644710834018401ea9fd5653744bbbea2201a6af48a9f │ │ │ └── a7 │ │ │ └── 23f89bea37ae703ce622e7188ccb889113f1d355f754c11544a1caec4cc6 │ │ ├── 6d │ │ │ ├── 40 │ │ │ │ └── 0b02ee474cc305b6d0da00248cfa61780731440b4f237c6251314258b9bd │ │ │ ├── 61 │ │ │ │ └── c9e7e8446341cea439547eb023fbf47c954ba932e6944a3fd50413c1e861 │ │ │ └── 65 │ │ │ └── 05c74d488e52e860b9de3668e482a62f5796264d2bf9f2700cf9423add5e │ │ ├── 6e │ │ │ └── 9e │ │ │ └── 2004cc0984629401a6a3d3fa16900d49ac70112df7a8c515ec028b34c59d │ │ ├── 6f │ │ │ └── 9f │ │ │ └── 4244544732d3e784c8fd360e0ea256a943488c53a834da3d0ddf3e83af9b │ │ ├── 73 │ │ │ ├── c1 │ │ │ │ └── d8bbb109a8fa2903d912518bf54776b7794c8f6f0a759234283c3c2eefab │ │ │ └── e2 │ │ │ └── 434e6cce71a37629e1945f6d35d5e52c1e34aa88ef24d1915846c72775f1 │ │ ├── 77 │ │ │ ├── 59 │ │ │ │ └── 986079464467eb2c4f1c178bf1c9fa9179b3c8384bd1eff68534419250ea │ │ │ └── d8 │ │ │ └── 4c73393b4c86b064a434ecae7c4c202784cc49493fdc99469a7dc797494b │ │ ├── 79 │ │ │ └── 0e │ │ │ └── e6e294a39cc9407b6358b7284df63feda5d4f96e51519630d06219175167 │ │ ├── 7a │ │ │ ├── 05 │ │ │ │ └── 8c39e8b9b5af7db5ea9983334f3ee2532aae9b7973de1dbb581781947ed3 │ │ │ ├── 1d │ │ │ │ └── aa5b15d3f974ebd32c44778518e0984265598aa1e2dddc4ded4feb2a11b1 │ │ │ └── 23 │ │ │ └── df8deeb6de869825106ce68786ba9e16686f20a8b4f1c626c9635a5bc8da │ │ ├── 7b │ │ │ └── 1d │ │ │ └── 314b6515b77b62a66c8a2ac140ac4a6926135c5866837fddded37acb1acf │ │ ├── 7c │ │ │ ├── 20 │ │ │ │ └── cba9852dc5e0811d9e6e24e74108bf7727a0c2730516ec8f41a08f13116b │ │ │ └── 9a │ │ │ └── 13a1f5cfe2738ebf2558b3fc8173e47bffd478a46c35ee5e0fc6e72e511d │ │ ├── 7d │ │ │ └── e8 │ │ │ └── 5446c5cdae0493e4ad3b10347b77c8df4b17b5fbe14834f5c6b06faa9f95 │ │ ├── 7f │ │ │ ├── d5 │ │ │ │ └── 36068d8df17b31ccdbeedbb62ae94e354f6d768324e0dd6578917b8ecc16 │ │ │ └── f6 │ │ │ └── 5e3925b158405271b2f44be4d1ecbb5c60b3b7da87819ce03956b759b051 │ │ ├── 83 │ │ │ └── ef │ │ │ └── aff47278d7ef72e864717a2bb5e09eca947c1b761d2a3f590af1b5f1b379 │ │ ├── 85 │ │ │ ├── 20 │ │ │ │ └── 71a0d0584d5ae3631b6b48b18785908616327f10115d683585b05072ca1b │ │ │ ├── d3 │ │ │ │ └── 1b45f9b1e17b38c211d236888c737ca95cd5b9ca0e42c51cff12aece643f │ │ │ └── d8 │ │ │ └── 7da2d1eaa517a5e80f7a1a8d7dee184babfd49523097c7b2ea907d755944 │ │ ├── 86 │ │ │ └── df │ │ │ └── f30ac40daf6afa3c806cd525ffbf33eaad06c5f38e08f7ce9428a303241e │ │ ├── 87 │ │ │ └── eb │ │ │ └── ab402da37b8ea447b0cac7c54cf3452aae056ac8c63514cb6730629409a8 │ │ ├── 89 │ │ │ ├── 0b │ │ │ │ └── e2ba88ed525834b932f3ddb5624a540e279742a3c6851ec4ee466890a5ed │ │ │ ├── 0c │ │ │ │ └── 98d70e9e25b9a23c255f11b8acd5d9ebed836d0004871577846f3bc3f03f │ │ │ ├── 39 │ │ │ │ └── d7518a088b510f892a8355a21e2971328f68a8ef26d1962bbcfc70c84725 │ │ │ └── 58 │ │ │ └── 62a9a2b49fd26f8d788adbe5cc377e776463c3a01839945896d96fa48d4f │ │ ├── 8a │ │ │ ├── e9 │ │ │ │ └── f78a927b119d27ece8b731dfde1470b48159f26c89ce35d5fe0fc80122ed │ │ │ └── ea │ │ │ └── a9d2d6ff75cba71d63171f51aa258a77d99513740280af3884c1dea1f7cd │ │ ├── 8b │ │ │ ├── 4c │ │ │ │ └── 6c0c483d470762dc61c704d8d07e1edd6421400f274c32ea22f543bfdb16 │ │ │ ├── d9 │ │ │ │ └── 617f84454e0342f885f6cbdd2661990c9060f183e29553e39e0506dbd847 │ │ │ └── ee │ │ │ └── c2ea22c4bf9c5ddcd0333850e543442de3364478847c7ebc382b1ff3a70d │ │ ├── 8c │ │ │ └── 9a │ │ │ └── e014072a08e7ba0b90a6897c5737bc438be37650b0470bfd7c0b83e18e23 │ │ ├── 8e │ │ │ ├── 58 │ │ │ │ └── 1ce1355f39c75fa063f8dc1c958c11d57446438253b206afc18efb9f28c9 │ │ │ └── ff │ │ │ └── fc9a834a298aa364d38f286bfc395217fe0559c9b322231ff5f6265ba504 │ │ ├── 91 │ │ │ └── 08 │ │ │ └── 56fc6b8aa67287e6e60a90a5e8bd6500ef9e97a317a38b324cca616a7d25 │ │ ├── 93 │ │ │ └── 31 │ │ │ └── 9f96e29572a9b3bd880f19dde2e443b99ec81a4258f3e56ce1c4fff64852 │ │ ├── 94 │ │ │ ├── 07 │ │ │ │ └── a7c22ba183764c0c27f706d74812444c27c14a97fc43669b7dd7c32a717f │ │ │ └── 49 │ │ │ └── 0c8e6bfaa289aa93424dc1f6f28b3decc9f59cb08be977c3040f7d244ac3 │ │ ├── 96 │ │ │ ├── 7c │ │ │ │ └── 454eb1ff3ec3546d35165170f771ff1c65f055203c5ab9f907e6af7067a8 │ │ │ └── c5 │ │ │ └── cfd4f290453cd7201716a3217433fe76e994d06ad3a598a6ab5772d5280f │ │ ├── 98 │ │ │ └── fe │ │ │ └── c68a85433f7c743aa9b9427fb21be6fd8c25f9e7893bd5cf65537496008d │ │ ├── 9a │ │ │ ├── 76 │ │ │ │ └── 06192603daebdeebec6ad6e070357bb297b864354a3998c359fa50ad570b │ │ │ └── bc │ │ │ └── 143ae50ba22ddec235347ed6a62762b673eddb52cb1939aea401679de36b │ │ ├── 9d │ │ │ └── 0d │ │ │ └── cb301e666cb1b3f23405c9a023a97e35e0b646458b0dc07d4e4c45f072d2 │ │ ├── 9e │ │ │ └── 24 │ │ │ └── 74490f75d8dec7ba5051c2fb1e3119fa15abb79366ea7664e5fbb2977153 │ │ ├── 9f │ │ │ └── 43 │ │ │ └── 3636172cbc03abf2262c921f9f71572e6b049aa3db8c65d166bcfe5aca5f │ │ ├── a1 │ │ │ └── 78 │ │ │ └── ee48142ac207e21a1a2eac9ca7111587ce699eebdc565abb3dfe976abf96 │ │ ├── a2 │ │ │ ├── 60 │ │ │ │ └── ea4e9555df962e8a55d27858ec6e935db7b0356b46d10718029046780c27 │ │ │ ├── 68 │ │ │ │ └── b7b4c1f69b4b4ff6c19e7de1b75dfa3eefbab3d36b6ce4ef15d6f64afb9c │ │ │ └── b5 │ │ │ └── f2c35332a5ab256ee9271034e3b3b301ece6931e6e92531ca0bd8c08fe9a │ │ ├── a3 │ │ │ └── 50 │ │ │ └── b739b1f6f936987c26973cec93f36482ed240ab90158c0d04899bab0de13 │ │ ├── a4 │ │ │ └── b7 │ │ │ └── a7cebac941d6c47ac2f6fde93c17edf93f4ae4aa6b051499d8f2ffeab614 │ │ ├── a5 │ │ │ ├── 87 │ │ │ │ └── bc838260e09216f01f45e48f0f96cb7691d978001a792540928b1153baa5 │ │ │ └── b8 │ │ │ └── 454c882933ab15d532e2493b0bd7ce7019f1caca2abb46f076ca0855330b │ │ ├── a6 │ │ │ └── 54 │ │ │ └── c1733144b73a0422b1daf6390b4562d52ec887d209b643d8b0b789a2e4b1 │ │ ├── a7 │ │ │ └── 04 │ │ │ └── d0646f5e87aed79d9f0ad28e40eff59b4872fd92336c436b29f7280a9d3a │ │ ├── a9 │ │ │ ├── 92 │ │ │ │ └── c230215c94371d341f1b38927e5f481994a870132101fd50efb0449f27c2 │ │ │ └── f7 │ │ │ └── 4c2a9fe6575921726a5579be73ddb2a3e8a7abbbb66a28c50ca8deaeccc5 │ │ ├── aa │ │ │ └── cb │ │ │ └── eb7e78deaaf4e5eba36039b514bbe6541a5e440f56bda5447a6a0c81f2aa │ │ ├── ab │ │ │ └── f0 │ │ │ └── 041961d523d853b40e4e55be33fe676651a97b630d01af1b06b28abc5697 │ │ ├── ac │ │ │ ├── 5d │ │ │ │ └── bac3965880e0e18bc7d1e21519c9073430f53c69821d54a4aeb5c313357f │ │ │ └── 86 │ │ │ └── c0732592365d753d382502d91754a3c88f8b20e22cc25a0327beb9429687 │ │ ├── ad │ │ │ ├── 5c │ │ │ │ └── 217f4a9502eed2896935b005b187e4713d93ba3dc76eff284b00a1a8b92a │ │ │ └── 7c │ │ │ └── cc598261aa7c1f089fdcd0478664f8f5c80f8f02f241f08e3be264a9e616 │ │ ├── ae │ │ │ └── 78 │ │ │ └── cedd14d309b153583ec33b511626642a5b2cecfae082a664e1e6a368bc97 │ │ ├── af │ │ │ └── 8a │ │ │ └── d90cfcd33a9895fbbb880406407aee65cd5b37556b94baafb95ba5cb93dd │ │ ├── b0 │ │ │ └── 4a │ │ │ └── c18a99a2710b49b5a3a1121226be4940f623f8ba056f8108a634ed347da9 │ │ ├── b1 │ │ │ ├── 4a │ │ │ │ └── 6796e751962cdc0f1d356f7c34ae7e66a41858d769156329b5bd4379d591 │ │ │ └── 8f │ │ │ └── 5767f914aa664f32503df614481bac973784e2bcd2b8af02e84faabe168d │ │ ├── b2 │ │ │ └── 53 │ │ │ └── a51760f3239bd143eb2f11ec8f083702e47b0ca67ac04a9a45e7336f6cde │ │ ├── b3 │ │ │ └── 63 │ │ │ └── f693e1cbbd8c651339dc83ea677e236d61935b81de6396cb4847fd5b08e4 │ │ ├── b4 │ │ │ └── d4 │ │ │ └── aa802aaebfa5cce97b6f2e688062d965ef9940c20866c45eb34a72b47d05 │ │ ├── b7 │ │ │ ├── 38 │ │ │ │ └── 992d3e6c01fc9098d137f7dbccfcaa5f5124ba9c487e582e6e0d83f99d30 │ │ │ └── fe │ │ │ └── e66fb9a38a1ef7da481d041bc0dd117c0c2bddfa61bcf516da1e1486c290 │ │ ├── bd │ │ │ └── e8 │ │ │ └── 7741857e809594830141a639d3d54110945a88bb85691de2f9dc97402c84 │ │ ├── be │ │ │ ├── a3 │ │ │ │ └── c0779c8e0be92c748c91a7dad4e6f0fe57ba0158b6bb1bcfddd8fc56c934 │ │ │ └── f0 │ │ │ └── 1030b67d1c2d501a0e14ff9aea82addbf8b2e760ef58a5be510d7b4bad3c │ │ ├── bf │ │ │ ├── 03 │ │ │ │ └── d5dd5fa44593b3e2d24e270c89a4ebe5809a69837946acbe11b5f9ab29d0 │ │ │ └── 7c │ │ │ └── 375aec77f76404d91225e72006a0105b2a6ec04bb02cfa365ebcd4a0232b │ │ ├── c0 │ │ │ └── 83 │ │ │ └── 1295af917239a2fbe94404f49d472949b2a2519701a35e8dc9841f02ae34 │ │ ├── c1 │ │ │ ├── 3e │ │ │ │ └── 4c4d082623156529b4fa73601a4ac92e33a6b20f963f1096cee31b6d9010 │ │ │ └── 8c │ │ │ └── e4e9afe177a9d6771d71fe96d51887f262a8fede9d9d3e06ca7ddcf20990 │ │ ├── c2 │ │ │ └── d9 │ │ │ └── 7fb959fc2a833b8e68b8306a1b7d4cd5f15c8b4e0c9d6b46a6765796482e │ │ ├── c3 │ │ │ └── c6 │ │ │ └── be9e8d92e3e1f8898fedbe33cae4e67f0352de1b0d48fee9cb29ecc1d6ab │ │ ├── c4 │ │ │ ├── 11 │ │ │ │ └── bf2dd5bf2d9b9006f82aeedaffc7f69ad64358a9a08afe81cbcdca1766f2 │ │ │ ├── 68 │ │ │ │ └── b71baf5025326649162df1bd325b5637dd1e72f59a32177b49318d5efeac │ │ │ ├── ac │ │ │ │ └── 4511be3eecea50ee9cadc09a612f9be8598d7b29d5c8b1253c75fa283cc5 │ │ │ └── ca │ │ │ └── df46b5b6c6148487b1afb20084da52f2838a08143f9b0ebd217d2a229e9a │ │ ├── ca │ │ │ ├── 98 │ │ │ │ └── 29ae16b7b413d7a609c6beba2ab22ac51a8f88aa3c3a36759292907ce3ac │ │ │ └── f8 │ │ │ └── 5fdf8973f1896e77c07a4919f6166c6a04ef8354c5efb0156670a06d24e3 │ │ ├── cb │ │ │ └── c7 │ │ │ └── 8dc870ee1a760dfda5ed1c13aec5056dae100cec5c9af892474d802a65b0 │ │ ├── cc │ │ │ ├── 25 │ │ │ │ └── 0a0ad2d0308b6807a70e488194992de068d68b749910eee4847c38629984 │ │ │ ├── 60 │ │ │ │ └── ca5eb4c028e64ab99a3a71e5e6cff685d49a0052a23f473310db7d984f23 │ │ │ └── fb │ │ │ └── 96cd6e2c34dfd1fc2a68d5b85c353ec81fec75a8e0856070c12777141d13 │ │ ├── d0 │ │ │ ├── 12 │ │ │ │ └── 0e893a332c0e07c4e6ad382322604cf61f86ba7822a3e02b24d4105846cb │ │ │ ├── 39 │ │ │ │ └── f3ea46b7a48d1b108681523c9e802f48f2779894068bc9b984863ca18939 │ │ │ ├── 57 │ │ │ │ └── 3aa5d94761ad382e1a1acc61203736494009e20422bce1dd1433666dd012 │ │ │ └── f3 │ │ │ └── 570007f66e0a594c21201eb3e8f15d7a4d92bcb97b59246e5b7194b3b290 │ │ ├── d1 │ │ │ ├── 34 │ │ │ │ └── dd11aca2ddd3aeb854849cd81cab78174fc5ea935c0fd552de94684f90a8 │ │ │ ├── 3b │ │ │ │ └── 5d145862c809774efedb998cae0b11c4062b94265112f8db93a55edb929e │ │ │ └── 91 │ │ │ └── 1ea8e1c5735aa7333775abaea09cba50e98296556053fba7d4dd227c6732 │ │ ├── d2 │ │ │ ├── 3c │ │ │ │ └── 9b2e81a9ef349bd31c3c94f1c2d4040643ee96b8128c972db597415d555c │ │ │ └── 53 │ │ │ └── 0423c306fc66318eb336eeb4033781a7b495f0aa3ba92eec00f34069f13e │ │ ├── d4 │ │ │ ├── 42 │ │ │ │ └── dcecd9ea33544599eb1e71ac0fd23e843f4caf0dd35ae634e5a1e2bca450 │ │ │ ├── 8f │ │ │ │ └── 715a86aa779da41ab634b8f3191069d4b2966a3c5b47cb739ab6a9b93aec │ │ │ └── a2 │ │ │ └── 61ef4c73c2a4a1a021b2b9d9d54cd0acbea9f5e44cebff230278f27bd92a │ │ ├── d5 │ │ │ └── f4 │ │ │ └── 0913a74f5e223a4fe6108493dd3b03c2d47259df459926160659513c9ad3 │ │ ├── d6 │ │ │ ├── 3c │ │ │ │ └── 3fd6a899c59ae533d9a5bb44570ada1eddb5802483d3e7812df2c207a7e1 │ │ │ ├── 47 │ │ │ │ └── 2d4e4b363564f0b3d6e59012bb07573fb947a866841f5259a96439aa3964 │ │ │ └── 4d │ │ │ └── 95351bd7b1c4630fa6590049d83b56ced950f5f2fd281f27e28527249cee │ │ ├── d7 │ │ │ └── 98 │ │ │ └── 895bffa858148e74eb0bae5ede536d11e4eb6ba643223069874bea4f6498 │ │ ├── d8 │ │ │ ├── 62 │ │ │ │ └── fa9d7982c1af34cc1664c1504cdcf5728bee5cbfba341507a5c033098737 │ │ │ └── f2 │ │ │ └── dfd78c09b8752f2fd7100ea4a9f64cec29a053d57d72983420eb853b3e6a │ │ ├── dc │ │ │ ├── 47 │ │ │ │ └── 9e3985de44e70129e4e28c25bdc69a204acabcbdd5962cf5109db4ca7aa5 │ │ │ └── 8a │ │ │ └── 4dc2a1bdf5b195e99648a945ce742de5f6d0b1aac410a6fe3e7155933cc7 │ │ ├── e1 │ │ │ └── 53 │ │ │ └── 4da55a553f57b5ef4eb84d567d8d4fbd67732c8c090da290c199e0ac2ed4 │ │ ├── e3 │ │ │ └── c5 │ │ │ └── ad2fd86fe0c1b9f233d92c25e56b1a582b8425b52db4767f8d72410c021f │ │ ├── e4 │ │ │ └── f2 │ │ │ └── 0b57f65571788559ed93ba6d26cacaac21da8e4adfe374787669e431e875 │ │ ├── e6 │ │ │ ├── 37 │ │ │ │ └── c9e69f5074e9a22c766ffcc622280d4e580d2ee0238f670f28199487dd44 │ │ │ └── f1 │ │ │ └── aa87087a727f6fb26b60b78c06c2b830f509c809c7b1752ab1bcab0a15af │ │ ├── e7 │ │ │ ├── 40 │ │ │ │ └── 70186a6ceaad19b6b11ac1bccf00fa5e038b8151d455127f9868f0051d57 │ │ │ ├── 6f │ │ │ │ └── 6df2d13a4e315af18cce3e1c8a09c911262fc54f57e6fc47d361ddcf408d │ │ │ ├── 9e │ │ │ │ └── 9df988403d9266b9610bf520678520e200090b726c2ea164a0fe727500ba │ │ │ ├── a3 │ │ │ │ └── 60cfc8947cb925b4deffc13cf15258a667e1653daa12cf0001b2e0083bfb │ │ │ └── e9 │ │ │ └── d2369beb18730dc4f30e1c9dcdf5bf16ac9bd28dec641b81ff8e8616e7fc │ │ ├── e9 │ │ │ ├── 6e │ │ │ │ └── ba29811d787f0fd92ce7f4bc3a6827dc6d66c47153d50683c80d6e7a9a6f │ │ │ ├── 9a │ │ │ │ └── b309e8b758264ef32fd578a2928ad1ac4a3241e8c570a5c275e121dd7ee1 │ │ │ ├── bf │ │ │ │ └── 0bfc4abc982e4aecac42d77dbded146ef0ce46649865b55d62144af5a96d │ │ │ ├── cb │ │ │ │ └── b6d58aac267a95803951157a42d29db6c17ef57c66eb59c48684c280e4e8 │ │ │ └── df │ │ │ └── 500f6d65c0cf35c0f7c0635f953b37393168aa27cb55c7b0ce3399c0d7f2 │ │ ├── ec │ │ │ ├── 87 │ │ │ │ └── d81e1e7b2d776e609dbfaa2175a5825c0a63a9bcc70fdb5694b81e7f4fc3 │ │ │ └── 8e │ │ │ └── 97eeecddd26637708519813d42ee2a5ec256bd4831ffa02269e8993e19b7 │ │ ├── ed │ │ │ └── 40 │ │ │ └── e67da4ad085eef0344d8e253e4455423e0efc042d3898be0a399d1a76b79 │ │ ├── ee │ │ │ ├── 3d │ │ │ │ └── 1ab77d088759d13cd44eab2a2f7764233b7908340d97282d9765e014f29c │ │ │ ├── 60 │ │ │ │ └── 850558038dbacbcba5202b181a0a0c4f947405cf3682df3e1c20dec79137 │ │ │ └── 7a │ │ │ └── ee0e1b8bea3f05c1b42f1fe4a17fdc2aa37be14405f4e293de10bd30eb80 │ │ ├── f1 │ │ │ ├── 53 │ │ │ │ └── 8aee994a2b5c701755cdc5660748a90199cf48437f5f93fdd0572344f2f1 │ │ │ └── a1 │ │ │ └── 1de8ff1c9230508fdf1c71b3faa1a9d2aade80a7e0b0d4daa6f4040d8ba2 │ │ ├── f3 │ │ │ ├── 2c │ │ │ │ └── 80267cf9b394a43404ccabe3e574f5fd89b769b43be625b75ff9b1b4a2ee │ │ │ ├── 8b │ │ │ │ └── 4a6b7b0714b6f1c94fff48ad31ee18cb6aa93ed63612067b4de30efd43f8 │ │ │ └── f5 │ │ │ └── d11839881d6df2061b642074ebfaf84ce0d4b1d8e227ad335d364cf6a913 │ │ ├── f4 │ │ │ └── 47 │ │ │ └── 8cb011f7e5de40eae9588617e8f3bce662a0ba2d60796b559a420b44783a │ │ ├── f6 │ │ │ └── c7 │ │ │ └── c2aee6453a94a772577d770a438f34805af27cbf0c7a776b19d6850307b5 │ │ ├── f9 │ │ │ └── 82 │ │ │ └── 228120d240455dd412cb68cbe2007319fbf91d96bb998e7f24c45faadc0b │ │ ├── fa │ │ │ ├── 88 │ │ │ │ └── 31cbd6ca584e75edf3642c6f8b079c1f2b5eca1d7b2780ce2e86c24f1e84 │ │ │ └── a1 │ │ │ └── dd9e9a25a0a13875f496dfc7b415ddc641f6b30648050accc001be4635ee │ │ ├── fb │ │ │ └── fc │ │ │ └── 6282476d454ca3b17e0ba6cf70a4b6a87142bd8f3139517d572b2f9911a4 │ │ ├── fc │ │ │ └── ee │ │ │ └── fc3e1dd6706bd557d2840d92ff10cdd6928b92fb8c46d2195dfbd8d4b2be │ │ ├── fd │ │ │ └── 60 │ │ │ └── 528c5445a438483b66270e6a4dddfa6e9bdcceb2b998cb6f7580d23ceb1b │ │ └── ff │ │ ├── 9f │ │ │ └── 48b5354df0d5feb3420245101c38efe5fb13f171ce2093c16eeb4ba41c7e │ │ └── d6 │ │ └── 9ea5f7eac400baceca422723dd933d7c505c100130f066f787943d1ac679 │ └── _update-notifier-last-checked ├── .pre-commit-config.yaml ├── .pre-commit-setup.md ├── .prettierrc.json ├── .tmp │ └── temp-1758247471070.ts ├── archive │ └── ebook │ └── enterprise_architecture_mcp_ebook.pdf ├── async-fix-verification-summary.md ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── custom │ ├── dir │ │ └── adr-0001-complete-decision.md │ └── research │ ├── dir │ │ └── perform_research_test_research_001.md │ └── README.md ├── debug_test.js ├── docker-compose.docs.yml ├── docs │ ├── .dockerignore │ ├── .gitignore │ ├── .vitepress │ │ └── config.js │ ├── adrs │ │ ├── adr-0001-integration-test-decision.md │ │ ├── adr-0001-test-decision.md │ │ ├── adr-001-mcp-protocol-implementation-strategy.md │ │ ├── adr-002-ai-integration-and-advanced-prompting-strategy.md │ │ ├── adr-003-memory-centric-architecture.md │ │ ├── adr-004-security-and-content-masking-strategy.md │ │ ├── adr-005-testing-and-quality-assurance-strategy.md │ │ ├── adr-006-tree-sitter-integration-strategy.md │ │ ├── adr-007-cicd-pipeline-strategy.md │ │ ├── adr-008-development-workflow-strategy.md │ │ ├── adr-009-package-distribution-strategy.md │ │ ├── adr-validated-patterns-framework.md │ │ └── README.md │ ├── api-styles.css │ ├── CODE_OF_CONDUCT.md │ ├── community │ │ ├── .github │ │ │ ├── ISSUE_TEMPLATE │ │ │ │ ├── bug_report.yml │ │ │ │ └── feature_request.yml │ │ │ └── PULL_REQUEST_TEMPLATE.md │ │ ├── CODE_OF_CONDUCT.md │ │ ├── CONTRIBUTING.md │ │ ├── README-library.md │ │ └── SECURITY.md │ ├── configuration.md │ ├── context │ │ ├── README.md │ │ └── research │ │ ├── latest.md │ │ ├── perform-research-2025-10-20T15-31-34-312Z.md │ │ ├── perform-research-2025-10-20T15-31-34-314Z.md │ │ ├── perform-research-2025-10-20T15-31-34-316Z.md │ │ ├── perform-research-2025-10-20T15-31-34-318Z.md │ │ ├── perform-research-2025-10-20T15-31-34-319Z.md │ │ ├── perform-research-2025-10-20T15-31-34-321Z.md │ │ ├── perform-research-2025-10-20T15-31-34-323Z.md │ │ ├── perform-research-2025-10-20T15-31-34-326Z.md │ │ ├── perform-research-2025-10-20T15-31-34-328Z.md │ │ ├── perform-research-2025-10-20T15-31-34-329Z.md │ │ ├── perform-research-2025-10-20T15-31-34-331Z.md │ │ ├── perform-research-2025-10-20T15-31-34-332Z.md │ │ ├── perform-research-2025-10-20T15-31-34-335Z.md │ │ ├── perform-research-2025-10-20T15-31-34-336Z.md │ │ ├── perform-research-2025-10-20T15-31-34-338Z.md │ │ ├── perform-research-2025-10-20T15-31-34-340Z.md │ │ ├── perform-research-2025-10-20T15-31-34-342Z.md │ │ ├── perform-research-2025-10-20T15-38-18-479Z.md │ │ ├── perform-research-2025-10-20T15-38-18-481Z.md │ │ ├── perform-research-2025-10-20T15-38-18-482Z.md │ │ ├── perform-research-2025-10-20T15-38-18-484Z.md │ │ ├── perform-research-2025-10-20T15-38-18-486Z.md │ │ ├── perform-research-2025-10-20T15-38-18-487Z.md │ │ ├── perform-research-2025-10-20T15-38-18-489Z.md │ │ ├── perform-research-2025-10-20T15-38-18-491Z.md │ │ ├── perform-research-2025-10-20T15-38-18-492Z.md │ │ ├── perform-research-2025-10-20T15-38-18-494Z.md │ │ ├── perform-research-2025-10-20T15-38-18-495Z.md │ │ ├── perform-research-2025-10-20T15-38-18-497Z.md │ │ ├── perform-research-2025-10-20T15-38-18-501Z.md │ │ ├── perform-research-2025-10-20T15-38-18-503Z.md │ │ ├── perform-research-2025-10-20T15-38-18-504Z.md │ │ ├── perform-research-2025-10-20T15-38-18-505Z.md │ │ └── perform-research-2025-10-20T15-38-18-507Z.md │ ├── CONTRIBUTING.md │ ├── CONVERSION_CHECKLIST.md │ ├── DEPENDABOT.md │ ├── DEPLOYMENT_GUIDE.md │ ├── development.md │ ├── diataxis-index.md │ ├── DOCKER_SETUP.md │ ├── DOCKER_TEST_SUCCESS.txt │ ├── docker-compose.yml │ ├── Dockerfile │ ├── DOCUMENTATION_IMPROVEMENT_PLAN.md │ ├── DOCUMENTATION-UPDATE-PLAN.md │ ├── DOCUSAURUS_MIGRATION.md │ ├── DOCUSAURUS_QUICKSTART.md │ ├── docusaurus.config.js │ ├── explanation │ │ ├── adr-philosophy.md │ │ ├── ai-architecture-concepts.md │ │ ├── ai-workflow-concepts.md │ │ ├── ape-framework-design.md │ │ ├── architecture-overview.md │ │ ├── context-file-tool-coverage.md │ │ ├── index.md │ │ ├── knowledge-generation-framework-design.md │ │ ├── knowledge-graph.md │ │ ├── mcp-architecture-flow.md │ │ ├── mcp-concepts.md │ │ ├── performance-design.md │ │ ├── prompt-engineering.md │ │ ├── reflexion-framework-design.md │ │ ├── security-philosophy.md │ │ ├── self-learning-architecture.md │ │ ├── server-architecture.md │ │ └── tool-design.md │ ├── how-to │ │ ├── deploy-to-production.md │ │ └── index.md │ ├── how-to-guides │ │ ├── ape-implementation-strategy.md │ │ ├── ape-usage-guide.md │ │ ├── bootstrap-architecture-docs.md │ │ ├── cicd-integration.md │ │ ├── contribute.md │ │ ├── custom-rules.md │ │ ├── deploy-your-own-server.md │ │ ├── deployment-readiness.md │ │ ├── dynamic-pattern-configuration-system.md │ │ ├── firecrawl-setup.md │ │ ├── generate-adrs-from-prd.md │ │ ├── getting-started-workflow-guidance.md │ │ ├── hybrid-dag-bootstrap-design.md │ │ ├── installation-guide.md │ │ ├── interactive-adr-planning.md │ │ ├── knowledge-generation-usage-guide.md │ │ ├── large-team-scaling.md │ │ ├── llm-context-file-configuration.md │ │ ├── mcp-client-compatibility.md │ │ ├── migrate-existing-adrs.md │ │ ├── performance-testing.md │ │ ├── prd-to-adrs.md │ │ ├── progress-tracking.md │ │ ├── prompting-guide.md │ │ ├── reflexion-implementation-strategy.md │ │ ├── reflexion-usage-guide.md │ │ ├── research-integration.md │ │ ├── security-analysis.md │ │ ├── server-context-file.md │ │ ├── testing-guide.md │ │ ├── tool-context-documentation-plan.md │ │ ├── tool-development.md │ │ ├── troubleshooting.md │ │ ├── using-validated-patterns-with-live-sources.md │ │ ├── validated-patterns-implementation.md │ │ └── work-with-existing-adrs.md │ ├── ide-rules │ │ ├── additional-workflows.md │ │ ├── command-structure.md │ │ ├── environment-validation-workflow.md │ │ ├── ide-specific │ │ │ ├── cursor │ │ │ │ └── cursor-rules-template.md │ │ │ ├── jetbrains │ │ │ │ └── jetbrains-rules-template.md │ │ │ ├── vscode │ │ │ │ └── vscode-rules-template.md │ │ │ └── windsurf │ │ │ └── windsurf-rules-template.md │ │ ├── quickstart-guide.md │ │ ├── README.md │ │ ├── standalone-usage.md │ │ └── universal-workflows.md │ ├── index.md │ ├── LOGO_DESIGN_PROMPT.md │ ├── Makefile │ ├── mcp-planning-tool-usage.md │ ├── MIGRATION_GUIDE.md │ ├── nginx.conf │ ├── notes │ │ ├── DEVELOPER_GUIDANCE.md │ │ ├── knowledge-graph.md │ │ ├── media │ │ │ ├── 01-first-steps.md │ │ │ ├── diataxis-index.md │ │ │ ├── install-rhel.sh │ │ │ ├── LICENSE │ │ │ ├── mcp-client-config.md │ │ │ ├── mcp-concepts.md │ │ │ ├── performance-design.md │ │ │ ├── security-philosophy.md │ │ │ └── troubleshooting.md │ │ ├── performance-design.md │ │ ├── prompt-engineering.md │ │ ├── README.md │ │ ├── RESEARCH-DRIVEN-ARCHITECTURE.md │ │ ├── RESEARCH-DRIVEN-INTEGRATION-ANALYSIS.md │ │ ├── research-driven-workflow.md │ │ ├── research-integration.md │ │ ├── technical-debt │ │ │ └── LINT_CLEANUP_PLAN.md │ │ ├── tool-design.md │ │ └── USER_GUIDANCE.md │ ├── package-lock.json │ ├── package.json │ ├── public │ │ └── logo.png │ ├── QUICK_START.md │ ├── README_SCRIPTS.md │ ├── README-library.md │ ├── README.md │ ├── reference │ │ ├── analysis-tools.md │ │ ├── api-documentation.md │ │ ├── api-reference-updated.md │ │ ├── api-reference.md │ │ ├── comprehensive-api-reference.md │ │ ├── environment-config.md │ │ ├── generation-tools.md │ │ ├── index.md │ │ ├── mcp-client-config.md │ │ ├── security-tools.md │ │ ├── usage-examples.md │ │ └── validation-tools.md │ ├── release-dashboard.md │ ├── research │ │ ├── perform_research_research_000.md │ │ ├── perform_research_research_001.md │ │ ├── perform_research_research_002.md │ │ ├── perform_research_research_003.md │ │ ├── perform_research_research_004.md │ │ ├── perform_research_research_005.md │ │ ├── perform_research_research_006.md │ │ ├── perform_research_research_007.md │ │ ├── perform_research_research_008.md │ │ ├── perform_research_research_009.md │ │ ├── perform_research_research_010.md │ │ ├── perform_research_research_011.md │ │ ├── perform_research_research_012.md │ │ ├── perform_research_research_013.md │ │ ├── perform_research_research_014.md │ │ ├── perform_research_research_015.md │ │ ├── perform_research_research_016.md │ │ ├── perform_research_research_017.md │ │ ├── perform_research_research_018.md │ │ ├── perform_research_research_019.md │ │ ├── perform_research_research_020.md │ │ ├── perform_research_research_021.md │ │ ├── perform_research_research_022.md │ │ ├── perform_research_research_023.md │ │ ├── perform_research_research_024.md │ │ ├── perform_research_research_025.md │ │ ├── perform_research_research_026.md │ │ ├── perform_research_research_027.md │ │ ├── perform_research_research_028.md │ │ ├── perform_research_research_029.md │ │ ├── perform_research_research_030.md │ │ ├── perform_research_research_031.md │ │ ├── perform_research_research_032.md │ │ ├── perform_research_research_033.md │ │ ├── perform_research_research_034.md │ │ ├── perform_research_research_035.md │ │ ├── perform_research_research_036.md │ │ ├── perform_research_research_037.md │ │ ├── perform_research_research_038.md │ │ ├── perform_research_research_039.md │ │ ├── perform_research_research_040.md │ │ ├── perform_research_research_041.md │ │ ├── perform_research_research_042.md │ │ ├── perform_research_research_043.md │ │ ├── perform_research_research_044.md │ │ ├── perform_research_research_045.md │ │ ├── perform_research_research_046.md │ │ ├── perform_research_research_047.md │ │ ├── perform_research_research_048.md │ │ ├── perform_research_research_049.md │ │ ├── perform_research_test_research__________001.md │ │ ├── perform_research_test_research_001.md │ │ ├── perform_research_test_research_002.md │ │ ├── perform_research_test_unicode.md │ │ └── README.md │ ├── SECURITY.md │ ├── setup-docusaurus.sh │ ├── setup-website.sh │ ├── sidebars.js │ ├── sitemap.xml │ ├── src │ │ └── css │ │ └── custom.css │ ├── static │ │ └── img │ │ ├── logo.png │ │ └── og-image.png │ ├── technical.md │ ├── TESTING_GUIDE.md │ ├── TODO_MANAGEMENT_FIX.md │ ├── tsconfig.json │ ├── tutorials │ │ ├── 01-first-steps.md │ │ ├── 02-existing-projects.md │ │ ├── 03-advanced-analysis.md │ │ ├── index.md │ │ ├── security-focused-workflow.md │ │ └── team-collaboration.md │ ├── VERSION_MANAGEMENT.md │ └── WEBSITE_SETUP.md ├── eslint.config.js ├── jest.config.js ├── LICENSE ├── LLM_CONTEXT.md ├── Makefile ├── mcp-inspector-config.json ├── mcp-test-results.json ├── package-lock.json ├── package.json ├── patterns │ ├── CONTRIBUTING.md │ ├── infrastructure │ │ ├── aws.yaml │ │ ├── firebase.yaml │ │ ├── kubernetes.yaml │ │ └── openshift.yaml │ ├── README.md │ └── schema.json ├── README.md ├── RELEASE_NOTES_v2.0.22.md ├── reports │ ├── comprehensive-validation_20251003_185155.json │ ├── link-summary_20251003_185121.json │ ├── link-validation_20250922_151241.txt │ ├── link-validation_20250922_151242.txt │ ├── link-validation_20251003_184136.txt │ ├── link-validation_20251003_184141.txt │ ├── link-validation_20251003_184945.txt │ ├── link-validation_20251003_185000.txt │ ├── link-validation_20251003_185121.txt │ └── markdown-validation_20251003_185155.txt ├── sample-project │ ├── docs │ │ └── adrs │ │ ├── 001-database-architecture.md │ │ ├── 002-api-authentication.md │ │ └── 003-legacy-data-migration.md │ └── README.md ├── scripts │ ├── ai-release-notes.ts │ ├── check-docs-links.sh │ ├── check-duplicate-links.ts │ ├── cleanup-template-docs.sh │ ├── docs-workflow.sh │ ├── fix-broken-links.py │ ├── fix-docs-accuracy.sh │ ├── fix-docs-content-accuracy.sh │ ├── install-rhel.sh │ ├── pre-commit-check.sh │ ├── pre-commit-checklist.sh │ ├── remove-duplicate-docs.sh │ ├── sync-tags-to-npm.sh │ ├── test-advanced-prompting.sh │ ├── test-infrastructure.sh │ ├── test-mcp-functionality.sh │ ├── test-mcp-logging.ts │ ├── test-mcp-server.sh │ ├── test-node-compatibility.js │ ├── test-npm-package.sh │ ├── test-release-integration.sh │ ├── validate-build.js │ ├── validate-docs.sh │ └── validate-links-with-sitemap.ts ├── SECURITY.md ├── src │ ├── config │ │ └── ai-config.ts │ ├── index.ts │ ├── prompts │ │ ├── adr-suggestion-prompts.ts │ │ ├── analysis-prompts.ts │ │ ├── deployment-analysis-prompts.ts │ │ ├── environment-analysis-prompts.ts │ │ ├── index.ts │ │ ├── research-integration-prompts.ts │ │ ├── research-question-prompts.ts │ │ ├── rule-generation-prompts.ts │ │ ├── security-prompts.ts │ │ └── validated-pattern-prompts.ts │ ├── resources │ │ ├── adr-by-id-resource.ts │ │ ├── code-quality-resource.ts │ │ ├── deployment-history-resource.ts │ │ ├── deployment-status-resource.ts │ │ ├── environment-analysis-resource.ts │ │ ├── index.ts │ │ ├── memory-snapshots-resource.ts │ │ ├── pattern-base-code-by-platform-resource.ts │ │ ├── pattern-by-name-resource.ts │ │ ├── pattern-sources-by-platform-resource.ts │ │ ├── project-metrics-resource.ts │ │ ├── project-status-resource.ts │ │ ├── research-by-topic-resource.ts │ │ ├── research-index-resource.ts │ │ ├── resource-cache.ts │ │ ├── resource-router.ts │ │ ├── rule-by-id-resource.ts │ │ ├── rule-catalog-resource.ts │ │ ├── rule-generation-resource.ts │ │ ├── technology-by-name-resource.ts │ │ ├── todo-by-id-resource.ts │ │ ├── todo-list-resource.ts │ │ ├── validated-pattern-by-platform-resource.ts │ │ └── validated-patterns-catalog-resource.ts │ ├── templates │ │ └── domain-knowledge-templates.ts │ ├── tools │ │ ├── adr-bootstrap-validation-tool.ts │ │ ├── adr-suggestion-tool.ts │ │ ├── adr-validation-tool.ts │ │ ├── bootstrap-validation-loop-tool.ts │ │ ├── content-masking-tool.ts │ │ ├── conversation-memory-tool.ts │ │ ├── deployment-analysis-tool.ts │ │ ├── deployment-guidance-tool.ts │ │ ├── deployment-readiness-tool.ts │ │ ├── environment-analysis-tool.ts │ │ ├── expand-analysis-tool.ts │ │ ├── get-server-context-tool.ts │ │ ├── interactive-adr-planning-tool.ts │ │ ├── llm-cloud-management-tool.ts │ │ ├── llm-database-management-tool.ts │ │ ├── llm-web-search-tool.ts │ │ ├── mcp-planning-tool.ts │ │ ├── memory-loading-tool.ts │ │ ├── perform-research-tool.ts │ │ ├── research-integration-tool.ts │ │ ├── research-question-tool.ts │ │ ├── review-existing-adrs-tool.ts │ │ ├── rule-generation-tool.ts │ │ ├── smart-git-push-tool-v2.ts │ │ ├── smart-git-push-tool.ts │ │ ├── tool-chain-orchestrator.ts │ │ └── troubleshoot-guided-workflow-tool.ts │ ├── types │ │ ├── ape-framework.ts │ │ ├── conversation-context.ts │ │ ├── conversation-memory.ts │ │ ├── enhanced-errors.ts │ │ ├── index.ts │ │ ├── knowledge-generation.ts │ │ ├── knowledge-graph-schemas.ts │ │ ├── memory-entities.ts │ │ ├── reflexion-framework.ts │ │ ├── state-reinforcement.ts │ │ ├── tiered-response.ts │ │ ├── tool-arguments.ts │ │ └── tool-context.ts │ └── utils │ ├── actual-file-operations.ts │ ├── adr-discovery.ts │ ├── adr-knowledge-initializer.ts │ ├── adr-suggestions.ts │ ├── ai-executor.ts │ ├── apply-cot-enhancement.ts │ ├── automatic-prompt-engineering.ts │ ├── cache.ts │ ├── chain-of-thought-template.ts │ ├── conditional-request.ts │ ├── config.ts │ ├── content-masking.ts │ ├── context-document-manager.ts │ ├── conversation-memory-manager.ts │ ├── dag-executor.ts │ ├── deployment-analysis.ts │ ├── deployment-type-registry.ts │ ├── directory-compat.ts │ ├── dynamic-deployment-intelligence.ts │ ├── enhanced-logging.ts │ ├── environment-analysis.ts │ ├── environment-capability-registry.ts │ ├── file-system.ts │ ├── file-system.ts.backup │ ├── gitleaks-detector.ts │ ├── index.ts │ ├── interactive-approval.ts │ ├── json-safe.ts │ ├── knowledge-generation.ts │ ├── knowledge-graph-manager.ts │ ├── llm-artifact-detector.ts │ ├── location-filter.ts │ ├── mcp-response-validator.ts │ ├── memory-entity-manager.ts │ ├── memory-health-scoring.ts │ ├── memory-migration-manager.ts │ ├── memory-relationship-mapper.ts │ ├── memory-rollback-manager.ts │ ├── memory-transformation.ts │ ├── monitoring.ts │ ├── output-masking.ts │ ├── pattern-contribution-helper.ts │ ├── pattern-loader.ts │ ├── pattern-research-utility.ts │ ├── pattern-to-dag-converter.ts │ ├── platform-detector.ts │ ├── prompt-composition.ts │ ├── prompt-execution.ts │ ├── reflexion.ts │ ├── release-readiness-detector.ts │ ├── research-documentation.ts │ ├── research-integration.ts │ ├── research-orchestrator.ts │ ├── research-questions.ts │ ├── resource-extractor.ts │ ├── resource-versioning.ts │ ├── ripgrep-wrapper.ts │ ├── root-manager.ts │ ├── rule-format.ts │ ├── rule-generation.ts │ ├── server-context-generator.ts │ ├── state-reinforcement-manager.ts │ ├── system-card-manager.ts │ ├── tiered-response-manager.ts │ ├── tree-sitter-analyzer.ts │ └── validated-pattern-definitions.ts ├── test-results │ └── junit.xml ├── tests │ ├── __mocks__ │ │ ├── @tree-sitter-grammars │ │ │ └── tree-sitter-hcl.ts │ │ ├── tree-sitter-bash.ts │ │ ├── tree-sitter-dockerfile.ts │ │ ├── tree-sitter-javascript.ts │ │ ├── tree-sitter-json.ts │ │ ├── tree-sitter-python.ts │ │ ├── tree-sitter-typescript.ts │ │ ├── tree-sitter-yaml.ts │ │ └── tree-sitter.ts │ ├── ape.test.ts │ ├── cache-architecture-analysis.md │ ├── cache.test.ts │ ├── config │ │ └── ai-config.test.ts │ ├── config.test.ts │ ├── index.test.ts │ ├── integration │ │ ├── hybrid-dag-kubernetes.test.ts │ │ ├── memory-migration-integration.test.ts │ │ ├── memory-migration-simple.test.ts │ │ ├── memory-system-integration.test.ts │ │ ├── smart-code-linking.test.ts │ │ └── systemcard-bootstrap.test.ts │ ├── knowledge-generation.test.ts │ ├── mcp-server.test.ts │ ├── performance │ │ └── memory-performance.test.ts │ ├── performance-effectiveness.test.ts │ ├── prompts │ │ ├── deployment-analysis-prompts.test.ts │ │ ├── environment-analysis-prompts.test.ts │ │ ├── research-integration-prompts.test.ts │ │ ├── research-question-prompts.test.ts │ │ ├── rule-generation-prompts.test.ts │ │ └── security-prompts.test.ts │ ├── README.md │ ├── reflexion.test.ts │ ├── research-integration-tool.test.ts │ ├── research-question-tool.test.ts │ ├── resources │ │ ├── code-quality-resource.test.ts │ │ └── deployment-history-resource.test.ts │ ├── setup.ts │ ├── smart-git-push-release-readiness.test.ts │ ├── smart-git-push-v2.test.ts │ ├── smart-git-push.test.ts │ ├── smoke.test.ts │ ├── templates │ │ └── domain-knowledge-templates.test.ts │ ├── tools │ │ ├── adr-bootstrap-validation-tool.test.ts │ │ ├── adr-suggestion-tool.test.ts │ │ ├── adr-validation-tool.test.ts │ │ ├── bootstrap-validation-loop-tool.test.ts │ │ ├── content-masking-tool.test.ts │ │ ├── deployment-analysis-tool.test.ts │ │ ├── deployment-guidance-tool.test.ts │ │ ├── deployment-readiness-tool.test.ts │ │ ├── environment-analysis-tool.test.ts │ │ ├── interactive-adr-planning-tool.test.ts │ │ ├── mcp-planning-tool.test.ts │ │ ├── memory-loading-tool.test.ts │ │ ├── perform-research-tool.test.ts │ │ ├── perform-research-tool.test.ts.backup │ │ ├── research-integration-tool.test.ts │ │ ├── review-existing-adrs-tool.test.ts │ │ ├── rule-generation-tool.test.ts │ │ ├── smart-git-push-tool-v2.test.ts │ │ ├── smart-git-push-tool.test.ts │ │ ├── tool-chain-orchestrator.test.ts │ │ └── troubleshoot-guided-workflow-tool.test.ts │ ├── types │ │ └── conversation-context.test.ts │ ├── types.test.ts │ ├── utils │ │ ├── adr-knowledge-initializer.test.ts │ │ ├── advanced-prompting-test-utils.ts │ │ ├── ai-executor.test.ts │ │ ├── conditional-request.test.ts │ │ ├── context-document-manager.test.ts │ │ ├── deployment-analysis.test.ts │ │ ├── environment-capability-registry.test.ts │ │ ├── file-system.test.ts │ │ ├── find-related-code.test.ts │ │ ├── gitleaks-detector.test.ts │ │ ├── interactive-approval.test.ts │ │ ├── llm-artifact-detector.test.ts │ │ ├── location-filter.test.ts │ │ ├── mcp-response-validator.test.ts │ │ ├── memory-entity-manager.test.ts │ │ ├── memory-relationship-mapper.test.ts │ │ ├── memory-rollback-manager.test.ts │ │ ├── memory-transformation.test.ts │ │ ├── monitoring-smoke.test.ts │ │ ├── monitoring.test.ts │ │ ├── output-masking.test.ts │ │ ├── pattern-loader.test.ts │ │ ├── pattern-validation.test.ts │ │ ├── prompt-composition.test.ts │ │ ├── prompt-execution.test.ts │ │ ├── release-readiness-detector.test.ts │ │ ├── research-documentation.test.ts │ │ ├── research-integration.test.ts │ │ ├── research-orchestrator.test.ts │ │ ├── research-questions.test.ts │ │ ├── resource-extractor.test.ts │ │ ├── resource-versioning.test.ts │ │ ├── rule-format.test.ts │ │ ├── rule-generation.test.ts │ │ ├── system-card-manager.test.ts │ │ ├── test-config.ts │ │ ├── test-helpers.test.ts │ │ ├── test-helpers.ts │ │ ├── test-infrastructure.test.ts │ │ ├── test-infrastructure.ts │ │ ├── tree-sitter-analyzer.test.ts │ │ └── tree-sitter-jest-integration.test.ts │ └── version.test.ts ├── tsconfig.json └── typedoc.json ``` # Files -------------------------------------------------------------------------------- /src/tools/adr-bootstrap-validation-tool.ts: -------------------------------------------------------------------------------- ```typescript 1 | /** 2 | * MCP Tool for ADR Bootstrap Validation 3 | * Guides LLMs to create bootstrap.sh and validate_bootstrap.sh scripts 4 | * that ensure code deployment follows ADR architectural decisions 5 | */ 6 | 7 | import { McpAdrError } from '../types/index.js'; 8 | import { ConversationContext } from '../types/conversation-context.js'; 9 | import { TreeSitterAnalyzer } from '../utils/tree-sitter-analyzer.js'; 10 | import { findRelatedCode } from '../utils/file-system.js'; 11 | import { detectPlatforms, PlatformDetectionResult } from '../utils/platform-detector.js'; 12 | import { getPattern, ValidatedPattern } from '../utils/validated-pattern-definitions.js'; 13 | import { generatePatternResearchReport } from '../utils/pattern-research-utility.js'; 14 | 15 | /** 16 | * Interface for bootstrap script generation 17 | */ 18 | export interface BootstrapScriptConfig { 19 | projectPath: string; 20 | adrDirectory?: string; 21 | outputPath?: string; 22 | scriptType: 'bootstrap' | 'validate' | 'both'; 23 | includeTests?: boolean; 24 | includeDeployment?: boolean; 25 | customValidations?: string[]; 26 | } 27 | 28 | /** 29 | * Interface for ADR compliance validation 30 | */ 31 | export interface AdrComplianceCheck { 32 | adrId: string; 33 | adrTitle: string; 34 | requirement: string; 35 | validationCommand: string; 36 | expectedOutcome: string; 37 | severity: 'critical' | 'error' | 'warning' | 'info'; 38 | } 39 | 40 | /** 41 | * Generate bootstrap and validation scripts for ADR-compliant deployment 42 | * This tool tells the LLM HOW to create deployment scripts that validate 43 | * the implemented code matches ADR requirements 44 | */ 45 | export async function generateAdrBootstrapScripts(args: { 46 | projectPath?: string; 47 | adrDirectory?: string; 48 | outputPath?: string; 49 | scriptType?: 'bootstrap' | 'validate' | 'both'; 50 | includeTests?: boolean; 51 | includeDeployment?: boolean; 52 | customValidations?: string[]; 53 | enableTreeSitterAnalysis?: boolean; 54 | conversationContext?: ConversationContext; 55 | }): Promise<any> { 56 | const { 57 | projectPath = process.cwd(), 58 | adrDirectory = 'docs/adrs', 59 | outputPath = projectPath, 60 | scriptType = 'both', 61 | includeTests = true, 62 | includeDeployment = true, 63 | customValidations = [], 64 | enableTreeSitterAnalysis = true, 65 | // conversationContext is available but not used currently 66 | } = args; 67 | 68 | try { 69 | // STEP 0: Detect platform using Validated Patterns framework 70 | console.log('🔍 Detecting platform type using Validated Patterns...'); 71 | const platformDetection: PlatformDetectionResult = await detectPlatforms(projectPath); 72 | 73 | console.log( 74 | `📋 Platform detection complete (confidence: ${(platformDetection.confidence * 100).toFixed(0)}%)`, 75 | { 76 | primaryPlatform: platformDetection.primaryPlatform, 77 | detectedPlatforms: platformDetection.detectedPlatforms.map(p => p.type), 78 | } 79 | ); 80 | 81 | // STEP 0.1: Get validated pattern and generate research report 82 | let validatedPattern: ValidatedPattern | null = null; 83 | let patternResearchReport: string | null = null; 84 | let baseRepoGuidance = ''; 85 | 86 | if (platformDetection.primaryPlatform) { 87 | validatedPattern = getPattern(platformDetection.primaryPlatform); 88 | 89 | if (validatedPattern) { 90 | console.log(`✅ Loaded validated pattern: ${validatedPattern.name}`); 91 | 92 | // Generate research report with base code repository guidance 93 | patternResearchReport = generatePatternResearchReport(platformDetection.primaryPlatform); 94 | 95 | // Create specific guidance about the base code repository 96 | baseRepoGuidance = ` 97 | 98 | ## 🎯 VALIDATED PATTERN INTEGRATION (CRITICAL) 99 | 100 | **Platform Detected**: ${platformDetection.primaryPlatform.toUpperCase()} 101 | **Base Code Repository**: ${validatedPattern.baseCodeRepository.url} 102 | 103 | ### Integration Instructions: 104 | ${validatedPattern.baseCodeRepository.integrationInstructions} 105 | 106 | ### Required Files: 107 | ${validatedPattern.baseCodeRepository.requiredFiles.map((f, i) => `${i + 1}. \`${f}\``).join('\n')} 108 | 109 | ${ 110 | validatedPattern.baseCodeRepository.scriptEntrypoint 111 | ? `### Bootstrap Entry Point: 112 | Your bootstrap.sh should call: \`${validatedPattern.baseCodeRepository.scriptEntrypoint}\` 113 | ` 114 | : '' 115 | } 116 | 117 | **⚠️ IMPORTANT**: Before generating scripts, use WebFetch to query: 118 | 1. **Base Repository**: ${validatedPattern.baseCodeRepository.url} 119 | 2. **Documentation**: ${validatedPattern.authoritativeSources.find(s => s.type === 'documentation')?.url || 'N/A'} 120 | 121 | Then merge the base repository into your project and customize for your needs. 122 | 123 | --- 124 | `; 125 | 126 | console.log('📚 Generated research report with base code repository guidance'); 127 | console.log( 128 | `⚠️ CRITICAL: LLM should merge ${validatedPattern.baseCodeRepository.url} before generating scripts` 129 | ); 130 | 131 | // Log the research report for debugging (can be removed if not needed) 132 | console.log( 133 | '[DEBUG] Pattern Research Report Generated:', 134 | patternResearchReport ? 'YES' : 'NO' 135 | ); 136 | } else { 137 | console.warn( 138 | `No validated pattern found for ${platformDetection.primaryPlatform}, generating generic scripts` 139 | ); 140 | } 141 | } 142 | 143 | // Discover ADRs in the target project 144 | const { discoverAdrsInDirectory } = await import('../utils/adr-discovery.js'); 145 | const discoveryResult = await discoverAdrsInDirectory(adrDirectory, true, projectPath); 146 | 147 | // Smart Code Linking - Find related implementation files 148 | let relatedCodeAnalysis = ''; 149 | let relatedFiles: any[] = []; 150 | 151 | if (discoveryResult.adrs.length > 0) { 152 | try { 153 | // Combine all ADR content for comprehensive analysis 154 | const combinedAdrContent = discoveryResult.adrs 155 | .map(adr => `# ${adr.title}\n${adr.content || ''}`) 156 | .join('\n\n'); 157 | 158 | const relatedCodeResult = await findRelatedCode( 159 | 'bootstrap-validation-analysis', 160 | combinedAdrContent, 161 | projectPath, 162 | { 163 | useAI: true, 164 | useRipgrep: true, 165 | maxFiles: 20, 166 | includeContent: false, 167 | } 168 | ); 169 | 170 | relatedFiles = relatedCodeResult.relatedFiles; 171 | 172 | if (relatedFiles.length > 0) { 173 | relatedCodeAnalysis = ` 174 | ## 🔗 Smart Code Linking Analysis 175 | 176 | Found ${relatedFiles.length} code files related to ADR implementations that should be included in validation: 177 | 178 | ### Critical Implementation Files 179 | ${relatedFiles 180 | .slice(0, 8) 181 | .map( 182 | (file, index) => ` 183 | ${index + 1}. **${file.path}** 184 | - Type: ${file.extension} file 185 | - Size: ${file.size} bytes 186 | - Directory: ${file.directory} 187 | ` 188 | ) 189 | .join('')} 190 | 191 | ### Validation Targets 192 | - **Keywords Found**: ${relatedCodeResult.keywords.join(', ')} 193 | - **Search Patterns**: ${relatedCodeResult.searchPatterns.join(', ')} 194 | - **Implementation Confidence**: ${(relatedCodeResult.confidence * 100).toFixed(1)}% 195 | 196 | **Bootstrap Integration**: These files will be included in validation scripts to ensure ADR compliance during deployment. 197 | 198 | --- 199 | `; 200 | } else { 201 | relatedCodeAnalysis = ` 202 | ## 🔗 Smart Code Linking Analysis 203 | 204 | **Status**: No related implementation files found for ADRs 205 | **Keywords Searched**: ${relatedCodeResult.keywords.join(', ')} 206 | **Analysis**: ADRs may be high-level decisions not yet implemented in code 207 | 208 | **Recommendation**: Focus validation on configuration files, deployment scripts, and architectural constraints rather than implementation details. 209 | 210 | --- 211 | `; 212 | } 213 | } catch (error) { 214 | console.warn('[WARNING] Smart Code Linking for bootstrap validation failed:', error); 215 | relatedCodeAnalysis = ` 216 | ## 🔗 Smart Code Linking Analysis 217 | 218 | **Status**: ⚠️ Analysis failed - continuing with standard validation 219 | **Error**: ${error instanceof Error ? error.message : 'Unknown error'} 220 | 221 | --- 222 | `; 223 | } 224 | } 225 | 226 | // Extract validation requirements from ADRs 227 | const complianceChecks = await extractComplianceChecks(discoveryResult.adrs, relatedFiles); 228 | 229 | // Perform tree-sitter analysis for ADR compliance validation 230 | let codeAnalysisResults: any = null; 231 | let complianceValidation = ''; 232 | if (enableTreeSitterAnalysis) { 233 | try { 234 | codeAnalysisResults = await performAdrComplianceAnalysis( 235 | projectPath, 236 | discoveryResult.adrs, 237 | complianceChecks 238 | ); 239 | 240 | if ( 241 | codeAnalysisResults.violations.length > 0 || 242 | codeAnalysisResults.implementations.length > 0 243 | ) { 244 | complianceValidation = ` 245 | 246 | ## 🔍 Tree-sitter ADR Compliance Analysis 247 | 248 | **Analysis Results:** 249 | - **Files Analyzed**: ${codeAnalysisResults.filesAnalyzed} 250 | - **ADR Implementations Found**: ${codeAnalysisResults.implementations.length} 251 | - **Compliance Violations**: ${codeAnalysisResults.violations.length} 252 | - **Architecture Patterns Detected**: ${codeAnalysisResults.patterns.join(', ') || 'None'} 253 | 254 | ${ 255 | codeAnalysisResults.implementations.length > 0 256 | ? ` 257 | ### ✅ Detected ADR Implementations 258 | ${codeAnalysisResults.implementations.map((impl: any) => `- **${impl.adrTitle}**: ${impl.evidence} (${impl.file}:${impl.line})`).join('\n')} 259 | ` 260 | : '' 261 | } 262 | 263 | ${ 264 | codeAnalysisResults.violations.length > 0 265 | ? ` 266 | ### ❌ ADR Compliance Violations 267 | ${codeAnalysisResults.violations.map((violation: any) => `- **${violation.adrTitle}**: ${violation.issue} (${violation.file}:${violation.line})`).join('\n')} 268 | ` 269 | : '' 270 | } 271 | 272 | --- 273 | `; 274 | } 275 | } catch (error) { 276 | console.warn('Tree-sitter ADR compliance analysis failed:', error); 277 | complianceValidation = ` 278 | 279 | ## 🔍 Tree-sitter ADR Compliance Analysis 280 | 281 | **Status**: ⚠️ Analysis failed - continuing with basic validation 282 | **Error**: ${error instanceof Error ? error.message : 'Unknown error'} 283 | 284 | --- 285 | `; 286 | } 287 | } 288 | 289 | // Generate bootstrap.sh script 290 | const bootstrapScript = generateBootstrapScript( 291 | complianceChecks, 292 | projectPath, 293 | includeTests, 294 | includeDeployment, 295 | customValidations, 296 | validatedPattern // Pass validated pattern for pattern-aware script generation 297 | ); 298 | 299 | // Generate validate_bootstrap.sh script 300 | const validationScript = generateValidationScript( 301 | complianceChecks, 302 | projectPath, 303 | discoveryResult.adrs 304 | ); 305 | 306 | const response = { 307 | instructions: ` 308 | # ADR Bootstrap Validation Scripts Generation 309 | 310 | ## Purpose 311 | These scripts ensure that code deployed to production follows the architectural decisions documented in ADRs. 312 | The bootstrap script deploys the code while the validation script verifies ADR compliance. 313 | 314 | ${baseRepoGuidance} 315 | 316 | ## Discovered ADRs (${discoveryResult.totalAdrs} total) 317 | ${discoveryResult.adrs.map(adr => `- ${adr.title} (${adr.status})`).join('\n')} 318 | 319 | ${relatedCodeAnalysis} 320 | 321 | ${complianceValidation} 322 | 323 | ## Generated Scripts 324 | 325 | ### 1. bootstrap.sh - Deployment Script 326 | This script deploys the code that was created based on ADR planning. 327 | It ensures the deployment follows architectural requirements. 328 | 329 | **Location**: ${outputPath}/bootstrap.sh 330 | **Purpose**: Deploy ADR-compliant code to the environment 331 | **Key Features**: 332 | - Validates prerequisites from ADRs 333 | - Deploys code components in correct order 334 | - Runs ADR compliance checks during deployment 335 | - Provides rollback on failure 336 | 337 | ### 2. validate_bootstrap.sh - Validation Script 338 | This script validates that deployed code matches ADR requirements. 339 | It catches integration issues that unit tests miss. 340 | 341 | **Location**: ${outputPath}/validate_bootstrap.sh 342 | **Purpose**: Verify deployed code follows ADR decisions 343 | **Key Features**: 344 | - Checks implementation against each ADR 345 | - Validates architectural constraints 346 | - Tests integration points 347 | - Reports compliance status 348 | 349 | ## Implementation Instructions for LLM 350 | 351 | 1. **Create bootstrap.sh**: 352 | - Save the generated bootstrap script to ${outputPath}/bootstrap.sh 353 | - Make it executable: chmod +x bootstrap.sh 354 | - Include ADR-specific deployment steps 355 | - Add rollback functionality for failures 356 | 357 | 2. **Create validate_bootstrap.sh**: 358 | - Save the validation script to ${outputPath}/validate_bootstrap.sh 359 | - Make it executable: chmod +x validate_bootstrap.sh 360 | - Include comprehensive ADR compliance checks 361 | - Generate detailed compliance report 362 | 363 | 3. **Integration Steps**: 364 | - Run bootstrap.sh to deploy the code 365 | - Run validate_bootstrap.sh to verify compliance 366 | - Include both in CI/CD pipeline 367 | - Document any failures with ADR references 368 | 369 | ## Compliance Checks Generated 370 | ${complianceChecks.length} validation rules extracted from ADRs: 371 | ${complianceChecks 372 | .slice(0, 5) 373 | .map(check => `- ${check.adrId}: ${check.requirement} (${check.severity})`) 374 | .join('\n')} 375 | ${complianceChecks.length > 5 ? `... and ${complianceChecks.length - 5} more checks` : ''} 376 | 377 | ## Usage 378 | \`\`\`bash 379 | # Deploy code following ADR requirements 380 | ./bootstrap.sh 381 | 382 | # Validate deployment matches ADRs 383 | ./validate_bootstrap.sh 384 | 385 | # Both scripts exit with: 386 | # 0 - Success, ADR compliant 387 | # 1 - Failure, ADR violations found 388 | \`\`\` 389 | `, 390 | scripts: 391 | scriptType === 'both' 392 | ? { 393 | bootstrap: bootstrapScript, 394 | validation: validationScript, 395 | } 396 | : scriptType === 'bootstrap' 397 | ? { 398 | bootstrap: bootstrapScript, 399 | } 400 | : { 401 | validation: validationScript, 402 | }, 403 | complianceChecks, 404 | adrSummary: { 405 | total: discoveryResult.totalAdrs, 406 | byStatus: discoveryResult.summary.byStatus, 407 | withImplementationTasks: discoveryResult.adrs.filter( 408 | adr => 409 | adr.content?.includes('Implementation') || 410 | adr.content?.includes('TODO') || 411 | adr.content?.includes('Tasks') 412 | ).length, 413 | smartCodeLinking: { 414 | enabled: relatedFiles.length > 0, 415 | relatedFilesCount: relatedFiles.length, 416 | fileTypes: 417 | relatedFiles.length > 0 418 | ? [...new Set(relatedFiles.map(f => f.extension))].join(', ') 419 | : 'none', 420 | validationEnhancements: 421 | relatedFiles.length > 0 422 | ? 'File-specific validation commands generated' 423 | : 'Standard validation only', 424 | }, 425 | }, 426 | }; 427 | 428 | return { 429 | content: [ 430 | { 431 | type: 'text', 432 | text: JSON.stringify(response, null, 2), 433 | }, 434 | ], 435 | }; 436 | } catch (error) { 437 | throw new McpAdrError( 438 | `Failed to generate ADR bootstrap scripts: ${error instanceof Error ? error.message : String(error)}`, 439 | 'BOOTSTRAP_GENERATION_ERROR' 440 | ); 441 | } 442 | } 443 | 444 | /** 445 | * Extract compliance checks from ADR content 446 | * Enhanced with Smart Code Linking for related file validation 447 | */ 448 | async function extractComplianceChecks( 449 | adrs: any[], 450 | relatedFiles: any[] = [] 451 | ): Promise<AdrComplianceCheck[]> { 452 | const checks: AdrComplianceCheck[] = []; 453 | 454 | for (const adr of adrs) { 455 | if (!adr.content) continue; 456 | 457 | // Extract requirements from ADR content 458 | const requirements = extractRequirements(adr.content); 459 | 460 | requirements.forEach((req, index) => { 461 | checks.push({ 462 | adrId: adr.filename || `adr-${index}`, 463 | adrTitle: adr.title || 'Unknown ADR', 464 | requirement: req.text, 465 | validationCommand: generateValidationCommand(req), 466 | expectedOutcome: req.expected, 467 | severity: determineSeverity(req.text), 468 | }); 469 | }); 470 | } 471 | 472 | // Add Smart Code Linking validation checks 473 | if (relatedFiles.length > 0) { 474 | // Group related files by type for validation 475 | const filesByType = relatedFiles.reduce( 476 | (acc, file) => { 477 | const type = file.extension || 'unknown'; 478 | if (!acc[type]) acc[type] = []; 479 | acc[type].push(file); 480 | return acc; 481 | }, 482 | {} as Record<string, any[]> 483 | ); 484 | 485 | // Add file-specific validation checks 486 | Object.entries(filesByType).forEach(([fileType, files]) => { 487 | const typedFiles = files as any[]; // Type assertion for files array 488 | const fileCount = typedFiles.length; 489 | 490 | // Configuration file validation 491 | if (['json', 'yml', 'yaml', 'env'].includes(fileType)) { 492 | checks.push({ 493 | adrId: 'smart-code-linking', 494 | adrTitle: 'Configuration File Validation', 495 | requirement: `Validate ${fileCount} ${fileType.toUpperCase()} configuration file(s) comply with ADR requirements`, 496 | validationCommand: generateConfigValidationCommand(typedFiles), 497 | expectedOutcome: 'Configuration files are valid and ADR-compliant', 498 | severity: 'error', 499 | }); 500 | } 501 | 502 | // Source code validation 503 | if (['ts', 'js', 'py', 'java', 'go'].includes(fileType)) { 504 | checks.push({ 505 | adrId: 'smart-code-linking', 506 | adrTitle: 'Implementation File Validation', 507 | requirement: `Validate ${fileCount} ${fileType.toUpperCase()} implementation file(s) follow architectural patterns`, 508 | validationCommand: generateImplementationValidationCommand(typedFiles, fileType), 509 | expectedOutcome: 'Implementation files follow ADR architectural decisions', 510 | severity: 'warning', 511 | }); 512 | } 513 | 514 | // Infrastructure as Code validation 515 | if (['tf', 'hcl', 'dockerfile'].includes(fileType)) { 516 | checks.push({ 517 | adrId: 'smart-code-linking', 518 | adrTitle: 'Infrastructure Validation', 519 | requirement: `Validate ${fileCount} infrastructure file(s) match deployment requirements`, 520 | validationCommand: generateInfrastructureValidationCommand(typedFiles, fileType), 521 | expectedOutcome: 'Infrastructure configurations comply with ADR deployment decisions', 522 | severity: 'critical', 523 | }); 524 | } 525 | }); 526 | 527 | // Add overall integration check 528 | checks.push({ 529 | adrId: 'smart-code-linking', 530 | adrTitle: 'Smart Code Linking Integration', 531 | requirement: `Verify ${relatedFiles.length} ADR-related files are properly integrated`, 532 | validationCommand: `echo "Checking integration of ADR-related files..." && find . -type f \\( ${relatedFiles.map(f => `-name "${f.name}"`).join(' -o ')} \\) | wc -l`, 533 | expectedOutcome: `${relatedFiles.length} files found and accessible`, 534 | severity: 'info', 535 | }); 536 | } 537 | 538 | return checks; 539 | } 540 | 541 | /** 542 | * Generate validation command for configuration files 543 | */ 544 | function generateConfigValidationCommand(files: any[]): string { 545 | const filePaths = files.map(f => f.path).slice(0, 5); // Limit to first 5 files 546 | const fileType = files[0]?.extension || 'unknown'; 547 | 548 | if (fileType === 'json') { 549 | return `echo "Validating JSON configuration files..." && for file in ${filePaths.join(' ')}; do echo "Checking $file" && cat "$file" | jq . > /dev/null || echo "Invalid JSON: $file"; done`; 550 | } else if (['yml', 'yaml'].includes(fileType)) { 551 | return `echo "Validating YAML configuration files..." && for file in ${filePaths.join(' ')}; do echo "Checking $file" && python -c "import yaml; yaml.safe_load(open('$file'))" || echo "Invalid YAML: $file"; done`; 552 | } else if (fileType === 'env') { 553 | return `echo "Validating environment files..." && for file in ${filePaths.join(' ')}; do echo "Checking $file" && grep -E '^[A-Z_]+=.*$' "$file" > /dev/null || echo "Invalid ENV format: $file"; done`; 554 | } else { 555 | return `echo "Checking configuration files exist..." && ls -la ${filePaths.join(' ')}`; 556 | } 557 | } 558 | 559 | /** 560 | * Generate validation command for implementation files 561 | */ 562 | function generateImplementationValidationCommand(files: any[], fileType: string): string { 563 | const filePaths = files.map(f => f.path).slice(0, 3); // Limit to first 3 files 564 | 565 | if (['ts', 'js'].includes(fileType)) { 566 | return `echo "Validating TypeScript/JavaScript files..." && for file in ${filePaths.join(' ')}; do echo "Checking $file" && node -c "$file" > /dev/null 2>&1 || echo "Syntax error: $file"; done`; 567 | } else if (fileType === 'py') { 568 | return `echo "Validating Python files..." && for file in ${filePaths.join(' ')}; do echo "Checking $file" && python -m py_compile "$file" > /dev/null 2>&1 || echo "Syntax error: $file"; done`; 569 | } else if (fileType === 'java') { 570 | return `echo "Validating Java files..." && for file in ${filePaths.join(' ')}; do echo "Checking $file" && javac -cp . "$file" > /dev/null 2>&1 || echo "Compilation error: $file"; done`; 571 | } else if (fileType === 'go') { 572 | return `echo "Validating Go files..." && for file in ${filePaths.join(' ')}; do echo "Checking $file" && go fmt "$file" > /dev/null || echo "Format error: $file"; done`; 573 | } else { 574 | return `echo "Checking implementation files exist..." && ls -la ${filePaths.join(' ')}`; 575 | } 576 | } 577 | 578 | /** 579 | * Generate validation command for infrastructure files 580 | */ 581 | function generateInfrastructureValidationCommand(files: any[], fileType: string): string { 582 | const filePaths = files.map(f => f.path).slice(0, 3); // Limit to first 3 files 583 | 584 | if (['tf', 'hcl'].includes(fileType)) { 585 | return `echo "Validating Terraform files..." && for file in ${filePaths.join(' ')}; do echo "Checking $file" && terraform validate "$file" > /dev/null 2>&1 || echo "Terraform validation failed: $file"; done`; 586 | } else if (fileType === 'dockerfile') { 587 | return `echo "Validating Dockerfile..." && for file in ${filePaths.join(' ')}; do echo "Checking $file" && docker build -f "$file" --dry-run . > /dev/null 2>&1 || echo "Dockerfile validation failed: $file"; done`; 588 | } else { 589 | return `echo "Checking infrastructure files exist..." && ls -la ${filePaths.join(' ')}`; 590 | } 591 | } 592 | 593 | /** 594 | * Extract requirements from ADR content 595 | */ 596 | function extractRequirements(content: string): Array<{ text: string; expected: string }> { 597 | const requirements: Array<{ text: string; expected: string }> = []; 598 | 599 | // Look for common requirement patterns 600 | const patterns = [ 601 | /(?:must|should|shall|will)\s+([^.]+)/gi, 602 | /(?:requirement|constraint):\s*([^.]+)/gi, 603 | /(?:decision|approach):\s*([^.]+)/gi, 604 | /\[x?\]\s+([^[\n]+)/g, // Checklist items 605 | ]; 606 | 607 | patterns.forEach(pattern => { 608 | const matches = content.matchAll(pattern); 609 | for (const match of matches) { 610 | if (match[1]) { 611 | requirements.push({ 612 | text: match[1].trim(), 613 | expected: 'Requirement satisfied', 614 | }); 615 | } 616 | } 617 | }); 618 | 619 | return requirements; 620 | } 621 | 622 | /** 623 | * Generate validation command for a requirement 624 | */ 625 | function generateValidationCommand(requirement: { text: string; expected: string }): string { 626 | const text = requirement.text.toLowerCase(); 627 | 628 | // Generate appropriate validation based on requirement type 629 | if (text.includes('database') || text.includes('postgres') || text.includes('mysql')) { 630 | return 'echo "Checking database configuration..." && psql --version || mysql --version'; 631 | } else if (text.includes('api') || text.includes('rest') || text.includes('http')) { 632 | return 'echo "Validating API endpoints..." && curl -s http://localhost:3000/health || echo "API not responding"'; 633 | } else if (text.includes('auth') || text.includes('jwt') || text.includes('token')) { 634 | return 'echo "Checking authentication setup..." && grep -r "jwt\\|auth" src/ | head -5'; 635 | } else if (text.includes('test') || text.includes('coverage')) { 636 | return 'echo "Running tests..." && npm test -- --coverage --silent'; 637 | } else if (text.includes('docker') || text.includes('container')) { 638 | return 'echo "Checking Docker setup..." && docker ps || docker-compose ps'; 639 | } else if (text.includes('cache') || text.includes('redis')) { 640 | return 'echo "Validating cache configuration..." && redis-cli ping || echo "Redis not available"'; 641 | } else { 642 | return `echo "Checking: ${requirement.text.substring(0, 50)}..."`; 643 | } 644 | } 645 | 646 | /** 647 | * Determine severity based on requirement text 648 | */ 649 | function determineSeverity(text: string): 'critical' | 'error' | 'warning' | 'info' { 650 | const lower = text.toLowerCase(); 651 | if (lower.includes('must') || lower.includes('critical') || lower.includes('required')) { 652 | return 'critical'; 653 | } else if (lower.includes('shall') || lower.includes('error')) { 654 | return 'error'; 655 | } else if (lower.includes('should') || lower.includes('warning')) { 656 | return 'warning'; 657 | } else { 658 | return 'info'; 659 | } 660 | } 661 | 662 | /** 663 | * Generate bootstrap.sh script content 664 | * If validatedPattern is provided, generates a script that calls the pattern's scripts 665 | * Otherwise, generates standalone deployment script 666 | */ 667 | function generateBootstrapScript( 668 | checks: AdrComplianceCheck[], 669 | projectPath: string, 670 | includeTests: boolean, 671 | includeDeployment: boolean, 672 | customValidations: string[], 673 | validatedPattern: ValidatedPattern | null = null 674 | ): string { 675 | // If we have a validated pattern, generate a script that calls its scripts 676 | const hasValidatedPattern = 677 | validatedPattern && validatedPattern.baseCodeRepository.scriptEntrypoint; 678 | 679 | if (hasValidatedPattern) { 680 | const baseRepo = validatedPattern!.baseCodeRepository; 681 | return `#!/bin/bash 682 | # ADR Bootstrap Deployment Script with Validated Pattern Integration 683 | # Generated by MCP ADR Analysis Server 684 | # Purpose: Deploy code using validated ${validatedPattern!.name} pattern 685 | 686 | set -e # Exit on error 687 | 688 | echo "🚀 ADR Bootstrap Deployment Starting..." 689 | echo "📍 Project: ${projectPath}" 690 | echo "🎯 Pattern: ${validatedPattern!.name}" 691 | echo "📦 Base Repository: ${baseRepo.url}" 692 | echo "📋 ADR Compliance Checks: ${checks.length}" 693 | echo "" 694 | 695 | # Color codes for output 696 | RED='\\033[0;31m' 697 | GREEN='\\033[0;32m' 698 | YELLOW='\\033[1;33m' 699 | BLUE='\\033[0;34m' 700 | NC='\\033[0m' # No Color 701 | 702 | # Track deployment status 703 | DEPLOYMENT_SUCCESS=true 704 | FAILED_CHECKS=() 705 | 706 | echo -e "\${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" 707 | echo -e "\${BLUE}Phase 0: Validated Pattern Integration Check\${NC}" 708 | echo -e "\${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" 709 | echo "" 710 | 711 | # Check if base repository code is present 712 | ${baseRepo.requiredFiles 713 | .map( 714 | (file, i) => ` 715 | echo -n " [${i + 1}/${baseRepo.requiredFiles.length}] Checking for ${file}... " 716 | if [ -e "${file}" ]; then 717 | echo -e "\${GREEN}✓\${NC}" 718 | else 719 | echo -e "\${RED}✗ MISSING\${NC}" 720 | echo "" 721 | echo -e "\${RED}ERROR: Required file '${file}' from validated pattern not found!\${NC}" 722 | echo "" 723 | echo "To fix this:" 724 | echo " 1. Clone/merge base repository: ${baseRepo.url}" 725 | echo " 2. Follow integration instructions:" 726 | echo " ${baseRepo.integrationInstructions.split('.').slice(0, 2).join('.')}" 727 | echo "" 728 | exit 1 729 | fi` 730 | ) 731 | .join('')} 732 | 733 | echo "" 734 | echo -e "\${GREEN}✅ All validated pattern files present\${NC}" 735 | echo "" 736 | 737 | # Function to check ADR compliance 738 | check_adr_compliance() { 739 | local adr_id="$1" 740 | local requirement="$2" 741 | local command="$3" 742 | local expected="$4" 743 | local severity="$5" 744 | 745 | echo -n " Checking $adr_id: $requirement... " 746 | 747 | if eval "$command" > /dev/null 2>&1; then 748 | echo -e "\${GREEN}✓\${NC}" 749 | return 0 750 | else 751 | echo -e "\${RED}✗\${NC}" 752 | FAILED_CHECKS+=("$adr_id: $requirement [$severity]") 753 | if [ "$severity" = "critical" ]; then 754 | DEPLOYMENT_SUCCESS=false 755 | fi 756 | return 1 757 | fi 758 | } 759 | 760 | echo -e "\${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" 761 | echo -e "\${BLUE}Phase 1: Pre-deployment ADR Validation\${NC}" 762 | echo -e "\${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" 763 | echo "" 764 | 765 | ${checks 766 | .filter(c => c.severity === 'critical') 767 | .map( 768 | check => ` 769 | check_adr_compliance \\ 770 | "${check.adrId}" \\ 771 | "${check.requirement.substring(0, 50)}..." \\ 772 | "${check.validationCommand}" \\ 773 | "${check.expectedOutcome}" \\ 774 | "${check.severity}"` 775 | ) 776 | .join('\n')} 777 | 778 | if [ "$DEPLOYMENT_SUCCESS" = false ]; then 779 | echo "" 780 | echo -e "\${RED}❌ Critical ADR violations found. Deployment aborted.\${NC}" 781 | exit 1 782 | fi 783 | 784 | echo "" 785 | echo -e "\${GREEN}✅ All critical checks passed\${NC}" 786 | echo "" 787 | 788 | echo -e "\${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" 789 | echo -e "\${BLUE}Phase 2: Execute Validated Pattern Deployment\${NC}" 790 | echo -e "\${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${NC}" 791 | echo "" 792 | 793 | echo "🎯 Calling validated pattern script: ${baseRepo.scriptEntrypoint}" 794 | echo "" 795 | 796 | # Call the validated pattern's deployment script 797 | if [ -x "${baseRepo.scriptEntrypoint}" ]; then 798 | ${baseRepo.scriptEntrypoint} 799 | PATTERN_EXIT_CODE=$? 800 | elif [ -f "${baseRepo.scriptEntrypoint}" ]; then 801 | bash ${baseRepo.scriptEntrypoint} 802 | PATTERN_EXIT_CODE=$? 803 | else 804 | echo -e "\${RED}ERROR: Pattern script '${baseRepo.scriptEntrypoint}' not found or not executable\${NC}" 805 | exit 1 806 | fi 807 | 808 | if [ $PATTERN_EXIT_CODE -ne 0 ]; then 809 | echo "" 810 | echo -e "\${RED}❌ Validated pattern deployment failed with exit code: $PATTERN_EXIT_CODE\${NC}" 811 | exit $PATTERN_EXIT_CODE 812 | fi 813 | 814 | echo "" 815 | echo -e "\${GREEN}✅ Validated pattern deployment successful\${NC}" 816 | `; 817 | } 818 | 819 | // Original standalone script generation (fallback when no validated pattern) 820 | return `#!/bin/bash 821 | # ADR Bootstrap Deployment Script (Standalone Mode) 822 | # Generated by MCP ADR Analysis Server 823 | # Purpose: Deploy code that follows ADR architectural decisions 824 | # 825 | # ⚠️ WARNING: This is a standalone deployment script. 826 | # Consider integrating a validated pattern for production deployments: 827 | # - OpenShift: https://github.com/validatedpatterns/common 828 | # - Kubernetes: https://github.com/kubernetes/examples 829 | # - Docker: https://github.com/docker/awesome-compose 830 | 831 | set -e # Exit on error 832 | 833 | echo "🚀 ADR Bootstrap Deployment Starting..." 834 | echo "📍 Project: ${projectPath}" 835 | echo "📋 ADR Compliance Checks: ${checks.length}" 836 | echo "⚠️ Running in STANDALONE mode (no validated pattern detected)" 837 | echo "" 838 | 839 | # Color codes for output 840 | RED='\\033[0;31m' 841 | GREEN='\\033[0;32m' 842 | YELLOW='\\033[1;33m' 843 | NC='\\033[0m' # No Color 844 | 845 | # Track deployment status 846 | DEPLOYMENT_SUCCESS=true 847 | FAILED_CHECKS=() 848 | 849 | # Function to check ADR compliance 850 | check_adr_compliance() { 851 | local adr_id="$1" 852 | local requirement="$2" 853 | local command="$3" 854 | local expected="$4" 855 | local severity="$5" 856 | 857 | echo -n " Checking $adr_id: $requirement... " 858 | 859 | if eval "$command" > /dev/null 2>&1; then 860 | echo -e "\${GREEN}✓\${NC}" 861 | return 0 862 | else 863 | echo -e "\${RED}✗\${NC}" 864 | FAILED_CHECKS+=("$adr_id: $requirement [$severity]") 865 | if [ "$severity" = "critical" ]; then 866 | DEPLOYMENT_SUCCESS=false 867 | fi 868 | return 1 869 | fi 870 | } 871 | 872 | # Phase 1: Pre-deployment validation 873 | echo "📋 Phase 1: Pre-deployment ADR Validation" 874 | echo "==========================================" 875 | 876 | ${checks 877 | .filter(c => c.severity === 'critical') 878 | .map( 879 | check => ` 880 | check_adr_compliance \\ 881 | "${check.adrId}" \\ 882 | "${check.requirement.substring(0, 50)}..." \\ 883 | "${check.validationCommand}" \\ 884 | "${check.expectedOutcome}" \\ 885 | "${check.severity}"` 886 | ) 887 | .join('\n')} 888 | 889 | if [ "$DEPLOYMENT_SUCCESS" = false ]; then 890 | echo -e "\${RED}❌ Critical ADR violations found. Deployment aborted.\${NC}" 891 | exit 1 892 | fi 893 | 894 | # Phase 2: Build and prepare deployment 895 | echo "" 896 | echo "🔨 Phase 2: Build and Prepare" 897 | echo "=============================" 898 | 899 | # Install dependencies if needed 900 | if [ -f "package.json" ]; then 901 | echo " Installing dependencies..." 902 | npm ci || npm install 903 | fi 904 | 905 | # Build the project 906 | if [ -f "package.json" ] && grep -q '"build"' package.json; then 907 | echo " Building project..." 908 | npm run build 909 | fi 910 | 911 | ${ 912 | includeTests 913 | ? ` 914 | # Phase 3: Run tests 915 | echo "" 916 | echo "🧪 Phase 3: Test Execution" 917 | echo "=========================" 918 | 919 | if [ -f "package.json" ] && grep -q '"test"' package.json; then 920 | echo " Running tests..." 921 | npm test || { 922 | echo -e "\${YELLOW}⚠️ Tests failed but continuing...\${NC}" 923 | } 924 | fi 925 | ` 926 | : '' 927 | } 928 | 929 | ${ 930 | includeDeployment 931 | ? ` 932 | # Phase 4: Deploy application 933 | echo "" 934 | echo "🚢 Phase 4: Deployment" 935 | echo "=====================" 936 | 937 | # Start the application 938 | if [ -f "docker-compose.yml" ]; then 939 | echo " Starting with Docker Compose..." 940 | docker-compose up -d 941 | elif [ -f "package.json" ] && grep -q '"start"' package.json; then 942 | echo " Starting application..." 943 | npm start & 944 | sleep 5 # Wait for startup 945 | else 946 | echo " No deployment method detected" 947 | fi 948 | ` 949 | : '' 950 | } 951 | 952 | # Phase 5: Post-deployment validation 953 | echo "" 954 | echo "✅ Phase 5: Post-deployment ADR Validation" 955 | echo "=========================================" 956 | 957 | ${checks 958 | .filter(c => c.severity !== 'critical') 959 | .map( 960 | check => ` 961 | check_adr_compliance \\ 962 | "${check.adrId}" \\ 963 | "${check.requirement.substring(0, 50)}..." \\ 964 | "${check.validationCommand}" \\ 965 | "${check.expectedOutcome}" \\ 966 | "${check.severity}"` 967 | ) 968 | .join('\n')} 969 | 970 | ${ 971 | customValidations.length > 0 972 | ? ` 973 | # Custom validations 974 | echo "" 975 | echo "🔧 Custom Validations" 976 | echo "====================" 977 | ${customValidations.map(v => `eval "${v}"`).join('\n')} 978 | ` 979 | : '' 980 | } 981 | 982 | # Final report 983 | echo "" 984 | echo "📊 Deployment Summary" 985 | echo "====================" 986 | 987 | if [ \${#FAILED_CHECKS[@]} -eq 0 ]; then 988 | echo -e "\${GREEN}✅ All ADR compliance checks passed!\${NC}" 989 | echo "🎉 Deployment successful and ADR-compliant!" 990 | exit 0 991 | else 992 | echo -e "\${YELLOW}⚠️ Some ADR checks failed:\${NC}" 993 | for check in "\${FAILED_CHECKS[@]}"; do 994 | echo " - $check" 995 | done 996 | 997 | if [ "$DEPLOYMENT_SUCCESS" = false ]; then 998 | echo -e "\${RED}❌ Deployment failed due to critical ADR violations\${NC}" 999 | exit 1 1000 | else 1001 | echo -e "\${YELLOW}⚠️ Deployment completed with warnings\${NC}" 1002 | exit 0 1003 | fi 1004 | fi 1005 | `; 1006 | } 1007 | 1008 | /** 1009 | * Generate validate_bootstrap.sh script content 1010 | */ 1011 | function generateValidationScript( 1012 | checks: AdrComplianceCheck[], 1013 | projectPath: string, 1014 | adrs: any[] 1015 | ): string { 1016 | return `#!/bin/bash 1017 | # ADR Validation Script 1018 | # Generated by MCP ADR Analysis Server 1019 | # Purpose: Validate deployed code follows ADR requirements 1020 | 1021 | set -e # Exit on error 1022 | 1023 | echo "🔍 ADR Compliance Validation" 1024 | echo "============================" 1025 | echo "📍 Project: ${projectPath}" 1026 | echo "📋 ADRs to validate: ${adrs.length}" 1027 | echo "✓ Validation checks: ${checks.length}" 1028 | echo "" 1029 | 1030 | # Color codes 1031 | RED='\\033[0;31m' 1032 | GREEN='\\033[0;32m' 1033 | YELLOW='\\033[1;33m' 1034 | BLUE='\\033[0;34m' 1035 | NC='\\033[0m' # No Color 1036 | 1037 | # Tracking variables 1038 | TOTAL_CHECKS=${checks.length} 1039 | PASSED_CHECKS=0 1040 | FAILED_CHECKS=0 1041 | CRITICAL_FAILURES=0 1042 | 1043 | # Results array 1044 | declare -a RESULTS 1045 | 1046 | # Validation function 1047 | validate_adr() { 1048 | local adr_id="$1" 1049 | local adr_title="$2" 1050 | local requirement="$3" 1051 | local command="$4" 1052 | local severity="$5" 1053 | local status="FAIL" 1054 | local color=$RED 1055 | 1056 | echo -e "\${BLUE}Validating:\${NC} $adr_id - $adr_title" 1057 | echo " Requirement: $requirement" 1058 | echo -n " Status: " 1059 | 1060 | if eval "$command" > /dev/null 2>&1; then 1061 | status="PASS" 1062 | color=$GREEN 1063 | PASSED_CHECKS=$((PASSED_CHECKS + 1)) 1064 | echo -e "\${color}✓ PASSED\${NC}" 1065 | else 1066 | FAILED_CHECKS=$((FAILED_CHECKS + 1)) 1067 | if [ "$severity" = "critical" ]; then 1068 | CRITICAL_FAILURES=$((CRITICAL_FAILURES + 1)) 1069 | fi 1070 | echo -e "\${color}✗ FAILED [$severity]\${NC}" 1071 | fi 1072 | 1073 | RESULTS+=("$adr_id|$adr_title|$requirement|$status|$severity") 1074 | echo "" 1075 | } 1076 | 1077 | # Run all validations 1078 | echo "🔍 Running ADR Compliance Checks" 1079 | echo "================================" 1080 | echo "" 1081 | 1082 | ${checks 1083 | .map( 1084 | check => ` 1085 | validate_adr \\ 1086 | "${check.adrId}" \\ 1087 | "${check.adrTitle}" \\ 1088 | "${check.requirement}" \\ 1089 | "${check.validationCommand}" \\ 1090 | "${check.severity}"` 1091 | ) 1092 | .join('\n')} 1093 | 1094 | # Generate compliance report 1095 | echo "" 1096 | echo "📊 ADR Compliance Report" 1097 | echo "=======================" 1098 | echo "" 1099 | echo "Summary:" 1100 | echo "--------" 1101 | echo " Total ADRs: ${adrs.length}" 1102 | echo " Total Checks: $TOTAL_CHECKS" 1103 | echo -e " \${GREEN}Passed: $PASSED_CHECKS\${NC}" 1104 | echo -e " \${RED}Failed: $FAILED_CHECKS\${NC}" 1105 | echo -e " \${RED}Critical Failures: $CRITICAL_FAILURES\${NC}" 1106 | echo "" 1107 | 1108 | # Calculate compliance percentage 1109 | COMPLIANCE_PERCENT=0 1110 | if [ $TOTAL_CHECKS -gt 0 ]; then 1111 | COMPLIANCE_PERCENT=$((PASSED_CHECKS * 100 / TOTAL_CHECKS)) 1112 | fi 1113 | 1114 | echo "Compliance Score: $COMPLIANCE_PERCENT%" 1115 | echo "" 1116 | 1117 | # Detailed results table 1118 | echo "Detailed Results:" 1119 | echo "-----------------" 1120 | printf "%-20s %-40s %-10s %-10s\\n" "ADR" "Requirement" "Status" "Severity" 1121 | echo "--------------------------------------------------------------------------------" 1122 | 1123 | for result in "\${RESULTS[@]}"; do 1124 | IFS='|' read -r adr_id adr_title requirement status severity <<< "$result" 1125 | 1126 | if [ "$status" = "PASS" ]; then 1127 | status_color=$GREEN 1128 | else 1129 | status_color=$RED 1130 | fi 1131 | 1132 | printf "%-20s %-40s \${status_color}%-10s\${NC} %-10s\\n" \\ 1133 | "$adr_id" \\ 1134 | "\${requirement:0:40}" \\ 1135 | "$status" \\ 1136 | "$severity" 1137 | done 1138 | 1139 | echo "" 1140 | echo "==================================================================================" 1141 | 1142 | # Exit with appropriate code 1143 | if [ $CRITICAL_FAILURES -gt 0 ]; then 1144 | echo -e "\${RED}❌ Validation FAILED: Critical ADR violations detected\${NC}" 1145 | echo "" 1146 | echo "Action Required:" 1147 | echo " 1. Review failed critical checks above" 1148 | echo " 2. Update implementation to match ADR requirements" 1149 | echo " 3. Re-run this validation script" 1150 | exit 1 1151 | elif [ $FAILED_CHECKS -gt 0 ]; then 1152 | echo -e "\${YELLOW}⚠️ Validation PASSED with warnings\${NC}" 1153 | echo "" 1154 | echo "Recommended Actions:" 1155 | echo " 1. Review non-critical failures" 1156 | echo " 2. Plan remediation for next iteration" 1157 | exit 0 1158 | else 1159 | echo -e "\${GREEN}✅ Validation PASSED: Full ADR compliance achieved!\${NC}" 1160 | exit 0 1161 | fi 1162 | `; 1163 | } 1164 | 1165 | /** 1166 | * Perform tree-sitter analysis for ADR compliance validation 1167 | */ 1168 | async function performAdrComplianceAnalysis( 1169 | projectPath: string, 1170 | adrs: any[], 1171 | complianceChecks: AdrComplianceCheck[] 1172 | ): Promise<{ 1173 | filesAnalyzed: number; 1174 | implementations: Array<{ 1175 | adrTitle: string; 1176 | evidence: string; 1177 | file: string; 1178 | line: number; 1179 | confidence: number; 1180 | }>; 1181 | violations: Array<{ 1182 | adrTitle: string; 1183 | issue: string; 1184 | file: string; 1185 | line: number; 1186 | severity: string; 1187 | }>; 1188 | patterns: string[]; 1189 | }> { 1190 | const analyzer = new TreeSitterAnalyzer(); 1191 | const { readdirSync, statSync } = await import('fs'); 1192 | const { join } = await import('path'); 1193 | 1194 | const results = { 1195 | filesAnalyzed: 0, 1196 | implementations: [] as any[], 1197 | violations: [] as any[], 1198 | patterns: [] as string[], 1199 | }; 1200 | 1201 | // Find source files to analyze 1202 | const sourceFiles: string[] = []; 1203 | const findSourceFiles = (dir: string, depth: number = 0) => { 1204 | if (depth > 3) return; // Limit recursion depth 1205 | 1206 | try { 1207 | const items = readdirSync(dir); 1208 | for (const item of items) { 1209 | if (item.startsWith('.') || item === 'node_modules') continue; 1210 | 1211 | const fullPath = join(dir, item); 1212 | const stat = statSync(fullPath); 1213 | 1214 | if (stat.isDirectory()) { 1215 | findSourceFiles(fullPath, depth + 1); 1216 | } else if (stat.isFile()) { 1217 | const ext = item.split('.').pop()?.toLowerCase(); 1218 | if (['ts', 'js', 'py', 'yml', 'yaml', 'tf', 'hcl', 'json'].includes(ext || '')) { 1219 | sourceFiles.push(fullPath); 1220 | } 1221 | } 1222 | } 1223 | } catch { 1224 | // Skip directories we can't read 1225 | } 1226 | }; 1227 | 1228 | findSourceFiles(projectPath); 1229 | 1230 | // Analyze files (limit to first 15 for performance) 1231 | const filesToAnalyze = sourceFiles.slice(0, 15); 1232 | results.filesAnalyzed = filesToAnalyze.length; 1233 | 1234 | for (const filePath of filesToAnalyze) { 1235 | try { 1236 | const analysis = await analyzer.analyzeFile(filePath); 1237 | 1238 | // Check for ADR implementation evidence 1239 | for (const adr of adrs) { 1240 | if (!adr.content) continue; 1241 | 1242 | // Look for technology/framework mentions in ADR 1243 | const adrTechnologies = extractTechnologiesFromAdr(adr.content); 1244 | 1245 | // Check if file implements required technologies 1246 | if (analysis.imports) { 1247 | for (const imp of analysis.imports) { 1248 | for (const tech of adrTechnologies) { 1249 | if (imp.module.toLowerCase().includes(tech.toLowerCase())) { 1250 | results.implementations.push({ 1251 | adrTitle: adr.title || 'Unknown ADR', 1252 | evidence: `Uses required technology: ${tech} (import: ${imp.module})`, 1253 | file: filePath, 1254 | line: imp.location.line, 1255 | confidence: 0.8, 1256 | }); 1257 | } 1258 | } 1259 | } 1260 | } 1261 | 1262 | // Check for architectural pattern compliance 1263 | if (analysis.functions) { 1264 | const adrPatterns = extractPatternsFromAdr(adr.content); 1265 | for (const pattern of adrPatterns) { 1266 | // Look for functions that match architectural patterns 1267 | const matchingFunctions = analysis.functions.filter( 1268 | func => 1269 | func.name.toLowerCase().includes(pattern.toLowerCase()) || 1270 | (pattern.includes('service') && func.name.toLowerCase().includes('service')) || 1271 | (pattern.includes('controller') && func.name.toLowerCase().includes('controller')) 1272 | ); 1273 | 1274 | if (matchingFunctions.length > 0) { 1275 | results.implementations.push({ 1276 | adrTitle: adr.title || 'Unknown ADR', 1277 | evidence: `Implements ${pattern} pattern (${matchingFunctions.length} functions)`, 1278 | file: filePath, 1279 | line: matchingFunctions[0]?.location.line || 1, 1280 | confidence: 0.7, 1281 | }); 1282 | 1283 | if (!results.patterns.includes(pattern)) { 1284 | results.patterns.push(pattern); 1285 | } 1286 | } 1287 | } 1288 | } 1289 | } 1290 | 1291 | // Check for compliance violations 1292 | for (const check of complianceChecks) { 1293 | // Security-related violations 1294 | if (analysis.hasSecrets && check.requirement.toLowerCase().includes('security')) { 1295 | results.violations.push({ 1296 | adrTitle: check.adrTitle, 1297 | issue: `Security violation: ${analysis.secrets.length} secrets detected`, 1298 | file: filePath, 1299 | line: analysis.secrets[0]?.location.line || 1, 1300 | severity: check.severity, 1301 | }); 1302 | } 1303 | 1304 | // Architecture violations 1305 | if (analysis.architecturalViolations && analysis.architecturalViolations.length > 0) { 1306 | for (const violation of analysis.architecturalViolations) { 1307 | results.violations.push({ 1308 | adrTitle: check.adrTitle, 1309 | issue: `Architectural violation: ${violation.message}`, 1310 | file: filePath, 1311 | line: violation.location.line, 1312 | severity: check.severity, 1313 | }); 1314 | } 1315 | } 1316 | } 1317 | } catch (error) { 1318 | // Skip files that can't be analyzed 1319 | console.warn(`Could not analyze file ${filePath}:`, error); 1320 | } 1321 | } 1322 | 1323 | return results; 1324 | } 1325 | 1326 | /** 1327 | * Extract technologies mentioned in ADR content 1328 | */ 1329 | function extractTechnologiesFromAdr(content: string): string[] { 1330 | const technologies = []; 1331 | const techPatterns = [ 1332 | /\b(react|vue|angular|express|fastapi|django|flask|spring|laravel)\b/gi, 1333 | /\b(postgres|mysql|mongodb|redis|elasticsearch)\b/gi, 1334 | /\b(docker|kubernetes|terraform|ansible)\b/gi, 1335 | /\b(aws|azure|gcp|cloudflare)\b/gi, 1336 | ]; 1337 | 1338 | for (const pattern of techPatterns) { 1339 | const matches = content.match(pattern); 1340 | if (matches) { 1341 | technologies.push(...matches.map(m => m.toLowerCase())); 1342 | } 1343 | } 1344 | 1345 | return [...new Set(technologies)]; // Remove duplicates 1346 | } 1347 | 1348 | /** 1349 | * Extract architectural patterns mentioned in ADR content 1350 | */ 1351 | function extractPatternsFromAdr(content: string): string[] { 1352 | const patterns = []; 1353 | const patternKeywords = [ 1354 | 'microservice', 1355 | 'service', 1356 | 'controller', 1357 | 'repository', 1358 | 'factory', 1359 | 'singleton', 1360 | 'observer', 1361 | 'strategy', 1362 | 'adapter', 1363 | 'facade', 1364 | 'mvc', 1365 | 'mvp', 1366 | 'mvvm', 1367 | 'layered', 1368 | 'hexagonal', 1369 | 'clean', 1370 | ]; 1371 | 1372 | for (const keyword of patternKeywords) { 1373 | if (content.toLowerCase().includes(keyword)) { 1374 | patterns.push(keyword); 1375 | } 1376 | } 1377 | 1378 | return patterns; 1379 | } 1380 | 1381 | export default generateAdrBootstrapScripts; 1382 | ```