├── QueryHub ├── __pycache__ │ ├── database.cpython-312.pyc │ ├── database_manager.cpython-312.pyc │ ├── db_utils.cpython-312.pyc │ ├── question_manager.cpython-312.pyc │ ├── questions.cpython-312.pyc │ ├── theme.cpython-312.pyc │ ├── theme_manager.cpython-312.pyc │ ├── theme_utils.cpython-312.pyc │ ├── ui.cpython-312.pyc │ └── ui_utils.cpython-312.pyc ├── accessibility_app │ └── create_random_key.py ├── activation_codes.txt ├── assets │ └── icon.png ├── beta_data │ └── beta_data_1.py ├── database │ ├── betf.db │ ├── num.db │ ├── questions.db │ ├── salar.db │ └── xert.db ├── main.py ├── node_data │ └── welcome_message.json ├── package-lock.json └── package.json ├── README.md ├── data-sync ├── __pycache__ │ ├── database.cpython-312.pyc │ ├── database_manager.cpython-312.pyc │ ├── db_utils.cpython-312.pyc │ ├── question_manager.cpython-312.pyc │ ├── questions.cpython-312.pyc │ ├── theme.cpython-312.pyc │ ├── theme_manager.cpython-312.pyc │ ├── theme_utils.cpython-312.pyc │ ├── ui.cpython-312.pyc │ └── ui_utils.cpython-312.pyc ├── activation_codes.txt ├── beta_data │ └── beta_data_1.py ├── create_random_key.py ├── database │ ├── betf.db │ ├── num.db │ ├── questions.db │ ├── salar.db │ └── xert.db ├── index.py ├── main.py ├── node_data │ └── welcome_message.json ├── package-lock.json ├── package.json ├── questions.db ├── salar.db └── xert.db ├── main.py ├── num.db ├── package-lock.json ├── package.json ├── questions.db ├── salar.db ├── welcome_message.json └── xert.db /QueryHub/__pycache__/database.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/__pycache__/database.cpython-312.pyc -------------------------------------------------------------------------------- /QueryHub/__pycache__/database_manager.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/__pycache__/database_manager.cpython-312.pyc -------------------------------------------------------------------------------- /QueryHub/__pycache__/db_utils.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/__pycache__/db_utils.cpython-312.pyc -------------------------------------------------------------------------------- /QueryHub/__pycache__/question_manager.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/__pycache__/question_manager.cpython-312.pyc -------------------------------------------------------------------------------- /QueryHub/__pycache__/questions.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/__pycache__/questions.cpython-312.pyc -------------------------------------------------------------------------------- /QueryHub/__pycache__/theme.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/__pycache__/theme.cpython-312.pyc -------------------------------------------------------------------------------- /QueryHub/__pycache__/theme_manager.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/__pycache__/theme_manager.cpython-312.pyc -------------------------------------------------------------------------------- /QueryHub/__pycache__/theme_utils.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/__pycache__/theme_utils.cpython-312.pyc -------------------------------------------------------------------------------- /QueryHub/__pycache__/ui.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/__pycache__/ui.cpython-312.pyc -------------------------------------------------------------------------------- /QueryHub/__pycache__/ui_utils.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/__pycache__/ui_utils.cpython-312.pyc -------------------------------------------------------------------------------- /QueryHub/accessibility_app/create_random_key.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | def generate_activation_codes(count, length=16): 4 | codes = [] 5 | for _ in range(count): 6 | code = ''.join(random.choices('0123456789', k=length)) 7 | codes.append(code) 8 | return codes 9 | 10 | # تولید 200 کد شانزده رقمی 11 | activation_codes = generate_activation_codes(2000) 12 | 13 | # ذخیره کدها در یک فایل یا نمایش در کنسول 14 | with open("activation_codes.txt", "w") as file: 15 | for code in activation_codes: 16 | file.write(code + "'\n'") 17 | 18 | print("200 کد شانزده رقمی ایجاد شد و در فایل 'activation_codes.txt' ذخیره گردید.") -------------------------------------------------------------------------------- /QueryHub/activation_codes.txt: -------------------------------------------------------------------------------- 1 | '2068564922469668' 2 | '1341395439421038' 3 | '9629307567712083' 4 | '5275637402406957' 5 | '1443722954160396' 6 | '5221294770001484' 7 | '5981002888201927' 8 | '6976900695108356' 9 | '7363282340944514' 10 | '1845077857329866' 11 | '5445475642796493' 12 | '2964847519328839' 13 | '6414827673365125' 14 | '7625230110859376' 15 | '7113528110886551' 16 | '6501879776358467' 17 | '2691711218609961' 18 | '5378993906099437' 19 | '8318677879687086' 20 | '9144455466490431' 21 | '4928395206065142' 22 | '6498514778512219' 23 | '0111048420428985' 24 | '3409390552031789' 25 | '8299940815827779' 26 | '6935389571879362' 27 | '4002985742086455' 28 | '5478744473271240' 29 | '8989838227357162' 30 | '7506895860338049' 31 | '5804908074229559' 32 | '2745311333168764' 33 | '6739909486153944' 34 | '5887891100237269' 35 | '2370056257252019' 36 | '5776173013788702' 37 | '8177297103983111' 38 | '4078941246248036' 39 | '5974021390398240' 40 | '3322105539009773' 41 | '9148414797962808' 42 | '3718526778514457' 43 | '7748077749028843' 44 | '6649035048662413' 45 | '9032691464435413' 46 | '4294861046390079' 47 | '0911860150721000' 48 | '5809409735614834' 49 | '5206826712003590' 50 | '2031731851758504' 51 | '2259845660039062' 52 | '5563693512121534' 53 | '1368468647066377' 54 | '1447338994782793' 55 | '8656874460652721' 56 | '0394212520411651' 57 | '5224393259132773' 58 | '7115600225599740' 59 | '8949964437433914' 60 | '2024241066112779' 61 | '0164254580119561' 62 | '0254973800369255' 63 | '8453264506974982' 64 | '7397556538123160' 65 | '2756229204032208' 66 | '7334630712033998' 67 | '8274233460218811' 68 | '3500256979887797' 69 | '0574267631155002' 70 | '6844468017858338' 71 | '8129586139529707' 72 | '8612264968150106' 73 | '5167162394505692' 74 | '4979145917026804' 75 | '9803276222836791' 76 | '6001697177075043' 77 | '3732097209920567' 78 | '8782897219887580' 79 | '3708184414820350' 80 | '4659934085125396' 81 | '4590871147463904' 82 | '5656151236888645' 83 | '6722914729891003' 84 | '2803214963923229' 85 | '4532339006344979' 86 | '5346297880796373' 87 | '4018643497658887' 88 | '3663918708909487' 89 | '8285517971198256' 90 | '5606637919156437' 91 | '7075775215128836' 92 | '4611615511013787' 93 | '9055992227126878' 94 | '5148778994232554' 95 | '0096718133418240' 96 | '3090839677196357' 97 | '6859953121419714' 98 | '4196761633763226' 99 | '5885634276403093' 100 | '3881371243738035' 101 | '6429823883317215' 102 | '2288927670180094' 103 | '3348176952320699' 104 | '7657190445111950' 105 | '8610092702973918' 106 | '9203308393232460' 107 | '6736943254940943' 108 | '2100453369623356' 109 | '5335820396621048' 110 | '4245583635730937' 111 | '5655099019865233' 112 | '0785291727006097' 113 | '3177697628378685' 114 | '0568472625666538' 115 | '4710354539234918' 116 | '9670881400191266' 117 | '8015471500780766' 118 | '2834393546614169' 119 | '2871052258677102' 120 | '1408770816597439' 121 | '4056077982319001' 122 | '6040563675814753' 123 | '0496093225776802' 124 | '6701717418879793' 125 | '3230972143740147' 126 | '5937671576033491' 127 | '9430696995540973' 128 | '1523121714291680' 129 | '3106702219406781' 130 | '4652185235577875' 131 | '3678295198332314' 132 | '8766633065409618' 133 | '0563599128526533' 134 | '2669493195719657' 135 | '1837442725040851' 136 | '4341282448090558' 137 | '5198560846745497' 138 | '4459135395098241' 139 | '6036731907066090' 140 | '4484812143859730' 141 | '6704822924468816' 142 | '7269210221463110' 143 | '3441340767671873' 144 | '9637057534754595' 145 | '3568101690255620' 146 | '9190754574739261' 147 | '9097044683580956' 148 | '8297917791544718' 149 | '1011182879935725' 150 | '5449078402013095' 151 | '8003683662183170' 152 | '2168821052629963' 153 | '1437667952965783' 154 | '6318017587513488' 155 | '1982480229841067' 156 | '8745433476029120' 157 | '2397898872640147' 158 | '1331523113609461' 159 | '2920653003488842' 160 | '1852926266233855' 161 | '2904253156218584' 162 | '0652585625891207' 163 | '5188731192144571' 164 | '2426364428699410' 165 | '2161707301751589' 166 | '6394520377056499' 167 | '0410132520003916' 168 | '0149443135591847' 169 | '5919169990188955' 170 | '3512125202336800' 171 | '0099247273838952' 172 | '1694953289695598' 173 | '8574347883725592' 174 | '6065562036029303' 175 | '0586352007756707' 176 | '7553068631270207' 177 | '6404707113225017' 178 | '9432655404815548' 179 | '2441644642777417' 180 | '7747672209360551' 181 | '9105266621778572' 182 | '1256325892177502' 183 | '3226615525205946' 184 | '3141353068028777' 185 | '4270045082882112' 186 | '6936375307035619' 187 | '5442266703294510' 188 | '6611817517566096' 189 | '4590761939125324' 190 | '9787836844497421' 191 | '5271365387714789' 192 | '1126080806895724' 193 | '4624859266690095' 194 | '9546730062678947' 195 | '5183332237466689' 196 | '2225230731528897' 197 | '9729161356161302' 198 | '9544697547151916' 199 | '2086914267662552' 200 | '3883547260915588' 201 | '8489927374941816' 202 | '8402151590721380' 203 | '0305884166453704' 204 | '1690544678440623' 205 | '3576763531980326' 206 | '7063026007309153' 207 | '4173497582283743' 208 | '8457507612607529' 209 | '8929287489868559' 210 | '8889527730954885' 211 | '5764298418167077' 212 | '1389047858399481' 213 | '7493671936985920' 214 | '9613397274894982' 215 | '4614739289260831' 216 | '7181659206974696' 217 | '8105392816615312' 218 | '2185494134263659' 219 | '3998868042422189' 220 | '7566942964313483' 221 | '8707232969891426' 222 | '3846286582293187' 223 | '9997162639274130' 224 | '2127603045792838' 225 | '2843672472162441' 226 | '7204658541736485' 227 | '5850610966584131' 228 | '7311364490445509' 229 | '6199215502655297' 230 | '3964113731446984' 231 | '3861133247754960' 232 | '3805038271549021' 233 | '7441312457540381' 234 | '5984172385216954' 235 | '3788451678017007' 236 | '0711103491542469' 237 | '3116890624363572' 238 | '1621155184468055' 239 | '7752116340793820' 240 | '7601080192247191' 241 | '3070071130227768' 242 | '3868564176637167' 243 | '8836907176998074' 244 | '1863298270864077' 245 | '8846588562552284' 246 | '5379535601280935' 247 | '2506882106856662' 248 | '5263589337639891' 249 | '8330734133152368' 250 | '5371480093088102' 251 | '4853074931704251' 252 | '7180713047591186' 253 | '2959049905477611' 254 | '8547204656612055' 255 | '1186965129409200' 256 | '6195817476908055' 257 | '2925172502186245' 258 | '0999779578267938' 259 | '3282245144428084' 260 | '5952461046118150' 261 | '4893632007486362' 262 | '4136210194630750' 263 | '2104013297192400' 264 | '8780630255798148' 265 | '9529336237364518' 266 | '6502662868965343' 267 | '6246680891939421' 268 | '2760799942556417' 269 | '9063559790787189' 270 | '0471168182847015' 271 | '5563546715182008' 272 | '4525938906028254' 273 | '4552267266492723' 274 | '4759127930568014' 275 | '3516201739048975' 276 | '9310638331038104' 277 | '8412643538001398' 278 | '8184175625670500' 279 | '7804307962022150' 280 | '0307635651742780' 281 | '9956121244625631' 282 | '2834333934199937' 283 | '1863700682240313' 284 | '1236261607426045' 285 | '3283898834126275' 286 | '2656857710042580' 287 | '5536300424331399' 288 | '0881197612526104' 289 | '4950584264944409' 290 | '8477770673872498' 291 | '4761658061350017' 292 | '0005992164601302' 293 | '8173118887108494' 294 | '8804889775990147' 295 | '0305872264850384' 296 | '2762255982555196' 297 | '3774538958656603' 298 | '5204429716596416' 299 | '4014095533516238' 300 | '6384512551619894' 301 | '3365817950210529' 302 | '4327547179704256' 303 | '8482391579891048' 304 | '7567213557826683' 305 | '8531749615698320' 306 | '8389264268578128' 307 | '2673907505839778' 308 | '0449461133654110' 309 | '1165827761805200' 310 | '2264036589661398' 311 | '2740778057832505' 312 | '0437571708913980' 313 | '1193439351563379' 314 | '9922801868246008' 315 | '2884256384479697' 316 | '6866912205223386' 317 | '0746832099094459' 318 | '3194807318393817' 319 | '5162393155141819' 320 | '6200431123687036' 321 | '2963533709722186' 322 | '9752707484568999' 323 | '9623475451885918' 324 | '8852222097619382' 325 | '5427211200112268' 326 | '6069041311787944' 327 | '5615893596844557' 328 | '6129059835019208' 329 | '2680488494584109' 330 | '5186812609463936' 331 | '2022472043894737' 332 | '2647705046585902' 333 | '4374363233595195' 334 | '2345780549799558' 335 | '3071857904509635' 336 | '2656948343438400' 337 | '9565198965798090' 338 | '0893384666511715' 339 | '1831785480114762' 340 | '4535349523219809' 341 | '1852335151901603' 342 | '2696611845335406' 343 | '6294788427578815' 344 | '0701879112840203' 345 | '0236836161178833' 346 | '8975906366388571' 347 | '4124463435231146' 348 | '6556874762286336' 349 | '7730415454108733' 350 | '6762444710104676' 351 | '5976189659052525' 352 | '7748088559839365' 353 | '2086534138887882' 354 | '7735326470186654' 355 | '5584650357371598' 356 | '9103804267161768' 357 | '1989852857453304' 358 | '2078975411030890' 359 | '1783799587847320' 360 | '3148442501807689' 361 | '2659420439920091' 362 | '3196889985743728' 363 | '3972385092004482' 364 | '0094235974416562' 365 | '3812861654768405' 366 | '6349128074173241' 367 | '1240807711566088' 368 | '5389254924029855' 369 | '5730474307577482' 370 | '9857238051484684' 371 | '8927961215219627' 372 | '0425281448972005' 373 | '6547976930020235' 374 | '0340338128478891' 375 | '5245833366224945' 376 | '8576229702659676' 377 | '2518447347497426' 378 | '6174077497630241' 379 | '1842952445785283' 380 | '9694696301753317' 381 | '0614011671515789' 382 | '5011040489631171' 383 | '8505363944181825' 384 | '4238788834165679' 385 | '8227604833367315' 386 | '4081615327232277' 387 | '8539637249909336' 388 | '3844835804887338' 389 | '6781373222326589' 390 | '0529771500409296' 391 | '1841508097139471' 392 | '5616010466842091' 393 | '4884211801839886' 394 | '1443824944666591' 395 | '8799472056996455' 396 | '7429262173938364' 397 | '8796359460187163' 398 | '7310235172738734' 399 | '3620474228700922' 400 | '1018801924225951' 401 | '2332055888461823' 402 | '1361470762062746' 403 | '8896514051635766' 404 | '1422252727806890' 405 | '5854744585855150' 406 | '0023149049960791' 407 | '9603404985574915' 408 | '9024991805556711' 409 | '8786262530342888' 410 | '6902528117903976' 411 | '0126076743733711' 412 | '5458371306357002' 413 | '1044246970875870' 414 | '3804287225915912' 415 | '9226571428830384' 416 | '0465277464158560' 417 | '4471016508906037' 418 | '4269683031516111' 419 | '3972313537607313' 420 | '4482448417149486' 421 | '6144027727457599' 422 | '2414729682841626' 423 | '9027722474653917' 424 | '9264371252063116' 425 | '6550515420164670' 426 | '9183112396418263' 427 | '8472873314259261' 428 | '0113527012324141' 429 | '6225679534011974' 430 | '5871415914399431' 431 | '8187504872605623' 432 | '2959468435613123' 433 | '4789747750993763' 434 | '6323020167981797' 435 | '1590056673478603' 436 | '2397008353944428' 437 | '4951587513482053' 438 | '7541001904497874' 439 | '6319036459492909' 440 | '6777817959849438' 441 | '0302176538104731' 442 | '8810717579338121' 443 | '8917288689269217' 444 | '0707697664688989' 445 | '9081904342998963' 446 | '4817155695816483' 447 | '8542360086910991' 448 | '6246173516498599' 449 | '1074910699171838' 450 | '5157823269711450' 451 | '0202247768205971' 452 | '2699334148007344' 453 | '4458574165279251' 454 | '7519086524946676' 455 | '2008884559819413' 456 | '3077050207521030' 457 | '6132514869191589' 458 | '3123952951297399' 459 | '8445619785667094' 460 | '2873848469282654' 461 | '4380982541299664' 462 | '5977177859837625' 463 | '6955030096612372' 464 | '7982125670651821' 465 | '4083630244634225' 466 | '6505931150070275' 467 | '4299502163598612' 468 | '2243993294484041' 469 | '2410132047954002' 470 | '9113469735275369' 471 | '8676747493557288' 472 | '2520550900811698' 473 | '5632453983308238' 474 | '9000675673014294' 475 | '8251381382277388' 476 | '3272828231551574' 477 | '4301598507218121' 478 | '5943628284380526' 479 | '0233527263160314' 480 | '5891637769898795' 481 | '3995891912173544' 482 | '6387674673699918' 483 | '7717994571044286' 484 | '9006427542815572' 485 | '2294741287979371' 486 | '3258750606081833' 487 | '0531241684243283' 488 | '0777359214397959' 489 | '0308945093569066' 490 | '1630161149563614' 491 | '2993284703295782' 492 | '1612065065558119' 493 | '7390749472025320' 494 | '7305462446378491' 495 | '6333459622094245' 496 | '0930091994844040' 497 | '3486460543693126' 498 | '4294467486685293' 499 | '5382236318251261' 500 | '6483442736252537' 501 | '4275861418863444' 502 | '9338270213668828' 503 | '7438120242653764' 504 | '9244844794992837' 505 | '4616594879967044' 506 | '3108239330964045' 507 | '5089313742596684' 508 | '0558003877033719' 509 | '0582251090422966' 510 | '3025321814798492' 511 | '9686813307720064' 512 | '1287194376548870' 513 | '6267775446195806' 514 | '1584805480853007' 515 | '1515733391992051' 516 | '0895397485929616' 517 | '1596205730750801' 518 | '7856968523229990' 519 | '2958999747756400' 520 | '3576210413254431' 521 | '3738802598112104' 522 | '8312038790366872' 523 | '5172914586981083' 524 | '9574009337076649' 525 | '3370121451834495' 526 | '0746298041098988' 527 | '1176025873209265' 528 | '4540631547079234' 529 | '1263432949512026' 530 | '0501964702996417' 531 | '6410665286830999' 532 | '8798397530646596' 533 | '9335630296689635' 534 | '1111648345621445' 535 | '1950043545543249' 536 | '7547628905777726' 537 | '7827952677020430' 538 | '5560275903838659' 539 | '2528525658986162' 540 | '4099396290664000' 541 | '3223584242482349' 542 | '6150576161063394' 543 | '2635079703991157' 544 | '0285939643143594' 545 | '4460201128186112' 546 | '2288616038142350' 547 | '3190421124838903' 548 | '9475531356446742' 549 | '1783165885218649' 550 | '9278317307521076' 551 | '6196220473970595' 552 | '0941667391894622' 553 | '4261315485744446' 554 | '6110149352634643' 555 | '9864559621947771' 556 | '5006852629185233' 557 | '9011346619103092' 558 | '5556621722626021' 559 | '1121897390344647' 560 | '5189164393271518' 561 | '2047647470302948' 562 | '5937204454024662' 563 | '7209100335377817' 564 | '3497174511618927' 565 | '6022292715760919' 566 | '4897687527326367' 567 | '5497008678114394' 568 | '6387940256119573' 569 | '4493558644558466' 570 | '2765370419144275' 571 | '6172648324891038' 572 | '0175206639580956' 573 | '2184370018884065' 574 | '2534840960309622' 575 | '8853859132973571' 576 | '2953544133255214' 577 | '7988828749562446' 578 | '3772484535332679' 579 | '5759718752000390' 580 | '1928991841604242' 581 | '0497741554138417' 582 | '1346155453272923' 583 | '3456717790679943' 584 | '1580265838818405' 585 | '3956021890057897' 586 | '7736849727595711' 587 | '9592694725672143' 588 | '4113698468311476' 589 | '0410452508339475' 590 | '5260718748503620' 591 | '7137268899123790' 592 | '1831165656357454' 593 | '7441156694899108' 594 | '3423491612486667' 595 | '7426840399171617' 596 | '0499611839044613' 597 | '0324633737584219' 598 | '3123220360546195' 599 | '5510073922592996' 600 | '4093052254698374' 601 | '4439448588414580' 602 | '5255072186022958' 603 | '1906617242257989' 604 | '5469916592843022' 605 | '7318665316516880' 606 | '5813559718174651' 607 | '9232567108397053' 608 | '7521942979672190' 609 | '1835896769516371' 610 | '4800239415123005' 611 | '4511780540370952' 612 | '6270662623663471' 613 | '6304832453849014' 614 | '6777833053907014' 615 | '9264062815059000' 616 | '3319753271005521' 617 | '5385438021832426' 618 | '4179795267986710' 619 | '2203991206461196' 620 | '0058982730011147' 621 | '3860041158902823' 622 | '9632319065493925' 623 | '5005653236682259' 624 | '6472430245180086' 625 | '3888858450430853' 626 | '9200660603776263' 627 | '8658181580327436' 628 | '2100158926209390' 629 | '3808888689693956' 630 | '5127188220225151' 631 | '1392397702432837' 632 | '7804738227093911' 633 | '4094929404849934' 634 | '0960767400151881' 635 | '1739579416991360' 636 | '6415237317126159' 637 | '3889419010094205' 638 | '3533619769331050' 639 | '7745353078752395' 640 | '2945978600023347' 641 | '3115476071279064' 642 | '1084029110236010' 643 | '1315113468398053' 644 | '0080025122434389' 645 | '9060434011972851' 646 | '6523084126322469' 647 | '8602728967409216' 648 | '5376207242630905' 649 | '0145902848616391' 650 | '9010951302630643' 651 | '3356986297994751' 652 | '2877774158625749' 653 | '3734704675295776' 654 | '3802204727062732' 655 | '6924940570884677' 656 | '3464361783326776' 657 | '4939672015904370' 658 | '0206317607774887' 659 | '3898772062463483' 660 | '7361953430461349' 661 | '8192633835835697' 662 | '5514561474948125' 663 | '7747132688108301' 664 | '9834318343446635' 665 | '0017654017072408' 666 | '9374711199609318' 667 | '2409746688281250' 668 | '2427472865823349' 669 | '6181721892466676' 670 | '0523146491642739' 671 | '4371346094891670' 672 | '9086491921588624' 673 | '7214459427660059' 674 | '8654704781267770' 675 | '0195168931608577' 676 | '6806660157201629' 677 | '3039991163165324' 678 | '6643362557947330' 679 | '3663931492612723' 680 | '8745117086473484' 681 | '6244429963133536' 682 | '0492133744752600' 683 | '2133486971136872' 684 | '5730768975742350' 685 | '9845477810287959' 686 | '7461461579530770' 687 | '5782838189872248' 688 | '5869906323910433' 689 | '1003166014335739' 690 | '2774196256104021' 691 | '1450648283594039' 692 | '8013201803975433' 693 | '8495008137547396' 694 | '8698289110748857' 695 | '9177311847947049' 696 | '4621456660474929' 697 | '7431907830146686' 698 | '4406152477479996' 699 | '6319696469465421' 700 | '9297155986918148' 701 | '5366765416962377' 702 | '7884557575221113' 703 | '9005112016257179' 704 | '6922494014306735' 705 | '8491635405672181' 706 | '1877629970809724' 707 | '7361860312741532' 708 | '8051865653206507' 709 | '3885029307577549' 710 | '2938198948253014' 711 | '0793126227726381' 712 | '1653442295809456' 713 | '5400326781366143' 714 | '8417175830300401' 715 | '8016551555422627' 716 | '7582982206743734' 717 | '4066991476492469' 718 | '0892550325917927' 719 | '1552905284492513' 720 | '8529806106265162' 721 | '4342047392716801' 722 | '2312583555348003' 723 | '5898885214723908' 724 | '3745681064331435' 725 | '0461593826755460' 726 | '7802421335334501' 727 | '9658971511175320' 728 | '8679111945870979' 729 | '0007933903024571' 730 | '9241104883500471' 731 | '8391037971005190' 732 | '6067804583682835' 733 | '4606594353129965' 734 | '4470450883089360' 735 | '6315996098089732' 736 | '9240741235427764' 737 | '4512980368855817' 738 | '8554177295149273' 739 | '8762774108350822' 740 | '7229860167299647' 741 | '8699477773420615' 742 | '2998556628243136' 743 | '5265688161612240' 744 | '5911591418182623' 745 | '8670343934795921' 746 | '3363121123480567' 747 | '5656020401728583' 748 | '8785100686102590' 749 | '2006412587899586' 750 | '8288490356523511' 751 | '2037098058748018' 752 | '3157600265748571' 753 | '3106858360754053' 754 | '4532433398664415' 755 | '3972745356446097' 756 | '9831017914121178' 757 | '5759024748735084' 758 | '1338446948800312' 759 | '4588156330455809' 760 | '1090370902039123' 761 | '5629644266597383' 762 | '2695153851393216' 763 | '2263328408283340' 764 | '3865132439617897' 765 | '0395539335266526' 766 | '3330525375172006' 767 | '5018024769110102' 768 | '5429129130782347' 769 | '1451742636181467' 770 | '8410361666346169' 771 | '0490976504841527' 772 | '5324384356985789' 773 | '7627067748523045' 774 | '9704634131886620' 775 | '8070937602577638' 776 | '2052006534221167' 777 | '8794620448535609' 778 | '8449795491531344' 779 | '4634310957543836' 780 | '3196769478647140' 781 | '5130137047335283' 782 | '7356205262012447' 783 | '6700292408665671' 784 | '8919444281329399' 785 | '4705454568031084' 786 | '5726324229060989' 787 | '5198696745202982' 788 | '4040544976819306' 789 | '0414215091869467' 790 | '8637832884456510' 791 | '8209318278921401' 792 | '8540587933150954' 793 | '9967116921233910' 794 | '8399418397800855' 795 | '2794055878726941' 796 | '5654230885107244' 797 | '4679552128720261' 798 | '3465372276344260' 799 | '4216712415816668' 800 | '8514370619848098' 801 | '6299231605409252' 802 | '5295948372596603' 803 | '3205294617355201' 804 | '9451890796836455' 805 | '2359378519314349' 806 | '3867778007305595' 807 | '0073150561130783' 808 | '3032128362657893' 809 | '7067610514851975' 810 | '1591596505507084' 811 | '5041797084111319' 812 | '1523454548289602' 813 | '9984218552654478' 814 | '2960131464830346' 815 | '3039774882274407' 816 | '4207395583181606' 817 | '3247026184968576' 818 | '5409627465970969' 819 | '1764565830183778' 820 | '2217912323196057' 821 | '1809744002570488' 822 | '6498076602577870' 823 | '0155558865279277' 824 | '4702981428802006' 825 | '7969354036842839' 826 | '3984677143304259' 827 | '4835285560290960' 828 | '5040019739297271' 829 | '7139277085052623' 830 | '5311788291089236' 831 | '1838244232309949' 832 | '7850011371327098' 833 | '8851623969399715' 834 | '9921550057547160' 835 | '2819823959358095' 836 | '5816859634455561' 837 | '7917622292092740' 838 | '9337122240465914' 839 | '1382930676269299' 840 | '8201724058002844' 841 | '6247277694950531' 842 | '9696471750065454' 843 | '1626173994792891' 844 | '6249886663993202' 845 | '9789421421025955' 846 | '9890777506571503' 847 | '4586489860732312' 848 | '6636556519391135' 849 | '0233154264266219' 850 | '2903876437594149' 851 | '5169155436561042' 852 | '3281789740167045' 853 | '7170500170609129' 854 | '3472361005408372' 855 | '4510790437545355' 856 | '9439538097273428' 857 | '5266895893922557' 858 | '8435162901070856' 859 | '1493036389754139' 860 | '0121106311911214' 861 | '7542029551233020' 862 | '5279903121420422' 863 | '1477740556441316' 864 | '2945666338613108' 865 | '5145760927173503' 866 | '4223933618062423' 867 | '7572091835317508' 868 | '2255987613062963' 869 | '4885715072974108' 870 | '3852844757276024' 871 | '2959915402730696' 872 | '2349095777405311' 873 | '1481070330496436' 874 | '2854908648615943' 875 | '6051925007379236' 876 | '3279612908155194' 877 | '7070018299479596' 878 | '7084633110205434' 879 | '9775933172335425' 880 | '5395326729037632' 881 | '6852895661002887' 882 | '3949357392046583' 883 | '1227542799358978' 884 | '2272662250961937' 885 | '0733994682974437' 886 | '7625257455890522' 887 | '9261056118084134' 888 | '8574795626497198' 889 | '6065128328595699' 890 | '9261890351800843' 891 | '6909723845688142' 892 | '5050407677921246' 893 | '9191613633596174' 894 | '9507861853354532' 895 | '6355259485974663' 896 | '5534553294020757' 897 | '5501768946822390' 898 | '6876711233516995' 899 | '7549252697389685' 900 | '5716794549005720' 901 | '2187295383655186' 902 | '6684660131587289' 903 | '7889200409902294' 904 | '2890683155100724' 905 | '6213289842050621' 906 | '2632039036587459' 907 | '4993950557147133' 908 | '9155401052524767' 909 | '1943213269810310' 910 | '5750275342060707' 911 | '8890108352179689' 912 | '5059157901165283' 913 | '9944230968353959' 914 | '1337451235856062' 915 | '7478186208224091' 916 | '6692275668852102' 917 | '8541440920426516' 918 | '4934576320558666' 919 | '9626068579360380' 920 | '2405340638316910' 921 | '3286756230285571' 922 | '9676486337627979' 923 | '6224618933275215' 924 | '8209649205228316' 925 | '0893685152359279' 926 | '1675499113747271' 927 | '7807308768413019' 928 | '7228156611273422' 929 | '7169404076456393' 930 | '2724171792946167' 931 | '8018663771164424' 932 | '0407170583440367' 933 | '9033913255117170' 934 | '9095181792275817' 935 | '8444529795291632' 936 | '3959200710370764' 937 | '7130012841382810' 938 | '4473990279084628' 939 | '3473898629217311' 940 | '7368803357692450' 941 | '3722809159761445' 942 | '1601973132157573' 943 | '4968839648941729' 944 | '4509759258377207' 945 | '2194021890056743' 946 | '2592035707543270' 947 | '8398879278550338' 948 | '6997102899185053' 949 | '6326157588862483' 950 | '8748653640112059' 951 | '6457031404149527' 952 | '8040348624599577' 953 | '3043770593967742' 954 | '1398227347192704' 955 | '1090976057664905' 956 | '7378169964176255' 957 | '8564150492653766' 958 | '2901148241509940' 959 | '8376499818923319' 960 | '7853493540548791' 961 | '5247830137058595' 962 | '1176881867293862' 963 | '4747861926876911' 964 | '9907119598953143' 965 | '8600437165341158' 966 | '7615847376086613' 967 | '0072140726720191' 968 | '8967494886268558' 969 | '5514691725682069' 970 | '3834102907550260' 971 | '9607064128617862' 972 | '5407669967491324' 973 | '0974207849000865' 974 | '0915071153375618' 975 | '2517253087530727' 976 | '3252113642672281' 977 | '7984223640492325' 978 | '4151306284280687' 979 | '6661750931246909' 980 | '8507265904681887' 981 | '2300252064769510' 982 | '9267357976262085' 983 | '2317006127170548' 984 | '5061274365512159' 985 | '1150455827666691' 986 | '2049009080919290' 987 | '0036811533844256' 988 | '5527480281900095' 989 | '1667789636183966' 990 | '9460446318895963' 991 | '1253374496675499' 992 | '9998784514677855' 993 | '6037145131842084' 994 | '6868596273755625' 995 | '8389874551464572' 996 | '3582096845825796' 997 | '8142736444378051' 998 | '9731511177299299' 999 | '8347153410084634' 1000 | '7875830003875841' 1001 | '5552057297665996' 1002 | '8109344535235227' 1003 | '4210484217583187' 1004 | '5116906082808876' 1005 | '1136957704313380' 1006 | '5458961663590291' 1007 | '9615202170358857' 1008 | '1690597807021790' 1009 | '7805549523712082' 1010 | '0250812831641478' 1011 | '1602887764140178' 1012 | '8546439117315856' 1013 | '8985269329419716' 1014 | '2298327402168112' 1015 | '1903307445113481' 1016 | '3059591328461948' 1017 | '5526476701628969' 1018 | '8317697486606205' 1019 | '4541513219521658' 1020 | '3785228621276520' 1021 | '9854982903037900' 1022 | '9145040759061110' 1023 | '9009201075563598' 1024 | '0189838948741912' 1025 | '0765449122382245' 1026 | '8306344942010251' 1027 | '0060472714417291' 1028 | '9727663164840285' 1029 | '8474911173802284' 1030 | '3025597218453702' 1031 | '7288354109045679' 1032 | '3030170785025481' 1033 | '1732300538484070' 1034 | '2656360018472847' 1035 | '6324268981535852' 1036 | '7698905444643457' 1037 | '0888985017464062' 1038 | '1316049776446978' 1039 | '9913102398376537' 1040 | '9154650561354047' 1041 | '7964082808800213' 1042 | '6381052683861303' 1043 | '7890240245420924' 1044 | '4195550098827117' 1045 | '2560935067171353' 1046 | '6788372805481485' 1047 | '7062716120619059' 1048 | '4958629043764525' 1049 | '5968474939371229' 1050 | '9240233166473969' 1051 | '6079712029132101' 1052 | '2793880906850049' 1053 | '0031960236770391' 1054 | '8286523671311312' 1055 | '1560213696037875' 1056 | '3603811023812926' 1057 | '5884729893927277' 1058 | '3330477709131787' 1059 | '1460259163141213' 1060 | '5330338702153834' 1061 | '1039968876529840' 1062 | '8472854072906010' 1063 | '6335521077612446' 1064 | '8213809613648893' 1065 | '2050763307034825' 1066 | '3741653642130577' 1067 | '4695690936217852' 1068 | '1996017797744128' 1069 | '4789270845934738' 1070 | '0475016452302315' 1071 | '9011196563477813' 1072 | '8130089569512452' 1073 | '1603748826718813' 1074 | '3046037242071387' 1075 | '4315154420714015' 1076 | '4180885658144225' 1077 | '1999306044856988' 1078 | '7036570434319679' 1079 | '6466285858231581' 1080 | '8481070015990123' 1081 | '2133633883750901' 1082 | '1779973264436387' 1083 | '0817738715104152' 1084 | '9120087038266896' 1085 | '7306438974317543' 1086 | '1001371316447584' 1087 | '1814084815468513' 1088 | '6759130398351233' 1089 | '5305641941392387' 1090 | '6946732950556667' 1091 | '4607018669321632' 1092 | '0086166281507963' 1093 | '5021460615912852' 1094 | '2423009852692793' 1095 | '0812993477039590' 1096 | '7539029754818487' 1097 | '8433547909023599' 1098 | '9508015749568583' 1099 | '3930796755923281' 1100 | '0392053154691536' 1101 | '7750125950996602' 1102 | '8105748585510064' 1103 | '7246141596354215' 1104 | '3288795632179525' 1105 | '7146178014175305' 1106 | '7712622017846858' 1107 | '0849800887019143' 1108 | '6072439343314818' 1109 | '5815187920767440' 1110 | '9110037065235755' 1111 | '7274620690368913' 1112 | '3757713544278925' 1113 | '4429448806585941' 1114 | '2463195582684097' 1115 | '4688206399963014' 1116 | '8377916138175485' 1117 | '1639736436476494' 1118 | '7565841324747359' 1119 | '5207086007982477' 1120 | '0150295114883653' 1121 | '7628457133120291' 1122 | '0596481829386129' 1123 | '0319591928799341' 1124 | '5212404179983819' 1125 | '6521813775574912' 1126 | '4145183686546157' 1127 | '6326531043911753' 1128 | '7562527875572794' 1129 | '2762702848750914' 1130 | '1977114672112118' 1131 | '4843157241603088' 1132 | '7631036581238553' 1133 | '5310096273069193' 1134 | '9608288796484010' 1135 | '3781395056084325' 1136 | '6518185013163672' 1137 | '9902449796492230' 1138 | '3766247888812881' 1139 | '8538503358871694' 1140 | '2458888760583743' 1141 | '6005685352667729' 1142 | '0188689771737273' 1143 | '7382040888366682' 1144 | '5548620176823398' 1145 | '8416427085148746' 1146 | '7748430917562253' 1147 | '2561813762438266' 1148 | '4248412698649453' 1149 | '0516969323317601' 1150 | '0886536448825054' 1151 | '8367055728608299' 1152 | '7696025828690193' 1153 | '6851810436024417' 1154 | '7174847512863257' 1155 | '9674669584646080' 1156 | '4741222909151083' 1157 | '9396626915275784' 1158 | '8898829547535960' 1159 | '7120565059933263' 1160 | '6522017487311359' 1161 | '5669600349431070' 1162 | '7754441080121006' 1163 | '6156827445777639' 1164 | '5587618745509791' 1165 | '7578522411513092' 1166 | '7564636533808863' 1167 | '5328272026123659' 1168 | '9201596288780895' 1169 | '6365530369232980' 1170 | '6309199881585663' 1171 | '4631713978847192' 1172 | '6352643523924047' 1173 | '3667044101352786' 1174 | '6884114901752212' 1175 | '7419808259932398' 1176 | '5738785562606040' 1177 | '8164355336089907' 1178 | '3725081135659547' 1179 | '0075525257052700' 1180 | '4315053332968961' 1181 | '8505004086857074' 1182 | '9255408825689048' 1183 | '3118347120002501' 1184 | '2540120275204757' 1185 | '8468694352330097' 1186 | '8582616592658000' 1187 | '4086885577465666' 1188 | '4004610200516238' 1189 | '7375950232140466' 1190 | '3283578293630507' 1191 | '1955039692506838' 1192 | '9519246374225038' 1193 | '6672408124816344' 1194 | '3676604253980720' 1195 | '8609677479755457' 1196 | '1558263982363779' 1197 | '4755826491871853' 1198 | '7379970876822256' 1199 | '2966628819715376' 1200 | '3260528855721759' 1201 | '3239019142329061' 1202 | '5688964855760296' 1203 | '2245344699219218' 1204 | '1348091798081157' 1205 | '8195610137903881' 1206 | '8602263769090911' 1207 | '3831189237572875' 1208 | '2266772277315419' 1209 | '8968415610738648' 1210 | '0796058845852471' 1211 | '7912790916788674' 1212 | '7885375544074889' 1213 | '6198809234406946' 1214 | '7052571228533662' 1215 | '4071493180117461' 1216 | '9926440075132996' 1217 | '4720024380456932' 1218 | '4543330526186274' 1219 | '4123547636841423' 1220 | '3459232811485679' 1221 | '8277104859046285' 1222 | '3588827013777674' 1223 | '1783907155171396' 1224 | '7825219971616222' 1225 | '0725442594485360' 1226 | '5286314270136427' 1227 | '7148970625136044' 1228 | '9562092437026652' 1229 | '9428670949154477' 1230 | '3655499218039989' 1231 | '4131817232784212' 1232 | '2648634114521797' 1233 | '9820446713746150' 1234 | '7612277144004156' 1235 | '1122498433177796' 1236 | '1790554069066649' 1237 | '9891238446974819' 1238 | '5260399496263074' 1239 | '3051304445278710' 1240 | '6985852419462711' 1241 | '4256519789778165' 1242 | '2117913114690535' 1243 | '9634666364164608' 1244 | '5269110252884934' 1245 | '9531067771761391' 1246 | '0599567629911014' 1247 | '3493140773979729' 1248 | '7424927334406535' 1249 | '9997813659850204' 1250 | '2359195382486492' 1251 | '8118642265591649' 1252 | '6000232225421503' 1253 | '1889338482253422' 1254 | '9168402183692361' 1255 | '1270980380426583' 1256 | '7436744466130908' 1257 | '9912881630748928' 1258 | '3374781199426024' 1259 | '7126269299434478' 1260 | '4961657067609864' 1261 | '0719664955136022' 1262 | '9795932829210634' 1263 | '0679254136805397' 1264 | '1696148631819036' 1265 | '7452275535746034' 1266 | '6235033149483988' 1267 | '2136356062531604' 1268 | '5333555605258852' 1269 | '7276584086926381' 1270 | '7115659270058953' 1271 | '5328067577869506' 1272 | '3215652693249317' 1273 | '4053120173743448' 1274 | '2684182992222303' 1275 | '1513367717542380' 1276 | '5934447428006618' 1277 | '8339706696511605' 1278 | '9390615249274503' 1279 | '3678834048078048' 1280 | '6121729556200315' 1281 | '0239987800297248' 1282 | '2794577330722963' 1283 | '8699729797765781' 1284 | '5370497123630969' 1285 | '2200473903725414' 1286 | '9807392901406197' 1287 | '8646584123674193' 1288 | '3584385159748314' 1289 | '9412500262448311' 1290 | '2584877093125428' 1291 | '6511816763401816' 1292 | '7172182434388475' 1293 | '0829312185412179' 1294 | '1212434930376760' 1295 | '0808091068432803' 1296 | '3615201315894429' 1297 | '5037956901249209' 1298 | '6639682701801114' 1299 | '5803378650635140' 1300 | '6134907035644805' 1301 | '7778145778388309' 1302 | '0135674270930787' 1303 | '5143887209097158' 1304 | '9599985624399457' 1305 | '4156020501688602' 1306 | '6798646007667545' 1307 | '8580150350878980' 1308 | '2709585364638382' 1309 | '3261456506843479' 1310 | '4560988012275770' 1311 | '5013640191914331' 1312 | '7248656012446330' 1313 | '4584019869116735' 1314 | '2080665661729997' 1315 | '7302686542567843' 1316 | '8546715004577657' 1317 | '3213334303802597' 1318 | '8597909828854358' 1319 | '4297331499805584' 1320 | '4638139091478390' 1321 | '4622489261077564' 1322 | '7810002175996080' 1323 | '1936526015000741' 1324 | '6640962702559091' 1325 | '8383370371971256' 1326 | '2939034891888609' 1327 | '4454805530060985' 1328 | '3249908820840586' 1329 | '8539991248936864' 1330 | '3409232742360527' 1331 | '9388235716799274' 1332 | '2510577085661201' 1333 | '3646091742916273' 1334 | '7887786880851695' 1335 | '2353330480264809' 1336 | '0988111850445182' 1337 | '8704427119642774' 1338 | '3743172430418106' 1339 | '2572454089946165' 1340 | '1471488711128702' 1341 | '1166266129921268' 1342 | '1490029798748713' 1343 | '9414743196659176' 1344 | '9260465199610835' 1345 | '2494455334681169' 1346 | '3401798681963025' 1347 | '4394980501553581' 1348 | '8057652274097417' 1349 | '9321144365154770' 1350 | '5038061910820648' 1351 | '5289049733461064' 1352 | '4550938073239259' 1353 | '9370345138602673' 1354 | '2554625843238213' 1355 | '8817841673380579' 1356 | '4856026922423928' 1357 | '0551270634877677' 1358 | '6891819799389627' 1359 | '5464457366726791' 1360 | '6104564202174666' 1361 | '4462702853773709' 1362 | '2743013032177607' 1363 | '0159881129261755' 1364 | '6658346908091788' 1365 | '4668165398379056' 1366 | '1832149265688468' 1367 | '1389517934903873' 1368 | '1371273527271167' 1369 | '2101376653919965' 1370 | '6511338224998281' 1371 | '7843622444436109' 1372 | '3900207771806174' 1373 | '9088619065536633' 1374 | '1719418780051517' 1375 | '2476459985820731' 1376 | '5637899373760411' 1377 | '2796983319977458' 1378 | '9843068562141507' 1379 | '8966904432758564' 1380 | '2605841493200523' 1381 | '6374546452641609' 1382 | '1547801271005097' 1383 | '1692735803556565' 1384 | '2258825688531615' 1385 | '8403092813014357' 1386 | '1758871957538405' 1387 | '8817452552448717' 1388 | '5636446510972388' 1389 | '2519922790130967' 1390 | '3909099252127669' 1391 | '3722850774705137' 1392 | '7703295692754707' 1393 | '9167729903077433' 1394 | '1150834878231061' 1395 | '2576274925658233' 1396 | '5516880845165752' 1397 | '0663471174563620' 1398 | '7141676732006584' 1399 | '0266456512366379' 1400 | '9470258071926744' 1401 | '8478179425149980' 1402 | '3691838278935328' 1403 | '4152868185331571' 1404 | '9744271997252897' 1405 | '2477379731514964' 1406 | '8789500225295072' 1407 | '7300139921405189' 1408 | '3369400288569266' 1409 | '9527697847366760' 1410 | '2862505833678319' 1411 | '9073173318943213' 1412 | '1805158819992303' 1413 | '0055741804850323' 1414 | '5090277256689693' 1415 | '5103412662060688' 1416 | '6776214714002632' 1417 | '6222973545998003' 1418 | '3964602153634137' 1419 | '7806604914976835' 1420 | '0221598978702769' 1421 | '7401325942574098' 1422 | '6729302000867770' 1423 | '3814088635227486' 1424 | '1182494158342602' 1425 | '0333319355292391' 1426 | '9246406599203693' 1427 | '3193848482021133' 1428 | '7297926043814179' 1429 | '2259776788149002' 1430 | '8959911254433171' 1431 | '7709142080857069' 1432 | '2256543146582840' 1433 | '1424781661502425' 1434 | '7927676376928429' 1435 | '4984953466569313' 1436 | '9207446376390109' 1437 | '7910731548427829' 1438 | '4685500713654066' 1439 | '5504689347236607' 1440 | '5346119995471872' 1441 | '8620571251876461' 1442 | '3887703574717715' 1443 | '4910049931341131' 1444 | '5773360790566077' 1445 | '9843649456639193' 1446 | '7885752440367068' 1447 | '3540015897149820' 1448 | '6554595836998553' 1449 | '0043707848749885' 1450 | '9900013342649750' 1451 | '0775548787056930' 1452 | '8225523973822409' 1453 | '5746352555632183' 1454 | '6227983122319302' 1455 | '6415465857521274' 1456 | '2484537784656723' 1457 | '0817601982173424' 1458 | '1414227843037997' 1459 | '3136383290013278' 1460 | '6871194438443529' 1461 | '4424128889402654' 1462 | '5564072619929819' 1463 | '9458022944178730' 1464 | '5904046566684139' 1465 | '1031594415395849' 1466 | '2598564882150652' 1467 | '4212791970687838' 1468 | '9994267247806488' 1469 | '4183471472614643' 1470 | '1605640974987339' 1471 | '4334687646789423' 1472 | '2028878302725242' 1473 | '7498794552965912' 1474 | '4222168412742203' 1475 | '5872341318365864' 1476 | '0688205392335517' 1477 | '1012718000213051' 1478 | '9601811302362873' 1479 | '0368807015225705' 1480 | '0423283858614560' 1481 | '2807726564125475' 1482 | '9159404940511843' 1483 | '5611941172855227' 1484 | '2629989193549387' 1485 | '8202605985445760' 1486 | '4893429148663384' 1487 | '0538473468269663' 1488 | '6778854241096097' 1489 | '5144158680822312' 1490 | '2645310874346464' 1491 | '8442212817772886' 1492 | '6952367356389795' 1493 | '3657663687758204' 1494 | '8142008003216143' 1495 | '7728043064049688' 1496 | '4514846195013275' 1497 | '3435384290665944' 1498 | '9686710861426812' 1499 | '6275399974900150' 1500 | '5194473880427100' 1501 | '3354091734144208' 1502 | '9864914495968880' 1503 | '4699764722414537' 1504 | '0834517382019290' 1505 | '3835177829200650' 1506 | '5067247582136363' 1507 | '3206538573821389' 1508 | '5117201213260063' 1509 | '1917111460484572' 1510 | '1476820002802226' 1511 | '4866130445435597' 1512 | '9191799698922876' 1513 | '8319835682435822' 1514 | '6284319066334932' 1515 | '7895890007380864' 1516 | '0016028135363390' 1517 | '1629582602837939' 1518 | '6281293970020478' 1519 | '1071583724440976' 1520 | '4524224602877694' 1521 | '6185604977196796' 1522 | '7502774007219801' 1523 | '7547025642980171' 1524 | '3622720829398667' 1525 | '9276919718915011' 1526 | '3085696794261793' 1527 | '9250358550377036' 1528 | '0912007765217029' 1529 | '4277515346972254' 1530 | '7360362940868948' 1531 | '2336853784692704' 1532 | '6796784097613469' 1533 | '1114373946325629' 1534 | '1053035874605279' 1535 | '9477649623975495' 1536 | '8863990947542993' 1537 | '2063572216422681' 1538 | '7909596760956306' 1539 | '2768674236662876' 1540 | '9185710638669025' 1541 | '9325979860489360' 1542 | '3451653037088752' 1543 | '1395246704345301' 1544 | '8696371295133469' 1545 | '6026448606140080' 1546 | '2089405720123764' 1547 | '7243797486408763' 1548 | '7378439896232537' 1549 | '1960659643060700' 1550 | '0648754161954524' 1551 | '8297118284363913' 1552 | '6987859021146829' 1553 | '7174565481339387' 1554 | '1503356311182956' 1555 | '5975795693445218' 1556 | '8184771954231335' 1557 | '3225234352538135' 1558 | '5669809697821605' 1559 | '5674637209343793' 1560 | '1354269505314241' 1561 | '7552878890980652' 1562 | '1779620589887285' 1563 | '4260354003035046' 1564 | '9375553219392266' 1565 | '3785350783958014' 1566 | '6360345345931839' 1567 | '7550775540756356' 1568 | '9366137724736882' 1569 | '4523296415540509' 1570 | '3279155962167430' 1571 | '8058092874291531' 1572 | '9858129386671946' 1573 | '6655471141106230' 1574 | '3486991767780112' 1575 | '9591068246894116' 1576 | '8684689721538476' 1577 | '5574433829312677' 1578 | '1144503171445774' 1579 | '5363332741180648' 1580 | '1108960395656869' 1581 | '0566383830205849' 1582 | '6734163008294982' 1583 | '8919358432020822' 1584 | '1342110581620509' 1585 | '8787161706907593' 1586 | '2346477990139257' 1587 | '6043857109093684' 1588 | '6319099294530830' 1589 | '4560919306140761' 1590 | '1896584751702085' 1591 | '7552812367957914' 1592 | '9777057618356178' 1593 | '2716052214488242' 1594 | '9284922121712351' 1595 | '9688358087180434' 1596 | '0147403368421335' 1597 | '9395408015297615' 1598 | '9866697120144532' 1599 | '0208426715486029' 1600 | '3079450147861073' 1601 | '2286328666213597' 1602 | '9168628563499497' 1603 | '6275250887088639' 1604 | '5151012193476140' 1605 | '8983949815256345' 1606 | '3321610099214508' 1607 | '5988673819363085' 1608 | '3874785492988689' 1609 | '0142114183634246' 1610 | '4257190596198832' 1611 | '0613232612734324' 1612 | '5617525723011038' 1613 | '2245048190706902' 1614 | '9901615216184519' 1615 | '9044327039560705' 1616 | '4458599856705461' 1617 | '3768949484663129' 1618 | '1271042346165427' 1619 | '9803408137992992' 1620 | '0794400761678530' 1621 | '7465546844790005' 1622 | '0939575979888009' 1623 | '2945132151366142' 1624 | '7524601621641574' 1625 | '2839436592333365' 1626 | '5238300176801359' 1627 | '8950044007933567' 1628 | '4983429767265026' 1629 | '2781787646109091' 1630 | '8442914575084180' 1631 | '6365848106752626' 1632 | '3941183416683107' 1633 | '3419684397341110' 1634 | '4831233793903465' 1635 | '1173998930753832' 1636 | '9577006721918128' 1637 | '7632264514521441' 1638 | '4724456465338786' 1639 | '3798795073226511' 1640 | '9130470582269584' 1641 | '9341884066988967' 1642 | '3839315798625956' 1643 | '0135141644916427' 1644 | '8629782524446456' 1645 | '7593062914768703' 1646 | '0330548683286193' 1647 | '9699876045933227' 1648 | '5540945385688742' 1649 | '0730174876838102' 1650 | '0027265129722110' 1651 | '9442310481470831' 1652 | '4726833956425628' 1653 | '1084362923815956' 1654 | '5650877193910031' 1655 | '2021358127226084' 1656 | '9985311389858045' 1657 | '8064128625746914' 1658 | '6814379626739850' 1659 | '1408357962196970' 1660 | '7177823805868212' 1661 | '6179921122356448' 1662 | '3866052562013838' 1663 | '0484091008891938' 1664 | '7948864841305840' 1665 | '0116406509750081' 1666 | '4504828604018086' 1667 | '8185128125993431' 1668 | '8675196610383184' 1669 | '3966959204741532' 1670 | '9998349212878306' 1671 | '6675709211065348' 1672 | '6268791125195161' 1673 | '7951052122059547' 1674 | '6678470624837180' 1675 | '4089657816286825' 1676 | '8772524958997096' 1677 | '5271553686978643' 1678 | '4803159225683206' 1679 | '3199693276769989' 1680 | '7982080360032527' 1681 | '5468891189019852' 1682 | '7230233932965104' 1683 | '4391901850357178' 1684 | '5065655956824632' 1685 | '9167638402821805' 1686 | '5900808420128744' 1687 | '5189945129744135' 1688 | '9426313609829593' 1689 | '6664989164037384' 1690 | '3998216985353591' 1691 | '9760553070620315' 1692 | '5888428723253916' 1693 | '0553993254139660' 1694 | '1739013358918354' 1695 | '5927645627522212' 1696 | '3780628429554093' 1697 | '8770657166232746' 1698 | '3093729719558960' 1699 | '3392035409502463' 1700 | '6013404957331672' 1701 | '6522275321447700' 1702 | '8750342637728115' 1703 | '3234979226899557' 1704 | '3262838277652964' 1705 | '1775245124901823' 1706 | '8463858267520161' 1707 | '2441824817952410' 1708 | '1847880507064966' 1709 | '7608629529141173' 1710 | '9550760107444710' 1711 | '8547995676127192' 1712 | '0999050928691260' 1713 | '2890906099394131' 1714 | '1609573294387912' 1715 | '8483865175213655' 1716 | '4282146544434700' 1717 | '8484722100038621' 1718 | '0218364424025703' 1719 | '0564403702047872' 1720 | '3213270221591002' 1721 | '8010113923185337' 1722 | '9245162752934196' 1723 | '0670460070225388' 1724 | '4061240268639750' 1725 | '7045186918627881' 1726 | '9921348604658514' 1727 | '7321856372031841' 1728 | '6986794174066101' 1729 | '6436645072515064' 1730 | '6689122532820149' 1731 | '2987152808859716' 1732 | '7159155547965583' 1733 | '5216785983018981' 1734 | '5312545291523544' 1735 | '6946249788791384' 1736 | '7257377987282289' 1737 | '5202447870436314' 1738 | '4609114065087405' 1739 | '1289486906326960' 1740 | '1306495178101932' 1741 | '6577617305490063' 1742 | '2696390628764419' 1743 | '3639486067516026' 1744 | '6591330571348275' 1745 | '0472509329999094' 1746 | '7210125134883298' 1747 | '8684797987078500' 1748 | '9762453301498390' 1749 | '9103022654823171' 1750 | '4931760148419156' 1751 | '3412031775437874' 1752 | '5834698891535642' 1753 | '5385176270719157' 1754 | '0591740577651900' 1755 | '2315521857737383' 1756 | '6268839773012441' 1757 | '1963513304826398' 1758 | '6235970778656198' 1759 | '6472641531360937' 1760 | '2196770064348387' 1761 | '3479415050831712' 1762 | '6480598240120983' 1763 | '8165268712114293' 1764 | '8324822147893113' 1765 | '4484891987514842' 1766 | '2062927810879170' 1767 | '9052868450546821' 1768 | '4922825431742982' 1769 | '0103603825236046' 1770 | '6534076153763311' 1771 | '6409021033426977' 1772 | '9090213584975836' 1773 | '3049738839710977' 1774 | '4583724379507561' 1775 | '0843487738282045' 1776 | '6885259675855806' 1777 | '0634085006653854' 1778 | '1936688714807216' 1779 | '0106759014178117' 1780 | '1661033931550987' 1781 | '2392353418235571' 1782 | '7049990478176537' 1783 | '0024432211733359' 1784 | '9890885662405392' 1785 | '8576855930507972' 1786 | '6279194130268341' 1787 | '5275653438521541' 1788 | '0432722139624853' 1789 | '8792211722543459' 1790 | '8159356018030939' 1791 | '4010535953038571' 1792 | '7720074837882422' 1793 | '1237931110178629' 1794 | '9149410896951587' 1795 | '2047182913441310' 1796 | '8237735850702918' 1797 | '0705034550411594' 1798 | '8981110885391165' 1799 | '1016303025566814' 1800 | '5584775574824047' 1801 | '7838742230125765' 1802 | '0353924114476353' 1803 | '4612142060570778' 1804 | '5968801675566873' 1805 | '6042691810267426' 1806 | '8790569607765663' 1807 | '5325311337445622' 1808 | '7730903168038690' 1809 | '8734039937798993' 1810 | '8390592801669708' 1811 | '3714433044766642' 1812 | '1057917479630559' 1813 | '3889951882605836' 1814 | '2221196144351012' 1815 | '2991710584179271' 1816 | '4066618565520228' 1817 | '1360774986217464' 1818 | '6610720883634195' 1819 | '0917359928011934' 1820 | '3897052303515622' 1821 | '9809173858989710' 1822 | '2664466850566583' 1823 | '9959705014752812' 1824 | '7221740208834402' 1825 | '5554889860206622' 1826 | '9950003726767755' 1827 | '5817650348948091' 1828 | '7584221159011003' 1829 | '5258634777861466' 1830 | '5641088389049803' 1831 | '4202967204576501' 1832 | '0140290923960980' 1833 | '0857121949996728' 1834 | '3600124214652465' 1835 | '1981238941329724' 1836 | '2614268283441627' 1837 | '5822858888458457' 1838 | '4383027391172474' 1839 | '7197949142670738' 1840 | '1337837285831155' 1841 | '1370011046889224' 1842 | '3897407965299256' 1843 | '8157324655979889' 1844 | '1526116387229667' 1845 | '9552699963150988' 1846 | '0708540392988650' 1847 | '4373301942662211' 1848 | '6585999303751521' 1849 | '5435083106115315' 1850 | '0197619004790333' 1851 | '3731028426709720' 1852 | '6716188373279807' 1853 | '0386443494334522' 1854 | '3081975212564072' 1855 | '1691954194015598' 1856 | '7229371150009975' 1857 | '9800685017345435' 1858 | '8173764140035420' 1859 | '2127538158660586' 1860 | '7825248773045485' 1861 | '9828554200429255' 1862 | '4914033461137684' 1863 | '8385527719078683' 1864 | '3493922815694489' 1865 | '5241988245375282' 1866 | '8022488175332425' 1867 | '9466247145268200' 1868 | '1154403772422206' 1869 | '6247829144633657' 1870 | '8527862265814460' 1871 | '2504160347426051' 1872 | '6824483122002132' 1873 | '4687657437238477' 1874 | '1932814744695934' 1875 | '3195065914714136' 1876 | '7046509518488386' 1877 | '9445769170579841' 1878 | '8852535804532171' 1879 | '5487285070670225' 1880 | '4077407388638829' 1881 | '9794317455022483' 1882 | '9753630074761980' 1883 | '6064133099703834' 1884 | '5387370823764697' 1885 | '2921999414778885' 1886 | '2035142383417543' 1887 | '0522666327697666' 1888 | '8033707005663188' 1889 | '2667680604997337' 1890 | '8003706296514804' 1891 | '0964846355737404' 1892 | '9679289046642940' 1893 | '9970374271352400' 1894 | '8829009538280070' 1895 | '4213875609158335' 1896 | '6921094504170111' 1897 | '8850235331458960' 1898 | '2091638432452771' 1899 | '3529172245256552' 1900 | '4837963902409965' 1901 | '9638813391870363' 1902 | '1398434355726187' 1903 | '2324272614446612' 1904 | '9977062355572727' 1905 | '7261886076096286' 1906 | '8856897025362283' 1907 | '0419485619107486' 1908 | '9358618234727173' 1909 | '3928663492535263' 1910 | '5566197739717907' 1911 | '2452457630681875' 1912 | '4825995802620001' 1913 | '0130998982802707' 1914 | '7793402311593535' 1915 | '2424952591826394' 1916 | '3063280838531722' 1917 | '9984519686857108' 1918 | '2182776519487290' 1919 | '3244693604617632' 1920 | '6119601689811165' 1921 | '9696712814642672' 1922 | '0983897598172124' 1923 | '3142445018183449' 1924 | '2468094791173016' 1925 | '6563423490788082' 1926 | '7806940394765955' 1927 | '8684991694131858' 1928 | '7594134228368057' 1929 | '6079839283146795' 1930 | '3220212149650455' 1931 | '0575499616895846' 1932 | '8884622074338832' 1933 | '6797121181041260' 1934 | '0976170755110980' 1935 | '7253237723737342' 1936 | '2709458726699479' 1937 | '9749955310929618' 1938 | '9524664070970761' 1939 | '5030063964417973' 1940 | '9918621527111310' 1941 | '0801698300124188' 1942 | '3031565794898955' 1943 | '4246724719710918' 1944 | '7433985260173962' 1945 | '3711237479135060' 1946 | '4561349813844261' 1947 | '3036473421451248' 1948 | '3660702069328727' 1949 | '3588477282967188' 1950 | '3846436754840807' 1951 | '8709207149261424' 1952 | '2837199389329817' 1953 | '6766853272723073' 1954 | '9405508488536506' 1955 | '0888545968650577' 1956 | '2074407987193380' 1957 | '7812570363179157' 1958 | '2758815301520693' 1959 | '1956934948116716' 1960 | '8642331523775212' 1961 | '2178382965210289' 1962 | '9569726854289044' 1963 | '4471628774066811' 1964 | '0651611765502225' 1965 | '0655699519356599' 1966 | '7516449796548682' 1967 | '4504515568157313' 1968 | '6492837506716930' 1969 | '5822890695246252' 1970 | '7770673797895263' 1971 | '1804480861944012' 1972 | '0820415737839126' 1973 | '4142500118257234' 1974 | '7485127178984275' 1975 | '5569428001724869' 1976 | '2028670545134206' 1977 | '5870493739969567' 1978 | '1937033915488845' 1979 | '9773771011816839' 1980 | '0971028413933055' 1981 | '6808646308879089' 1982 | '9625721896398221' 1983 | '2459560032068371' 1984 | '8151701270714610' 1985 | '9419753900520387' 1986 | '2053790902183796' 1987 | '4454900629930688' 1988 | '7721520806912474' 1989 | '2844164340070311' 1990 | '9791547328261225' 1991 | '5553059499293212' 1992 | '1525661990572300' 1993 | '6412723363992632' 1994 | '2022748050027440' 1995 | '5908351393948190' 1996 | '5778562620355677' 1997 | '7865759910805186' 1998 | '4453598247440248' 1999 | '7889278884267493' 2000 | '6184919803056033' 2001 | -------------------------------------------------------------------------------- /QueryHub/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/assets/icon.png -------------------------------------------------------------------------------- /QueryHub/beta_data/beta_data_1.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | import tkinter as tk 3 | from tkinter import messagebox, ttk, colorchooser 4 | import os 5 | import sys 6 | from datetime import datetime, timedelta 7 | 8 | # --- تنظیمات اولیه --- 9 | FONT_SIZE_MIN = 1 10 | FONT_SIZE_MAX = 1000 11 | DEFAULT_FONT_SIZE = 10 12 | PERMANENT_PASSWORD = "1234567890123456" # رمز عبور دائمی 16 رقمی 13 | 14 | # --- اتصال به دیتابیس‌ها --- 15 | def connect_theme_db(): 16 | conn = sqlite3.connect("database/salar.db") 17 | cursor = conn.cursor() 18 | cursor.execute(""" 19 | CREATE TABLE IF NOT EXISTS user_settings ( 20 | id INTEGER PRIMARY KEY AUTOINCREMENT, 21 | theme_id INTEGER NOT NULL, 22 | font_size INTEGER NOT NULL DEFAULT 12 23 | ) 24 | """) 25 | cursor.execute("SELECT COUNT(*) FROM user_settings") 26 | if cursor.fetchone()[0] == 0: 27 | cursor.execute("INSERT INTO user_settings (theme_id, font_size) VALUES (?, ?)", (1, 12)) 28 | conn.commit() 29 | conn.close() 30 | 31 | def connect_question_db(): 32 | conn = sqlite3.connect("database/xert.db") 33 | cursor = conn.cursor() 34 | cursor.execute(""" 35 | CREATE TABLE IF NOT EXISTS questions ( 36 | id INTEGER PRIMARY KEY AUTOINCREMENT, 37 | question TEXT NOT NULL, 38 | answer TEXT NOT NULL 39 | ) 40 | """) 41 | conn.commit() 42 | conn.close() 43 | 44 | def connect_betf_db(): 45 | conn = sqlite3.connect("database/betf.db") 46 | cursor = conn.cursor() 47 | cursor.execute(""" 48 | CREATE TABLE IF NOT EXISTS app_access ( 49 | id INTEGER PRIMARY KEY AUTOINCREMENT, 50 | start_date TEXT NOT NULL, 51 | access_granted INTEGER NOT NULL DEFAULT 0 52 | ) 53 | """) 54 | cursor.execute("SELECT COUNT(*) FROM app_access") 55 | if cursor.fetchone()[0] == 0: 56 | now = datetime.now().strftime("%Y-%m-%d") 57 | cursor.execute("INSERT INTO app_access (start_date, access_granted) VALUES (?, ?)", (now, 0)) 58 | conn.commit() 59 | conn.close() 60 | 61 | # --- توابع پایگاه داده --- 62 | def execute_sql(db_name, query, params=()): 63 | conn = sqlite3.connect(db_name) 64 | cursor = conn.cursor() 65 | cursor.execute(query, params) 66 | conn.commit() 67 | conn.close() 68 | 69 | def fetch_sql(db_name, query, params=()): 70 | conn = sqlite3.connect(db_name) 71 | cursor = conn.cursor() 72 | cursor.execute(query, params) 73 | result = cursor.fetchall() 74 | conn.close() 75 | return result 76 | 77 | # --- بررسی دسترسی --- 78 | def check_access(): 79 | data = fetch_sql("database/betf.db", "SELECT start_date, access_granted FROM app_access LIMIT 1")[0] 80 | start_date = datetime.strptime(data[0], "%Y-%m-%d") 81 | access_granted = bool(data[1]) 82 | current_date = datetime.now() 83 | 84 | if access_granted: 85 | return True 86 | 87 | if current_date > start_date + timedelta(days=30): 88 | return False 89 | 90 | return True 91 | 92 | def activate_program(): 93 | password_window = tk.Toplevel(root) 94 | password_window.title("Enter Activation Code") 95 | 96 | tk.Label(password_window, text="Enter 16-Digit Activation Code:").grid(row=0, column=0, padx=10, pady=10) 97 | entry_password = ttk.Entry(password_window, show="*", width=30) 98 | entry_password.grid(row=1, column=0, padx=10, pady=10) 99 | 100 | def validate_password(): 101 | entered_password = entry_password.get() 102 | if entered_password == PERMANENT_PASSWORD: 103 | execute_sql("database/betf.db", "UPDATE app_access SET access_granted = 1 WHERE id = 1") 104 | messagebox.showinfo("Success", "Program activated successfully!") 105 | password_window.destroy() 106 | app_reload() 107 | else: 108 | messagebox.showerror("Error", "Invalid activation code.") 109 | 110 | ttk.Button(password_window, text="Activate", command=validate_password).grid(row=2, column=0, padx=10, pady=10) 111 | 112 | def app_reload(): 113 | python = sys.executable 114 | os.execl(python, python, *sys.argv) 115 | 116 | # --- اگر دسترسی محدود باشد، پنجره فعال‌سازی نمایش داده می‌شود --- 117 | def enforce_access(): 118 | if not check_access(): 119 | msg = """ 120 | Your 30-day trial period has ended. 121 | Please enter a 16-digit activation code to unlock the program. 122 | """ 123 | messagebox.showerror("Activation Required", msg) 124 | activate_program() 125 | root.wait_window() 126 | 127 | # --- توابع مدیریت سوالات --- 128 | def load_questions(): 129 | for row in tree.get_children(): 130 | tree.delete(row) 131 | questions = fetch_sql("database/xert.db", "SELECT * FROM questions") 132 | for row in questions: 133 | tree.insert("", tk.END, values=row) 134 | 135 | def add_question(): 136 | question = entry_question.get() 137 | answer = entry_answer.get() 138 | if question and answer: 139 | execute_sql("database/xert.db", "INSERT INTO questions (question, answer) VALUES (?, ?)", (question, answer)) 140 | load_questions() 141 | entry_question.delete(0, tk.END) 142 | entry_answer.delete(0, tk.END) 143 | else: 144 | messagebox.showwarning("Warning", "Please fill in both Question and Answer fields.") 145 | 146 | def edit_question(): 147 | selected_item = tree.selection() 148 | if not selected_item: 149 | messagebox.showwarning("Warning", "Please select a question to edit.") 150 | return 151 | 152 | question_id = tree.item(selected_item[0])["values"][0] 153 | edited_question = entry_question.get() 154 | edited_answer = entry_answer.get() 155 | if edited_question and edited_answer: 156 | execute_sql("database/xert.db", "UPDATE questions SET question = ?, answer = ? WHERE id = ?", 157 | (edited_question, edited_answer, question_id)) 158 | load_questions() 159 | entry_question.delete(0, tk.END) 160 | entry_answer.delete(0, tk.END) 161 | else: 162 | messagebox.showwarning("Warning", "Please enter both Question and Answer fields.") 163 | 164 | def delete_question(): 165 | selected_item = tree.selection() 166 | if not selected_item: 167 | messagebox.showwarning("Warning", "Please select a question to delete.") 168 | return 169 | 170 | question_id = tree.item(selected_item[0])["values"][0] 171 | execute_sql("database/xert.db", "DELETE FROM questions WHERE id = ?", (question_id,)) 172 | load_questions() 173 | 174 | def select_item(event): 175 | selected_item = tree.selection() 176 | if not selected_item: 177 | return 178 | question = tree.item(selected_item[0])["values"][1] 179 | answer = tree.item(selected_item[0])["values"][2] 180 | entry_question.delete(0, tk.END) 181 | entry_question.insert(0, question) 182 | entry_answer.delete(0, tk.END) 183 | entry_answer.insert(0, answer) 184 | 185 | # --- رابط کاربری --- 186 | root = tk.Tk() 187 | root.title("Questions Database") 188 | 189 | # منوی بالا 190 | menu_bar = tk.Menu(root) 191 | file_menu = tk.Menu(menu_bar, tearoff=0) 192 | file_menu.add_command(label="Exit", command=root.quit) 193 | menu_bar.add_cascade(label="File", menu=file_menu) 194 | root.config(menu=menu_bar) 195 | 196 | # فریم ورودی‌ها 197 | frame = tk.Frame(root) 198 | frame.pack(pady=10) 199 | 200 | entry_question = ttk.Entry(frame, width=30) 201 | entry_question.grid(row=0, column=1, padx=5, pady=5) 202 | ttk.Label(frame, text="Question: ").grid(row=0, column=0) 203 | 204 | entry_answer = ttk.Entry(frame, width=30) 205 | entry_answer.grid(row=1, column=1, padx=5, pady=5) 206 | ttk.Label(frame, text="Answer: ").grid(row=1, column=0) 207 | 208 | btn_add = ttk.Button(frame, text="Add Question", command=add_question) 209 | btn_add.grid(row=2, column=0, pady=5) 210 | 211 | btn_edit = ttk.Button(frame, text="Edit Question", command=edit_question) 212 | btn_edit.grid(row=2, column=1, pady=5) 213 | 214 | btn_delete = ttk.Button(frame, text="Delete Question", command=delete_question) 215 | btn_delete.grid(row=2, column=2, pady=5) 216 | 217 | # جدول نمایش سوالات 218 | tree = ttk.Treeview(root, columns=("ID", "Question", "Answer"), show='headings') 219 | tree.heading("ID", text="ID") 220 | tree.heading("Question", text="Question") 221 | tree.heading("Answer", text="Answer") 222 | tree.pack(pady=10) 223 | tree.bind("<>", select_item) 224 | 225 | # اجرای الزامات 226 | connect_theme_db() 227 | connect_question_db() 228 | connect_betf_db() 229 | enforce_access() 230 | load_questions() 231 | 232 | # اجرا 233 | root.mainloop() 234 | -------------------------------------------------------------------------------- /QueryHub/database/betf.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/database/betf.db -------------------------------------------------------------------------------- /QueryHub/database/num.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/database/num.db -------------------------------------------------------------------------------- /QueryHub/database/questions.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/database/questions.db -------------------------------------------------------------------------------- /QueryHub/database/salar.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/database/salar.db -------------------------------------------------------------------------------- /QueryHub/database/xert.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/database/xert.db -------------------------------------------------------------------------------- /QueryHub/main.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | import tkinter as tk 3 | from tkinter import messagebox, ttk 4 | from tkinter import colorchooser 5 | import os 6 | import sys 7 | from datetime import datetime, timedelta 8 | 9 | FONT_SIZE_MIN = 1 10 | FONT_SIZE_MAX = 1000 11 | DEFAULT_FONT_SIZE = 10 12 | 13 | 14 | def connect_betf_db(): 15 | conn = sqlite3.connect("database/betf.db") 16 | cursor = conn.cursor() 17 | cursor.execute(""" 18 | CREATE TABLE IF NOT EXISTS app_access ( 19 | id INTEGER PRIMARY KEY AUTOINCREMENT, 20 | start_date TEXT NOT NULL, 21 | access_granted INTEGER NOT NULL DEFAULT 0 22 | ) 23 | """) 24 | cursor.execute("SELECT COUNT(*) FROM app_access") 25 | if cursor.fetchone()[0] == 0: 26 | now = datetime.now().strftime("%Y-%m-%d") 27 | cursor.execute("INSERT INTO app_access (start_date, access_granted) VALUES (?, ?)", (now, 0)) 28 | conn.commit() 29 | conn.close() 30 | 31 | def check_access(): 32 | data = fetch_sql("database/betf.db", "SELECT start_date, access_granted FROM app_access LIMIT 1")[0] 33 | start_date = datetime.strptime(data[0], "%Y-%m-%d") 34 | access_granted = bool(data[1]) 35 | current_date = datetime.now() 36 | 37 | if access_granted: 38 | return True 39 | 40 | if current_date > start_date + timedelta(days=30): 41 | return False 42 | 43 | return True 44 | 45 | def activate_program(): 46 | password_window = tk.Toplevel(root) 47 | password_window.title("Enter Activation Code - QueryHub") 48 | 49 | # Prevent interaction with the main window 50 | password_window.grab_set() 51 | 52 | # در صورت بستن پنجره فعال‌سازی، برنامه کاملاً بسته شود 53 | password_window.protocol("WM_DELETE_WINDOW", lambda: on_exit()) 54 | 55 | tk.Label(password_window, text="Enter 16-Digit Activation Code:").grid(row=0, column=0, padx=10, pady=10) 56 | entry_password = ttk.Entry(password_window, show="", width=30) 57 | entry_password.grid(row=1, column=0, padx=10, pady=10) 58 | 59 | def validate_password(): 60 | entered_password = entry_password.get() 61 | 62 | # بررسی طول کد وارد شده 63 | if len(entered_password) != 16: 64 | messagebox.showerror("Error", "Invalid activation code. Code must be 16 characters long.") 65 | return 66 | 67 | # بررسی کد در دیتابیس 68 | query = "SELECT COUNT(*) FROM activatecode WHERE code = ?" 69 | result = fetch_sql("database/betf.db", query, (entered_password,)) 70 | 71 | if result[0][0] > 0: # اگر کد در دیتابیس وجود داشت 72 | execute_sql("database/betf.db", "UPDATE app_access SET access_granted = 1 WHERE id = 1") 73 | messagebox.showinfo("Success", "Program activated successfully!") 74 | password_window.destroy() # پنجره فعال‌سازی بسته می‌شود. 75 | app_reload() # برنامه دوباره بارگذاری می‌شود. 76 | else: 77 | messagebox.showerror("Error", "Invalid activation code. Please try again.") 78 | 79 | ttk.Button(password_window, text="Activate", command=validate_password).grid(row=2, column=0, padx=10, pady=10) 80 | 81 | def add_sample_activation_codes(): 82 | conn = sqlite3.connect("database/betf.db") 83 | cursor = conn.cursor() 84 | sample_codes = [ 85 | '1234567890123456', # نمونه‌ای از کد فعال‌سازی صحیح 86 | '6543210987654321', # نمونه کد فعال‌سازی دیگر 87 | '0987654321123456', # یک کد اضافی 88 | ] 89 | for code in sample_codes: 90 | try: 91 | cursor.execute("INSERT OR IGNORE INTO activatecode (code) VALUES (?)", (code,)) 92 | except sqlite3.IntegrityError: 93 | pass # در صورت وجود کد تکراری، از آن صرف نظر کنید 94 | conn.commit() 95 | conn.close() 96 | def app_reload(): 97 | python = sys.executable 98 | os.execl(python, python, *sys.argv) 99 | 100 | # --- اگر دسترسی محدود باشد، پنجره فعال‌سازی نمایش داده می‌شود --- 101 | def enforce_access(): 102 | if not check_access(): 103 | msg = """ 104 | Your 30-day trial period has ended. 105 | Please enter a 16-digit activation code to unlock the 106 | program. 107 | """ 108 | messagebox.showerror("Activation Required", msg) 109 | activate_program() 110 | root.wait_window() 111 | 112 | 113 | # Create or connect to SQLite database for themes 114 | def connect_theme_db(): 115 | conn = sqlite3.connect("database/salar.db") 116 | cursor = conn.cursor() 117 | 118 | cursor.execute(""" 119 | CREATE TABLE IF NOT EXISTS user_settings ( 120 | id INTEGER PRIMARY KEY AUTOINCREMENT, 121 | theme_id INTEGER NOT NULL 122 | ) 123 | """) 124 | cursor.execute("PRAGMA table_info(user_settings)") 125 | columns = [column[1] for column in cursor.fetchall()] 126 | if "font_size" not in columns: 127 | cursor.execute("ALTER TABLE user_settings ADD COLUMN font_size INTEGER NOT NULL DEFAULT 12") 128 | cursor.execute("SELECT COUNT(*) FROM user_settings") 129 | if cursor.fetchone()[0] == 0: 130 | cursor.execute("INSERT INTO user_settings (theme_id, font_size) VALUES (?, ?)", (1, 12)) 131 | 132 | conn.commit() 133 | conn.close() 134 | 135 | # Create or connect to SQLite database for questions 136 | def connect_db(): 137 | conn = sqlite3.connect("database/xert.db") 138 | cursor = conn.cursor() 139 | cursor.execute(""" 140 | CREATE TABLE IF NOT EXISTS questions ( 141 | id INTEGER PRIMARY KEY AUTOINCREMENT, 142 | question TEXT NOT NULL, 143 | answer TEXT NOT NULL 144 | ) 145 | """) 146 | cursor.execute(""" 147 | CREATE TABLE IF NOT EXISTS themes ( 148 | id INTEGER PRIMARY KEY AUTOINCREMENT, 149 | name TEXT NOT NULL, 150 | background_color TEXT NOT NULL, 151 | foreground_color TEXT NOT NULL, 152 | entry_background TEXT NOT NULL, 153 | entry_foreground TEXT NOT NULL 154 | ) 155 | """) 156 | cursor.execute(""" 157 | CREATE TABLE IF NOT EXISTS search_history ( 158 | id INTEGER PRIMARY KEY AUTOINCREMENT, 159 | query TEXT NOT NULL 160 | ) 161 | """) 162 | 163 | conn.commit() 164 | conn.close() 165 | 166 | def execute_sql(db_name, query, params=()): 167 | conn = sqlite3.connect(db_name) 168 | cursor = conn.cursor() 169 | cursor.execute(query, params) 170 | conn.commit() 171 | conn.close() 172 | 173 | def fetch_sql(db_name, query, params=()): 174 | conn = sqlite3.connect(db_name) 175 | cursor = conn.cursor() 176 | cursor.execute(query, params) 177 | result = cursor.fetchall() 178 | conn.close() 179 | return result 180 | 181 | def load_questions(): 182 | for row in tree.get_children(): 183 | tree.delete(row) 184 | questions = fetch_sql("database/xert.db", "SELECT * FROM questions") 185 | for row in questions: 186 | tree.insert("", tk.END, values=row) 187 | 188 | def load_themes(): 189 | return fetch_sql("database/xert.db", "SELECT * FROM themes") 190 | 191 | def add_question(): 192 | question = entry_question.get() 193 | answer = entry_answer.get() 194 | if question and answer: 195 | exists = fetch_sql("database/xert.db", "SELECT COUNT(*) FROM questions WHERE question = ?", (question,))[0][0] 196 | if exists > 0: 197 | messagebox.showwarning("Warning", "This question already exists.") 198 | else: 199 | execute_sql("database/xert.db", "INSERT INTO questions (question, answer) VALUES (?, ?)", (question, answer)) 200 | load_questions() 201 | clear_entries() 202 | else: 203 | messagebox.showwarning("Warning", "Please enter both question and answer.") 204 | 205 | def edit_question(): 206 | if not tree.selection(): 207 | messagebox.showwarning("Warning", "Please select a question to edit.") 208 | return 209 | 210 | selected_item = tree.selection()[0] 211 | question_id = tree.item(selected_item)['values'][0] 212 | question = entry_question.get() 213 | answer = entry_answer.get() 214 | 215 | if question and answer: 216 | execute_sql("database/xert.db", "UPDATE questions SET question = ?, answer = ? WHERE id = ?", (question, answer, question_id)) 217 | load_questions() 218 | clear_entries() 219 | else: 220 | messagebox.showwarning("Warning", "Please enter both question and answer.") 221 | 222 | def delete_question(): 223 | if not tree.selection(): 224 | messagebox.showwarning("Warning", "Please select a question to delete.") 225 | return 226 | 227 | selected_item = tree.selection()[0] 228 | question_id = tree.item(selected_item)['values'][0] 229 | execute_sql("database/xert.db", "DELETE FROM questions WHERE id = ?", (question_id,)) 230 | load_questions() 231 | 232 | def select_item(event): 233 | if tree.selection(): 234 | selected_item = tree.selection()[0] 235 | question = tree.item(selected_item)['values'][1] 236 | answer = tree.item(selected_item)['values'][2] 237 | 238 | entry_question.delete(0, tk.END) 239 | entry_answer.delete(0, tk.END) 240 | 241 | entry_question.insert(0, question) 242 | entry_answer.insert(0, answer) 243 | 244 | def clear_entries(): 245 | entry_question.delete(0, tk.END) 246 | entry_answer.delete(0, tk.END) 247 | 248 | def change_theme(selected_theme_index): 249 | themes = load_themes() 250 | if selected_theme_index < len(themes): 251 | selected_theme = themes[selected_theme_index] 252 | root.configure(bg=selected_theme[2]) 253 | style.configure("TFrame", background=selected_theme[2]) 254 | style.configure("TLabel", background=selected_theme[2], foreground=selected_theme[3]) 255 | style.configure("TEntry", fieldbackground=selected_theme[4], foreground=selected_theme[5]) 256 | style.configure("TButton", background=selected_theme[4], foreground=selected_theme[3]) 257 | tree.configure(style='theme.Treeview') 258 | execute_sql("database/salar.db", "UPDATE user_settings SET theme_id = ?", (selected_theme[0],)) 259 | 260 | def apply_last_selected_theme(): 261 | current_theme_id, font_size = fetch_sql("database/salar.db", "SELECT theme_id, font_size FROM user_settings")[0] 262 | change_theme(current_theme_id - 1) 263 | change_font_size(font_size) 264 | 265 | def open_color_picker(entry): 266 | color = colorchooser.askcolor(parent=root)[1] 267 | if color: 268 | entry.delete(0, tk.END) 269 | entry.insert(0, color) 270 | 271 | def open_new_theme_window(): 272 | new_theme_window = tk.Toplevel(root) 273 | new_theme_window.title("Create New Theme - QueryHub") 274 | 275 | tk.Label(new_theme_window, text="Theme Name:").grid(row=0, column=0) 276 | entry_theme_name = tk.Entry(new_theme_window) 277 | entry_theme_name.grid(row=0, column=1) 278 | 279 | tk.Label(new_theme_window, text="Background Color:").grid(row=1, column=0) 280 | entry_bg_color = tk.Entry(new_theme_window) 281 | entry_bg_color.grid(row=1, column=1) 282 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_bg_color)).grid(row=1, column=2) 283 | 284 | tk.Label(new_theme_window, text="Foreground Color:").grid(row=2, column=0) 285 | entry_fg_color = tk.Entry(new_theme_window) 286 | entry_fg_color.grid(row=2, column=1) 287 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_fg_color)).grid(row=2, column=2) 288 | 289 | tk.Label(new_theme_window, text="Entry Background:").grid(row=3, column=0) 290 | entry_entry_bg = tk.Entry(new_theme_window) 291 | entry_entry_bg.grid(row=3, column=1) 292 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_entry_bg)).grid(row=3, column=2) 293 | 294 | tk.Label(new_theme_window, text="Entry Foreground:").grid(row=4, column=0) 295 | entry_entry_fg = tk.Entry(new_theme_window) 296 | entry_entry_fg.grid(row=4, column=1) 297 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_entry_fg)).grid(row=4, column=2) 298 | 299 | def save_theme(): 300 | name = entry_theme_name.get() 301 | bg_color = entry_bg_color.get() 302 | fg_color = entry_fg_color.get() 303 | entry_bg = entry_entry_bg.get() 304 | entry_fg = entry_entry_fg.get() 305 | 306 | if name and bg_color and fg_color and entry_bg and entry_fg: 307 | execute_sql("database/xert.db", "INSERT INTO themes (name, background_color, foreground_color, entry_background, entry_foreground) VALUES (?, ?, ?, ?, ?)", 308 | (name, bg_color, fg_color, entry_bg, entry_fg)) 309 | messagebox.showinfo("Success", "Theme created successfully!") 310 | update_theme_menu() 311 | new_theme_window.destroy() 312 | else: 313 | messagebox.showwarning("Warning", "Please enter all fields.") 314 | 315 | tk.Button(new_theme_window, text="Save Theme", command=save_theme).grid(row=5, columnspan=3) 316 | 317 | def change_font_size(size): 318 | if FONT_SIZE_MIN <= size <= FONT_SIZE_MAX: 319 | style.configure("TLabel", font=("TkDefaultFont", size)) 320 | style.configure("TButton", font=("TkDefaultFont", size)) 321 | style.configure("TEntry", font=("TkDefaultFont", size)) 322 | tree.tag_configure('default', font=("TkDefaultFont", size)) 323 | execute_sql("database/salar.db", "UPDATE user_settings SET font_size = ?", (size,)) 324 | else: 325 | messagebox.showwarning("Warning", f"Font size must be between {FONT_SIZE_MIN} and {FONT_SIZE_MAX}.") 326 | 327 | def reset_font_size(): 328 | change_font_size(DEFAULT_FONT_SIZE) 329 | execute_sql("database/salar.db", "UPDATE user_settings SET font_size = ?", (DEFAULT_FONT_SIZE,)) 330 | messagebox.showinfo("Info", "Font size has been reset. The application will now restart.") 331 | python = sys.executable 332 | os.execl(python, python, *sys.argv) 333 | 334 | def open_font_size_window(): 335 | font_size_window = tk.Toplevel(root) 336 | font_size_window.title("Change Font Size - QueryHub") 337 | 338 | tk.Label(font_size_window, text="Font Size:").grid(row=0, column=0) 339 | spin_font_size = tk.Spinbox(font_size_window, from_=FONT_SIZE_MIN, to=FONT_SIZE_MAX, width=5) 340 | spin_font_size.grid(row=0, column=1) 341 | 342 | current_font_size = fetch_sql("database/salar.db", "SELECT font_size FROM user_settings")[0][0] 343 | spin_font_size.delete(0, tk.END) 344 | spin_font_size.insert(0, current_font_size) 345 | 346 | def update_font_size(): 347 | try: 348 | size = int(spin_font_size.get()) 349 | change_font_size(size) 350 | font_size_window.destroy() 351 | except ValueError: 352 | messagebox.showerror("Error", "Invalid font size entered.") 353 | 354 | tk.Button(font_size_window, text="Apply", command=update_font_size).grid(row=0, column=2) 355 | tk.Button(font_size_window, text="Reset to Default", command=reset_font_size).grid(row=1, column=0, columnspan=3, pady=5) 356 | 357 | def on_exit(): 358 | if messagebox.askyesno("Exit", "Are you sure you want to exit?"): 359 | root.quit() 360 | root.destroy() 361 | 362 | def create_theme_menu(menu): 363 | themes = load_themes() 364 | for index, theme in enumerate(themes): 365 | menu.add_command(label=theme[1], command=lambda idx=index: change_theme(idx)) 366 | 367 | def update_theme_menu(): 368 | theme_menu.delete(0, tk.END) 369 | theme_menu.add_command(label="Create New Theme", command=open_new_theme_window) 370 | theme_menu.add_separator() 371 | create_theme_menu(theme_menu) 372 | 373 | def check_and_display_welcome_message(): 374 | conn = sqlite3.connect("database/num.db") 375 | cursor = conn.cursor() 376 | cursor.execute("SELECT first_time FROM user_status WHERE id = 1") 377 | result = cursor.fetchone() 378 | if result and result[0] == 1: 379 | messagebox.showinfo("Welcome", "Welcome to the Questions Database App!") 380 | cursor.execute("UPDATE user_status SET first_time = 0 WHERE id = 1") 381 | conn.commit() 382 | conn.close() 383 | 384 | def connect_num_db(): 385 | conn = sqlite3.connect("database/num.db") 386 | cursor = conn.cursor() 387 | cursor.execute(""" 388 | CREATE TABLE IF NOT EXISTS user_status ( 389 | id INTEGER PRIMARY KEY AUTOINCREMENT, 390 | first_time INTEGER NOT NULL 391 | ) 392 | """) 393 | cursor.execute("SELECT COUNT(*) FROM user_status") 394 | if cursor.fetchone()[0] == 0: 395 | cursor.execute("INSERT INTO user_status (first_time) VALUES (?)", (1,)) 396 | conn.commit() 397 | conn.close() 398 | 399 | def reset_databases(): 400 | execute_sql("database/xert.db", "DROP TABLE IF EXISTS themes") 401 | execute_sql("database/salar.db", "DROP TABLE IF EXISTS user_settings") 402 | execute_sql("database/num.db", "DROP TABLE IF EXISTS user_status") 403 | connect_db() 404 | connect_theme_db() 405 | connect_num_db() 406 | messagebox.showinfo("Reset Complete", "All data have been reset. The application will now restart.") 407 | python = sys.executable 408 | os.execl(python, python, *sys.argv) 409 | 410 | def open_search_window(): 411 | search_window = tk.Toplevel(root) 412 | search_window.title("Search Questions - QueryHub") 413 | 414 | tk.Label(search_window, text="Search").grid(row=0, column=0) 415 | entry_search = ttk.Entry(search_window, width=30) 416 | entry_search.grid(row=0, column=1, padx=5, pady=5) 417 | 418 | results_tree = ttk.Treeview(search_window, columns=("ID", "Question", "Answer"), show='headings') 419 | results_tree.heading("ID", text="ID") 420 | results_tree.heading("Question", text="Question") 421 | results_tree.heading("Answer", text="Answer") 422 | results_tree.grid(row=1, columnspan=2, pady=10) 423 | 424 | def search_questions(): 425 | query = entry_search.get() 426 | for row in results_tree.get_children(): 427 | results_tree.delete(row) 428 | results = fetch_sql("database/xert.db", "SELECT * FROM questions WHERE question LIKE ?", ("%" + query + "%",)) 429 | for row in results: 430 | results_tree.insert("", tk.END, values=row) 431 | # Add the search query to history 432 | if query: 433 | execute_sql("database/xert.db", "INSERT INTO search_history (query) VALUES (?)", (query,)) 434 | 435 | ttk.Button(search_window, text="Search", command=search_questions).grid(row=0, column=2, pady=5) 436 | 437 | # Button to view search history 438 | ttk.Button(search_window, text="View Search History", command=open_search_history_window).grid(row=2, columnspan=3, pady=5) 439 | 440 | def open_search_history_window(): 441 | history_window = tk.Toplevel(root) 442 | history_window.title("Search History - QueryHub") 443 | 444 | history_tree = ttk.Treeview(history_window, columns=("ID", "Query"), show='headings') 445 | history_tree.heading("ID", text="ID") 446 | history_tree.heading("Query", text="Search Query") 447 | history_tree.pack(pady=10) 448 | 449 | history_results = fetch_sql("database/xert.db", "SELECT * FROM search_history") 450 | for row in history_results: 451 | history_tree.insert("", tk.END, values=row) 452 | 453 | def create_activation_code_table(): 454 | conn = sqlite3.connect("database/betf.db") 455 | cursor = conn.cursor() 456 | cursor.execute(""" 457 | CREATE TABLE IF NOT EXISTS activatecode ( 458 | id INTEGER PRIMARY KEY AUTOINCREMENT, 459 | code TEXT UNIQUE NOT NULL 460 | ) 461 | """) 462 | conn.commit() 463 | conn.close() 464 | 465 | # Create user interface 466 | root = tk.Tk() 467 | root.title("QueryHub") 468 | 469 | # Menu Bar 470 | menu_bar = tk.Menu(root) 471 | file_menu = tk.Menu(menu_bar, tearoff=0) 472 | file_menu.add_command(label="Reset data", command=reset_databases) 473 | file_menu.add_separator() 474 | file_menu.add_command(label="Exit", command=on_exit) 475 | menu_bar.add_cascade(label="File", menu=file_menu) 476 | 477 | font_menu = tk.Menu(menu_bar, tearoff=0) 478 | font_menu.add_command(label="Change Font Size", command=open_font_size_window) 479 | font_menu.add_command(label="Reset Font Size", command=reset_font_size) 480 | menu_bar.add_cascade(label="Font", menu=font_menu) 481 | 482 | theme_menu = tk.Menu(menu_bar, tearoff=0) 483 | theme_menu.add_command(label="Create New Theme", command=open_new_theme_window) 484 | theme_menu.add_separator() 485 | create_theme_menu(theme_menu) 486 | menu_bar.add_cascade(label="Themes", menu=theme_menu) 487 | 488 | # Add search menu 489 | menu_bar.add_command(label="Search Questions", command=open_search_window) 490 | 491 | help_menu = tk.Menu(menu_bar, tearoff=0) 492 | help_menu.add_command(label="About", command=lambda: messagebox.showinfo("About", "This Python application is a Questions Database Management System designed using Tkinter (for GUI) and SQLite (for database). The application facilitates managing, searching, and organizing questions and answers. Users can create questions, edit or delete them, personalize themes, change font sizes, search through database entries, and maintain a record of search history. Additionally, it features a trial functionality, requiring users to optionally activate the program after the trial period using a secure activation code. Below is a breakdown of the key features and their purpose.")) 493 | menu_bar.add_cascade(label="Help", menu=help_menu) 494 | 495 | root.config(menu=menu_bar) 496 | 497 | style = ttk.Style() 498 | style.configure("Treeview", rowheight=25) 499 | style.configure("TButton", padding=5) 500 | style.configure('theme.Treeview', background='white', foreground='black') 501 | 502 | connect_db() 503 | connect_theme_db() 504 | 505 | frame = tk.Frame(root) 506 | frame.pack(pady=10) 507 | 508 | entry_question = ttk.Entry(frame, width=30) 509 | entry_question.grid(row=2, column=1, padx=5, pady=5) 510 | ttk.Label(frame, text="Question").grid(row=2, column=0) 511 | 512 | entry_answer = ttk.Entry(frame, width=30) 513 | entry_answer.grid(row=3, column=1, padx=5, pady=5) 514 | ttk.Label(frame, text="Answer").grid(row=3, column=0) 515 | 516 | # Buttons 517 | btn_add = ttk.Button(frame, text="Add Question", command=add_question) 518 | btn_add.grid(row=4, columnspan=2, pady=5) 519 | 520 | btn_edit = ttk.Button(frame, text="Edit Question", command=edit_question) 521 | btn_edit.grid(row=5, columnspan=2, pady=5) 522 | 523 | btn_delete = ttk.Button(frame, text="Delete Question", command=delete_question) 524 | btn_delete.grid(row=6, columnspan=2, pady=5) 525 | 526 | # Questions display table 527 | tree = ttk.Treeview(root, columns=("ID", "Question", "Answer"), show='headings') 528 | tree.heading("ID", text="ID") 529 | tree.heading("Question", text="Question") 530 | tree.heading("Answer", text="Answer") 531 | tree.pack(pady=10) 532 | 533 | tree.tag_configure('default', font=("TkDefaultFont", 12)) 534 | tree.bind("<>", select_item) 535 | 536 | # Load data 537 | load_questions() 538 | 539 | # Apply the last selected theme and font size 540 | apply_last_selected_theme() 541 | connect_db() 542 | connect_theme_db() 543 | connect_num_db() 544 | connect_betf_db() 545 | create_activation_code_table() 546 | add_sample_activation_codes() 547 | enforce_access() 548 | check_and_display_welcome_message() 549 | 550 | root.mainloop() 551 | -------------------------------------------------------------------------------- /QueryHub/node_data/welcome_message.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome_message": "Welcome to the Questions Database App!" 3 | } -------------------------------------------------------------------------------- /QueryHub/package-lock.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/QueryHub/package-lock.json -------------------------------------------------------------------------------- /QueryHub/package.json: -------------------------------------------------------------------------------- 1 | 2 | 3 | { 4 | "name": "ghadaam", 5 | "version": "0.1.0", 6 | "private": true, 7 | "scripts": { 8 | "dev": "ghadaam", 9 | "start": "python main.py" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data-sync/__pycache__/database.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/__pycache__/database.cpython-312.pyc -------------------------------------------------------------------------------- /data-sync/__pycache__/database_manager.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/__pycache__/database_manager.cpython-312.pyc -------------------------------------------------------------------------------- /data-sync/__pycache__/db_utils.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/__pycache__/db_utils.cpython-312.pyc -------------------------------------------------------------------------------- /data-sync/__pycache__/question_manager.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/__pycache__/question_manager.cpython-312.pyc -------------------------------------------------------------------------------- /data-sync/__pycache__/questions.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/__pycache__/questions.cpython-312.pyc -------------------------------------------------------------------------------- /data-sync/__pycache__/theme.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/__pycache__/theme.cpython-312.pyc -------------------------------------------------------------------------------- /data-sync/__pycache__/theme_manager.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/__pycache__/theme_manager.cpython-312.pyc -------------------------------------------------------------------------------- /data-sync/__pycache__/theme_utils.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/__pycache__/theme_utils.cpython-312.pyc -------------------------------------------------------------------------------- /data-sync/__pycache__/ui.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/__pycache__/ui.cpython-312.pyc -------------------------------------------------------------------------------- /data-sync/__pycache__/ui_utils.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/__pycache__/ui_utils.cpython-312.pyc -------------------------------------------------------------------------------- /data-sync/activation_codes.txt: -------------------------------------------------------------------------------- 1 | 2068264295010989', 2 | '6700644327245944', 3 | '4801027954051862', 4 | '1931291964983723', 5 | '9139420472745769', 6 | '1659542451362215', 7 | '3502918777495317', 8 | '1312087915466331', 9 | '6185771512712065', 10 | '3542814733052272', 11 | '3077425296061596', 12 | '9640860110300355', 13 | '2976014698862916', 14 | '4360355067793132', 15 | '6792964029604520', 16 | '2640378464734004', 17 | '3934484071328489', 18 | '4963501319954853', 19 | '7422427814034640', 20 | '5236707249117145', 21 | '4811000225653252', 22 | '5790564470600057', 23 | '8714015076831104', 24 | '3937844660343968', 25 | '2862182047968323', 26 | '5682499443411918', 27 | '5832553247590544', 28 | '8878949020543012', 29 | '1726151122610377', 30 | '6594603628554838', 31 | '0749213436046324', 32 | '2827382126257072', 33 | '9377490719832399', 34 | '2227807286433116', 35 | '6300165925546957', 36 | '0186827590753102', 37 | '7669325375325529', 38 | '6070992077266583', 39 | '5216741135049312', 40 | '1438848403622704', 41 | '8178989616866570', 42 | '3472860418980857', 43 | '2035987325120720', 44 | '3266877382955421', 45 | '6173756292162446', 46 | '9815147998507047', 47 | '2414685843945260', 48 | '5183088615236623', 49 | '7035483723673560', 50 | '5519172197827858', 51 | '1523342716776997', 52 | '4990569393436443', 53 | '5508867671991473', 54 | '7580107023903399', 55 | '5119016163976681', 56 | '4705520282632398', 57 | '7271476252405838', 58 | '7241686343733563', 59 | '6266514252993720', 60 | '4486606387741646', 61 | '7959774337042225', 62 | '9242411430082619', 63 | '4634255300722198', 64 | '1230175249020791', 65 | '4533784231211964', 66 | '7306070249263620', 67 | '4288940939754730', 68 | '2835780516670434', 69 | '1430020043260527', 70 | '4361973858972710', 71 | '1456446339442578', 72 | '3277055549392278', 73 | '2775951964570563', 74 | '3018977971533520', 75 | '7605897255894071', 76 | '3507233555514740', 77 | '0722437247012627', 78 | '7620889611069184', 79 | '0400734898637345', 80 | '7632859259755781', 81 | '6297992629819321', 82 | '8092705661763101', 83 | '7982558214100779', 84 | '0644093001652575', 85 | '6201467561906528', 86 | '6519132827243926', 87 | '5961366414223479', 88 | '7345514944863443', 89 | '0130081022541768', 90 | '8327797781290812', 91 | '1038969165371004', 92 | '5319166531453600', 93 | '9631998809514079', 94 | '2568126753528613', 95 | '0747417770472939', 96 | '2313966636298017', 97 | '3235941261885297', 98 | '7598783675970692', 99 | '1397062534578543', 100 | '1667100832379830', 101 | '2002303130445090', 102 | '8331026246989627', 103 | '0730692864876961', 104 | '4186808510911691', 105 | '3510606993062593', 106 | '9279418789629232', 107 | '1771924421910159', 108 | '7771450843751739', 109 | '7929060567068438', 110 | '4791878687953006', 111 | '7988282783427858', 112 | '3706276350646181', 113 | '2558572514514605', 114 | '7300468789964085', 115 | '3831008912393917', 116 | '9000238044769424', 117 | '1553858292935695', 118 | '2369219826205346', 119 | '9150011222572459', 120 | '4697903362202012', 121 | '4361023681288622', 122 | '9855304435774189', 123 | '7589934809578869', 124 | '3450152348534312', 125 | '3823393025566527', 126 | '5491384797758999', 127 | '0881832688180709', 128 | '7861702388320524', 129 | '2856103284597560', 130 | '7943832723720285', 131 | '2024241341827536', 132 | '2429014883485971', 133 | '7237126796045539', 134 | '6176549023121167', 135 | '3892903054539292', 136 | '2775017055588462', 137 | '5878158775834464', 138 | '6656527689402079', 139 | '8215016581873058', 140 | '9041386297361173', 141 | '7494536140143483', 142 | '3521548022901548', 143 | '7259418762241589', 144 | '7650064802655344', 145 | '9739880554647293', 146 | '1058980984787575', 147 | '6070741220149756', 148 | '5081787780852238', 149 | '9744163007878868', 150 | '2484976463782808', 151 | '5180665834813756', 152 | '3619115169778062', 153 | '8090557062247996', 154 | '4569738648623588', 155 | '2315023036659379', 156 | '8184031641273743', 157 | '2423306599109699', 158 | '5789639529664624', 159 | '1793037171398983', 160 | '3082615828238926', 161 | '7678465210882505', 162 | '7941010513443451', 163 | '0000718362005481', 164 | '1414464297779243', 165 | '8144708509893880', 166 | '6208182627241329', 167 | '1934499426290633', 168 | '3573979862991574', 169 | '6495568658825020', 170 | '8841316243774807', 171 | '1338080335637951', 172 | '9867024849769179', 173 | '0032880875787711', 174 | '5935184006719933', 175 | '2921236805186255', 176 | '6978492021042215', 177 | '4814921898318955', 178 | '9986847348311770', 179 | '2443034172965748', 180 | '4287118200337441', 181 | '0818415636970893', 182 | '5269660145982652', 183 | '7031617579856590', 184 | '3876164175757077', 185 | '3604669361872547', 186 | '9290895105822450', 187 | '7997025021315496', 188 | '6028177434894341', 189 | '3459369018322025', 190 | '6247251374573748', 191 | '3551924488628305', 192 | '1351061274089304', 193 | '4382010153504801', 194 | '8372261477444128', 195 | '0450863362199454', 196 | '8010864515022018', 197 | '2622530546191906', 198 | '7756705099752693', 199 | '4611932940844254', 200 | '1095348644517664', 201 | '8047177353203629', 202 | '1746072565643423', 203 | '4500512808474511', 204 | '3682191118639796', 205 | '2149743509981022', 206 | '3628020695971953', 207 | '8707952791538087', 208 | '7861934047084716', 209 | '2741862564363234', 210 | '6774415858474941', 211 | '6311801755004313', 212 | '0763867783733873', 213 | '7636996215470051', 214 | '0807968852141648', 215 | '7339039478522128', 216 | '7229871190104987', 217 | '0718580907686698', 218 | '9815983235163266', 219 | '4736116164687122', 220 | '1689372846144493', 221 | '3468660486783354', 222 | '2810345798951462', 223 | '2124105864704927', 224 | '5819517235979306', 225 | '2433175270677685', 226 | '5435405954559939', 227 | '1600241043767865', 228 | '1464708997709699', 229 | '2238967115322260', 230 | '4829587946996558', 231 | '3253767611681866', 232 | '7554259880032546', 233 | '9165084918115835', 234 | '6124193705466262', 235 | '0735870736860317', 236 | '3327088028411928', 237 | '3153497344819176', 238 | '9380375473154637', 239 | '7638783857453325', 240 | '4213385200241808', 241 | '9409676116426051', 242 | '2728717769381126', 243 | '7161536016068017', 244 | '3326769596840064', 245 | '8090001693907482', 246 | '0213018602746132', 247 | '0063761936277896', 248 | '6755296164150740', 249 | '8778713355234046', 250 | '1621000275504348', 251 | '4882182059137726', 252 | '1970402740400579', 253 | '3173335125146055', 254 | '3878598924305771', 255 | '0858917655585900', 256 | '8423399143297894', 257 | '7323313871658828', 258 | '6246230718489260', 259 | '2632550012011880', 260 | '5474320299623631', 261 | '3169312857877331', 262 | '6001014601798480', 263 | '6617793140137003', 264 | '5572924049244166', 265 | '6184128538966847', 266 | '0983339129256468', 267 | '1559630679799376', 268 | '5533136311303869', 269 | '4568448881214169', 270 | '8804964225343636', 271 | '5881396356945427', 272 | '1651993989340795', 273 | '6948408711264456', 274 | '0761506604395325', 275 | '7835435098510758', 276 | '2815670615436634', 277 | '0297624723367993', 278 | '7281276390632470', 279 | '5061643524039770', 280 | '4518232654612358', 281 | '7926293185698699', 282 | '4017865323396852', 283 | '0499730046024813', 284 | '5512657966521028', 285 | '1760546831092295', 286 | '5098306983810843', 287 | '4944295934827815', 288 | '7373074018549504', 289 | '3162315084020521', 290 | '8639787798161412', 291 | '3547231333880125', 292 | '2851649942527230', 293 | '7360004337233854', 294 | '2971834929169515', 295 | '7700280786405953', 296 | '4150102802174640', 297 | '2685526210460649', 298 | '3032350689892937', 299 | '4441456855801069', 300 | '8972391768114522', 301 | '6754054487319128', 302 | '2245121138999316', 303 | '6250455052389552', 304 | '6015031027826429', 305 | '4037370418623888', 306 | '8059813643848459', 307 | '3171712416413613', 308 | '7141970236426590', 309 | '7080821994644748', 310 | '1591592659629070', 311 | '7590973861207920', 312 | '9638650068962881', 313 | '0149958351727958', 314 | '8013791887337792', 315 | '9655297020413185', 316 | '3322860167877239', 317 | '6178922672124497', 318 | '7548768306336037', 319 | '5760768161099712', 320 | '6861641965307677', 321 | '0010147563871419', 322 | '6655807730128613', 323 | '3370539495194293', 324 | '7166405214327875', 325 | '3458135435918734', 326 | '4444910214730061', 327 | '5482706461265832', 328 | '3657680772666321', 329 | '7351909517868316', 330 | '9925349129172148', 331 | '0986397093472369', 332 | '0271501932004974', 333 | '2244008273781993', 334 | '4961319163694748', 335 | '4524811770672876', 336 | '0238425804051014', 337 | '6093708870703465', 338 | '9425356105050199', 339 | '4992312062816362', 340 | '0152643330694606', 341 | '7766776150456033', 342 | '8236391440731133', 343 | '1410437145346092', 344 | '8243057435478608', 345 | '9136182214386753', 346 | '2134700679939935', 347 | '5167058429247165', 348 | '1185764737542595', 349 | '1303118892324098', 350 | '0266474340541279', 351 | '9400701776027546', 352 | '2681773394044116', 353 | '2596886076818701', 354 | '3836808136148289', 355 | '7055903411180257', 356 | '2745399329639169', 357 | '3779023118024841', 358 | '3461093974090640', 359 | '5230215700692897', 360 | '8861670906674551', 361 | '5377072329305653', 362 | '4499230088567390', 363 | '9871419278634889', 364 | '4365563238522246', 365 | '1275035016834689', 366 | '1019588881136770', 367 | '7252946486821581', 368 | '8691267904306274', 369 | '3296511334512721', 370 | '4155781201427339', 371 | '1099154960793802', 372 | '2773025227521617', 373 | '6985933050026522', 374 | '7572602312878402', 375 | '9023435372638727', 376 | '2351535772050540', 377 | '0443311893351726', 378 | '2177513530662829', 379 | '6199080013485854', 380 | '7799748981034068', 381 | '0988679689928390', 382 | '0778832399106167', 383 | '5318967539553514', 384 | '5194052228583730', 385 | '0964357401657369', 386 | '6818957807715451', 387 | '8705069498307371', 388 | '7224712745712305', 389 | '8045688182564805', 390 | '9636347045926031', 391 | '6729442247587754', 392 | '9375787584027134', 393 | '4184537519627215', 394 | '7839108999731813', 395 | '6185923105513719', 396 | '2425440880595996', 397 | '2112686218175918', 398 | '5644033752940425', 399 | '7558843258729695', 400 | '4822926575342343', 401 | '3383144196768830', 402 | '1903512514305668', 403 | '6397908665608072', 404 | '8293188186563771', 405 | '1270065748204028', 406 | '9319608020202526', 407 | '0602088359209060', 408 | '1409356955287035', 409 | '3839938810918025', 410 | '1580121034669206', 411 | '2849932212178020', 412 | '1873918901605701', 413 | '6831678067346644', 414 | '6636564960864751', 415 | '7925073337889351', 416 | '0751176010332245', 417 | '5349205441034178', 418 | '2526792126065209', 419 | '1108738889508410', 420 | '1041074269707456', 421 | '9634401220946002', 422 | '3712130241872383', 423 | '7926741724463051', 424 | '8740014704661119', 425 | '7340183744167837', 426 | '6623082690546690', 427 | '4933506144589836', 428 | '0577586472488185', 429 | '6265910712674345', 430 | '6061781072730268', 431 | '0759135785374455', 432 | '9004078318206352', 433 | '4850047732783720', 434 | '6214750073190512', 435 | '5394153788760113', 436 | '3884000549870067', 437 | '4198413007824646', 438 | '7579634131873154', 439 | '3686422561201234', 440 | '6930671070345199', 441 | '8111108032300026', 442 | '6590005872490280', 443 | '4645517884672249', 444 | '7928408515951972', 445 | '1329224462409703', 446 | '5367223519357368', 447 | '0320820672782722', 448 | '0450312715552021', 449 | '7592889291207934', 450 | '4986905287857032', 451 | '9927773011678608', 452 | '3962995809626999', 453 | '5623107108887831', 454 | '8022150892009261', 455 | '0926980279066692', 456 | '2422171187476852', 457 | '1220146609580886', 458 | '1625484175341852', 459 | '9557365520822358', 460 | '4164660257163443', 461 | '9766472587022166', 462 | '2351566907772020', 463 | '6683665735525999', 464 | '6642368523447886', 465 | '9593975380137259', 466 | '2237100474553829', 467 | '3584485740798646', 468 | '0780392559163149', 469 | '3494169685420283', 470 | '6757001383645752', 471 | '6975319239449672', 472 | '5457858344015121', 473 | '0859577966285520', 474 | '9771852899583690', 475 | '5599422058220818', 476 | '8679340391807879', 477 | '8003213292541439', 478 | '9254050901316130', 479 | '3493571146238653', 480 | '3938567401946037', 481 | '2624397572531374', 482 | '8919276289901729', 483 | '2667149575798857', 484 | '2672401577111158', 485 | '8962954690801514', 486 | '9557346435707166', 487 | '9295301545273350', 488 | '7453859356247368', 489 | '2756389422794730', 490 | '5224595760684097', 491 | '2413321302665177', 492 | '1052786569342966', 493 | '1947178993513842', 494 | '0607235679055958', 495 | '7406250472595073', 496 | '9794503187426587', 497 | '9702405932208909', 498 | '4651301577889508', 499 | '5652177573192535', 500 | '7044110827617028', 501 | '2566605308771012', 502 | '0029447226348573', 503 | '9272322647163702', 504 | '7040102064505003', 505 | '5142531249687134', 506 | '4849967811153560', 507 | '8026372185358538', 508 | '4255041350838194', 509 | '4150531849355892', 510 | '4383006451425481', 511 | '8215981676727832', 512 | '2109382770594295', 513 | '7437943181100394', 514 | '6343493445092327', 515 | '2984096513205157', 516 | '7825949070840721', 517 | '2515372234534546', 518 | '8615519275022907', 519 | '6423061991360237', 520 | '4190975874980778', 521 | '4789410338130759', 522 | '1574526657469439', 523 | '6144726213448971', 524 | '0495432751008897', 525 | '3924479534262814', 526 | '0745671814089820', 527 | '1264574966242180', 528 | '9254394668658646', 529 | '7630117091574354', 530 | '8963225641932672', 531 | '3497490364008738', 532 | '3113483119035434', 533 | '9394369365089096', 534 | '8141739091760058', 535 | '7568093188968166', 536 | '9622984503538379', 537 | '2260280334868709', 538 | '0675519101294806', 539 | '9239091230283096', 540 | '2832025005295562', 541 | '4706544528977665', 542 | '2054623202136773', 543 | '8058110337694049', 544 | '6070574175609050', 545 | '1348394648061520', 546 | '4224163937194982', 547 | '6227298561054548', 548 | '9469948743406655', 549 | '3840157746691888', 550 | '5719237302040939', 551 | '2777856844337441', 552 | '8817551628143369', 553 | '6358430575128197', 554 | '6106954407418503', 555 | '5520510697721288', 556 | '3568766454634505', 557 | '7078126171903534', 558 | '5416114289915957', 559 | '7369322844197891', 560 | '3094395181348282', 561 | '7638970968943629', 562 | '0279833742599165', 563 | '5474458964385840', 564 | '5956373864623474', 565 | '0278496551518803', 566 | '7225462989092456', 567 | '7449445773913462', 568 | '3947421913237789', 569 | '1962489793175713', 570 | '8284614067649740', 571 | '4422539491945934', 572 | '5906466633228950', 573 | '6955861928543560', 574 | '2640847089023173', 575 | '8485782369781752', 576 | '5745898527118904', 577 | '2922651580643881', 578 | '3191079008504556', 579 | '0471942579277565', 580 | '3570884288839764', 581 | '4354130854579161', 582 | '0194890111934619', 583 | '4451174703606158', 584 | '5666803718741246', 585 | '4931305270723534', 586 | '4104717474671731', 587 | '6615713514971012', 588 | '0940055588890658', 589 | '7041679920668021', 590 | '6602069925841815', 591 | '8279229099396657', 592 | '3894434857164753', 593 | '9339575725070482', 594 | '5764580553490059', 595 | '2134076804752296', 596 | '1943360076411390', 597 | '0502155494403106', 598 | '1350871170285721', 599 | '4778504500673888', 600 | '0922223988831781', 601 | '9458966424289226', 602 | '0341981600511053', 603 | '6113682618924045', 604 | '0421368579838309', 605 | '4165045205411709', 606 | '2537184691072090', 607 | '1708961724896256', 608 | '0150268520745621', 609 | '8542673389320822', 610 | '3739586858873920', 611 | '2242516367071766', 612 | '8908697529994633', 613 | '7536258397280284', 614 | '1455220801475144', 615 | '3820032504035157', 616 | '5735363759847314', 617 | '2623498661768873', 618 | '2559684974171722', 619 | '8197859404858312', 620 | '1769326455218585', 621 | '4633640012643952', 622 | '0458055598608163', 623 | '6816812498141487', 624 | '3932440659837561', 625 | '2843288024321665', 626 | '0487685264008517', 627 | '1737212142789897', 628 | '8419216130363010', 629 | '4239042327426817', 630 | '2147191116358021', 631 | '5796308210313210', 632 | '7028385526097154', 633 | '4668247614729713', 634 | '4427040179412054', 635 | '2649625246551357', 636 | '7836798633766876', 637 | '9936800477813886', 638 | '9480916917001053', 639 | '3860960253629292', 640 | '4470926906753735', 641 | '8125227834319195', 642 | '6769572986041345', 643 | '4855431139152443', 644 | '2095095701611659', 645 | '1344475925461711', 646 | '8562141896337523', 647 | '4202276516305292', 648 | '2690187027564983', 649 | '7071901470103795', 650 | '5953177437034296', 651 | '8180147679480165', 652 | '0230084321441794', 653 | '7460234178260397', 654 | '0374004242660432', 655 | '0136465833865655', 656 | '2581817233914586', 657 | '7189526622474044', 658 | '2853810263064009', 659 | '0766523922722637', 660 | '9538107056073030', 661 | '0521069011353228', 662 | '9137599599406072', 663 | '2834617612031180', 664 | '2810336182510854', 665 | '8516756840039459', 666 | '9986797625727337', 667 | '7247169094292034', 668 | '0751645408532388', 669 | '7110354913256129', 670 | '4660397120808645', 671 | '6571618687518524', 672 | '0910985365221963', 673 | '3593117593859792', 674 | '9648853472412441', 675 | '1974656490344920', 676 | '7912163702723310', 677 | '6280355268190851', 678 | '8844956417130206', 679 | '1843617757563447', 680 | '0312063377059377', 681 | '8995511875997549', 682 | '7143583381428045', 683 | '6717775504169396', 684 | '0734206347355773', 685 | '5209692630987886', 686 | '4438341479369931', 687 | '0431927861035127', 688 | '3176401916527253', 689 | '7090712041925162', 690 | '7437795053501213', 691 | '2286898618538370', 692 | '8839502639222310', 693 | '6591533170333729', 694 | '6820347127555117', 695 | '9828071377822171', 696 | '4110368280849179', 697 | '0523336733126283', 698 | '8847023447591516', 699 | '9040658824767148', 700 | '0052822342144552', 701 | '3792521507564187', 702 | '1615036457415297', 703 | '8182687755522941', 704 | '2404591196996812', 705 | '2047160934671260', 706 | '7029255521088137', 707 | '9900283828304710', 708 | '1383690339426344', 709 | '1320062599840306', 710 | '0179646813308149', 711 | '3138976377844098', 712 | '8995441934218984', 713 | '3043481778053465', 714 | '1854328870906593', 715 | '2904391443209659', 716 | '7967738566542936', 717 | '8925849865026212', 718 | '3501852940348174', 719 | '7297308840689768', 720 | '0572566720609566', 721 | '9954153958674256', 722 | '0713823236233922', 723 | '9803196905997431', 724 | '9377582787362659', 725 | '3147033944073536', 726 | '4230575288810228', 727 | '6003360808082255', 728 | '0185111320220940', 729 | '0539845996541847', 730 | '6202107538444837', 731 | '3737000586645042', 732 | '2629558449777233', 733 | '9623672874635573', 734 | '4238315407857461', 735 | '0432972246729825', 736 | '9843283543004135', 737 | '1165760116491913', 738 | '2359600836890310', 739 | '4381213709011554', 740 | '7472662101717661', 741 | '2427852986578699', 742 | '6725465946335638', 743 | '8056157660139348', 744 | '7442827109507640', 745 | '5821594499139590', 746 | '2397486674801295', 747 | '2863641617682425', 748 | '6331900194101941', 749 | '5627987771123631', 750 | '0048445532093557', 751 | '5404770376660244', 752 | '8305814087273678', 753 | '6951578964524426', 754 | '4330219719371009', 755 | '0355695529195487', 756 | '5617409756066541', 757 | '3536241629786175', 758 | '5767453756951870', 759 | '1967153505555497', 760 | '6454547722082893', 761 | '6039556643717872', 762 | '5555856730203139', 763 | '0368947697288219', 764 | '1407536907301302', 765 | '3106727997040864', 766 | '9232021573493376', 767 | '2586745193381911', 768 | '5450327568386668', 769 | '9668952963144530', 770 | '3996243835553278', 771 | '2406729507344997', 772 | '0794973626647840', 773 | '4924344558015761', 774 | '2568691773974242', 775 | '9813146786217554', 776 | '9348518524487180', 777 | '1445809689071949', 778 | '4098979878209173', 779 | '1816631975383061', 780 | '7715214441210237', 781 | '8778036976827867', 782 | '3967679304314973', 783 | '3954527218002896', 784 | '4693854082867233', 785 | '6684517949435662', 786 | '8735818902352162', 787 | '1522960033673795', 788 | '0280879067549607', 789 | '3508797344222391', 790 | '2153757997409993', 791 | '4108648032443849', 792 | '4656181654719682', 793 | '2750953354233736', 794 | '8266914654420406', 795 | '2456463858370026', 796 | '7588249796352784', 797 | '7425773565216401', 798 | '3367513343681890', 799 | '6692965594758934', 800 | '2875254295492178', 801 | '8150156262504964', 802 | '2015898664005309', 803 | '7224628365657405', 804 | '5664179955822922', 805 | '1591832515419301', 806 | '3050092735881306', 807 | '4308167302336629', 808 | '3718668506452216', 809 | '4719363782888176', 810 | '8598094181280428', 811 | '1505141128686317', 812 | '5277806846316598', 813 | '4090893798188929', 814 | '9643287716585790', 815 | '8010388719952918', 816 | '0733657819777010', 817 | '2615016300569300', 818 | '8866856665270621', 819 | '4415705632982420', 820 | '7168929086337662', 821 | '3438580312726303', 822 | '9987919168389738', 823 | '9457912469577008', 824 | '4102769888503845', 825 | '3819415028645113', 826 | '4272479091311084', 827 | '7845622780363639', 828 | '2149864449704718', 829 | '6215449337209632', 830 | '0651051140818451', 831 | '3810975986700616', 832 | '9170647245276254', 833 | '7944941194199230', 834 | '5877240675349414', 835 | '0615138180835690', 836 | '1914071900479786', 837 | '8432308310913240', 838 | '1164737048944670', 839 | '1576128121738093', 840 | '8654085211002410', 841 | '9331480153005413', 842 | '2087771303679879', 843 | '2020968046337830', 844 | '9948875442788557', 845 | '3759420294664467', 846 | '1814562397030523', 847 | '1078879299357418', 848 | '4961367668387522', 849 | '5043030349496613', 850 | '6906377926047608', 851 | '4770585693438606', 852 | '4738526861761667', 853 | '0352828819858599', 854 | '3643623298751960', 855 | '3558289847800175', 856 | '1529706252628128', 857 | '0649629559102844', 858 | '5409955500402043', 859 | '1157031620739508', 860 | '0247732831702520', 861 | '7914820807980850', 862 | '8070771305678150', 863 | '3551955048156582', 864 | '0976016284341990', 865 | '1781123488110697', 866 | '7368041354395128', 867 | '0822278979838988', 868 | '8998976772181621', 869 | '5976780946521109', 870 | '3246536021801726', 871 | '3325113066571668', 872 | '4362508120482458', 873 | '8751928961364253', 874 | '2206675035039101', 875 | '4657801818196514', 876 | '2303295999125222', 877 | '8514700722967250', 878 | '5082227870451696', 879 | '9623286074810986', 880 | '0162567101414935', 881 | '1160292039496139', 882 | '2473229393899826', 883 | '1997993809092640', 884 | '3299194009062927', 885 | '8396057485096553', 886 | '4056908672021204', 887 | '9237014950484366', 888 | '3281213631753782', 889 | '2537313224223795', 890 | '5619672920262539', 891 | '8242949769759528', 892 | '9039351144925743', 893 | '2747156371297770', 894 | '3770297933309602', 895 | '2633145296687107', 896 | '9893701135641913', 897 | '4938145394271392', 898 | '3353989136795408', 899 | '7074109965628342', 900 | '8868113709063742', 901 | '1687457974869537', 902 | '1882818267749691', 903 | '5261575243639645', 904 | '0398822395721580', 905 | '0238348063570368', 906 | '4745756947628748', 907 | '3085481274366376', 908 | '8252608583421255', 909 | '3377148958119499', 910 | '0031673195956046', 911 | '7461705813895858', 912 | '7704329463695049', 913 | '5293971082794773', 914 | '2139283241766235', 915 | '7909367032929226', 916 | '6234750902249482', 917 | '1447836056637130', 918 | '4079106710793719', 919 | '4850015313537575', 920 | '8896527386063345', 921 | '7030731916861996', 922 | '2775193126853852', 923 | '3740210542463534', 924 | '7856875119066692', 925 | '2121419063459679', 926 | '4770205781139991', 927 | '9052905251295342', 928 | '8229846865163765', 929 | '2188807134941705', 930 | '6683563639869046', 931 | '4293502310398004', 932 | '1347601161428953', 933 | '5463075330301665', 934 | '0595727781914571', 935 | '3047402696693143', 936 | '3789044089588725', 937 | '0175322854740577', 938 | '8536162122739019', 939 | '3043423392131530', 940 | '6086393102473153', 941 | '7728991875327446', 942 | '4827802391869256', 943 | '8134050401403797', 944 | '0431615564495445', 945 | '5840349255671461', 946 | '8009131654558666', 947 | '2907597318718657', 948 | '9650297074720404', 949 | '3994810818646766', 950 | '9305025021578329', 951 | '6865048142554032', 952 | '6648540789638421', 953 | '9899099370193594', 954 | '6454362811616099', 955 | '0766374176927528', 956 | '2126420886846818', 957 | '1358507230981125', 958 | '0594803460978989', 959 | '0549652267485904', 960 | '3473469105113219', 961 | '7778416777069416', 962 | '6547612292883019', 963 | '0754709454200482', 964 | '2596333371932476', 965 | '5271817823526795', 966 | '1281065866352024', 967 | '6145369418065181', 968 | '0981793446965717', 969 | '6535748068171934', 970 | '8193316148984998', 971 | '1159518011861223', 972 | '8010486939245103', 973 | '8070822195976670', 974 | '2001769326961153', 975 | '4867879904827526', 976 | '8151639729777842', 977 | '2853885170496228', 978 | '8232970981858000', 979 | '4546895533624934', 980 | '6897410219298341', 981 | '2035418025284958', 982 | '1403502392193466', 983 | '7561499466916475', 984 | '9756440109463020', 985 | '5955160489640575', 986 | '6627661477078908', 987 | '2942221539267544', 988 | '3780340360635683', 989 | '3550628787070363', 990 | '3531229651830219', 991 | '3631236539899094', 992 | '0348886221307215', 993 | '9653515515968410', 994 | '8990695131001962', 995 | '8975550313872282', 996 | '6857859935670079', 997 | '0623195123208447', 998 | '9430181588644395', 999 | '7673213818692388', 1000 | '5454470855524120', 1001 | '6879418205226642', 1002 | '0194462910618744', 1003 | '1135973074401066', 1004 | '4014840060034814', 1005 | '4376832718431609', 1006 | '6310287707859192', 1007 | '4458448249598422', 1008 | '1542922919420677', 1009 | '6305323232678336', 1010 | '6594625348663828', 1011 | '9429865007270486', 1012 | '1486306674186768', 1013 | '0247970164809504', 1014 | '8769982152770724', 1015 | '2385488980572470', 1016 | '5682212354501587', 1017 | '2409144900418403', 1018 | '2593985858289647', 1019 | '8463910306687004', 1020 | '1207913300007707', 1021 | '2100084810851069', 1022 | '1843585372666150', 1023 | '8656850260182836', 1024 | '6033383828187046', 1025 | '8767931231581429', 1026 | '4182128851866828', 1027 | '0493235862650604', 1028 | '7436199495283486', 1029 | '0086387074030067', 1030 | '4464419890419731', 1031 | '7276444425346663', 1032 | '1335679556619751', 1033 | '6210440239631794', 1034 | '3158896054553607', 1035 | '7353074565128514', 1036 | '7250568919149788', 1037 | '0816556967054558', 1038 | '0479568476535378', 1039 | '9126608955411249', 1040 | '7066169799306824', 1041 | '8381470379465849', 1042 | '7904181502663712', 1043 | '6908482509947812', 1044 | '6621585621904858', 1045 | '1021411004115256', 1046 | '5366531615283303', 1047 | '3291803378517136', 1048 | '1352577337975584', 1049 | '5710519464958037', 1050 | '9015366717179895', 1051 | '2954933603797194', 1052 | '7067483711967389', 1053 | '3352572016299666', 1054 | '3489536159352606', 1055 | '4763168757962772', 1056 | '9764740558703208', 1057 | '7077949204261033', 1058 | '3412185111912088', 1059 | '3124617380402235', 1060 | '8995694472330304', 1061 | '9105058422332470', 1062 | '2095981810157093', 1063 | '4859183262040496', 1064 | '8588128753329053', 1065 | '5263065588812893', 1066 | '0828201845253632', 1067 | '7460688380278740', 1068 | '8603132816250154', 1069 | '0452766783569826', 1070 | '2220531960496670', 1071 | '6683250051216402', 1072 | '3064220035453197', 1073 | '1795361866798572', 1074 | '3139474917782405', 1075 | '0095777036358725', 1076 | '1714358152552765', 1077 | '3335191842840517', 1078 | '1424736591891394', 1079 | '5710518856423161', 1080 | '4425658274608735', 1081 | '8209650244675365', 1082 | '6251143435828877', 1083 | '6379658589496971', 1084 | '7054493543062823', 1085 | '1049650294138416', 1086 | '5767211123060995', 1087 | '3704437586496493', 1088 | '4874067239059137', 1089 | '4538854997966202', 1090 | '0278588171017405', 1091 | '4538547027648647', 1092 | '6407086929962665', 1093 | '2715309867020463', 1094 | '5724420011454358', 1095 | '2214611817748698', 1096 | '2078671250867365', 1097 | '0091718950366970', 1098 | '2271288484230896', 1099 | '0570004287634598', 1100 | '6104012238319063', 1101 | '0359469268497988', 1102 | '7328784844922378', 1103 | '1572115881560426', 1104 | '4096806392157146', 1105 | '5427471360246281', 1106 | '8262270980042237', 1107 | '1962136248170243', 1108 | '1725467198299837', 1109 | '2303826084419971', 1110 | '9300291621498263', 1111 | '1611862332629611', 1112 | '6527206836006961', 1113 | '3474099810493105', 1114 | '2371975032459250', 1115 | '1076971944283529', 1116 | '2922752335796903', 1117 | '2424727119283879', 1118 | '1051331650947265', 1119 | '4020629764014977', 1120 | '5252375547727893', 1121 | '1372099797807141', 1122 | '7896058803833231', 1123 | '2216031659973159', 1124 | '1243991014075939', 1125 | '2066487221010673', 1126 | '5756124977037502', 1127 | '8747382795290278', 1128 | '7956158748674122', 1129 | '1597215261425103', 1130 | '0682506436385203', 1131 | '0189956166530242', 1132 | '3774379333763608', 1133 | '9897906498579679', 1134 | '4771368259660860', 1135 | '6958083661141027', 1136 | '5198944634242083', 1137 | '6338742952887643', 1138 | '7502836196938163', 1139 | '6327767526071242', 1140 | '6866361978825555', 1141 | '6481089099547184', 1142 | '2561474616712292', 1143 | '7454699201680370', 1144 | '5657221688601869', 1145 | '7751586826486902', 1146 | '5155757543168782', 1147 | '5993526218400335', 1148 | '5976323718726818', 1149 | '1827438944489330', 1150 | '3586130273396244', 1151 | '7206460301903211', 1152 | '6093676872314160', 1153 | '4175063394196190', 1154 | '3157072633604437', 1155 | '9192919824741343', 1156 | '5211289389621081', 1157 | '3578545418327259', 1158 | '6774421978740436', 1159 | '7299446727612717', 1160 | '4119699501724572', 1161 | '5849281635433602', 1162 | '8820689374670741', 1163 | '9378171900390451', 1164 | '2616294002658513', 1165 | '8949911286000752', 1166 | '1070694115909165', 1167 | '8067976403868380', 1168 | '2616284887707574', 1169 | '0005437453030657', 1170 | '5579937964495462', 1171 | '1057065757594923', 1172 | '2503847062667408', 1173 | '6055538574243118', 1174 | '3293036765187391', 1175 | '0311193357263346', 1176 | '8424983359790524', 1177 | '8285671310099070', 1178 | '7327047763172958', 1179 | '5540566937732351', 1180 | '9914163925264103', 1181 | '7131276760850845', 1182 | '5650607935948230', 1183 | '7928252227186067', 1184 | '2713540792043238', 1185 | '9476389508539617', 1186 | '0747547510988213', 1187 | '0039440381912819', 1188 | '1428111264672762', 1189 | '6097059614970958', 1190 | '6617383875520966', 1191 | '2011565215529930', 1192 | '3849869135978689', 1193 | '7915311585362148', 1194 | '6714743622286766', 1195 | '8725277307310040', 1196 | '6736961059909655', 1197 | '5152765286263253', 1198 | '9259355190053066', 1199 | '4327051597148268', 1200 | '8336948945151343', 1201 | '0458407546346789', 1202 | '7530077305697306', 1203 | '7128539340288734', 1204 | '9757843770222916', 1205 | '5061951711802280', 1206 | '6852701302519619', 1207 | '7951855872693903', 1208 | '0604919926480910', 1209 | '3080382394967836', 1210 | '4089857629739263', 1211 | '8615947162098710', 1212 | '5831508063114965', 1213 | '2028314586135544', 1214 | '0211937698477595', 1215 | '7103113073095863', 1216 | '7750701838823771', 1217 | '4908030670924602', 1218 | '0011955492037425', 1219 | '7791721745751711', 1220 | '7998719329732054', 1221 | '3257655536815064', 1222 | '5017659314690401', 1223 | '7699250361037299', 1224 | '5336575336028026', 1225 | '3683383416470442', 1226 | '9108562601043714', 1227 | '5151892063135934', 1228 | '3394794862831762', 1229 | '6558692392055028', 1230 | '5690529385762372', 1231 | '0308280007382349', 1232 | '3961188413540183', 1233 | '8794545896480301', 1234 | '1878481252793923', 1235 | '7721621678340365', 1236 | '6406773873371058', 1237 | '0539675796199185', 1238 | '3714514557684541', 1239 | '6090474380068218', 1240 | '0750867693472717', 1241 | '9517022106370535', 1242 | '7705123490034312', 1243 | '8078882265578831', 1244 | '3130717712422167', 1245 | '5144529562052345', 1246 | '6103610754240687', 1247 | '3384616396419295', 1248 | '2866380404282919', 1249 | '0379781930010870', 1250 | '5033741246518183', 1251 | '6828573358185205', 1252 | '5607959105157131', 1253 | '2779480192083468', 1254 | '4353762231834905', 1255 | '7787329637028628', 1256 | '5673600973349459', 1257 | '1805938445471147', 1258 | '7426715102347888', 1259 | '0423449631778351', 1260 | '0715791113183806', 1261 | '5936294141621987', 1262 | '0289015133997301', 1263 | '9374123980201888', 1264 | '5621684909942354', 1265 | '4199282894351153', 1266 | '7042665013861336', 1267 | '7597571547685307', 1268 | '4773056240106765', 1269 | '0534784438799234', 1270 | '4424802369624095', 1271 | '1888116197839669', 1272 | '0101412045452868', 1273 | '2470052144361521', 1274 | '1676709272668117', 1275 | '2254020680854678', 1276 | '7161581020237843', 1277 | '4489138215465176', 1278 | '6660545512956369', 1279 | '9088952841791617', 1280 | '0615060739932412', 1281 | '2247666462292140', 1282 | '6781278875550164', 1283 | '8730335800216377', 1284 | '3696870274893022', 1285 | '4014428563333534', 1286 | '4041614518385522', 1287 | '1261138962295826', 1288 | '8223543164504301', 1289 | '4328631140109444', 1290 | '4486946829987698', 1291 | '1318225010215367', 1292 | '2514148334265880', 1293 | '9125289186742857', 1294 | '6435531231413538', 1295 | '9243148225517285', 1296 | '6524251190155848', 1297 | '2253987855597204', 1298 | '6746079019532483', 1299 | '6699644260712160', 1300 | '2679834090691371', 1301 | '6606397799961742', 1302 | '8010143541060893', 1303 | '2045754397255893', 1304 | '9147837139481632', 1305 | '0399411711048293', 1306 | '4521497837112573', 1307 | '8788885786922001', 1308 | '0941628387977320', 1309 | '7152547633203545', 1310 | '9318558574512109', 1311 | '2066290274991258', 1312 | '1550513151915670', 1313 | '2409968139995693', 1314 | '9703178053963268', 1315 | '2350010868339517', 1316 | '1157765690699059', 1317 | '1655252068245987', 1318 | '0799471430199569', 1319 | '5560446929970620', 1320 | '9357355668369138', 1321 | '5343308475274947', 1322 | '2040086651602315', 1323 | '8802292595913623', 1324 | '9259516755471733', 1325 | '8207096826359094', 1326 | '4386023615327889', 1327 | '6499441528721537', 1328 | '9395535789129476', 1329 | '0881930500414329', 1330 | '2094706331528629', 1331 | '8940534141994276', 1332 | '0968102901186787', 1333 | '5939281138045367', 1334 | '6531330065530640', 1335 | '9020520899613860', 1336 | '2200035782012450', 1337 | '8450012745004003', 1338 | '6210949991850635', 1339 | '8492551748605298', 1340 | '0167904702182994', 1341 | '1417485851985479', 1342 | '7786036891656222', 1343 | '7074801899163593', 1344 | '8530884097192892', 1345 | '7360461066869237', 1346 | '1373504217682439', 1347 | '6708728190024032', 1348 | '6280129884766823', 1349 | '7015594105631534', 1350 | '4356270464754646', 1351 | '4373442238037692', 1352 | '9497299131861081', 1353 | '2706446679261029', 1354 | '6390631902690670', 1355 | '7510321705926984', 1356 | '3430566014404311', 1357 | '1554167376647457', 1358 | '0561419755510300', 1359 | '4235603694754215', 1360 | '8043360018087250', 1361 | '5522423837896638', 1362 | '0300618020442913', 1363 | '1100742171758137', 1364 | '2756625583340357', 1365 | '3470526642849565', 1366 | '7689701943923241', 1367 | '5999424207784226', 1368 | '7947478120824400', 1369 | '7177294698998923', 1370 | '0409664531818118', 1371 | '9709271314930548', 1372 | '1183343182603933', 1373 | '8327814030911522', 1374 | '7200049150356620', 1375 | '1684971840217988', 1376 | '6808805243107274', 1377 | '3941848159781004', 1378 | '0014297489877934', 1379 | '8588724044229130', 1380 | '7255581487909506', 1381 | '9930154296979958', 1382 | '7632497683109791', 1383 | '4183675414337261', 1384 | '6287389343796079', 1385 | '7797984494476658', 1386 | '8361461864880414', 1387 | '7784765054387337', 1388 | '2054066803579741', 1389 | '0044805181727343', 1390 | '1855003278218946', 1391 | '5719071388941307', 1392 | '6786885011409430', 1393 | '0537288702922786', 1394 | '1071297149919079', 1395 | '1881473599212019', 1396 | '0253565647772549', 1397 | '4467774248799660', 1398 | '6512753229172889', 1399 | '6568015723044080', 1400 | '5261792578823000', 1401 | '8372712358149283', 1402 | '6112611324521471', 1403 | '0965316292630026', 1404 | '5769927463112989', 1405 | '7842166411716918', 1406 | '8376719830533467', 1407 | '7352228122704300', 1408 | '7233178714593580', 1409 | '6704554729511485', 1410 | '0655902289279444', 1411 | '6692735280448201', 1412 | '4511686034008736', 1413 | '7216024449643125', 1414 | '3696926791583089', 1415 | '1229350243814183', 1416 | '1571618958537192', 1417 | '9957516246351597', 1418 | '8611306516545823', 1419 | '0196654299345271', 1420 | '1642770730825802', 1421 | '9324068887052215', 1422 | '3660768657189831', 1423 | '5611945898848150', 1424 | '2730911076944305', 1425 | '7792061490161839', 1426 | '8215386941972812', 1427 | '3209653966690287', 1428 | '5024132749584683', 1429 | '6813848361266097', 1430 | '0431979916370374', 1431 | '3342758509675412', 1432 | '2462222085576634', 1433 | '0937882205374192', 1434 | '6075465923692838', 1435 | '2649765648786532', 1436 | '7376917966678237', 1437 | '5382902858890810', 1438 | '2890918466510650', 1439 | '8707778698876813', 1440 | '4418804568871453', 1441 | '4604192230834831', 1442 | '9147836019087701', 1443 | '1539210951336148', 1444 | '9028693270863469', 1445 | '1794232744776209', 1446 | '7592119866415866', 1447 | '9531789776718529', 1448 | '3090782031586684', 1449 | '2693577311244640', 1450 | '3430182952472018', 1451 | '5807102287500689', 1452 | '5692075346277865', 1453 | '5390550480429546', 1454 | '4636244844007396', 1455 | '4168095572456193', 1456 | '3121147145486921', 1457 | '4741883661294033', 1458 | '2625831156631173', 1459 | '1791934972162903', 1460 | '8396406705110849', 1461 | '1447759291633332', 1462 | '9419838224200303', 1463 | '9939576732380448', 1464 | '3114775467433484', 1465 | '8176411822744503', 1466 | '5359700970898870', 1467 | '5520437799514243', 1468 | '1748623454530528', 1469 | '7685090622241288', 1470 | '8574594792026128', 1471 | '9983333753507587', 1472 | '2198016323563113', 1473 | '7479034433773739', 1474 | '2457373139379551', 1475 | '7174265070026691', 1476 | '0956244432703998', 1477 | '4109248834427740', 1478 | '0411813880847101', 1479 | '1757622340236412', 1480 | '5150785778331662', 1481 | '6334482637560497', 1482 | '4367132584704118', 1483 | '2787494649421904', 1484 | '5266961229524486', 1485 | '6130189202670645', 1486 | '0797965702467047', 1487 | '0286929619101127', 1488 | '8704266123396227', 1489 | '1505944095933268', 1490 | '1684533042323876', 1491 | '1752338106665818', 1492 | '6068483121943958', 1493 | '5447193191581260', 1494 | '0860851426401099', 1495 | '4627917773422730', 1496 | '8916404737858678', 1497 | '4152180103160362', 1498 | '4621832826797453', 1499 | '0120401426875272', 1500 | '2906162704327390', 1501 | '2899878675000945', 1502 | '3959062527844929', 1503 | '2774894784927872', 1504 | '2010418966623669', 1505 | '6065299891012637', 1506 | '1850445640884868', 1507 | '3221334917559448', 1508 | '2082242214732799', 1509 | '4991089947668929', 1510 | '9435380088184998', 1511 | '9040013234569191', 1512 | '8741142791423057', 1513 | '5669672234550442', 1514 | '4512933510715064', 1515 | '1128325028292765', 1516 | '5123962669717281', 1517 | '5461902145649020', 1518 | '8681555386950921', 1519 | '1976375415573939', 1520 | '5011329233107623', 1521 | '6341270635490524', 1522 | '1295412232730130', 1523 | '6117212053294263', 1524 | '2098032138763600', 1525 | '5215958355478034', 1526 | '0352397979311383', 1527 | '0025186943627862', 1528 | '5003148393523020', 1529 | '6149132142099025', 1530 | '5684992448626469', 1531 | '9826625184290711', 1532 | '7245230131655178', 1533 | '2596879008868700', 1534 | '0373219371114441', 1535 | '2261757582331586', 1536 | '8406216650510700', 1537 | '7271096274236961', 1538 | '0972954565696711', 1539 | '1570513124545062', 1540 | '9797231561877907', 1541 | '6018687159136661', 1542 | '8966715009412342', 1543 | '5981120708226527', 1544 | '1073856820597883', 1545 | '4997799290216633', 1546 | '8464737757272258', 1547 | '0457115415042631', 1548 | '3525764815815556', 1549 | '4904576846817230', 1550 | '3183430492828310', 1551 | '5928795117388796', 1552 | '9288139152112658', 1553 | '2366848459824591', 1554 | '7213241494114919', 1555 | '2997711382893574', 1556 | '8753466592486510', 1557 | '7937981310785150', 1558 | '1459495590171727', 1559 | '8623936816163797', 1560 | '3826011744747711', 1561 | '0088979091002598', 1562 | '8560586108790448', 1563 | '5200534057717602', 1564 | '2251615688311972', 1565 | '7355676812047008', 1566 | '3093962632714317', 1567 | '3559299023997588', 1568 | '8539659393273658', 1569 | '7593600400926543', 1570 | '2196202379269086', 1571 | '3870990422251292', 1572 | '7090362879366678', 1573 | '1914252491976326', 1574 | '7004414948970232', 1575 | '4032330324846583', 1576 | '3833928394323957', 1577 | '7274780104592447', 1578 | '8172850973588130', 1579 | '9484481125846751', 1580 | '3286564660085906', 1581 | '4605730282122426', 1582 | '0393282836111196', 1583 | '7413352256466082', 1584 | '8209760510844881', 1585 | '8392646136413842', 1586 | '2766794396076035', 1587 | '5050876017963444', 1588 | '0685683605125246', 1589 | '7438528704321063', 1590 | '7906793017318534', 1591 | '2142051316536541', 1592 | '0492232162257635', 1593 | '2164148827406125', 1594 | '2052463638260866', 1595 | '2878981575796745', 1596 | '5363974520798711', 1597 | '3800183799373038', 1598 | '4234214631885445', 1599 | '9032159478736926', 1600 | '9809444418515197', 1601 | '0318151636171452', 1602 | '7419044091526042', 1603 | '0523755998220273', 1604 | '8674806782365285', 1605 | '0999140101220077', 1606 | '1737152157538027', 1607 | '5486981734558597', 1608 | '7614690945815035', 1609 | '0843573105404132', 1610 | '9704771101500339', 1611 | '7972879046261768', 1612 | '2048829622368481', 1613 | '3715326849249865', 1614 | '0404742104839205', 1615 | '7668147753563863', 1616 | '2537048730829212', 1617 | '7183367316657906', 1618 | '4041018879519566', 1619 | '1009908691556896', 1620 | '6619517769799047', 1621 | '5791507594985416', 1622 | '8649679145101054', 1623 | '1834628572959544', 1624 | '0624473420526889', 1625 | '8563355470902574', 1626 | '7303977245347511', 1627 | '2096061824457960', 1628 | '4819883043878522', 1629 | '8691724009933749', 1630 | '2394031451876552', 1631 | '0720602046033649', 1632 | '4542639277128433', 1633 | '1668231482456679', 1634 | '8494624116818973', 1635 | '3158173461523894', 1636 | '1480293583628765', 1637 | '6452830809896574', 1638 | '8704431834072214', 1639 | '8862219997396463', 1640 | '8158540584697204', 1641 | '7311184142213831', 1642 | '5206425588096981', 1643 | '4852096686369875', 1644 | '9771313824675729', 1645 | '2743431355813675', 1646 | '1282259384199303', 1647 | '9482705262398682', 1648 | '4778823891439601', 1649 | '6707150102113558', 1650 | '7129247387019366', 1651 | '5713041213005178', 1652 | '5271462683545455', 1653 | '5826712128685709', 1654 | '2490859180156202', 1655 | '5536945178377952', 1656 | '0992536657479584', 1657 | '7032646402933184', 1658 | '7576810024727122', 1659 | '5877487179252577', 1660 | '6762069702708954', 1661 | '5475163086028906', 1662 | '9309727967562458', 1663 | '3414963828525930', 1664 | '4435352810272820', 1665 | '0944831344415649', 1666 | '1528195324675322', 1667 | '4803494120736191', 1668 | '1586305354693902', 1669 | '3929463557573318', 1670 | '1414061579784030', 1671 | '6087932387577783', 1672 | '1987283873700298', 1673 | '5868315255392845', 1674 | '7637555930042972', 1675 | '5317875239522238', 1676 | '5342792530606919', 1677 | '6878473105445217', 1678 | '7798691507655460', 1679 | '2064314632881306', 1680 | '2311960705218601', 1681 | '1134465418196565', 1682 | '1228740594995534', 1683 | '1226929286128256', 1684 | '1984939384013052', 1685 | '6715063688429615', 1686 | '0917967320403359', 1687 | '7541858809090203', 1688 | '7332469524571494', 1689 | '2261332526956495', 1690 | '3835233895312984', 1691 | '9339241697396008', 1692 | '3442251118676092', 1693 | '6605739984083677', 1694 | '5779817520439904', 1695 | '7544621386149207', 1696 | '3213604745428479', 1697 | '6471192651783379', 1698 | '1402189917065390', 1699 | '6830666809414206', 1700 | '6467941546650585', 1701 | '9537450965266687', 1702 | '4806754827243462', 1703 | '5120213740581423', 1704 | '2418784975618451', 1705 | '4896487074275794', 1706 | '0530381736119540', 1707 | '6208854684047022', 1708 | '6966618031341655', 1709 | '1655028621768509', 1710 | '2005902727858093', 1711 | '9564653496092112', 1712 | '8345360612833701', 1713 | '2957706605877573', 1714 | '6651994600997403', 1715 | '2637017940099351', 1716 | '6802782344736767', 1717 | '4141616671821905', 1718 | '5446899792055199', 1719 | '9116028326819577', 1720 | '3358036403396482', 1721 | '3598516367746145', 1722 | '3461716167624090', 1723 | '8748389681829282', 1724 | '1059454956013411', 1725 | '6390389831007169', 1726 | '1660225948597151', 1727 | '0510907982372623', 1728 | '9219276130489424', 1729 | '7566901990366379', 1730 | '2852357333338504', 1731 | '2897148573068299', 1732 | '3167483389756472', 1733 | '8698898151534409', 1734 | '2769065553916085', 1735 | '2860144591545363', 1736 | '7798205614697178', 1737 | '2479890192449518', 1738 | '3412274370177870', 1739 | '2852643443462513', 1740 | '2222101774948399', 1741 | '1088672514832202', 1742 | '2245922740510471', 1743 | '0320905735992943', 1744 | '5772941735963969', 1745 | '6864889965411431', 1746 | '7402935738066562', 1747 | '5017907681361117', 1748 | '8030463996206734', 1749 | '9377531831331068', 1750 | '2341248622427315', 1751 | '4183009203806907', 1752 | '1557943170657490', 1753 | '5057357915214508', 1754 | '5178913487509111', 1755 | '6296388325235177', 1756 | '3512617970124961', 1757 | '4221536930754705', 1758 | '3700778416320455', 1759 | '9069207508482819', 1760 | '6412514901729986', 1761 | '1016293419492343', 1762 | '7912097144306653', 1763 | '0379558555674721', 1764 | '0708239731160876', 1765 | '2250660714176797', 1766 | '0169698259102718', 1767 | '6522411661694333', 1768 | '2158775723657939', 1769 | '7419184846930240', 1770 | '9475183583873276', 1771 | '3530077020575380', 1772 | '5588099674267147', 1773 | '0241750859407306', 1774 | '0135946857293356', 1775 | '6294822244793316', 1776 | '0168867463778514', 1777 | '0710883009094489', 1778 | '5622020048988404', 1779 | '0053263489199347', 1780 | '3712439561685283', 1781 | '5839744788015955', 1782 | '0756458843619402', 1783 | '9471942658842261', 1784 | '9419481240701237', 1785 | '4087789927355459', 1786 | '0603671761449523', 1787 | '6372868743458400', 1788 | '2501787752876664', 1789 | '8297134163878505', 1790 | '7423854753302194', 1791 | '3379762232476006', 1792 | '7782512558958336', 1793 | '6428204272877808', 1794 | '6807441597239933', 1795 | '2459417448070858', 1796 | '1473620539844507', 1797 | '6483205545530619', 1798 | '8531094226498872', 1799 | '8191135630224295', 1800 | '5213261980185360', 1801 | '0751337325823352', 1802 | '4610996384118967', 1803 | '5977365804135929', 1804 | '9007045816426531', 1805 | '4255599129007159', 1806 | '7921448957580829', 1807 | '7312302115091346', 1808 | '8521235564066187', 1809 | '7091828760727260', 1810 | '5674681273277646', 1811 | '3684640223197760', 1812 | '7095565143519582', 1813 | '1494544311539823', 1814 | '6312047012492623', 1815 | '8510126275921542', 1816 | '6647272496020579', 1817 | '0306679106742918', 1818 | '7521104524366562', 1819 | '0806484108511782', 1820 | '7341342676113031', 1821 | '6641310414158767', 1822 | '3390880181163861', 1823 | '3532502603479013', 1824 | '1679722953515121', 1825 | '0839535014149302', 1826 | '1503908558984878', 1827 | '5892735959100918', 1828 | '8024490618095444', 1829 | '1471536204979344', 1830 | '6757114527648341', 1831 | '8932169247090026', 1832 | '9152199525330674', 1833 | '2775737340268030', 1834 | '9421928194069690', 1835 | '2543994832999139', 1836 | '2114472073992819', 1837 | '8107241420422193', 1838 | '3828967722864378', 1839 | '3566449546295792', 1840 | '7804577622164349', 1841 | '0368053517293352', 1842 | '2673360228910046', 1843 | '9808121121790827', 1844 | '3558697182476449', 1845 | '4349729376239435', 1846 | '0433963161999124', 1847 | '7574584806235201', 1848 | '5711198560962385', 1849 | '9832637456970477', 1850 | '1818997166628859', 1851 | '0437704147981172', 1852 | '7212737207482491', 1853 | '0870181947290566', 1854 | '6428171888827018', 1855 | '2780698364736156', 1856 | '3470172568961225', 1857 | '9977949610326328', 1858 | '2934266480693077', 1859 | '7853820616103342', 1860 | '7194432687935863', 1861 | '2721637212615884', 1862 | '0870064636417801', 1863 | '8285719668655843', 1864 | '9918831586996301', 1865 | '8817534353888438', 1866 | '5055533583299589', 1867 | '3877748068708103', 1868 | '0670080185568176', 1869 | '7395977513327183', 1870 | '8580990334820167', 1871 | '9569673608953221', 1872 | '3245979331190205', 1873 | '5137965470680627', 1874 | '0404847850274046', 1875 | '4813693994316151', 1876 | '9117493761136362', 1877 | '2863319748353923', 1878 | '1770086687473807', 1879 | '9884953686292162', 1880 | '4310811666525120', 1881 | '7581166316077014', 1882 | '5839597089545162', 1883 | '3132167628641414', 1884 | '4510657368002634', 1885 | '0120908088294999', 1886 | '5659164206467663', 1887 | '6547888744871629', 1888 | '6642007157805339', 1889 | '2724864485803862', 1890 | '1649175996151296', 1891 | '7221700310899824', 1892 | '4639993184048362', 1893 | '1273356393041814', 1894 | '4530990965107271', 1895 | '2273042431898909', 1896 | '0301086531470746', 1897 | '3964934468524226', 1898 | '0309807608556328', 1899 | '5278792155273227', 1900 | '3101039341937629', 1901 | '0114165908429333', 1902 | '6057112484852190', 1903 | '2769198515017544', 1904 | '4544009034898007', 1905 | '8997898523208917', 1906 | '7907428984480212', 1907 | '5045411182530423', 1908 | '1070547610545269', 1909 | '8035303847726357', 1910 | '1684897276610941', 1911 | '7600313266797044', 1912 | '1849543290360168', 1913 | '0689013577796423', 1914 | '1235295907217746', 1915 | '7065617570494237', 1916 | '0146132734184414', 1917 | '9393204083037114', 1918 | '9418938432656182', 1919 | '2880457020423499', 1920 | '5899495216371943', 1921 | '6520797467666942', 1922 | '6064064173833483', 1923 | '2796830839586282', 1924 | '0313256743924953', 1925 | '2501484186343478', 1926 | '3128887541467404', 1927 | '2404312908569872', 1928 | '3064749340725644', 1929 | '7984868632504577', 1930 | '8685024249753449', 1931 | '9270246002428568', 1932 | '1610678129123421', 1933 | '7435904264607329', 1934 | '7022870466104777', 1935 | '2482462559620248', 1936 | '7907921198147786', 1937 | '3072527209643570', 1938 | '6432651087509124', 1939 | '2712669120459214', 1940 | '2445173105059362', 1941 | '5561520743006055', 1942 | '9698780604739589', 1943 | '0680525406118040', 1944 | '3456089604946850', 1945 | '5443345046772720', 1946 | '4649854899297887', 1947 | '4113577942450847', 1948 | '4646754998429578', 1949 | '6884915875893817', 1950 | '8430287376003707', 1951 | '1700332598810130', 1952 | '6311583506043230', 1953 | '9414053936111130', 1954 | '5085672936381451', 1955 | '1673242682396037', 1956 | '9727497291749586', 1957 | '9332949712665198', 1958 | '9757510774617264', 1959 | '7890100431013381', 1960 | '7982027776930709', 1961 | '4579496282931053', 1962 | '1055892562166130', 1963 | '5050567245411028', 1964 | '5092740081873364', 1965 | '3322341100596361', 1966 | '3022399994704374', 1967 | '6950544477472861', 1968 | '1782394701229164', 1969 | '9027862225578018', 1970 | '2016819382232458', 1971 | '4476129838955208', 1972 | '8071359012461622', 1973 | '6419989933659144', 1974 | '5740900815299817', 1975 | '1697307740001170', 1976 | '2250682985496676', 1977 | '9805662357958184', 1978 | '4521930939389237', 1979 | '7013016139850443', 1980 | '6947484324938415', 1981 | '0952758102621419', 1982 | '3715027017894509', 1983 | '3740798508851014', 1984 | '1380239850867822', 1985 | '9349807891801282', 1986 | '9537293670226018', 1987 | '9652115893418483', 1988 | '4396395573798473', 1989 | '8237066253552966', 1990 | '8688783659069873', 1991 | '8511749968743655', 1992 | '7190118501898950', 1993 | '6423909416079530', 1994 | '8430483666490846', 1995 | '1505016456189185', 1996 | '5836692189204761', 1997 | '3948079175234978', 1998 | '7154416234270227', 1999 | '7566128284354210', 2000 | '4882288808983786', 2001 | ' -------------------------------------------------------------------------------- /data-sync/beta_data/beta_data_1.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | import tkinter as tk 3 | from tkinter import messagebox, ttk, colorchooser 4 | import os 5 | import sys 6 | from datetime import datetime, timedelta 7 | 8 | # --- تنظیمات اولیه --- 9 | FONT_SIZE_MIN = 1 10 | FONT_SIZE_MAX = 1000 11 | DEFAULT_FONT_SIZE = 10 12 | PERMANENT_PASSWORD = "1234567890123456" # رمز عبور دائمی 16 رقمی 13 | 14 | # --- اتصال به دیتابیس‌ها --- 15 | def connect_theme_db(): 16 | conn = sqlite3.connect("database/salar.db") 17 | cursor = conn.cursor() 18 | cursor.execute(""" 19 | CREATE TABLE IF NOT EXISTS user_settings ( 20 | id INTEGER PRIMARY KEY AUTOINCREMENT, 21 | theme_id INTEGER NOT NULL, 22 | font_size INTEGER NOT NULL DEFAULT 12 23 | ) 24 | """) 25 | cursor.execute("SELECT COUNT(*) FROM user_settings") 26 | if cursor.fetchone()[0] == 0: 27 | cursor.execute("INSERT INTO user_settings (theme_id, font_size) VALUES (?, ?)", (1, 12)) 28 | conn.commit() 29 | conn.close() 30 | 31 | def connect_question_db(): 32 | conn = sqlite3.connect("database/xert.db") 33 | cursor = conn.cursor() 34 | cursor.execute(""" 35 | CREATE TABLE IF NOT EXISTS questions ( 36 | id INTEGER PRIMARY KEY AUTOINCREMENT, 37 | question TEXT NOT NULL, 38 | answer TEXT NOT NULL 39 | ) 40 | """) 41 | conn.commit() 42 | conn.close() 43 | 44 | def connect_betf_db(): 45 | conn = sqlite3.connect("database/betf.db") 46 | cursor = conn.cursor() 47 | cursor.execute(""" 48 | CREATE TABLE IF NOT EXISTS app_access ( 49 | id INTEGER PRIMARY KEY AUTOINCREMENT, 50 | start_date TEXT NOT NULL, 51 | access_granted INTEGER NOT NULL DEFAULT 0 52 | ) 53 | """) 54 | cursor.execute("SELECT COUNT(*) FROM app_access") 55 | if cursor.fetchone()[0] == 0: 56 | now = datetime.now().strftime("%Y-%m-%d") 57 | cursor.execute("INSERT INTO app_access (start_date, access_granted) VALUES (?, ?)", (now, 0)) 58 | conn.commit() 59 | conn.close() 60 | 61 | # --- توابع پایگاه داده --- 62 | def execute_sql(db_name, query, params=()): 63 | conn = sqlite3.connect(db_name) 64 | cursor = conn.cursor() 65 | cursor.execute(query, params) 66 | conn.commit() 67 | conn.close() 68 | 69 | def fetch_sql(db_name, query, params=()): 70 | conn = sqlite3.connect(db_name) 71 | cursor = conn.cursor() 72 | cursor.execute(query, params) 73 | result = cursor.fetchall() 74 | conn.close() 75 | return result 76 | 77 | # --- بررسی دسترسی --- 78 | def check_access(): 79 | data = fetch_sql("database/betf.db", "SELECT start_date, access_granted FROM app_access LIMIT 1")[0] 80 | start_date = datetime.strptime(data[0], "%Y-%m-%d") 81 | access_granted = bool(data[1]) 82 | current_date = datetime.now() 83 | 84 | if access_granted: 85 | return True 86 | 87 | if current_date > start_date + timedelta(days=30): 88 | return False 89 | 90 | return True 91 | 92 | def activate_program(): 93 | password_window = tk.Toplevel(root) 94 | password_window.title("Enter Activation Code") 95 | 96 | tk.Label(password_window, text="Enter 16-Digit Activation Code:").grid(row=0, column=0, padx=10, pady=10) 97 | entry_password = ttk.Entry(password_window, show="*", width=30) 98 | entry_password.grid(row=1, column=0, padx=10, pady=10) 99 | 100 | def validate_password(): 101 | entered_password = entry_password.get() 102 | if entered_password == PERMANENT_PASSWORD: 103 | execute_sql("database/betf.db", "UPDATE app_access SET access_granted = 1 WHERE id = 1") 104 | messagebox.showinfo("Success", "Program activated successfully!") 105 | password_window.destroy() 106 | app_reload() 107 | else: 108 | messagebox.showerror("Error", "Invalid activation code.") 109 | 110 | ttk.Button(password_window, text="Activate", command=validate_password).grid(row=2, column=0, padx=10, pady=10) 111 | 112 | def app_reload(): 113 | python = sys.executable 114 | os.execl(python, python, *sys.argv) 115 | 116 | # --- اگر دسترسی محدود باشد، پنجره فعال‌سازی نمایش داده می‌شود --- 117 | def enforce_access(): 118 | if not check_access(): 119 | msg = """ 120 | Your 30-day trial period has ended. 121 | Please enter a 16-digit activation code to unlock the program. 122 | """ 123 | messagebox.showerror("Activation Required", msg) 124 | activate_program() 125 | root.wait_window() 126 | 127 | # --- توابع مدیریت سوالات --- 128 | def load_questions(): 129 | for row in tree.get_children(): 130 | tree.delete(row) 131 | questions = fetch_sql("database/xert.db", "SELECT * FROM questions") 132 | for row in questions: 133 | tree.insert("", tk.END, values=row) 134 | 135 | def add_question(): 136 | question = entry_question.get() 137 | answer = entry_answer.get() 138 | if question and answer: 139 | execute_sql("database/xert.db", "INSERT INTO questions (question, answer) VALUES (?, ?)", (question, answer)) 140 | load_questions() 141 | entry_question.delete(0, tk.END) 142 | entry_answer.delete(0, tk.END) 143 | else: 144 | messagebox.showwarning("Warning", "Please fill in both Question and Answer fields.") 145 | 146 | def edit_question(): 147 | selected_item = tree.selection() 148 | if not selected_item: 149 | messagebox.showwarning("Warning", "Please select a question to edit.") 150 | return 151 | 152 | question_id = tree.item(selected_item[0])["values"][0] 153 | edited_question = entry_question.get() 154 | edited_answer = entry_answer.get() 155 | if edited_question and edited_answer: 156 | execute_sql("database/xert.db", "UPDATE questions SET question = ?, answer = ? WHERE id = ?", 157 | (edited_question, edited_answer, question_id)) 158 | load_questions() 159 | entry_question.delete(0, tk.END) 160 | entry_answer.delete(0, tk.END) 161 | else: 162 | messagebox.showwarning("Warning", "Please enter both Question and Answer fields.") 163 | 164 | def delete_question(): 165 | selected_item = tree.selection() 166 | if not selected_item: 167 | messagebox.showwarning("Warning", "Please select a question to delete.") 168 | return 169 | 170 | question_id = tree.item(selected_item[0])["values"][0] 171 | execute_sql("database/xert.db", "DELETE FROM questions WHERE id = ?", (question_id,)) 172 | load_questions() 173 | 174 | def select_item(event): 175 | selected_item = tree.selection() 176 | if not selected_item: 177 | return 178 | question = tree.item(selected_item[0])["values"][1] 179 | answer = tree.item(selected_item[0])["values"][2] 180 | entry_question.delete(0, tk.END) 181 | entry_question.insert(0, question) 182 | entry_answer.delete(0, tk.END) 183 | entry_answer.insert(0, answer) 184 | 185 | # --- رابط کاربری --- 186 | root = tk.Tk() 187 | root.title("Questions Database") 188 | 189 | # منوی بالا 190 | menu_bar = tk.Menu(root) 191 | file_menu = tk.Menu(menu_bar, tearoff=0) 192 | file_menu.add_command(label="Exit", command=root.quit) 193 | menu_bar.add_cascade(label="File", menu=file_menu) 194 | root.config(menu=menu_bar) 195 | 196 | # فریم ورودی‌ها 197 | frame = tk.Frame(root) 198 | frame.pack(pady=10) 199 | 200 | entry_question = ttk.Entry(frame, width=30) 201 | entry_question.grid(row=0, column=1, padx=5, pady=5) 202 | ttk.Label(frame, text="Question: ").grid(row=0, column=0) 203 | 204 | entry_answer = ttk.Entry(frame, width=30) 205 | entry_answer.grid(row=1, column=1, padx=5, pady=5) 206 | ttk.Label(frame, text="Answer: ").grid(row=1, column=0) 207 | 208 | btn_add = ttk.Button(frame, text="Add Question", command=add_question) 209 | btn_add.grid(row=2, column=0, pady=5) 210 | 211 | btn_edit = ttk.Button(frame, text="Edit Question", command=edit_question) 212 | btn_edit.grid(row=2, column=1, pady=5) 213 | 214 | btn_delete = ttk.Button(frame, text="Delete Question", command=delete_question) 215 | btn_delete.grid(row=2, column=2, pady=5) 216 | 217 | # جدول نمایش سوالات 218 | tree = ttk.Treeview(root, columns=("ID", "Question", "Answer"), show='headings') 219 | tree.heading("ID", text="ID") 220 | tree.heading("Question", text="Question") 221 | tree.heading("Answer", text="Answer") 222 | tree.pack(pady=10) 223 | tree.bind("<>", select_item) 224 | 225 | # اجرای الزامات 226 | connect_theme_db() 227 | connect_question_db() 228 | connect_betf_db() 229 | enforce_access() 230 | load_questions() 231 | 232 | # اجرا 233 | root.mainloop() 234 | -------------------------------------------------------------------------------- /data-sync/create_random_key.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | def generate_activation_codes(count, length=16): 4 | codes = [] 5 | for _ in range(count): 6 | code = ''.join(random.choices('0123456789', k=length)) 7 | codes.append(code) 8 | return codes 9 | 10 | # تولید 200 کد شانزده رقمی 11 | activation_codes = generate_activation_codes(2000) 12 | 13 | # ذخیره کدها در یک فایل یا نمایش در کنسول 14 | with open("activation_codes.txt", "w") as file: 15 | for code in activation_codes: 16 | file.write(code + "',\n'") 17 | 18 | print("200 کد شانزده رقمی ایجاد شد و در فایل 'activation_codes.txt' ذخیره گردید.") -------------------------------------------------------------------------------- /data-sync/database/betf.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/database/betf.db -------------------------------------------------------------------------------- /data-sync/database/num.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/database/num.db -------------------------------------------------------------------------------- /data-sync/database/questions.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/database/questions.db -------------------------------------------------------------------------------- /data-sync/database/salar.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/database/salar.db -------------------------------------------------------------------------------- /data-sync/database/xert.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/database/xert.db -------------------------------------------------------------------------------- /data-sync/index.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | import tkinter as tk 3 | from tkinter import messagebox, ttk 4 | from tkinter import colorchooser 5 | import os 6 | import sys 7 | 8 | FONT_SIZE_MIN = 1 9 | FONT_SIZE_MAX = 1000 10 | DEFAULT_FONT_SIZE = 10 11 | 12 | # Create or connect to SQLite database for themes 13 | def connect_theme_db(): 14 | conn = sqlite3.connect("database/salar.db") 15 | cursor = conn.cursor() 16 | 17 | cursor.execute(""" 18 | CREATE TABLE IF NOT EXISTS user_settings ( 19 | id INTEGER PRIMARY KEY AUTOINCREMENT, 20 | theme_id INTEGER NOT NULL 21 | ) 22 | """) 23 | cursor.execute("PRAGMA table_info(user_settings)") 24 | columns = [column[1] for column in cursor.fetchall()] 25 | if "font_size" not in columns: 26 | cursor.execute("ALTER TABLE user_settings ADD COLUMN font_size INTEGER NOT NULL DEFAULT 12") 27 | cursor.execute("SELECT COUNT(*) FROM user_settings") 28 | if cursor.fetchone()[0] == 0: 29 | cursor.execute("INSERT INTO user_settings (theme_id, font_size) VALUES (?, ?)", (1, 12)) 30 | 31 | conn.commit() 32 | conn.close() 33 | 34 | # Create or connect to SQLite database for questions 35 | def connect_db(): 36 | conn = sqlite3.connect("database/xert.db") 37 | cursor = conn.cursor() 38 | cursor.execute(""" 39 | CREATE TABLE IF NOT EXISTS questions ( 40 | id INTEGER PRIMARY KEY AUTOINCREMENT, 41 | question TEXT NOT NULL, 42 | answer TEXT NOT NULL 43 | ) 44 | """) 45 | cursor.execute(""" 46 | CREATE TABLE IF NOT EXISTS themes ( 47 | id INTEGER PRIMARY KEY AUTOINCREMENT, 48 | name TEXT NOT NULL, 49 | background_color TEXT NOT NULL, 50 | foreground_color TEXT NOT NULL, 51 | entry_background TEXT NOT NULL, 52 | entry_foreground TEXT NOT NULL 53 | ) 54 | """) 55 | cursor.execute(""" 56 | CREATE TABLE IF NOT EXISTS search_history ( 57 | id INTEGER PRIMARY KEY AUTOINCREMENT, 58 | query TEXT NOT NULL 59 | ) 60 | """) 61 | 62 | conn.commit() 63 | conn.close() 64 | 65 | def execute_sql(db_name, query, params=()): 66 | conn = sqlite3.connect(db_name) 67 | cursor = conn.cursor() 68 | cursor.execute(query, params) 69 | conn.commit() 70 | conn.close() 71 | 72 | def fetch_sql(db_name, query, params=()): 73 | conn = sqlite3.connect(db_name) 74 | cursor = conn.cursor() 75 | cursor.execute(query, params) 76 | result = cursor.fetchall() 77 | conn.close() 78 | return result 79 | 80 | def load_questions(): 81 | for row in tree.get_children(): 82 | tree.delete(row) 83 | questions = fetch_sql("database/xert.db", "SELECT * FROM questions") 84 | for row in questions: 85 | tree.insert("", tk.END, values=row) 86 | 87 | def load_themes(): 88 | return fetch_sql("database/xert.db", "SELECT * FROM themes") 89 | 90 | def add_question(): 91 | question = entry_question.get() 92 | answer = entry_answer.get() 93 | if question and answer: 94 | exists = fetch_sql("database/xert.db", "SELECT COUNT(*) FROM questions WHERE question = ?", (question,))[0][0] 95 | if exists > 0: 96 | messagebox.showwarning("Warning", "This question already exists.") 97 | else: 98 | execute_sql("database/xert.db", "INSERT INTO questions (question, answer) VALUES (?, ?)", (question, answer)) 99 | load_questions() 100 | clear_entries() 101 | else: 102 | messagebox.showwarning("Warning", "Please enter both question and answer.") 103 | 104 | def edit_question(): 105 | if not tree.selection(): 106 | messagebox.showwarning("Warning", "Please select a question to edit.") 107 | return 108 | 109 | selected_item = tree.selection()[0] 110 | question_id = tree.item(selected_item)['values'][0] 111 | question = entry_question.get() 112 | answer = entry_answer.get() 113 | 114 | if question and answer: 115 | execute_sql("database/xert.db", "UPDATE questions SET question = ?, answer = ? WHERE id = ?", (question, answer, question_id)) 116 | load_questions() 117 | clear_entries() 118 | else: 119 | messagebox.showwarning("Warning", "Please enter both question and answer.") 120 | 121 | def delete_question(): 122 | if not tree.selection(): 123 | messagebox.showwarning("Warning", "Please select a question to delete.") 124 | return 125 | 126 | selected_item = tree.selection()[0] 127 | question_id = tree.item(selected_item)['values'][0] 128 | execute_sql("database/xert.db", "DELETE FROM questions WHERE id = ?", (question_id,)) 129 | load_questions() 130 | 131 | def select_item(event): 132 | if tree.selection(): 133 | selected_item = tree.selection()[0] 134 | question = tree.item(selected_item)['values'][1] 135 | answer = tree.item(selected_item)['values'][2] 136 | 137 | entry_question.delete(0, tk.END) 138 | entry_answer.delete(0, tk.END) 139 | 140 | entry_question.insert(0, question) 141 | entry_answer.insert(0, answer) 142 | 143 | def clear_entries(): 144 | entry_question.delete(0, tk.END) 145 | entry_answer.delete(0, tk.END) 146 | 147 | def change_theme(selected_theme_index): 148 | themes = load_themes() 149 | if selected_theme_index < len(themes): 150 | selected_theme = themes[selected_theme_index] 151 | root.configure(bg=selected_theme[2]) 152 | style.configure("TFrame", background=selected_theme[2]) 153 | style.configure("TLabel", background=selected_theme[2], foreground=selected_theme[3]) 154 | style.configure("TEntry", fieldbackground=selected_theme[4], foreground=selected_theme[5]) 155 | style.configure("TButton", background=selected_theme[4], foreground=selected_theme[3]) 156 | tree.configure(style='theme.Treeview') 157 | execute_sql("database/salar.db", "UPDATE user_settings SET theme_id = ?", (selected_theme[0],)) 158 | 159 | def apply_last_selected_theme(): 160 | current_theme_id, font_size = fetch_sql("database/salar.db", "SELECT theme_id, font_size FROM user_settings")[0] 161 | change_theme(current_theme_id - 1) 162 | change_font_size(font_size) 163 | 164 | def open_color_picker(entry): 165 | color = colorchooser.askcolor(parent=root)[1] 166 | if color: 167 | entry.delete(0, tk.END) 168 | entry.insert(0, color) 169 | 170 | def open_new_theme_window(): 171 | new_theme_window = tk.Toplevel(root) 172 | new_theme_window.title("Create New Theme") 173 | 174 | tk.Label(new_theme_window, text="Theme Name:").grid(row=0, column=0) 175 | entry_theme_name = tk.Entry(new_theme_window) 176 | entry_theme_name.grid(row=0, column=1) 177 | 178 | tk.Label(new_theme_window, text="Background Color:").grid(row=1, column=0) 179 | entry_bg_color = tk.Entry(new_theme_window) 180 | entry_bg_color.grid(row=1, column=1) 181 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_bg_color)).grid(row=1, column=2) 182 | 183 | tk.Label(new_theme_window, text="Foreground Color:").grid(row=2, column=0) 184 | entry_fg_color = tk.Entry(new_theme_window) 185 | entry_fg_color.grid(row=2, column=1) 186 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_fg_color)).grid(row=2, column=2) 187 | 188 | tk.Label(new_theme_window, text="Entry Background:").grid(row=3, column=0) 189 | entry_entry_bg = tk.Entry(new_theme_window) 190 | entry_entry_bg.grid(row=3, column=1) 191 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_entry_bg)).grid(row=3, column=2) 192 | 193 | tk.Label(new_theme_window, text="Entry Foreground:").grid(row=4, column=0) 194 | entry_entry_fg = tk.Entry(new_theme_window) 195 | entry_entry_fg.grid(row=4, column=1) 196 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_entry_fg)).grid(row=4, column=2) 197 | 198 | def save_theme(): 199 | name = entry_theme_name.get() 200 | bg_color = entry_bg_color.get() 201 | fg_color = entry_fg_color.get() 202 | entry_bg = entry_entry_bg.get() 203 | entry_fg = entry_entry_fg.get() 204 | 205 | if name and bg_color and fg_color and entry_bg and entry_fg: 206 | execute_sql("database/xert.db", "INSERT INTO themes (name, background_color, foreground_color, entry_background, entry_foreground) VALUES (?, ?, ?, ?, ?)", 207 | (name, bg_color, fg_color, entry_bg, entry_fg)) 208 | messagebox.showinfo("Success", "Theme created successfully!") 209 | update_theme_menu() 210 | new_theme_window.destroy() 211 | else: 212 | messagebox.showwarning("Warning", "Please enter all fields.") 213 | 214 | tk.Button(new_theme_window, text="Save Theme", command=save_theme).grid(row=5, columnspan=3) 215 | 216 | def change_font_size(size): 217 | if FONT_SIZE_MIN <= size <= FONT_SIZE_MAX: 218 | style.configure("TLabel", font=("TkDefaultFont", size)) 219 | style.configure("TButton", font=("TkDefaultFont", size)) 220 | style.configure("TEntry", font=("TkDefaultFont", size)) 221 | tree.tag_configure('default', font=("TkDefaultFont", size)) 222 | execute_sql("database/salar.db", "UPDATE user_settings SET font_size = ?", (size,)) 223 | else: 224 | messagebox.showwarning("Warning", f"Font size must be between {FONT_SIZE_MIN} and {FONT_SIZE_MAX}.") 225 | 226 | def reset_font_size(): 227 | change_font_size(DEFAULT_FONT_SIZE) 228 | execute_sql("database/salar.db", "UPDATE user_settings SET font_size = ?", (DEFAULT_FONT_SIZE,)) 229 | messagebox.showinfo("Info", "Font size has been reset. The application will now restart.") 230 | python = sys.executable 231 | os.execl(python, python, *sys.argv) 232 | 233 | def open_font_size_window(): 234 | font_size_window = tk.Toplevel(root) 235 | font_size_window.title("Change Font Size") 236 | 237 | tk.Label(font_size_window, text="Font Size:").grid(row=0, column=0) 238 | spin_font_size = tk.Spinbox(font_size_window, from_=FONT_SIZE_MIN, to=FONT_SIZE_MAX, width=5) 239 | spin_font_size.grid(row=0, column=1) 240 | 241 | current_font_size = fetch_sql("database/salar.db", "SELECT font_size FROM user_settings")[0][0] 242 | spin_font_size.delete(0, tk.END) 243 | spin_font_size.insert(0, current_font_size) 244 | 245 | def update_font_size(): 246 | try: 247 | size = int(spin_font_size.get()) 248 | change_font_size(size) 249 | font_size_window.destroy() 250 | except ValueError: 251 | messagebox.showerror("Error", "Invalid font size entered.") 252 | 253 | tk.Button(font_size_window, text="Apply", command=update_font_size).grid(row=0, column=2) 254 | tk.Button(font_size_window, text="Reset to Default", command=reset_font_size).grid(row=1, column=0, columnspan=3, pady=5) 255 | 256 | def on_exit(): 257 | if messagebox.askyesno("Exit", "Are you sure you want to exit?"): 258 | root.quit() 259 | root.destroy() 260 | 261 | def create_theme_menu(menu): 262 | themes = load_themes() 263 | for index, theme in enumerate(themes): 264 | menu.add_command(label=theme[1], command=lambda idx=index: change_theme(idx)) 265 | 266 | def update_theme_menu(): 267 | theme_menu.delete(0, tk.END) 268 | theme_menu.add_command(label="Create New Theme", command=open_new_theme_window) 269 | theme_menu.add_separator() 270 | create_theme_menu(theme_menu) 271 | 272 | def check_and_display_welcome_message(): 273 | conn = sqlite3.connect("database/num.db") 274 | cursor = conn.cursor() 275 | cursor.execute("SELECT first_time FROM user_status WHERE id = 1") 276 | result = cursor.fetchone() 277 | if result and result[0] == 1: 278 | messagebox.showinfo("Welcome", "Welcome to the Questions Database App!") 279 | cursor.execute("UPDATE user_status SET first_time = 0 WHERE id = 1") 280 | conn.commit() 281 | conn.close() 282 | 283 | def connect_num_db(): 284 | conn = sqlite3.connect("database/num.db") 285 | cursor = conn.cursor() 286 | cursor.execute(""" 287 | CREATE TABLE IF NOT EXISTS user_status ( 288 | id INTEGER PRIMARY KEY AUTOINCREMENT, 289 | first_time INTEGER NOT NULL 290 | ) 291 | """) 292 | cursor.execute("SELECT COUNT(*) FROM user_status") 293 | if cursor.fetchone()[0] == 0: 294 | cursor.execute("INSERT INTO user_status (first_time) VALUES (?)", (1,)) 295 | conn.commit() 296 | conn.close() 297 | 298 | def reset_databases(): 299 | execute_sql("database/xert.db", "DROP TABLE IF EXISTS themes") 300 | execute_sql("database/salar.db", "DROP TABLE IF EXISTS user_settings") 301 | execute_sql("database/num.db", "DROP TABLE IF EXISTS user_status") 302 | connect_db() 303 | connect_theme_db() 304 | connect_num_db() 305 | messagebox.showinfo("Reset Complete", "All data have been reset. The application will now restart.") 306 | python = sys.executable 307 | os.execl(python, python, *sys.argv) 308 | 309 | def open_search_window(): 310 | search_window = tk.Toplevel(root) 311 | search_window.title("Search Questions") 312 | 313 | tk.Label(search_window, text="Search").grid(row=0, column=0) 314 | entry_search = ttk.Entry(search_window, width=30) 315 | entry_search.grid(row=0, column=1, padx=5, pady=5) 316 | 317 | results_tree = ttk.Treeview(search_window, columns=("ID", "Question", "Answer"), show='headings') 318 | results_tree.heading("ID", text="ID") 319 | results_tree.heading("Question", text="Question") 320 | results_tree.heading("Answer", text="Answer") 321 | results_tree.grid(row=1, columnspan=2, pady=10) 322 | 323 | def search_questions(): 324 | query = entry_search.get() 325 | for row in results_tree.get_children(): 326 | results_tree.delete(row) 327 | results = fetch_sql("database/xert.db", "SELECT * FROM questions WHERE question LIKE ?", ("%" + query + "%",)) 328 | for row in results: 329 | results_tree.insert("", tk.END, values=row) 330 | # Add the search query to history 331 | if query: 332 | execute_sql("database/xert.db", "INSERT INTO search_history (query) VALUES (?)", (query,)) 333 | 334 | ttk.Button(search_window, text="Search", command=search_questions).grid(row=0, column=2, pady=5) 335 | 336 | # Button to view search history 337 | ttk.Button(search_window, text="View Search History", command=open_search_history_window).grid(row=2, columnspan=3, pady=5) 338 | 339 | def open_search_history_window(): 340 | history_window = tk.Toplevel(root) 341 | history_window.title("Search History") 342 | 343 | history_tree = ttk.Treeview(history_window, columns=("ID", "Query"), show='headings') 344 | history_tree.heading("ID", text="ID") 345 | history_tree.heading("Query", text="Search Query") 346 | history_tree.pack(pady=10) 347 | 348 | history_results = fetch_sql("database/xert.db", "SELECT * FROM search_history") 349 | for row in history_results: 350 | history_tree.insert("", tk.END, values=row) 351 | 352 | # Create user interface 353 | root = tk.Tk() 354 | root.title("Questions Database") 355 | 356 | # Menu Bar 357 | menu_bar = tk.Menu(root) 358 | file_menu = tk.Menu(menu_bar, tearoff=0) 359 | file_menu.add_command(label="Reset data", command=reset_databases) 360 | file_menu.add_separator() 361 | file_menu.add_command(label="Exit", command=on_exit) 362 | menu_bar.add_cascade(label="File", menu=file_menu) 363 | 364 | font_menu = tk.Menu(menu_bar, tearoff=0) 365 | font_menu.add_command(label="Change Font Size", command=open_font_size_window) 366 | font_menu.add_command(label="Reset Font Size", command=reset_font_size) 367 | menu_bar.add_cascade(label="Font", menu=font_menu) 368 | 369 | theme_menu = tk.Menu(menu_bar, tearoff=0) 370 | theme_menu.add_command(label="Create New Theme", command=open_new_theme_window) 371 | theme_menu.add_separator() 372 | create_theme_menu(theme_menu) 373 | menu_bar.add_cascade(label="Themes", menu=theme_menu) 374 | 375 | # Add search menu 376 | menu_bar.add_command(label="Search Questions", command=open_search_window) 377 | 378 | help_menu = tk.Menu(menu_bar, tearoff=0) 379 | help_menu.add_command(label="About", command=lambda: messagebox.showinfo("About", "Questions Database App Version 1.0")) 380 | menu_bar.add_cascade(label="Help", menu=help_menu) 381 | 382 | root.config(menu=menu_bar) 383 | 384 | style = ttk.Style() 385 | style.configure("Treeview", rowheight=25) 386 | style.configure("TButton", padding=5) 387 | style.configure('theme.Treeview', background='white', foreground='black') 388 | 389 | connect_db() 390 | connect_theme_db() 391 | 392 | frame = tk.Frame(root) 393 | frame.pack(pady=10) 394 | 395 | entry_question = ttk.Entry(frame, width=30) 396 | entry_question.grid(row=2, column=1, padx=5, pady=5) 397 | ttk.Label(frame, text="Question").grid(row=2, column=0) 398 | 399 | entry_answer = ttk.Entry(frame, width=30) 400 | entry_answer.grid(row=3, column=1, padx=5, pady=5) 401 | ttk.Label(frame, text="Answer").grid(row=3, column=0) 402 | 403 | # Buttons 404 | btn_add = ttk.Button(frame, text="Add Question", command=add_question) 405 | btn_add.grid(row=4, columnspan=2, pady=5) 406 | 407 | btn_edit = ttk.Button(frame, text="Edit Question", command=edit_question) 408 | btn_edit.grid(row=5, columnspan=2, pady=5) 409 | 410 | btn_delete = ttk.Button(frame, text="Delete Question", command=delete_question) 411 | btn_delete.grid(row=6, columnspan=2, pady=5) 412 | 413 | # Questions display table 414 | tree = ttk.Treeview(root, columns=("ID", "Question", "Answer"), show='headings') 415 | tree.heading("ID", text="ID") 416 | tree.heading("Question", text="Question") 417 | tree.heading("Answer", text="Answer") 418 | tree.pack(pady=10) 419 | 420 | tree.tag_configure('default', font=("TkDefaultFont", 12)) 421 | tree.bind("<>", select_item) 422 | 423 | # Load data 424 | load_questions() 425 | 426 | # Apply the last selected theme and font size 427 | apply_last_selected_theme() 428 | connect_db() 429 | connect_theme_db() 430 | connect_num_db() 431 | 432 | # Check if welcome message should be displayed 433 | check_and_display_welcome_message() 434 | 435 | root.mainloop() 436 | -------------------------------------------------------------------------------- /data-sync/node_data/welcome_message.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome_message": "Welcome to the Questions Database App!" 3 | } -------------------------------------------------------------------------------- /data-sync/package-lock.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/package-lock.json -------------------------------------------------------------------------------- /data-sync/package.json: -------------------------------------------------------------------------------- 1 | 2 | 3 | { 4 | "name": "ghadaam", 5 | "version": "0.1.0", 6 | "private": true, 7 | "scripts": { 8 | "dev": "ghadaam", 9 | "start": "python main.py" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /data-sync/questions.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/questions.db -------------------------------------------------------------------------------- /data-sync/salar.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/salar.db -------------------------------------------------------------------------------- /data-sync/xert.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/data-sync/xert.db -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | import tkinter as tk 3 | from tkinter import messagebox, ttk 4 | from tkinter import colorchooser 5 | import os 6 | import sys 7 | 8 | FONT_SIZE_MIN = 1 9 | FONT_SIZE_MAX = 1000 10 | DEFAULT_FONT_SIZE = 10 11 | 12 | # Create or connect to SQLite database for themes 13 | def connect_theme_db(): 14 | conn = sqlite3.connect("salar.db") 15 | cursor = conn.cursor() 16 | 17 | # Create user_settings table if it doesn't exist 18 | cursor.execute(""" 19 | CREATE TABLE IF NOT EXISTS user_settings ( 20 | id INTEGER PRIMARY KEY AUTOINCREMENT, 21 | theme_id INTEGER NOT NULL 22 | ) 23 | """) 24 | 25 | # Check and add font_size column if it doesn't exist 26 | cursor.execute("PRAGMA table_info(user_settings)") 27 | columns = [column[1] for column in cursor.fetchall()] 28 | if "font_size" not in columns: 29 | cursor.execute("ALTER TABLE user_settings ADD COLUMN font_size INTEGER NOT NULL DEFAULT 12") 30 | 31 | # Check if settings exist, if not insert default theme (theme_id=1) 32 | cursor.execute("SELECT COUNT(*) FROM user_settings") 33 | if cursor.fetchone()[0] == 0: 34 | cursor.execute("INSERT INTO user_settings (theme_id, font_size) VALUES (?, ?)", (1, 12)) 35 | 36 | conn.commit() 37 | conn.close() 38 | 39 | # Create or connect to SQLite database for questions 40 | def connect_db(): 41 | conn = sqlite3.connect("xert.db") 42 | cursor = conn.cursor() 43 | cursor.execute(""" 44 | CREATE TABLE IF NOT EXISTS questions ( 45 | id INTEGER PRIMARY KEY AUTOINCREMENT, 46 | question TEXT NOT NULL, 47 | answer TEXT NOT NULL 48 | ) 49 | """) 50 | cursor.execute(""" 51 | CREATE TABLE IF NOT EXISTS themes ( 52 | id INTEGER PRIMARY KEY AUTOINCREMENT, 53 | name TEXT NOT NULL, 54 | background_color TEXT NOT NULL, 55 | foreground_color TEXT NOT NULL, 56 | entry_background TEXT NOT NULL, 57 | entry_foreground TEXT NOT NULL 58 | ) 59 | """) 60 | 61 | conn.commit() 62 | conn.close() 63 | 64 | 65 | def execute_sql(db_name, query, params=()): 66 | conn = sqlite3.connect(db_name) 67 | cursor = conn.cursor() 68 | cursor.execute(query, params) 69 | conn.commit() 70 | conn.close() 71 | 72 | 73 | def fetch_sql(db_name, query, params=()): 74 | conn = sqlite3.connect(db_name) 75 | cursor = conn.cursor() 76 | cursor.execute(query, params) 77 | result = cursor.fetchall() 78 | conn.close() 79 | return result 80 | 81 | 82 | def load_questions(): 83 | for row in tree.get_children(): 84 | tree.delete(row) 85 | questions = fetch_sql("xert.db", "SELECT * FROM questions") 86 | for row in questions: 87 | tree.insert("", tk.END, values=row) 88 | 89 | 90 | def load_themes(): 91 | return fetch_sql("xert.db", "SELECT * FROM themes") 92 | 93 | 94 | def add_question(): 95 | question = entry_question.get() 96 | answer = entry_answer.get() 97 | 98 | if question and answer: 99 | exists = fetch_sql("xert.db", "SELECT COUNT(*) FROM questions WHERE question = ?", (question,))[0][0] 100 | if exists > 0: 101 | messagebox.showwarning("Warning", "This question already exists.") 102 | else: 103 | execute_sql("xert.db", "INSERT INTO questions (question, answer) VALUES (?, ?)", (question, answer)) 104 | load_questions() 105 | clear_entries() 106 | else: 107 | messagebox.showwarning("Warning", "Please enter both question and answer.") 108 | 109 | 110 | def edit_question(): 111 | if not tree.selection(): 112 | messagebox.showwarning("Warning", "Please select a question to edit.") 113 | return 114 | 115 | selected_item = tree.selection()[0] 116 | question_id = tree.item(selected_item)['values'][0] 117 | question = entry_question.get() 118 | answer = entry_answer.get() 119 | 120 | if question and answer: 121 | execute_sql("xert.db", "UPDATE questions SET question = ?, answer = ? WHERE id = ?", (question, answer, question_id)) 122 | load_questions() 123 | clear_entries() 124 | else: 125 | messagebox.showwarning("Warning", "Please enter both question and answer.") 126 | 127 | 128 | def delete_question(): 129 | if not tree.selection(): 130 | messagebox.showwarning("Warning", "Please select a question to delete.") 131 | return 132 | 133 | selected_item = tree.selection()[0] 134 | question_id = tree.item(selected_item)['values'][0] 135 | execute_sql("xert.db", "DELETE FROM questions WHERE id = ?", (question_id,)) 136 | load_questions() 137 | 138 | 139 | def select_item(event): 140 | if tree.selection(): 141 | selected_item = tree.selection()[0] 142 | question = tree.item(selected_item)['values'][1] 143 | answer = tree.item(selected_item)['values'][2] 144 | 145 | entry_question.delete(0, tk.END) 146 | entry_answer.delete(0, tk.END) 147 | 148 | entry_question.insert(0, question) 149 | entry_answer.insert(0, answer) 150 | 151 | 152 | def clear_entries(): 153 | entry_question.delete(0, tk.END) 154 | entry_answer.delete(0, tk.END) 155 | 156 | 157 | def search_questions(): 158 | query = entry_search.get() 159 | for row in tree.get_children(): 160 | tree.delete(row) 161 | 162 | results = fetch_sql("xert.db", "SELECT * FROM questions WHERE question LIKE ?", ("%" + query + "%",)) 163 | for row in results: 164 | tree.insert("", tk.END, values=row) 165 | 166 | 167 | def change_theme(selected_theme_index): 168 | themes = load_themes() 169 | if selected_theme_index < len(themes): 170 | selected_theme = themes[selected_theme_index] 171 | root.configure(bg=selected_theme[2]) 172 | style.configure("TFrame", background=selected_theme[2]) 173 | style.configure("TLabel", background=selected_theme[2], foreground=selected_theme[3]) 174 | style.configure("TEntry", fieldbackground=selected_theme[4], foreground=selected_theme[5]) 175 | style.configure("TButton", background=selected_theme[4], foreground=selected_theme[3]) 176 | tree.configure(style='theme.Treeview') 177 | 178 | # Update user theme preference in 'salar.db' 179 | execute_sql("salar.db", "UPDATE user_settings SET theme_id = ?", (selected_theme[0],)) 180 | 181 | 182 | def apply_last_selected_theme(): 183 | # Fetch theme_id from user_settings 184 | current_theme_id, font_size = fetch_sql("salar.db", "SELECT theme_id, font_size FROM user_settings")[0] 185 | change_theme(current_theme_id - 1) # Subtract 1 to convert to zero-based index 186 | change_font_size(font_size) 187 | 188 | 189 | def open_color_picker(entry): 190 | color = colorchooser.askcolor(parent=root)[1] 191 | if color: 192 | entry.delete(0, tk.END) 193 | entry.insert(0, color) 194 | 195 | 196 | def open_new_theme_window(): 197 | new_theme_window = tk.Toplevel(root) 198 | new_theme_window.title("Create New Theme") 199 | 200 | tk.Label(new_theme_window, text="Theme Name:").grid(row=0, column=0) 201 | entry_theme_name = tk.Entry(new_theme_window) 202 | entry_theme_name.grid(row=0, column=1) 203 | 204 | tk.Label(new_theme_window, text="Background Color:").grid(row=1, column=0) 205 | entry_bg_color = tk.Entry(new_theme_window) 206 | entry_bg_color.grid(row=1, column=1) 207 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_bg_color)).grid(row=1, column=2) 208 | 209 | tk.Label(new_theme_window, text="Foreground Color:").grid(row=2, column=0) 210 | entry_fg_color = tk.Entry(new_theme_window) 211 | entry_fg_color.grid(row=2, column=1) 212 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_fg_color)).grid(row=2, column=2) 213 | 214 | tk.Label(new_theme_window, text="Entry Background:").grid(row=3, column=0) 215 | entry_entry_bg = tk.Entry(new_theme_window) 216 | entry_entry_bg.grid(row=3, column=1) 217 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_entry_bg)).grid(row=3, column=2) 218 | 219 | tk.Label(new_theme_window, text="Entry Foreground:").grid(row=4, column=0) 220 | entry_entry_fg = tk.Entry(new_theme_window) 221 | entry_entry_fg.grid(row=4, column=1) 222 | tk.Button(new_theme_window, text="Select Color", command=lambda: open_color_picker(entry_entry_fg)).grid(row=4, column=2) 223 | 224 | def save_theme(): 225 | name = entry_theme_name.get() 226 | bg_color = entry_bg_color.get() 227 | fg_color = entry_fg_color.get() 228 | entry_bg = entry_entry_bg.get() 229 | entry_fg = entry_entry_fg.get() 230 | 231 | if name and bg_color and fg_color and entry_bg and entry_fg: 232 | execute_sql("xert.db", "INSERT INTO themes (name, background_color, foreground_color, entry_background, entry_foreground) VALUES (?, ?, ?, ?, ?)", 233 | (name, bg_color, fg_color, entry_bg, entry_fg)) 234 | messagebox.showinfo("Success", "Theme created successfully!") 235 | # Update theme menu 236 | update_theme_menu() 237 | new_theme_window.destroy() 238 | else: 239 | messagebox.showwarning("Warning", "Please enter all fields.") 240 | 241 | tk.Button(new_theme_window, text="Save Theme", command=save_theme).grid(row=5, columnspan=3) 242 | 243 | 244 | def change_font_size(size): 245 | if FONT_SIZE_MIN <= size <= FONT_SIZE_MAX: 246 | style.configure("TLabel", font=("TkDefaultFont", size)) 247 | style.configure("TButton", font=("TkDefaultFont", size)) 248 | style.configure("TEntry", font=("TkDefaultFont", size)) 249 | tree.tag_configure('default', font=("TkDefaultFont", size)) 250 | execute_sql("salar.db", "UPDATE user_settings SET font_size = ?", (size,)) 251 | else: 252 | messagebox.showwarning("Warning", f"Font size must be between {FONT_SIZE_MIN} and {FONT_SIZE_MAX}.") 253 | 254 | 255 | def reset_font_size(): 256 | change_font_size(DEFAULT_FONT_SIZE) 257 | 258 | # Restart the application 259 | execute_sql("salar.db", "UPDATE user_settings SET font_size = ?", (DEFAULT_FONT_SIZE,)) 260 | messagebox.showinfo("Info", "Font size has been reset. The application will now restart.") 261 | python = sys.executable 262 | os.execl(python, python, *sys.argv) 263 | 264 | 265 | def open_font_size_window(): 266 | font_size_window = tk.Toplevel(root) 267 | font_size_window.title("Change Font Size") 268 | 269 | tk.Label(font_size_window, text="Font Size:").grid(row=0, column=0) 270 | spin_font_size = tk.Spinbox(font_size_window, from_=FONT_SIZE_MIN, to=FONT_SIZE_MAX, width=5) 271 | spin_font_size.grid(row=0, column=1) 272 | 273 | current_font_size = fetch_sql("salar.db", "SELECT font_size FROM user_settings")[0][0] 274 | spin_font_size.delete(0, tk.END) 275 | spin_font_size.insert(0, current_font_size) 276 | 277 | def update_font_size(): 278 | try: 279 | size = int(spin_font_size.get()) 280 | change_font_size(size) 281 | font_size_window.destroy() 282 | except ValueError: 283 | messagebox.showerror("Error", "Invalid font size entered.") 284 | 285 | tk.Button(font_size_window, text="Apply", command=update_font_size).grid(row=0, column=2) 286 | 287 | tk.Button(font_size_window, text="Reset to Default", command=reset_font_size).grid(row=1, column=0, columnspan=3, pady=5) 288 | 289 | 290 | def on_exit(): 291 | if messagebox.askyesno("Exit", "Are you sure you want to exit?"): 292 | root.quit() 293 | root.destroy() 294 | 295 | 296 | def create_theme_menu(menu): 297 | themes = load_themes() 298 | for index, theme in enumerate(themes): 299 | menu.add_command(label=theme[1], command=lambda idx=index: change_theme(idx)) 300 | 301 | 302 | def update_theme_menu(): 303 | theme_menu.delete(0, tk.END) 304 | theme_menu.add_command(label="Create New Theme", command=open_new_theme_window) 305 | theme_menu.add_separator() 306 | create_theme_menu(theme_menu) 307 | 308 | def check_and_display_welcome_message(): 309 | conn = sqlite3.connect("num.db") 310 | cursor = conn.cursor() 311 | cursor.execute("SELECT first_time FROM user_status WHERE id = 1") 312 | result = cursor.fetchone() 313 | 314 | # اگر مقدار first_time برابر با 1 باشد، پیام خوش آمدگویی نمایش داده شده و مقدار تغییر می‌کند. 315 | if result and result[0] == 1: 316 | messagebox.showinfo("Welcome", "Welcome to the Questions Database App!") 317 | cursor.execute("UPDATE user_status SET first_time = 0 WHERE id = 1") 318 | conn.commit() 319 | 320 | conn.close() 321 | 322 | def connect_num_db(): 323 | conn = sqlite3.connect("num.db") 324 | cursor = conn.cursor() 325 | 326 | # جدول برای ذخیره‌سازی وضعیت پیام خوش آمدگویی 327 | cursor.execute(""" 328 | CREATE TABLE IF NOT EXISTS user_status ( 329 | id INTEGER PRIMARY KEY AUTOINCREMENT, 330 | first_time INTEGER NOT NULL 331 | ) 332 | """) 333 | 334 | # اگر هیچ رکوردی در جدول نباشد، مقدار پیش‌فرض (اولین اجرا) اضافه می‌شود. 335 | cursor.execute("SELECT COUNT(*) FROM user_status") 336 | if cursor.fetchone()[0] == 0: 337 | cursor.execute("INSERT INTO user_status (first_time) VALUES (?)", (1,)) 338 | 339 | conn.commit() 340 | conn.close() 341 | 342 | def reset_databases(): 343 | # حذف کامل جداول در دیتابیس‌های مختلف 344 | execute_sql("xert.db", "DROP TABLE IF EXISTS themes") 345 | 346 | execute_sql("salar.db", "DROP TABLE IF EXISTS user_settings") 347 | 348 | execute_sql("num.db", "DROP TABLE IF EXISTS user_status") 349 | 350 | # ایجاد مجدد دیتابیس‌ها با مقادیر پیش‌فرض 351 | connect_db() # مقداردهی مجدد دیتابیس xert 352 | connect_theme_db() # مقداردهی مجدد دیتابیس salar 353 | connect_num_db() # مقداردهی مجدد دیتابیس num 354 | 355 | # پیام نمایش برای اطلاع به کاربر 356 | messagebox.showinfo("Reset Complete", "All databases have been reset. The application will now restart.") 357 | 358 | # انجام ری‌استارت برنامه 359 | python = sys.executable 360 | os.execl(python, python, *sys.argv) 361 | 362 | 363 | # Create user interface 364 | root = tk.Tk() 365 | root.title("Questions Database") 366 | 367 | # Menu Bar 368 | # Menu Bar 369 | menu_bar = tk.Menu(root) 370 | 371 | # File Menu 372 | file_menu = tk.Menu(menu_bar, tearoff=0) 373 | file_menu.add_command(label="Open", command=lambda: messagebox.showinfo("Open", "Open functionality can be implemented.")) 374 | file_menu.add_command(label="Save", command=lambda: messagebox.showinfo("Save", "Save functionality can be implemented.")) 375 | file_menu.add_separator() # جداکننده برای تفکیک بخش‌های دیگر 376 | file_menu.add_command(label="Reset Databases", command=reset_databases) # دکمه ریست دیتابیس 377 | file_menu.add_separator() 378 | file_menu.add_command(label="Exit", command=on_exit) 379 | menu_bar.add_cascade(label="File", menu=file_menu) 380 | 381 | # Font Size Menu 382 | font_menu = tk.Menu(menu_bar, tearoff=0) 383 | font_menu.add_command(label="Change Font Size", command=open_font_size_window) 384 | font_menu.add_command(label="Reset Font Size", command=reset_font_size) 385 | menu_bar.add_cascade(label="Font", menu=font_menu) 386 | 387 | # Theme Menu 388 | theme_menu = tk.Menu(menu_bar, tearoff=0) 389 | theme_menu.add_command(label="Create New Theme", command=open_new_theme_window) 390 | theme_menu.add_separator() 391 | create_theme_menu(theme_menu) 392 | menu_bar.add_cascade(label="Themes", menu=theme_menu) 393 | 394 | # Help Menu 395 | help_menu = tk.Menu(menu_bar, tearoff=0) 396 | help_menu.add_command(label="About", command=lambda: messagebox.showinfo("About", "Questions Database App Version 1.0")) 397 | menu_bar.add_cascade(label="Help", menu=help_menu) 398 | 399 | root.config(menu=menu_bar) 400 | 401 | # Style configurations 402 | style = ttk.Style() 403 | style.configure("Treeview", rowheight=25) 404 | style.configure("TButton", padding=5) 405 | style.configure('theme.Treeview', background='white', foreground='black') 406 | 407 | # Connect to databases 408 | connect_db() 409 | connect_theme_db() 410 | 411 | frame = tk.Frame(root) 412 | frame.pack(pady=10) 413 | 414 | entry_search = ttk.Entry(frame, width=30) 415 | entry_search.grid(row=1, column=1, padx=5, pady=5) 416 | ttk.Button(frame, text="Search", command=search_questions).grid(row=1, column=2, pady=5) 417 | ttk.Label(frame, text="Search").grid(row=1, column=0) 418 | 419 | entry_question = ttk.Entry(frame, width=30) 420 | entry_question.grid(row=2, column=1, padx=5, pady=5) 421 | ttk.Label(frame, text="Question").grid(row=2, column=0) 422 | 423 | entry_answer = ttk.Entry(frame, width=30) 424 | entry_answer.grid(row=3, column=1, padx=5, pady=5) 425 | ttk.Label(frame, text="Answer").grid(row=3, column=0) 426 | 427 | # Buttons 428 | btn_add = ttk.Button(frame, text="Add Question", command=add_question) 429 | btn_add.grid(row=4, columnspan=2, pady=5) 430 | 431 | btn_edit = ttk.Button(frame, text="Edit Question", command=edit_question) 432 | btn_edit.grid(row=5, columnspan=2, pady=5) 433 | 434 | btn_delete = ttk.Button(frame, text="Delete Question", command=delete_question) 435 | btn_delete.grid(row=6, columnspan=2, pady=5) 436 | 437 | # Questions display table 438 | tree = ttk.Treeview(root, columns=("ID", "Question", "Answer"), show='headings') 439 | tree.heading("ID", text="ID") 440 | tree.heading("Question", text="Question") 441 | tree.heading("Answer", text="Answer") 442 | tree.pack(pady=10) 443 | 444 | tree.tag_configure('default', font=("TkDefaultFont", 12)) 445 | tree.bind("<>", select_item) 446 | 447 | # Load data 448 | load_questions() 449 | 450 | # Apply the last selected theme and font size 451 | apply_last_selected_theme() 452 | connect_db() 453 | connect_theme_db() 454 | connect_num_db() 455 | 456 | # Check if welcome message should be displayed 457 | check_and_display_welcome_message() 458 | 459 | root.mainloop() 460 | -------------------------------------------------------------------------------- /num.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/num.db -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/package-lock.json -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | 2 | 3 | { 4 | "name": "ghadaam", 5 | "version": "0.1.0", 6 | "private": true, 7 | "scripts": { 8 | "dev": "ghadaam", 9 | "start": "python main.py" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /questions.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/questions.db -------------------------------------------------------------------------------- /salar.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/salar.db -------------------------------------------------------------------------------- /welcome_message.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome_message": "Welcome to the Questions Database App!" 3 | } -------------------------------------------------------------------------------- /xert.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sahandmohammadrehzaii/sqlite3-add-data-database-full-course/d5a69731503977763b8d7f5b3bb7f9ea958f3197/xert.db --------------------------------------------------------------------------------