<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 9.0.0 (20230911.1827)
-->
<!-- Title: nodejs_deps Pages: 1 -->
<svg width="1519pt" height="522pt"
viewBox="0.00 0.00 1519.00 522.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 518)">
<title>nodejs_deps</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-518 1515,-518 1515,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_npm</title>
<polygon fill="none" stroke="red" stroke-dasharray="5,2" points="8,-8 8,-85.25 966,-85.25 966,-8 8,-8"/>
<text text-anchor="middle" x="487" y="-67.95" font-family="Times,serif" font-size="14.00">NPM Packages</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_core</title>
<polygon fill="none" stroke="blue" stroke-dasharray="5,2" points="1168,-8 1168,-85.25 1492,-85.25 1492,-8 1168,-8"/>
<text text-anchor="middle" x="1330" y="-67.95" font-family="Times,serif" font-size="14.00">Core Node.js Modules</text>
</g>
<!-- app -->
<g id="node1" class="node">
<title>app</title>
<ellipse fill="lightblue" stroke="black" cx="1054" cy="-496" rx="34.6" ry="18"/>
<text text-anchor="middle" x="1054" y="-490.57" font-family="Arial" font-size="14.00">app.js</text>
</g>
<!-- routes -->
<g id="node2" class="node">
<title>routes</title>
<polygon fill="lightgreen" stroke="black" points="820.62,-426.25 817.62,-430.25 796.62,-430.25 793.62,-426.25 763.38,-426.25 763.38,-390.25 820.62,-390.25 820.62,-426.25"/>
<text text-anchor="middle" x="792" y="-402.82" font-family="Arial" font-size="14.00">routes/</text>
</g>
<!-- app->routes -->
<g id="edge1" class="edge">
<title>app->routes</title>
<path fill="none" stroke="black" d="M1025.21,-485.58C978.18,-470.18 884.77,-439.61 831.55,-422.19"/>
<polygon fill="black" stroke="black" points="832.87,-418.94 822.27,-419.16 830.69,-425.6 832.87,-418.94"/>
<text text-anchor="middle" x="967" y="-446.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- middleware -->
<g id="node5" class="node">
<title>middleware</title>
<polygon fill="lightgreen" stroke="black" points="363.75,-338.5 360.75,-342.5 339.75,-342.5 336.75,-338.5 274.25,-338.5 274.25,-302.5 363.75,-302.5 363.75,-338.5"/>
<text text-anchor="middle" x="319" y="-315.07" font-family="Arial" font-size="14.00">middleware/</text>
</g>
<!-- app->middleware -->
<g id="edge2" class="edge">
<title>app->middleware</title>
<path fill="none" stroke="black" d="M1021.79,-489.22C960.99,-478.14 825.23,-452.69 712,-426.25 591.08,-398.01 450.85,-359.14 374.89,-337.57"/>
<polygon fill="black" stroke="black" points="376.19,-334.3 365.61,-334.93 374.27,-341.03 376.19,-334.3"/>
<text text-anchor="middle" x="733" y="-402.82" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- config -->
<g id="node7" class="node">
<title>config</title>
<polygon fill="lightgreen" stroke="black" points="1215.88,-250.75 1212.88,-254.75 1191.88,-254.75 1188.88,-250.75 1160.12,-250.75 1160.12,-214.75 1215.88,-214.75 1215.88,-250.75"/>
<text text-anchor="middle" x="1188" y="-227.32" font-family="Arial" font-size="14.00">config/</text>
</g>
<!-- app->config -->
<g id="edge3" class="edge">
<title>app->config</title>
<path fill="none" stroke="black" d="M1062.59,-478.26C1085.12,-434.33 1146.13,-315.39 1173.89,-261.25"/>
<polygon fill="black" stroke="black" points="1177,-262.87 1178.45,-252.38 1170.77,-259.68 1177,-262.87"/>
<text text-anchor="middle" x="1145" y="-358.95" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- express -->
<g id="node23" class="node">
<title>express</title>
<polygon fill="orange" stroke="black" points="113.59,-34 89.3,-52 40.7,-52 16.41,-34 40.7,-16 89.3,-16 113.59,-34"/>
<text text-anchor="middle" x="65" y="-28.57" font-family="Arial" font-size="14.00">express</text>
</g>
<!-- app->express -->
<g id="edge4" class="edge">
<title>app->express</title>
<path fill="none" stroke="black" d="M1019.38,-494.43C882.22,-492.06 376.64,-481.97 218,-460 125.88,-447.24 15,-502.25 15,-409.25 15,-409.25 15,-409.25 15,-144 15,-113.81 31.05,-82.84 44.96,-61.67"/>
<polygon fill="black" stroke="black" points="47.7,-63.86 50.48,-53.63 41.93,-59.89 47.7,-63.86"/>
<text text-anchor="middle" x="36" y="-271.2" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- cors -->
<g id="node27" class="node">
<title>cors</title>
<polygon fill="orange" stroke="black" points="194.88,-34 178.94,-52 147.06,-52 131.12,-34 147.06,-16 178.94,-16 194.88,-34"/>
<text text-anchor="middle" x="163" y="-28.57" font-family="Arial" font-size="14.00">cors</text>
</g>
<!-- app->cors -->
<g id="edge5" class="edge">
<title>app->cors</title>
<path fill="none" stroke="black" d="M1019.33,-493.8C845.83,-487.59 80,-457.42 80,-409.25 80,-409.25 80,-409.25 80,-144 80,-141.43 117.87,-92.59 142.45,-61.17"/>
<polygon fill="black" stroke="black" points="144.95,-63.66 148.36,-53.63 139.44,-59.34 144.95,-63.66"/>
<text text-anchor="middle" x="101" y="-271.2" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- dotenv -->
<g id="node28" class="node">
<title>dotenv</title>
<polygon fill="orange" stroke="black" points="958.41,-34 936.7,-52 893.3,-52 871.59,-34 893.3,-16 936.7,-16 958.41,-34"/>
<text text-anchor="middle" x="915" y="-28.57" font-family="Arial" font-size="14.00">dotenv</text>
</g>
<!-- app->dotenv -->
<g id="edge6" class="edge">
<title>app->dotenv</title>
<path fill="none" stroke="black" d="M1088.68,-494.68C1144.48,-492.13 1248,-478.11 1248,-409.25 1248,-409.25 1248,-409.25 1248,-231.75 1248,-182.66 1249.42,-159.91 1213,-127 1185.96,-102.57 1167.02,-122.07 1133,-109 1119.67,-103.88 1118.12,-98.87 1105,-93.25 1056.66,-72.53 998.51,-55.83 959.38,-45.71"/>
<polygon fill="black" stroke="black" points="960.4,-42.36 949.84,-43.28 958.67,-49.14 960.4,-42.36"/>
<text text-anchor="middle" x="1269" y="-271.2" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- fs -->
<g id="node31" class="node">
<title>fs</title>
<polygon fill="lightsteelblue" stroke="black" points="1484,-34 1470.5,-52 1443.5,-52 1430,-34 1443.5,-16 1470.5,-16 1484,-34"/>
<text text-anchor="middle" x="1457" y="-28.57" font-family="Arial" font-size="14.00">fs</text>
</g>
<!-- app->fs -->
<g id="edge49" class="edge">
<title>app->fs</title>
<path fill="none" stroke="black" d="M1089.03,-495.17C1189.08,-494.73 1469,-486.59 1469,-409.25 1469,-409.25 1469,-409.25 1469,-144 1469,-116.53 1465.19,-85.4 1461.86,-63.46"/>
<polygon fill="black" stroke="black" points="1465.35,-63.13 1460.33,-53.8 1458.44,-64.22 1465.35,-63.13"/>
<text text-anchor="middle" x="1490" y="-271.2" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- path -->
<g id="node32" class="node">
<title>path</title>
<polygon fill="lightsteelblue" stroke="black" points="1412.46,-34 1396.23,-52 1363.77,-52 1347.54,-34 1363.77,-16 1396.23,-16 1412.46,-34"/>
<text text-anchor="middle" x="1380" y="-28.57" font-family="Arial" font-size="14.00">path</text>
</g>
<!-- app->path -->
<g id="edge50" class="edge">
<title>app->path</title>
<path fill="none" stroke="black" d="M1088.84,-493.84C1177.37,-489.95 1404,-473.69 1404,-409.25 1404,-409.25 1404,-409.25 1404,-144 1404,-116.08 1396.4,-85.05 1389.75,-63.27"/>
<polygon fill="black" stroke="black" points="1393.14,-62.39 1386.77,-53.93 1386.47,-64.52 1393.14,-62.39"/>
<text text-anchor="middle" x="1425" y="-271.2" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- user_routes -->
<g id="node8" class="node">
<title>user_routes</title>
<polygon fill="lightyellow" stroke="black" points="902.12,-338.5 805.88,-338.5 805.88,-302.5 902.12,-302.5 902.12,-338.5"/>
<text text-anchor="middle" x="854" y="-315.07" font-family="Arial" font-size="14.00">user.routes.js</text>
</g>
<!-- routes->user_routes -->
<g id="edge7" class="edge">
<title>routes->user_routes</title>
<path fill="none" stroke="black" d="M804.55,-389.9C813.29,-377.81 825.1,-361.47 834.99,-347.79"/>
<polygon fill="black" stroke="black" points="837.56,-350.21 840.59,-340.05 831.89,-346.11 837.56,-350.21"/>
<text text-anchor="middle" x="850.5" y="-358.95" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- product_routes -->
<g id="node9" class="node">
<title>product_routes</title>
<polygon fill="lightyellow" stroke="black" points="787.88,-338.5 672.12,-338.5 672.12,-302.5 787.88,-302.5 787.88,-338.5"/>
<text text-anchor="middle" x="730" y="-315.07" font-family="Arial" font-size="14.00">product.routes.js</text>
</g>
<!-- routes->product_routes -->
<g id="edge8" class="edge">
<title>routes->product_routes</title>
<path fill="none" stroke="black" d="M779.45,-389.9C770.71,-377.81 758.9,-361.47 749.01,-347.79"/>
<polygon fill="black" stroke="black" points="752.11,-346.11 743.41,-340.05 746.44,-350.21 752.11,-346.11"/>
<text text-anchor="middle" x="788.5" y="-358.95" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- auth_routes -->
<g id="node10" class="node">
<title>auth_routes</title>
<polygon fill="lightyellow" stroke="black" points="520.5,-338.5 423.5,-338.5 423.5,-302.5 520.5,-302.5 520.5,-338.5"/>
<text text-anchor="middle" x="472" y="-315.07" font-family="Arial" font-size="14.00">auth.routes.js</text>
</g>
<!-- routes->auth_routes -->
<g id="edge9" class="edge">
<title>routes->auth_routes</title>
<path fill="none" stroke="black" d="M763.04,-399.49C711.01,-385.55 600.74,-356 531.87,-337.54"/>
<polygon fill="black" stroke="black" points="532.8,-334.17 522.23,-334.96 530.98,-340.93 532.8,-334.17"/>
<text text-anchor="middle" x="682.5" y="-358.95" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- controllers -->
<g id="node3" class="node">
<title>controllers</title>
<polygon fill="lightgreen" stroke="black" points="635,-338.5 632,-342.5 611,-342.5 608,-338.5 553,-338.5 553,-302.5 635,-302.5 635,-338.5"/>
<text text-anchor="middle" x="594" y="-315.07" font-family="Arial" font-size="14.00">controllers/</text>
</g>
<!-- user_controller -->
<g id="node11" class="node">
<title>user_controller</title>
<polygon fill="lightcyan" stroke="black" points="910.75,-250.75 797.25,-250.75 797.25,-214.75 910.75,-214.75 910.75,-250.75"/>
<text text-anchor="middle" x="854" y="-227.32" font-family="Arial" font-size="14.00">user.controller.js</text>
</g>
<!-- controllers->user_controller -->
<g id="edge13" class="edge">
<title>controllers->user_controller</title>
<path fill="none" stroke="black" d="M616.38,-302.03C633.39,-289.08 655.58,-272.97 666,-268.75 713.95,-249.34 730.22,-260.62 781,-250.75 782.64,-250.43 784.29,-250.1 785.96,-249.77"/>
<polygon fill="black" stroke="black" points="786.55,-253.22 795.62,-247.74 785.11,-246.37 786.55,-253.22"/>
<text text-anchor="middle" x="688.5" y="-271.2" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- product_controller -->
<g id="node12" class="node">
<title>product_controller</title>
<polygon fill="lightcyan" stroke="black" points="771.5,-250.75 638.5,-250.75 638.5,-214.75 771.5,-214.75 771.5,-250.75"/>
<text text-anchor="middle" x="705" y="-227.32" font-family="Arial" font-size="14.00">product.controller.js</text>
</g>
<!-- controllers->product_controller -->
<g id="edge14" class="edge">
<title>controllers->product_controller</title>
<path fill="none" stroke="black" d="M589.65,-302.36C587.99,-291.67 587.94,-278.21 595,-268.75 599.8,-262.32 612.35,-256.49 627.33,-251.52"/>
<polygon fill="black" stroke="black" points="628.06,-254.96 636.58,-248.66 625.99,-248.27 628.06,-254.96"/>
<text text-anchor="middle" x="617.5" y="-271.2" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- auth_controller -->
<g id="node13" class="node">
<title>auth_controller</title>
<polygon fill="lightcyan" stroke="black" points="516.12,-250.75 401.88,-250.75 401.88,-214.75 516.12,-214.75 516.12,-250.75"/>
<text text-anchor="middle" x="459" y="-227.32" font-family="Arial" font-size="14.00">auth.controller.js</text>
</g>
<!-- controllers->auth_controller -->
<g id="edge15" class="edge">
<title>controllers->auth_controller</title>
<path fill="none" stroke="black" d="M566.68,-302.15C546.28,-289.19 518.17,-271.34 495.79,-257.12"/>
<polygon fill="black" stroke="black" points="497.87,-254.3 487.56,-251.89 494.12,-260.2 497.87,-254.3"/>
<text text-anchor="middle" x="560.5" y="-271.2" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- models -->
<g id="node4" class="node">
<title>models</title>
<polygon fill="lightgreen" stroke="black" points="609,-250.75 606,-254.75 585,-254.75 582,-250.75 545,-250.75 545,-214.75 609,-214.75 609,-250.75"/>
<text text-anchor="middle" x="577" y="-227.32" font-family="Arial" font-size="14.00">models/</text>
</g>
<!-- user_model -->
<g id="node14" class="node">
<title>user_model</title>
<polygon fill="lightpink" stroke="black" points="613.12,-163 516.88,-163 516.88,-127 613.12,-127 613.12,-163"/>
<text text-anchor="middle" x="565" y="-139.57" font-family="Arial" font-size="14.00">user.model.js</text>
</g>
<!-- models->user_model -->
<g id="edge25" class="edge">
<title>models->user_model</title>
<path fill="none" stroke="black" d="M544.7,-217.53C536.47,-212.26 528.65,-205.39 524,-196.75 519.23,-187.89 522.71,-179.06 529.29,-171.32"/>
<polygon fill="black" stroke="black" points="531.62,-173.94 536.32,-164.44 526.72,-168.93 531.62,-173.94"/>
<text text-anchor="middle" x="546.5" y="-183.45" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- product_model -->
<g id="node15" class="node">
<title>product_model</title>
<polygon fill="lightpink" stroke="black" points="746.88,-163 631.12,-163 631.12,-127 746.88,-127 746.88,-163"/>
<text text-anchor="middle" x="689" y="-139.57" font-family="Arial" font-size="14.00">product.model.js</text>
</g>
<!-- models->product_model -->
<g id="edge26" class="edge">
<title>models->product_model</title>
<path fill="none" stroke="black" d="M584.29,-214.34C589.55,-203.55 597.55,-190.07 608,-181 613.31,-176.39 619.33,-172.3 625.62,-168.7"/>
<polygon fill="black" stroke="black" points="627.1,-171.88 634.34,-164.15 623.85,-165.68 627.1,-171.88"/>
<text text-anchor="middle" x="630.5" y="-183.45" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- auth_middleware -->
<g id="node16" class="node">
<title>auth_middleware</title>
<polygon fill="lightsalmon" stroke="black" points="383.62,-250.75 254.38,-250.75 254.38,-214.75 383.62,-214.75 383.62,-250.75"/>
<text text-anchor="middle" x="319" y="-227.32" font-family="Arial" font-size="14.00">auth.middleware.js</text>
</g>
<!-- middleware->auth_middleware -->
<g id="edge30" class="edge">
<title>middleware->auth_middleware</title>
<path fill="none" stroke="black" d="M319,-302.15C319,-290.76 319,-275.59 319,-262.43"/>
<polygon fill="black" stroke="black" points="322.5,-262.59 319,-252.59 315.5,-262.59 322.5,-262.59"/>
<text text-anchor="middle" x="341.5" y="-271.2" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- cors_middleware -->
<g id="node17" class="node">
<title>cors_middleware</title>
<polygon fill="lightsalmon" stroke="black" points="236.25,-250.75 107.75,-250.75 107.75,-214.75 236.25,-214.75 236.25,-250.75"/>
<text text-anchor="middle" x="172" y="-227.32" font-family="Arial" font-size="14.00">cors.middleware.js</text>
</g>
<!-- middleware->cors_middleware -->
<g id="edge31" class="edge">
<title>middleware->cors_middleware</title>
<path fill="none" stroke="black" d="M289.25,-302.15C266.91,-289.11 236.09,-271.14 211.65,-256.88"/>
<polygon fill="black" stroke="black" points="213.66,-254 203.26,-251.99 210.14,-260.05 213.66,-254"/>
<text text-anchor="middle" x="281.5" y="-271.2" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- utils -->
<g id="node6" class="node">
<title>utils</title>
<polygon fill="lightgreen" stroke="black" points="1079,-250.75 1076,-254.75 1055,-254.75 1052,-250.75 1025,-250.75 1025,-214.75 1079,-214.75 1079,-250.75"/>
<text text-anchor="middle" x="1052" y="-227.32" font-family="Arial" font-size="14.00">utils/</text>
</g>
<!-- db_utils -->
<g id="node18" class="node">
<title>db_utils</title>
<polygon fill="lightgray" stroke="black" points="1061.12,-163 988.88,-163 988.88,-127 1061.12,-127 1061.12,-163"/>
<text text-anchor="middle" x="1025" y="-139.57" font-family="Arial" font-size="14.00">db.utils.js</text>
</g>
<!-- utils->db_utils -->
<g id="edge35" class="edge">
<title>utils->db_utils</title>
<path fill="none" stroke="black" d="M1079.49,-217.13C1093.68,-207.56 1106.43,-194.38 1098,-181 1094.52,-175.47 1083.94,-169.34 1071.87,-163.78"/>
<polygon fill="black" stroke="black" points="1073.47,-160.65 1062.9,-159.87 1070.67,-167.07 1073.47,-160.65"/>
<text text-anchor="middle" x="1122.5" y="-183.45" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- validation_utils -->
<g id="node19" class="node">
<title>validation_utils</title>
<polygon fill="lightgray" stroke="black" points="879.12,-163 764.88,-163 764.88,-127 879.12,-127 879.12,-163"/>
<text text-anchor="middle" x="822" y="-139.57" font-family="Arial" font-size="14.00">validation.utils.js</text>
</g>
<!-- utils->validation_utils -->
<g id="edge36" class="edge">
<title>utils->validation_utils</title>
<path fill="none" stroke="black" d="M1024.59,-218.19C996.17,-204.18 954.81,-183.95 947,-181 936.04,-176.85 913.34,-170.3 890.26,-163.97"/>
<polygon fill="black" stroke="black" points="891.34,-160.64 880.77,-161.4 889.51,-167.4 891.34,-160.64"/>
<text text-anchor="middle" x="1002.5" y="-183.45" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- jwt_utils -->
<g id="node20" class="node">
<title>jwt_utils</title>
<polygon fill="lightgray" stroke="black" points="970.88,-163 897.12,-163 897.12,-127 970.88,-127 970.88,-163"/>
<text text-anchor="middle" x="934" y="-139.57" font-family="Arial" font-size="14.00">jwt.utils.js</text>
</g>
<!-- utils->jwt_utils -->
<g id="edge37" class="edge">
<title>utils->jwt_utils</title>
<path fill="none" stroke="black" d="M1048.31,-214.64C1045.14,-203.7 1039.52,-189.94 1030,-181 1014.93,-166.86 1004.94,-169.88 981.88,-163.26"/>
<polygon fill="black" stroke="black" points="983.18,-160 972.59,-160.23 981.01,-166.66 983.18,-160"/>
<text text-anchor="middle" x="1063.5" y="-183.45" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- database_config -->
<g id="node21" class="node">
<title>database_config</title>
<polygon fill="wheat" stroke="black" points="1204.38,-163 1079.62,-163 1079.62,-127 1204.38,-127 1204.38,-163"/>
<text text-anchor="middle" x="1142" y="-139.57" font-family="Arial" font-size="14.00">database.config.js</text>
</g>
<!-- config->database_config -->
<g id="edge42" class="edge">
<title>config->database_config</title>
<path fill="none" stroke="black" d="M1178.69,-214.4C1172.33,-202.54 1163.78,-186.59 1156.53,-173.08"/>
<polygon fill="black" stroke="black" points="1159.82,-171.82 1152.01,-164.66 1153.65,-175.13 1159.82,-171.82"/>
<text text-anchor="middle" x="1191.5" y="-183.45" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- app_config -->
<g id="node22" class="node">
<title>app_config</title>
<polygon fill="wheat" stroke="black" points="1351.88,-163 1260.12,-163 1260.12,-127 1351.88,-127 1351.88,-163"/>
<text text-anchor="middle" x="1306" y="-139.57" font-family="Arial" font-size="14.00">app.config.js</text>
</g>
<!-- config->app_config -->
<g id="edge43" class="edge">
<title>config->app_config</title>
<path fill="none" stroke="black" d="M1211.88,-214.4C1229.47,-201.61 1253.62,-184.07 1273.05,-169.95"/>
<polygon fill="black" stroke="black" points="1274.9,-172.93 1280.93,-164.22 1270.78,-167.26 1274.9,-172.93"/>
<text text-anchor="middle" x="1279.5" y="-183.45" font-family="Arial" font-size="14.00">imports</text>
</g>
<!-- user_routes->user_controller -->
<g id="edge10" class="edge">
<title>user_routes->user_controller</title>
<path fill="none" stroke="black" d="M854,-302.15C854,-290.76 854,-275.59 854,-262.43"/>
<polygon fill="black" stroke="black" points="857.5,-262.59 854,-252.59 850.5,-262.59 857.5,-262.59"/>
<text text-anchor="middle" x="875" y="-271.2" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- product_routes->product_controller -->
<g id="edge11" class="edge">
<title>product_routes->product_controller</title>
<path fill="none" stroke="black" d="M724.94,-302.15C721.59,-290.64 717.11,-275.28 713.24,-262.03"/>
<polygon fill="black" stroke="black" points="716.63,-261.15 710.48,-252.53 709.91,-263.11 716.63,-261.15"/>
<text text-anchor="middle" x="740" y="-271.2" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- auth_routes->auth_controller -->
<g id="edge12" class="edge">
<title>auth_routes->auth_controller</title>
<path fill="none" stroke="black" d="M465.59,-302.28C463.78,-296.68 462.02,-290.4 461,-284.5 459.75,-277.29 459.1,-269.42 458.79,-262.08"/>
<polygon fill="black" stroke="black" points="462.29,-262.22 458.58,-252.3 455.3,-262.37 462.29,-262.22"/>
<text text-anchor="middle" x="482" y="-271.2" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- user_controller->user_model -->
<g id="edge16" class="edge">
<title>user_controller->user_model</title>
<path fill="none" stroke="black" d="M819.8,-214.39C809.73,-208.99 798.79,-202.85 789,-196.75 778.8,-190.39 778.2,-185.38 767,-181 709.7,-158.62 687.88,-174.45 624.38,-163.17"/>
<polygon fill="black" stroke="black" points="625.34,-159.79 614.85,-161.31 624,-166.66 625.34,-159.79"/>
<text text-anchor="middle" x="810" y="-183.45" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- user_controller->validation_utils -->
<g id="edge17" class="edge">
<title>user_controller->validation_utils</title>
<path fill="none" stroke="black" d="M847.52,-214.4C843.19,-202.77 837.38,-187.22 832.4,-173.88"/>
<polygon fill="black" stroke="black" points="835.77,-172.89 829,-164.75 829.21,-175.34 835.77,-172.89"/>
<text text-anchor="middle" x="861" y="-183.45" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- user_controller->jwt_utils -->
<g id="edge18" class="edge">
<title>user_controller->jwt_utils</title>
<path fill="none" stroke="black" d="M870.19,-214.4C881.68,-202.08 897.3,-185.34 910.21,-171.5"/>
<polygon fill="black" stroke="black" points="912.54,-174.13 916.8,-164.43 907.42,-169.36 912.54,-174.13"/>
<text text-anchor="middle" x="922" y="-183.45" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- product_controller->product_model -->
<g id="edge19" class="edge">
<title>product_controller->product_model</title>
<path fill="none" stroke="black" d="M674.91,-214.58C668.89,-209.64 663.39,-203.68 660,-196.75 656.01,-188.58 658.36,-179.92 663.1,-172.1"/>
<polygon fill="black" stroke="black" points="665.75,-174.41 668.91,-164.3 660.13,-170.23 665.75,-174.41"/>
<text text-anchor="middle" x="681" y="-183.45" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- product_controller->validation_utils -->
<g id="edge20" class="edge">
<title>product_controller->validation_utils</title>
<path fill="none" stroke="black" d="M707.97,-214.67C710.69,-203.74 715.76,-189.97 725,-181 730.02,-176.13 741,-170.97 753.85,-166.15"/>
<polygon fill="black" stroke="black" points="754.8,-169.53 763.05,-162.89 752.45,-162.94 754.8,-169.53"/>
<text text-anchor="middle" x="746" y="-183.45" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- auth_controller->user_model -->
<g id="edge21" class="edge">
<title>auth_controller->user_model</title>
<path fill="none" stroke="black" d="M460.67,-214.31C462.55,-203.52 466.54,-190.04 475,-181 480.02,-175.64 492.16,-169.84 505.95,-164.54"/>
<polygon fill="black" stroke="black" points="507.11,-167.84 515.3,-161.12 504.71,-161.27 507.11,-167.84"/>
<text text-anchor="middle" x="496" y="-183.45" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- bcrypt -->
<g id="node25" class="node">
<title>bcrypt</title>
<polygon fill="orange" stroke="black" points="609.53,-34 589.26,-52 548.74,-52 528.47,-34 548.74,-16 589.26,-16 609.53,-34"/>
<text text-anchor="middle" x="569" y="-28.57" font-family="Arial" font-size="14.00">bcrypt</text>
</g>
<!-- auth_controller->bcrypt -->
<g id="edge22" class="edge">
<title>auth_controller->bcrypt</title>
<path fill="none" stroke="black" d="M455.76,-214.48C451.17,-184.02 447.04,-121.34 484,-93.25 497.05,-83.33 505.68,-93.23 520,-85.25 530.86,-79.2 540.84,-69.99 548.92,-61.11"/>
<polygon fill="black" stroke="black" points="551.5,-63.48 555.35,-53.61 546.19,-58.92 551.5,-63.48"/>
<text text-anchor="middle" x="481" y="-139.57" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- jsonwebtoken -->
<g id="node26" class="node">
<title>jsonwebtoken</title>
<polygon fill="orange" stroke="black" points="510.67,-34 472.84,-52 397.16,-52 359.33,-34 397.16,-16 472.84,-16 510.67,-34"/>
<text text-anchor="middle" x="435" y="-28.57" font-family="Arial" font-size="14.00">jsonwebtoken</text>
</g>
<!-- auth_controller->jsonwebtoken -->
<g id="edge23" class="edge">
<title>auth_controller->jsonwebtoken</title>
<path fill="none" stroke="black" d="M430.56,-214.25C423.63,-209.16 416.61,-203.21 411,-196.75 399.85,-183.92 397.12,-179.49 393,-163 384.13,-127.5 401.78,-87.59 416.86,-61.91"/>
<polygon fill="black" stroke="black" points="419.81,-63.8 422.07,-53.45 413.85,-60.13 419.81,-63.8"/>
<text text-anchor="middle" x="414" y="-139.57" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- nodemailer -->
<g id="node29" class="node">
<title>nodemailer</title>
<polygon fill="orange" stroke="black" points="341.15,-34 309.07,-52 244.93,-52 212.85,-34 244.93,-16 309.07,-16 341.15,-34"/>
<text text-anchor="middle" x="277" y="-28.57" font-family="Arial" font-size="14.00">nodemailer</text>
</g>
<!-- auth_controller->nodemailer -->
<g id="edge24" class="edge">
<title>auth_controller->nodemailer</title>
<path fill="none" stroke="black" d="M417.29,-214.36C393.37,-202.69 364.18,-185.36 344,-163 317.12,-133.21 297.67,-90.68 286.86,-62.95"/>
<polygon fill="black" stroke="black" points="290.23,-61.95 283.43,-53.82 283.68,-64.42 290.23,-61.95"/>
<text text-anchor="middle" x="365" y="-139.57" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- mongoose -->
<g id="node24" class="node">
<title>mongoose</title>
<polygon fill="orange" stroke="black" points="750.27,-34 719.63,-52 658.37,-52 627.73,-34 658.37,-16 719.63,-16 750.27,-34"/>
<text text-anchor="middle" x="689" y="-28.57" font-family="Arial" font-size="14.00">mongoose</text>
</g>
<!-- user_model->mongoose -->
<g id="edge27" class="edge">
<title>user_model->mongoose</title>
<path fill="none" stroke="black" d="M584.65,-126.73C605.24,-108.63 637.76,-80.04 661.02,-59.59"/>
<polygon fill="black" stroke="black" points="663.11,-62.42 668.31,-53.19 658.49,-57.16 663.11,-62.42"/>
<text text-anchor="middle" x="640" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- user_model->bcrypt -->
<g id="edge28" class="edge">
<title>user_model->bcrypt</title>
<path fill="none" stroke="black" d="M562.02,-126.61C561.19,-121 560.41,-114.76 560,-109 558.93,-93.92 560.71,-77.2 562.96,-63.47"/>
<polygon fill="black" stroke="black" points="566.38,-64.25 564.73,-53.79 559.49,-62.99 566.38,-64.25"/>
<text text-anchor="middle" x="581" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- product_model->mongoose -->
<g id="edge29" class="edge">
<title>product_model->mongoose</title>
<path fill="none" stroke="black" d="M689,-126.97C689,-110.03 689,-83.73 689,-63.59"/>
<polygon fill="black" stroke="black" points="692.5,-63.78 689,-53.78 685.5,-63.78 692.5,-63.78"/>
<text text-anchor="middle" x="710" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- auth_middleware->user_model -->
<g id="edge33" class="edge">
<title>auth_middleware->user_model</title>
<path fill="none" stroke="black" d="M348.3,-214.33C367.77,-203.41 394.22,-189.77 419,-181 454.99,-168.25 465.91,-172.05 503,-163 503.83,-162.8 504.67,-162.59 505.52,-162.38"/>
<polygon fill="black" stroke="black" points="506.38,-165.77 515.2,-159.91 504.65,-158.99 506.38,-165.77"/>
<text text-anchor="middle" x="440" y="-183.45" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- auth_middleware->jsonwebtoken -->
<g id="edge32" class="edge">
<title>auth_middleware->jsonwebtoken</title>
<path fill="none" stroke="black" d="M288.73,-214.41C257.07,-194 214.82,-158.84 237,-127 267.6,-83.07 301.65,-108.24 350,-85.25 366.48,-77.41 383.95,-67.41 398.74,-58.39"/>
<polygon fill="black" stroke="black" points="400.55,-61.38 407.21,-53.14 396.87,-55.43 400.55,-61.38"/>
<text text-anchor="middle" x="258" y="-139.57" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- cors_middleware->cors -->
<g id="edge34" class="edge">
<title>cors_middleware->cors</title>
<path fill="none" stroke="black" d="M167.78,-214.36C164.65,-200.54 160.65,-180.66 159,-163 155.81,-128.98 157.89,-89.69 160.07,-63.7"/>
<polygon fill="black" stroke="black" points="163.53,-64.22 160.95,-53.94 156.56,-63.59 163.53,-64.22"/>
<text text-anchor="middle" x="180" y="-139.57" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- db_utils->mongoose -->
<g id="edge38" class="edge">
<title>db_utils->mongoose</title>
<path fill="none" stroke="black" d="M988.42,-129.22C985.6,-128.38 982.77,-127.62 980,-127 931.05,-116.03 799.92,-131.32 755,-109 733.99,-98.56 716.65,-78.27 705.02,-61.57"/>
<polygon fill="black" stroke="black" points="708.13,-59.92 699.69,-53.52 702.29,-63.79 708.13,-59.92"/>
<text text-anchor="middle" x="776" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- lodash -->
<g id="node30" class="node">
<title>lodash</title>
<polygon fill="orange" stroke="black" points="853.83,-34 832.42,-52 789.58,-52 768.17,-34 789.58,-16 832.42,-16 853.83,-34"/>
<text text-anchor="middle" x="811" y="-28.57" font-family="Arial" font-size="14.00">lodash</text>
</g>
<!-- validation_utils->lodash -->
<g id="edge39" class="edge">
<title>validation_utils->lodash</title>
<path fill="none" stroke="black" d="M848.4,-126.65C853.9,-121.66 858.95,-115.72 862,-109 864.89,-102.63 864.46,-99.8 862,-93.25 857.4,-81.02 848.94,-69.67 840.21,-60.31"/>
<polygon fill="black" stroke="black" points="842.83,-57.98 833.29,-53.37 837.87,-62.92 842.83,-57.98"/>
<text text-anchor="middle" x="885" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- jwt_utils->jsonwebtoken -->
<g id="edge40" class="edge">
<title>jwt_utils->jsonwebtoken</title>
<path fill="none" stroke="black" d="M896.87,-129.2C893.9,-128.34 890.92,-127.59 888,-127 806.25,-110.35 589.73,-141.76 513,-109 489.39,-98.92 468.64,-78.31 454.48,-61.4"/>
<polygon fill="black" stroke="black" points="457.26,-59.26 448.27,-53.65 451.8,-63.64 457.26,-59.26"/>
<text text-anchor="middle" x="534" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- crypto -->
<g id="node33" class="node">
<title>crypto</title>
<polygon fill="lightsteelblue" stroke="black" points="1257.53,-34 1237.26,-52 1196.74,-52 1176.47,-34 1196.74,-16 1237.26,-16 1257.53,-34"/>
<text text-anchor="middle" x="1217" y="-28.57" font-family="Arial" font-size="14.00">crypto</text>
</g>
<!-- jwt_utils->crypto -->
<g id="edge41" class="edge">
<title>jwt_utils->crypto</title>
<path fill="none" stroke="black" d="M971.15,-129.31C974.12,-128.43 977.09,-127.65 980,-127 1026.8,-116.59 1157.8,-139.25 1195,-109 1208.34,-98.15 1213.84,-79.59 1216,-63.77"/>
<polygon fill="black" stroke="black" points="1219.48,-64.18 1216.93,-53.89 1212.51,-63.52 1219.48,-64.18"/>
<text text-anchor="middle" x="1227" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- database_config->mongoose -->
<g id="edge44" class="edge">
<title>database_config->mongoose</title>
<path fill="none" stroke="black" d="M1079.29,-128.56C1076.16,-127.99 1073.05,-127.46 1070,-127 1014.06,-118.47 868.52,-130.06 816,-109 805.82,-104.92 806.88,-98.02 797,-93.25 781.46,-85.75 774.79,-92.21 759,-85.25 744.16,-78.71 729.34,-68.7 717.19,-59.34"/>
<polygon fill="black" stroke="black" points="719.63,-56.81 709.63,-53.31 715.27,-62.28 719.63,-56.81"/>
<text text-anchor="middle" x="837" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- database_config->dotenv -->
<g id="edge45" class="edge">
<title>database_config->dotenv</title>
<path fill="none" stroke="black" d="M1101.65,-126.55C1089.2,-121.06 1075.48,-114.88 1063,-109 1024.53,-90.87 981.06,-68.96 951.23,-53.71"/>
<polygon fill="black" stroke="black" points="953.13,-50.75 942.63,-49.3 949.93,-56.98 953.13,-50.75"/>
<text text-anchor="middle" x="1084" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- app_config->dotenv -->
<g id="edge46" class="edge">
<title>app_config->dotenv</title>
<path fill="none" stroke="black" d="M1259.92,-130.48C1255.24,-129.24 1250.53,-128.06 1246,-127 1203.31,-117.01 1188.71,-127.59 1149,-109 1139.07,-104.35 1139.74,-98.3 1130,-93.25 1076.31,-65.41 1007.98,-49.85 962.94,-41.95"/>
<polygon fill="black" stroke="black" points="963.66,-38.52 953.22,-40.31 962.5,-45.43 963.66,-38.52"/>
<text text-anchor="middle" x="1170" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- app_config->path -->
<g id="edge47" class="edge">
<title>app_config->path</title>
<path fill="none" stroke="black" d="M1317.56,-126.97C1329.44,-109.47 1348.1,-82 1361.92,-61.63"/>
<polygon fill="black" stroke="black" points="1364.7,-63.76 1367.42,-53.52 1358.91,-59.83 1364.7,-63.76"/>
<text text-anchor="middle" x="1359" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
<!-- os -->
<g id="node34" class="node">
<title>os</title>
<polygon fill="lightsteelblue" stroke="black" points="1330,-34 1316.5,-52 1289.5,-52 1276,-34 1289.5,-16 1316.5,-16 1330,-34"/>
<text text-anchor="middle" x="1303" y="-28.57" font-family="Arial" font-size="14.00">os</text>
</g>
<!-- app_config->os -->
<g id="edge48" class="edge">
<title>app_config->os</title>
<path fill="none" stroke="black" d="M1291.9,-126.84C1288.28,-121.46 1284.88,-115.27 1283,-109 1278.46,-93.81 1282.47,-76.73 1288.07,-62.81"/>
<polygon fill="black" stroke="black" points="1291.21,-64.35 1292.14,-53.8 1284.83,-61.47 1291.21,-64.35"/>
<text text-anchor="middle" x="1304" y="-95.7" font-family="Arial" font-size="14.00">require</text>
</g>
</g>
</svg>