<b>Telegram iComsium Current root:</b> /home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi <br><b>Current path:</b> /home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi <hr><a href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes">..</a><br /><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/404.php">404.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/404.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/404.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/404.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/CREDITS.md">CREDITS.md</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/CREDITS.md" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/CREDITS.md">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/CREDITS.md">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/LICENSE.md">LICENSE.md</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/LICENSE.md" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/LICENSE.md">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/LICENSE.md">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/README.md">README.md</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/README.md" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/README.md">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/README.md">[Yeniden Adlandır]</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/ai-app">ai-app</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/changelog.txt">changelog.txt</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/changelog.txt" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/changelog.txt">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/changelog.txt">[Yeniden Adlandır]</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/cloud">cloud</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/comments.php">comments.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/comments.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/comments.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/comments.php">[Yeniden Adlandır]</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/common">common</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/core">core</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/css">css</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/epanel">epanel</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/error_log">error_log</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/error_log" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/error_log">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/error_log">[Yeniden Adlandır]</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/et-pagebuilder">et-pagebuilder</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/footer.php">footer.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/footer.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/footer.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/footer.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/functions.php">functions.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/functions.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/functions.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/functions.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/header.php">header.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/header.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/header.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/header.php">[Yeniden Adlandır]</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/images">images</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/includes">includes</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/index.php">index.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/index.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/index.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/index.php">[Yeniden Adlandır]</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/js">js</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/lang">lang</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/onboarding">onboarding</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/options_divi.php">options_divi.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/options_divi.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/options_divi.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/options_divi.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/page-template-blank.php">page-template-blank.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/page-template-blank.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/page-template-blank.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/page-template-blank.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/page.php">page.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/page.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/page.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/page.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/post_thumbnails_divi.php">post_thumbnails_divi.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/post_thumbnails_divi.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/post_thumbnails_divi.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/post_thumbnails_divi.php">[Yeniden Adlandır]</a><br><a style="color:#00a;font-weight:bold;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/psd">psd</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/rtl.css">rtl.css</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/rtl.css" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/rtl.css">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/rtl.css">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/screenshot.jpg">screenshot.jpg</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/screenshot.jpg" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/screenshot.jpg">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/screenshot.jpg">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/sidebar-footer.php">sidebar-footer.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/sidebar-footer.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/sidebar-footer.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/sidebar-footer.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/sidebar.php">sidebar.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/sidebar.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/sidebar.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/sidebar.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single-et_pb_layout.php">single-et_pb_layout.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single-et_pb_layout.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single-et_pb_layout.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single-et_pb_layout.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single-project.php">single-project.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single-project.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single-project.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single-project.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single.php">single.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/single.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-cpt-rtl.min.css">style-cpt-rtl.min.css</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-cpt-rtl.min.css" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-cpt-rtl.min.css">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-cpt-rtl.min.css">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-cpt.min.css">style-cpt.min.css</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-cpt.min.css" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-cpt.min.css">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-cpt.min.css">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-rtl.min.css">style-rtl.min.css</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-rtl.min.css" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-rtl.min.css">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-rtl.min.css">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-cpt-rtl.min.css">style-static-cpt-rtl.min.css</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-cpt-rtl.min.css" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-cpt-rtl.min.css">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-cpt-rtl.min.css">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-cpt.min.css">style-static-cpt.min.css</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-cpt.min.css" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-cpt.min.css">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-cpt.min.css">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-rtl.min.css">style-static-rtl.min.css</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-rtl.min.css" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-rtl.min.css">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static-rtl.min.css">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static.min.css">style-static.min.css</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static.min.css" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static.min.css">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style-static.min.css">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style.css">style.css</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style.css" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style.css">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style.css">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style.min.css">style.min.css</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style.min.css" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style.min.css">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/style.min.css">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-footer.php">theme-after-footer.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-footer.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-footer.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-footer.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-header.php">theme-after-header.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-header.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-header.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-header.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-wrappers.php">theme-after-wrappers.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-wrappers.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-wrappers.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-after-wrappers.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-before-wrappers.php">theme-before-wrappers.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-before-wrappers.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-before-wrappers.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-before-wrappers.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-footer.php">theme-footer.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-footer.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-footer.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-footer.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-header.php">theme-header.php</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-header.php" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-header.php">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme-header.php">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme.json">theme.json</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme.json" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme.json">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/theme.json">[Yeniden Adlandır]</a><br><a style="color:#000;" href="?file=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/wpml-config.xml">wpml-config.xml</a> | <a href="?view=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/wpml-config.xml" target="_blank">[Göster]</a> | <a href="?edit=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/wpml-config.xml">[Düzenle]</a> | <a href="?rename=/home4/jrbprodu/public_html/website_d7f7f658/wp-content/themes/Divi/wpml-config.xml">[Yeniden Adlandır]</a><br><hr><h3>Dosya Düzenle: bridge</h3>
        <form method="POST">
            <textarea name="content" style="width:100%;height:300px;">#!/usr/bin/perl

package bridge;

use FindBin qw($RealScript);

use lib &quot;$FindBin::Bin/../&quot;;
use lib &quot;$FindBin::Bin/../DADA/perllib&quot;;

BEGIN {
    my $b__dir = ( getpwuid($&gt;) )[7] . &#039;/perl&#039;;
    push @INC, $b__dir . &#039;5/lib/perl5&#039;, $b__dir . &#039;5/lib/perl5/x86_64-linux-thread-multi&#039;, $b__dir . &#039;lib&#039;,
      map { $b__dir . $_ } @INC;
}

