├── .github └── workflows │ └── main.yml ├── LICENSE ├── README.md ├── about.html ├── assets ├── bootstrap.bundle.min.js ├── bootstrap.min.css ├── img │ ├── dana.svg │ ├── facebook.png │ ├── index.php │ ├── saweria.png │ ├── telegram.png │ └── youtube.png ├── index.php ├── jquery.min.js ├── script.min.js ├── script.min_en.js └── styles.min.css ├── dist ├── assets │ ├── img │ │ ├── favicon.svg │ │ ├── index.php │ │ └── mutiara.svg │ └── index.php ├── css │ ├── adminlte.css │ ├── adminlte.css.map │ ├── adminlte.min.css │ ├── adminlte.min.css.map │ ├── adminlte.rtl.css │ ├── adminlte.rtl.css.map │ ├── adminlte.rtl.min.css │ ├── adminlte.rtl.min.css.map │ ├── bootstrap.css │ ├── bootstrap.min.css │ ├── index.php │ └── logo.css ├── index.php ├── js │ ├── adminlte.js │ ├── adminlte.js.map │ ├── adminlte.min.js │ ├── adminlte.min.js.map │ └── index.php ├── login │ ├── all.min.css │ ├── bootstrap.min.css │ ├── bootstrap.min.js │ ├── index.php │ ├── jquery-3.5.1.slim.min.js │ └── popper.min.js └── pages │ ├── add_bandwidth.php │ ├── add_batch.php │ ├── add_mac.php │ ├── add_plan.php │ ├── add_user.php │ ├── api │ ├── bandwidth.php │ ├── daily_user.php │ ├── data.php │ ├── index.php │ ├── mac_address.php │ └── radgroup.php │ ├── auth.php │ ├── billing │ ├── admin.php │ ├── auth.php │ ├── balance.php │ ├── edit.php │ ├── index.php │ ├── logout.php │ ├── message.php │ └── update.php │ ├── client_tester.php │ ├── data │ ├── backup.php │ ├── data.php │ ├── db_config.php │ ├── history.php │ ├── index.php │ ├── mysqli_db.php │ ├── online.php │ ├── pdo_db.php │ ├── phpqrcode │ │ ├── .png-errors.txt │ │ ├── CHANGELOG │ │ ├── INSTALL │ │ ├── LICENSE │ │ ├── Maizil.png-errors.txt │ │ ├── README │ │ ├── VERSION │ │ ├── bindings │ │ │ └── tcpdf │ │ │ │ └── qrcode.php │ │ ├── cache │ │ │ ├── frame_1.dat │ │ │ ├── frame_1.png │ │ │ ├── frame_10.dat │ │ │ ├── frame_10.png │ │ │ ├── frame_11.dat │ │ │ ├── frame_11.png │ │ │ ├── frame_12.dat │ │ │ ├── frame_12.png │ │ │ ├── frame_13.dat │ │ │ ├── frame_13.png │ │ │ ├── frame_14.dat │ │ │ ├── frame_14.png │ │ │ ├── frame_15.dat │ │ │ ├── frame_15.png │ │ │ ├── frame_16.dat │ │ │ ├── frame_16.png │ │ │ ├── frame_17.dat │ │ │ ├── frame_17.png │ │ │ ├── frame_18.dat │ │ │ ├── frame_18.png │ │ │ ├── frame_19.dat │ │ │ ├── frame_19.png │ │ │ ├── frame_2.dat │ │ │ ├── frame_2.png │ │ │ ├── frame_20.dat │ │ │ ├── frame_20.png │ │ │ ├── frame_21.dat │ │ │ ├── frame_21.png │ │ │ ├── frame_22.dat │ │ │ ├── frame_22.png │ │ │ ├── frame_23.dat │ │ │ ├── frame_23.png │ │ │ ├── frame_24.dat │ │ │ ├── frame_24.png │ │ │ ├── frame_25.dat │ │ │ ├── frame_25.png │ │ │ ├── frame_26.dat │ │ │ ├── frame_26.png │ │ │ ├── frame_27.dat │ │ │ ├── frame_27.png │ │ │ ├── frame_28.dat │ │ │ ├── frame_28.png │ │ │ ├── frame_29.dat │ │ │ ├── frame_29.png │ │ │ ├── frame_3.dat │ │ │ ├── frame_3.png │ │ │ ├── frame_30.dat │ │ │ ├── frame_30.png │ │ │ ├── frame_31.dat │ │ │ ├── frame_31.png │ │ │ ├── frame_32.dat │ │ │ ├── frame_32.png │ │ │ ├── frame_33.dat │ │ │ ├── frame_33.png │ │ │ ├── frame_34.dat │ │ │ ├── frame_34.png │ │ │ ├── frame_35.dat │ │ │ ├── frame_35.png │ │ │ ├── frame_36.dat │ │ │ ├── frame_36.png │ │ │ ├── frame_37.dat │ │ │ ├── frame_37.png │ │ │ ├── frame_38.dat │ │ │ ├── frame_38.png │ │ │ ├── frame_39.dat │ │ │ ├── frame_39.png │ │ │ ├── frame_4.dat │ │ │ ├── frame_4.png │ │ │ ├── frame_40.dat │ │ │ ├── frame_40.png │ │ │ ├── frame_5.dat │ │ │ ├── frame_5.png │ │ │ ├── frame_6.dat │ │ │ ├── frame_6.png │ │ │ ├── frame_7.dat │ │ │ ├── frame_7.png │ │ │ ├── frame_8.dat │ │ │ ├── frame_8.png │ │ │ ├── frame_9.dat │ │ │ ├── frame_9.png │ │ │ ├── mask_0 │ │ │ │ ├── mask_101_0.dat │ │ │ │ ├── mask_105_0.dat │ │ │ │ ├── mask_109_0.dat │ │ │ │ ├── mask_113_0.dat │ │ │ │ ├── mask_117_0.dat │ │ │ │ ├── mask_121_0.dat │ │ │ │ ├── mask_125_0.dat │ │ │ │ ├── mask_129_0.dat │ │ │ │ ├── mask_133_0.dat │ │ │ │ ├── mask_137_0.dat │ │ │ │ ├── mask_141_0.dat │ │ │ │ ├── mask_145_0.dat │ │ │ │ ├── mask_149_0.dat │ │ │ │ ├── mask_153_0.dat │ │ │ │ ├── mask_157_0.dat │ │ │ │ ├── mask_161_0.dat │ │ │ │ ├── mask_165_0.dat │ │ │ │ ├── mask_169_0.dat │ │ │ │ ├── mask_173_0.dat │ │ │ │ ├── mask_177_0.dat │ │ │ │ ├── mask_21_0.dat │ │ │ │ ├── mask_25_0.dat │ │ │ │ ├── mask_29_0.dat │ │ │ │ ├── mask_33_0.dat │ │ │ │ ├── mask_37_0.dat │ │ │ │ ├── mask_41_0.dat │ │ │ │ ├── mask_45_0.dat │ │ │ │ ├── mask_49_0.dat │ │ │ │ ├── mask_53_0.dat │ │ │ │ ├── mask_57_0.dat │ │ │ │ ├── mask_61_0.dat │ │ │ │ ├── mask_65_0.dat │ │ │ │ ├── mask_69_0.dat │ │ │ │ ├── mask_73_0.dat │ │ │ │ ├── mask_77_0.dat │ │ │ │ ├── mask_81_0.dat │ │ │ │ ├── mask_85_0.dat │ │ │ │ ├── mask_89_0.dat │ │ │ │ ├── mask_93_0.dat │ │ │ │ └── mask_97_0.dat │ │ │ ├── mask_1 │ │ │ │ ├── mask_101_1.dat │ │ │ │ ├── mask_105_1.dat │ │ │ │ ├── mask_109_1.dat │ │ │ │ ├── mask_113_1.dat │ │ │ │ ├── mask_117_1.dat │ │ │ │ ├── mask_121_1.dat │ │ │ │ ├── mask_125_1.dat │ │ │ │ ├── mask_129_1.dat │ │ │ │ ├── mask_133_1.dat │ │ │ │ ├── mask_137_1.dat │ │ │ │ ├── mask_141_1.dat │ │ │ │ ├── mask_145_1.dat │ │ │ │ ├── mask_149_1.dat │ │ │ │ ├── mask_153_1.dat │ │ │ │ ├── mask_157_1.dat │ │ │ │ ├── mask_161_1.dat │ │ │ │ ├── mask_165_1.dat │ │ │ │ ├── mask_169_1.dat │ │ │ │ ├── mask_173_1.dat │ │ │ │ ├── mask_177_1.dat │ │ │ │ ├── mask_21_1.dat │ │ │ │ ├── mask_25_1.dat │ │ │ │ ├── mask_29_1.dat │ │ │ │ ├── mask_33_1.dat │ │ │ │ ├── mask_37_1.dat │ │ │ │ ├── mask_41_1.dat │ │ │ │ ├── mask_45_1.dat │ │ │ │ ├── mask_49_1.dat │ │ │ │ ├── mask_53_1.dat │ │ │ │ ├── mask_57_1.dat │ │ │ │ ├── mask_61_1.dat │ │ │ │ ├── mask_65_1.dat │ │ │ │ ├── mask_69_1.dat │ │ │ │ ├── mask_73_1.dat │ │ │ │ ├── mask_77_1.dat │ │ │ │ ├── mask_81_1.dat │ │ │ │ ├── mask_85_1.dat │ │ │ │ ├── mask_89_1.dat │ │ │ │ ├── mask_93_1.dat │ │ │ │ └── mask_97_1.dat │ │ │ ├── mask_2 │ │ │ │ ├── mask_101_2.dat │ │ │ │ ├── mask_105_2.dat │ │ │ │ ├── mask_109_2.dat │ │ │ │ ├── mask_113_2.dat │ │ │ │ ├── mask_117_2.dat │ │ │ │ ├── mask_121_2.dat │ │ │ │ ├── mask_125_2.dat │ │ │ │ ├── mask_129_2.dat │ │ │ │ ├── mask_133_2.dat │ │ │ │ ├── mask_137_2.dat │ │ │ │ ├── mask_141_2.dat │ │ │ │ ├── mask_145_2.dat │ │ │ │ ├── mask_149_2.dat │ │ │ │ ├── mask_153_2.dat │ │ │ │ ├── mask_157_2.dat │ │ │ │ ├── mask_161_2.dat │ │ │ │ ├── mask_165_2.dat │ │ │ │ ├── mask_169_2.dat │ │ │ │ ├── mask_173_2.dat │ │ │ │ ├── mask_177_2.dat │ │ │ │ ├── mask_21_2.dat │ │ │ │ ├── mask_25_2.dat │ │ │ │ ├── mask_29_2.dat │ │ │ │ ├── mask_33_2.dat │ │ │ │ ├── mask_37_2.dat │ │ │ │ ├── mask_41_2.dat │ │ │ │ ├── mask_45_2.dat │ │ │ │ ├── mask_49_2.dat │ │ │ │ ├── mask_53_2.dat │ │ │ │ ├── mask_57_2.dat │ │ │ │ ├── mask_61_2.dat │ │ │ │ ├── mask_65_2.dat │ │ │ │ ├── mask_69_2.dat │ │ │ │ ├── mask_73_2.dat │ │ │ │ ├── mask_77_2.dat │ │ │ │ ├── mask_81_2.dat │ │ │ │ ├── mask_85_2.dat │ │ │ │ ├── mask_89_2.dat │ │ │ │ ├── mask_93_2.dat │ │ │ │ └── mask_97_2.dat │ │ │ ├── mask_3 │ │ │ │ ├── mask_101_3.dat │ │ │ │ ├── mask_105_3.dat │ │ │ │ ├── mask_109_3.dat │ │ │ │ ├── mask_113_3.dat │ │ │ │ ├── mask_117_3.dat │ │ │ │ ├── mask_121_3.dat │ │ │ │ ├── mask_125_3.dat │ │ │ │ ├── mask_129_3.dat │ │ │ │ ├── mask_133_3.dat │ │ │ │ ├── mask_137_3.dat │ │ │ │ ├── mask_141_3.dat │ │ │ │ ├── mask_145_3.dat │ │ │ │ ├── mask_149_3.dat │ │ │ │ ├── mask_153_3.dat │ │ │ │ ├── mask_157_3.dat │ │ │ │ ├── mask_161_3.dat │ │ │ │ ├── mask_165_3.dat │ │ │ │ ├── mask_169_3.dat │ │ │ │ ├── mask_173_3.dat │ │ │ │ ├── mask_177_3.dat │ │ │ │ ├── mask_21_3.dat │ │ │ │ ├── mask_25_3.dat │ │ │ │ ├── mask_29_3.dat │ │ │ │ ├── mask_33_3.dat │ │ │ │ ├── mask_37_3.dat │ │ │ │ ├── mask_41_3.dat │ │ │ │ ├── mask_45_3.dat │ │ │ │ ├── mask_49_3.dat │ │ │ │ ├── mask_53_3.dat │ │ │ │ ├── mask_57_3.dat │ │ │ │ ├── mask_61_3.dat │ │ │ │ ├── mask_65_3.dat │ │ │ │ ├── mask_69_3.dat │ │ │ │ ├── mask_73_3.dat │ │ │ │ ├── mask_77_3.dat │ │ │ │ ├── mask_81_3.dat │ │ │ │ ├── mask_85_3.dat │ │ │ │ ├── mask_89_3.dat │ │ │ │ ├── mask_93_3.dat │ │ │ │ └── mask_97_3.dat │ │ │ ├── mask_4 │ │ │ │ ├── mask_101_4.dat │ │ │ │ ├── mask_105_4.dat │ │ │ │ ├── mask_109_4.dat │ │ │ │ ├── mask_113_4.dat │ │ │ │ ├── mask_117_4.dat │ │ │ │ ├── mask_121_4.dat │ │ │ │ ├── mask_125_4.dat │ │ │ │ ├── mask_129_4.dat │ │ │ │ ├── mask_133_4.dat │ │ │ │ ├── mask_137_4.dat │ │ │ │ ├── mask_141_4.dat │ │ │ │ ├── mask_145_4.dat │ │ │ │ ├── mask_149_4.dat │ │ │ │ ├── mask_153_4.dat │ │ │ │ ├── mask_157_4.dat │ │ │ │ ├── mask_161_4.dat │ │ │ │ ├── mask_165_4.dat │ │ │ │ ├── mask_169_4.dat │ │ │ │ ├── mask_173_4.dat │ │ │ │ ├── mask_177_4.dat │ │ │ │ ├── mask_21_4.dat │ │ │ │ ├── mask_25_4.dat │ │ │ │ ├── mask_29_4.dat │ │ │ │ ├── mask_33_4.dat │ │ │ │ ├── mask_37_4.dat │ │ │ │ ├── mask_41_4.dat │ │ │ │ ├── mask_45_4.dat │ │ │ │ ├── mask_49_4.dat │ │ │ │ ├── mask_53_4.dat │ │ │ │ ├── mask_57_4.dat │ │ │ │ ├── mask_61_4.dat │ │ │ │ ├── mask_65_4.dat │ │ │ │ ├── mask_69_4.dat │ │ │ │ ├── mask_73_4.dat │ │ │ │ ├── mask_77_4.dat │ │ │ │ ├── mask_81_4.dat │ │ │ │ ├── mask_85_4.dat │ │ │ │ ├── mask_89_4.dat │ │ │ │ ├── mask_93_4.dat │ │ │ │ └── mask_97_4.dat │ │ │ ├── mask_5 │ │ │ │ ├── mask_101_5.dat │ │ │ │ ├── mask_105_5.dat │ │ │ │ ├── mask_109_5.dat │ │ │ │ ├── mask_113_5.dat │ │ │ │ ├── mask_117_5.dat │ │ │ │ ├── mask_121_5.dat │ │ │ │ ├── mask_125_5.dat │ │ │ │ ├── mask_129_5.dat │ │ │ │ ├── mask_133_5.dat │ │ │ │ ├── mask_137_5.dat │ │ │ │ ├── mask_141_5.dat │ │ │ │ ├── mask_145_5.dat │ │ │ │ ├── mask_149_5.dat │ │ │ │ ├── mask_153_5.dat │ │ │ │ ├── mask_157_5.dat │ │ │ │ ├── mask_161_5.dat │ │ │ │ ├── mask_165_5.dat │ │ │ │ ├── mask_169_5.dat │ │ │ │ ├── mask_173_5.dat │ │ │ │ ├── mask_177_5.dat │ │ │ │ ├── mask_21_5.dat │ │ │ │ ├── mask_25_5.dat │ │ │ │ ├── mask_29_5.dat │ │ │ │ ├── mask_33_5.dat │ │ │ │ ├── mask_37_5.dat │ │ │ │ ├── mask_41_5.dat │ │ │ │ ├── mask_45_5.dat │ │ │ │ ├── mask_49_5.dat │ │ │ │ ├── mask_53_5.dat │ │ │ │ ├── mask_57_5.dat │ │ │ │ ├── mask_61_5.dat │ │ │ │ ├── mask_65_5.dat │ │ │ │ ├── mask_69_5.dat │ │ │ │ ├── mask_73_5.dat │ │ │ │ ├── mask_77_5.dat │ │ │ │ ├── mask_81_5.dat │ │ │ │ ├── mask_85_5.dat │ │ │ │ ├── mask_89_5.dat │ │ │ │ ├── mask_93_5.dat │ │ │ │ └── mask_97_5.dat │ │ │ ├── mask_6 │ │ │ │ ├── mask_101_6.dat │ │ │ │ ├── mask_105_6.dat │ │ │ │ ├── mask_109_6.dat │ │ │ │ ├── mask_113_6.dat │ │ │ │ ├── mask_117_6.dat │ │ │ │ ├── mask_121_6.dat │ │ │ │ ├── mask_125_6.dat │ │ │ │ ├── mask_129_6.dat │ │ │ │ ├── mask_133_6.dat │ │ │ │ ├── mask_137_6.dat │ │ │ │ ├── mask_141_6.dat │ │ │ │ ├── mask_145_6.dat │ │ │ │ ├── mask_149_6.dat │ │ │ │ ├── mask_153_6.dat │ │ │ │ ├── mask_157_6.dat │ │ │ │ ├── mask_161_6.dat │ │ │ │ ├── mask_165_6.dat │ │ │ │ ├── mask_169_6.dat │ │ │ │ ├── mask_173_6.dat │ │ │ │ ├── mask_177_6.dat │ │ │ │ ├── mask_21_6.dat │ │ │ │ ├── mask_25_6.dat │ │ │ │ ├── mask_29_6.dat │ │ │ │ ├── mask_33_6.dat │ │ │ │ ├── mask_37_6.dat │ │ │ │ ├── mask_41_6.dat │ │ │ │ ├── mask_45_6.dat │ │ │ │ ├── mask_49_6.dat │ │ │ │ ├── mask_53_6.dat │ │ │ │ ├── mask_57_6.dat │ │ │ │ ├── mask_61_6.dat │ │ │ │ ├── mask_65_6.dat │ │ │ │ ├── mask_69_6.dat │ │ │ │ ├── mask_73_6.dat │ │ │ │ ├── mask_77_6.dat │ │ │ │ ├── mask_81_6.dat │ │ │ │ ├── mask_85_6.dat │ │ │ │ ├── mask_89_6.dat │ │ │ │ ├── mask_93_6.dat │ │ │ │ └── mask_97_6.dat │ │ │ └── mask_7 │ │ │ │ ├── mask_101_7.dat │ │ │ │ ├── mask_105_7.dat │ │ │ │ ├── mask_109_7.dat │ │ │ │ ├── mask_113_7.dat │ │ │ │ ├── mask_117_7.dat │ │ │ │ ├── mask_121_7.dat │ │ │ │ ├── mask_125_7.dat │ │ │ │ ├── mask_129_7.dat │ │ │ │ ├── mask_133_7.dat │ │ │ │ ├── mask_137_7.dat │ │ │ │ ├── mask_141_7.dat │ │ │ │ ├── mask_145_7.dat │ │ │ │ ├── mask_149_7.dat │ │ │ │ ├── mask_153_7.dat │ │ │ │ ├── mask_157_7.dat │ │ │ │ ├── mask_161_7.dat │ │ │ │ ├── mask_165_7.dat │ │ │ │ ├── mask_169_7.dat │ │ │ │ ├── mask_173_7.dat │ │ │ │ ├── mask_177_7.dat │ │ │ │ ├── mask_21_7.dat │ │ │ │ ├── mask_25_7.dat │ │ │ │ ├── mask_29_7.dat │ │ │ │ ├── mask_33_7.dat │ │ │ │ ├── mask_37_7.dat │ │ │ │ ├── mask_41_7.dat │ │ │ │ ├── mask_45_7.dat │ │ │ │ ├── mask_49_7.dat │ │ │ │ ├── mask_53_7.dat │ │ │ │ ├── mask_57_7.dat │ │ │ │ ├── mask_61_7.dat │ │ │ │ ├── mask_65_7.dat │ │ │ │ ├── mask_69_7.dat │ │ │ │ ├── mask_73_7.dat │ │ │ │ ├── mask_77_7.dat │ │ │ │ ├── mask_81_7.dat │ │ │ │ ├── mask_85_7.dat │ │ │ │ ├── mask_89_7.dat │ │ │ │ ├── mask_93_7.dat │ │ │ │ └── mask_97_7.dat │ │ ├── composer.json │ │ ├── composer.lock │ │ ├── index.php │ │ ├── phpqrcode.php │ │ ├── qrbitstream.php │ │ ├── qrconfig.php │ │ ├── qrconst.php │ │ ├── qrencode.php │ │ ├── qrimage.php │ │ ├── qrinput.php │ │ ├── qrlib.php │ │ ├── qrmask.php │ │ ├── qrrscode.php │ │ ├── qrspec.php │ │ ├── qrsplit.php │ │ ├── qrtools.php │ │ ├── tools │ │ │ ├── merge.bat │ │ │ ├── merge.php │ │ │ ├── merge.sh │ │ │ ├── merged_config.php │ │ │ └── merged_header.php │ │ └── vendor │ │ │ ├── autoload.php │ │ │ ├── chillerlan │ │ │ ├── php-qrcode │ │ │ │ ├── .idea │ │ │ │ │ ├── codeStyles │ │ │ │ │ │ ├── Project.xml │ │ │ │ │ │ └── codeStyleConfig.xml │ │ │ │ │ └── inspectionProfiles │ │ │ │ │ │ └── Project_Default.xml │ │ │ │ ├── LICENSE-ASL-2.0 │ │ │ │ ├── LICENSE-MIT │ │ │ │ ├── NOTICE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ └── src │ │ │ │ │ ├── Common │ │ │ │ │ ├── BitBuffer.php │ │ │ │ │ ├── ECICharset.php │ │ │ │ │ ├── EccLevel.php │ │ │ │ │ ├── GDLuminanceSource.php │ │ │ │ │ ├── GF256.php │ │ │ │ │ ├── GenericGFPoly.php │ │ │ │ │ ├── IMagickLuminanceSource.php │ │ │ │ │ ├── LuminanceSourceAbstract.php │ │ │ │ │ ├── LuminanceSourceInterface.php │ │ │ │ │ ├── MaskPattern.php │ │ │ │ │ ├── Mode.php │ │ │ │ │ └── Version.php │ │ │ │ │ ├── Data │ │ │ │ │ ├── AlphaNum.php │ │ │ │ │ ├── Byte.php │ │ │ │ │ ├── ECI.php │ │ │ │ │ ├── Hanzi.php │ │ │ │ │ ├── Kanji.php │ │ │ │ │ ├── Number.php │ │ │ │ │ ├── QRCodeDataException.php │ │ │ │ │ ├── QRData.php │ │ │ │ │ ├── QRDataModeAbstract.php │ │ │ │ │ ├── QRDataModeInterface.php │ │ │ │ │ ├── QRMatrix.php │ │ │ │ │ └── ReedSolomonEncoder.php │ │ │ │ │ ├── Decoder │ │ │ │ │ ├── Binarizer.php │ │ │ │ │ ├── BitMatrix.php │ │ │ │ │ ├── Decoder.php │ │ │ │ │ ├── DecoderResult.php │ │ │ │ │ ├── QRCodeDecoderException.php │ │ │ │ │ └── ReedSolomonDecoder.php │ │ │ │ │ ├── Detector │ │ │ │ │ ├── AlignmentPattern.php │ │ │ │ │ ├── AlignmentPatternFinder.php │ │ │ │ │ ├── Detector.php │ │ │ │ │ ├── FinderPattern.php │ │ │ │ │ ├── FinderPatternFinder.php │ │ │ │ │ ├── GridSampler.php │ │ │ │ │ ├── PerspectiveTransform.php │ │ │ │ │ ├── QRCodeDetectorException.php │ │ │ │ │ └── ResultPoint.php │ │ │ │ │ ├── Output │ │ │ │ │ ├── QRCodeOutputException.php │ │ │ │ │ ├── QREps.php │ │ │ │ │ ├── QRFpdf.php │ │ │ │ │ ├── QRGdImage.php │ │ │ │ │ ├── QRGdImageBMP.php │ │ │ │ │ ├── QRGdImageGIF.php │ │ │ │ │ ├── QRGdImageJPEG.php │ │ │ │ │ ├── QRGdImagePNG.php │ │ │ │ │ ├── QRGdImageWEBP.php │ │ │ │ │ ├── QRImage.php │ │ │ │ │ ├── QRImagick.php │ │ │ │ │ ├── QRMarkup.php │ │ │ │ │ ├── QRMarkupHTML.php │ │ │ │ │ ├── QRMarkupSVG.php │ │ │ │ │ ├── QROutputAbstract.php │ │ │ │ │ ├── QROutputInterface.php │ │ │ │ │ ├── QRString.php │ │ │ │ │ ├── QRStringJSON.php │ │ │ │ │ └── QRStringText.php │ │ │ │ │ ├── QRCode.php │ │ │ │ │ ├── QRCodeException.php │ │ │ │ │ ├── QROptions.php │ │ │ │ │ └── QROptionsTrait.php │ │ │ └── php-settings-container │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── composer.json │ │ │ │ ├── rules-magic-access.neon │ │ │ │ └── src │ │ │ │ ├── SettingsContainerAbstract.php │ │ │ │ └── SettingsContainerInterface.php │ │ │ └── composer │ │ │ ├── ClassLoader.php │ │ │ ├── InstalledVersions.php │ │ │ ├── LICENSE │ │ │ ├── autoload_classmap.php │ │ │ ├── autoload_namespaces.php │ │ │ ├── autoload_psr4.php │ │ │ ├── autoload_real.php │ │ │ ├── autoload_static.php │ │ │ ├── installed.json │ │ │ ├── installed.php │ │ │ └── platform_check.php │ ├── printTickets1.php │ ├── printTickets2.php │ ├── printTickets3.php │ ├── printTickets4.php │ ├── radius_log.php │ └── tmp │ │ └── index.php │ ├── edit_bw.php │ ├── edit_plan.php │ ├── index.php │ ├── js │ ├── index.php │ └── script.js │ ├── layout │ └── header.php │ ├── list_bandwidth.php │ ├── list_batch.php │ ├── list_plan.php │ ├── list_user.php │ ├── login.php │ ├── logo │ ├── index.php │ └── logo.png │ ├── logout.php │ ├── mac_binding.php │ ├── online_user.php │ ├── plugins │ ├── chart-script.js │ ├── chart.min.js │ ├── daily-user-chart.js │ ├── feather.min.js │ ├── feather.min.js.map │ └── index.php │ ├── print_setting.php │ ├── print_user.php │ ├── reset_user.php │ ├── submit_config.php │ ├── sys_db.php │ ├── sys_info.php │ ├── update_bw.php │ └── update_plan.php ├── index.php ├── radmon.sql └── screenshot ├── bandwidth.png ├── dashboard.png ├── list_user.png ├── logo.svg ├── mac_binding.png ├── online_user.png ├── plans.png ├── print_batch.png ├── print_setting.png ├── print_user.png └── system.png /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Notify Telegram on Release 2 | 3 | on: 4 | release: 5 | types: [published] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | notify: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout repository 13 | uses: actions/checkout@v3 14 | 15 | - name: Get release info 16 | id: release-info 17 | run: | 18 | echo "RELEASE_TAG=${{ github.event.release.tag_name }}" >> $GITHUB_ENV 19 | echo "RELEASE_NAME=${{ github.event.release.name }}" >> $GITHUB_ENV 20 | echo "RELEASE_BODY=${{ github.event.release.body }}" >> $GITHUB_ENV 21 | 22 | - name: Get current time 23 | id: current_time 24 | run: echo "CURRENT_TIME=$(TZ=Asia/Jakarta date +'%Y-%m-%d %H:%M:%S')" >> $GITHUB_ENV 25 | 26 | - name: Notify Telegram 27 | env: 28 | TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }} 29 | CHAT_ID: ${{ secrets.CHAT_ID }} 30 | RELEASE_TAG: ${{ env.RELEASE_TAG }} 31 | RELEASE_NAME: ${{ env.RELEASE_NAME }} 32 | RELEASE_BODY: ${{ env.RELEASE_BODY }} 33 | CURRENT_TIME: ${{ env.CURRENT_TIME }} 34 | REPLY_TO_MESSAGE_ID: ${{ secrets.REPLY_TO_MESSAGE_ID }} 35 | run: | 36 | MESSAGE=$(cat <<-EOF 37 | ▬▬▬▬▬▬▬▬▬▬▬▬▬▬ 38 | NEW UPDATE 39 | ▬▬▬▬▬▬▬▬▬▬▬▬▬▬ 40 | NAME : \`${RELEASE_NAME}\` 41 | TAG : \`${RELEASE_TAG}\` 42 | DESC : \`${RELEASE_BODY}\` 43 | DATE : \`${CURRENT_TIME}\` 44 | REPO : \`Maizil41/RadiusMonitor\` 45 | URL : [Click Here](https://github.com/Maizil41/RadiusMonitor/releases/tag/${RELEASE_TAG}) 46 | ▬▬▬▬▬▬▬▬▬▬▬▬▬▬ 47 | EOF 48 | ) 49 | curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \ 50 | -d chat_id=$CHAT_ID \ 51 | -d parse_mode=Markdown \ 52 | -d text="$MESSAGE" \ 53 | -d reply_to_message_id=$REPLY_TO_MESSAGE_ID 54 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Maizil41 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /assets/img/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maizil41/RadiusMonitor/fbe81acca5259c2a29708f712905d6a2d022ebca/assets/img/facebook.png -------------------------------------------------------------------------------- /assets/img/saweria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maizil41/RadiusMonitor/fbe81acca5259c2a29708f712905d6a2d022ebca/assets/img/saweria.png -------------------------------------------------------------------------------- /assets/img/telegram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maizil41/RadiusMonitor/fbe81acca5259c2a29708f712905d6a2d022ebca/assets/img/telegram.png -------------------------------------------------------------------------------- /assets/img/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Maizil41/RadiusMonitor/fbe81acca5259c2a29708f712905d6a2d022ebca/assets/img/youtube.png -------------------------------------------------------------------------------- /assets/script.min.js: -------------------------------------------------------------------------------- 1 | $("#btn-qris").click(function(){$("#qr-qris").modal("show")}), 2 | $("#btn-bca").click(function(){$("#qr-bca").modal("show")}), 3 | $("#btn-jenius").click(function(){$("#qr-jenius").modal("show")}), 4 | $("#btn-dana").click(function(){$("#qr-dana").modal("show")}), 5 | $("#btn-ovo").click(function(){$("#qr-ovo").modal("show")}), 6 | $("#btn-linkaja").click(function(){$("#qr-linkaja").modal("show")}), 7 | $("#btn-gopay").click(function(){$("#qr-gopay").modal("show")}), 8 | $("#btn-shopeepay").click(function(){$("#qr-shopeepay").modal("show")}), 9 | $("#btn-paypal").click(function(){$("#qr-paypal").modal("show")}); 10 | 11 | function SalinAku(TextToCopy) { 12 | var TempText = document.createElement("input"); 13 | TempText.value = TextToCopy; 14 | 15 | prompt("Apakah Anda memerlukan dukungan pribadi atau belum menemukan solusi yang tepat untuk masalah Anda? , silahkan salin informasi dibawah ini", TempText.value); 16 | /* Notifikasi */ 17 | /* alert("Teks disalin: " + TempText.value); */ 18 | } -------------------------------------------------------------------------------- /assets/script.min_en.js: -------------------------------------------------------------------------------- 1 | $("#btn-qris").click(function(){$("#qr-qris").modal("show")}), 2 | $("#btn-bca").click(function(){$("#qr-bca").modal("show")}), 3 | $("#btn-jenius").click(function(){$("#qr-jenius").modal("show")}), 4 | $("#btn-dana").click(function(){$("#qr-dana").modal("show")}), 5 | $("#btn-ovo").click(function(){$("#qr-ovo").modal("show")}), 6 | $("#btn-linkaja").click(function(){$("#qr-linkaja").modal("show")}), 7 | $("#btn-gopay").click(function(){$("#qr-gopay").modal("show")}), 8 | $("#btn-shopeepay").click(function(){$("#qr-shopeepay").modal("show")}), 9 | $("#btn-paypal").click(function(){$("#qr-paypal").modal("show")}); 10 | 11 | function SalinAku(TextToCopy) { 12 | var TempText = document.createElement("input"); 13 | TempText.value = TextToCopy; 14 | 15 | prompt("Do you need personal support or haven't found the right solution for your problem? , Please copy information below manually", TempText.value); 16 | /* Notifikasi */ 17 | /* alert("Teks disalin: " + TempText.value); */ 18 | } -------------------------------------------------------------------------------- /assets/styles.min.css: -------------------------------------------------------------------------------- 1 | .lang-btn{width:15%!important}.tcolor{color:#002863}.a{color:#002863!important} 2 | -------------------------------------------------------------------------------- /dist/pages/api/bandwidth.php: -------------------------------------------------------------------------------- 1 | query($sql_bw); 16 | 17 | if (!$result_bw) { 18 | die("Query failed: " . $conn->error); 19 | } 20 | 21 | $options = array(); 22 | $options['data'] = array(); 23 | 24 | if ($result_bw->num_rows > 0) { 25 | while($row = $result_bw->fetch_assoc()) { 26 | $options['data'][] = array( 27 | 'bw_id' => $row['id'], 28 | 'bw_name' => $row['name'], 29 | 'rate_down' => $row['rate_down'], 30 | 'rate_up' => $row['rate_up'] 31 | ); 32 | } 33 | } 34 | 35 | $conn->close(); 36 | 37 | header('Content-Type: application/json'); 38 | echo json_encode($options); 39 | ?> 40 | -------------------------------------------------------------------------------- /dist/pages/api/daily_user.php: -------------------------------------------------------------------------------- 1 | 12 | prepare($query); 41 | $stmt->execute(); 42 | $results = $stmt->fetchAll(PDO::FETCH_ASSOC); 43 | 44 | $dates = array_map(function($row) { return $row['tanggal']; }, $results); 45 | $userCounts = array_map(function($row) { return (int)$row['total_user']; }, $results); 46 | 47 | echo json_encode([ 48 | 'labels' => $dates, 49 | 'data' => $userCounts 50 | ]); 51 | ?> 52 | -------------------------------------------------------------------------------- /dist/pages/api/mac_address.php: -------------------------------------------------------------------------------- 1 | query($sql_mac); 32 | 33 | if (!$result_mac) { 34 | die("Query failed: " . $conn->error); 35 | } 36 | 37 | $options = array(); 38 | $options['data'] = array(); 39 | 40 | if ($result_mac->num_rows > 0) { 41 | while($row = $result_mac->fetch_assoc()) { 42 | $options['data'][] = array( 43 | 'mac_address' => $row['username'] 44 | ); 45 | } 46 | } 47 | 48 | $conn->close(); 49 | 50 | header('Content-Type: application/json'); 51 | 52 | echo json_encode($options); 53 | ?> 54 | -------------------------------------------------------------------------------- /dist/pages/api/radgroup.php: -------------------------------------------------------------------------------- 1 | 12 | query($sql_combined); 25 | 26 | $options = array(); 27 | $options['plans'] = array(); 28 | 29 | if ($result_combined->num_rows > 0) { 30 | while($row = $result_combined->fetch_assoc()) { 31 | $options['plans'][] = $row; 32 | } 33 | } 34 | 35 | $conn->close(); 36 | 37 | header('Content-Type: application/json'); 38 | 39 | echo json_encode($options); 40 | ?> -------------------------------------------------------------------------------- /dist/pages/auth.php: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /dist/pages/billing/auth.php: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /dist/pages/billing/index.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/pages/billing/logout.php: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /dist/pages/billing/message.php: -------------------------------------------------------------------------------- 1 | $whatsapp_number, 18 | 'message' => $message, 19 | ]; 20 | 21 | $options = [ 22 | 'http' => [ 23 | 'header' => "Content-Type: application/json\r\n", 24 | 'method' => 'POST', 25 | 'content' => json_encode($data), 26 | ], 27 | ]; 28 | 29 | $context = stream_context_create($options); 30 | $result = file_get_contents($url, false, $context); 31 | 32 | if ($result === FALSE) { 33 | header("Location: balance.php"); 34 | exit(); 35 | } else { 36 | header("Location: balance.php"); 37 | exit(); 38 | } 39 | ?> 40 | -------------------------------------------------------------------------------- /dist/pages/billing/update.php: -------------------------------------------------------------------------------- 1 | alert('Username and balance cannot be empty!'); window.location.href = 'edit.php?id=" . htmlspecialchars($uid) . "';"; 29 | exit(); 30 | } 31 | 32 | $stmt = $conn->prepare("UPDATE client SET username = ?, password = ?, balance = ?, telegram_id = ?, whatsapp_number = ? WHERE id = ?"); 33 | $stmt->bind_param("ssissi", $username, $password, $balance, $telegram, $whatsapp, $uid); 34 | 35 | if ($stmt->execute()) { 36 | echo ""; 37 | } else { 38 | echo ""; 39 | } 40 | } 41 | ?> 42 | -------------------------------------------------------------------------------- /dist/pages/data/db_config.php: -------------------------------------------------------------------------------- 1 | '127.0.0.1', 4 | 'username' => 'radmon', 5 | 'password' => 'radmon', 6 | 'dbname' => 'radmon' 7 | ]; 8 | ?> 9 | -------------------------------------------------------------------------------- /dist/pages/data/history.php: -------------------------------------------------------------------------------- 1 | query($sql); 14 | 15 | $user_data = []; 16 | if ($result->num_rows > 0) { 17 | while ($row = $result->fetch_assoc()) { 18 | $user_data[] = [ 19 | 'username' => htmlspecialchars($row['username']), 20 | 'reply' => htmlspecialchars($row['reply']), 21 | 'authdate' => htmlspecialchars($row['authdate']) 22 | ]; 23 | } 24 | } else { 25 | $user_data[] = [ 26 | 'username' => '', 27 | 'reply' => '', 28 | 'authdate' => '' 29 | ]; 30 | } 31 | ?> 32 |