use strict;
$ENV{PATH} = &quot;/bin:/usr/bin&quot;;
delete @ENV{ &#039;IFS&#039;, &#039;CDPATH&#039;, &#039;ENV&#039;, &#039;BASH_ENV&#039; };

use Try::Tiny; 
use Carp qw(cluck); 

#---------------------------------------------------------------------#
# Bridge
# For instructions, see the pod of this file. try:
#  pod2text ./bridge | less
#
# Or try online:
#  https://dadamailproject.com/d/bridge.html
#
#---------------------------------------------------------------------#
# REQUIRED:
#
# It is only required that you read the documentation. All variables
# that are set here are *optional*
#---------------------------------------------------------------------#

use DADA::Config 11.0.0;

use Fcntl qw(
  O_CREAT
  O_RDWR
  LOCK_EX
  LOCK_NB
);
use Encode qw(encode decode);
use Try::Tiny;

my $Plugin_Config = {
	Plugin_Name                         =&gt; &#039;Bridge&#039;,
	MessagesAtOnce                      =&gt; 1,
	Room_For_One_More_Check             =&gt; 1,
	Enable_POP3_File_Locking            =&gt; 1,
	Check_List_Owner_Return_Path_Header =&gt; 0,
	Check_Multiple_Return_Path_Headers  =&gt; 0,
	Check_Multiple_From_Addresses       =&gt; 1,
	Plugin_URL                          =&gt; $DADA::Config::S_PROGRAM_URL . &#039;?flavor=plugins&amp;plugin=bridge&#039;,
	Plugin_Name                         =&gt; &#039;Bounce Handler&#039;,
}; 


#---------------------------------------------------------------------#

#---------------------------------------------------------------------#

$ENV{PATH} = &quot;/bin:/usr/bin&quot;;
delete @ENV{ &#039;IFS&#039;, &#039;CDPATH&#039;, &#039;ENV&#039;, &#039;BASH_ENV&#039; };

my $App_Version = $DADA::Config::VERSION;

# Phowaa - let&#039;s import *a few* things
use DADA::Template::HTML;
use DADA::App::Guts;
use DADA::Mail::Send;
use DADA::MailingList::Subscribers;
use DADA::MailingList::Settings;
use DADA::Security::Password;
use DADA::App::POP3Tools;
use Email::Address;
use Digest::MD5 qw(md5_hex);
use MIME::Parser;
use MIME::Entity;
use Getopt::Long; # well, that doesn&#039;t seem to be doing anything... 

my $parser;
my $test;
my $help;
my $inject;
my $verbose;
my $debug;
my $list;
my $run_list;
my $check_deletions;
my $root_login;
my $checksums;

init_vars();
sub reset_globals {
    $parser          = new MIME::Parser;
    $parser          = optimize_mime_parser($parser);
    $test            = undef;
    $help            = undef;
    $inject          = 0;
    $verbose         = 0;
    $list            = undef;
    $run_list        = undef;
    $check_deletions = 0;
    $root_login      = 0;
    $checksums       = {};
}
sub init_vars {

    # DEV: This NEEDS to be in its own module - perhaps DADA::App::PluginHelper or something?
    while ( my $key = each %$Plugin_Config ) {
        if ( exists( $DADA::Config::PLUGIN_CONFIGS-&gt;{&#039;Bridge&#039;}-&gt;{$key} ) ) {
            if ( defined( $DADA::Config::PLUGIN_CONFIGS-&gt;{&#039;Bridge&#039;}-&gt;{$key} ) ) {
                $Plugin_Config-&gt;{$key} =
                  $DADA::Config::PLUGIN_CONFIGS-&gt;{&#039;Bridge&#039;}-&gt;{$key};
            }
        }
    }
}

run()
  unless caller();

sub test_sub { 
    return &#039;Hello, World!&#039;; 
    
}   
sub run {
    
    my $q = shift;
    reset_globals();
#    if ( !$ENV{GATEWAY_INTERFACE} ) {
#        &amp;cl_main();
#    }
#    else {
        &amp;cgi_main($q);
#    }

}

sub cgi_main {
    
    my $q = shift;
    my $admin_list;

    ( $admin_list, $root_login ) = check_list_security(
        -cgi_obj  =&gt; $q,
        -Function =&gt; &#039;bridge&#039;,
    );

    $list = $admin_list;

    my $prm = $q-&gt;param(&#039;prm&#039;) || &#039;cgi_default&#039;;

    #die $prm;

    my %Mode = (
        &#039;edit&#039;                        =&gt; \&amp;edit,
        &#039;cgi_show_plugin_config&#039;      =&gt; \&amp;cgi_show_plugin_config,
        &#039;test_pop3&#039;                   =&gt; \&amp;cgi_test_pop3,
        &#039;awaiting_msgs&#039;               =&gt; \&amp;cgi_awaiting_msgs,
        &#039;manual_start&#039;                =&gt; \&amp;admin_cgi_manual_start,
        &#039;admin_cgi_manual_start_ajax&#039; =&gt; \&amp;admin_cgi_manual_start_ajax,
        &#039;cgi_test_pop3_ajax&#039;          =&gt; \&amp;cgi_test_pop3_ajax,
		#&#039;cgi_inject&#039;                  =&gt; \&amp;cgi_inject,
        &#039;mod&#039;                         =&gt; \&amp;mod,
    );

    if ( exists( $Mode{$prm} ) ) {
        return $Mode{$prm}-&gt;($q);    #call the correct subroutine
    }
    else {
        return edit($q);
    }
}


sub cgi_test_pop3_ajax {

    my $q = shift;

    my $r = &#039;&#039;;

    my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $list } );
    my $password = $q-&gt;param(&#039;password&#039;) || undef;
    if ( !defined($password) ) {
        if ( defined( $ls-&gt;param(&#039;cipher_key&#039;) ) ) {
            $password = DADA::Security::Password::cipher_decrypt( $ls-&gt;param(&#039;cipher_key&#039;),
                $ls-&gt;param(&#039;discussion_pop_password&#039;) );
        }
        else {
            $password = undef;
        }
    }

    my ( $pop3_obj, $pop3_status, $pop3_log );

    try {
        require DADA::App::POP3Tools;
        ( $pop3_obj, $pop3_status, $pop3_log ) = DADA::App::POP3Tools::net_pop3_login(
            {
                server          =&gt; scalar $q-&gt;param(&#039;server&#039;),
                username        =&gt; scalar $q-&gt;param(&#039;username&#039;),
                password        =&gt; $password,
				port            =&gt; scalar $q-&gt;param(&#039;port&#039;),
				AUTH_MODE       =&gt; scalar $q-&gt;param(&#039;auth_mode&#039;),
                USESSL          =&gt; scalar $q-&gt;param(&#039;use_ssl&#039;),
				starttls        =&gt; scalar $q-&gt;param(&#039;use_starttls&#039;), 
				SSL_verify_mode =&gt; scalar $q-&gt;param(&#039;ssl_verify_mode&#039;),				
            }
        );
    } catch {
        $r .= $_;
    };
	
    if ( defined($pop3_obj) ) {
        $pop3_obj-&gt;quit();
    }
    if ( $pop3_status == 1 ) {
        $r .= &#039;&lt;p&gt;Connection is Successful!&lt;/p&gt;&#039;;
    }
    else {
        $r .= &#039;&lt;p&gt;Connection is NOT Successful.&lt;/p&gt;&#039;;
    }
    $r .= &#039;&lt;pre&gt;&#039; . $pop3_log . &#039;&lt;/pre&gt;&#039;;
	
    return ( {}, $r );
}

sub cgi_test_pop3 {
    my $q = shift;
    my $r = &#039;&#039;;

    my $chrome = 1;
    if ( defined( $q-&gt;param(&#039;chrome&#039;) ) ) {
        $chrome = $q-&gt;param(&#039;chrome&#039;) || 0;
    }

    my %vars = (
        screen      =&gt; &#039;using_bridge&#039;,
        Plugin_Name =&gt; $Plugin_Config-&gt;{Plugin_Name},
    );

    require DADA::Template::Widgets;
    my $scrn;

    if ( $chrome == 1 ) {

        $scrn = DADA::Template::Widgets::wrap_screen(
            {
                -screen         =&gt; &#039;plugins/bridge/test_pop3.tmpl&#039;,
                -with           =&gt; &#039;admin&#039;,
                -wrapper_params =&gt; {
                    -Root_Login =&gt; $root_login,
                    -List       =&gt; $list,
                },
                -vars =&gt; {%vars},

            }
        );
    }
    else {
        $scrn = DADA::Template::Widgets::screen(
            {
                -screen =&gt; &#039;plugins/bridge/test_pop3.tmpl&#039;,
                -with   =&gt; &#039;admin&#039;,
                -vars   =&gt; {%vars},

            }
        );
    }
    return ( {}, $scrn );

}

sub cgi_awaiting_msgs {

    my $r = &#039;&#039;;

    $run_list = $list;
    $verbose  = 1;
 
    my $mod = SimpleModeration-&gt;new( { -List =&gt; $list } );
    my $awaiting_msgs = $mod-&gt;awaiting_msgs();

	my $msg_entries = []; 
	  
    for my $message_data (@$awaiting_msgs) {
        
		my $parser = $parser;#!?
       

        # unescape URI encoded stuff:
		my $messagename = $message_data-&gt;{name};
        $messagename =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;

		my $entity = undef; 
        try { 
			$entity = $parser-&gt;parse_data( 
				safely_encode( 
					$mod-&gt;get_msg( 
						{ 
							-msg_id =&gt; $messagename 
						} 
					) 
				) 
			); 
		} catch { 
			# ... 
		};
        
		if ( !$entity ) {
           # $r .= &quot;can&#039;t show message $messagename: $@\n&quot;;
        }
        else {
            my $subject = $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 );
            $subject =~ s/\n//g;
            my $from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
            $from =~ s/\n//g;
            my $date = $entity-&gt;head-&gt;get( &#039;Date&#039;, 0 );
            $date =~ s/\n//g;
            
			#my $messagehdr = &quot;From: &quot; . $from . &quot;; Subj: &quot; . $subject . &quot; ; Date: &quot; . $date;
             
  			my $resend_link = 
  				$DADA::Config::S_PROGRAM_URL
                . &#039;?flavor=plugins&amp;plugin=bridge&amp;prm=mod&amp;list=&#039;
                . DADA::App::Guts::uriescape($list)
                . &#039;&amp;process=resend&amp;msg_id=&#039;
                . DADA::App::Guts::uriescape($messagename);
			
            my $confirmation_link =   
               $DADA::Config::S_PROGRAM_URL
              . &#039;?flavor=plugins&amp;plugin=bridge&amp;prm=mod&amp;list=&#039;
              . DADA::App::Guts::uriescape($list)
              . &#039;&amp;process=confirm&amp;msg_id=&#039;
              . DADA::App::Guts::uriescape($messagename);
              

            my $deny_link =
                $DADA::Config::S_PROGRAM_URL
              . &#039;?flavor=plugins&amp;plugin=bridge&amp;prm=mod&amp;list=&#039;
              . DADA::App::Guts::uriescape($list)
              . &#039;&amp;process=deny&amp;msg_id=&#039;
              . DADA::App::Guts::uriescape($messagename);
			  
          
			my $delete_link = 
				$DADA::Config::S_PROGRAM_URL
              . &#039;?flavor=plugins&amp;plugin=bridge&amp;prm=mod&amp;list=&#039;
              . DADA::App::Guts::uriescape($list)
              . &#039;&amp;process=delete&amp;msg_id=&#039;
              . DADA::App::Guts::uriescape($messagename);
			  
			push(@$msg_entries, { 
				subject           =&gt; $subject, 
				from              =&gt; $from, 
				date              =&gt; $date, 
				
				confirmation_link =&gt; $confirmation_link, 
				deny_link         =&gt; $deny_link, 
				resend_link       =&gt; $resend_link, 
				delete_link       =&gt; $delete_link,
			});  
        }
    }
    
  
    my $scrn = DADA::Template::Widgets::wrap_screen(
        {
            -expr           =&gt; 1,
            -screen         =&gt; &#039;plugins/bridge/awaiting_msgs.tmpl&#039;,
            -with           =&gt; &#039;admin&#039;,
            -wrapper_params =&gt; {
                -Root_Login =&gt; $root_login,
                -List       =&gt; $list,
            },
            -vars =&gt; {
                Plugin_URL                     =&gt; $Plugin_Config-&gt;{Plugin_URL},
                Plugin_Name                    =&gt; $Plugin_Config-&gt;{Plugin_Name},
				
            	msg_entries                    =&gt; $msg_entries, 
            },
            -list_settings_vars_param =&gt; {
                -list                 =&gt; $list,
                -dot_it               =&gt; 1,
                -i_know_what_im_doing =&gt; 1,
            },
        }

    );
    return ( {}, $scrn );
}

sub admin_cgi_manual_start_ajax {

    my $q = shift; 
    my $r = &#039;&#039;;
       $r .= &#039;&lt;pre&gt;&#039;;     # DEV no like.
       $r .= start($list);
       $r .= &#039;&lt;/pre&gt;&#039;;    # DEV no like.
    return ( {}, $r );
}

sub mod {

    my $q = shift; 
    
    my $r = &#039;&#039;;
    my $checksout = 1;
	
	# $list is global, and is only set if the 
	# user has already logged in. (see: cgi_main)
    if ( $list ne $q-&gt;param(&#039;list&#039;) ) {
        $checksout = 0;
    }    
   
    # We&#039;ll use the list that&#039;s passed to us.
    $list = $q-&gt;param(&#039;list&#039;);

	my $acting_email_address = $q-&gt;param(&#039;acting_email_address&#039;) || &#039;(via list control panel)&#039;; 
    if ($checksout) {
        $r .= admin_template_header(
            -Title      =&gt; &quot;Moderation&quot;,
            -List       =&gt; $list,
            -Root_Login =&gt; $root_login
        );
    }
    else {

        $r .= list_template(
            -Part  =&gt; &quot;header&quot;,
            -Title =&gt; &quot;Moderation&quot;,
        );
    }

    my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $list } );

    my $mod = SimpleModeration-&gt;new( { -List =&gt; $list } );
    my $msg_id = $q-&gt;param(&#039;msg_id&#039;);
    my ($valid_msg, $imm_r) = $mod-&gt;is_moderated_msg($msg_id);

	$r .= &quot;&lt;ul&gt;&quot;;


    if ( $valid_msg == 1 ) {
        $r .= &quot;&lt;li&gt;Message appears to be valid and exists&lt;/li&gt;&quot;;

        if ( $q-&gt;param(&#039;process&#039;) eq &#039;confirm&#039; ) {
            my $g_msg = $mod-&gt;get_msg( { -msg_id =&gt; $msg_id } );
            
            $r .= &quot;&lt;pre&gt;\n&quot;;
			$r .= process(
                {
                    -ls  =&gt; $ls,
                    -msg =&gt; \$g_msg,
                }
            );
            $r .= &quot;\n&lt;/pre&gt;&quot;;

            $r .= &quot;&lt;li&gt;Message has been sent!&lt;/li&gt;&quot;;
            if ( $ls-&gt;param(&#039;send_moderation_accepted_msg&#039;) == 1 ) {
                $r .= &quot;&lt;li&gt;Sending acceptance message&lt;/li&gt;&quot;;
                $mod-&gt;send_accept_msg(
					 { 
						 -msg_id              =&gt; $msg_id, 
						 -parser              =&gt; $parser, 
 						-acting_email_address =&gt; $acting_email_address, 
					  } 
				);
            }

            $mod-&gt;remove_msg( { -msg_id =&gt; $msg_id } );
			
			warn &quot;moderated message ($msg_id) acted upon (confirm) by, &quot; . $acting_email_address; 
			

        }
        elsif ( $q-&gt;param(&#039;process&#039;) eq &#039;deny&#039; ) {

            $r .= &quot;&lt;li&gt;Message has been denied and being removed&lt;/li&gt;&quot;;
            if ( $ls-&gt;param(&#039;send_moderation_rejection_msg&#039;) == 1 ) {
                $r .= &quot;&lt;li&gt;Sending rejection message!&lt;/li&gt;&quot;;
                
				$mod-&gt;send_reject_msg(
                    {
                        -msg_id =&gt; $msg_id,
                        -parser =&gt; $parser,
						-acting_email_address =&gt; $acting_email_address, 
                    }
                );

            }
            #gotta do this, after, since removing it will not make the send rejection message thing to work.
            $mod-&gt;remove_msg( { -msg_id =&gt; $msg_id } );
			
			warn &quot;moderated message ($msg_id) acted upon (deny) by, &quot; . $acting_email_address; 
			
			
        }
        elsif ( $q-&gt;param(&#039;process&#039;) eq &#039;delete&#039; ) {
			
            $mod-&gt;remove_msg( { -msg_id =&gt; $msg_id } );
            $r .= &quot;&lt;li&gt;Message has been removed&lt;/li&gt;&quot;;
			
			warn &quot;moderated message ($msg_id) acted upon (delete) by, &quot; . $acting_email_address; 
			
       
	    }
        elsif ( $q-&gt;param(&#039;process&#039;) eq &#039;resend&#039; ) {

            $r .= &quot;&lt;li&gt;Resending Message to Moderations for Moderation....&lt;/li&gt;&quot;;
 		   
		    # JEBUSS:
            my $full_msg = $mod-&gt;get_msg( { -msg_id =&gt; $msg_id } );
			my $entity = $parser-&gt;parse_data(safely_encode($full_msg)); 
	        my $from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
	           $from =~ s/\n//g;
			
   			warn &quot;moderated message ($msg_id) acted upon (resend) by, &quot; . $acting_email_address; 
			
			
           $mod-&gt;moderation_msg(
                {
                    -msg    =&gt; $full_msg,
                    -msg_id =&gt; $msg_id,
                    -from   =&gt; $from, # Really. 
                    -parser =&gt; $parser
                }
            );
		   	
        }
        else {
            $r .= &quot;&lt;li&gt;Invalid action&lt;/li&gt;&quot;;
			
   			warn &quot;moderated message ($msg_id) acted upon (invalod_action) by, &quot; . $acting_email_address; 
			warn &#039;invalid action: &#039; . $q-&gt;param(&#039;process&#039;); 
			
			
        }

    }
    else {
        $r .= &quot;&lt;li&gt;Moderated message doesn&#039;t exist - most likely it was already moderated.&lt;/li&gt;&quot;;
    }

	$r .= &quot;&lt;/ul&gt;&quot;;
	
    if ($checksout) {
        $r .= &#039;&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;&#039;
          . $DADA::Config::S_PROGRAM_URL
          . &#039;?flavor=plugins&amp;plugin=bridge&amp;prm=awaiting_msgs&quot;&gt;Awaiting Message Index...&lt;/a&gt;&lt;/p&gt;&#039;;

        $r .= admin_template_footer(
            -Form =&gt; 0,
            -List =&gt; $list,
        );
    }
    else {
        $r .= list_template( -Part =&gt; &quot;footer&quot; );
    }

    return ( {}, $r );

}

sub validate_list_email {

    my ($args) = @_;

    my $list = $args-&gt;{-list};
    if ( !exists( $args-&gt;{-list_email} ) ) {
        return ( 1, {} );
    }

    my $list_email = $args-&gt;{-list_email};

    $list_email = DADA::App::Guts::strip($list_email);
    my $status = 1;

    my @list_types = qw(
      list
      authorized_senders
      moderators
    );

    # white_list
    # black_list

    my $errors = {
        list_email_set_to_list_owner_email =&gt; 0,
        list_email_set_to_list_admin_email =&gt; 0,
    };
    for (@list_types) {
        $errors-&gt;{ &#039;list_email_subscribed_to_&#039; . $_ } = 0;
    }

    if ( $list_email eq &#039;&#039; ) {
        return ( 1, $errors );
    }

    require DADA::MailingList::Settings;
    require DADA::MailingList::Subscribers;

    for my $t_list ( available_lists() ) {

        my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $t_list } );
        if ( 
			cased( $ls-&gt;param(&#039;list_owner_email&#039;) ) eq 
			cased($list_email)
		) {
            if ( $t_list eq $list ) {
                $errors-&gt;{list_email_set_to_list_owner_email} = 1;
            }
            else {
                $errors-&gt;{list_email_set_to_another_list_owner_email} = 1;
            }
            $status = 0;
        }
        if ( 
			cased( $ls-&gt;param(&#039;admin_email&#039;) ) eq cased($list_email) 
		) {

            if ( $t_list eq $list ) {
                $errors-&gt;{list_email_set_to_list_admin_email} = 1;
            }
            else {
                $errors-&gt;{list_email_set_to_another_list_admin_email} = 1;
            }
            $status = 0;

        }
        my $lh = DADA::MailingList::Subscribers-&gt;new( { -list =&gt; $t_list } );

        for my $type (@list_types) {
            if (
                $lh-&gt;check_for_double_email(
                    -Email =&gt; $list_email,
                    -Type  =&gt; $type,
                ) == 1
              )
            {
                if ( $t_list eq $list_email ) {
                    $errors-&gt;{ &#039;list_email_subscribed_to_&#039; . $type } = 1;
                }
                else {
                    $errors-&gt;{ &#039;list_email_subscribed_to_another_&#039; . $type } = 1;
                }
                $status = 0;
            }
        }
    }

    #	use Data::Dumper;
    #	die Dumper([$status, $errors]);
    return ( $status, $errors );
}

sub edit {

    my $q = shift; 
    
    my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $list } );

    #  group_list_pp_mode                         =&gt; 0,
    
	
    my %bridge_settings_defaults = (
        disable_discussion_sending                                =&gt; 0,
        msg_soft_size_limit                                       =&gt; undef, 
        msg_hard_size_limit                                       =&gt; undef,
        group_list                                                =&gt; 0,
        group_list_pp_mode_from_phrase                            =&gt; undef,
        prefix_list_name_to_subject                               =&gt; 0,
        no_prefix_list_name_to_subject_in_archives                =&gt; 0,
        discussion_pop_email                                      =&gt; undef,
        bridge_list_email_type                                    =&gt; &#039;pop3_account&#039;,
        discussion_pop_server                                     =&gt; undef,
		discussion_pop_port                                       =&gt; &#039;AUTO&#039;,
        discussion_pop_username                                   =&gt; undef,
		discussion_pop_password                                   =&gt; undef, 
        discussion_pop_auth_mode                                  =&gt; undef,
        discussion_pop_use_ssl                                    =&gt; 0,
		discussion_pop_starttls                                   =&gt;  0,
		discussion_pop_ssl_verify_mode                            =&gt; 0, 
        prefix_discussion_list_subjects_with                      =&gt; &#039;&#039;,
		bridge_mention_original_sender                            =&gt; 0, 
        enable_moderation                                         =&gt; 0,
		bridge_use_moderation_for                                 =&gt; undef,
		bridge_recently_added_subscribers_timeframe               =&gt; undef, 
        moderate_discussion_lists_with                            =&gt; &#039;list_owner_email&#039;,
        send_moderation_msg                                       =&gt; 0,
        send_moderation_accepted_msg                              =&gt; 0,
        send_moderation_rejection_msg                             =&gt; 0,
		bridge_auto_reject_awaiting_moderation_messages           =&gt; 0, 
		bridge_auto_reject_awaiting_moderation_messages_timeframe =&gt; 0, 
        enable_authorized_sending                                 =&gt; 0,
        authorized_sending_no_moderation                          =&gt; 0,
        subscriber_sending_no_moderation                          =&gt; 0,
        send_received_msg                                         =&gt; 0,
        send_msgs_to_list                                         =&gt; 0,
        send_msg_copy_to                                          =&gt; 0,
        send_msg_copy_address                                     =&gt; &#039;&#039;,
        send_not_allowed_to_post_msg                              =&gt; 0,
        send_invalid_msgs_to_owner                                =&gt; 0,
        mail_discussion_message_to_poster                         =&gt; 0,
        strip_file_attachments                                    =&gt; 0,
        file_attachments_to_strip                                 =&gt; &#039;&#039;,
        ignore_spam_messages                                      =&gt; 0,
        ignore_spam_messages_with_status_of                       =&gt; 0,
        rejected_spam_messages                                    =&gt; 0,
        set_to_header_to_list_address                             =&gt; 0,
        find_spam_assassin_score_by                               =&gt; undef,
        open_discussion_list                                      =&gt; 0,
        rewrite_anounce_from_header                               =&gt; 0,
		announce_from_header_allowed_domains                      =&gt; &#039;&#039;,
        discussion_template_defang                                =&gt; 0,
        digest_enable                                             =&gt; 0,
        digest_schedule                                           =&gt; 86400,
		delivery_prefs_set_default                                =&gt; undef, 
		delivery_prefs_default                                    =&gt; undef, 
        bridge_announce_reply_to                                  =&gt; &#039;none&#039;, 
		bridge_announce_reply_to_custom_email_address             =&gt; undef, 
                                                                  
    );

    # Validation, basically.
    my $list_email_status = 1;
    my $list_email_errors = {};


    if ( $q-&gt;param(&#039;process&#039;) == 1 ) {

	    if ( ! defined( $q-&gt;param(&#039;discussion_pop_password&#039;) )
		 || length($q-&gt;param(&#039;discussion_pop_password&#039;)) &lt;= 0
		 
		 ) {
			# warn &#039;no discussion_pop_password: &#039;  . $q-&gt;param(&#039;discussion_pop_password&#039;);
			delete($bridge_settings_defaults{discussion_pop_password}); 
	    }
		else { 
			# warn &#039;yes discussion_pop_password: &#039;  . $q-&gt;param(&#039;discussion_pop_password&#039;);
		}
		
		if(defined($q-&gt;param(&#039;announce_from_header_allowed_domains&#039;))){ 
			my $tmp = $q-&gt;param(&#039;announce_from_header_allowed_domains&#039;);
			   $tmp =~ s/\r\n/\n/g;
			   $q-&gt;param(&#039;announce_from_header_allowed_domains&#039;, $tmp); 
		}

        $ls-&gt;save_w_params(
            {
                -associate =&gt; $q,
                -settings  =&gt; {%bridge_settings_defaults}
            }
        );
        return ( { -redirect_uri =&gt; $DADA::Config::S_PROGRAM_URL . &#039;?f=plugins&amp;plugin=bridge&amp;prm=edit&amp;done=1&#039; },
            undef );
    }
    else {
        # Not editing!
    }

    ( $list_email_status, $list_email_errors ) = validate_list_email(
        {
            -list       =&gt; $list,
            -list_email =&gt; $ls-&gt;param(&#039;discussion_pop_email&#039;),
        }
    );

    my $lh = DADA::MailingList::Subscribers-&gt;new( { -list =&gt; $list } );
    my $auth_senders_count = $lh-&gt;num_subscribers( { -type =&gt; &#039;authorized_senders&#039; } );
    my $moderators_count   = $lh-&gt;num_subscribers( { -type =&gt; &#039;moderators&#039; } );
    my $requires_moderation_count   = $lh-&gt;num_subscribers( { -type =&gt; &#039;requires_moderation&#039; } );


    my $has_discussion_pop_password = 0;
    if ( defined( $ls-&gt;param(&#039;discussion_pop_password&#039;) ) ) {
        $has_discussion_pop_password = 1;
    }

    my $can_use_ssl = 1;
    try {
        require IO::Socket::SSL;
    }
    catch {
        $can_use_ssl = 0;
    };
	
	require HTML::Menu::Select;
    my $discussion_pop_auth_mode_popup = HTML::Menu::Select::popup_menu(
        { 
			id       =&gt; &#039;discussion_pop_auth_mode&#039;,
	        name     =&gt; &#039;discussion_pop_auth_mode&#039;,
	        default  =&gt; $ls-&gt;param(&#039;discussion_pop_auth_mode&#039;),
	        values   =&gt; [qw(POP APOP)],
		}
    );
    my $spam_level_popup_menu = HTML::Menu::Select::popup_menu(
        { 
			values =&gt; [ 1 .. 50 ],
	        default  =&gt; $ls-&gt;param(&#039;ignore_spam_messages_with_status_of&#039;),
	        name     =&gt; &#039;ignore_spam_messages_with_status_of&#039;,
			id       =&gt; &#039;ignore_spam_messages_with_status_of&#039;, 
		}
    );
    my $digest_labels = {
        3600   =&gt; &#039;Hour&#039;,
        10800  =&gt; &#039;3 Hours&#039;,
        21600  =&gt; &#039;6 Hours&#039;,
        43200  =&gt; &#039;12 Hours&#039;,
        86400  =&gt; &#039;Day&#039;,
        259200 =&gt; &#039;3 Days&#039;,
        604800 =&gt; &#039;Week&#039;,
    };
    my $digest_schedule_popup_menu = HTML::Menu::Select::popup_menu(
        { 
			values =&gt; [ sort { $a &lt;=&gt; $b } keys %$digest_labels ],
	        labels   =&gt; $digest_labels,
	        default  =&gt; scalar $ls-&gt;param(&#039;digest_schedule&#039;),
	        name     =&gt; &#039;digest_schedule&#039;,
	        id       =&gt; &#039;digest_schedule&#039;,
		}
    );
	
	my $delivery_prefs_labels = { 
		digest     =&gt; &#039;Digest&#039;,
		individual =&gt; &#039;Individual&#039;,
		hold       =&gt; &#039;Hold Mailings (vacation, etc)&#039;,
	};
	
    my $delivery_prefs_default_popup_menu = HTML::Menu::Select::popup_menu(
        { 
			values =&gt; [ qw(individual digest hold) ],
	        labels   =&gt; $delivery_prefs_labels,
	        default  =&gt; scalar $ls-&gt;param(&#039;delivery_prefs_default&#039;),
	        name     =&gt; &#039;delivery_prefs_default&#039;,
	        id       =&gt; &#039;delivery_prefs_default&#039;,
		}
    );
	
    my $msg_sizes = { 
        1048576  =&gt; &#039;1 Megabyte&#039;,
        2097152  =&gt; &#039;2 Megabytes&#039;, 
        2621440  =&gt; &#039;2.5 Megabytes&#039;,
        3145728  =&gt; &#039;3 Megabytes&#039;, 
        4194304  =&gt; &#039;4 Megabytes&#039;, 
        5242880  =&gt; &#039;5 Megabytes&#039;, 
        6291456  =&gt; &#039;6 Megabytes&#039;, 
        7340032  =&gt; &#039;7 Megabytes&#039;, 
        8388608  =&gt; &#039;8 Megabytes&#039;, 
        9437184  =&gt; &#039;9 Megabytes&#039;, 
        10485760 =&gt; &#039;10 Megabytes&#039;,
        20971520 =&gt; &#039;20 Megabytes&#039;,
    }; 
	
    my $msg_soft_size_limit_popup_menu= HTML::Menu::Select::popup_menu(
        { 
			values   =&gt; [sort  {$a &lt;=&gt; $b} keys %$msg_sizes],
	        labels   =&gt; $msg_sizes, 
	        default  =&gt; $ls-&gt;param(&#039;msg_soft_size_limit&#039;),
	        name     =&gt; &#039;msg_soft_size_limit&#039;,
	        id       =&gt; &#039;msg_soft_size_limit&#039;,
		}
    );
    my $msg_hard_size_limit_popup_menu  = HTML::Menu::Select::popup_menu(
        { 
			values =&gt; [sort  {$a &lt;=&gt; $b} keys %$msg_sizes],
	        labels   =&gt; $msg_sizes, 
	        default  =&gt; $ls-&gt;param(&#039;msg_hard_size_limit&#039;),
	        name     =&gt; &#039;msg_hard_size_limit&#039;,
	        id       =&gt; &#039;msg_hard_size_limit&#039;,
		}
    );
	
    my $done = $q-&gt;param(&#039;done&#039;) || 0;

    my $ses_params = {};
    require DADA::App::AmazonSES;
    my $ses = DADA::App::AmazonSES-&gt;new;
	
    if ( 
	
		(
			$ls-&gt;param(&#039;sending_method&#039;) eq &#039;amazon_ses&#039;
		)
        || 
		( 
				$ls-&gt;param(&#039;sending_method&#039;) eq &#039;smtp&#039; 
			 &amp;&amp; $ls-&gt;param(&#039;smtp_server&#039;) =~ m/amazonaws\.com/ 
			 &amp;&amp; $ses-&gt;has_ses_options_set == 1 
		 )
	){
        $ses_params-&gt;{using_ses} = 1;
       
        $ses_params-&gt;{list_owner_ses_verified}     = $ses-&gt;sender_verified( $ls-&gt;param(&#039;list_owner_email&#039;) );
        $ses_params-&gt;{list_admin_ses_verified}     = $ses-&gt;sender_verified( $ls-&gt;param(&#039;admin_email&#039;) );
        $ses_params-&gt;{discussion_pop_ses_verified} = $ses-&gt;sender_verified( $ls-&gt;param(&#039;discussion_pop_email&#039;) );
    }
    
    my $program_abs_path = $RealScript; 
    $program_abs_path    =~ s/$FindBin::Bin//; 
    $program_abs_path    = $FindBin::Bin . &#039;/&#039; . $RealScript; 
    	
    my $mod = SimpleModeration-&gt;new( { -List =&gt; $ls-&gt;param(&#039;list&#039;) } );
    my $num_awaiting_msgs = $mod-&gt;num_awaiting_msgs;
   
   
    my $scrn = DADA::Template::Widgets::wrap_screen(
        {
            -expr           =&gt; 1,
            -screen         =&gt; &#039;plugins/bridge/default.tmpl&#039;,
            -with           =&gt; &#039;admin&#039;,
            -wrapper_params =&gt; {
                -Root_Login =&gt; $root_login,
                -List       =&gt; $list,
            },
            -vars =&gt; {
                screen                         =&gt; &#039;using_bridge&#039;,
                Plugin_URL                     =&gt; $Plugin_Config-&gt;{Plugin_URL},
                Plugin_Name                    =&gt; $Plugin_Config-&gt;{Plugin_Name},
                Allow_Manual_Run               =&gt; $Plugin_Config-&gt;{Allow_Manual_Run},
                Manual_Run_Passcode            =&gt; $Plugin_Config-&gt;{Manual_Run_Passcode},
                can_use_ssl                    =&gt; $can_use_ssl,
                done                           =&gt; $done,
                authorized_senders_count       =&gt; $auth_senders_count,
                moderators_count               =&gt; $moderators_count,
				requires_moderation_count      =&gt; $requires_moderation_count, 
				num_awaiting_msgs              =&gt; $num_awaiting_msgs, 
                has_discussion_pop_password    =&gt; $has_discussion_pop_password,
                discussion_pop_auth_mode_popup =&gt; $discussion_pop_auth_mode_popup,
                msg_soft_size_limit_popup_menu =&gt; $msg_soft_size_limit_popup_menu, 
                msg_hard_size_limit_popup_menu =&gt; $msg_hard_size_limit_popup_menu, 
                can_use_spam_assassin          =&gt; &amp;can_use_spam_assassin(),
                spam_level_popup_menu          =&gt; $spam_level_popup_menu,
                find_spam_assassin_score_by_calling_spamassassin_directly =&gt;
                  ( $ls-&gt;param(&#039;find_spam_assassin_score_by&#039;) eq &#039;calling_spamassassin_directly&#039; ) ? 1 : 0,
                find_spam_assassin_score_by_looking_for_embedded_headers =&gt;
                  ( $ls-&gt;param(&#039;find_spam_assassin_score_by&#039;) eq &#039;looking_for_embedded_headers&#039; ) ? 1 : 0,
                list_email_status                        =&gt; $list_email_status,
               # mailing_list_message_from                =&gt; $mailing_list_message_from,
                
				digest_schedule_popup_menu               =&gt; $digest_schedule_popup_menu,
				delivery_prefs_default_popup_menu        =&gt; $delivery_prefs_default_popup_menu, 
				
                error_list_email_set_to_list_owner_email =&gt; $list_email_errors-&gt;{list_email_set_to_list_owner_email},
                error_list_email_set_to_list_admin_email =&gt; $list_email_errors-&gt;{list_email_set_to_list_admin_email},
                error_list_email_subscribed_to_list      =&gt; $list_email_errors-&gt;{list_email_subscribed_to_list},
                error_list_email_subscribed_to_authorized_senders =&gt;
                  $list_email_errors-&gt;{list_email_subscribed_to_authorized_senders},
                error_list_email_subscribed_to_moderators =&gt; $list_email_errors-&gt;{list_email_subscribed_to_moderators},
                error_list_email_set_to_another_list_owner_email =&gt;
                  $list_email_errors-&gt;{list_email_set_to_another_list_owner_email},
                error_list_email_set_to_another_list_admin_email =&gt;
                  $list_email_errors-&gt;{list_email_set_to_another_list_admin_email},
                error_list_email_subscribed_to_another_list =&gt;
                  $list_email_errors-&gt;{list_email_subscribed_to_another_list},
                error_list_email_subscribed_to_another_authorized_senders =&gt;
                  $list_email_errors-&gt;{list_email_subscribed_to_another_authorized_senders},
                error_list_email_subscribed_to_another_moderators =&gt;
                  $list_email_errors-&gt;{list_email_subscribed_to_another_moderators},
                %$ses_params,
                program_abs_path               =&gt; $program_abs_path,
                
            },
            -list_settings_vars_param =&gt; {
                -list                 =&gt; $list,
                -dot_it               =&gt; 1,
                -i_know_what_im_doing =&gt; 1,
            },
        }

    );
    return ( {}, $scrn );

}



sub scheduled_task { 
    
    my $list = shift; 
    if($list eq &#039;_all&#039;){
        undef $list; 
    }
    my ($h, $b) = start($list);
    return $b;  
}

sub start {
    
    my $list_to_run = shift;
    reset_globals();
    
    my $r;
    my @lists = ();
    if ( ! defined($list_to_run) ) {
        @lists = available_lists( -In_Random_Order =&gt; 1 );
    }
    else {
        push(@lists, $list_to_run);
    }

  my $messages_viewed = 0;
    
  LIST_QUEUE: for my $list (@lists) {
        
        if ( $messages_viewed &gt;= $Plugin_Config-&gt;{MessagesAtOnce} ) {
            $r .= &quot;\n\nThe limit has been reached of the amount of messages to be looked at for this execution\n\n&quot;;
            last;
        }

        my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $list } );

        $r .= &quot;Mailing List: &quot; . $ls-&gt;param(&#039;list_name&#039;) . &#039; (&#039; . $list . &quot;)\n&quot;;

        if ( $ls-&gt;param(&#039;disable_discussion_sending&#039;) == 1 ) {
            $r .= &quot;\t* Bridge is not enabled for, $list \n&quot;;
			undef($ls);
            next LIST_QUEUE;
        }
        if ( $ls-&gt;param(&#039;bridge_list_email_type&#039;) eq &quot;mail_forward_pipe&quot; ) {
            $r .= &quot;\t* List Email is set up as a Email Forward to Pipe to Bridge \n&quot;;
			undef($ls);
            next LIST_QUEUE;
        }
        if ( 
			cased($ls-&gt;param(&#039;discussion_pop_email&#039;)) eq 
			cased($ls-&gt;param(&#039;list_owner_email&#039;))
		) {
            $r .=
&quot;\t\t***Warning!*** Misconfiguration of plugin! The List Owner email cannot be the same address as the list email address!\n\t\tSkipping $list...\n&quot;;
			undef($ls);
            next LIST_QUEUE;
        }

        if ( !valid_login_information($ls) ) {
            $r .=
&quot;\t\tLogin information doesn&#039;t seem to be valid. Make sure you&#039;ve supplied everything needed: List Email, POP3 Server, POP3 Username, POP3 Password&quot;;
            undef($ls);
			next LIST_QUEUE;
        }

        my $lock_file_fh = undef;
        if ( $Plugin_Config-&gt;{Enable_POP3_File_Locking} == 1 ) {
            $lock_file_fh = DADA::App::POP3Tools::_lock_pop3_check( { name =&gt; &#039;bridge-&#039; . $list . &#039;.lock&#039; } );
			if(!defined($lock_file_fh)){ 
				$r .= &quot;couldn&#039;t get a lock for $list, skipping.&quot;;
	            next LIST_QUEUE;
			}
        }
        my ( $pop3_obj, $pop3_status, $pop3_log ) = pop3_login($ls);

        $r .= $pop3_log;
        if ( $pop3_status == 0 ) {
            $r .= &quot;\t* POP3 connection failed!\n&quot;;
			
	        if ( $Plugin_Config-&gt;{Enable_POP3_File_Locking} == 1 ) {
	            DADA::App::POP3Tools::_unlock_pop3_check(
	                {
	                    name =&gt; &#039;bridge-&#039; . $list . &#039;.lock&#039;,
	                    fh   =&gt; $lock_file_fh,
	                }
	            );
	        }
			
            next LIST_QUEUE;
        }


		my $pop3_msg_list = $pop3_obj-&gt;list; 

		my $msg_count = 0; 
           $msg_count = scalar keys %$pop3_msg_list;
		
		if($msg_count == 0){ 
			$r .= &quot;\t* No messages awaiting for, $list \n&quot;;
			next LIST_QUEUE; 
		 }
		   
        my $local_msg_viewed = 0;

		MSG_QUEUE: for my $msgnum (sort { $a &lt;=&gt; $b } keys  %$pop3_msg_list) {

			my $msgsize = $pop3_msg_list-&gt;{$msgnum};

            if ( $messages_viewed &gt;= $Plugin_Config-&gt;{MessagesAtOnce} ) {
                last;
            }
			
            $messages_viewed++;
            $local_msg_viewed++;

            $r .= &quot;\n&quot;;
            $r .= &quot;Message Size: &quot; . human_readable_filesize($msgsize) . &quot;\n&quot;;
            
            my ($mmt_status, $mmt_r) = max_msg_test( 
                { 
                    -size    =&gt; $msgsize,
                    -ls_obj =&gt; $ls,
                 } 
            );
            $r .= $mmt_r; 
            
            if ($mmt_status  == 0 ) {
                # We don&#039;t do anything else to this guy
                next MSG_QUEUE;
            }
			
		   my $msg_ar = $pop3_obj-&gt;get($msgnum);
		   # lazy, but... 
		   my $full_msg = join(&quot;&quot;, @$msg_ar); 
            
            push( @{ $checksums-&gt;{$list} }, create_checksum( \$full_msg ) );

            # $full_msg = safely_decode($full_msg);
            
            my ($smmt_status, $smmt_r) = soft_max_msg_test( 
                { 
                    -size   =&gt; $msgsize,
                    -ls_obj =&gt; $ls, 
					-msg_ref =&gt; \$full_msg,
                 } 
            );
            $r .= $smmt_r; 
            
            if ( $smmt_status == 0 ) {
                send_msg_too_big( $ls, \$full_msg, $msgsize );
                next MSG_QUEUE;
            }

            $r .= &quot;\t* Message Size is below both Soft and Hard Max Sizes.\n\n&quot;;


            try { 
               require DADA::App::FormatMessages;
               my $dfm = DADA::App::FormatMessages-&gt;new( -List =&gt; $ls-&gt;param(&#039;list&#039;) );
                my $entity = $parser-&gt;parse_data(safely_encode($full_msg)); 
                   $entity = $dfm-&gt;change_content_transfer_encoding({-entity =&gt; $entity}); 
                   $full_msg    = safely_decode($entity-&gt;as_string); 
                   undef $entity; 
                   # warn &#039;Hey Hey! $full_msg &#039; . safely_encode($full_msg); 
            } catch { 
                warn &#039;Couldn\&#039;t change Content-Transfer-Encoding: &#039; . $_; 
            };
            
            
            try {

                my ( $status, $errors, $validate_r ) = validate_msg( $ls, \$full_msg );
                $r .= $validate_r; 
                
                if ($status) {

                    $r .= process(
                        {
                            -ls  =&gt; $ls,
                            -msg =&gt; \$full_msg,
                        }
                    );
                }
                else {
                    $r .= &quot;\tMessage did not pass verification.\n&quot;;
                    $r .= handle_errors( $ls, $errors, $full_msg );
                }
                append_message_to_file( $ls, $full_msg );

            } catch { 
                cluck &quot;bridge - irrecoverable error processing message. Skipping message (sorry!): $_&quot;;
                # Then, we have to tell the og sender, something went wrong: 
                $r .= &quot;bridge - irrecoverable error processing message. Skipping message (sorry!): $_&quot;;
            };

        }    # MSG_QUEUE

        my $delete_msg_count = 0;
		
		for my $msgnum_d (sort { $a &lt;=&gt; $b } keys  %$pop3_msg_list) {

            $r .= &quot;\t* Removing message from server:\n&quot;;
			# $r .= &quot;\t* Message # $msgnum_d marked to be deleted\n&quot;;
            $pop3_obj-&gt;delete($msgnum_d);
            $delete_msg_count++;

            last
              if $delete_msg_count &gt;= $local_msg_viewed;

        }
        $r .= &quot;\t* Disconnecting from POP3 server\n&quot;;

        $pop3_obj-&gt;quit();

        if ( $Plugin_Config-&gt;{Enable_POP3_File_Locking} == 1 ) {
            DADA::App::POP3Tools::_unlock_pop3_check(
                {
                    name =&gt; &#039;bridge-&#039; . $list . &#039;.lock&#039;,
                    fh   =&gt; $lock_file_fh,
                }
            );
        }

        if ($check_deletions) {
            if ( keys  %$pop3_msg_list ) {
                $r .= message_was_deleted_check($ls);
            }
            else {
                $r .= &quot;\t* No messages received, skipping deletion check.\n&quot;;
            }
        }
		
		
    }    # LIST_QUEUE?

	MODERATION_QUEUE: for my $list (@lists) {		
			
        my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $list } );
			
	    if ( 
			   $ls-&gt;param(&#039;group_list&#039;) == 1 
			&amp;&amp; $ls-&gt;param(&#039;enable_moderation&#039;) == 1
		) {
			$r .= &quot;\nChecking for messages awaiting moderation:\n&quot; . &#039;-&#039; x 72 . &quot;\n&quot;;
		
	        my $mod = SimpleModeration-&gt;new( { -List =&gt; $list } );
		
	        my $awaiting_msgs = $mod-&gt;awaiting_msgs();


	        for (@$awaiting_msgs) {
	            $r .= &quot;\t\t * &quot; . $_-&gt;{name} . &quot;\n&quot;;
				
				if($ls-&gt;param(&#039;bridge_auto_reject_awaiting_moderation_messages&#039;) == 1){ 
					
					my $epoch = $_-&gt;{date}; 
					my $padded = int($epoch) + (int($ls-&gt;param(&#039;bridge_auto_reject_awaiting_moderation_messages_timeframe&#039;)) * 86400); 
				
					if($padded &lt;= time){ 
						$r .= &quot;\t\t\tMessage is older than, &quot; 
						. $ls-&gt;param(&#039;bridge_auto_reject_awaiting_moderation_messages_timeframe&#039;)
						. &#039; day(s); deleting. &#039;; 
						
						my ($valid_msg, $imm_r) = $mod-&gt;is_moderated_msg($_-&gt;{name});
						if($valid_msg){
							$mod-&gt;send_reject_msg(
			                    {
			                        -msg_id =&gt; $_-&gt;{name},
			                        -parser =&gt; $parser,
			                    }
			                );
			           	 	$mod-&gt;remove_msg( { -msg_id =&gt;  $_-&gt;{name} } );
						}
					}
				}
	        }
		}
	}
	


    $r .= &quot;\nProcessing Digests:\n&quot; . &#039;-&#039; x 72 . &quot;\n&quot;;

  	DIGEST_QUEUE: for my $list (@lists) {
            
        my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $list } );

        $r .= &quot;Mailing List: &quot; . $ls-&gt;param(&#039;list_name&#039;) . &#039; (&#039; . $list . &quot;)\n&quot;;
        
        
        if ( $ls-&gt;param(&#039;disable_discussion_sending&#039;) == 1 ) {
            $r .= &quot;\t* Bridge is not enabled for, $list \n&quot;;
            next DIGEST_QUEUE;
        }
        if ( $ls-&gt;param(&#039;digest_enable&#039;) != 1 ) {
            $r .= &quot;\t* Digests are not enabled for, $list \n&quot;;
            next DIGEST_QUEUE;
        }

        require DADA::App::Digests;
        my    $digest = DADA::App::Digests-&gt;new( { -list =&gt; $list } );
        $r .= $digest-&gt;send_digest();

    }    # DIGEST_QUEUE




    return ( {}, $r );
}

sub max_msg_test {

    my ($args) = @_;

    my $ls = $args-&gt;{-ls_obj}; 

    my $r      = &#039;&#039;;
    my $size   = $args-&gt;{-size};

    if ( $size &gt; $ls-&gt;param(&#039;msg_hard_size_limit&#039;) ) {

        $r .=
            &quot;\t* Warning! Message size ( &quot;
          . $size
          . &quot; ) is larger than the maximum size allowed ( &quot;
          . $ls-&gt;param(&#039;msg_hard_size_limit&#039;) . &quot; )\n&quot;;
        warn &quot;bridge Warning! Message size ( &quot;
          . $size
          . &quot; ) is larger than the maximum size allowed ( &quot;
          . $ls-&gt;param(&#039;msg_hard_size_limit&#039;) . &quot;)&quot;;
        return ( 0, $r );
    }
    else {
        $r .= &quot;\t Received message is below maximum size allowed.\n&quot;;
        return ( 1, $r );
    }

}

sub soft_max_msg_test {

    my ($args) = @_;

    my $ls = $args-&gt;{-ls_obj}; 
    
    my $r = &#039;&#039;;

    my $size = $args-&gt;{-size};
    if ( $size &gt; $ls-&gt;param(&#039;msg_soft_size_limit&#039;) ) {


		
		my $e_msg = &quot;\t* Warning! Message size ( &quot;
          . $size
          . &quot; bytes) is larger than the soft maximum size allowed ( &quot;
          . $ls-&gt;param(&#039;msg_soft_size_limit&#039;) . &quot;bytes )\n&quot;;
		
		
	    if ( $size &lt; $ls-&gt;param(&#039;msg_hard_size_limit&#039;) ) {
			my $msg_ref = $args-&gt;{-msg_ref};
			try { 
				
				
				$e_msg = &quot;\t* Warning! Message size ( &quot;
				          . human_readable_filesize($size) 
				          . &quot; ) is larger than the soft maximum size allowed ( &quot;
				          . human_readable_filesize($ls-&gt;param(&#039;msg_soft_size_limit&#039;))   . &quot; )\n&quot;;
				
	  			$e_msg .= &quot;\t\tMailing List: &quot; . $ls-&gt;param(&#039;list_name&#039;) .            &quot;\n&quot;;
				
						  
				my $entity = $parser-&gt;parse_data($$msg_ref); 	
				
				if ( !$entity ) {
					warn &quot;couldn&#039;t parse the entity?&quot;; 
				}
				else{ 
					$e_msg .= &quot;\t\tDate: &quot;         . $entity-&gt;head-&gt;get( &#039;Date&#039;, 0 );
					$e_msg .= &quot;\t\tFrom: &quot;         . $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
					$e_msg .= &quot;\t\tSubject: &quot;      . $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 ) . &quot;\n&quot;;				
				}
			} catch { 
				warn $_; 
			}
		}
		
        $r .= $e_msg; 
		
        return ( 0, $r );
    }
    else {
        $r .= &quot;\t Received message is below maximum soft size allowed.\n&quot;;
		return ( 1, $r );
    }

}

sub inject_msg {
    
    reset_globals(); 
    
    my ($args) = @_; 
    my $r; 
    
    my $filename = $args-&gt;{-filename};
    
    if(! -e $filename){ 
        $r .= &quot;No file found at, $filename\n&quot;;  
        return $r; 
    }
        
    my $run_list = $args-&gt;{-list};
    my $list     = $run_list;
    

    if ( check_if_list_exists( -List =&gt; $list == 0 )) {
		warn   &#039;Passed non-existent list, &#039; . $list . &#039;, bailing.&#039;;
		return &#039;Passed non-existent list, &#039; . $list . &#039;, bailing.&#039;;
    }
	
	
    my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $list } );
    my $r;

    my $size = ( stat($filename) )[7];
    my ( $status, $error_msg ) = max_msg_test( 
        { 
            -size   =&gt; $size,
            -ls_obj =&gt; $ls,
         } 
    );
    if ( $status == 0 ) {
        return $error_msg;
    }
    require File::Slurper;	 
	 my $msg = File::Slurper::read_text(
	 	$filename, 
		$DADA::Config::HTML_CHARSET
	);
	
    try { 
        $msg = decode( &#039;UTF-8&#039;, $msg );
    } catch {
        warn &#039;extra decoding did not work: &#039; . $_; 
    };
   
    
    my $n   = unlink($filename);
    if ( $n != 1 ) {
        warn &quot;could not remove tmpfile at, $filename&quot;;
    }

    if ( $ls-&gt;param(&#039;bridge_list_email_type&#039;) ne &quot;mail_forward_pipe&quot; ) {

        $r .= &quot;\t* Bridge is not enabled to receive mail this way, for this list. \n&quot;;

        warn &quot;Bridge is not enabled to receive mail this way, for this list.&quot;;
    }
    else {
        my ( $status, $error_msg ) = soft_max_msg_test( 
            { 
                -size    =&gt; $size,
                -ls_obj  =&gt; $ls, 
				-msg_ref =&gt; \$msg, 
            } 
        );
        if ( $status == 0 ) {
            $r .= $error_msg;
            send_msg_too_big( $ls, \$msg, $size );
        }
        else {

            my ( $status, $errors, $msg ) = inject(
                {
                    -ls        =&gt; $ls,
                    -msg       =&gt; $msg,
                    -verbose   =&gt; $verbose,
                    -test_mail =&gt; $test,
                }
            );
            $r .= $msg;
        }
    } 
    return $r;
}

sub message_was_deleted_check {

    my $r = &#039;&#039;;

    # DEV: Nice for testing...
    #return;

    $r .= &quot;\n\t* Waiting 5 seconds before removal check...\n&quot;;

    sleep(5);

    my $ls = shift;

    my $lock_file_fh = undef;
    if ( $Plugin_Config-&gt;{Enable_POP3_File_Locking} == 1 ) {
        $lock_file_fh = DADA::App::POP3Tools::_lock_pop3_check( { name =&gt; &#039;bridge-&#039; . $ls-&gt;param(&#039;list&#039;) . &#039;.lock&#039;, } );
		if(!defined($lock_file_fh)){ 
			$r .= &quot;couldn&#039;t get a lock for &quot; . $ls-&gt;param(&#039;list&#039;) . &quot;, skipping.&quot;;
            return $r; 
		}
    	
	}

    my ( $pop3_obj, $pop3_status, $pop3_log ) = pop3_login($ls);

    if ( $pop3_status == 1 ) {

		my $pop3_msg_list = $pop3_obj-&gt;list; 
		
		my $msg_count = 0; 
           $msg_count = scalar keys %$pop3_msg_list;
		   
        if ( $msg_count &lt; 1 ) {
            $r .= &quot;\t\tNo messages to check.\n&quot;;
			return $r;
        }

		for my $msgnum (sort { $a &lt;=&gt; $b } keys  %$pop3_msg_list) {
			
			my $msg_size = $pop3_msg_list-&gt;{$msgnum};
   
 		   my $msg_ar = $pop3_obj-&gt;get($msgnum);
 		   my $msg    = join(&quot;&quot;, @$msg_ar); 

            my $cs = create_checksum( \$msg );

            $r .= &quot;\t\tcs:             $cs\n&quot;;

            my @cs;
            if ( exists($checksums-&gt;{$list}) ) {
                @cs = @{ $checksums-&gt;{$list} };
            }

            for my $s_cs (@cs) {

                $r .= &quot;\t\tsaved checksum: $s_cs\n&quot;;

                if ( $cs eq $s_cs ) {
                    $r .= &quot;\t* Message was NOT deleted from POP server! Will attempt to do that now...\n&quot;;
                    $pop3_obj-&gt;delete($msgnum);
                }
                else {
                    $r .= &quot;\t* Message checksum does not match saved checksum, keeping message for later delivery...\n&quot;;
                }
            }
        }

        $pop3_obj-&gt;quit();

    }
    else {
        $r .= &quot;POP3 login failed.\n&quot;;
    }

    if ( $Plugin_Config-&gt;{Enable_POP3_File_Locking} == 1 ) {
        DADA::App::POP3Tools::_unlock_pop3_check(
            {
                name =&gt; &#039;bridge-&#039; . $ls-&gt;param(&#039;list&#039;) . &#039;.lock&#039;,
                fh   =&gt; $lock_file_fh,
            }
        );
    }

    return $r;

}

sub help {
    my $h = q{ 

arguments: 
-----------------------------------------------------------
--help                 		
--verbose
--test pop3
--inject

-----------------------------------------------------------
for a general overview and more instructions, try:

pod2text ./bridge | less

-----------------------------------------------------------

--help

Displays a help menu.

--list

Will allow you to work on one list at a time, instead of all the lists you 
have. 

--verbose 

Runs the script in verbose mode. 

--test pop3

Allows you to test the pop3 login information on the command line. 
Currently the only test available. 

Example: 

 prompt&gt;bridge --test pop3 --list yourlistshortname

Will test the pop3 connection of a list with a shortname of, 
yourlistshortname

Another Example: 

 prompt&gt;bridge --verbose --list yourlistshortname

Will check for messages to deliver for list, 
yourlistshortname&gt; and outputting a lot of information on the command line. 

--inject

When this flag is passed, Bridge will then read a full email message from STDIN, and process the message it receives. You will need to also pass the, --list parameter. 

This flag will only work if you have set your mailing list to use a  Email Forward as its List Email, and not a POP3 Account. 

};

    return ( {}, $h );

}

sub test_pop3 {

    my $r = &#039;&#039;;

    my @lists;

    if ( !$run_list ) {

        $r .=
          &quot;Testing all lists - \nTo test an individual list, pass the list shortname in the &#039;--list&#039; parameter...\n\n&quot;;

        @lists = available_lists( -In_Random_Order =&gt; 1 );
    }
    else {
        push( @lists, $run_list );
    }

    for my $l (@lists) {

        $r .= &quot;\n&quot; . &#039;-&#039; x 72 . &quot;\nTesting List: &#039;&quot; . $l . &quot;&#039;\n&quot;;

        unless ( check_if_list_exists( -List =&gt; $l, ) ) {
            $r .= &quot;&#039;$l&#039; does not exist! - skipping\n&quot;;
            next;
        }

        my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $l } );

        my $lock_file_fh = undef;
        if ( $Plugin_Config-&gt;{Enable_POP3_File_Locking} == 1 ) {
            $lock_file_fh = DADA::App::POP3Tools::_lock_pop3_check( { name =&gt; &#039;bridge-&#039; . $l . &#039;.lock&#039;, } );
			if(!defined($lock_file_fh)){ 
				$r .= &quot;couldn&#039;t get a lock for &quot; . $l . &quot;, skipping.&quot;;
	            next;
			}
			
        }

        my ( $pop3_obj, $pop3_status, $pop3_log ) = pop3_login($ls);
        $r .= $pop3_log;
        if ( $pop3_status == 1 ) {
            $pop3_obj-&gt;quit();
            $r .= &quot;\tLogging off of the POP Server.\n&quot;;
        }
		
        if ( $Plugin_Config-&gt;{Enable_POP3_File_Locking} == 1 ) {
            DADA::App::POP3Tools::_unlock_pop3_check(
                {
                    name =&gt; &#039;bridge-&#039; . $l . &#039;.lock&#039;,
                    fh   =&gt; $lock_file_fh,
                }
            );
        }
		
    }
    $r .= &quot;\n\nPOP3 Login Test Complete.\n\n&quot;;
    return $r;
}

sub pop3_login {
    my $ls = shift;

    my $r;
    my $password =
      DADA::Security::Password::cipher_decrypt( $ls-&gt;param(&#039;cipher_key&#039;),
        $ls-&gt;param(&#039;discussion_pop_password&#039;) );
    if ( !valid_login_information($ls) ) {
        $r .=
&quot;Some POP3 Login Information is missing - please double check! (aborting login attempt)\n&quot;;
        return ( undef, undef, $r );
    }
    else {

        my $pop;
        my $status;
        my $log;

        try {
            ( $pop, $status, $log ) = DADA::App::POP3Tools::net_pop3_login(
                {
                    server    =&gt; $ls-&gt;param(&#039;discussion_pop_server&#039;),
                    username  =&gt; $ls-&gt;param(&#039;discussion_pop_username&#039;),
                    password  =&gt; $password,
                    verbose   =&gt; $verbose,
                    USESSL    =&gt; $ls-&gt;param(&#039;discussion_pop_use_ssl&#039;),
                    AUTH_MODE =&gt; $ls-&gt;param(&#039;discussion_pop_auth_mode&#039;),
                }
            );
        }
        catch {
            $r .= &quot;Problems Logging in:\n$_&quot;;
            warn $_;
            return ( undef, undef, $r );
        };

        return ( $pop, $status, $log );
    }

    return $r;
}

sub valid_login_information {

    my $ls = shift;
    return 0 if !defined( $ls-&gt;param(&#039;discussion_pop_server&#039;) );
    return 0 if !defined( !$ls-&gt;param(&#039;discussion_pop_username&#039;) );
    return 0 if !defined( !$ls-&gt;param(&#039;discussion_pop_email&#039;) );
    return 0 if !defined( !$ls-&gt;param(&#039;discussion_pop_password&#039;) );
    return 1;
}

sub validate_msg {


	# to ddress is list email, 
	# from ddress is From emial
	# Naw, need header.... 
	# X-From_App
    my $ls       = shift;
    my $test_msg = shift;           #ref
    my $msg      = ${$test_msg};    # copy of orig

    my $status = 1;
    my $notice = &#039;&#039;;
    my $r      = &#039;&#039;;

    # DEV:
    # This should *really* mention each and every test....

    my $errors = {
        multiple_from_addresses                  =&gt; 0,
        msg_from_list_address                    =&gt; 0,
        list_email_address_is_list_owner_address =&gt; 0,
		list_email_address_is_list_admin_address =&gt; 0,
        invalid_msg                              =&gt; 0,
        multiple_return_path_headers             =&gt; 0,
        x_been_there_header_found                =&gt; 0,
        msg_not_from_list_owner                  =&gt; 0,
        needs_moderation                         =&gt; 0,
        subscribed                               =&gt; 0,
        msg_not_from_subscriber                  =&gt; 0,
        msg_not_from_list_owner                  =&gt; 0,
        msg_not_from_an_authorized_sender        =&gt; 0,
        message_seen_as_spam                     =&gt; 0,
		message_too_old                          =&gt; 0,
    };

    my $lh =
      DADA::MailingList::Subscribers-&gt;new( { -list =&gt; $ls-&gt;param(&#039;list&#039;) } );

    if ( 
		   lc_email( $ls-&gt;param(&#039;discussion_pop_email&#039;) ) 
		eq lc_email( $ls-&gt;param(&#039;list_owner_email&#039;) ) 
	) {
        $r .= &quot;\t\t***Warning!*** Misconfiguration of plugin! The List Owner email cannot be the same address as the List Email address!\n&quot;;
        $errors-&gt;{list_email_address_is_list_owner_address} = 1;
    }
	
    if ( lc_email( $ls-&gt;param(&#039;discussion_pop_email&#039;) ) eq lc_email( $ls-&gt;param(&#039;admin_email&#039;) ) ) {
        $r .=
&quot;\t\t***Warning!*** Misconfiguration of plugin! The List Admin email cannot be the same address as the List Email address!\n&quot;;
        $errors-&gt;{list_email_address_is_list_admin_address} = 1;
    }
	
	

    my $message_is_blank = 0;

    if ( !defined($msg) ) {
        $message_is_blank = 1;
    }
    elsif ( $msg eq &#039;&#039; ) {
        $message_is_blank = 1;
    }
    elsif ( length($msg) == 0 ) {
        $message_is_blank = 1;
    }
    if ($message_is_blank) {
        $r .= &quot;\t\t***Warning!*** Message is blank.\n&quot;;
        $errors-&gt;{blank_message} = 1;
        return ( 0, $errors, $r );
    }

    my $entity;
    $msg = safely_encode($msg);

#    use Data::Dumper; 
#    warn &#039;$parser &#039; . Dumper($parser); 
    
    try {
        $entity = $parser-&gt;parse_data($msg); 
        #warn &#039;still here...&#039;; 
    } catch { 
        $r .= &quot;\t\tProblems with parsing message: $_\n&quot;;
        cluck &quot;Problems with parsing message: $_\n&quot;;
        cluck &#039;$msg:&#039; . $msg; 
        
        $errors-&gt;{invalid_msg} = 1;
        return ( 0, $errors, $r );        
    };
    
    #warn &#039;$entity-&gt;as_string&#039; . $entity-&gt;as_string; 
        
    # These checks make sure that multiple From: headers and addresses don&#039;t exist
    if ( $Plugin_Config-&gt;{Check_Multiple_From_Addresses} == 1 ) {
        try {
            if ( $entity-&gt;head-&gt;count(&#039;From&#039;) &gt; 1 ) {
                $r .= &quot;\t\tMessage has more than one &#039;From&#039; header? Unsupported email message - will reject!\n&quot;;
                $errors-&gt;{multiple_from_addresses} = 1;
            }
            else {
                my @count = Email_Address_parse( $entity-&gt;head-&gt;get( &#039;From&#039;, 0 ) );
                if ( scalar(@count) &gt; 1 ) {
                    $r .= &quot;\t\tMessage has more than one &#039;From&#039; header? Unsupported email message - will reject!\n&quot;;
                    $errors-&gt;{multiple_from_addresses} = 1;
                }
            }
        } catch { 
            $r .= &quot;\t\tError with multiple from address check! Marking as a problem! - $_&quot;;
            $errors-&gt;{multiple_from_addresses} = 1;
        };
    }

    # /These checks make sure that multiple From: headers and addresses don&#039;t exist

    if ( $Plugin_Config-&gt;{Check_Multiple_Return_Path_Headers} == 1 ) {
        if ( $entity-&gt;head-&gt;count(&#039;Return-Path&#039;) &gt; 1 ) {
            $r .= &quot;\t\tMessage has more than one &#039;Return-Path&#039; header? Malformed email message - will reject!\n&quot;;
            $errors-&gt;{multiple_return_path_headers} = 1;
        }
    }

	my $x_been_there_header = undef; 
	if ( $entity-&gt;head-&gt;count(&#039;X-BeenThere&#039;) ) {
		$x_been_there_header = $entity-&gt;head-&gt;get( &#039;X-BeenThere&#039;, 0 );
		chomp($x_been_there_header);
	}
	elsif ( $entity-&gt;head-&gt;count(&#039;X-Beenthere&#039;) ) {
			$x_been_there_header = $entity-&gt;head-&gt;get( &#039;X-Beenthere&#039;, 0 );
			chomp($x_been_there_header);
	}
			
    if ( defined $x_been_there_header ) {

       if ( lc_email($x_been_there_header) eq lc_email( $ls-&gt;param(&#039;discussion_pop_email&#039;) ) ) {
            $r .= &quot;\t* Message is from myself (the, X-BeenThere header has been set), message should be ignored...\n&quot;;
            $errors-&gt;{x_been_there_header_found} = 1;
        }
		elsif($x_been_there_header eq $DADA::Config::PROGRAM_URL) { 
            $r .= &quot;\t* Message is from myself (the, X-BeenThere header has been set to the app&#039;s URL), message should be ignored...\n&quot;;
            $errors-&gt;{x_been_there_header_found} = 1;
		}
        else {
            $errors-&gt;{x_been_there_header_found} = 0;
        }
		
		ALL_LIST_EMAILS: for my $tmp_list(available_lists(-Dont_Die   =&gt; 1)){ 
			
			my $tmp_ls = DADA::MailingList::Settings-&gt;new({-list =&gt; $tmp_list}); 
			
			next if lc_email($tmp_ls-&gt;param(&#039;discussion_pop_email&#039;)) eq lc_email( $ls-&gt;param(&#039;discussion_pop_email&#039;));
			
	        if ( lc_email($x_been_there_header) eq lc_email( $tmp_ls-&gt;param(&#039;discussion_pop_email&#039;) ) ) {
	        
			     $r .= &quot;\t* Message is from another mailing list&#039;s List Email: &#039;&quot; 
				 . $x_been_there_header 
				 . &quot;&#039; (the, X-BeenThere header has been set), message should be ignored...\n&quot;;
	        
			     $errors-&gt;{x_been_there_header_found} = 1;
			
				 undef $tmp_ls; 
				 last ALL_LIST_EMAILS;
	         }
			 
			undef $tmp_ls; 
		}
		

    }

    my $rough_from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
    my $from_address = &#039;&#039;;

    if ( defined($rough_from) ) {
        try {
            # This correct ?
            $from_address = ( Email_Address_parse($rough_from) )[0]-&gt;address;
	    } catch { 
	         $r .= &#039;\t*Warning! Something\&#039;s wrong with the From address - &#039; . $_;
	    };
	}
	
    $from_address = lc_email($from_address);

    $r .= &quot;* Checking Recipient: $from_address\n&quot;;

    if ( lc_email($from_address) eq lc_email( $ls-&gt;param(&#039;list_owner_email&#039;) ) ) {
        $r .= &quot;\t* From List Owner: Yes.\n&quot;;
        if ( $Plugin_Config-&gt;{Check_List_Owner_Return_Path_Header} ) {
            ( $errors, $notice ) = test_Check_List_Owner_Return_Path_Header( $ls, $entity, $errors );
            $r .= $notice;
        }

    }
    else {

        $r .= &quot;\t* From List Owner: No.\n&quot;;

        $errors-&gt;{msg_not_from_list_owner} = 1;

        if ( $ls-&gt;param(&#039;group_list&#039;) == 1 ) {

            $r .= &quot;\t* Discussion List Support is enabled.\n&quot;;

	        if ( $ls-&gt;param(&#039;enable_moderation&#039;) ) {
	            $r .= &quot;\t* Moderation enabled.\n&quot;;
	          
				if($ls-&gt;param(&#039;bridge_use_moderation_for&#039;) eq &#039;everyone&#039;){
					$errors-&gt;{needs_moderation} = 1;
	        	}
				elsif($ls-&gt;param(&#039;bridge_use_moderation_for&#039;) eq &#039;requires_moderation_sublist&#039;){ 
					
					 $r .= &quot;\t\t* Checking From: address with, &#039;Requires Moderation&#039; sublist...\n&quot;;
		            if (
		                $lh-&gt;check_for_double_email(
		                    -Email =&gt; lc_email($from_address),
		                    -Type  =&gt; &#039;requires_moderation&#039;,
		                ) == 1
		              ) { 
						$r .= &quot;\t\t* Moderation required for, &quot; . lc_email($from_address) . &quot;\n&quot;;
					  	$errors-&gt;{needs_moderation} = 1;
					  }
					  else { 
					  	$r .= &quot;\t\t* No moderation required.\n&quot;;
					  }
					  
				}
				# This only works if the person is subscribed (think open discussion lists):
				elsif(
	                   $lh-&gt;check_for_double_email(-Email =&gt; lc_email($from_address), -Type  =&gt; &#039;list&#039;) == 1
					&amp;&amp; $ls-&gt;param(&#039;bridge_use_moderation_for&#039;) eq &#039;recently_added_subscribers&#039;
				){
					$r .= &quot;\t\t* Checking is subscriber has been subscribed long enough to not require moderation...\n&quot;;
					
					my $timestamp = $lh-&gt;get_subscriber_timestamp({-email =&gt; $from_address, -type =&gt; &#039;list&#039;});
					
					require Time::Piece;
					require Time::Piece::MySQL;
					
					my $tp = Time::Piece-&gt;from_mysql_timestamp( $timestamp );
					my $epoch = $tp-&gt;epoch; 
					my $padded = int($epoch) + (int($ls-&gt;param(&#039;bridge_recently_added_subscribers_timeframe&#039;)) * 86400); 
					
					if($padded &lt;= time){ 
						$r .= &quot;\t\t* No moderation required.\n&quot;;
					}
					else { 
						$errors-&gt;{needs_moderation} = 1;
						$r .= &quot;\t\t* Moderation required for, &quot; . lc_email($from_address) . &quot;\n&quot;;
					}
				}
				else { 
					$errors-&gt;{needs_moderation} = 1;
				}
			
			}
	        else {
	            $r .= &quot;\t* Moderation disabled.\n&quot;;
	        }
			
            my ( $s_status, $s_errors ) =
              $lh-&gt;subscription_check( 
			  	{ 
					-email =&gt; $from_address, 
					-mode  =&gt; &#039;admin&#039;
				} 
			);

            if ( $s_errors-&gt;{subscribed} == 1 ) {
                $r .= &quot;\t\t* From Subscriber: Yes.\n&quot;;


                $errors-&gt;{msg_not_from_list_owner} = 0;
                
				# Open discussion list - bad idea. 
				if ( $ls-&gt;param(&#039;subscriber_sending_no_moderation&#039;) ) {
                    $errors-&gt;{needs_moderation} = 0;
                }
                elsif ( $errors-&gt;{needs_moderation} == 1 ) {
                    $r .= &quot;\t\t* Moderation Required.\n&quot;;
                }
            }
            else {
                $r .= &quot;\t\t* From Subscriber: No.\n&quot;;

                if (   $ls-&gt;param(&#039;open_discussion_list&#039;) == 1 )
                {
                    $r .= &quot;\t\t* Postings from non-Subscribers is enabled.\n&quot;;
                    $errors-&gt;{msg_not_from_list_owner} = 0;
                }
                else {
                    $errors-&gt;{msg_not_from_subscriber} = 1;
                }
            }

        }
        else {
            $r .= &quot;\t* Discussion Support is disabled.\n&quot;;
        }
    }

    if ( $ls-&gt;param(&#039;enable_authorized_sending&#039;) == 1 ) {

        # cancel out other errors???
        $r .= &quot;\t* Authorized Senders is enabled.\n&quot;;
        my ( $m_status, $m_errors ) = $lh-&gt;subscription_check(
            {
                -email =&gt; $from_address,
                -type  =&gt; &#039;authorized_senders&#039;,
            }
        );
        if ( $m_errors-&gt;{subscribed} == 1 ) {
            $r .= &quot;\t\t* From Authorized Sender: Yes.\n&quot;;
            $errors-&gt;{msg_not_from_list_owner} = 0;
            $errors-&gt;{msg_not_from_subscriber} = 0;
            if ( $ls-&gt;param(&#039;authorized_sending_no_moderation&#039;) ) {
                $errors-&gt;{needs_moderation} = 0;
                $r .= &quot;\t\t* Moderation is not required for Authorized Senders.\n&quot;;
            }
            elsif ( $errors-&gt;{needs_moderation} == 1 ) {
                $r .= &quot;\t\t* Moderation required.\n&quot;;
            }
        }
        else {
            $r .= &quot;\t\t* From Authorized Sender: No.\n&quot;;
        }
    }
    else {
        $r .= &quot;\t* Authorized Senders is disabled.\n&quot;;
    }

    if ( $ls-&gt;param(&#039;ignore_spam_messages&#039;) == 1 ) {
        $r .= &quot;\t* SpamAssassin check is enabled.\n&quot;;

        if ( $ls-&gt;param(&#039;find_spam_assassin_score_by&#039;) eq &#039;calling_spamassassin_directly&#039; ) {

            $r .= &quot;\t* Loading SpamAssassin directly.\n&quot;;

            try {

                require Mail::SpamAssassin;

                if ( $Mail::SpamAssassin::VERSION &lt;= 2.60 &amp;&amp; $Mail::SpamAssassin::VERSION &gt;= 2 ) {
                    require Mail::SpamAssassin::NoMailAudit;

                    # this needs to be optimized...
                    my $spam_check_message = $entity-&gt;as_string;
                    $spam_check_message = safely_decode($spam_check_message);

                    my @spam_check_message =
                      split( &quot;\n&quot;, $spam_check_message );

                    my $mail = Mail::SpamAssassin::NoMailAudit-&gt;new( data =&gt; \@spam_check_message );

                    my $spamtest = Mail::SpamAssassin-&gt;new(
                        {local_tests_only =&gt; 1,
                            dont_copy_prefs  =&gt; 1,
                        }
                    );

                    my $score;
                    my $report;

                    if ($spamtest) {
                        my $spam_status;
                        $spam_status = $spamtest-&gt;check($mail);

                        if ($spam_status) {
                            $score  = $spam_status-&gt;get_hits();
                            $report = $spam_status-&gt;get_report();
                        }

                    }

                    if ( $score eq undef &amp;&amp; $score != 0 ) {
                        $r .= &quot;\t* Trouble parsing scoring information - letting message pass...\n&quot;;
                    }
                    else {

                        if ( $score &gt;= $ls-&gt;param(&#039;ignore_spam_messages_with_status_of&#039;) ) {
                            $r .=
                                &quot;\t*  Message has *failed* Spam Test (Score of: $score, &quot;
                              . $ls-&gt;param(&#039;ignore_spam_messages_with_status_of&#039;)
                              . &quot; needed.) - ignoring message.\n&quot;;
                            $errors-&gt;{message_seen_as_spam} = 1;

                            $r .= &quot;\n&quot; . $report;
                        }
                        else {
                            $errors-&gt;{message_seen_as_spam} = 0;

                            $r .=
                                &quot;\t* Message passed! Spam Test (Score of: $score, &quot;
                              . $ls-&gt;param(&#039;ignore_spam_messages_with_status_of&#039;)
                              . &quot; needed.)\n&quot;;
                        }

                    }

                    undef $mail;
                    undef $spamtest;
                    undef $score;
                    undef $report;

                }
                elsif ( $Mail::SpamAssassin::VERSION &gt;= 3 ) {

                    my $spam_check_message = $entity-&gt;as_string;
                    my $spamtest           = Mail::SpamAssassin-&gt;new(
                        {

                            local_tests_only =&gt; 1,
                            dont_copy_prefs  =&gt; 1,

                            # userstate_dir    =&gt; &#039;/home/hhbc/private/&#039;,
                        }
                    );
                    my $mail        = $spamtest-&gt;parse($spam_check_message);
                    my $spam_status = $spamtest-&gt;check($mail);

                    my $score  = $spam_status-&gt;get_score();
                    my $report = $spam_status-&gt;get_report();

                    if ( $score eq undef &amp;&amp; $score != 0 ) {
                        $r .= &quot;\t* Trouble parsing scoring information - letting message pass...\n&quot;;
                    }
                    else {

                        if ( ( $score &gt;= $ls-&gt;param(&#039;ignore_spam_messages_with_status_of&#039;) )
                            || $spam_status-&gt;is_spam() )
                        {
                            $r .=
                                &quot;\t* Message has *failed* Spam Test (Score of: $score, &quot;
                              . $ls-&gt;param(&#039;ignore_spam_messages_with_status_of&#039;)
                              . &quot; needed.) - ignoring message.\n&quot;;

                            $errors-&gt;{message_seen_as_spam} = 1;

                            $r .= &quot;\n&quot; . $report;
                        }
                        else {
                            $errors-&gt;{message_seen_as_spam} = 0;

                            $r .=
                                &quot;\t* Message passed! Spam Test (Score of: $score, &quot;
                              . $ls-&gt;param(&#039;ignore_spam_messages_with_status_of&#039;)
                              . &quot; needed.)\n&quot;;
                        }
                    }

                    $spam_status-&gt;finish;
                    $mail-&gt;finish;
                    $spamtest-&gt;finish;
                    undef $score;
                    undef $report;
                }
                else {
                    $r .=
&quot;\t* SpamAssassin 2.x and 3.x are currently supported, you have version $Mail::SpamAssassin::VERSION, skipping test\n&quot;;
                }
            
			} catch { 
                $r .= &quot;\t* SpamAssassin doesn&#039;t seem to be available. Skipping test - option should be disabled!\n&quot;;
			};
        }
        elsif ( $ls-&gt;param(&#039;find_spam_assassin_score_by&#039;) eq &#039;looking_for_embedded_headers&#039; ) {

            $r .= &quot;\t* Looking for embedding SpamAssassin Headers...\n&quot;;

            my $score = undef;
            if ( $entity-&gt;head-&gt;count(&#039;X-Spam-Status&#039;) ) {

                my @x_spam_status_fields =
                  split( &#039; &#039;, $entity-&gt;head-&gt;get( &#039;X-Spam-Status&#039;, 0 ) );
                for (@x_spam_status_fields) {
                    if ( $_ =~ m/score\=/ ) {
                        $score = $_;
                        $score =~ s/score\=//;

                        $r .= &quot;\t* Found them...\n&quot;;
                        last;

                    }
                }
            }

            if ( $score eq undef &amp;&amp; $score != 0 ) {
                $r .= &quot;\t* Trouble parsing scoring information - letting message pass...\n&quot;;
            }
            else {

                if ( $score &gt;= $ls-&gt;param(&#039;ignore_spam_messages_with_status_of&#039;) ) {
                    $r .=
                        &quot;\t*  Message has *failed* Spam Test (Score of: $score, &quot;
                      . $ls-&gt;param(&#039;ignore_spam_messages_with_status_of&#039;)
                      . &quot; needed.) - ignoring message.\n&quot;;

                    $errors-&gt;{message_seen_as_spam} = 1;

                    if ($verbose) {
                        my @x_spam_report = $entity-&gt;head-&gt;get(&#039;X-Spam-Report&#039;);
                        $r .= &quot;\n\t&quot;;
                        $r .= &quot;$_\n&quot; for @x_spam_report;
                    }

                }
                else {
                    $errors-&gt;{message_seen_as_spam} = 0;

                    $r .=
                        &quot;\t*  Message passed! Spam Test (Score of: $score, &quot;
                      . $ls-&gt;param(&#039;ignore_spam_messages_with_status_of&#039;)
                      . &quot; needed.)\n&quot;;
                }

            }
        }
        else {
            $r .= &quot;\t* Don&#039;t know how to find the SpamAssassin score, sorry!\n&quot;;
        }

    }
    else {
        $r .= &quot;\t* SpamAssassin check is disabled.\n&quot;;
    }


	# Message too old test
	my ($too_old_check, $too_old_r) = test_msg_is_too_old($entity);
	if($too_old_check == 1){ 
		$status = 0; 
		$errors-&gt;{message_too_old} = 1; 
		 $r .= &quot;\t* Message is more than 7 days old, will not process/send\n&quot;;
	}	
	#/MEssage too old test 
	
	
    $r .= &quot;\n&quot;;

    # This below probably can&#039;t happen anymore...
    if ( lc_email( $ls-&gt;param(&#039;discussion_pop_email&#039;) ) eq lc_email($from_address) ) {
        $errors-&gt;{msg_from_list_address} = 1;
        $r .= &quot;\t* *WARNING!* Message is from the List Address. That&#039;s bad.\n&quot;;
    }

    for ( keys %$errors ) {
        if ( $errors-&gt;{$_} == 1 ) {
            $status = 0;
            last;
        }
    }
 
    return ( $status, $errors, $r );
}

sub test_msg_is_too_old {
	 
    my $entity = shift;
	my $r = &#039;&#039;; 
	my $date = $entity-&gt;head-&gt;get( &#039;Date&#039;, 0);
	#chomp($date);
	
	$r .= &quot;Date: &#039;$date&#039;\n&quot;;
	
    if ( $date ) { 
    	
		$r .= &quot;Found a date!\n&quot;;
		
		require Date::Parse;
		my $t = Date::Parse::str2time($date);
		
		$r .= &quot;t &#039;&quot; . $t . &quot;&#039;\n&quot;;
		
		# Is today&#039;s date - 7 days less than or equal to the date received?
		# If so, the message is too old.
		if((int(time) - 604_800) &lt;= int($t)){ 
			$r .= &quot;too young to fail\n&quot;;
			return (0, $r);
		}
		else { 
			$r .= &quot;yup, Too old!&quot;;
			return (1, $r);
		}
    }
    else {
		# No Date found... WTF?
		# I wanna return &quot;1&quot; for this, but something tells me 
		# there&#039;s a weird edge case, and this will break 
		# for SOMEONE out there...
		$r .= &quot;Couldnt find a date!&quot;;
        return (0, $r);
    }
	
}


sub test_Check_List_Owner_Return_Path_Header {

    my $ls     = shift;
    my $entity = shift;
    my $errors = shift;
    my $notice = &#039;&#039;;

    require Email::Address;

    # This has been copied from the main thingy,
    my $rough_from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );

    #$notice .= &#039;$rough_from: &#039; . $rough_from;
    my $from_address = &#039;&#039;;

    if ( defined($rough_from) ) {

        try { $from_address = ( Email_Address_parse($rough_from) )[0]-&gt;address; };
    } catch { 
        $notice .= &#039;\t\tWarning! Something\&#039;s wrong with the From address - &#039; . $_
    };
    
    $from_address = lc_email($from_address);

    # $notice .= &#039;$from_address:  &#039; . $from_address;

    # /This has been copied from the main thingy,

    my $rough_return_path = undef;

    if ( $entity-&gt;head-&gt;get( &#039;Return-Path&#039;, 0 ) ) {

        # I haven&#039;t a clue what this is.
        # $notice .= q{$entity-&gt;head-&gt;get( &#039;Return-Path&#039;, 0 ) } . $entity-&gt;head-&gt;get( &#039;Return-Path&#039;, 0 );
        $rough_return_path = $entity-&gt;head-&gt;get( &#039;Return-Path&#039;, 0 );
    }
    else {

        # Strange, but there is no return-path... why?
        $notice .= &quot;\t\t * No Return Path Found - Skipping Test\n&quot;;
        $errors-&gt;{list_owner_return_path_set_funny} = 0;
        return ( $errors, $notice );
    }

    my $return_path_address = &#039;&#039;;

    if ( defined($rough_return_path) ) {

        try { 
            $return_path_address = ( Email_Address_parse($rough_return_path) )[0]-&gt;address; 
        }
        catch { 
            warn $_; 
        }
    }
    $return_path_address = lc_email($return_path_address);

    if ( lc_email($from_address) eq lc_email($return_path_address) ) {

        $errors-&gt;{list_owner_return_path_set_funny} = 0;

        $notice .=
          &quot;\t\t * Address set in, From: header, ($from_address) matches, Return-Path address ($return_path_address)\n&quot;;

    }
    else {

        $notice .=
&quot;\t\t * Address set in, From: header, ($from_address) doesn&#039;t match, Return-Path address ($return_path_address) ? Why?\n&quot;;
        warn
&quot;\t\t * Address set in, From: header, ($from_address) doesn&#039;t match, Return-Path address ($return_path_address) ? Why?\n&quot;;

        if ( lc_email($return_path_address) eq lc_email( $ls-&gt;param(&#039;admin_email&#039;) ) ) {

            $notice .= &quot;\t\tAh! Ok, The Return-Path is set to the list administrator - I guess that&#039;s ok....&quot;;
            warn &quot;\t\tAh! Ok, The Return-Path is set to the list administrator - I guess that&#039;s ok....&quot;;

            $errors-&gt;{list_owner_return_path_set_funny} = 0;

        }
        else {

            $errors-&gt;{list_owner_return_path_set_funny} = 1;

        }
    }

    return ( $errors, $notice );

    #return ({list_owner_return_path_set_funny =&gt; 1}, &quot;This here is my notice.&quot;);

}

sub send_msg_too_big {

    my $ls           = shift;
    my $full_msg_ref = shift;
    my $size         = shift;
    my $entity;

    try {
        $entity = $parser-&gt;parse_data($$full_msg_ref);
        if ( !$entity ) {
            warn &quot;couldn&#039;t create a new entity in send_msg_too_big, passing.&quot;;
        }

        my $from_address = ( Email_Address_parse( $entity-&gt;head-&gt;get( &#039;From&#039;, 0 ) ) )[0]-&gt;address;
		my $size_of_original_message = human_readable_filesize($size);
		
		
        require DADA::App::FormatMessages;
        my $dfm = DADA::App::FormatMessages-&gt;new( -List =&gt; $ls-&gt;param(&#039;list&#039;) );

        my $subject = $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 );
           $subject =~ s/\n//g;
           $subject = $dfm-&gt;_decode_header($subject);
		
		require DADA::App::Messages;
	    my $dap = DADA::App::Messages-&gt;new({-list =&gt; $ls-&gt;param(&#039;list&#039;)});
		$dap-&gt;send_out_message(
			{ 
				-message =&gt; &#039;msg_too_big_msg&#039;, 
				-email   =&gt; $from_address,
		        -tmpl_params =&gt; {
		            -list_settings_vars_param =&gt; { -list =&gt; $ls-&gt;param(&#039;list&#039;), -dot_it =&gt; 1, },
		            -subscriber_vars =&gt; { &#039;subscriber.email&#039; =&gt; $from_address, },
		            -vars            =&gt; {
		                original_subject         =&gt; $subject,
		                size_of_original_message =&gt; $size_of_original_message,
		            }
		        }
			}
		);
	} catch {
        warn &quot;Wasn&#039;t able to process message in send_msg_too_big: $_&quot;;
        return 0;
    };
	return 1; 
}

sub notify_of_delivery {

	# warn &#039;in notify_of_delivery&#039;; 
    my ($args) = @_;

    if ( !exists( $args-&gt;{-ls} ) ) {
        die &quot;You must pass a -ls parameter!&quot;;
    }
    if ( !exists( $args-&gt;{-msg} ) ) {
        die &quot;You must pass a -msg parameter!&quot;;
    }

    my $test_mail = 0;
    if ( exists( $args-&gt;{-test_mail} ) ) {
        $test_mail = $args-&gt;{-test_mail};
    }

    my $ls = $args-&gt;{-ls};

    # $msg is a scalarref
    my $msg = $args-&gt;{-msg};

    my $entity = $parser-&gt;parse_data($msg);

    my $rough_from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
    chomp($rough_from);
    my $from_address = undef;

    my $from_address = undef;
    if ( defined($rough_from) ) {
        try { 
			$from_address = ( Email_Address_parse($rough_from) )[0]-&gt;address; 
		} catch { 
			warn $_; 
		};
    }

	
    require DADA::App::FormatMessages;
    my $dfm = DADA::App::FormatMessages-&gt;new( -List =&gt; $ls-&gt;param(&#039;list&#039;) );

	my $original_subject = $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 );
	chomp($original_subject);
	$original_subject =~ s/\n//g;
	$original_subject = $dfm-&gt;_decode_header($original_subject);
	
	
	require DADA::App::EmailThemes; 
	my $em = DADA::App::EmailThemes-&gt;new(
		{ 
			-list      =&gt; $ls-&gt;param(&#039;list&#039;),		
			
		}
	);
	my $etp = $em-&gt;fetch(&#039;msg_received_msg&#039;);
	
	require DADA::App::Messages;
    my $dap = DADA::App::Messages-&gt;new({-list =&gt; $ls-&gt;param(&#039;list&#039;)});
	
	$dap-&gt;send_multipart_email(
        {
            -headers =&gt; {
                To      =&gt; $rough_from,
                From    =&gt; $ls-&gt;param(&#039;list_owner_email&#039;),
                Subject =&gt; $etp-&gt;{vars}-&gt;{subject},
            },
            -plaintext_body          =&gt; $etp-&gt;{plaintext},
            -html_body               =&gt; $etp-&gt;{html},

            -tmpl_params =&gt; {
                -list_settings_vars       =&gt; $ls-&gt;params,
                -list_settings_vars_param =&gt; { -dot_it =&gt; 1, },
                -subscriber_vars          =&gt; { &#039;subscriber.email&#039; =&gt; $from_address, },
                -vars                     =&gt; {
                    original_subject =&gt; $original_subject,
                }
            },
        }
    );
}

sub process {

    my ($args) = @_;

    my $r;

    if ( !exists( $args-&gt;{-ls} ) ) {
        die &quot;You must pass a -ls parameter!&quot;;
    }
    if ( !exists( $args-&gt;{-msg} ) ) {
        die &quot;You must pass a -msg parameter!&quot;;
    }

    my $test_mail = 0;
    if ( exists( $args-&gt;{-test_mail} ) ) {
        $test_mail = $args-&gt;{-test_mail};
    }

    my $ls = $args-&gt;{-ls};

    # $msg is a scalarref
    my $msg = $args-&gt;{-msg};

    $r .= &quot;\t* Processing Message...\n&quot;;

    my ( $n_msg, $dm_format_r ) = dm_format(
        {
            -ls  =&gt; $ls,
            -msg =&gt; $msg,    #scalarref
        }
    );
    $r .= $dm_format_r;
	
	
	my $msg_size_check = 1; 
	my $msg_size_r     = undef; 
	
	if($ls-&gt;param(&#039;email_limit_message_size&#039;) == 1) {
		$r .= &quot;\t\t* Message Size check enabled. Limit: &quot; . $ls-&gt;param(&#039;email_message_size_limit&#039;) . &quot;M\n&quot;;
		my ($ms_status, $ms_filesize) = message_size_check(
			{ 
				-msg    =&gt; $n_msg, 
				-ls_obj =&gt; $ls, 
			}
		);
	
		if($ms_status == 0){ 
			$msg_size_check = 0; 
			my $diff = $ms_filesize - (int($ls-&gt;param(&#039;email_message_size_limit&#039;)) * 1_048_576); 		
			$msg_size_r = &quot;\n&quot;
				. &quot;\t\t* &quot;
				. &#039;Message size: &#039; . human_readable_filesize($ms_filesize)
				. &#039;, is larger than the limit set of &#039; 
				. $ls-&gt;param(&#039;email_message_size_limit&#039;)
				. &#039;M&#039;
				. &#039; by: &#039;
				. human_readable_filesize($diff)
				. &quot;\n&quot;
			;		
		}
	}
	
	if($msg_size_check == 0){ 
		$r .= $msg_size_r; 
	    $r .= &quot;\t* Message NOT being delivered.  \n&quot;;
	}
	else {	
		
        if ( $ls-&gt;param(&#039;send_received_msg&#039;) == 1 ) {
			# warn &#039;notify_of_delivery&#039;; 
            notify_of_delivery(
                {
                    -ls        =&gt; $ls,
                    -msg       =&gt; $msg,
                    -test_mail =&gt; $test_mail,
                }
            );
        }
	
	    if ( $ls-&gt;param(&#039;send_msgs_to_list&#039;) == 1 ) {
	        $r .= &quot;\t* Message being delivered! \n&quot;;

	        my ( $msg_id, $saved_message, $d_r ) = deliver(
	            {
	                -ls        =&gt; $ls,
	                -msg       =&gt; $n_msg,
	                -test_mail =&gt; $test_mail,
	            }
	        );
	        $r .= $d_r;
	        archive(
	            {
	                -ls        =&gt; $ls,
	                -msg       =&gt; $n_msg,
	                -msg_id    =&gt; $msg_id,
	                -saved_msg =&gt; $saved_message
	            }
	        );
	    }
		else { 
			 $r .= &quot;\t* NOTE: Message is NOT being sent to Subscribers.\n&quot;;
		}
	
	    if (   $ls-&gt;param(&#039;send_msg_copy_to&#039;)
	        &amp;&amp; $ls-&gt;param(&#039;send_msg_copy_address&#039;) )
	    {
	        $r .= &quot;\t* Sending a copy of the message to: &quot; . $ls-&gt;param(&#039;send_msg_copy_address&#039;) . &quot;\n&quot;;

	        deliver_copy(
	            {
	                -ls  =&gt; $ls,
	                -msg =&gt; $msg,
	            }
	        );
	    }
	}

    $r .= &quot;\t* Finished Processing Message.\n\n&quot;;

    return $r;

}

sub dm_format {

    my ($args) = @_;
    my $r;

    if ( !exists( $args-&gt;{-ls} ) ) {
        die &quot;You must pass a -ls parameter!&quot;;
    }
    if ( !exists( $args-&gt;{-msg} ) ) {
        die &quot;You must pass a -msg parameter!&quot;;
    }

    my $ls  = $args-&gt;{-ls};
    my $msg = $args-&gt;{-msg};    # scalarref

    if ( $ls-&gt;param(&#039;strip_file_attachments&#039;) == 1 ) {
        my ($sfa_r) = undef;
        ( $msg, $sfa_r ) = strip_file_attachments( $msg, $ls );
        $r .= $sfa_r;
    }

    require DADA::App::FormatMessages;

    my $fm = DADA::App::FormatMessages-&gt;new( -List =&gt; $ls-&gt;param(&#039;list&#039;) );
    $fm-&gt;mass_mailing(1);

    if (   $ls-&gt;param(&#039;group_list&#039;) == 0
        &amp;&amp; $ls-&gt;param(&#039;rewrite_anounce_from_header&#039;) == 1 )
    {
        $fm-&gt;reset_from_header(1);
    }

#	warn &#039;${$msg} &#039; .  ${$msg}; 

    my ( $header_str, $body_str ) = $fm-&gt;format_headers_and_body(
        {	
			-msg             =&gt; ${$msg},
	        -convert_charset =&gt; 1,
			-format_mlm      =&gt; 1, 
		}
	);
#	warn &#039;$header_str&#039; . $header_str; 
#	warn &#039;$body_str&#039;   . $body_str; 
  
    # not a scalarref (duh)
    my $all_together = $header_str . &quot;\n\n&quot; . $body_str;
    return ( $all_together, $r );

}

sub strip_file_attachments {

    my $msg = shift;    #ref
    my $ls  = shift;
    my $r;

    my $entity = undef;

    try { 
		$entity = $parser-&gt;parse_data( ${$msg} ) 
	} catch { 
		warn $_; 
	};
    if ( !$entity ) {
        die &quot;no entity found! die&#039;ing!&quot;;
    }

    $r .= &quot;\t* Stripping banned file attachments...\n\n&quot;;

    ( $entity, $ls ) = process_stripping_file_attachments( $entity, $ls );

    my $un = $entity-&gt;as_string;
    $un = safely_decode($un);
    return ( \$un, $r );
}



sub process_stripping_file_attachments {

    my $entity = shift;
    my $ls     = shift;

    my @att_bl = split( &#039; &#039;, $ls-&gt;param(&#039;file_attachments_to_strip&#039;) );
    my $lt = {};

    for (@att_bl) {
        $lt-&gt;{ lc($_) } = 1;
    }

    my @parts = $entity-&gt;parts;

    if (@parts) {

        # multipart...
        my $i;
        for $i ( 0 .. $#parts ) {
            ( $parts[$i], $ls ) =
              process_stripping_file_attachments( $parts[$i], $ls );

        }

        my @new_parts;

        for $i ( 0 .. $#parts ) {
            if ( !$parts[$i] ) {

            }
            else {

                push( @new_parts, $parts[$i] );
            }
        }

        $entity-&gt;parts( \@new_parts );

        $entity-&gt;sync_headers(
            &#039;Length&#039;      =&gt; &#039;COMPUTE&#039;,
            &#039;Nonstandard&#039; =&gt; &#039;ERASE&#039;
        );

        return ( $entity, $ls );

    }
    else {

        my $name = $entity-&gt;head-&gt;mime_attr(&quot;content-type.name&quot;)
          || $entity-&gt;head-&gt;mime_attr(&quot;content-disposition.filename&quot;);

        my $f_ending = $name;
        $f_ending =~ s/(.*)\.//g;

        if (
               $lt-&gt;{ lc( $entity-&gt;head-&gt;mime_type ) } == 1
            || $lt-&gt;{ lc($f_ending) } == 1
            || $lt-&gt;{ &#039;.&#039; . lc($f_ending) } == 1

          )
        {

            print &quot;\t* Stripping attachment with:\n\t\t* name: $name \n\t\t* MIME-Type: &quot;
              . $entity-&gt;head-&gt;mime_type . &quot;\n&quot;;

            return ( undef, $ls );
        }

        $entity-&gt;sync_headers(
            &#039;Length&#039;      =&gt; &#039;COMPUTE&#039;,
            &#039;Nonstandard&#039; =&gt; &#039;ERASE&#039;
        );
        return ( $entity, $ls );
    }

    return ( $entity, $ls );
}

sub deliver_copy {

    my $r;
    $r .= &quot;\t* Delivering Copy...\n&quot;;

    my ($args) = @_;

    if ( !exists( $args-&gt;{-ls} ) ) {
        die &quot;You must pass a -ls parameter!&quot;;
    }
    if ( !exists( $args-&gt;{-msg} ) ) {
        die &quot;You must pass a -msg parameter!&quot;;
    }

    my $ls  = $args-&gt;{-ls};
    my $msg = $args-&gt;{-msg};

    my $test_mail = 0;
    if ( exists( $args-&gt;{-test_mail} ) ) {
        $test_mail = $args-&gt;{-test_mail};
    }

    my $mh = DADA::Mail::Send-&gt;new(
        {

            -list   =&gt; $ls-&gt;param(&#039;list&#039;),
            -ls_obj =&gt; $ls,
        }
    );

    #warn &quot;test_mail &quot; . $test_mail;

    $mh-&gt;test($test_mail);

    my $entity = undef; 
    try { 
        
        $entity = $parser-&gt;parse_data(
            safely_encode(
                $msg
                )
            ) 
    } catch { 
		warn $_; 
	};

    if ( !$entity ) {
        $r .= &quot;\t* Message sucks!\n&quot;;

    }
    else {

        my $headers = $entity-&gt;stringify_header;
           $headers = safely_decode($headers);

        my %headers = $mh-&gt;return_headers($headers);
          $headers{To} = $ls-&gt;param(&#039;send_msg_copy_address&#039;);

        $r .= &quot;\t* Message Details:\n&quot;;
        $r .= &quot;\t* Subject: &quot; . $headers{Subject} . &quot;\n&quot;;

        my $msg_id = $mh-&gt;send(

            %headers,

            # Trust me on these :)

            # These are here so the message doesn&#039;t cause an infinite loop BACK to the list -

            # These are *probably* optional,
            &#039;Bcc&#039; =&gt; &#039;&#039;,
            &#039;Cc&#039;  =&gt; &#039;&#039;,

            # This&#039;ll do the trick, all by itself.
            &#039;X-BeenThere&#039; =&gt; $ls-&gt;param(&#039;discussion_pop_email&#039;),

            Body =&gt; safely_decode( $entity-&gt;stringify_body ),

        );

    }
    return $r;

}

sub deliver {

    my ($args) = @_;
    my $r;

    if ( !exists( $args-&gt;{-ls} ) ) {
        die &quot;You must pass a -ls parameter!&quot;;
    }
    if ( !exists( $args-&gt;{-msg} ) ) {
        die &quot;You must pass a -msg parameter!&quot;;
    }

    my $ls  = $args-&gt;{-ls};
    my $msg = $args-&gt;{-msg};

    my $test_mail = 0;
    if ( exists( $args-&gt;{-test_mail} ) ) {
        $test_mail = $args-&gt;{-test_mail};
    }

    my $mh = DADA::Mail::Send-&gt;new(
        {
            -list   =&gt; $ls-&gt;param(&#039;list&#039;),
            -ls_obj =&gt; $ls,
        }
    );

    $mh-&gt;test($test_mail);
    $msg = safely_encode($msg);

    my $entity = undef;
    try { 
		$entity = $parser-&gt;parse_data($msg); 
	} catch { 
		warn $_; 
	};

    if ( !$entity ) {
        $r .= &quot;\t* Message sucks!\n&quot;;
    }
    else {

        my $headers = $entity-&gt;stringify_header;
        $headers = safely_decode($headers);
        my %headers = $mh-&gt;return_headers($headers);
		
		# Fwaaaaah? 
        $headers{To} = $ls-&gt;param(&#039;list_owner_email&#039;);


		#
		#
		#
		
        require DADA::App::FormatMessages;
        my $dfm = DADA::App::FormatMessages-&gt;new( -List =&gt; $ls-&gt;param(&#039;list&#039;) );
		
		
		require DADA::App::EmailThemes;
	    my $em = DADA::App::EmailThemes-&gt;new(
	        {
	            -list  =&gt; $ls-&gt;param(&#039;list&#039;),
				-cache =&gt; 1, 
	        }
	    );
			
		my $etp = $em-&gt;fetch(
			$dfm-&gt;layout_choice()
		);
		
		$headers{To} = $dfm-&gt;format_phrase_address(
                    $etp-&gt;{vars}-&gt;{to_phrase},
                    $ls-&gt;param(&#039;list_owner_email&#039;)
                );
		
		#
		#
		#
		

        $r .= &quot;\t* Message Details: \n&quot;;
        $r .= &quot;\t* Subject: &quot; . $headers{Subject} . &quot;\n&quot;;

        if (   $ls-&gt;param(&#039;group_list&#039;) == 1
            &amp;&amp; $ls-&gt;param(&#039;mail_discussion_message_to_poster&#039;) != 1 )
        {

            my $f_a;

            if ( exists( $headers{From} ) ) {

                try { 
					$f_a = ( Email_Address_parse( $headers{From} ) )[0]-&gt;address; 
					
	                $r .= &quot;\t* Going to skip sending original poster ($f_a) a copy of their own  message...\n&quot;;
	                $mh-&gt;do_not_send_to( [$f_a] );
					
				} catch { 
					$r .= &quot;\t* Problems not sending copy to original sender: $_\n\n&quot;;
				};
            }
        }
		
        my $msg_id = $mh-&gt;mass_send(
            {            
                -msg =&gt; {
					%headers, 
					Body =&gt; safely_decode(
						$entity-&gt;stringify_body
					)
				},
            }
        );


		# warn &#039;$r:&#039; . $r; 

        return ( $msg_id, $mh-&gt;saved_message, $r );

    }

}

sub archive {

    my ($args) = @_;

    if ( !exists( $args-&gt;{-ls} ) ) {
        die &quot;You must pass a -ls parameter!&quot;;
    }
    if ( !exists( $args-&gt;{-msg} ) ) {
        die &quot;You must pass a -msg parameter!&quot;;
    }
    if ( !exists( $args-&gt;{-msg_id} ) ) {
        die &quot;You must pass a -msg_id parameter!&quot;;
    }
    if ( !exists( $args-&gt;{-saved_msg} ) ) {
        die &quot;You must pass a -saved_msg parameter!&quot;;
    }

    my $ls        = $args-&gt;{-ls};
    my $msg       = $args-&gt;{-msg};
    my $msg_id    = $args-&gt;{-msg_id};
    my $saved_msg = $args-&gt;{-saved_msg};

    if ( $ls-&gt;param(&#039;archive_messages&#039;) == 1 ) {

        require DADA::MailingList::Archives;

        # I&#039;m having trouble with the db handle die&#039;ing after we&#039;ve forked a mailing.
        # I wonder if telling Mr. Archives here to create  new connection will help things...

        my $la =
          DADA::MailingList::Archives-&gt;new( { -list =&gt; $ls-&gt;param(&#039;list&#039;) } );

        my $entity = undef;

        try {
            $msg    = safely_encode($msg);
            $entity = $parser-&gt;parse_data($msg);
        } catch {
			warn $_; 
        };

        if ($entity) {

            my $Subject = $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 );
            if ( $ls-&gt;param(&#039;no_prefix_list_name_to_subject_in_archives&#039;) == 1 ) {
                $Subject = $la-&gt;strip_subjects_appended_list_name($Subject);
            }

            try {
                $la-&gt;set_archive_info( $msg_id, $Subject, undef, undef, $saved_msg, );
            } catch {
                warn &quot;$DADA::Config::PROGRAM_NAME $DADA::Config::VER warning! message did not archive correctly!: $_&quot;;
            };
        }
        else {
            warn &quot;Problem archiving message...&quot;;
        }

    }
}

sub send_msg_not_from_subscriber {

    my $ls  = shift;
    my $msg = shift;

    $msg = safely_encode($msg);
    my $entity = $parser-&gt;parse_data($msg);
    my $original_subject = $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 );
   
   
    my $rough_from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
    my $from_address    = undef;
	my $is_a_subscriber = undef;
    if ( defined($rough_from) ) {
        require DADA::MailingList::Subscribers; 
		my $lh = DADA::MailingList::Subscribers-&gt;new( { -list =&gt; $ls-&gt;param(&#039;list&#039;) } );
		
		
        try { 
			
			$from_address    = ( Email_Address_parse($rough_from) )[0]-&gt;address; 
			my $member_of = $lh-&gt;member_of({
				-email =&gt; $from_address,
	            -types =&gt; [&#039;list&#039;]
			}); 
			if(scalar(@$member_of) &gt;= 1){ 
				if($member_of-&gt;[0] eq &#039;list&#039;){ 
					$is_a_subscriber = 1;
				}
			}
		} catch { 
			warn $_; 
		};
    }

    if ( $from_address &amp;&amp; $from_address ne &#039;&#039; ) {

        require DADA::MailingList::Settings;
        if ( $from_address eq $ls-&gt;param(&#039;discussion_pop_email&#039;) ) {
            warn
&quot;Message is from List Email ($from_address)? Not sending, &#039;not_allowed_to_post_msg&#039; so to not send message back to list!&quot;;
        }
        else {
			
			require DADA::App::Messages;
		    my $dap = DADA::App::Messages-&gt;new({-list =&gt; $ls-&gt;param(&#039;list&#039;)});
			$dap-&gt;send_out_message(
				{
					-message =&gt; &#039;not_allowed_to_post_msg&#039;,
					-email =&gt; $from_address, 
	            	-tmpl_params    =&gt; {
		                -list_settings_vars_param =&gt; { 
							-list =&gt; $ls-&gt;param(&#039;list&#039;), 
						},
		                -subscriber_vars          =&gt; {
		                    &#039;subscriber.email&#039; =&gt; $from_address
		                },
		                -vars =&gt; {
		                     original_subject =&gt; $original_subject, 
							 is_a_subscriber  =&gt; $is_a_subscriber,
		                }
					}
	            }
			);
        }

    }
    else {
        warn &quot;Problem with send_msg_not_from_subscriber! There&#039;s no address to send to?: &quot; . $rough_from;
    }

}

sub send_spam_rejection_message {
    my $ls  = shift;
    my $msg = shift;

    $msg = safely_encode($msg);
    my $entity = $parser-&gt;parse_data($msg);

    my $rough_from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
    my $from_address;
    if ( defined($rough_from) ) {
        ;
        try { 
			$from_address = ( Email_Address_parse($rough_from) )[0]-&gt;address; 
		} catch { 
			warn $_; 
		}; 
    }

    if ( $from_address &amp;&amp; $from_address ne &#039;&#039; ) {

        require DADA::MailingList::Settings;
        my $ls =
          DADA::MailingList::Settings-&gt;new( { -list =&gt; $ls-&gt;param(&#039;list&#039;) } );


  
		require DADA::App::Messages;
	    my $dap = DADA::App::Messages-&gt;new(
			{
				-list =&gt; $ls-&gt;param(&#039;list&#039;),
			}
		);
		$dap-&gt;send_out_message(
            {
				-message =&gt; &#039;msg_labeled_as_spam_msg&#039;,
				-email =&gt; $from_address, 
                -tmpl_params =&gt; {
                    -list_settings_vars       =&gt; $ls-&gt;params,
                    -list_settings_vars_param =&gt; { -dot_it =&gt; 1, },
                    -subscriber_vars          =&gt; { &#039;subscriber.email&#039; =&gt; $from_address, },
                    -vars                     =&gt; {
                        original_subject =&gt; $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 ),
                    }
                },
            }
        );

    }
    else {
        warn &quot;Problem with send_spam_rejection_message! There&#039;s no address to send to?: &quot; . $rough_from;
    }
}

sub send_invalid_msgs_to_owner {

    my $ls  = shift;
    my $msg = shift;

    $msg = safely_encode($msg);
    my $entity = $parser-&gt;parse_data($msg);
    my $rough_from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
    my $from_address;
    if ( defined($rough_from) ) {
        try { 
			$from_address = ( Email_Address_parse($rough_from) )[0]-&gt;address; 
		} catch { 
			warn $_; 
		};
    }

    if ( $from_address &amp;&amp; $from_address ne &#039;&#039; ) {

		my $original_subject = $entity-&gt;head-&gt;get(&#039;Subject&#039;,0);
		my $is_a_subscriber = 0; 
		
        require DADA::MailingList::Subscribers; 
		my $lh = DADA::MailingList::Subscribers-&gt;new( { -list =&gt; $ls-&gt;param(&#039;list&#039;) } );
		my $member_of = $lh-&gt;member_of({
			-email =&gt; $from_address,
            -types =&gt; [&#039;list&#039;]
		}); 
		if(scalar(@$member_of) &gt;= 1){ 
			if($member_of-&gt;[0] eq &#039;list&#039;){ 
				$is_a_subscriber = 1;
			}
		}
		
		require DADA::App::Messages;
	    my $dap = DADA::App::Messages-&gt;new({-list =&gt; $ls-&gt;param(&#039;list&#039;)});
		$dap-&gt;send_out_message(
			{ 
				-message =&gt; &#039;invalid_msgs_to_owner_msg&#039;, 
				-email   =&gt; $ls-&gt;param(&#039;list_owner_email&#039;),
                -tmpl_params =&gt; {
                    -list_settings_vars       =&gt; $ls-&gt;params,
                    -list_settings_vars_param =&gt; { 
							-dot_it =&gt; 1,
					},
                    -subscriber_vars =&gt; { 
                        &#039;subscriber.email&#039; =&gt; $from_address, 
                    },
                    -vars =&gt; { 
                        original_subject =&gt; $original_subject, 
						is_a_subscriber  =&gt; $is_a_subscriber, 
                    },
                },
			}
		);
    }
    else {
        warn &quot;Problem with send_invalid_msgs_to_owner!&quot;;
    }
}

sub handle_errors {

    my $ls       = shift;
    my $errors   = shift;
    my $full_msg = shift;
    my $r;
    my $entity;

    $full_msg = safely_encode($full_msg);

    try {
        $entity = $parser-&gt;parse_data(
            $full_msg
        );
    } catch { 
        $r .= &quot;Problems Handling Error: $_\n&quot;; 
#      warn &#039;length($full_msg):&#039; . length($full_msg); 
#       warn &#039;$full_msg&#039; . $full_msg; 
#        warn &#039;reseting mime parser.&#039;; 
        $parser          = new MIME::Parser;
        $parser          = optimize_mime_parser($parser);
        
              
    };
    
    if ( !$entity ) {
        $r .= &quot;No entity found!\n&quot;;
        return $r; 
    }
    else {  

        my $reasons = &#039;&#039;;
        for ( keys %$errors ) {
            $reasons .= $_ . &#039;, &#039;
              if $errors-&gt;{$_} == 1;
        }
        my $subject = $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 );
        $subject =~ s/\n//g;
        my $from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
        $from =~ s/\n//g;

        # $from should probably be simply the email address, not the entire header...
        #
        try { 
			$from = ( Email_Address_parse($from) )[0]-&gt;address; 
		} catch {
            warn &quot;this was a problem parsing the email address from the header? &#039;$_&#039;&quot;;
        };

        my $message_id = $entity-&gt;head-&gt;get( &#039;Message-Id&#039;, 0 );
        $message_id =~ s/\n//g;
        if ( !$message_id ) {

            require DADA::Security::Password;

            my ( $f_user, $f_domain ) = split( &#039;@&#039;, $from );
            my $fake_message_id = &#039;&lt;&#039;
              . DADA::App::Guts::message_id()
              . &#039;.FAKE_MSG_ID&#039;
              . DADA::Security::Password::generate_rand_string(&#039;1234567890&#039;) . &#039;@&#039;
              . $f_domain . &#039;&gt;&#039;;

            $message_id = $fake_message_id;
            $entity-&gt;head-&gt;replace( &#039;Message-ID&#039;, $fake_message_id );

            warn
    &quot;bridge - message has no Message-Id header!...? Creating FAKE Message-Id ($fake_message_id) , to avoid any conflicts...&quot;;

        }

        warn &quot;Bridge is rejecting sending out the received message:&quot;
			. &quot;\n\tList: &quot; . $ls-&gt;param(&#039;list&#039;)
			. &quot;\n\tFrom: $from&quot;
			. &quot;\n\tSubject: $subject&quot;
			. &quot;\n\tMessage-ID: $message_id&quot;
			. &quot;\n\tReasons: $reasons&quot;
		;

        $r .= &quot;\tReasons:\n&quot;;

        my %error_descriptions = (
            needs_moderation        =&gt; &#039;Message needs to be moderated&#039;,
            msg_not_from_subscriber =&gt; &#039;Message is not from a Subscriber&#039;,
            msg_not_from_list_owner =&gt; &#039;Message is not from the List Owner&#039;,
        );

        for ( keys %$errors ) {
            if ( $errors-&gt;{$_} == 1 ) {
                if ( exists( $error_descriptions{$_} ) ) {
                    $r .= &quot;\t\t* &quot; . $error_descriptions{$_} . &quot;\n&quot;;
                }
                else {
                    $r .= &quot;\t\t&quot; . $_ . &quot;\n&quot;;
                }
            }
        }

        if ( $errors-&gt;{list_owner_return_path_set_funny} == 1 ) {
            $r .= &quot;\t\t* list_owner_return_path_set_funny\n&quot;;

            # and I&#039;m not going to do anything...
        }

        $r .= &quot;\n&quot;;

        if ( $errors-&gt;{message_seen_as_spam} == 1 ) {

            if ( $ls-&gt;param(&#039;rejected_spam_messages&#039;) eq &#039;send_spam_rejection_message&#039; ) {
                $r .= &quot;\t\t* end_spam_rejection_message on its way!\n&quot;;
                send_spam_rejection_message( $ls, $full_msg );

            }
            elsif ( $ls-&gt;param(&#039;rejected_spam_messages&#039;) eq &#039;ignore_spam&#039; ) {
                $r .= &quot;\t\t *** Message seen as SPAM - ignoring. ***\n&quot;;
            }
            else {
                $r .= &quot;\t\tlist_settings.rejected_spam_messages is setup impoperly - ignoring message!\n&quot;;
            }

        }
        elsif ( $errors-&gt;{multiple_return_path_headers} == 1 ) {

            $r .= &quot;\t\t* Message has multiple &#039;Return-Path&#039; headers. Ignoring. \n&quot;;
            warn &quot;$DADA::Config::PROGRAM_NAME Error: Message has multiple &#039;Return-Path&#039; headers. Ignoring.&quot;;

        }
        elsif ( $errors-&gt;{msg_from_list_address} ) {

            $r .= &quot;\t\t* message was from the list address - will not process! - (ignoring) \n&quot;;
            warn &quot;$DADA::Config::PROGRAM_NAME Error: message was from the list address - will not process! - (ignoring)&quot;;
        }
        elsif ($errors-&gt;{msg_not_from_subscriber} == 1
            || $errors-&gt;{msg_not_from_list_owner} == 1
            || $errors-&gt;{msg_not_from_an_authorized_sender} == 1 )
        {

            if ( $ls-&gt;param(&#039;send_not_allowed_to_post_msg&#039;) == 1 ) {

                $r .= &quot;\t Sending out, &#039;Not Allowed to Post&#039; email notification to poster\n&quot;;
                send_msg_not_from_subscriber( $ls, $full_msg );

            }

            if ( $ls-&gt;param(&#039;send_invalid_msgs_to_owner&#039;) == 1 ) {
                $r .= &quot;\t Sending out, &#039;Not Allowed to Post&#039; email notification to List Owner\n&quot;;
                send_invalid_msgs_to_owner( $ls, $full_msg );

            }

        }
        elsif ( $errors-&gt;{needs_moderation} ) {

            $r .= &quot;Message being saved for moderation by List Owner.\n&quot;;

            my $mod = SimpleModeration-&gt;new( { -List =&gt; $ls-&gt;param(&#039;list&#039;) } );
			
			# why is $full_msg a scalar?
           my $ran_string = generate_rand_string_md5();
		   # I feel &#039;-&#039;s are mucking things up: 
			  $ran_string =~ s/\-|\%|\=/_/g;

		   $mod-&gt;save_msg( 
		   		{ 
					-msg    =&gt; $full_msg, 
					-msg_id =&gt; $ran_string 
				}
			);

            # This is only used once...
            $r .= $mod-&gt;moderation_msg(
                {
                    -msg    =&gt; $full_msg,
                    -msg_id =&gt; $ran_string,
                    -from   =&gt; $from,
                    -parser =&gt; $parser
                }
            );

            if ( $ls-&gt;param(&#039;send_moderation_msg&#039;) == 1 ) {
                $r .= &quot;\t\t * Sending &#039;awaiting moderation&#039; message!\n&quot;;
                $mod-&gt;send_moderation_msg(
                    {
                        -msg_id =&gt; $ran_string,
                        -parser =&gt; $parser,
                    }
                );
            }

            my $awaiting_msgs = $mod-&gt;awaiting_msgs();

            $r .= &quot;\t* Other awaiting messages:\n&quot;;

            for (@$awaiting_msgs) {
                $r .= &quot;\t\t * &quot; . $_-&gt;{name} . &#039; =&gt; &#039; . $_-&gt;{date} .&quot;\n&quot;;
            }
        }
		warn $r; 
        return $r;
    }
}

sub create_checksum {

    my $data = shift;

    if ( $] &gt;= 5.008 ) {
        require Encode;
        my $cs = md5_hex( safely_encode($$data) );
        return $cs;
    }
    else {
        my $cs = md5_hex($$data);
        return $cs;
    }
}

sub can_use_spam_assassin {

    try { 
		require Mail::SpamAssassin; 
	} catch {
        return 0;
    }
	return 1; 

}

sub append_message_to_file {

    my $ls  = shift;
    my $msg = shift;
    my $rp  = find_return_path($msg);
    my $r;

    my $file = $DADA::Config::TMP . &#039;/bridge_received_msgs-&#039; . $ls-&gt;param(&#039;list&#039;) . &#039;.mbox&#039;;

    $r .= &quot;\n&quot;;
    $r .= &quot;Saving message at: &#039;$file&#039; \n&quot;;

    $file = DADA::App::Guts::make_safer($file);

    open( APPENDLOG, &#039;&gt;&gt;:encoding(&#039; . $DADA::Config::HTML_CHARSET . &#039;)&#039;, $file )
      or die $!;
    chmod( $DADA::Config::FILE_CHMOD, $file );
    print APPENDLOG &#039;From &#039; . $rp . &quot;\n&quot;;
    print APPENDLOG $msg . &quot;\n&quot;;
    close(APPENDLOG) or die $!;

    $r .= &quot;Saved. \n&quot;;
    return ( 1, $r );

}

sub find_return_path {

    my $msg = shift;
    my $rp;

    try {

        $msg = safely_encode($msg);
        my $entity = $parser-&gt;parse_data($msg);
        $rp = $entity-&gt;head-&gt;get( &#039;Return-Path&#039;, 0 );
		$entity-&gt;purge; 
    } catch { 
		warn $_; 
		return undef;
	};
    chomp $rp;
    return $rp;
}

sub cgi_show_plugin_config {
    my $q = shift; 
    my $configs = [];
    for ( sort keys %$Plugin_Config ) {
        if ( $_ eq &#039;Password&#039; ) {
            push( @$configs, { name =&gt; $_, value =&gt; &#039;(Not Shown)&#039; } );
        }
        else {
            push( @$configs, { name =&gt; $_, value =&gt; $Plugin_Config-&gt;{$_} } );
        }
    }

    require DADA::Template::Widgets;
    my $scrn = DADA::Template::Widgets::wrap_screen(
        {
            -screen         =&gt; &#039;plugins/shared/plugin_config.tmpl&#039;,
            -with           =&gt; &#039;admin&#039;,
            -wrapper_params =&gt; {
                -Root_Login =&gt; $root_login,
                -List       =&gt; $list,
            },
            -vars =&gt; {
                screen      =&gt; &#039;using_bridge&#039;,
                Plugin_Name =&gt; $Plugin_Config-&gt;{Plugin_Name},
                configs     =&gt; $configs,
            },
        },
    );
    return({}, $scrn);

}



sub inject {

    my ($args) = @_;

    my $r   = &#039;&#039;;
    my $msg = $args-&gt;{-msg};

    # We&#039;re taking a guess, on this one:
    $msg = safely_decode($msg);

    my $send_test = 0;

    my $test_mail = 0;

    if ( exists( $args-&gt;{-send_test} ) ) {
        $send_test = $args-&gt;{-send_test};
    }
    if ( exists( $args-&gt;{-verbose} ) ) {
        $verbose = $args-&gt;{-verbose};
    }
    if ( exists( $args-&gt;{-test_mail} ) ) {
        $test_mail = $args-&gt;{-test_mail};
    }

    my $ls;
    if ( exists( $args-&gt;{-ls} ) ) {
        $ls = $args-&gt;{-ls};

    }
    else {
        require DADA::MailingList::Settings;
        $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $ls-&gt;param(&#039;list&#039;) } );
    }

    try { 
       require DADA::App::FormatMessages;
       my $dfm = DADA::App::FormatMessages-&gt;new( -List =&gt; $ls-&gt;param(&#039;list&#039;) );
        my $entity = $parser-&gt;parse_data(safely_encode($msg)); 
           $entity = $dfm-&gt;change_content_transfer_encoding({-entity =&gt; $entity}); 
           $msg    = safely_decode($entity-&gt;as_string); 
		   $entity-&gt;purge;
           undef $entity; 
           # warn &#039;Hey Hey! $msg &#039; . safely_encode($msg); 
    } catch { 
        warn &#039;Couldn\&#039;t change Content-Transfer-Encoding: &#039; . $_; 
    };
    
    if ( $ls-&gt;param(&#039;disable_discussion_sending&#039;) != 1 ) {
        my ( $status, $errors );

        my $status;
        my $errors;
        my $report;
         
        try {
			# warn &#039;validate_msg&#039;;
            ( $status, $errors, $report ) = validate_msg( $ls, \$msg );
        } catch { 
            warn &#039;couldn\&#039;t validate_msg?!&#039;; 
            return (0, {}, &#039;couldn\&#039;t validate_msg?!&#039;); 
        };
        
		try { 
            
            if ($status == 1) {
                $r .= process(
                    {
                        -ls        =&gt; $ls,
                        -msg       =&gt; \$msg,
                        -test_mail =&gt; $test_mail,
                    }
                );

				# warn &#039;append_message_to_file&#039;;
                my ( $amtf_status, $amtf_r ) = append_message_to_file( $ls, $msg );
                $r .= $amtf_r;
                return ( $status, $errors, $r );

            }
            else {

				# warn &#039;handle_errors&#039;;
                $r .= &quot;\tMessage did not pass verification.\n&quot;;
                $r .= handle_errors( $ls, $errors, $msg );
                
                append_message_to_file( $ls, $msg );

                return ( $status, $errors, $r );

            }

        } catch { 

            cluck &quot;bridge - irrecoverable error processing message. Skipping message (sorry!): $_&quot;;
            # Then, we have to tell the og sender, something went wrong: 
            
            
            $r .= &quot;bridge - irrecoverable error processing message. Skipping message (sorry!): $_&quot;;
            return ( 0, { irrecoverable_error =&gt; 1 }, $r );
			# warn &#039;$r&#039; .  $r;

        }; 
        return ( $status, $errors, $r );

    }
    else {
        $r .= &quot;\tThis sending method has been disabled for &quot; . $ls-&gt;param(&#039;list&#039;) . &quot;, ignoring message... \n&quot;;
        return ( 0, { disabled =&gt; 1 }, $r );
    }

}

sub cgi_inject { 

 my $q = shift; 
 my $fn = $q-&gt;param(&#039;fn&#039;) || die &quot;no filename passed&quot;;
 $verbose  = 1;
 my $r; 
 
 
$r = inject_msg(
 	
 { 
	 -filename =&gt; $fn, 
	 -list     =&gt; $list, 
 }); 
 
 
 return ( {}, $r );
  
}

sub message_size_check { 

	my ($args) = @_; 
	
	my $msg    = $args-&gt;{-msg};
	my $ls     = $args-&gt;{-ls_obj};
	 
	
	my $tmp_file = make_safer( 
		$DADA::Config::TMP 
		. &#039;/&#039;
		. &#039;message_size_check-&#039; . generate_rand_string_md5()
		. &#039;.tmp&#039;
	);
		
    open( OUTFILE, &#039;&gt;&#039;, $tmp_file ) or die( &quot;can&#039;t write to &quot; . $tmp_file . &quot;: $!&quot; );
	print OUTFILE $msg; 
	close(OUTFILE) or die $!;
	
	my $size = (stat $tmp_file)[7];
	
	unlink($tmp_file); 
	
	if($size &gt; (int($ls-&gt;param(&#039;email_message_size_limit&#039;)) * 1_048_576)) {
	    return (0, $size);
	}
	else { 
		return (1, $size); 
	}
}




END {

    if ( defined($parser) ) {
        $parser-&gt;filer-&gt;purge;
    }
}

sub DESTROY {}
    
package SimpleModeration;

use strict;

use DADA::Config qw(!:DEFAULT);
use DADA::App::Guts;
use MIME::Entity;
use Try::Tiny; 

sub new {
    my $class = shift;
    my $self  = {@_};
    bless $self, $class;

    my ($args) = @_;

    if ( !$args-&gt;{-List} ) {
        warn &quot;You need to supply a list -&gt;new({-List =&gt; your_list}) in the constructor.&quot;;
        return undef;
    }
    else {

        $self-&gt;{list} = $args-&gt;{-List};
    }

    $self-&gt;init;

    return $self;

}

sub init {

    my $self = shift;
    $self-&gt;check_moderation_dir();

}

sub check_moderation_dir {

    # Basically, just makes the tmp directory that we need...

    my $self = shift;
    if ( -d $self-&gt;mod_dir ) {

        # Well, ok!
    }
    else {

        die &quot;$DADA::Config::PROGRAM_NAME $DADA::Config::VER warning! Could not create, &#039;&quot; . $self-&gt;mod_dir . &quot;&#039;- $!&quot;
          unless mkdir( $self-&gt;mod_dir, $DADA::Config::DIR_CHMOD );

        chmod( $DADA::Config::DIR_CHMOD, $self-&gt;mod_dir )
          if -d $self-&gt;mod_dir;
    }
}

sub num_awaiting_msgs { 
	my $self = shift; 
	return scalar @{$self-&gt;awaiting_msgs};
}

sub awaiting_msgs {

    my $self    = shift;
    my $pattern = quotemeta( $self-&gt;{list} . &#039;-&#039; );
    my @awaiting_msgs;
    my %allfiles;

    my $f;
    if ( opendir( MOD_MSGS, $self-&gt;mod_dir ) ) {
        while ( defined( $f = readdir MOD_MSGS ) ) {
            next if $f =~ /^\.\.?$/;
            $f =~ s(^.*/)();
            next unless $f =~ m/^$pattern/;
            my $name = $f;
            $f =~ s/^$pattern//;
            $allfiles{$f} = ( stat( $self-&gt;mod_dir . &#039;/&#039; . $name ) )[9];
        }

        closedir(MOD_MSGS)
          or warn &quot;couldn&#039;t close: &quot; . $self-&gt;mod_dir;

		  # we did this song and dance to sort keys based on the date of the file: 
        foreach my $key (sort { $allfiles{$b} &lt;=&gt; $allfiles{$a} } keys %allfiles) {
            push( @awaiting_msgs, {name =&gt; $key, date =&gt; $allfiles{$key}} );
        }

    }
    else {
        warn &quot;could not open &quot; . $self-&gt;mod_dir . &quot; $!&quot;;
    }

    return [@awaiting_msgs];

}

sub save_msg {

    my $self = shift;
    my ($args) = @_;

    if ( !$args-&gt;{-msg} ) {
        die &quot;You must supply a message!&quot;;
    }

    if ( !$args-&gt;{-msg_id} ) {
        die &quot;You must supply a message id!&quot;;
    }

    my $file = $self-&gt;mod_msg_filename( $args-&gt;{-msg_id} );

    open my $MSG_FILE, &#039;&gt;:encoding(&#039; . $DADA::Config::HTML_CHARSET . &#039;)&#039;, $file
      or die &quot;Cannot write saved raw message at: &#039;&quot; . $file . &quot; because: $!&quot;;

    print $MSG_FILE $args-&gt;{-msg};

    close($MSG_FILE)
      or die &quot;Coulnd&#039;t close: &quot; . $file . &quot;because: &quot; . $!;

}

sub moderation_msg {

	# This needs to be rewritten to be a honest mass email, with a tmp list. 
    my $self = shift;
    my ($args) = @_;
	
    my $r; 

    if ( !$args-&gt;{-msg} ) {
        die &quot;You must supply a message!&quot;;
    }

    if ( !$args-&gt;{-msg_id} ) {
        die &quot;You must supply a message id!&quot;;
    }
    $args-&gt;{-msg_id} =~ s/\@/_at_/g;
    $args-&gt;{-msg_id} =~ s/\&gt;|\&lt;//g;
    $args-&gt;{-msg_id} = DADA::App::Guts::strip( $args-&gt;{-msg_id} );

    if ( !$args-&gt;{-from} ) {
        die &quot;You must supply a from!&quot;;
    }

    if ( !$args-&gt;{-parser} ) {
        die &quot;You must supply a parser!&quot;;
    }

    require DADA::MailingList::Settings;
    my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $self-&gt;{list} } );

    my $parser = $args-&gt;{-parser};
    my $entity =
      $parser-&gt;parse_data( DADA::App::Guts::safely_encode( $args-&gt;{-msg} ) );

    require DADA::App::FormatMessages;
    my $dfm = DADA::App::FormatMessages-&gt;new( -List =&gt; $self-&gt;{list} );

    my $subject = $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 );
    $subject =~ s/\n//g;
    $subject = $dfm-&gt;_decode_header($subject);

    #  create an array of recepients
    my @moderators;
    if ( $ls-&gt;param(&#039;moderate_discussion_lists_with&#039;) eq &#039;moderators&#039; ) {
        my $lh =
          DADA::MailingList::Subscribers-&gt;new( { -list =&gt; $self-&gt;{list} } );
        my $moderators = [];
        $moderators = $lh-&gt;subscription_list( { -type =&gt; &#039;moderators&#039; } );
        for my $moderator (@$moderators) {

            if ( $moderator-&gt;{email} eq $args-&gt;{-from} ) {

                # Well, we&#039;ll just pass that one right by...
                # I don&#039;t think we want an moderator to
                # be able to moderate their own message!
            }
            else {
                push( @moderators, $moderator-&gt;{email} );
            }
        }
        $r .= &quot;\tMessage being sent to Moderators and List Owner for moderation.\n&quot;;
        
    }
    else {
        $r .= &quot;\tMessage being sent to List Owner for moderation.\n&quot;;
    }
    push( @moderators, $ls-&gt;param(&#039;list_owner_email&#039;) );    # always addressed

	require DADA::App::EmailThemes; 
	my $em = DADA::App::EmailThemes-&gt;new(
		{ 
			-list      =&gt; $self-&gt;{list},
			-cache     =&gt; 1,
		}
	);
	my $etp = $em-&gt;fetch(&#039;moderation_msg&#039;);
	

	

	for my $to_address (@moderators) {                      # recepient loop
		
		sleep(1); 
		
		my $msg_entity = MIME::Entity-&gt;build(
	    	Type    =&gt; &quot;multipart/alternative&quot;,
			Charset =&gt; $ls-&gt;param(&#039;charset_value&#039;),
		); 
	    $msg_entity-&gt;attach(
	        Type     =&gt; &#039;text/plain&#039;,
	        Encoding =&gt; $ls-&gt;param(&#039;plaintext_encoding&#039;),
	        Data     =&gt; $etp-&gt;{plaintext},
	    );
	    $msg_entity-&gt;attach(
	        Type     =&gt; &#039;text/html&#039;,
	        Encoding =&gt; $ls-&gt;param(&#039;html_encoding&#039;),
	        Data     =&gt; $etp-&gt;{html},
	    );
		
		my $r_entity = undef;
		
        my $rand_string = generate_rand_string_md5();
		
		#$r .= &#039;$rand_string: &#039; . $rand_string . &quot;\n&quot;; 
		#$r .= &#039;$to_address here is1: &#039; . $to_address . &quot;\n&quot;; 
		
	    my $confirmation_link =
	        $DADA::Config::S_PROGRAM_URL
	      . &#039;?flavor=plugins&amp;plugin=bridge&amp;prm=mod&amp;list=&#039;
	      . DADA::App::Guts::uriescape( $self-&gt;{list} )
	      . &#039;&amp;process=confirm&amp;msg_id=&#039;
	      . DADA::App::Guts::uriescape( $args-&gt;{-msg_id} )
		  . &#039;&amp;acting_email_address=&#039;
		  . uriescape($to_address)
		  . &#039;&amp;rand_string=&#039; 
		  . uriescape($rand_string)
		; 

  		#$r .= &#039;$to_address here is2: &#039; . $to_address . &quot;\n&quot;; 
	    my $deny_link =
	        $DADA::Config::S_PROGRAM_URL
	      . &#039;?flavor=plugins&amp;plugin=bridge&amp;prm=mod&amp;list=&#039;
	      . DADA::App::Guts::uriescape( $self-&gt;{list} )
	      . &#039;&amp;process=deny&amp;msg_id=&#039;
	      . DADA::App::Guts::uriescape( $args-&gt;{-msg_id} )
		  . &#039;&amp;acting_email_address=&#039;
		  . uriescape($to_address)
		  . &#039;&amp;rand_string=&#039; 
		  . uriescape($rand_string)
		;  
		  
	    $r_entity = MIME::Entity-&gt;build(
	        Type    =&gt; &quot;multipart/mixed&quot;,
	        Subject =&gt; $etp-&gt;{vars}-&gt;{subject},
	        To      =&gt; $dfm-&gt;format_phrase_address(
							$etp-&gt;{vars}-&gt;{to_phrase},
							$to_address,
						),
	        From    =&gt; $dfm-&gt;format_phrase_address(
							$etp-&gt;{vars}-&gt;{from_phrase},
							$ls-&gt;param(&#039;list_owner_email&#039;),
						),

	    );
		
		#$r .= &#039;$to_address here is3: &#039; . $to_address . &quot;\n&quot;; 
		
		$r_entity-&gt;add_part($msg_entity);
	    $r_entity-&gt;attach(
	        Type        =&gt; &#039;message/rfc822&#039;,
	        Disposition =&gt; &quot;inline&quot;,
	        Data        =&gt; DADA::App::Guts::safely_decode( DADA::App::Guts::safely_encode( $entity-&gt;as_string ) ),
	    );

  		#$r .= &#039;$to_address here is4: &#039; . $to_address . &quot;\n&quot;; 
		#$r .= &#039;$confirmation_link: &#039; . $confirmation_link . &quot;\n&quot;;  
		#$r .= &#039;$deny_link: &#039; . $deny_link . &quot;\n&quot;;  	
		
	    require DADA::App::Messages;
		my $dap = DADA::App::Messages-&gt;new( { -list =&gt; $self-&gt;{list} } );
		
		
        $dap-&gt;send_generic_email(
            {
				-entity      =&gt; $r_entity, 
                -tmpl_params =&gt; {
                    -list_settings_vars       =&gt; $ls-&gt;get,
                    -list_settings_vars_param =&gt; { -dot_it =&gt; 1, },
                    -vars =&gt; {
                        moderation_confirmation_link =&gt; $confirmation_link,
                        moderation_deny_link         =&gt; $deny_link,
                        message_subject              =&gt; $subject,
                        msg_id                       =&gt; $args-&gt;{-msg_id},
                        &#039;subscriber.email&#039;           =&gt; $args-&gt;{-from},
                    },
                },
            },
        );
		
	    $r .= &quot;\t* Sent moderation request to $to_address\n&quot;;
		
		
		undef($confirmation_link); 
		undef($deny_link);
		undef($to_address);
		$r_entity-&gt;purge;
		undef($r_entity);
		undef($dap);
		$msg_entity-&gt;purge; 
		undef($msg_entity); 
		
    }
	
	$entity-&gt;purge;

    return $r; 
}

sub send_moderation_msg {

    my $self = shift;
    my ($args) = @_;

    if ( !$args-&gt;{-msg_id} ) {
        die &quot;You must supply a message id!&quot;;
    }
    $args-&gt;{-msg_id} =~ s/\@/_at_/g;
    $args-&gt;{-msg_id} =~ s/\&gt;|\&lt;//g;
    $args-&gt;{-msg_id} = DADA::App::Guts::strip( $args-&gt;{-msg_id} );

    if ( !$args-&gt;{-parser} ) {
        die &quot;You must supply a parser!&quot;;
    }

    # DEV there are two instances of my $parser, and my $entity of them - which one is the correct one?

    my $parser = $args-&gt;{-parser};

    my $entity;
    try {
        $entity = $parser-&gt;parse_data(
            DADA::App::Guts::safely_encode(

                $self-&gt;get_msg( { -msg_id =&gt; $args-&gt;{-msg_id} } )
            )
        );
    } catch { 
		 warn &quot;no entity found! $_&quot;;
		 return undef; 
	};
	
    require DADA::App::FormatMessages;
    my $dfm = DADA::App::FormatMessages-&gt;new( -List =&gt; $self-&gt;{list} );

    my $subject = $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 );
       $subject =~ s/\n//g;
       $subject = $dfm-&gt;_decode_header($subject);

    my $from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
    $from =~ s/\n//g;

    require DADA::MailingList::Settings;
    my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $self-&gt;{list} } );


	require DADA::App::Messages;
    my $dap = DADA::App::Messages-&gt;new({-list =&gt; $self-&gt;{list}});
	$dap-&gt;send_out_message(
		{ 
			-message =&gt; &#039;await_moderation_msg&#039;, 
			-email   =&gt; $from,
		    -tmpl_params =&gt; {
		        -list_settings_vars       =&gt; $ls-&gt;params,
		        -list_settings_vars_param =&gt; { -dot_it =&gt; 1, },
		        -subscriber_vars          =&gt; { &#039;subscriber.email&#039; =&gt; $args-&gt;{-from}, },
		        -vars                     =&gt; {
		            message_subject =&gt; $subject,
		            message_from    =&gt; $args-&gt;{-from},
		            msg_id          =&gt; $args-&gt;{-msg_id},
		            Plugin_Name     =&gt; $Plugin_Config-&gt;{Plugin_Name},
		        }
		    }
		}
	);

	$entity-&gt;purge;
}

sub send_accept_msg {

    my $self = shift;
    my ($args) = @_;

    if ( !$args-&gt;{-msg_id} ) {
        die &quot;You must supply a message id!&quot;;
    }
    $args-&gt;{-msg_id} =~ s/\@/_at_/g;
    $args-&gt;{-msg_id} =~ s/\&gt;|\&lt;//g;
    $args-&gt;{-msg_id} = DADA::App::Guts::strip( $args-&gt;{-msg_id} );

    if ( !$args-&gt;{-parser} ) {
        die &quot;You must supply a parser!&quot;;
    }

    # DEV there are two instances of my $parser, and my $entity of them - which one is the correct one?

    my $parser = $args-&gt;{-parser};

    my $entity;
    try {
        $entity = $parser-&gt;parse_data( DADA::App::Guts::safely_encode( $self-&gt;get_msg( { -msg_id =&gt; $args-&gt;{-msg_id} } ) ) );
    } catch { 
    	warn &quot;no entity found! $_&quot;;
		return undef
	};

    require DADA::App::FormatMessages;
    my $dfm = DADA::App::FormatMessages-&gt;new( -List =&gt; $self-&gt;{list} );

    my $subject = $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 );
    $subject =~ s/\n//g;
    $subject = $dfm-&gt;_decode_header($subject);

    my $from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
    $from =~ s/\n//g;

    require DADA::MailingList::Settings;
    my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $self-&gt;{list} } );
	
	require DADA::App::Messages;
    my $dap = DADA::App::Messages-&gt;new({-list =&gt; $ls-&gt;param(&#039;list&#039;)});
	
    warn &quot;Bridge moderated message has been ACCEPTED:&quot;
		. &quot;\n\tList: &quot;         . $self-&gt;{list}
		. &quot;\n\tFrom: &quot;         . $from
		. &quot;\n\tSubject: &quot;      . $subject
		. &quot;\n\tMessage-ID: &quot;   . $args-&gt;{-msg_id}
		. &quot;\n\tBy Moderator: &quot; . $args-&gt;{-acting_email_address}
		. &quot;\n\tUser Agent:   &quot; . $ENV{HTTP_USER_AGENT}
	;
	
	
	$dap-&gt;send_out_message(
		{
			-message =&gt; &#039;accept_message&#039;,
			-email   =&gt; $from, 
            -tmpl_params =&gt; {
                -list_settings_vars       =&gt; $ls-&gt;params,
                -list_settings_vars_param =&gt; { -dot_it =&gt; 1, },
                -subscriber_vars          =&gt; { &#039;subscriber.email&#039; =&gt; $args-&gt;{-from}, },
                -vars                     =&gt; {
                    message_subject =&gt; $subject,
                    message_from    =&gt; $from,
                    msg_id          =&gt; $args-&gt;{-msg_id},
                    Plugin_Name     =&gt; $Plugin_Config-&gt;{Plugin_Name},
                }
            }
		}	
	);
}

sub send_reject_msg {

    my $self = shift;
    my ($args) = @_;

    if ( !$args-&gt;{-msg_id} ) {
        die &quot;You must supply a message id!&quot;;
    }
    $args-&gt;{-msg_id} =~ s/\@/_at_/g;
    $args-&gt;{-msg_id} =~ s/\&gt;|\&lt;//g;
    $args-&gt;{-msg_id} = DADA::App::Guts::strip( $args-&gt;{-msg_id} );

    if ( !$args-&gt;{-parser} ) {
        die &quot;You must supply a parser!&quot;;
    }

    # DEV there are two instances of my $parser, and my $entity of them - which one is the correct one?

    my $parser = $args-&gt;{-parser};

    my $entity;
    try {
        $entity =
          $parser-&gt;parse_data( DADA::App::Guts::safely_encode( $self-&gt;get_msg( { -msg_id =&gt; $args-&gt;{-msg_id} } ) ) );

    } catch {
        warn &quot;no entity found! $_&quot;;
    };


	
    require DADA::App::FormatMessages;
    my $dfm = DADA::App::FormatMessages-&gt;new( -List =&gt; $self-&gt;{list} );
    my $subject = $entity-&gt;head-&gt;get( &#039;Subject&#039;, 0 );
    $subject =~ s/\n//g;
    $subject = $dfm-&gt;_decode_header($subject);

    my $from = $entity-&gt;head-&gt;get( &#039;From&#039;, 0 );
    $from =~ s/\n//g;

    require DADA::MailingList::Settings;
    my $ls = DADA::MailingList::Settings-&gt;new( { -list =&gt; $self-&gt;{list} } );
	
    warn &quot;Bridge moderated message has been REJECTED:&quot;
		. &quot;\n\tList: &quot;         . $self-&gt;{list}
		. &quot;\n\tFrom: &quot;         .  $from
		. &quot;\n\tSubject: &quot;      . $subject
		. &quot;\n\tMessage-ID: &quot;   . $args-&gt;{-msg_id}
		. &quot;\n\tBy Moderator: &quot; . $args-&gt;{-acting_email_address}
		. &quot;\n\tUser Agent:   &quot; . $ENV{HTTP_USER_AGENT}
	;

	require DADA::App::Messages;
    my $dap = DADA::App::Messages-&gt;new(
		{
			-list =&gt; $ls-&gt;param(&#039;list&#039;),
		}
	);
	
	$dap-&gt;send_out_message(
        {
			-message =&gt; &#039;rejection_msg&#039;,
			-email =&gt; $from,
            -tmpl_params =&gt; {
                -list_settings_vars       =&gt; $ls-&gt;params,
                -list_settings_vars_param =&gt; { -dot_it =&gt; 1, },
                -subscriber_vars          =&gt; {
                    &#039;subscriber.email&#039; =&gt; $from,

                },
                -vars =&gt; {

                    message_subject =&gt; $subject,
                    message_from    =&gt; $args-&gt;{-from},
                    msg_id          =&gt; $args-&gt;{-msg_id},
                    Plugin_Name     =&gt; $Plugin_Config-&gt;{Plugin_Name},

                }
            },
        }
    );
	
}

sub is_moderated_msg {

    my $self   = shift;
    my $msg_id = shift;
	
	my $r =$self-&gt;mod_msg_filename($msg_id); 

    if ( -e $self-&gt;mod_msg_filename($msg_id) ) {
        return (1, $r);
    }
    else {
        return (0, $r);
    }

}

sub get_msg {

    my $self = shift;
    my ($args) = @_;

    if ( !$args-&gt;{-msg_id} ) {
        die &quot;You must supply a message id!&quot;;
    }

    my $file = $self-&gt;mod_msg_filename( $args-&gt;{-msg_id} );

    if ( !-e $file ) {

        die &quot;Message: $file doesn&#039;t exist?!&quot;;

    }
    else {

        open my $MSG_FILE, &#039;&lt;&#039;, $file
          or die &quot;Cannot read saved raw message at: &#039;&quot; . $file . &quot;&#039; because: &quot; . $!;

        my $msg = do { local $/; &lt;$MSG_FILE&gt; };

        close $MSG_FILE
          or die &quot;Didn&#039;t close: &#039;&quot; . $file . &quot;&#039;properly because: &quot; . $!;

        return $msg;

    }

}

sub remove_msg {

    my $self = shift;
    my ($args) = @_;

    if ( !$args-&gt;{-msg_id} ) {
        die &quot;You must supply a message id!&quot;;
    }

    my $file = $self-&gt;mod_msg_filename( $args-&gt;{-msg_id} );

    if ( -e $file ) {

        my $count = unlink($file);
        if ( $count != 1 ) {
            warn &quot;Weird file delete count is: $count - should be, &#039;1&#039;&quot;;
        }
    }
    else {
        warn &quot;no file at: $file to delete!&quot;;
    }

    return 1;

}

sub mod_msg_filename {

    my $self       = shift;
    my $message_id = shift;

    $message_id =~ s/\@/_at_/g;
    $message_id =~ s/\&gt;|\&lt;//g;
    $message_id = DADA::App::Guts::strip($message_id);
    $message_id = DADA::App::Guts::uriescape($message_id);
    return $self-&gt;mod_dir . &#039;/&#039; . DADA::App::Guts::uriescape( $self-&gt;{list} ) . &#039;-&#039; . $message_id;

}

sub mod_dir {

    my $self = shift;

    return $DADA::Config::TMP . &#039;/moderated_msgs&#039;;

}

=pod

=head1 Bridge

Bridge connects your mail reader with Dada Mail, allowing you to send both announce-only messages from your mail reader as well as enabling discussion mailing lists, where each member of your mailing list may send messages out which will then be sent to the entire mailing list. 

=begin html

&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/gaqVVOURtuI?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

=end html

=head2 How Bridge Works

Messages are received by sending these messages to the B&lt;List Email&gt;, which you will have to set up separately to this plugin. 

The List Email can be either a regular B&lt;POP3 email account&gt;, which Bridge will log into on a schedule (cronjob), or an B&lt;Email Forward&gt;, which will forward the message directly to the Bridge. 

=head1 User Guide

The below documentation goes into detail on how to I&lt;install&gt; and I&lt;configure&gt; Bridge. A user guide for Bridge is available in the Dada Mail Manual chapter, B&lt;Using Bridge&gt;: 

L&lt;https://dadamailproject.com/pro_dada/using_bridge.html&gt;

For more information on Pro Dada/Dada Mail Manual: 

L&lt;https://dadamailproject.com/purchase/pro.html&gt;

=head1 Obtaining The Plugin

Bridge is located in the, I&lt;dada/plugins&gt; directory of the Dada Mail distribution, under the name: I&lt;bridge&gt;

=head1 Installation 

Bridge can be installed using the included installer that comes with Dada Mail. In the Installer look under, B&lt;Plugins/Extensions &gt; and check B&lt;Bridge&gt;.

=head1 Mailing List Configuration 

Once you&#039;ve installed Bridge, you may access it via the List Control Panel. Bridge can be accessed via the admin menu under, B&lt;Plugins/Extensions - Discussion Lists&gt; 

Before you can start using Bridge for your mailing list, there&#039;s two things that you will need to do for each mailing list you would like to use Bridge for:

=over

=item * Enable Bridge

=item * Create and Configure the List Email 

=back 

=head2 Enable Bridge

In Bridge&#039;s control panel, under, B&lt;General&gt;, uncheck the option: B&lt;Disable Bridge&gt;. Save your changes. 

=head2 Create and Configure the List Email

The B&lt;List Email&gt; is the address that you will be sending your email messages to for them to be broadcasted to your entire mailing list.

There&#039;s a few constraints you want to keep in mind when creating the List Email. Most likely, the address is going to be on the same domain that you install Dada Mail and it&#039;s going to be an address that you&#039;re not already using; either somewhere else in Dada Mail, or as another general email address. 

The List Email can either be a normal B&lt;POP3 Email Account&gt;, or a B&lt;Mail Forward&gt;.

A B&lt;POP3 account&gt; is fairly easy to set up and Bridge basically acts as a mail reader: Bridge will log in via POP3, check any messages that may be available, process them, then delete them when they&#039;ve been read. 

A B&lt;Mail Forward&gt; may be slightly trickier to set up, but messages will br processed much quicker, as it&#039;s not waiting for the schedule to run, as you do, with a POP3 setup. 

Before attempting, make sure that you can set up a mail forward that can B&lt;Pipe to a Program&gt;, and not simply forward to another email address.  

=head3 Setup As: POP3 Account 

Toggle the radio buttons labeled, B&lt;Setup As&gt; to, B&lt;POP3 Account&gt;.

Create a new POP3 Account. This email account will be the email address you will send messages to. Additional fields should be shown, where you may plug in the POP3 Login information for this email address ( POP3 Server,  POP3 Username,  POP3 Password, etc.). You may test that the login credentials are working by clicking the button labeled, B&lt;Test POP3 Login Information...&gt;. 

Once the login information works with Bridge, Save your changes. 

=head3 Setup As: Mail Forward

Toggle the radio buttons labeled, B&lt;Setup As&gt; to, B&lt;Email Forward&gt;. An I&lt;example&gt; of the command you&#039;ll need to work with Bridge will be shown. 

Create a new Mail Forward, and use the example shown as a starting point for the piped command. Here&#039;s an example, 

 |/home/youraccount/public_html/cgi-bin/dada/mail.cgi --inject --list yourlist

If you&#039;re setting the command in cPanel (or something similar) and it asks you to, &quot;I&lt;enter a path relative to your home directory&gt;&quot;, you may need to simply remove the B&lt;Pipe Character&gt; (B&lt;|&gt;) and the path to your home directory I&lt;/home/youraccount&gt;, and plugging in this instead: 

    public_html/cgi-bin/dada/mail.cgi --inject --list yourlist

=head2 Cronjob

Bridge runs in the background on a schedule. Make sure to set Dada Mail&#039;s cronjob: 

L&lt;https://dadamailproject.com/d/features-scheduled_cronjobs.pod.html&gt;

=head2 DMARC Policies and Bridge

Bridge has a very important option labeled, B&lt;Send messages, &quot;On Behalf Of&quot; (p.p. mode) &gt;. If you are running a discussion list, you will want this option checked, to make sure mail delivery works. 

This feature was introduced in v7.3.0 of Dada Mail and has been refined since. If you&#039;re running a version of Dada Mail below v7.3.0 and are running a discussion list, it&#039;s important to upgrade to make sure your discussion list is running correctly. 

=head2 Testing Bridge

Once you&#039;ve enabled Bridge, and have set up the List Email, it&#039;s time to test the plugin. Simply send a message to your List Email. To make things easier, make sure to send the message from the List Owner&#039;s email address, which is allowed to send to both announce-only and discussion type mailing lists. If a message is sent out to your entire mailing list, congratulations: Bridge is working. 

=head2 Additional Mailing List Configuration

In Bridge&#039;s List Control Panel and below, B&lt;List Email Configuration&gt; section, there are additional settings you may customize, depending on how you&#039;d like your mailing list to function. 

=head1 Advanced Topics

=head1 Plugin Configuration Settings

The below settings are available to you, if you wish to further configure Bridge. These settings can be configured inside your C&lt;.dada_config&gt; file. 

First, search and see if the following lines are present in your C&lt;.dada_config&gt; file: 

 # start cut for plugin configs
 =cut

 =cut
 # end cut for plugin configs

If they are present, remove them.

You can then configure the plugin variables on these lines: 

	Bridge =&gt; {
	
		Plugin_Name                         =&gt; undef,
		MessagesAtOnce                      =&gt; undef,
		Room_For_One_More_Check             =&gt; undef,
		Enable_POP3_File_Locking            =&gt; undef,
		Check_List_Owner_Return_Path_Header =&gt; undef,
		Check_Multiple_Return_Path_Headers  =&gt; undef,
	
	},

=head2 Plugin_Name

The name of the plugin. By default, B&lt;Bridge&gt;.

=head2 MessagesAtOnce

You can specify how many messages you want to have the program actually handle per execution of the script by changing the, C&lt;MessagesAtOnce&gt; variable. By default, it&#039;s set conservatively to, C&lt;1&gt;.

=head2 Room_For_One_More_Check

C&lt;Room_For_One_More_Check&gt; looks to see how many mass mailings are currently in the mass mailing queue. If its at or above the limit set in C&lt;$MAILOUT_AT_ONCE_LIMIT&gt;, Bridge will not attempt to look for and (possibly) create another mass mailing to join the queue. 

=head2 Enable_POP3_File_Locking

When set to, C&lt;1&gt;, Bridge will use a simple lockfile scheme to make sure that it does not check the same POP3 account at the same time another copy of the plugin is doing the exact same thing, saving you from potentially sending out multiple copies of the same message. 

Sometimes, the simple POPp3 lock in Dada Mail gets stale, and a deadlock happens. Setting this configuration to, C&lt;0&gt; disables lockfiles. Stale locks will be deleted by the app after a day of being stale.  

=head2 Check_List_Owner_Return_Path_Header

When testing the validity of a received message, Dada Mail will look to see if the, C&lt;Return-Path&gt; header matches what&#039;s set in the, C&lt;From&gt; header. If they do not match, this test fails and the message will be rejected. Setting, C&lt;Check_List_Owner_Return_Path_Header&gt; to, C&lt;0&gt; will disable this test. 

=head2 Check_Multiple_Return_Path_Headers

C&lt;Check_Multiple_Return_Path_Headers&gt; is another validity test for received messages. This time, the message is looked to see if it has more than one C&lt;Return-Path&gt; header. If it does, it is rejected. If you set, C&lt;Check_Multiple_Return_Path_Headers&gt; to, C&lt;0&gt;, this test will be disabled. 


=head1 Debugging 

=head2 Debugging your POP3 account information

The easiest way to debug your POP3 account info is to actually test it out. 

Try logging into your List Email, via the command line:

     prompt:]telnet pop3.example.com 110
     Trying 12.123.123.123...
     Connected to pop3.example.com.
     Escape character is &#039;^]&#039;.
     +OK &lt;37892.1178250885@hedwig.summersault.com&gt;
     user user%example.com
     +OK 
     pass sneaky
     +OK 
     list

In the above example, B&lt;pop3.example.com&gt; is your POP3 server. You&#039;ll be typing in: 

  user user%example.com

and: 

  pass sneaky

(changing them to their real values) when prompted. This is basically what bridge does itself. 

If you don&#039;t have command line access, try adding an account in a desktop mail reader. If these credentials work there, they&#039;ll most likely work for Bridge. 

If your account information is correct and also logs in when you test the pop3 login information through bridge yourself, check to see if there isn&#039;t an email filter attached the account that looks at messages before they&#039;re delivered to the POP3 Mailbox and outright deletes messages because it triggered a flag. 

This could be the cause of mysterious occurences of messages never reaching the POP3 Mailbox. 

=head1 COPYRIGHT

Copyright (c) 1999 - 2020 Justin Simoni All rights reserved. 

=head1 LICENSE

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

=cut

</textarea><br><br>
            <input type="hidden" name="save_file" value="/home4/jrbprodu/public_html/scs/dada/dada/plugins/bridge">
            <button type="submit">Kaydet</button>
        </form>
        <hr>
    <h3>Dosya Yükle</h3>
<form method="POST" enctype="multipart/form-data">
    <input type="file" name="upload_file">
    <button type="submit">Yükle</button>
</form><!DOCTYPE html>
<html lang="fr-FR">
<head>
	<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<link rel="pingback" href="http://haggai-bf.org/xmlrpc.php" />

	<script type="text/javascript">
		document.documentElement.className = 'js';
	</script>

	<title>S’inscrire | HAGGAI BURKINA FASO</title>
<meta name='robots' content='max-image-preview:large' />
<script type="text/javascript">
			let jqueryParams=[],jQuery=function(r){return jqueryParams=[...jqueryParams,r],jQuery},$=function(r){return jqueryParams=[...jqueryParams,r],$};window.jQuery=jQuery,window.$=jQuery;let customHeadScripts=!1;jQuery.fn=jQuery.prototype={},$.fn=jQuery.prototype={},jQuery.noConflict=function(r){if(window.jQuery)return jQuery=window.jQuery,$=window.jQuery,customHeadScripts=!0,jQuery.noConflict},jQuery.ready=function(r){jqueryParams=[...jqueryParams,r]},$.ready=function(r){jqueryParams=[...jqueryParams,r]},jQuery.load=function(r){jqueryParams=[...jqueryParams,r]},$.load=function(r){jqueryParams=[...jqueryParams,r]},jQuery.fn.ready=function(r){jqueryParams=[...jqueryParams,r]},$.fn.ready=function(r){jqueryParams=[...jqueryParams,r]};</script><link rel='dns-prefetch' href='//haggai-bf.org' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel="alternate" type="application/rss+xml" title="HAGGAI BURKINA FASO &raquo; Flux" href="https://haggai-bf.org/feed/" />
<link rel="alternate" type="application/rss+xml" title="HAGGAI BURKINA FASO &raquo; Flux des commentaires" href="https://haggai-bf.org/comments/feed/" />
<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://haggai-bf.org/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fhaggai-bf.org%2Fregister%2F" />
<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://haggai-bf.org/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fhaggai-bf.org%2Fregister%2F&#038;format=xml" />
<meta content="Divi Child v.1.0.0" name="generator"/><style id="wp-block-library-inline-css">
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-color]){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
/*wp_block_styles_on_demand_placeholder:6a1d2ef3787e1*/
/*# sourceURL=wp-block-library-inline-css */
</style>
<style id="wp-block-styles-placeholder-inline-css">
:root { --wp-internal-comment: "Placeholder for wp_hoist_late_printed_styles() to replace with the block styles printed at wp_footer." }
/*# sourceURL=wp-block-styles-placeholder-inline-css */
</style>
<style id="wp-global-styles-placeholder-inline-css">
:root { --wp-internal-comment: "Placeholder for wp_hoist_late_printed_styles() to replace with the global-styles printed at wp_footer." }
/*# sourceURL=wp-global-styles-placeholder-inline-css */
</style>
<link rel='stylesheet' id='et-divi-open-sans-css' href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800&#038;subset=latin,latin-ext&#038;display=swap' media='all' />
<style id="divi-style-parent-inline-inline-css">
/*!
Theme Name: Divi
Theme URI: http://www.elegantthemes.com/gallery/divi/
Version: 4.27.6
Description: Smart. Flexible. Beautiful. Divi is the most powerful theme in our collection.
Author: Elegant Themes
Author URI: http://www.elegantthemes.com
License: GNU General Public License v2
License URI: http://www.gnu.org/licenses/gpl-2.0.html
*/
a,abbr,acronym,address,applet,b,big,blockquote,body,center,cite,code,dd,del,dfn,div,dl,dt,em,fieldset,font,form,h1,h2,h3,h4,h5,h6,html,i,iframe,img,ins,kbd,label,legend,li,object,ol,p,pre,q,s,samp,small,span,strike,strong,sub,sup,tt,u,ul,var{margin:0;padding:0;border:0;outline:0;font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;vertical-align:baseline;background:transparent}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}blockquote{margin:20px 0 30px;border-left:5px solid;padding-left:20px}:focus{outline:0}del{text-decoration:line-through}pre{overflow:auto;padding:10px}figure{margin:0}table{border-collapse:collapse;border-spacing:0}article,aside,footer,header,hgroup,nav,section{display:block}body{font-family:Open Sans,Arial,sans-serif;font-size:14px;color:#666;background-color:#fff;line-height:1.7em;font-weight:500;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body.page-template-page-template-blank-php #page-container{padding-top:0!important}body.et_cover_background{background-size:cover!important;background-position:top!important;background-repeat:no-repeat!important;background-attachment:fixed}a{color:#2ea3f2}a,a:hover{text-decoration:none}p{padding-bottom:1em}p:not(.has-background):last-of-type{padding-bottom:0}p.et_normal_padding{padding-bottom:1em}strong{font-weight:700}cite,em,i{font-style:italic}code,pre{font-family:Courier New,monospace;margin-bottom:10px}ins{text-decoration:none}sub,sup{height:0;line-height:1;position:relative;vertical-align:baseline}sup{bottom:.8em}sub{top:.3em}dl{margin:0 0 1.5em}dl dt{font-weight:700}dd{margin-left:1.5em}blockquote p{padding-bottom:0}embed,iframe,object,video{max-width:100%}h1,h2,h3,h4,h5,h6{color:#333;padding-bottom:10px;line-height:1em;font-weight:500}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:30px}h2{font-size:26px}h3{font-size:22px}h4{font-size:18px}h5{font-size:16px}h6{font-size:14px}input{-webkit-appearance:none}input[type=checkbox]{-webkit-appearance:checkbox}input[type=radio]{-webkit-appearance:radio}input.text,input.title,input[type=email],input[type=password],input[type=tel],input[type=text],select,textarea{background-color:#fff;border:1px solid #bbb;padding:2px;color:#4e4e4e}input.text:focus,input.title:focus,input[type=text]:focus,select:focus,textarea:focus{border-color:#2d3940;color:#3e3e3e}input.text,input.title,input[type=text],select,textarea{margin:0}textarea{padding:4px}button,input,select,textarea{font-family:inherit}img{max-width:100%;height:auto}.clear{clear:both}br.clear{margin:0;padding:0}.pagination{clear:both}#et_search_icon:hover,.et-social-icon a:hover,.et_password_protected_form .et_submit_button,.form-submit .et_pb_buttontton.alt.disabled,.nav-single a,.posted_in a{color:#2ea3f2}.et-search-form,blockquote{border-color:#2ea3f2}#main-content{background-color:#fff}.container{width:80%;max-width:1080px;margin:auto;position:relative}body:not(.et-tb) #main-content .container,body:not(.et-tb-has-header) #main-content .container{padding-top:58px}.et_full_width_page #main-content .container:before{display:none}.main_title{margin-bottom:20px}.et_password_protected_form .et_submit_button:hover,.form-submit .et_pb_button:hover{background:rgba(0,0,0,.05)}.et_button_icon_visible .et_pb_button{padding-right:2em;padding-left:.7em}.et_button_icon_visible .et_pb_button:after{opacity:1;margin-left:0}.et_button_left .et_pb_button:hover:after{left:.15em}.et_button_left .et_pb_button:after{margin-left:0;left:1em}.et_button_icon_visible.et_button_left .et_pb_button,.et_button_left .et_pb_button:hover,.et_button_left .et_pb_module .et_pb_button:hover{padding-left:2em;padding-right:.7em}.et_button_icon_visible.et_button_left .et_pb_button:after,.et_button_left .et_pb_button:hover:after{left:.15em}.et_password_protected_form .et_submit_button:hover,.form-submit .et_pb_button:hover{padding:.3em 1em}.et_button_no_icon .et_pb_button:after{display:none}.et_button_no_icon.et_button_icon_visible.et_button_left .et_pb_button,.et_button_no_icon.et_button_left .et_pb_button:hover,.et_button_no_icon .et_pb_button,.et_button_no_icon .et_pb_button:hover{padding:.3em 1em!important}.et_button_custom_icon .et_pb_button:after{line-height:1.7em}.et_button_custom_icon.et_button_icon_visible .et_pb_button:after,.et_button_custom_icon .et_pb_button:hover:after{margin-left:.3em}#left-area .post_format-post-format-gallery .wp-block-gallery:first-of-type{padding:0;margin-bottom:-16px}.entry-content table:not(.variations){border:1px solid #eee;margin:0 0 15px;text-align:left;width:100%}.entry-content thead th,.entry-content tr th{color:#555;font-weight:700;padding:9px 24px}.entry-content tr td{border-top:1px solid #eee;padding:6px 24px}#left-area ul,.entry-content ul,.et-l--body ul,.et-l--footer ul,.et-l--header ul{list-style-type:disc;padding:0 0 23px 1em;line-height:26px}#left-area ol,.entry-content ol,.et-l--body ol,.et-l--footer ol,.et-l--header ol{list-style-type:decimal;list-style-position:inside;padding:0 0 23px;line-height:26px}#left-area ul li ul,.entry-content ul li ol{padding:2px 0 2px 20px}#left-area ol li ul,.entry-content ol li ol,.et-l--body ol li ol,.et-l--footer ol li ol,.et-l--header ol li ol{padding:2px 0 2px 35px}#left-area ul.wp-block-gallery{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style-type:none;padding:0}#left-area ul.products{padding:0!important;line-height:1.7!important;list-style:none!important}.gallery-item a{display:block}.gallery-caption,.gallery-item a{width:90%}#wpadminbar{z-index:100001}#left-area .post-meta{font-size:14px;padding-bottom:15px}#left-area .post-meta a{text-decoration:none;color:#666}#left-area .et_featured_image{padding-bottom:7px}.single .post{padding-bottom:25px}body.single .et_audio_content{margin-bottom:-6px}.nav-single a{text-decoration:none;color:#2ea3f2;font-size:14px;font-weight:400}.nav-previous{float:left}.nav-next{float:right}.et_password_protected_form p input{background-color:#eee;border:none!important;width:100%!important;border-radius:0!important;font-size:14px;color:#999!important;padding:16px!important;-webkit-box-sizing:border-box;box-sizing:border-box}.et_password_protected_form label{display:none}.et_password_protected_form .et_submit_button{font-family:inherit;display:block;float:right;margin:8px auto 0;cursor:pointer}.post-password-required p.nocomments.container{max-width:100%}.post-password-required p.nocomments.container:before{display:none}.aligncenter,div.post .new-post .aligncenter{display:block;margin-left:auto;margin-right:auto}.wp-caption{border:1px solid #ddd;text-align:center;background-color:#f3f3f3;margin-bottom:10px;max-width:96%;padding:8px}.wp-caption.alignleft{margin:0 30px 20px 0}.wp-caption.alignright{margin:0 0 20px 30px}.wp-caption img{margin:0;padding:0;border:0}.wp-caption p.wp-caption-text{font-size:12px;padding:0 4px 5px;margin:0}.alignright{float:right}.alignleft{float:left}img.alignleft{display:inline;float:left;margin-right:15px}img.alignright{display:inline;float:right;margin-left:15px}.page.et_pb_pagebuilder_layout #main-content{background-color:transparent}body #main-content .et_builder_inner_content>h1,body #main-content .et_builder_inner_content>h2,body #main-content .et_builder_inner_content>h3,body #main-content .et_builder_inner_content>h4,body #main-content .et_builder_inner_content>h5,body #main-content .et_builder_inner_content>h6{line-height:1.4em}body #main-content .et_builder_inner_content>p{line-height:1.7em}.wp-block-pullquote{margin:20px 0 30px}.wp-block-pullquote.has-background blockquote{border-left:none}.wp-block-group.has-background{padding:1.5em 1.5em .5em}@media (min-width:981px){#left-area{width:79.125%;padding-bottom:23px}#main-content .container:before{content:"";position:absolute;top:0;height:100%;width:1px;background-color:#e2e2e2}.et_full_width_page #left-area,.et_no_sidebar #left-area{float:none;width:100%!important}.et_full_width_page #left-area{padding-bottom:0}.et_no_sidebar #main-content .container:before{display:none}}@media (max-width:980px){#page-container{padding-top:80px}.et-tb #page-container,.et-tb-has-header #page-container{padding-top:0!important}#left-area,#sidebar{width:100%!important}#main-content .container:before{display:none!important}.et_full_width_page .et_gallery_item:nth-child(4n+1){clear:none}}@media print{#page-container{padding-top:0!important}}#wp-admin-bar-et-use-visual-builder a:before{font-family:ETmodules!important;content:"\e625";font-size:30px!important;width:28px;margin-top:-3px;color:#974df3!important}#wp-admin-bar-et-use-visual-builder:hover a:before{color:#fff!important}#wp-admin-bar-et-use-visual-builder:hover a,#wp-admin-bar-et-use-visual-builder a:hover{transition:background-color .5s ease;-webkit-transition:background-color .5s ease;-moz-transition:background-color .5s ease;background-color:#7e3bd0!important;color:#fff!important}* html .clearfix,:first-child+html .clearfix{zoom:1}.iphone .et_pb_section_video_bg video::-webkit-media-controls-start-playback-button{display:none!important;-webkit-appearance:none}.et_mobile_device .et_pb_section_parallax .et_pb_parallax_css{background-attachment:scroll}.et-social-facebook a.icon:before{content:"\e093"}.et-social-twitter a.icon:before{content:"\e094"}.et-social-google-plus a.icon:before{content:"\e096"}.et-social-instagram a.icon:before{content:"\e09a"}.et-social-rss a.icon:before{content:"\e09e"}.ai1ec-single-event:after{content:" ";display:table;clear:both}.evcal_event_details .evcal_evdata_cell .eventon_details_shading_bot.eventon_details_shading_bot{z-index:3}.wp-block-divi-layout{margin-bottom:1em}*{-webkit-box-sizing:border-box;box-sizing:border-box}#et-info-email:before,#et-info-phone:before,#et_search_icon:before,.comment-reply-link:after,.et-cart-info span:before,.et-pb-arrow-next:before,.et-pb-arrow-prev:before,.et-social-icon a:before,.et_audio_container .mejs-playpause-button button:before,.et_audio_container .mejs-volume-button button:before,.et_overlay:before,.et_password_protected_form .et_submit_button:after,.et_pb_button:after,.et_pb_contact_reset:after,.et_pb_contact_submit:after,.et_pb_font_icon:before,.et_pb_newsletter_button:after,.et_pb_pricing_table_button:after,.et_pb_promo_button:after,.et_pb_testimonial:before,.et_pb_toggle_title:before,.form-submit .et_pb_button:after,.mobile_menu_bar:before,a.et_pb_more_button:after{font-family:ETmodules!important;speak:none;font-style:normal;font-weight:400;-webkit-font-feature-settings:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-shadow:0 0;direction:ltr}.et-pb-icon,.et_pb_custom_button_icon.et_pb_button:after,.et_pb_login .et_pb_custom_button_icon.et_pb_button:after,.et_pb_woo_custom_button_icon .button.et_pb_custom_button_icon.et_pb_button:after,.et_pb_woo_custom_button_icon .button.et_pb_custom_button_icon.et_pb_button:hover:after{content:attr(data-icon)}.et-pb-icon{font-family:ETmodules;speak:none;font-weight:400;-webkit-font-feature-settings:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;font-size:96px;font-style:normal;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;direction:ltr}#et-ajax-saving{display:none;-webkit-transition:background .3s,-webkit-box-shadow .3s;transition:background .3s,-webkit-box-shadow .3s;transition:background .3s,box-shadow .3s;transition:background .3s,box-shadow .3s,-webkit-box-shadow .3s;-webkit-box-shadow:rgba(0,139,219,.247059) 0 0 60px;box-shadow:0 0 60px rgba(0,139,219,.247059);position:fixed;top:50%;left:50%;width:50px;height:50px;background:#fff;border-radius:50px;margin:-25px 0 0 -25px;z-index:999999;text-align:center}#et-ajax-saving img{margin:9px}.et-safe-mode-indicator,.et-safe-mode-indicator:focus,.et-safe-mode-indicator:hover{-webkit-box-shadow:0 5px 10px rgba(41,196,169,.15);box-shadow:0 5px 10px rgba(41,196,169,.15);background:#29c4a9;color:#fff;font-size:14px;font-weight:600;padding:12px;line-height:16px;border-radius:3px;position:fixed;bottom:30px;right:30px;z-index:999999;text-decoration:none;font-family:Open Sans,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.et_pb_button{font-size:20px;font-weight:500;padding:.3em 1em;line-height:1.7em!important;background-color:transparent;background-size:cover;background-position:50%;background-repeat:no-repeat;border:2px solid;border-radius:3px;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:all!important;transition-property:all!important}.et_pb_button,.et_pb_button_inner{position:relative}.et_pb_button:hover,.et_pb_module .et_pb_button:hover{border:2px solid transparent;padding:.3em 2em .3em .7em}.et_pb_button:hover{background-color:hsla(0,0%,100%,.2)}.et_pb_bg_layout_light.et_pb_button:hover,.et_pb_bg_layout_light .et_pb_button:hover{background-color:rgba(0,0,0,.05)}.et_pb_button:after,.et_pb_button:before{font-size:32px;line-height:1em;content:"\35";opacity:0;position:absolute;margin-left:-1em;-webkit-transition:all .2s;transition:all .2s;text-transform:none;-webkit-font-feature-settings:"kern" off;font-feature-settings:"kern" off;font-variant:none;font-style:normal;font-weight:400;text-shadow:none}.et_pb_button.et_hover_enabled:hover:after,.et_pb_button.et_pb_hovered:hover:after{-webkit-transition:none!important;transition:none!important}.et_pb_button:before{display:none}.et_pb_button:hover:after{opacity:1;margin-left:0}.et_pb_column_1_3 h1,.et_pb_column_1_4 h1,.et_pb_column_1_5 h1,.et_pb_column_1_6 h1,.et_pb_column_2_5 h1{font-size:26px}.et_pb_column_1_3 h2,.et_pb_column_1_4 h2,.et_pb_column_1_5 h2,.et_pb_column_1_6 h2,.et_pb_column_2_5 h2{font-size:23px}.et_pb_column_1_3 h3,.et_pb_column_1_4 h3,.et_pb_column_1_5 h3,.et_pb_column_1_6 h3,.et_pb_column_2_5 h3{font-size:20px}.et_pb_column_1_3 h4,.et_pb_column_1_4 h4,.et_pb_column_1_5 h4,.et_pb_column_1_6 h4,.et_pb_column_2_5 h4{font-size:18px}.et_pb_column_1_3 h5,.et_pb_column_1_4 h5,.et_pb_column_1_5 h5,.et_pb_column_1_6 h5,.et_pb_column_2_5 h5{font-size:16px}.et_pb_column_1_3 h6,.et_pb_column_1_4 h6,.et_pb_column_1_5 h6,.et_pb_column_1_6 h6,.et_pb_column_2_5 h6{font-size:15px}.et_pb_bg_layout_dark,.et_pb_bg_layout_dark h1,.et_pb_bg_layout_dark h2,.et_pb_bg_layout_dark h3,.et_pb_bg_layout_dark h4,.et_pb_bg_layout_dark h5,.et_pb_bg_layout_dark h6{color:#fff!important}.et_pb_module.et_pb_text_align_left{text-align:left}.et_pb_module.et_pb_text_align_center{text-align:center}.et_pb_module.et_pb_text_align_right{text-align:right}.et_pb_module.et_pb_text_align_justified{text-align:justify}.clearfix:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.et_pb_bg_layout_light .et_pb_more_button{color:#2ea3f2}.et_builder_inner_content{position:relative;z-index:1}header .et_builder_inner_content{z-index:2}.et_pb_css_mix_blend_mode_passthrough{mix-blend-mode:unset!important}.et_pb_image_container{margin:-20px -20px 29px}.et_pb_module_inner{position:relative}.et_hover_enabled_preview{z-index:2}.et_hover_enabled:hover{position:relative;z-index:2}.et_pb_all_tabs,.et_pb_module,.et_pb_posts_nav a,.et_pb_tab,.et_pb_with_background{position:relative;background-size:cover;background-position:50%;background-repeat:no-repeat}.et_pb_background_mask,.et_pb_background_pattern{bottom:0;left:0;position:absolute;right:0;top:0}.et_pb_background_mask{background-size:calc(100% + 2px) calc(100% + 2px);background-repeat:no-repeat;background-position:50%;overflow:hidden}.et_pb_background_pattern{background-position:0 0;background-repeat:repeat}.et_pb_with_border{position:relative;border:0 solid #333}.post-password-required .et_pb_row{padding:0;width:100%}.post-password-required .et_password_protected_form{min-height:0}body.et_pb_pagebuilder_layout.et_pb_show_title .post-password-required .et_password_protected_form h1,body:not(.et_pb_pagebuilder_layout) .post-password-required .et_password_protected_form h1{display:none}.et_pb_no_bg{padding:0!important}.et_overlay.et_pb_inline_icon:before,.et_pb_inline_icon:before{content:attr(data-icon)}.et_pb_more_button{color:inherit;text-shadow:none;text-decoration:none;display:inline-block;margin-top:20px}.et_parallax_bg_wrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0}.et_parallax_bg{background-repeat:no-repeat;background-position:top;background-size:cover;position:absolute;bottom:0;left:0;width:100%;height:100%;display:block}.et_parallax_bg.et_parallax_bg__hover,.et_parallax_bg.et_parallax_bg_phone,.et_parallax_bg.et_parallax_bg_tablet,.et_parallax_gradient.et_parallax_gradient__hover,.et_parallax_gradient.et_parallax_gradient_phone,.et_parallax_gradient.et_parallax_gradient_tablet,.et_pb_section_parallax_hover:hover .et_parallax_bg:not(.et_parallax_bg__hover),.et_pb_section_parallax_hover:hover .et_parallax_gradient:not(.et_parallax_gradient__hover){display:none}.et_pb_section_parallax_hover:hover .et_parallax_bg.et_parallax_bg__hover,.et_pb_section_parallax_hover:hover .et_parallax_gradient.et_parallax_gradient__hover{display:block}.et_parallax_gradient{bottom:0;display:block;left:0;position:absolute;right:0;top:0}.et_pb_module.et_pb_section_parallax,.et_pb_posts_nav a.et_pb_section_parallax,.et_pb_tab.et_pb_section_parallax{position:relative}.et_pb_section_parallax .et_pb_parallax_css,.et_pb_slides .et_parallax_bg.et_pb_parallax_css{background-attachment:fixed}body.et-bfb .et_pb_section_parallax .et_pb_parallax_css,body.et-bfb .et_pb_slides .et_parallax_bg.et_pb_parallax_css{background-attachment:scroll;bottom:auto}.et_pb_section_parallax.et_pb_column .et_pb_module,.et_pb_section_parallax.et_pb_row .et_pb_column,.et_pb_section_parallax.et_pb_row .et_pb_module{z-index:9;position:relative}.et_pb_more_button:hover:after{opacity:1;margin-left:0}.et_pb_preload .et_pb_section_video_bg,.et_pb_preload>div{visibility:hidden}.et_pb_preload,.et_pb_section.et_pb_section_video.et_pb_preload{position:relative;background:#464646!important}.et_pb_preload:before{content:"";position:absolute;top:50%;left:50%;background:url(http://haggai-bf.org/wp-content/themes/Divi/includes/builder/styles/images/preloader.gif) no-repeat;border-radius:32px;width:32px;height:32px;margin:-16px 0 0 -16px}.box-shadow-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10;pointer-events:none}.et_pb_section>.box-shadow-overlay~.et_pb_row{z-index:11}body.safari .section_has_divider{will-change:transform}.et_pb_row>.box-shadow-overlay{z-index:8}.has-box-shadow-overlay{position:relative}.et_clickable{cursor:pointer}.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important}.et_multi_view_hidden,.et_multi_view_hidden_image{display:none!important}@keyframes multi-view-image-fade{0%{opacity:0}10%{opacity:.1}20%{opacity:.2}30%{opacity:.3}40%{opacity:.4}50%{opacity:.5}60%{opacity:.6}70%{opacity:.7}80%{opacity:.8}90%{opacity:.9}to{opacity:1}}.et_multi_view_image__loading{visibility:hidden}.et_multi_view_image__loaded{-webkit-animation:multi-view-image-fade .5s;animation:multi-view-image-fade .5s}#et-pb-motion-effects-offset-tracker{visibility:hidden!important;opacity:0;position:absolute;top:0;left:0}.et-pb-before-scroll-animation{opacity:0}header.et-l.et-l--header:after{clear:both;display:block;content:""}.et_pb_module{-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes fadeBottom{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeBottom{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeLeft{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeLeft{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeRight{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeRight{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeTop{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeTop{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}to{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.et-waypoint:not(.et_pb_counters){opacity:0}@media (min-width:981px){.et_pb_section.et_section_specialty div.et_pb_row .et_pb_column .et_pb_column .et_pb_module.et-last-child,.et_pb_section.et_section_specialty div.et_pb_row .et_pb_column .et_pb_column .et_pb_module:last-child,.et_pb_section.et_section_specialty div.et_pb_row .et_pb_column .et_pb_row_inner .et_pb_column .et_pb_module.et-last-child,.et_pb_section.et_section_specialty div.et_pb_row .et_pb_column .et_pb_row_inner .et_pb_column .et_pb_module:last-child,.et_pb_section div.et_pb_row .et_pb_column .et_pb_module.et-last-child,.et_pb_section div.et_pb_row .et_pb_column .et_pb_module:last-child{margin-bottom:0}}@media (max-width:980px){.et_overlay.et_pb_inline_icon_tablet:before,.et_pb_inline_icon_tablet:before{content:attr(data-icon-tablet)}.et_parallax_bg.et_parallax_bg_tablet_exist,.et_parallax_gradient.et_parallax_gradient_tablet_exist{display:none}.et_parallax_bg.et_parallax_bg_tablet,.et_parallax_gradient.et_parallax_gradient_tablet{display:block}.et_pb_column .et_pb_module{margin-bottom:30px}.et_pb_row .et_pb_column .et_pb_module.et-last-child,.et_pb_row .et_pb_column .et_pb_module:last-child,.et_section_specialty .et_pb_row .et_pb_column .et_pb_module.et-last-child,.et_section_specialty .et_pb_row .et_pb_column .et_pb_module:last-child{margin-bottom:0}.et_pb_more_button{display:inline-block!important}.et_pb_bg_layout_light_tablet.et_pb_button,.et_pb_bg_layout_light_tablet.et_pb_module.et_pb_button,.et_pb_bg_layout_light_tablet .et_pb_more_button{color:#2ea3f2}.et_pb_bg_layout_light_tablet .et_pb_forgot_password a{color:#666}.et_pb_bg_layout_light_tablet h1,.et_pb_bg_layout_light_tablet h2,.et_pb_bg_layout_light_tablet h3,.et_pb_bg_layout_light_tablet h4,.et_pb_bg_layout_light_tablet h5,.et_pb_bg_layout_light_tablet h6{color:#333!important}.et_pb_module .et_pb_bg_layout_light_tablet.et_pb_button{color:#2ea3f2!important}.et_pb_bg_layout_light_tablet{color:#666!important}.et_pb_bg_layout_dark_tablet,.et_pb_bg_layout_dark_tablet h1,.et_pb_bg_layout_dark_tablet h2,.et_pb_bg_layout_dark_tablet h3,.et_pb_bg_layout_dark_tablet h4,.et_pb_bg_layout_dark_tablet h5,.et_pb_bg_layout_dark_tablet h6{color:#fff!important}.et_pb_bg_layout_dark_tablet.et_pb_button,.et_pb_bg_layout_dark_tablet.et_pb_module.et_pb_button,.et_pb_bg_layout_dark_tablet .et_pb_more_button{color:inherit}.et_pb_bg_layout_dark_tablet .et_pb_forgot_password a{color:#fff}.et_pb_module.et_pb_text_align_left-tablet{text-align:left}.et_pb_module.et_pb_text_align_center-tablet{text-align:center}.et_pb_module.et_pb_text_align_right-tablet{text-align:right}.et_pb_module.et_pb_text_align_justified-tablet{text-align:justify}}@media (max-width:767px){.et_pb_more_button{display:inline-block!important}.et_overlay.et_pb_inline_icon_phone:before,.et_pb_inline_icon_phone:before{content:attr(data-icon-phone)}.et_parallax_bg.et_parallax_bg_phone_exist,.et_parallax_gradient.et_parallax_gradient_phone_exist{display:none}.et_parallax_bg.et_parallax_bg_phone,.et_parallax_gradient.et_parallax_gradient_phone{display:block}.et-hide-mobile{display:none!important}.et_pb_bg_layout_light_phone.et_pb_button,.et_pb_bg_layout_light_phone.et_pb_module.et_pb_button,.et_pb_bg_layout_light_phone .et_pb_more_button{color:#2ea3f2}.et_pb_bg_layout_light_phone .et_pb_forgot_password a{color:#666}.et_pb_bg_layout_light_phone h1,.et_pb_bg_layout_light_phone h2,.et_pb_bg_layout_light_phone h3,.et_pb_bg_layout_light_phone h4,.et_pb_bg_layout_light_phone h5,.et_pb_bg_layout_light_phone h6{color:#333!important}.et_pb_module .et_pb_bg_layout_light_phone.et_pb_button{color:#2ea3f2!important}.et_pb_bg_layout_light_phone{color:#666!important}.et_pb_bg_layout_dark_phone,.et_pb_bg_layout_dark_phone h1,.et_pb_bg_layout_dark_phone h2,.et_pb_bg_layout_dark_phone h3,.et_pb_bg_layout_dark_phone h4,.et_pb_bg_layout_dark_phone h5,.et_pb_bg_layout_dark_phone h6{color:#fff!important}.et_pb_bg_layout_dark_phone.et_pb_button,.et_pb_bg_layout_dark_phone.et_pb_module.et_pb_button,.et_pb_bg_layout_dark_phone .et_pb_more_button{color:inherit}.et_pb_module .et_pb_bg_layout_dark_phone.et_pb_button{color:#fff!important}.et_pb_bg_layout_dark_phone .et_pb_forgot_password a{color:#fff}.et_pb_module.et_pb_text_align_left-phone{text-align:left}.et_pb_module.et_pb_text_align_center-phone{text-align:center}.et_pb_module.et_pb_text_align_right-phone{text-align:right}.et_pb_module.et_pb_text_align_justified-phone{text-align:justify}}@media (max-width:479px){a.et_pb_more_button{display:block}}@media (min-width:768px) and (max-width:980px){[data-et-multi-view-load-tablet-hidden=true]:not(.et_multi_view_swapped){display:none!important}}@media (max-width:767px){[data-et-multi-view-load-phone-hidden=true]:not(.et_multi_view_swapped){display:none!important}}.et_pb_menu.et_pb_menu--style-inline_centered_logo .et_pb_menu__menu nav ul{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}@-webkit-keyframes multi-view-image-fade{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(1.01);transform:scale(1.01);opacity:1}to{-webkit-transform:scale(1);transform:scale(1);opacity:1}}
/*# sourceURL=divi-style-parent-inline-inline-css */
</style>
<style id="divi-dynamic-critical-inline-css">
@font-face{font-family:ETmodules;font-display:block;src:url(//haggai-bf.org/wp-content/themes/Divi/core/admin/fonts/modules/all/modules.eot);src:url(//haggai-bf.org/wp-content/themes/Divi/core/admin/fonts/modules/all/modules.eot?#iefix) format("embedded-opentype"),url(//haggai-bf.org/wp-content/themes/Divi/core/admin/fonts/modules/all/modules.woff) format("woff"),url(//haggai-bf.org/wp-content/themes/Divi/core/admin/fonts/modules/all/modules.ttf) format("truetype"),url(//haggai-bf.org/wp-content/themes/Divi/core/admin/fonts/modules/all/modules.svg#ETmodules) format("svg");font-weight:400;font-style:normal}
@media (min-width:981px){.et_pb_gutters3 .et_pb_column,.et_pb_gutters3.et_pb_row .et_pb_column{margin-right:5.5%}.et_pb_gutters3 .et_pb_column_4_4,.et_pb_gutters3.et_pb_row .et_pb_column_4_4{width:100%}.et_pb_gutters3 .et_pb_column_4_4 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_4_4 .et_pb_module{margin-bottom:2.75%}.et_pb_gutters3 .et_pb_column_3_4,.et_pb_gutters3.et_pb_row .et_pb_column_3_4{width:73.625%}.et_pb_gutters3 .et_pb_column_3_4 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_3_4 .et_pb_module{margin-bottom:3.735%}.et_pb_gutters3 .et_pb_column_2_3,.et_pb_gutters3.et_pb_row .et_pb_column_2_3{width:64.833%}.et_pb_gutters3 .et_pb_column_2_3 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_2_3 .et_pb_module{margin-bottom:4.242%}.et_pb_gutters3 .et_pb_column_3_5,.et_pb_gutters3.et_pb_row .et_pb_column_3_5{width:57.8%}.et_pb_gutters3 .et_pb_column_3_5 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_3_5 .et_pb_module{margin-bottom:4.758%}.et_pb_gutters3 .et_pb_column_1_2,.et_pb_gutters3.et_pb_row .et_pb_column_1_2{width:47.25%}.et_pb_gutters3 .et_pb_column_1_2 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_1_2 .et_pb_module{margin-bottom:5.82%}.et_pb_gutters3 .et_pb_column_2_5,.et_pb_gutters3.et_pb_row .et_pb_column_2_5{width:36.7%}.et_pb_gutters3 .et_pb_column_2_5 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_2_5 .et_pb_module{margin-bottom:7.493%}.et_pb_gutters3 .et_pb_column_1_3,.et_pb_gutters3.et_pb_row .et_pb_column_1_3{width:29.6667%}.et_pb_gutters3 .et_pb_column_1_3 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_1_3 .et_pb_module{margin-bottom:9.27%}.et_pb_gutters3 .et_pb_column_1_4,.et_pb_gutters3.et_pb_row .et_pb_column_1_4{width:20.875%}.et_pb_gutters3 .et_pb_column_1_4 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_1_4 .et_pb_module{margin-bottom:13.174%}.et_pb_gutters3 .et_pb_column_1_5,.et_pb_gutters3.et_pb_row .et_pb_column_1_5{width:15.6%}.et_pb_gutters3 .et_pb_column_1_5 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_1_5 .et_pb_module{margin-bottom:17.628%}.et_pb_gutters3 .et_pb_column_1_6,.et_pb_gutters3.et_pb_row .et_pb_column_1_6{width:12.0833%}.et_pb_gutters3 .et_pb_column_1_6 .et_pb_module,.et_pb_gutters3.et_pb_row .et_pb_column_1_6 .et_pb_module{margin-bottom:22.759%}.et_pb_gutters3 .et_full_width_page.woocommerce-page ul.products li.product{width:20.875%;margin-right:5.5%;margin-bottom:5.5%}.et_pb_gutters3.et_left_sidebar.woocommerce-page #main-content ul.products li.product,.et_pb_gutters3.et_right_sidebar.woocommerce-page #main-content ul.products li.product{width:28.353%;margin-right:7.47%}.et_pb_gutters3.et_left_sidebar.woocommerce-page #main-content ul.products.columns-1 li.product,.et_pb_gutters3.et_right_sidebar.woocommerce-page #main-content ul.products.columns-1 li.product{width:100%;margin-right:0}.et_pb_gutters3.et_left_sidebar.woocommerce-page #main-content ul.products.columns-2 li.product,.et_pb_gutters3.et_right_sidebar.woocommerce-page #main-content ul.products.columns-2 li.product{width:48%;margin-right:4%}.et_pb_gutters3.et_left_sidebar.woocommerce-page #main-content ul.products.columns-2 li:nth-child(2n+2),.et_pb_gutters3.et_right_sidebar.woocommerce-page #main-content ul.products.columns-2 li:nth-child(2n+2){margin-right:0}.et_pb_gutters3.et_left_sidebar.woocommerce-page #main-content ul.products.columns-2 li:nth-child(3n+1),.et_pb_gutters3.et_right_sidebar.woocommerce-page #main-content ul.products.columns-2 li:nth-child(3n+1){clear:none}}
@media (min-width:981px){.et_pb_gutter.et_pb_gutters1 #left-area{width:75%}.et_pb_gutter.et_pb_gutters1 #sidebar{width:25%}.et_pb_gutters1.et_right_sidebar #left-area{padding-right:0}.et_pb_gutters1.et_left_sidebar #left-area{padding-left:0}.et_pb_gutter.et_pb_gutters1.et_right_sidebar #main-content .container:before{right:25%!important}.et_pb_gutter.et_pb_gutters1.et_left_sidebar #main-content .container:before{left:25%!important}.et_pb_gutters1 .et_pb_column,.et_pb_gutters1.et_pb_row .et_pb_column{margin-right:0}.et_pb_gutters1 .et_pb_column_4_4,.et_pb_gutters1.et_pb_row .et_pb_column_4_4{width:100%}.et_pb_gutters1 .et_pb_column_4_4 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_4_4 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_3_4,.et_pb_gutters1.et_pb_row .et_pb_column_3_4{width:75%}.et_pb_gutters1 .et_pb_column_3_4 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_3_4 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_2_3,.et_pb_gutters1.et_pb_row .et_pb_column_2_3{width:66.667%}.et_pb_gutters1 .et_pb_column_2_3 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_2_3 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_3_5,.et_pb_gutters1.et_pb_row .et_pb_column_3_5{width:60%}.et_pb_gutters1 .et_pb_column_3_5 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_3_5 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_1_2,.et_pb_gutters1.et_pb_row .et_pb_column_1_2{width:50%}.et_pb_gutters1 .et_pb_column_1_2 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_1_2 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_2_5,.et_pb_gutters1.et_pb_row .et_pb_column_2_5{width:40%}.et_pb_gutters1 .et_pb_column_2_5 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_2_5 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_1_3,.et_pb_gutters1.et_pb_row .et_pb_column_1_3{width:33.3333%}.et_pb_gutters1 .et_pb_column_1_3 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_1_3 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_1_4,.et_pb_gutters1.et_pb_row .et_pb_column_1_4{width:25%}.et_pb_gutters1 .et_pb_column_1_4 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_1_4 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_1_5,.et_pb_gutters1.et_pb_row .et_pb_column_1_5{width:20%}.et_pb_gutters1 .et_pb_column_1_5 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_1_5 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_column_1_6,.et_pb_gutters1.et_pb_row .et_pb_column_1_6{width:16.6667%}.et_pb_gutters1 .et_pb_column_1_6 .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column_1_6 .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_full_width_page.woocommerce-page ul.products li.product{width:25%;margin-right:0;margin-bottom:0}.et_pb_gutters1.et_left_sidebar.woocommerce-page #main-content ul.products li.product,.et_pb_gutters1.et_right_sidebar.woocommerce-page #main-content ul.products li.product{width:33.333%;margin-right:0}}@media (max-width:980px){.et_pb_gutters1 .et_pb_column,.et_pb_gutters1 .et_pb_column .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column,.et_pb_gutters1.et_pb_row .et_pb_column .et_pb_module{margin-bottom:0}.et_pb_gutters1 .et_pb_row_1-2_1-4_1-4>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1 .et_pb_row_1-4_1-4>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1 .et_pb_row_1-4_1-4_1-2>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1 .et_pb_row_1-5_1-5_3-5>.et_pb_column.et_pb_column_1_5,.et_pb_gutters1 .et_pb_row_3-5_1-5_1-5>.et_pb_column.et_pb_column_1_5,.et_pb_gutters1 .et_pb_row_4col>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1 .et_pb_row_5col>.et_pb_column.et_pb_column_1_5,.et_pb_gutters1.et_pb_row_1-2_1-4_1-4>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1.et_pb_row_1-4_1-4>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1.et_pb_row_1-4_1-4_1-2>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1.et_pb_row_1-5_1-5_3-5>.et_pb_column.et_pb_column_1_5,.et_pb_gutters1.et_pb_row_3-5_1-5_1-5>.et_pb_column.et_pb_column_1_5,.et_pb_gutters1.et_pb_row_4col>.et_pb_column.et_pb_column_1_4,.et_pb_gutters1.et_pb_row_5col>.et_pb_column.et_pb_column_1_5{width:50%;margin-right:0}.et_pb_gutters1 .et_pb_row_1-2_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1 .et_pb_row_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1 .et_pb_row_1-6_1-6_1-6_1-2>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1 .et_pb_row_6col>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1.et_pb_row_1-2_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1.et_pb_row_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1.et_pb_row_1-6_1-6_1-6_1-2>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1.et_pb_row_6col>.et_pb_column.et_pb_column_1_6{width:33.333%;margin-right:0}.et_pb_gutters1 .et_pb_row_1-6_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6,.et_pb_gutters1.et_pb_row_1-6_1-6_1-6_1-6>.et_pb_column.et_pb_column_1_6{width:50%;margin-right:0}}@media (max-width:767px){.et_pb_gutters1 .et_pb_column,.et_pb_gutters1 .et_pb_column .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column,.et_pb_gutters1.et_pb_row .et_pb_column .et_pb_module{margin-bottom:0}}@media (max-width:479px){.et_pb_gutters1 .et_pb_column,.et_pb_gutters1.et_pb_row .et_pb_column{margin:0!important}.et_pb_gutters1 .et_pb_column .et_pb_module,.et_pb_gutters1.et_pb_row .et_pb_column .et_pb_module{margin-bottom:0}}
#et-secondary-menu li,#top-menu li{word-wrap:break-word}.nav li ul,.et_mobile_menu{border-color:#2EA3F2}.mobile_menu_bar:before,.mobile_menu_bar:after,#top-menu li.current-menu-ancestor>a,#top-menu li.current-menu-item>a{color:#2EA3F2}#main-header{-webkit-transition:background-color 0.4s, color 0.4s, opacity 0.4s ease-in-out, -webkit-transform 0.4s;transition:background-color 0.4s, color 0.4s, opacity 0.4s ease-in-out, -webkit-transform 0.4s;transition:background-color 0.4s, color 0.4s, transform 0.4s, opacity 0.4s ease-in-out;transition:background-color 0.4s, color 0.4s, transform 0.4s, opacity 0.4s ease-in-out, -webkit-transform 0.4s}#main-header.et-disabled-animations *{-webkit-transition-duration:0s !important;transition-duration:0s !important}.container{text-align:left;position:relative}.et_fixed_nav.et_show_nav #page-container{padding-top:80px}.et_fixed_nav.et_show_nav.et-tb #page-container,.et_fixed_nav.et_show_nav.et-tb-has-header #page-container{padding-top:0 !important}.et_fixed_nav.et_show_nav.et_secondary_nav_enabled #page-container{padding-top:111px}.et_fixed_nav.et_show_nav.et_secondary_nav_enabled.et_header_style_centered #page-container{padding-top:177px}.et_fixed_nav.et_show_nav.et_header_style_centered #page-container{padding-top:147px}.et_fixed_nav #main-header{position:fixed}.et-cloud-item-editor #page-container{padding-top:0 !important}.et_header_style_left #et-top-navigation{padding-top:33px}.et_header_style_left #et-top-navigation nav>ul>li>a{padding-bottom:33px}.et_header_style_left .logo_container{position:absolute;height:100%;width:100%}.et_header_style_left #et-top-navigation .mobile_menu_bar{padding-bottom:24px}.et_hide_search_icon #et_top_search{display:none !important}#logo{width:auto;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out;margin-bottom:0;max-height:54%;display:inline-block;float:none;vertical-align:middle;-webkit-transform:translate3d(0, 0, 0)}.et_pb_svg_logo #logo{height:54%}.logo_container{-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}span.logo_helper{display:inline-block;height:100%;vertical-align:middle;width:0}.safari .centered-inline-logo-wrap{-webkit-transform:translate3d(0, 0, 0);-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}#et-define-logo-wrap img{width:100%}.gecko #et-define-logo-wrap.svg-logo{position:relative !important}#top-menu-nav,#top-menu{line-height:0}#et-top-navigation{font-weight:600}.et_fixed_nav #et-top-navigation{-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}.et-cart-info span:before{content:"\e07a";margin-right:10px;position:relative}nav#top-menu-nav,#top-menu,nav.et-menu-nav,.et-menu{float:left}#top-menu li{display:inline-block;font-size:14px;padding-right:22px}#top-menu>li:last-child{padding-right:0}.et_fullwidth_nav.et_non_fixed_nav.et_header_style_left #top-menu>li:last-child>ul.sub-menu{right:0}#top-menu a{color:rgba(0,0,0,0.6);text-decoration:none;display:block;position:relative;-webkit-transition:opacity 0.4s ease-in-out, background-color 0.4s ease-in-out;transition:opacity 0.4s ease-in-out, background-color 0.4s ease-in-out}#top-menu-nav>ul>li>a:hover{opacity:0.7;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}#et_search_icon:before{content:"\55";font-size:17px;left:0;position:absolute;top:-3px}#et_search_icon:hover{cursor:pointer}#et_top_search{float:right;margin:3px 0 0 22px;position:relative;display:block;width:18px}#et_top_search.et_search_opened{position:absolute;width:100%}.et-search-form{top:0;bottom:0;right:0;position:absolute;z-index:1000;width:100%}.et-search-form input{width:90%;border:none;color:#333;position:absolute;top:0;bottom:0;right:30px;margin:auto;background:transparent}.et-search-form .et-search-field::-ms-clear{width:0;height:0;display:none}.et_search_form_container{-webkit-animation:none;animation:none;-o-animation:none}.container.et_search_form_container{position:relative;opacity:0;height:1px}.container.et_search_form_container.et_pb_search_visible{z-index:999;-webkit-animation:fadeInTop 1s 1 cubic-bezier(0.77, 0, 0.175, 1);animation:fadeInTop 1s 1 cubic-bezier(0.77, 0, 0.175, 1)}.et_pb_search_visible.et_pb_no_animation{opacity:1}.et_pb_search_form_hidden{-webkit-animation:fadeOutTop 1s 1 cubic-bezier(0.77, 0, 0.175, 1);animation:fadeOutTop 1s 1 cubic-bezier(0.77, 0, 0.175, 1)}span.et_close_search_field{display:block;width:30px;height:30px;z-index:99999;position:absolute;right:0;cursor:pointer;top:0;bottom:0;margin:auto}span.et_close_search_field:after{font-family:'ETmodules';content:'\4d';speak:none;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;font-size:32px;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box}.container.et_menu_container{z-index:99}.container.et_search_form_container.et_pb_search_form_hidden{z-index:1 !important}.et_search_outer{width:100%;overflow:hidden;position:absolute;top:0}.container.et_pb_menu_hidden{z-index:-1}form.et-search-form{background:rgba(0,0,0,0) !important}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}.et-cart-info{color:inherit}#et-top-navigation .et-cart-info{float:left;margin:-2px 0 0 22px;font-size:16px}#et-top-navigation{float:right}#top-menu li li{padding:0 20px;margin:0}#top-menu li li a{padding:6px 20px;width:200px}.nav li.et-touch-hover>ul{opacity:1;visibility:visible}#top-menu .menu-item-has-children>a:first-child:after,#et-secondary-nav .menu-item-has-children>a:first-child:after{font-family:'ETmodules';content:"3";font-size:16px;position:absolute;right:0;top:0;font-weight:800}#top-menu .menu-item-has-children>a:first-child,#et-secondary-nav .menu-item-has-children>a:first-child{padding-right:20px}#top-menu li .menu-item-has-children>a:first-child{padding-right:40px}#top-menu li .menu-item-has-children>a:first-child:after{right:20px;top:6px}#top-menu li.mega-menu{position:inherit}#top-menu li.mega-menu>ul{padding:30px 20px;position:absolute !important;width:100%;left:0 !important}#top-menu li.mega-menu ul li{margin:0;float:left !important;display:block !important;padding:0 !important}#top-menu li.mega-menu>ul>li:nth-of-type(4n){clear:right}#top-menu li.mega-menu>ul>li:nth-of-type(4n+1){clear:left}#top-menu li.mega-menu ul li li{width:100%}#top-menu li.mega-menu li>ul{-webkit-animation:none !important;animation:none !important;padding:0px;border:none;left:auto;top:auto;width:90% !important;position:relative;-webkit-box-shadow:none;box-shadow:none}#top-menu li.mega-menu li ul{visibility:visible;opacity:1;display:none}#top-menu li.mega-menu.et-hover li ul{display:block}#top-menu li.mega-menu.et-hover>ul{opacity:1 !important;visibility:visible !important}#top-menu li.mega-menu>ul>li>a{width:90%;padding:0 20px 10px}#top-menu li.mega-menu>ul>li>a:first-child{padding-top:0 !important;font-weight:bold;border-bottom:1px solid rgba(0,0,0,0.03)}#top-menu li.mega-menu>ul>li>a:first-child:hover{background-color:transparent !important}#top-menu li.mega-menu li>a{width:100%}#top-menu li.mega-menu.mega-menu-parent li li,#top-menu li.mega-menu.mega-menu-parent li>a{width:100% !important}#top-menu li.mega-menu.mega-menu-parent li>.sub-menu{float:left;width:100% !important}#top-menu li.mega-menu>ul>li{width:25%;margin:0}#top-menu li.mega-menu.mega-menu-parent-3>ul>li{width:33.33%}#top-menu li.mega-menu.mega-menu-parent-2>ul>li{width:50%}#top-menu li.mega-menu.mega-menu-parent-1>ul>li{width:100%}#top-menu li.mega-menu .menu-item-has-children>a:first-child:after{display:none}#top-menu li.mega-menu>ul>li>ul>li{width:100%;margin:0}#et_mobile_nav_menu{float:right;display:none}.mobile_menu_bar{position:relative;display:block;line-height:0}.mobile_menu_bar:before,.et_toggle_slide_menu:after{content:"\61";font-size:32px;left:0;position:relative;top:0;cursor:pointer}.mobile_nav .select_page{display:none}.et_pb_menu_hidden #top-menu,.et_pb_menu_hidden #et_search_icon:before,.et_pb_menu_hidden .et-cart-info{opacity:0;-webkit-animation:fadeOutBottom 1s 1 cubic-bezier(0.77, 0, 0.175, 1);animation:fadeOutBottom 1s 1 cubic-bezier(0.77, 0, 0.175, 1)}.et_pb_menu_visible #top-menu,.et_pb_menu_visible #et_search_icon:before,.et_pb_menu_visible .et-cart-info{z-index:99;opacity:1;-webkit-animation:fadeInBottom 1s 1 cubic-bezier(0.77, 0, 0.175, 1);animation:fadeInBottom 1s 1 cubic-bezier(0.77, 0, 0.175, 1)}.et_pb_menu_hidden #top-menu,.et_pb_menu_hidden #et_search_icon:before,.et_pb_menu_hidden .mobile_menu_bar{opacity:0;-webkit-animation:fadeOutBottom 1s 1 cubic-bezier(0.77, 0, 0.175, 1);animation:fadeOutBottom 1s 1 cubic-bezier(0.77, 0, 0.175, 1)}.et_pb_menu_visible #top-menu,.et_pb_menu_visible #et_search_icon:before,.et_pb_menu_visible .mobile_menu_bar{z-index:99;opacity:1;-webkit-animation:fadeInBottom 1s 1 cubic-bezier(0.77, 0, 0.175, 1);animation:fadeInBottom 1s 1 cubic-bezier(0.77, 0, 0.175, 1)}.et_pb_no_animation #top-menu,.et_pb_no_animation #et_search_icon:before,.et_pb_no_animation .mobile_menu_bar,.et_pb_no_animation.et_search_form_container{animation:none !important;-o-animation:none !important;-webkit-animation:none !important;-moz-animation:none !important}body.admin-bar.et_fixed_nav #main-header{top:32px}body.et-wp-pre-3_8.admin-bar.et_fixed_nav #main-header{top:28px}body.et_fixed_nav.et_secondary_nav_enabled #main-header{top:30px}body.admin-bar.et_fixed_nav.et_secondary_nav_enabled #main-header{top:63px}@media all and (min-width: 981px){.et_hide_primary_logo #main-header:not(.et-fixed-header) .logo_container,.et_hide_fixed_logo #main-header.et-fixed-header .logo_container{height:0;opacity:0;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}.et_hide_primary_logo #main-header:not(.et-fixed-header) .centered-inline-logo-wrap,.et_hide_fixed_logo #main-header.et-fixed-header .centered-inline-logo-wrap{height:0;opacity:0;padding:0}.et-animated-content#page-container{-webkit-transition:margin-top 0.4s ease-in-out;transition:margin-top 0.4s ease-in-out}.et_hide_nav #page-container{-webkit-transition:none;transition:none}.et_fullwidth_nav .et-search-form,.et_fullwidth_nav .et_close_search_field{right:30px}#main-header.et-fixed-header{-webkit-box-shadow:0 0 7px rgba(0,0,0,0.1) !important;box-shadow:0 0 7px rgba(0,0,0,0.1) !important}.et_header_style_left .et-fixed-header #et-top-navigation{padding-top:20px}.et_header_style_left .et-fixed-header #et-top-navigation nav>ul>li>a{padding-bottom:20px}.et_hide_nav.et_fixed_nav #main-header{opacity:0}.et_hide_nav.et_fixed_nav .et-fixed-header#main-header{-webkit-transform:translateY(0px) !important;transform:translateY(0px) !important;opacity:1}.et_hide_nav .centered-inline-logo-wrap,.et_hide_nav.et_fixed_nav #main-header,.et_hide_nav.et_fixed_nav #main-header,.et_hide_nav .centered-inline-logo-wrap{-webkit-transition-duration:.7s;transition-duration:.7s}.et_hide_nav #page-container{padding-top:0 !important}.et_primary_nav_dropdown_animation_fade #et-top-navigation ul li:hover>ul,.et_secondary_nav_dropdown_animation_fade #et-secondary-nav li:hover>ul{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.et_primary_nav_dropdown_animation_slide #et-top-navigation ul li:hover>ul,.et_secondary_nav_dropdown_animation_slide #et-secondary-nav li:hover>ul{-webkit-animation:fadeLeft .4s ease-in-out;animation:fadeLeft .4s ease-in-out}.et_primary_nav_dropdown_animation_expand #et-top-navigation ul li:hover>ul,.et_secondary_nav_dropdown_animation_expand #et-secondary-nav li:hover>ul{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-animation:Grow .4s ease-in-out;animation:Grow .4s ease-in-out;-webkit-backface-visibility:visible !important;backface-visibility:visible !important}.et_primary_nav_dropdown_animation_flip #et-top-navigation ul li ul li:hover>ul,.et_secondary_nav_dropdown_animation_flip #et-secondary-nav ul li:hover>ul{-webkit-animation:flipInX .6s ease-in-out;animation:flipInX .6s ease-in-out;-webkit-backface-visibility:visible !important;backface-visibility:visible !important}.et_primary_nav_dropdown_animation_flip #et-top-navigation ul li:hover>ul,.et_secondary_nav_dropdown_animation_flip #et-secondary-nav li:hover>ul{-webkit-animation:flipInY .6s ease-in-out;animation:flipInY .6s ease-in-out;-webkit-backface-visibility:visible !important;backface-visibility:visible !important}.et_fullwidth_nav #main-header .container{width:100%;max-width:100%;padding-right:32px;padding-left:30px}.et_non_fixed_nav.et_fullwidth_nav.et_header_style_left #main-header .container{padding-left:0}.et_non_fixed_nav.et_fullwidth_nav.et_header_style_left .logo_container{padding-left:30px}}@media all and (max-width: 980px){.et_fixed_nav.et_show_nav.et_secondary_nav_enabled #page-container,.et_fixed_nav.et_show_nav #page-container{padding-top:80px}.et_fixed_nav.et_show_nav.et-tb #page-container,.et_fixed_nav.et_show_nav.et-tb-has-header #page-container{padding-top:0 !important}.et_non_fixed_nav #page-container{padding-top:0}.et_fixed_nav.et_secondary_nav_only_menu.admin-bar #main-header{top:32px !important}.et_hide_mobile_logo #main-header .logo_container{display:none;opacity:0;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}#top-menu{display:none}.et_hide_nav.et_fixed_nav #main-header{-webkit-transform:translateY(0px) !important;transform:translateY(0px) !important;opacity:1}#et-top-navigation{margin-right:0;-webkit-transition:none;transition:none}.et_fixed_nav #main-header{position:absolute}.et_header_style_left .et-fixed-header #et-top-navigation,.et_header_style_left #et-top-navigation{padding-top:24px;display:block}.et_fixed_nav #main-header{-webkit-transition:none;transition:none}.et_fixed_nav_temp #main-header{top:0 !important}#logo,.logo_container,#main-header,.container{-webkit-transition:none;transition:none}.et_header_style_left #logo{max-width:50%}#et_top_search{margin:0 35px 0 0;float:left}#et_search_icon:before{top:7px}.et_header_style_left .et-search-form{width:50% !important;max-width:50% !important}#et_mobile_nav_menu{display:block}#et-top-navigation .et-cart-info{margin-top:5px}}@media screen and (max-width: 782px){body.admin-bar.et_fixed_nav #main-header{top:46px}}@media all and (max-width: 767px){#et-top-navigation{margin-right:0}body.admin-bar.et_fixed_nav #main-header{top:46px}}@media all and (max-width: 479px){#et-top-navigation{margin-right:0}}@media print{#top-header,#main-header{position:relative !important;top:auto !important;right:auto !important;bottom:auto !important;left:auto !important}}
@-webkit-keyframes fadeOutTop{0%{opacity:1;-webkit-transform:translatey(0);transform:translatey(0)}to{opacity:0;-webkit-transform:translatey(-60%);transform:translatey(-60%)}}@keyframes fadeOutTop{0%{opacity:1;-webkit-transform:translatey(0);transform:translatey(0)}to{opacity:0;-webkit-transform:translatey(-60%);transform:translatey(-60%)}}@-webkit-keyframes fadeInTop{0%{opacity:0;-webkit-transform:translatey(-60%);transform:translatey(-60%)}to{opacity:1;-webkit-transform:translatey(0);transform:translatey(0)}}@keyframes fadeInTop{0%{opacity:0;-webkit-transform:translatey(-60%);transform:translatey(-60%)}to{opacity:1;-webkit-transform:translatey(0);transform:translatey(0)}}@-webkit-keyframes fadeInBottom{0%{opacity:0;-webkit-transform:translatey(60%);transform:translatey(60%)}to{opacity:1;-webkit-transform:translatey(0);transform:translatey(0)}}@keyframes fadeInBottom{0%{opacity:0;-webkit-transform:translatey(60%);transform:translatey(60%)}to{opacity:1;-webkit-transform:translatey(0);transform:translatey(0)}}@-webkit-keyframes fadeOutBottom{0%{opacity:1;-webkit-transform:translatey(0);transform:translatey(0)}to{opacity:0;-webkit-transform:translatey(60%);transform:translatey(60%)}}@keyframes fadeOutBottom{0%{opacity:1;-webkit-transform:translatey(0);transform:translatey(0)}to{opacity:0;-webkit-transform:translatey(60%);transform:translatey(60%)}}@-webkit-keyframes Grow{0%{opacity:0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes Grow{0%{opacity:0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}/*!
	  * Animate.css - http://daneden.me/animate
	  * Licensed under the MIT license - http://opensource.org/licenses/MIT
	  * Copyright (c) 2015 Daniel Eden
	 */@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateY(-20deg);transform:perspective(400px) rotateY(-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateY(-20deg);transform:perspective(400px) rotateY(-20deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}
#main-header{line-height:23px;font-weight:500;top:0;background-color:#fff;width:100%;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 0 rgba(0,0,0,.1);position:relative;z-index:99999}.nav li li{padding:0 20px;margin:0}.et-menu li li a{padding:6px 20px;width:200px}.nav li{position:relative;line-height:1em}.nav li li{position:relative;line-height:2em}.nav li ul{position:absolute;padding:20px 0;z-index:9999;width:240px;background:#fff;visibility:hidden;opacity:0;border-top:3px solid #2ea3f2;box-shadow:0 2px 5px rgba(0,0,0,.1);-moz-box-shadow:0 2px 5px rgba(0,0,0,.1);-webkit-box-shadow:0 2px 5px rgba(0,0,0,.1);-webkit-transform:translateZ(0);text-align:left}.nav li.et-hover>ul{visibility:visible}.nav li.et-touch-hover>ul,.nav li:hover>ul{opacity:1;visibility:visible}.nav li li ul{z-index:1000;top:-23px;left:240px}.nav li.et-reverse-direction-nav li ul{left:auto;right:240px}.nav li:hover{visibility:inherit}.et_mobile_menu li a,.nav li li a{font-size:14px;-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.et_mobile_menu li a:hover,.nav ul li a:hover{background-color:rgba(0,0,0,.03);opacity:.7}.et-dropdown-removing>ul{display:none}.mega-menu .et-dropdown-removing>ul{display:block}.et-menu .menu-item-has-children>a:first-child:after{font-family:ETmodules;content:"3";font-size:16px;position:absolute;right:0;top:0;font-weight:800}.et-menu .menu-item-has-children>a:first-child{padding-right:20px}.et-menu li li.menu-item-has-children>a:first-child:after{right:20px;top:6px}.et-menu-nav li.mega-menu{position:inherit}.et-menu-nav li.mega-menu>ul{padding:30px 20px;position:absolute!important;width:100%;left:0!important}.et-menu-nav li.mega-menu ul li{margin:0;float:left!important;display:block!important;padding:0!important}.et-menu-nav li.mega-menu li>ul{-webkit-animation:none!important;animation:none!important;padding:0;border:none;left:auto;top:auto;width:240px!important;position:relative;box-shadow:none;-webkit-box-shadow:none}.et-menu-nav li.mega-menu li ul{visibility:visible;opacity:1;display:none}.et-menu-nav li.mega-menu.et-hover li ul,.et-menu-nav li.mega-menu:hover li ul{display:block}.et-menu-nav li.mega-menu:hover>ul{opacity:1!important;visibility:visible!important}.et-menu-nav li.mega-menu>ul>li>a:first-child{padding-top:0!important;font-weight:700;border-bottom:1px solid rgba(0,0,0,.03)}.et-menu-nav li.mega-menu>ul>li>a:first-child:hover{background-color:transparent!important}.et-menu-nav li.mega-menu li>a{width:200px!important}.et-menu-nav li.mega-menu.mega-menu-parent li>a,.et-menu-nav li.mega-menu.mega-menu-parent li li{width:100%!important}.et-menu-nav li.mega-menu.mega-menu-parent li>.sub-menu{float:left;width:100%!important}.et-menu-nav li.mega-menu>ul>li{width:25%;margin:0}.et-menu-nav li.mega-menu.mega-menu-parent-3>ul>li{width:33.33%}.et-menu-nav li.mega-menu.mega-menu-parent-2>ul>li{width:50%}.et-menu-nav li.mega-menu.mega-menu-parent-1>ul>li{width:100%}.et_pb_fullwidth_menu li.mega-menu .menu-item-has-children>a:first-child:after,.et_pb_menu li.mega-menu .menu-item-has-children>a:first-child:after{display:none}.et_fullwidth_nav #top-menu li.mega-menu>ul{width:auto;left:30px!important;right:30px!important}.et_mobile_menu{position:absolute;left:0;padding:5%;background:#fff;width:100%;visibility:visible;opacity:1;display:none;z-index:9999;border-top:3px solid #2ea3f2;box-shadow:0 2px 5px rgba(0,0,0,.1);-moz-box-shadow:0 2px 5px rgba(0,0,0,.1);-webkit-box-shadow:0 2px 5px rgba(0,0,0,.1)}#main-header .et_mobile_menu li ul,.et_pb_fullwidth_menu .et_mobile_menu li ul,.et_pb_menu .et_mobile_menu li ul{visibility:visible!important;display:block!important;padding-left:10px}.et_mobile_menu li li{padding-left:5%}.et_mobile_menu li a{border-bottom:1px solid rgba(0,0,0,.03);color:#666;padding:10px 5%;display:block}.et_mobile_menu .menu-item-has-children>a{font-weight:700;background-color:rgba(0,0,0,.03)}.et_mobile_menu li .menu-item-has-children>a{background-color:transparent}.et_mobile_nav_menu{float:right;display:none}.mobile_menu_bar{position:relative;display:block;line-height:0}.mobile_menu_bar:before{content:"a";font-size:32px;position:relative;left:0;top:0;cursor:pointer}.et_pb_module .mobile_menu_bar:before{top:2px}.mobile_nav .select_page{display:none}
.footer-widget h4,#main-footer .widget_block h1,#main-footer .widget_block h2,#main-footer .widget_block h3,#main-footer .widget_block h4,#main-footer .widget_block h5,#main-footer .widget_block h6{color:#2EA3F2}.footer-widget li:before{border-color:#2EA3F2}.bottom-nav li.current-menu-item>a{color:#2EA3F2}#main-footer{background-color:#222222}#footer-widgets{padding:6% 0 0}.footer-widget{float:left;color:#fff}.last{margin-right:0}.footer-widget .fwidget:last-child{margin-bottom:0 !important}#footer-widgets .footer-widget li{padding-left:14px;position:relative}#footer-widgets .footer-widget li:before{border-radius:3px;border-style:solid;border-width:3px;content:"";left:0;position:absolute;top:9px}#footer-widgets .footer-widget a{color:#fff}#footer-widgets .footer-widget li a{color:#fff;text-decoration:none}#footer-widgets .footer-widget li a:hover{color:rgba(255,255,255,0.7)}.footer-widget .widget_adsensewidget ins{min-width:160px}#footer-bottom{background-color:#1f1f1f;background-color:rgba(0,0,0,0.32);padding:15px 0 5px}#footer-bottom a{-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}#footer-info{text-align:left;color:#666;padding-bottom:10px;float:left}#footer-info a{font-weight:700;color:#666}#footer-info a:hover{opacity:.7}#et-footer-nav{background-color:rgba(255,255,255,0.05)}.bottom-nav{padding:15px 0}.bottom-nav li{font-weight:600;display:inline-block;font-size:14px;padding-right:22px}.bottom-nav a{color:#bbb;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}.bottom-nav a:hover{opacity:.7}@media all and (max-width: 980px){.footer-widget:nth-child(n){width:46.25% !important;margin:0 7.5% 7.5% 0 !important}.et_pb_footer_columns1 .footer-widget{width:100% !important;margin:0 7.5% 7.5% 0 !important}#footer-widgets .footer-widget .fwidget{margin-bottom:16.21%}.et_pb_gutters1 .footer-widget:nth-child(n){width:50% !important;margin:0 !important}.et_pb_gutters1 #footer-widgets .footer-widget .fwidget{margin-bottom:0}#footer-widgets{padding:8% 0}#footer-widgets .footer-widget:nth-child(2n){margin-right:0 !important}#footer-widgets .footer-widget:nth-last-child(-n+2){margin-bottom:0 !important}.bottom-nav{text-align:center}#footer-info{float:none;text-align:center}}@media all and (max-width: 767px){#footer-widgets .footer-widget,.et_pb_gutters1 #footer-widgets .footer-widget{width:100% !important;margin-right:0 !important}#footer-widgets .footer-widget:nth-child(n),#footer-widgets .footer-widget .fwidget{margin-bottom:9.5% !important}.et_pb_gutters1 #footer-widgets .footer-widget:nth-child(n),.et_pb_gutters1 #footer-widgets .footer-widget .fwidget{margin-bottom:0 !important}#footer-widgets{padding:10% 0}#footer-widgets .footer-widget .fwidget:last-child{margin-bottom:0 !important}#footer-widgets .footer-widget:last-child{margin-bottom:0 !important}}@media all and (max-width: 479px){#footer-widgets .footer-widget:nth-child(n),.footer-widget .fwidget{margin-bottom:11.5% !important}#footer-widgets .footer-widget.last{margin-bottom:0 !important}.et_pb_gutters1 #footer-widgets .footer-widget:nth-child(n),.et_pb_gutters1 #footer-widgets .footer-widget .fwidget{margin-bottom:0 !important}#footer-widgets{padding:12% 0}}
@media all and (min-width: 981px){.et_pb_gutters3 .footer-widget{margin-right:5.5%;margin-bottom:5.5%}.et_pb_gutters3 .footer-widget:last-child{margin-right:0}.et_pb_gutters3.et_pb_footer_columns6 .footer-widget{width:12.083%}.et_pb_gutters3.et_pb_footer_columns6 .footer-widget .fwidget{margin-bottom:45.517%}.et_pb_gutters3.et_pb_footer_columns5 .footer-widget{width:15.6%}.et_pb_gutters3.et_pb_footer_columns5 .footer-widget .fwidget{margin-bottom:35.256%}.et_pb_gutters3.et_pb_footer_columns4 .footer-widget{width:20.875%}.et_pb_gutters3.et_pb_footer_columns4 .footer-widget .fwidget{margin-bottom:26.347%}.et_pb_gutters3.et_pb_footer_columns3 .footer-widget{width:29.667%}.et_pb_gutters3.et_pb_footer_columns3 .footer-widget .fwidget{margin-bottom:18.539%}.et_pb_gutters3.et_pb_footer_columns2 .footer-widget{width:47.25%}.et_pb_gutters3.et_pb_footer_columns2 .footer-widget .fwidget{margin-bottom:11.64%}.et_pb_gutters3.et_pb_footer_columns1 .footer-widget{width:100%}.et_pb_gutters3.et_pb_footer_columns1 .footer-widget .fwidget{margin-bottom:5.5%}.et_pb_gutters3.et_pb_footer_columns_3_4__1_4 .footer-widget:nth-child(1){width:73.625%;clear:both}.et_pb_gutters3.et_pb_footer_columns_3_4__1_4 .footer-widget:nth-child(1) .fwidget{margin-bottom:7.47%}.et_pb_gutters3.et_pb_footer_columns_3_4__1_4 .footer-widget:nth-child(2){width:20.875%}.et_pb_gutters3.et_pb_footer_columns_3_4__1_4 .footer-widget:nth-child(2) .fwidget{margin-bottom:26.347%}.et_pb_gutters3.et_pb_footer_columns_1_4__3_4 .footer-widget:nth-child(1){width:20.875%;clear:both}.et_pb_gutters3.et_pb_footer_columns_1_4__3_4 .footer-widget:nth-child(1) .fwidget{margin-bottom:26.347%}.et_pb_gutters3.et_pb_footer_columns_1_4__3_4 .footer-widget:nth-child(2){width:73.625%}.et_pb_gutters3.et_pb_footer_columns_1_4__3_4 .footer-widget:nth-child(2) .fwidget{margin-bottom:7.47%}.et_pb_gutters3.et_pb_footer_columns_2_3__1_3 .footer-widget:nth-child(1){width:64.833%}.et_pb_gutters3.et_pb_footer_columns_2_3__1_3 .footer-widget:nth-child(1) .fwidget{margin-bottom:8.483%}.et_pb_gutters3.et_pb_footer_columns_2_3__1_3 .footer-widget:nth-child(2){width:29.667%}.et_pb_gutters3.et_pb_footer_columns_2_3__1_3 .footer-widget:nth-child(2) .fwidget{margin-bottom:18.539%}.et_pb_gutters3.et_pb_footer_columns_1_3__2_3 .footer-widget:nth-child(1){width:29.667%}.et_pb_gutters3.et_pb_footer_columns_1_3__2_3 .footer-widget:nth-child(1) .fwidget{margin-bottom:18.539%}.et_pb_gutters3.et_pb_footer_columns_1_3__2_3 .footer-widget:nth-child(2){width:64.833%}.et_pb_gutters3.et_pb_footer_columns_1_3__2_3 .footer-widget:nth-child(2) .fwidget{margin-bottom:8.483%}.et_pb_gutters3.et_pb_footer_columns_1_4__1_2 .footer-widget:nth-child(-n+2){width:20.875%}.et_pb_gutters3.et_pb_footer_columns_1_4__1_2 .footer-widget:nth-child(-n+2) .fwidget{margin-bottom:26.347%}.et_pb_gutters3.et_pb_footer_columns_1_4__1_2 .footer-widget:nth-child(3){width:47.25%}.et_pb_gutters3.et_pb_footer_columns_1_4__1_2 .footer-widget:nth-child(3) .fwidget{margin-bottom:11.64%}.et_pb_gutters3.et_pb_footer_columns_1_2__1_4 .footer-widget:first-child{width:47.25%}.et_pb_gutters3.et_pb_footer_columns_1_2__1_4 .footer-widget:first-child .fwidget{margin-bottom:11.64%}.et_pb_gutters3.et_pb_footer_columns_1_2__1_4 .footer-widget:nth-child(-n+3):not(:nth-child(1)){width:20.875%}.et_pb_gutters3.et_pb_footer_columns_1_2__1_4 .footer-widget:nth-child(-n+3):not(:nth-child(1)) .fwidget{margin-bottom:26.347%}.et_pb_gutters3.et_pb_footer_columns_1_5__3_5 .footer-widget:nth-child(-n+2){width:15.6%}.et_pb_gutters3.et_pb_footer_columns_1_5__3_5 .footer-widget:nth-child(-n+2) .fwidget{margin-bottom:35.256%}.et_pb_gutters3.et_pb_footer_columns_1_5__3_5 .footer-widget:nth-child(3){width:57.8%}.et_pb_gutters3.et_pb_footer_columns_1_5__3_5 .footer-widget:nth-child(3) .fwidget{margin-bottom:9.516%}.et_pb_gutters3.et_pb_footer_columns_3_5__1_5 .footer-widget:first-child{width:57.8%}.et_pb_gutters3.et_pb_footer_columns_3_5__1_5 .footer-widget:first-child .fwidget{margin-bottom:9.516%}.et_pb_gutters3.et_pb_footer_columns_3_5__1_5 .footer-widget:nth-child(-n+3):not(:nth-child(1)){width:15.6%}.et_pb_gutters3.et_pb_footer_columns_3_5__1_5 .footer-widget:nth-child(-n+3):not(:nth-child(1)) .fwidget{margin-bottom:35.256%}.et_pb_gutters3.et_pb_footer_columns_3_5__2_5 .footer-widget:nth-child(1){width:57.8%}.et_pb_gutters3.et_pb_footer_columns_3_5__2_5 .footer-widget:nth-child(1) .fwidget{margin-bottom:9.516%}.et_pb_gutters3.et_pb_footer_columns_3_5__2_5 .footer-widget:nth-child(2){width:36.7%}.et_pb_gutters3.et_pb_footer_columns_3_5__2_5 .footer-widget:nth-child(2) .fwidget{margin-bottom:14.986%}.et_pb_gutters3.et_pb_footer_columns_2_5__3_5 .footer-widget:nth-child(1){width:36.7%}.et_pb_gutters3.et_pb_footer_columns_2_5__3_5 .footer-widget:nth-child(1) .fwidget{margin-bottom:14.986%}.et_pb_gutters3.et_pb_footer_columns_2_5__3_5 .footer-widget:nth-child(2){width:57.8%}.et_pb_gutters3.et_pb_footer_columns_2_5__3_5 .footer-widget:nth-child(2) .fwidget{margin-bottom:9.516%}.et_pb_gutters3.et_pb_footer_columns_1_2__1_6 .footer-widget:first-child{width:47.25%}.et_pb_gutters3.et_pb_footer_columns_1_2__1_6 .footer-widget:first-child .fwidget{margin-bottom:11.64%}.et_pb_gutters3.et_pb_footer_columns_1_2__1_6 .footer-widget:nth-child(-n+4):not(:nth-child(1)){width:12.083%}.et_pb_gutters3.et_pb_footer_columns_1_2__1_6 .footer-widget:nth-child(-n+4):not(:nth-child(1)) .fwidget{margin-bottom:45.517%}.et_pb_gutters3.et_pb_footer_columns_1_6__1_2 .footer-widget:nth-child(-n+3){width:12.083%}.et_pb_gutters3.et_pb_footer_columns_1_6__1_2 .footer-widget:nth-child(-n+3) .fwidget{margin-bottom:45.517%}.et_pb_gutters3.et_pb_footer_columns_1_6__1_2 .footer-widget:nth-child(4){width:47.25%}.et_pb_gutters3.et_pb_footer_columns_1_6__1_2 .footer-widget:nth-child(4) .fwidget{margin-bottom:11.64%}.et_pb_gutters3.et_pb_footer_columns_1_4_1_2_1_4 .footer-widget:nth-child(-n+3):not(:nth-child(2)){width:20.875%}.et_pb_gutters3.et_pb_footer_columns_1_4_1_2_1_4 .footer-widget:nth-child(-n+3):not(:nth-child(2)) .fwidget{margin-bottom:26.347%}.et_pb_gutters3.et_pb_footer_columns_1_4_1_2_1_4 .footer-widget:nth-child(2){width:47.25%}.et_pb_gutters3.et_pb_footer_columns_1_4_1_2_1_4 .footer-widget:nth-child(2) .fwidget{margin-bottom:11.64%}.et_pb_gutters3.et_pb_footer_columns_1_5_3_5_1_5 .footer-widget:nth-child(-n+3):not(:nth-child(2)){width:15.6%}.et_pb_gutters3.et_pb_footer_columns_1_5_3_5_1_5 .footer-widget:nth-child(-n+3):not(:nth-child(2)) .fwidget{margin-bottom:35.256%}.et_pb_gutters3.et_pb_footer_columns_1_5_3_5_1_5 .footer-widget:nth-child(2){width:57.8%}.et_pb_gutters3.et_pb_footer_columns_1_5_3_5_1_5 .footer-widget:nth-child(2) .fwidget{margin-bottom:9.516%}}
.et-social-icons{float:right}.et-social-icons li{display:inline-block;margin-left:20px}.et-social-icon a{display:inline-block;font-size:24px;position:relative;text-align:center;-webkit-transition:color 300ms ease 0s;transition:color 300ms ease 0s;color:#666;text-decoration:none}.et-social-icons a:hover{opacity:0.7;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}.et-social-icon span{display:none}.et_duplicate_social_icons{display:none}@media all and (max-width: 980px){.et-social-icons{float:none;text-align:center}}@media all and (max-width: 980px){.et-social-icons{margin:0 0 5px}}
#sidebar{padding-bottom:28px}#sidebar .et_pb_widget{margin-bottom:30px;width:100%;float:none}.et_right_sidebar #main-content .et_pb_column_2_3 .et_pb_countdown_timer .section p.value,.et_right_sidebar #main-content .et_pb_column_2_3 .et_pb_countdown_timer .section.sep,.et_left_sidebar #main-content .et_pb_column_2_3 .et_pb_countdown_timer .section p.value,.et_left_sidebar #main-content .et_pb_column_2_3 .et_pb_countdown_timer .section.sep{font-size:44px;line-height:44px}.et_right_sidebar #main-content .et_pb_column_1_2 .et_pb_countdown_timer .section p.value,.et_right_sidebar #main-content .et_pb_column_1_2 .et_pb_countdown_timer .section.sep,.et_left_sidebar #main-content .et_pb_column_1_2 .et_pb_countdown_timer .section p.value,.et_left_sidebar #main-content .et_pb_column_1_2 .et_pb_countdown_timer .section.sep{font-size:32px;line-height:32px}.et_right_sidebar #main-content .et_pb_column_3_8 .et_pb_countdown_timer .section p.value,.et_right_sidebar #main-content .et_pb_column_3_8 .et_pb_countdown_timer .section.sep,.et_left_sidebar #main-content .et_pb_column_3_8 .et_pb_countdown_timer .section p.value,.et_left_sidebar #main-content .et_pb_column_3_8 .et_pb_countdown_timer .section.sep{font-size:24px;line-height:24px}.et_right_sidebar #main-content .et_pb_column_1_3 .et_pb_countdown_timer .section p.value,.et_right_sidebar #main-content .et_pb_column_1_3 .et_pb_countdown_timer .section.sep,.et_left_sidebar #main-content .et_pb_column_1_3 .et_pb_countdown_timer .section p.value,.et_left_sidebar #main-content .et_pb_column_1_3 .et_pb_countdown_timer .section.sep{font-size:20px;line-height:20px}.et_right_sidebar #main-content .et_pb_column_1_4 .et_pb_countdown_timer .section p.value,.et_right_sidebar #main-content .et_pb_column_1_4 .et_pb_countdown_timer .section.sep,.et_left_sidebar #main-content .et_pb_column_1_4 .et_pb_countdown_timer .section p.value,.et_left_sidebar #main-content .et_pb_column_1_4 .et_pb_countdown_timer .section.sep{font-size:16px;line-height:16px}@media all and (min-width: 981px) and (max-width: 1100px){#sidebar .et_pb_widget{margin-left:0}.et_left_sidebar #sidebar .et_pb_widget{margin-right:0}}@media all and (min-width: 981px){#sidebar{float:left;width:20.875%}.et_right_sidebar #left-area{float:left;padding-right:5.5%}.et_right_sidebar #sidebar{padding-left:30px}.et_right_sidebar #main-content .container:before{right:20.875% !important}.et_left_sidebar #left-area{float:right;padding-left:5.5%}.et_left_sidebar #sidebar{padding-right:30px}.et_left_sidebar #main-content .container:before{left:20.875% !important}}@media all and (max-width: 980px){.et_right_sidebar #left-area,.et_right_sidebar #sidebar,.et_left_sidebar #left-area,.et_left_sidebar #sidebar{width:auto;float:none;padding-right:0;padding-left:0}.et_right_sidebar #left-area{margin-right:0}.et_right_sidebar #sidebar{margin-left:0;border-left:none}.et_left_sidebar #left-area{margin-left:0}.et_left_sidebar #sidebar{margin-right:0;border-right:none}}
.widget_search .screen-reader-text,.et_pb_widget .wp-block-search__label{display:none}.widget_search input#s,.widget_search input#searchsubmit,.et_pb_widget .wp-block-search__input,.et_pb_widget .wp-block-search__button{padding:.7em;height:40px !important;margin:0;font-size:14px;line-height:normal !important;border:1px solid #ddd;color:#666}.widget_search #s,.et_pb_widget .wp-block-search__input{width:100%;border-radius:3px}.widget_search #searchform,.et_pb_widget .wp-block-search{position:relative}.widget_search #searchsubmit,.et_pb_widget .wp-block-search__button{background-color:#ddd;-webkit-border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;position:absolute;right:0;top:0}#searchsubmit,.et_pb_widget .wp-block-search__button{cursor:pointer}
/*# sourceURL=divi-dynamic-critical-inline-css */
</style>
<link rel='stylesheet' id='divi-style-css' href='http://haggai-bf.org/wp-content/themes/Divi-child/style.css?ver=4.27.6' media='all' />
<link rel="https://api.w.org/" href="https://haggai-bf.org/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://haggai-bf.org/wp-json/wp/v2/pages/136" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://haggai-bf.org/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress 7.0" />
<link rel="canonical" href="https://haggai-bf.org/register/" />
<link rel='shortlink' href='https://haggai-bf.org/?p=136' />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /><link rel="icon" href="https://haggai-bf.org/wp-content/uploads/2025/03/Logo_Haggai-BF-150x150.png" sizes="32x32" />
<link rel="icon" href="https://haggai-bf.org/wp-content/uploads/2025/03/Logo_Haggai-BF.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://haggai-bf.org/wp-content/uploads/2025/03/Logo_Haggai-BF.png" />
<meta name="msapplication-TileImage" content="https://haggai-bf.org/wp-content/uploads/2025/03/Logo_Haggai-BF.png" />
<link rel="stylesheet" id="et-divi-customizer-global-cached-inline-styles" href="http://haggai-bf.org/wp-content/et-cache/global/et-divi-customizer-global.min.css?ver=1780281736" /><style id="et-critical-inline-css"></style>
</head>
<body class="wp-singular page-template-default page page-id-136 wp-custom-logo wp-theme-Divi wp-child-theme-Divi-child et_pb_button_helper_class et_fixed_nav et_show_nav et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db">
	<div id="page-container">

	
	
			<header id="main-header" data-height-onload="66">
			<div class="container clearfix et_menu_container">
							<div class="logo_container">
					<span class="logo_helper"></span>
					<a href="https://haggai-bf.org/">
						<img src="https://haggai-bf.org/wp-content/uploads/2025/03/Logo_Haggai-BF.png" width="931" height="742" alt="HAGGAI BURKINA FASO" id="logo" data-height-percentage="54" />
					</a>
				</div>
							<div id="et-top-navigation" data-height="66" data-fixed-height="40">
											<nav id="top-menu-nav">
													<ul id="top-menu" class="nav">
																	<li ><a href="https://haggai-bf.org/">Accueil</a></li>
								
								<li class="page_item page-item-844"><a href="https://haggai-bf.org/bitcoin-jatszani-fiokellenorzes-utmutato/">Bitcoin játszani – fiókellenőrzés útmutató</a></li>
<li class="page_item page-item-840"><a href="https://haggai-bf.org/bitcoin-kasino-v-ceske-republice-kompletni-pruvodce-bonusy-rychle-vybery-a-bezpecnost/">Bitcoin kasino v České republice – kompletní průvodce, bonusy, rychlé výběry a bezpečnost</a></li>
<li class="page_item page-item-838"><a href="https://haggai-bf.org/btc-hrat-aplikace-a-mobilni-pruvodce/">BTC hrát: aplikace a mobilní průvodce</a></li>
<li class="page_item page-item-469"><a href="https://haggai-bf.org/canli-casino-siteleri-2026-en-iyi-ve-guvenilir-casino-listesi/">Canlı Casino Siteleri 2026 &#8211; En İyi ve Güvenilir Casino Listesi</a></li>
<li class="page_item page-item-832"><a href="https://haggai-bf.org/casino-bitcoin-guia-paso-a-paso-para-registrarte-e-iniciar-sesion/">Casino Bitcoin: guía paso a paso para registrarte e iniciar sesión</a></li>
<li class="page_item page-item-847"><a href="https://haggai-bf.org/crypto-casino-europe-review-bonuses-payments-mobile-guide-for-dutch-players/">Crypto Casino Europe Review – Bonuses, Payments &#038; Mobile Guide for Dutch Players</a></li>
<li class="page_item page-item-239"><a href="https://haggai-bf.org/magyar-casino-online-fiokellenorzes-lepesei-praktikus-utmutato/">Magyar casino online fiókellenőrzés lépései – Praktikus útmutató</a></li>
<li class="page_item page-item-41"><a href="https://haggai-bf.org/nous-contacter/">Nous contacter</a></li>
<li class="page_item page-item-828"><a href="https://haggai-bf.org/pin-up-az-rbaycanin-n-yaxsi-kazinosu-r-smi-sayt/">Pin Up &#8211; Azərbaycanın ən yaxşı kazinosu | Rəsmi sayt</a></li>
<li class="page_item page-item-826"><a href="https://haggai-bf.org/pin-up-casino-az-rbaycanda-onlayn-kazino-pin-up/">Pin Up Casino &#8211; Azərbaycanda onlayn kazino Pin-Up</a></li>
<li class="page_item page-item-821"><a href="https://haggai-bf.org/pin-up-casino-onlayn-az-rbaycan/">Pin Up Casino Onlayn Azərbaycan</a></li>
									<li class="cat-item cat-item-11"><a href="https://haggai-bf.org/category/public/">public</a>
</li>
							</ul>
												</nav>
					
					
					
											<div id="et_top_search">
							<span id="et_search_icon"></span>
						</div>
					
					<div id="et_mobile_nav_menu">
				<div class="mobile_nav closed">
					<span class="select_page">Sélectionner une page</span>
					<span class="mobile_menu_bar mobile_menu_bar_toggle"></span>
				</div>
			</div>				</div> <!-- #et-top-navigation -->
			</div> <!-- .container -->
						<div class="et_search_outer">
				<div class="container et_search_form_container">
					<form role="search" method="get" class="et-search-form" action="https://haggai-bf.org/">
					<input type="search" class="et-search-field" placeholder="Rechercher &hellip;" value="" name="s" title="Rechercher:" />					</form>
					<span class="et_close_search_field"></span>
				</div>
			</div>
					</header> <!-- #main-header -->
			<div id="et-main-area">
	
<div id="main-content">


	<div class="container">
		<div id="content-area" class="clearfix">
			<div id="left-area">


			
				<article id="post-136" class="post-136 page type-page status-publish hentry">

				
					<h1 class="entry-title main_title">S’inscrire</h1>
				
				
					<div class="entry-content">
					<p>[ultimatemember form_id= »129&Prime;]</p>
					</div>

				
				</article>

			

			</div>

					</div>
	</div>


</div>


			<footer id="main-footer">
				

		
				<div id="footer-bottom">
					<div class="container clearfix">
				<ul class="et-social-icons">

	<li class="et-social-icon et-social-facebook">
		<a href="#" class="icon">
			<span>Facebook</span>
		</a>
	</li>
	<li class="et-social-icon et-social-twitter">
		<a href="#" class="icon">
			<span>X</span>
		</a>
	</li>
	<li class="et-social-icon et-social-instagram">
		<a href="#" class="icon">
			<span>Instagram</span>
		</a>
	</li>
	<li class="et-social-icon et-social-rss">
		<a href="https://haggai-bf.org/feed/" class="icon">
			<span>RSS</span>
		</a>
	</li>

</ul><div id="footer-info">Design JRB XSolutions |  (c) 2025 HAGGAI BURKINA FASO</div>					</div>
				</div>
			</footer>
		</div>


	</div>

	<script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/Divi-child/*","/wp-content/themes/Divi/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<script id="jquery-core-js" src="http://haggai-bf.org/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"></script>
<script id="jquery-migrate-js" src="http://haggai-bf.org/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1"></script>
<script id="jquery-js-after">
jqueryParams.length&&$.each(jqueryParams,function(e,r){if("function"==typeof r){var n=String(r);n.replace("$","jQuery");var a=new Function("return "+n)();$(document).ready(a)}});
//# sourceURL=jquery-js-after
</script>
<script id="divi-custom-script-js-extra">
var DIVI = {"item_count":"%d Item","items_count":"%d Items"};
var et_builder_utils_params = {"condition":{"diviTheme":true,"extraTheme":false},"scrollLocations":["app","top"],"builderScrollLocations":{"desktop":"app","tablet":"app","phone":"app"},"onloadScrollLocation":"app","builderType":"fe"};
var et_frontend_scripts = {"builderCssContainerPrefix":"#et-boc","builderCssLayoutPrefix":"#et-boc .et-l"};
var et_pb_custom = {"ajaxurl":"http://haggai-bf.org/wp-admin/admin-ajax.php","images_uri":"http://haggai-bf.org/wp-content/themes/Divi/images","builder_images_uri":"http://haggai-bf.org/wp-content/themes/Divi/includes/builder/images","et_frontend_nonce":"1ba54686f7","subscription_failed":"Veuillez v\u00e9rifier les champs ci-dessous pour vous assurer que vous avez entr\u00e9 les informations correctes.","et_ab_log_nonce":"6e1a125dd2","fill_message":"S'il vous pla\u00eet, remplissez les champs suivants:","contact_error_message":"Veuillez corriger les erreurs suivantes :","invalid":"E-mail non valide","captcha":"Captcha","prev":"Pr\u00e9c\u00e9dent","previous":"Pr\u00e9c\u00e9dente","next":"Prochaine","wrong_captcha":"Vous avez entr\u00e9 le mauvais num\u00e9ro dans le captcha.","wrong_checkbox":"Case \u00e0 cocher","ignore_waypoints":"no","is_divi_theme_used":"1","widget_search_selector":".widget_search","ab_tests":[],"is_ab_testing_active":"","page_id":"136","unique_test_id":"","ab_bounce_rate":"5","is_cache_plugin_active":"yes","is_shortcode_tracking":"","tinymce_uri":"http://haggai-bf.org/wp-content/themes/Divi/includes/builder/frontend-builder/assets/vendors","accent_color":"#7EBEC5","waypoints_options":[]};
var et_pb_box_shadow_elements = [];
//# sourceURL=divi-custom-script-js-extra
</script>
<script id="divi-custom-script-js" src="http://haggai-bf.org/wp-content/themes/Divi/js/scripts.min.js?ver=4.27.6"></script>
<script id="et-core-common-js" src="http://haggai-bf.org/wp-content/themes/Divi/core/admin/js/common.js?ver=4.27.6"></script>
</body>
</html>
